@testgorilla/tgo-coding-test 0.0.1 → 1.0.0
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/README.md +49 -2
- package/esm2022/index.mjs +12 -0
- package/esm2022/lib/components/code-editor/code-editor.component.mjs +335 -0
- package/esm2022/lib/components/code-editor/code-editor.service.mjs +72 -0
- package/esm2022/lib/components/code-editor/helpers/c-helper.mjs +40 -0
- package/esm2022/lib/components/code-editor/helpers/code-editor-helper.base.mjs +11 -0
- package/esm2022/lib/components/code-editor/helpers/code-editor-helper.model.mjs +2 -0
- package/esm2022/lib/components/code-editor/helpers/cpp-helper.mjs +41 -0
- package/esm2022/lib/components/code-editor/helpers/csharp-helper.mjs +42 -0
- package/esm2022/lib/components/code-editor/helpers/go-helper.mjs +42 -0
- package/esm2022/lib/components/code-editor/helpers/index.mjs +16 -0
- package/esm2022/lib/components/code-editor/helpers/java-helper.mjs +42 -0
- package/esm2022/lib/components/code-editor/helpers/javascript-helper.mjs +26 -0
- package/esm2022/lib/components/code-editor/helpers/kotlin-helper.mjs +42 -0
- package/esm2022/lib/components/code-editor/helpers/php-helper.mjs +26 -0
- package/esm2022/lib/components/code-editor/helpers/python-helper.mjs +26 -0
- package/esm2022/lib/components/code-editor/helpers/r-helper.mjs +26 -0
- package/esm2022/lib/components/code-editor/helpers/ruby-helper.mjs +26 -0
- package/esm2022/lib/components/code-editor/helpers/scala-helper.mjs +41 -0
- package/esm2022/lib/components/code-editor/helpers/sql-helper.mjs +34 -0
- package/esm2022/lib/components/code-editor/helpers/swift-helper.mjs +40 -0
- package/esm2022/lib/components/code-editor/helpers/typescript-helper.mjs +41 -0
- package/esm2022/lib/components/code-editor/models/code-editor.model.mjs +2 -0
- package/esm2022/lib/components/code-editor/models/coding-snapshot.model.mjs +2 -0
- package/esm2022/lib/components/coding-question/coding-question.component.mjs +126 -0
- package/esm2022/lib/components/coding-section/coding-section.component.mjs +188 -0
- package/esm2022/lib/components/common/truncated-text/truncated-text.component.mjs +38 -0
- package/esm2022/lib/components/configurations/configurations.component.mjs +97 -0
- package/esm2022/lib/components/instructions/instructions.component.mjs +139 -0
- package/esm2022/lib/components/panel/panel.component.mjs +34 -0
- package/esm2022/lib/components/runnable-editor/runnable-editor.component.mjs +169 -0
- package/esm2022/lib/components/tests/test-cases/test-cases.component.mjs +198 -0
- package/esm2022/lib/components/tests/test-cases-content/test-cases-content.component.mjs +96 -0
- package/esm2022/lib/components/tests/test-cases-status/test-cases-status.component.mjs +21 -0
- package/esm2022/lib/components/tests/test-results.component.mjs +127 -0
- package/esm2022/lib/components/tgo-coding-test/tgo-coding-test.component.mjs +280 -0
- package/esm2022/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.mjs +476 -0
- package/esm2022/lib/config/index.mjs +2 -0
- package/esm2022/lib/config/tgo-coding-test.config.mjs +2 -0
- package/esm2022/lib/config/tgo-coding-test.provider.mjs +34 -0
- package/esm2022/lib/config/tgo-coding-test.token.mjs +14 -0
- package/esm2022/lib/models/auto-saved-data.mjs +2 -0
- package/esm2022/lib/models/code-event.mjs +2 -0
- package/esm2022/lib/models/coderunner-execution-results.mjs +2 -0
- package/esm2022/lib/models/configs.mjs +2 -0
- package/esm2022/lib/models/language-change-action.mjs +2 -0
- package/esm2022/lib/models/lat-languages.mjs +3 -0
- package/esm2022/lib/models/mixpanel-events.mjs +2 -0
- package/esm2022/lib/models/mode.mjs +2 -0
- package/esm2022/lib/models/paste-data.mjs +2 -0
- package/esm2022/lib/models/programming-language.mjs +2 -0
- package/esm2022/lib/models/test-cases.mjs +7 -0
- package/esm2022/lib/models/theme.mjs +2 -0
- package/esm2022/lib/models/translations.mjs +2 -0
- package/esm2022/lib/models/view-mode.mjs +8 -0
- package/esm2022/lib/pipes/memoize-func.pipe.mjs +39 -0
- package/esm2022/lib/services/candidate-coding-test-services/candidature-api.service.mjs +19 -0
- package/esm2022/lib/services/candidate-coding-test-services/coderunner-api.service.mjs +58 -0
- package/esm2022/lib/services/candidate-coding-test-services/coding-test-tour.service.mjs +89 -0
- package/esm2022/lib/services/candidate-coding-test-services/coding-test.service.mjs +490 -0
- package/esm2022/lib/services/candidate-coding-test-services/index.mjs +5 -0
- package/esm2022/lib/services/coding-test-config.service.mjs +51 -0
- package/esm2022/lib/services/configurations.service.mjs +89 -0
- package/esm2022/lib/services/lib-coding-test.service.mjs +106 -0
- package/esm2022/lib/services/storage.service.mjs +624 -0
- package/esm2022/lib/services/test-cases.service.mjs +30 -0
- package/esm2022/lib/services/theme.service.mjs +36 -0
- package/esm2022/lib/utils/additional-languages/erlang.mjs +103 -0
- package/esm2022/lib/utils/resize-element.mjs +13 -0
- package/esm2022/lib/utils/time-to-ms.util.mjs +11 -0
- package/esm2022/shared/index.mjs +5 -0
- package/esm2022/shared/lib/components/audio-animation/audio-animation.component.mjs +114 -0
- package/esm2022/shared/lib/components/audio-animation/index.mjs +2 -0
- package/esm2022/shared/lib/components/index.mjs +3 -0
- package/esm2022/shared/lib/components/vimeo-video/index.mjs +2 -0
- package/esm2022/shared/lib/components/vimeo-video/vimeo-video.component.mjs +101 -0
- package/esm2022/shared/lib/models/answer.mjs +2 -0
- package/esm2022/shared/lib/models/assessment.mjs +2 -0
- package/esm2022/shared/lib/models/environment.mjs +2 -0
- package/esm2022/shared/lib/models/index.mjs +9 -0
- package/esm2022/shared/lib/models/question-component.mjs +2 -0
- package/esm2022/shared/lib/models/question.mjs +2 -0
- package/esm2022/shared/lib/models/test.mjs +2 -0
- package/esm2022/shared/lib/models/translations.mjs +2 -0
- package/esm2022/shared/lib/models/window.mjs +2 -0
- package/esm2022/shared/lib/services/api/api.service.mjs +97 -0
- package/esm2022/shared/lib/services/api/mocked-api.service.mjs +131 -0
- package/esm2022/shared/lib/services/environment/environment.service.mjs +13 -0
- package/esm2022/shared/lib/services/index.mjs +10 -0
- package/esm2022/shared/lib/services/localization/languages.model.mjs +19 -0
- package/esm2022/shared/lib/services/localization/transloco-lazy-module-utils.mjs +27 -0
- package/esm2022/shared/lib/services/localization/transloco-testing.module.mjs +11 -0
- package/esm2022/shared/lib/services/media/media.service.mjs +129 -0
- package/esm2022/shared/lib/services/mixpanel/mixpanel.service.mjs +30 -0
- package/esm2022/shared/lib/services/theme/theme.service.mjs +24 -0
- package/esm2022/shared/test-mocks/assessment-test.mock.mjs +112 -0
- package/esm2022/shared/test-mocks/index.mjs +3 -0
- package/esm2022/shared/test-mocks/tgo-ui.mock.mjs +39 -0
- package/esm2022/testgorilla-tgo-coding-test.mjs +5 -0
- package/fesm2022/testgorilla-tgo-coding-test.mjs +4526 -0
- package/fesm2022/testgorilla-tgo-coding-test.mjs.map +1 -0
- package/{src/index.ts → index.d.ts} +2 -19
- package/lib/components/code-editor/code-editor.component.d.ts +54 -0
- package/lib/components/code-editor/code-editor.service.d.ts +12 -0
- package/lib/components/code-editor/helpers/c-helper.d.ts +11 -0
- package/lib/components/code-editor/helpers/code-editor-helper.base.d.ts +8 -0
- package/lib/components/code-editor/helpers/code-editor-helper.model.d.ts +62 -0
- package/lib/components/code-editor/helpers/cpp-helper.d.ts +11 -0
- package/lib/components/code-editor/helpers/csharp-helper.d.ts +12 -0
- package/lib/components/code-editor/helpers/go-helper.d.ts +12 -0
- package/lib/components/code-editor/helpers/java-helper.d.ts +12 -0
- package/lib/components/code-editor/helpers/javascript-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/kotlin-helper.d.ts +12 -0
- package/lib/components/code-editor/helpers/php-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/python-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/r-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/ruby-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/scala-helper.d.ts +12 -0
- package/lib/components/code-editor/helpers/sql-helper.d.ts +10 -0
- package/lib/components/code-editor/helpers/swift-helper.d.ts +11 -0
- package/lib/components/code-editor/helpers/typescript-helper.d.ts +11 -0
- package/lib/components/code-editor/models/code-editor.model.d.ts +8 -0
- package/lib/components/code-editor/models/coding-snapshot.model.d.ts +4 -0
- package/lib/components/coding-question/coding-question.component.d.ts +45 -0
- package/lib/components/coding-section/coding-section.component.d.ts +52 -0
- package/lib/components/common/truncated-text/truncated-text.component.d.ts +13 -0
- package/lib/components/configurations/configurations.component.d.ts +40 -0
- package/lib/components/instructions/instructions.component.d.ts +48 -0
- package/lib/components/panel/panel.component.d.ts +12 -0
- package/lib/components/runnable-editor/runnable-editor.component.d.ts +53 -0
- package/lib/components/tests/test-cases/test-cases.component.d.ts +46 -0
- package/lib/components/tests/test-cases-content/test-cases-content.component.d.ts +26 -0
- package/lib/components/tests/test-cases-status/test-cases-status.component.d.ts +9 -0
- package/lib/components/tests/test-results.component.d.ts +33 -0
- package/lib/components/tgo-coding-test/tgo-coding-test.component.d.ts +69 -0
- package/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.d.ts +101 -0
- package/{src/lib/config/index.ts → lib/config/index.d.ts} +0 -1
- package/lib/config/tgo-coding-test.config.d.ts +24 -0
- package/{src/lib/config/tgo-coding-test.provider.ts → lib/config/tgo-coding-test.provider.d.ts} +6 -18
- package/lib/config/tgo-coding-test.token.d.ts +9 -0
- package/lib/models/auto-saved-data.d.ts +42 -0
- package/lib/models/code-event.d.ts +15 -0
- package/lib/models/coderunner-execution-results.d.ts +51 -0
- package/lib/models/configs.d.ts +15 -0
- package/lib/models/language-change-action.d.ts +4 -0
- package/lib/models/lat-languages.d.ts +8 -0
- package/lib/models/mixpanel-events.d.ts +3 -0
- package/lib/models/mode.d.ts +5 -0
- package/lib/models/paste-data.d.ts +4 -0
- package/lib/models/programming-language.d.ts +8 -0
- package/lib/models/test-cases.d.ts +67 -0
- package/lib/models/theme.d.ts +4 -0
- package/lib/models/translations.d.ts +1 -0
- package/lib/models/view-mode.d.ts +6 -0
- package/{src/lib/pipes/memoize-func.pipe.ts → lib/pipes/memoize-func.pipe.d.ts} +6 -14
- package/lib/services/candidate-coding-test-services/candidature-api.service.d.ts +10 -0
- package/lib/services/candidate-coding-test-services/coderunner-api.service.d.ts +18 -0
- package/lib/services/candidate-coding-test-services/coding-test-tour.service.d.ts +22 -0
- package/lib/services/candidate-coding-test-services/coding-test.service.d.ts +68 -0
- package/{src/lib/services/candidate-coding-test-services/index.ts → lib/services/candidate-coding-test-services/index.d.ts} +1 -1
- package/lib/services/coding-test-config.service.d.ts +38 -0
- package/lib/services/configurations.service.d.ts +37 -0
- package/lib/services/lib-coding-test.service.d.ts +69 -0
- package/lib/services/storage.service.d.ts +83 -0
- package/lib/services/test-cases.service.d.ts +12 -0
- package/lib/services/theme.service.d.ts +17 -0
- package/lib/utils/additional-languages/erlang.d.ts +37 -0
- package/lib/utils/resize-element.d.ts +2 -0
- package/lib/utils/time-to-ms.util.d.ts +1 -0
- package/package.json +18 -7
- package/shared/index.d.ts +4 -0
- package/shared/lib/components/audio-animation/audio-animation.component.d.ts +27 -0
- package/shared/lib/components/audio-animation/index.d.ts +1 -0
- package/shared/lib/components/index.d.ts +2 -0
- package/shared/lib/components/vimeo-video/index.d.ts +1 -0
- package/shared/lib/components/vimeo-video/vimeo-video.component.d.ts +24 -0
- package/shared/lib/models/answer.d.ts +17 -0
- package/shared/lib/models/assessment.d.ts +80 -0
- package/shared/lib/models/environment.d.ts +1 -0
- package/shared/lib/models/index.d.ts +8 -0
- package/shared/lib/models/question-component.d.ts +54 -0
- package/shared/lib/models/question.d.ts +102 -0
- package/shared/lib/models/test.d.ts +81 -0
- package/shared/lib/models/translations.d.ts +1 -0
- package/shared/lib/models/window.d.ts +6 -0
- package/shared/lib/services/api/api.service.d.ts +25 -0
- package/shared/lib/services/api/mocked-api.service.d.ts +35 -0
- package/shared/lib/services/environment/environment.service.d.ts +6 -0
- package/shared/lib/services/index.d.ts +9 -0
- package/shared/lib/services/localization/languages.model.d.ts +15 -0
- package/shared/lib/services/localization/transloco-lazy-module-utils.d.ts +11 -0
- package/shared/lib/services/localization/transloco-testing.module.d.ts +2 -0
- package/shared/lib/services/media/media.service.d.ts +29 -0
- package/shared/lib/services/mixpanel/mixpanel.service.d.ts +10 -0
- package/shared/lib/services/theme/theme.service.d.ts +8 -0
- package/shared/test-mocks/assessment-test.mock.d.ts +21 -0
- package/shared/test-mocks/index.d.ts +2 -0
- package/shared/test-mocks/tgo-ui.mock.d.ts +21 -0
- package/.eslintrc.json +0 -45
- package/jest.config.ts +0 -21
- package/ng-package.json +0 -14
- package/project.json +0 -36
- package/src/lib/components/.gitkeep +0 -0
- package/src/lib/components/code-editor/code-editor.component.html +0 -10
- package/src/lib/components/code-editor/code-editor.component.scss +0 -21
- package/src/lib/components/code-editor/code-editor.component.spec.ts +0 -136
- package/src/lib/components/code-editor/code-editor.component.ts +0 -369
- package/src/lib/components/code-editor/code-editor.mocks.ts +0 -28
- package/src/lib/components/code-editor/code-editor.service.spec.ts +0 -160
- package/src/lib/components/code-editor/code-editor.service.ts +0 -94
- package/src/lib/components/code-editor/helpers/c-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/c-helper.ts +0 -51
- package/src/lib/components/code-editor/helpers/code-editor-helper.base.spec.ts +0 -30
- package/src/lib/components/code-editor/helpers/code-editor-helper.base.ts +0 -16
- package/src/lib/components/code-editor/helpers/code-editor-helper.mocks.ts +0 -24
- package/src/lib/components/code-editor/helpers/code-editor-helper.model.ts +0 -67
- package/src/lib/components/code-editor/helpers/cpp-helper.spec.ts +0 -40
- package/src/lib/components/code-editor/helpers/cpp-helper.ts +0 -52
- package/src/lib/components/code-editor/helpers/csharp-helper.spec.ts +0 -42
- package/src/lib/components/code-editor/helpers/csharp-helper.ts +0 -55
- package/src/lib/components/code-editor/helpers/go-helper.spec.ts +0 -41
- package/src/lib/components/code-editor/helpers/go-helper.ts +0 -54
- package/src/lib/components/code-editor/helpers/java-helper.spec.ts +0 -41
- package/src/lib/components/code-editor/helpers/java-helper.ts +0 -54
- package/src/lib/components/code-editor/helpers/javascript-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/javascript-helper.ts +0 -32
- package/src/lib/components/code-editor/helpers/kotlin-helper.spec.ts +0 -41
- package/src/lib/components/code-editor/helpers/kotlin-helper.ts +0 -54
- package/src/lib/components/code-editor/helpers/php-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/php-helper.ts +0 -32
- package/src/lib/components/code-editor/helpers/python-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/python-helper.ts +0 -32
- package/src/lib/components/code-editor/helpers/r-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/r-helper.ts +0 -32
- package/src/lib/components/code-editor/helpers/ruby-helper.spec.ts +0 -39
- package/src/lib/components/code-editor/helpers/ruby-helper.ts +0 -32
- package/src/lib/components/code-editor/helpers/scala-helper.spec.ts +0 -41
- package/src/lib/components/code-editor/helpers/scala-helper.ts +0 -53
- package/src/lib/components/code-editor/helpers/sql-helper.spec.ts +0 -87
- package/src/lib/components/code-editor/helpers/sql-helper.ts +0 -44
- package/src/lib/components/code-editor/helpers/swift-helper.spec.ts +0 -40
- package/src/lib/components/code-editor/helpers/swift-helper.ts +0 -51
- package/src/lib/components/code-editor/helpers/typescript-helper.spec.ts +0 -40
- package/src/lib/components/code-editor/helpers/typescript-helper.ts +0 -52
- package/src/lib/components/code-editor/models/code-editor.model.ts +0 -9
- package/src/lib/components/code-editor/models/coding-snapshot.model.ts +0 -4
- package/src/lib/components/coding-question/coding-question.component.html +0 -78
- package/src/lib/components/coding-question/coding-question.component.scss +0 -76
- package/src/lib/components/coding-question/coding-question.component.spec.ts +0 -85
- package/src/lib/components/coding-question/coding-question.component.ts +0 -102
- package/src/lib/components/coding-section/coding-section.component.html +0 -82
- package/src/lib/components/coding-section/coding-section.component.scss +0 -64
- package/src/lib/components/coding-section/coding-section.component.spec.ts +0 -257
- package/src/lib/components/coding-section/coding-section.component.ts +0 -187
- package/src/lib/components/coding-test.module.ts +0 -124
- package/src/lib/components/common/truncated-text/truncated-text.component.html +0 -6
- package/src/lib/components/common/truncated-text/truncated-text.component.scss +0 -18
- package/src/lib/components/common/truncated-text/truncated-text.component.spec.ts +0 -84
- package/src/lib/components/common/truncated-text/truncated-text.component.ts +0 -37
- package/src/lib/components/configurations/configurations.component.html +0 -57
- package/src/lib/components/configurations/configurations.component.scss +0 -42
- package/src/lib/components/configurations/configurations.component.spec.ts +0 -186
- package/src/lib/components/configurations/configurations.component.ts +0 -98
- package/src/lib/components/instructions/instructions.component.html +0 -41
- package/src/lib/components/instructions/instructions.component.scss +0 -167
- package/src/lib/components/instructions/instructions.component.spec.ts +0 -106
- package/src/lib/components/instructions/instructions.component.ts +0 -138
- package/src/lib/components/panel/panel.component.html +0 -19
- package/src/lib/components/panel/panel.component.scss +0 -41
- package/src/lib/components/panel/panel.component.spec.ts +0 -40
- package/src/lib/components/panel/panel.component.ts +0 -34
- package/src/lib/components/runnable-editor/runnable-editor.component.html +0 -75
- package/src/lib/components/runnable-editor/runnable-editor.component.scss +0 -55
- package/src/lib/components/runnable-editor/runnable-editor.component.spec.ts +0 -124
- package/src/lib/components/runnable-editor/runnable-editor.component.ts +0 -155
- package/src/lib/components/tests/test-cases/test-cases.component.html +0 -135
- package/src/lib/components/tests/test-cases/test-cases.component.scss +0 -220
- package/src/lib/components/tests/test-cases/test-cases.component.spec.ts +0 -401
- package/src/lib/components/tests/test-cases/test-cases.component.ts +0 -205
- package/src/lib/components/tests/test-cases-content/test-cases-content.component.html +0 -94
- package/src/lib/components/tests/test-cases-content/test-cases-content.component.scss +0 -103
- package/src/lib/components/tests/test-cases-content/test-cases-content.component.spec.ts +0 -122
- package/src/lib/components/tests/test-cases-content/test-cases-content.component.ts +0 -102
- package/src/lib/components/tests/test-cases-status/test-cases-status.component.html +0 -16
- package/src/lib/components/tests/test-cases-status/test-cases-status.component.scss +0 -49
- package/src/lib/components/tests/test-cases-status/test-cases-status.component.spec.ts +0 -22
- package/src/lib/components/tests/test-cases-status/test-cases-status.component.ts +0 -18
- package/src/lib/components/tests/test-results.component.html +0 -119
- package/src/lib/components/tests/test-results.component.scss +0 -189
- package/src/lib/components/tests/test-results.component.spec.ts +0 -140
- package/src/lib/components/tests/test-results.component.ts +0 -98
- package/src/lib/components/tgo-coding-test/tgo-coding-test.component.html +0 -96
- package/src/lib/components/tgo-coding-test/tgo-coding-test.component.scss +0 -6
- package/src/lib/components/tgo-coding-test/tgo-coding-test.component.spec.ts +0 -599
- package/src/lib/components/tgo-coding-test/tgo-coding-test.component.ts +0 -279
- package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.html +0 -36
- package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.scss +0 -183
- package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.spec.ts +0 -883
- package/src/lib/components/tgo-coding-test-candidate-view/tgo-coding-test-candidate-view.component.ts +0 -575
- package/src/lib/config/tgo-coding-test.config.ts +0 -26
- package/src/lib/config/tgo-coding-test.token.ts +0 -21
- package/src/lib/models/.gitkeep +0 -0
- package/src/lib/models/auto-saved-data.ts +0 -51
- package/src/lib/models/code-event.ts +0 -17
- package/src/lib/models/coderunner-execution-results.ts +0 -58
- package/src/lib/models/coding-lib.mocks.ts +0 -246
- package/src/lib/models/configs.ts +0 -18
- package/src/lib/models/language-change-action.ts +0 -4
- package/src/lib/models/lat-languages.ts +0 -12
- package/src/lib/models/mixpanel-events.ts +0 -3
- package/src/lib/models/mode.ts +0 -5
- package/src/lib/models/paste-data.ts +0 -4
- package/src/lib/models/programming-language.ts +0 -9
- package/src/lib/models/test-cases.ts +0 -74
- package/src/lib/models/theme.ts +0 -5
- package/src/lib/models/translations.ts +0 -1
- package/src/lib/models/view-mode.ts +0 -6
- package/src/lib/services/.gitkeep +0 -0
- package/src/lib/services/candidate-coding-test-services/candidature-api.service.spec.ts +0 -40
- package/src/lib/services/candidate-coding-test-services/candidature-api.service.ts +0 -15
- package/src/lib/services/candidate-coding-test-services/coderunner-api.service.spec.ts +0 -134
- package/src/lib/services/candidate-coding-test-services/coderunner-api.service.ts +0 -105
- package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.spec.ts +0 -161
- package/src/lib/services/candidate-coding-test-services/coding-test-tour.service.ts +0 -100
- package/src/lib/services/candidate-coding-test-services/coding-test.service.spec.ts +0 -1524
- package/src/lib/services/candidate-coding-test-services/coding-test.service.ts +0 -843
- package/src/lib/services/coding-test-config.service.ts +0 -48
- package/src/lib/services/configurations.service.mocks.ts +0 -77
- package/src/lib/services/configurations.service.spec.ts +0 -79
- package/src/lib/services/configurations.service.ts +0 -111
- package/src/lib/services/index.ts +0 -0
- package/src/lib/services/lib-coding-test.service.spec.ts +0 -265
- package/src/lib/services/lib-coding-test.service.ts +0 -157
- package/src/lib/services/local-storage.service.mocks.ts +0 -22
- package/src/lib/services/storage.service.spec.ts +0 -1120
- package/src/lib/services/storage.service.ts +0 -729
- package/src/lib/services/test-cases.service.spec.ts +0 -53
- package/src/lib/services/test-cases.service.ts +0 -29
- package/src/lib/services/theme.service.spec.ts +0 -76
- package/src/lib/services/theme.service.ts +0 -34
- package/src/lib/styles/mixins.scss +0 -86
- package/src/lib/styles/styles.scss +0 -112
- package/src/lib/styles/variables.scss +0 -105
- package/src/lib/utils/.gitkeep +0 -0
- package/src/lib/utils/additional-languages/erlang.ts +0 -115
- package/src/lib/utils/resize-element.ts +0 -15
- package/src/lib/utils/time-to-ms.util.ts +0 -10
- package/src/test-setup.ts +0 -1
- package/tsconfig.json +0 -16
- package/tsconfig.lib.json +0 -12
- package/tsconfig.lib.prod.json +0 -9
- package/tsconfig.spec.json +0 -13
- /package/{src/assets → assets}/i18n/en.json +0 -0
- /package/{src/lib/components/code-editor/helpers/index.ts → lib/components/code-editor/helpers/index.d.ts} +0 -0
|
@@ -0,0 +1,490 @@
|
|
|
1
|
+
import { Injectable, signal } from '@angular/core';
|
|
2
|
+
import { translate } from '@ngneat/transloco';
|
|
3
|
+
import { ConfirmDialogComponent, DialogService, SnackbarService, } from '@testgorilla/tgo-ui';
|
|
4
|
+
import { MixpanelService, } from '../../../shared/index.mjs';
|
|
5
|
+
import { LibCodingTestService } from '../lib-coding-test.service';
|
|
6
|
+
import { BehaviorSubject, Subject, filter, of, takeUntil, throwError, } from 'rxjs';
|
|
7
|
+
import { catchError, map, switchMap, take, tap } from 'rxjs/operators';
|
|
8
|
+
import { TIMEOUT_SIGNAL, } from '../../models/coderunner-execution-results';
|
|
9
|
+
import { ROOT_TRANSLATIONS_SCOPE } from '../../models/translations';
|
|
10
|
+
import { CoderunnerApiService } from './coderunner-api.service';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
import * as i1 from "./coderunner-api.service";
|
|
13
|
+
import * as i2 from "../lib-coding-test.service";
|
|
14
|
+
import * as i3 from "../../../shared/index.mjs";
|
|
15
|
+
import * as i4 from "@testgorilla/tgo-ui";
|
|
16
|
+
export class CodingTestService {
|
|
17
|
+
coderunnerApiService;
|
|
18
|
+
libCodingTestService;
|
|
19
|
+
mixpanel;
|
|
20
|
+
snackBar;
|
|
21
|
+
dialog;
|
|
22
|
+
translationContext = `${ROOT_TRANSLATIONS_SCOPE}.CODING_LIB.`;
|
|
23
|
+
codingTestResults = {
|
|
24
|
+
listResponse: [],
|
|
25
|
+
resume: {
|
|
26
|
+
ok: 0,
|
|
27
|
+
error: 0,
|
|
28
|
+
total: 0,
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
currentLanguage;
|
|
32
|
+
codingTestResutsSubj$ = new BehaviorSubject(this.codingTestResults);
|
|
33
|
+
codingTestResults$ = this.codingTestResutsSubj$.asObservable();
|
|
34
|
+
isTestResultsLoading = signal(false);
|
|
35
|
+
unsubscribe$ = new Subject();
|
|
36
|
+
sqlTestCases;
|
|
37
|
+
isSQLTest = false;
|
|
38
|
+
constructor(coderunnerApiService, libCodingTestService, mixpanel, snackBar, dialog) {
|
|
39
|
+
this.coderunnerApiService = coderunnerApiService;
|
|
40
|
+
this.libCodingTestService = libCodingTestService;
|
|
41
|
+
this.mixpanel = mixpanel;
|
|
42
|
+
this.snackBar = snackBar;
|
|
43
|
+
this.dialog = dialog;
|
|
44
|
+
}
|
|
45
|
+
getBaseExampleTestCase = (id, index) => ({
|
|
46
|
+
id: id ?? 0,
|
|
47
|
+
name: `Example ${index + 1}`,
|
|
48
|
+
preloaded: true,
|
|
49
|
+
});
|
|
50
|
+
transformToExampleLATtestCase = (testcase, index) => ({
|
|
51
|
+
...this.getBaseExampleTestCase(testcase.id, index),
|
|
52
|
+
expectedOutput: testcase.solution ?? '',
|
|
53
|
+
input: testcase.input,
|
|
54
|
+
});
|
|
55
|
+
transformToExampleSQLTestCase = (testcase, index) => ({
|
|
56
|
+
...this.getBaseExampleTestCase(testcase.id, index),
|
|
57
|
+
expectedOutput: testcase.result ?? '',
|
|
58
|
+
});
|
|
59
|
+
setSqlTestCases(sqlTestCases) {
|
|
60
|
+
this.sqlTestCases = sqlTestCases;
|
|
61
|
+
}
|
|
62
|
+
getSqlTestCases() {
|
|
63
|
+
return this.sqlTestCases;
|
|
64
|
+
}
|
|
65
|
+
handleResetCodeModal(applicationTheme, companyColor) {
|
|
66
|
+
const modalTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.RESET_CODE.`;
|
|
67
|
+
const modalData = {
|
|
68
|
+
confirmButtonText: translate(`${modalTranslationContext}SUBMIT`),
|
|
69
|
+
title: translate(`${modalTranslationContext}TITLE`),
|
|
70
|
+
message: translate(`${modalTranslationContext}MESSAGE`),
|
|
71
|
+
color: companyColor,
|
|
72
|
+
};
|
|
73
|
+
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
|
|
74
|
+
applicationTheme,
|
|
75
|
+
size: 'small',
|
|
76
|
+
extraData: modalData,
|
|
77
|
+
});
|
|
78
|
+
dialogRef
|
|
79
|
+
.afterClosed()
|
|
80
|
+
.pipe(filter(Boolean), take(1))
|
|
81
|
+
.subscribe(() => {
|
|
82
|
+
this.libCodingTestService.confirmReset();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
listenDeleteCustomTestCases() {
|
|
86
|
+
return this.libCodingTestService.testCaseDeletion$.pipe(filter(({ action }) => action === "try" /* TestCaseDeletionAction.Try */));
|
|
87
|
+
}
|
|
88
|
+
handleDeleteTestCaseModal(index, applicationTheme, companyColor) {
|
|
89
|
+
const deleteTestCaseTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.DELETE_TEST_CASE.`;
|
|
90
|
+
const modalData = {
|
|
91
|
+
title: translate(`${deleteTestCaseTranslationContext}TITLE`),
|
|
92
|
+
message: translate(`${deleteTestCaseTranslationContext}MESSAGE`),
|
|
93
|
+
confirmButtonText: translate(`${deleteTestCaseTranslationContext}SUBMIT`),
|
|
94
|
+
color: companyColor,
|
|
95
|
+
};
|
|
96
|
+
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
|
|
97
|
+
applicationTheme,
|
|
98
|
+
size: 'small',
|
|
99
|
+
extraData: modalData,
|
|
100
|
+
});
|
|
101
|
+
dialogRef
|
|
102
|
+
.afterClosed()
|
|
103
|
+
.pipe(filter(Boolean), take(1))
|
|
104
|
+
.subscribe(() => {
|
|
105
|
+
this.libCodingTestService.confirmTestCaseDeletion(index);
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
handleLanguageChangeModal(questionResultId, selectedLanguage, applicationTheme = 'light', companyColor) {
|
|
109
|
+
const modalLangChangeTranslationContext = `${ROOT_TRANSLATIONS_SCOPE}.MODALS.LANGUAGE_CHANGE.`;
|
|
110
|
+
const modalData = {
|
|
111
|
+
confirmButtonText: translate(`${modalLangChangeTranslationContext}SUBMIT`),
|
|
112
|
+
title: translate(`${modalLangChangeTranslationContext}TITLE`),
|
|
113
|
+
message: translate(`${modalLangChangeTranslationContext}MESSAGE`),
|
|
114
|
+
...(companyColor && { color: companyColor }),
|
|
115
|
+
};
|
|
116
|
+
const dialogRef = this.dialog.open(ConfirmDialogComponent, {
|
|
117
|
+
applicationTheme,
|
|
118
|
+
size: 'small',
|
|
119
|
+
extraData: modalData,
|
|
120
|
+
});
|
|
121
|
+
dialogRef
|
|
122
|
+
.afterClosed()
|
|
123
|
+
.pipe(take(1))
|
|
124
|
+
.subscribe((result) => {
|
|
125
|
+
if (result) {
|
|
126
|
+
this.libCodingTestService.confirmLanguageChange();
|
|
127
|
+
if (selectedLanguage) {
|
|
128
|
+
this.setCurrentLanguageLAT(selectedLanguage);
|
|
129
|
+
this.sendLanguageChangeEvent$(questionResultId);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
this.libCodingTestService.cancelLanguageChange();
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
setCurrentLanguageLAT(language) {
|
|
138
|
+
this.currentLanguage = language;
|
|
139
|
+
}
|
|
140
|
+
listenCodingTestChanges() {
|
|
141
|
+
return this.libCodingTestService.codeReset$.pipe(filter((val) => val === "try" /* ResetCodeAction.Try */));
|
|
142
|
+
}
|
|
143
|
+
runTest(resultId, code, isLAT = true, isSQL = false,
|
|
144
|
+
// todo: remove from everywhere or comment temporarily?
|
|
145
|
+
publicPreview = false, preview = false, id = 0, testResultId = 0, testData) {
|
|
146
|
+
this.preRunTests();
|
|
147
|
+
if (isSQL) {
|
|
148
|
+
this.getSQLrequest(resultId, testResultId, code, id, publicPreview, preview);
|
|
149
|
+
}
|
|
150
|
+
else if (isLAT) {
|
|
151
|
+
const testCases = this.libCodingTestService.getValidTestCases();
|
|
152
|
+
const testCasesFormatted = testCases.map((testCase) => ({
|
|
153
|
+
input: testCase.input,
|
|
154
|
+
solution: testCase.expectedOutput,
|
|
155
|
+
}));
|
|
156
|
+
this.libCodingTestService.currentLanguage$
|
|
157
|
+
.pipe(take(1))
|
|
158
|
+
.subscribe((language) => {
|
|
159
|
+
const runReq$ = this.getLATrequest(id, resultId, testResultId, code, testCasesFormatted, language, publicPreview, preview);
|
|
160
|
+
this.runLAT(runReq$, publicPreview, preview, testData || {}, testCases, code, resultId);
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
sendCopypasteEvent$(code, copiedText, questionResultId) {
|
|
165
|
+
const event = this.getBaseEvent({
|
|
166
|
+
code,
|
|
167
|
+
event_type: 'COPYPASTE',
|
|
168
|
+
extra_payload: copiedText,
|
|
169
|
+
question_result_id: questionResultId,
|
|
170
|
+
});
|
|
171
|
+
return this.coderunnerApiService.sendCodeEvent$(event);
|
|
172
|
+
}
|
|
173
|
+
sendAutosaveEvent$(code, questionResultId) {
|
|
174
|
+
const event = this.getBaseEvent({
|
|
175
|
+
code,
|
|
176
|
+
event_type: 'AUTOSAVE',
|
|
177
|
+
question_result_id: questionResultId,
|
|
178
|
+
});
|
|
179
|
+
return this.coderunnerApiService
|
|
180
|
+
.sendCodeEvent$(event)
|
|
181
|
+
.pipe(catchError((err) => of(err)));
|
|
182
|
+
}
|
|
183
|
+
sendLanguageChangeEvent$(questionResultId) {
|
|
184
|
+
const event = this.getBaseEvent({
|
|
185
|
+
event_type: 'SWITCH',
|
|
186
|
+
question_result_id: questionResultId,
|
|
187
|
+
});
|
|
188
|
+
this.coderunnerApiService.sendCodeEvent$(event).pipe(take(1)).subscribe();
|
|
189
|
+
}
|
|
190
|
+
getBaseEvent(event) {
|
|
191
|
+
let language = '';
|
|
192
|
+
if (this.isSQLTest) {
|
|
193
|
+
language = "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */;
|
|
194
|
+
}
|
|
195
|
+
else {
|
|
196
|
+
const { name, version } = this.currentLanguage;
|
|
197
|
+
language = `${name}-${version}`;
|
|
198
|
+
}
|
|
199
|
+
const baseEvent = {
|
|
200
|
+
code: '',
|
|
201
|
+
extra_payload: '',
|
|
202
|
+
attempt_id: null,
|
|
203
|
+
language,
|
|
204
|
+
};
|
|
205
|
+
return { ...baseEvent, ...event };
|
|
206
|
+
}
|
|
207
|
+
sendCodeEvent$(attemptId, questionResultId, code) {
|
|
208
|
+
const event = this.getBaseEvent({
|
|
209
|
+
code,
|
|
210
|
+
attempt_id: attemptId,
|
|
211
|
+
event_type: 'ATTEMPT',
|
|
212
|
+
question_result_id: questionResultId,
|
|
213
|
+
});
|
|
214
|
+
return this.coderunnerApiService.sendCodeEvent$(event);
|
|
215
|
+
}
|
|
216
|
+
countTestResults(executions) {
|
|
217
|
+
if (executions) {
|
|
218
|
+
return executions.reduce((acc, response) => {
|
|
219
|
+
if (response.evaluation.testcase) {
|
|
220
|
+
acc.passed++;
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
acc.error++;
|
|
224
|
+
}
|
|
225
|
+
acc.total++;
|
|
226
|
+
return acc;
|
|
227
|
+
}, { passed: 0, error: 0, total: 0 });
|
|
228
|
+
}
|
|
229
|
+
return { passed: 0, error: 0, total: 0 };
|
|
230
|
+
}
|
|
231
|
+
handleTestCasesResult(testCasesResultObject) {
|
|
232
|
+
this.codingTestResults = testCasesResultObject;
|
|
233
|
+
this.publishTestResults();
|
|
234
|
+
this.isTestResultsLoading.set(false);
|
|
235
|
+
}
|
|
236
|
+
getSQLrequest(resultId, testResultId, code, id, publicPreview, preview) {
|
|
237
|
+
const testCases = this.getSqlTestCases();
|
|
238
|
+
let runReq$;
|
|
239
|
+
if (publicPreview) {
|
|
240
|
+
runReq$ = this.coderunnerApiService.runPublicTest$(code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
|
|
241
|
+
}
|
|
242
|
+
else if (preview) {
|
|
243
|
+
runReq$ = this.coderunnerApiService.runPreviewTest$(testResultId, code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
runReq$ = this.coderunnerApiService.runNonPreviewTest$(id, resultId, code, testCases, "sqlite3-3.36.0" /* ProgrammingLanguageVersioned.SQLite */);
|
|
247
|
+
}
|
|
248
|
+
this.runSql(runReq$, testCases, resultId, !publicPreview && !preview, code);
|
|
249
|
+
}
|
|
250
|
+
runSql(runReq$, testCases, questionResultId, isActualQuestion, code) {
|
|
251
|
+
let attemptId = '';
|
|
252
|
+
runReq$
|
|
253
|
+
.pipe(catchError((err) => {
|
|
254
|
+
this.finalizeReq(err);
|
|
255
|
+
return throwError(() => err);
|
|
256
|
+
}), tap((res) => this.finalizeReq(res)), tap(({ id }) => (attemptId = id ?? '')), switchMap((responseArray) => of(responseArray.executions).pipe(map((executions) => this.countTestResults(executions)), map((countResult) => {
|
|
257
|
+
const sqlExecutedSuccessfullyCopy = translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.SQL_EXECUTED_SUCCESSFULLY`);
|
|
258
|
+
const noOutputCopies = this.getNoOutputCopies();
|
|
259
|
+
return {
|
|
260
|
+
resume: {
|
|
261
|
+
ok: countResult.passed,
|
|
262
|
+
error: countResult.error,
|
|
263
|
+
total: countResult.total,
|
|
264
|
+
},
|
|
265
|
+
listResponse: responseArray.executions?.map(({ run, evaluation }) => ({
|
|
266
|
+
actualOutput: run.stdout
|
|
267
|
+
? run.stdout
|
|
268
|
+
: run.stderr || run.signal === TIMEOUT_SIGNAL
|
|
269
|
+
? noOutputCopies['noResponse']
|
|
270
|
+
: noOutputCopies['noOutput'],
|
|
271
|
+
logs: this.getCoderunnerLogs(run, TIMEOUT_SIGNAL, noOutputCopies['timeoutError'], sqlExecutedSuccessfullyCopy),
|
|
272
|
+
status: evaluation.testcase ? 'passed' : 'error',
|
|
273
|
+
})),
|
|
274
|
+
};
|
|
275
|
+
}), tap((testCasesResultObject) => this.handleTestCasesResult(testCasesResultObject)))), switchMap(() => this.getSendCodeEventStream$(isActualQuestion, attemptId, questionResultId, code)))
|
|
276
|
+
.subscribe();
|
|
277
|
+
}
|
|
278
|
+
getLATrequest(id, resultId, testResultId, code, testCasesFormatted, language, publicPreview, preview) {
|
|
279
|
+
if (publicPreview) {
|
|
280
|
+
return this.coderunnerApiService.runPublicTest$(code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
|
|
281
|
+
}
|
|
282
|
+
else if (preview) {
|
|
283
|
+
return this.coderunnerApiService.runPreviewTest$(testResultId, code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
|
|
284
|
+
}
|
|
285
|
+
else {
|
|
286
|
+
return this.coderunnerApiService.runNonPreviewTest$(id, resultId, code, testCasesFormatted, `${language}-${this.libCodingTestService.getVersion()}`);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
setIsSQLTest(isSQL) {
|
|
290
|
+
this.isSQLTest = isSQL;
|
|
291
|
+
}
|
|
292
|
+
runLAT(runCodeRequest$, isPublicPreviewLAT, isPractice = false, testData, testCases, code, questionResultId) {
|
|
293
|
+
const pistonRegex = /\/piston\/[^/ ]+(\/[^/ ]+)*/g;
|
|
294
|
+
const reqStartTime = performance.now();
|
|
295
|
+
let reqEndTime;
|
|
296
|
+
let attemptId = '';
|
|
297
|
+
runCodeRequest$
|
|
298
|
+
.pipe(catchError((err) => {
|
|
299
|
+
this.finalizeReq(err);
|
|
300
|
+
return throwError(() => err);
|
|
301
|
+
}), tap((res) => this.finalizeReq(res)), tap(() => (reqEndTime = performance.now())), tap(({ id }) => (attemptId = id ?? '')), switchMap((responseArray) => of(responseArray.executions).pipe(map((executions) => (executions ? executions : [])), map((executions) => executions.map((x) => {
|
|
302
|
+
if (x.run.stderr) {
|
|
303
|
+
x.run.stderr = x.run.stderr.replace(pistonRegex, '');
|
|
304
|
+
}
|
|
305
|
+
if (x.run.stdout) {
|
|
306
|
+
x.run.stdout = x.run.stdout.replace(pistonRegex, '');
|
|
307
|
+
}
|
|
308
|
+
return x;
|
|
309
|
+
})), map((executions) => this.countTestResults(executions)), map((countResult) => {
|
|
310
|
+
if (!isPublicPreviewLAT) {
|
|
311
|
+
const responseTime = Math.round(reqEndTime - reqStartTime);
|
|
312
|
+
this.trackTestcasesRun(testData, countResult, responseArray.executions || [], responseTime, testCases);
|
|
313
|
+
}
|
|
314
|
+
const noOutputCopies = this.getNoOutputCopies();
|
|
315
|
+
const executedSuccessfullyCopy = translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.EXECUTED_SUCCESSFULLY`);
|
|
316
|
+
return {
|
|
317
|
+
resume: {
|
|
318
|
+
ok: countResult.passed,
|
|
319
|
+
error: countResult.error,
|
|
320
|
+
total: countResult.total,
|
|
321
|
+
},
|
|
322
|
+
listResponse: responseArray.executions?.map(({ run, evaluation, compile, }) => ({
|
|
323
|
+
actualOutput: run.stdout
|
|
324
|
+
? run.stdout
|
|
325
|
+
: run.stderr || run.signal === TIMEOUT_SIGNAL
|
|
326
|
+
? noOutputCopies['noResponse']
|
|
327
|
+
: noOutputCopies['noOutput'],
|
|
328
|
+
logs: this.getCoderunnerLogs(run, TIMEOUT_SIGNAL, noOutputCopies['timeoutError'], executedSuccessfullyCopy, compile),
|
|
329
|
+
status: evaluation.testcase ? 'passed' : 'error',
|
|
330
|
+
})),
|
|
331
|
+
};
|
|
332
|
+
}), tap((testCasesResultObject) => this.handleTestCasesResult(testCasesResultObject)))), switchMap(() => this.getSendCodeEventStream$(!isPractice && !isPublicPreviewLAT, attemptId, questionResultId, code)))
|
|
333
|
+
.subscribe();
|
|
334
|
+
}
|
|
335
|
+
finalizeReq(err) {
|
|
336
|
+
this.isTestResultsLoading.set(false);
|
|
337
|
+
if (err.detail) {
|
|
338
|
+
this.snackBar.error(err.detail);
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
getNoOutputCopies() {
|
|
342
|
+
return {
|
|
343
|
+
noResponse: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.NO_RESPONSE`),
|
|
344
|
+
noOutput: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.NONE`),
|
|
345
|
+
timeoutError: translate(`${this.translationContext}TEST_RESULTS.TEST_CASES.TIMEOUT_ERROR`),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
getSendCodeEventStream$(isActualQuestion, attemptId, questionResultId, code) {
|
|
349
|
+
if (isActualQuestion) {
|
|
350
|
+
return this.sendCodeEvent$(attemptId, questionResultId, code);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
return of({});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
// todo: check if we need this anymore due to MFE providers specificity
|
|
357
|
+
unsubscribeAll() {
|
|
358
|
+
this.unsubscribe$.next();
|
|
359
|
+
this.unsubscribe$.complete();
|
|
360
|
+
}
|
|
361
|
+
resetRunTestSummary() {
|
|
362
|
+
this.codingTestResults = {
|
|
363
|
+
listResponse: [],
|
|
364
|
+
resume: {
|
|
365
|
+
ok: 0,
|
|
366
|
+
error: 0,
|
|
367
|
+
total: 0,
|
|
368
|
+
},
|
|
369
|
+
};
|
|
370
|
+
this.publishTestResults();
|
|
371
|
+
}
|
|
372
|
+
trackConfigChanged(isPracticeQuestion = false) {
|
|
373
|
+
this.libCodingTestService.configFieldChanged$
|
|
374
|
+
.pipe(takeUntil(this.unsubscribe$))
|
|
375
|
+
.subscribe((config) => {
|
|
376
|
+
const { settingInstance, changedKey, newValueString } = this.getMixpanelSettingsData(isPracticeQuestion, config);
|
|
377
|
+
this.mixpanel.track("Changed Coderunner setting" /* MixpanelEvents.ChangedSettings */, {
|
|
378
|
+
coderunner_setting: changedKey,
|
|
379
|
+
coderunner_setting_new_value: newValueString,
|
|
380
|
+
coderunner_setting_instance: settingInstance,
|
|
381
|
+
});
|
|
382
|
+
});
|
|
383
|
+
}
|
|
384
|
+
getCoderunnerLogs(run, TIMEOUT_SIGNAL, timeoutErrorCopy, executedSuccessfullyCopy, compile, isSQL) {
|
|
385
|
+
if (isSQL) {
|
|
386
|
+
return run?.stderr === TIMEOUT_SIGNAL
|
|
387
|
+
? run.stderr
|
|
388
|
+
: executedSuccessfullyCopy;
|
|
389
|
+
}
|
|
390
|
+
else if (run?.stderr) {
|
|
391
|
+
return run.stderr === compile?.stderr
|
|
392
|
+
? run.stderr
|
|
393
|
+
: `${run.stderr}\n${compile?.stderr || ''}`;
|
|
394
|
+
}
|
|
395
|
+
else if (run.signal === TIMEOUT_SIGNAL) {
|
|
396
|
+
return timeoutErrorCopy;
|
|
397
|
+
}
|
|
398
|
+
return executedSuccessfullyCopy;
|
|
399
|
+
}
|
|
400
|
+
trackTestcasesRun(testData, countResult, testCasesExecutions, responseTime, testCases) {
|
|
401
|
+
const { instance, customPassed, customFailed, examplePassed, exampleFailed, customEmpty, testUuid, testName, } = this.getMixpanelTestCasesData(testData, countResult, testCasesExecutions, testCases);
|
|
402
|
+
this.mixpanel.track('Candidate ran tests in Coderunner', {
|
|
403
|
+
coding_test_uuid: testUuid,
|
|
404
|
+
coding_test_name: testName,
|
|
405
|
+
coderunner_test_instance: instance,
|
|
406
|
+
custom_testcases_passed: customPassed,
|
|
407
|
+
custom_testcases_failed: customFailed,
|
|
408
|
+
custom_testcases_empty: customEmpty,
|
|
409
|
+
example_testcases_passed: examplePassed,
|
|
410
|
+
example_testcases_failed: exampleFailed,
|
|
411
|
+
coderunner_response_time: responseTime,
|
|
412
|
+
});
|
|
413
|
+
}
|
|
414
|
+
preRunTests() {
|
|
415
|
+
this.isTestResultsLoading.set(true);
|
|
416
|
+
this.resetRunTestSummary();
|
|
417
|
+
}
|
|
418
|
+
getMixpanelTestCasesData(testData, { total }, testCasesExecutions, validTestCases) {
|
|
419
|
+
const allTestCasesCount = this.libCodingTestService.getTestCasesCount();
|
|
420
|
+
const customEmpty = allTestCasesCount - total || 0;
|
|
421
|
+
const instance = this.getMixpanelInstanceValue(!!testData.is_preview_mode);
|
|
422
|
+
const { uuid: testUuid } = testData;
|
|
423
|
+
const { name: testName } = testData.test ?? { name: '' };
|
|
424
|
+
const mixpanelResults = this.getGroupedTestCaseResult(testCasesExecutions, validTestCases);
|
|
425
|
+
return {
|
|
426
|
+
testUuid: testUuid?.replace(/-/g, ''),
|
|
427
|
+
testName,
|
|
428
|
+
instance,
|
|
429
|
+
customEmpty,
|
|
430
|
+
customPassed: mixpanelResults.custom.passed,
|
|
431
|
+
customFailed: mixpanelResults.custom.failed,
|
|
432
|
+
examplePassed: mixpanelResults.example.passed,
|
|
433
|
+
exampleFailed: mixpanelResults.example.failed,
|
|
434
|
+
};
|
|
435
|
+
}
|
|
436
|
+
getGroupedTestCaseResult(testCasesExecutions, validTestCases) {
|
|
437
|
+
const groupedResult = {
|
|
438
|
+
custom: {
|
|
439
|
+
failed: 0,
|
|
440
|
+
passed: 0,
|
|
441
|
+
},
|
|
442
|
+
example: {
|
|
443
|
+
failed: 0,
|
|
444
|
+
passed: 0,
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
testCasesExecutions.forEach(({ input: resultInput, evaluation }) => {
|
|
448
|
+
const localTestCase = validTestCases.find(({ input }) => resultInput === input);
|
|
449
|
+
const mixpanelResultBody = localTestCase?.preloaded
|
|
450
|
+
? groupedResult.example
|
|
451
|
+
: groupedResult.custom;
|
|
452
|
+
if (evaluation?.testcase) {
|
|
453
|
+
mixpanelResultBody.passed++;
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
mixpanelResultBody.failed++;
|
|
457
|
+
}
|
|
458
|
+
});
|
|
459
|
+
return groupedResult;
|
|
460
|
+
}
|
|
461
|
+
getMixpanelSettingsData(isPracticeQuestion, config) {
|
|
462
|
+
const settingInstance = this.getMixpanelInstanceValue(isPracticeQuestion);
|
|
463
|
+
const changedKey = Object.keys(config)[0];
|
|
464
|
+
const THEME_IDENTIFIER = 'theme-';
|
|
465
|
+
let changedValue = config[changedKey];
|
|
466
|
+
let newValueString;
|
|
467
|
+
if (typeof changedValue === 'boolean') {
|
|
468
|
+
newValueString = changedValue ? 'ON' : 'OFF';
|
|
469
|
+
}
|
|
470
|
+
else {
|
|
471
|
+
changedValue = String(changedValue);
|
|
472
|
+
newValueString = changedValue.includes(THEME_IDENTIFIER)
|
|
473
|
+
? changedValue.replace(THEME_IDENTIFIER, '')
|
|
474
|
+
: changedValue;
|
|
475
|
+
}
|
|
476
|
+
return { settingInstance, changedKey, newValueString };
|
|
477
|
+
}
|
|
478
|
+
getMixpanelInstanceValue(isPracticeQuestion) {
|
|
479
|
+
return isPracticeQuestion ? 'practice question' : 'real test';
|
|
480
|
+
}
|
|
481
|
+
publishTestResults() {
|
|
482
|
+
this.codingTestResutsSubj$.next({ ...this.codingTestResults });
|
|
483
|
+
}
|
|
484
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService, deps: [{ token: i1.CoderunnerApiService }, { token: i2.LibCodingTestService }, { token: i3.MixpanelService }, { token: i4.SnackbarService }, { token: i4.DialogService }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
485
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService });
|
|
486
|
+
}
|
|
487
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CodingTestService, decorators: [{
|
|
488
|
+
type: Injectable
|
|
489
|
+
}], ctorParameters: () => [{ type: i1.CoderunnerApiService }, { type: i2.LibCodingTestService }, { type: i3.MixpanelService }, { type: i4.SnackbarService }, { type: i4.DialogService }] });
|
|
490
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kaW5nLXRlc3Quc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3Rnby1jb2RpbmctdGVzdC9zcmMvbGliL3NlcnZpY2VzL2NhbmRpZGF0ZS1jb2RpbmctdGVzdC1zZXJ2aWNlcy9jb2RpbmctdGVzdC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUM5QyxPQUFPLEVBRUwsc0JBQXNCLEVBQ3RCLGFBQWEsRUFDYixlQUFlLEdBQ2hCLE1BQU0scUJBQXFCLENBQUM7QUFDN0IsT0FBTyxFQUNMLGVBQWUsR0FFaEIsTUFBTSw4QkFBOEIsQ0FBQztBQU90QyxPQUFPLEVBQUUsb0JBQW9CLEVBQW1CLE1BQU0sNEJBQTRCLENBQUM7QUFFbkYsT0FBTyxFQUNMLGVBQWUsRUFFZixPQUFPLEVBQ1AsTUFBTSxFQUNOLEVBQUUsRUFDRixTQUFTLEVBQ1QsVUFBVSxHQUNYLE1BQU0sTUFBTSxDQUFDO0FBQ2QsT0FBTyxFQUFFLFVBQVUsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV2RSxPQUFPLEVBS0wsY0FBYyxHQUNmLE1BQU0sMkNBQTJDLENBQUM7QUFZbkQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDcEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7OztBQU9oRSxNQUFNLE9BQU8saUJBQWlCO0lBdUJsQjtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBMUJELGtCQUFrQixHQUFHLEdBQUcsdUJBQXVCLGNBQWMsQ0FBQztJQUUvRCxpQkFBaUIsR0FBNEI7UUFDbkQsWUFBWSxFQUFF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cUIsQ0FBQyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQzt3R0FoeEJVLGlCQUFpQjs0R0FBakIsaUJBQWlCOzs0RkFBakIsaUJBQWlCO2tCQUQ3QixVQUFVIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyB0cmFuc2xhdGUgfSBmcm9tICdAbmduZWF0L3RyYW5zbG9jbyc7XG5pbXBvcnQge1xuICBBcHBsaWNhdGlvblRoZW1lLFxuICBDb25maXJtRGlhbG9nQ29tcG9uZW50LFxuICBEaWFsb2dTZXJ2aWNlLFxuICBTbmFja2JhclNlcnZpY2UsXG59IGZyb20gJ0B0ZXN0Z29yaWxsYS90Z28tdWknO1xuaW1wb3J0IHtcbiAgTWl4cGFuZWxTZXJ2aWNlLFxuICBUZXN0UmVzdWx0UmVhZCxcbn0gZnJvbSAnQHRlc3Rnb3JpbGxhL3Rnby10ZXN0LXNoYXJlZCc7XG5pbXBvcnQge1xuICBDdXN0b21UZXN0Q2FzZSxcbiAgRXhhbXBsZVRlc3RDYXNlLFxuICBUZXN0Q2FzZURlbGV0aW9uQWN0aW9uLFxuICBUZXN0Q2FzZURlbGV0aW9uRGF0YSxcbn0gZnJvbSAnLi4vLi4vbW9kZWxzL3Rlc3QtY2FzZXMnO1xuaW1wb3J0IHsgTGliQ29kaW5nVGVzdFNlcnZpY2UsIFJlc2V0Q29kZUFjdGlvbiB9IGZyb20gJy4uL2xpYi1jb2RpbmctdGVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IENvZGVFZGl0b3JMYW5ndWFnZXMgfSBmcm9tICcuLi8uLi9jb21wb25lbnRzL2NvZGUtZWRpdG9yL2hlbHBlcnMvY29kZS1lZGl0b3ItaGVscGVyLm1vZGVsJztcbmltcG9ydCB7XG4gIEJlaGF2aW9yU3ViamVjdCxcbiAgT2JzZXJ2YWJsZSxcbiAgU3ViamVjdCxcbiAgZmlsdGVyLFxuICBvZixcbiAgdGFrZVVudGlsLFxuICB0aHJvd0Vycm9yLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCwgc3dpdGNoTWFwLCB0YWtlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb2RlRXZlbnQsIENvZGVFdmVudFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2NvZGUtZXZlbnQnO1xuaW1wb3J0IHtcbiAgQ29kZVJ1bm5lclRlc3RDYXNlRXhlY3V0aW9uT3V0cHV0TW9kZWwsXG4gIENvZGVydW5uZXJBdHRlbXB0TW9kZWwsXG4gIENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsLFxuICBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbCxcbiAgVElNRU9VVF9TSUdOQUwsXG59IGZyb20gJy4uLy4uL21vZGVscy9jb2RlcnVubmVyLWV4ZWN1dGlvbi1yZXN1bHRzJztcbmltcG9ydCB7IE1peHBhbmVsRXZlbnRzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL21peHBhbmVsLWV2ZW50cyc7XG5pbXBvcnQge1xuICBQcm9ncmFtbWluZ0xhbmd1YWdlLFxuICBQcm9ncmFtbWluZ0xhbmd1YWdlVmVyc2lvbmVkLFxufSBmcm9tICcuLi8uLi9tb2RlbHMvcHJvZ3JhbW1pbmctbGFuZ3VhZ2UnO1xuaW1wb3J0IHtcbiAgR3JvdXBlZFRlc3RDYXNlc1Jlc3VsdCxcbiAgTEFURm9ybWF0dGVkVGVzdENhc2VzLFxuICBTcWxUZXN0Q2FzZSxcbiAgVGVzdGNhc2UsXG59IGZyb20gJy4uLy4uL21vZGVscy90ZXN0LWNhc2VzJztcbmltcG9ydCB7IFJPT1RfVFJBTlNMQVRJT05TX1NDT1BFIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3RyYW5zbGF0aW9ucyc7XG5pbXBvcnQgeyBDb2RlcnVubmVyQXBpU2VydmljZSB9IGZyb20gJy4vY29kZXJ1bm5lci1hcGkuc2VydmljZSc7XG5cbmludGVyZmFjZSBDdXN0b21FcnJvciB7XG4gIGRldGFpbD86IHN0cmluZztcbn1cblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIENvZGluZ1Rlc3RTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgdHJhbnNsYXRpb25Db250ZXh0ID0gYCR7Uk9PVF9UUkFOU0xBVElPTlNfU0NPUEV9LkNPRElOR19MSUIuYDtcblxuICBwcml2YXRlIGNvZGluZ1Rlc3RSZXN1bHRzOiBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbCA9IHtcbiAgICBsaXN0UmVzcG9uc2U6IFtdLFxuICAgIHJlc3VtZToge1xuICAgICAgb2s6IDAsXG4gICAgICBlcnJvcjogMCxcbiAgICAgIHRvdGFsOiAwLFxuICAgIH0sXG4gIH07XG4gIHByaXZhdGUgY3VycmVudExhbmd1YWdlITogUHJvZ3JhbW1pbmdMYW5ndWFnZTtcbiAgcHJpdmF0ZSBjb2RpbmdUZXN0UmVzdXRzU3ViaiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KHRoaXMuY29kaW5nVGVzdFJlc3VsdHMpO1xuICBjb2RpbmdUZXN0UmVzdWx0cyQgPSB0aGlzLmNvZGluZ1Rlc3RSZXN1dHNTdWJqJC5hc09ic2VydmFibGUoKTtcblxuICBpc1Rlc3RSZXN1bHRzTG9hZGluZyA9IHNpZ25hbDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSB1bnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIHByaXZhdGUgc3FsVGVzdENhc2VzITogU3FsVGVzdENhc2VbXTtcbiAgcHJpdmF0ZSBpc1NRTFRlc3QgPSBmYWxzZTtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGNvZGVydW5uZXJBcGlTZXJ2aWNlOiBDb2RlcnVubmVyQXBpU2VydmljZSxcbiAgICBwcml2YXRlIGxpYkNvZGluZ1Rlc3RTZXJ2aWNlOiBMaWJDb2RpbmdUZXN0U2VydmljZSxcbiAgICBwcml2YXRlIG1peHBhbmVsOiBNaXhwYW5lbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBzbmFja0JhcjogU25hY2tiYXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGlhbG9nOiBEaWFsb2dTZXJ2aWNlXG4gICkge31cblxuICBwcml2YXRlIGdldEJhc2VFeGFtcGxlVGVzdENhc2UgPSAoaWQ6IG51bWJlciwgaW5kZXg6IG51bWJlcikgPT4gKHtcbiAgICBpZDogaWQgPz8gMCxcbiAgICBuYW1lOiBgRXhhbXBsZSAke2luZGV4ICsgMX1gLFxuICAgIHByZWxvYWRlZDogdHJ1ZSxcbiAgfSk7XG5cbiAgdHJhbnNmb3JtVG9FeGFtcGxlTEFUdGVzdENhc2UgPSAoXG4gICAgdGVzdGNhc2U6IFRlc3RjYXNlLFxuICAgIGluZGV4OiBudW1iZXJcbiAgKTogRXhhbXBsZVRlc3RDYXNlID0+ICh7XG4gICAgLi4udGhpcy5nZXRCYXNlRXhhbXBsZVRlc3RDYXNlKHRlc3RjYXNlLmlkISwgaW5kZXgpLFxuICAgIGV4cGVjdGVkT3V0cHV0OiB0ZXN0Y2FzZS5zb2x1dGlvbiA/PyAnJyxcbiAgICBpbnB1dDogdGVzdGNhc2UuaW5wdXQsXG4gIH0pO1xuXG4gIHRyYW5zZm9ybVRvRXhhbXBsZVNRTFRlc3RDYXNlID0gKFxuICAgIHRlc3RjYXNlOiBTcWxUZXN0Q2FzZSxcbiAgICBpbmRleDogbnVtYmVyXG4gICk6IEV4YW1wbGVUZXN0Q2FzZSA9PiAoe1xuICAgIC4uLnRoaXMuZ2V0QmFzZUV4YW1wbGVUZXN0Q2FzZSh0ZXN0Y2FzZS5pZCEsIGluZGV4KSxcbiAgICBleHBlY3RlZE91dHB1dDogdGVzdGNhc2UucmVzdWx0ID8/ICcnLFxuICB9KTtcblxuICBzZXRTcWxUZXN0Q2FzZXMoc3FsVGVzdENhc2VzOiBTcWxUZXN0Q2FzZVtdKSB7XG4gICAgdGhpcy5zcWxUZXN0Q2FzZXMgPSBzcWxUZXN0Q2FzZXM7XG4gIH1cblxuICBnZXRTcWxUZXN0Q2FzZXMoKTogU3FsVGVzdENhc2VbXSB7XG4gICAgcmV0dXJuIHRoaXMuc3FsVGVzdENhc2VzO1xuICB9XG5cbiAgaGFuZGxlUmVzZXRDb2RlTW9kYWwoYXBwbGljYXRpb25UaGVtZTogQXBwbGljYXRpb25UaGVtZSwgY29tcGFueUNvbG9yOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBtb2RhbFRyYW5zbGF0aW9uQ29udGV4dCA9IGAke1JPT1RfVFJBTlNMQVRJT05TX1NDT1BFfS5NT0RBTFMuUkVTRVRfQ09ERS5gO1xuICAgIGNvbnN0IG1vZGFsRGF0YSA9IHtcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0cmFuc2xhdGUoYCR7bW9kYWxUcmFuc2xhdGlvbkNvbnRleHR9U1VCTUlUYCksXG4gICAgICB0aXRsZTogdHJhbnNsYXRlKGAke21vZGFsVHJhbnNsYXRpb25Db250ZXh0fVRJVExFYCksXG4gICAgICBtZXNzYWdlOiB0cmFuc2xhdGUoYCR7bW9kYWxUcmFuc2xhdGlvbkNvbnRleHR9TUVTU0FHRWApLFxuICAgICAgY29sb3I6IGNvbXBhbnlDb2xvcixcbiAgICB9O1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oQ29uZmlybURpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgYXBwbGljYXRpb25UaGVtZSxcbiAgICAgIHNpemU6ICdzbWFsbCcsXG4gICAgICBleHRyYURhdGE6IG1vZGFsRGF0YSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZlxuICAgICAgLmFmdGVyQ2xvc2VkKClcbiAgICAgIC5waXBlKGZpbHRlcihCb29sZWFuKSwgdGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmNvbmZpcm1SZXNldCgpO1xuICAgICAgfSk7XG4gIH1cblxuICBsaXN0ZW5EZWxldGVDdXN0b21UZXN0Q2FzZXMoKTogT2JzZXJ2YWJsZTxUZXN0Q2FzZURlbGV0aW9uRGF0YT4ge1xuICAgIHJldHVybiB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLnRlc3RDYXNlRGVsZXRpb24kLnBpcGUoXG4gICAgICBmaWx0ZXIoKHsgYWN0aW9uIH0pID0+IGFjdGlvbiA9PT0gVGVzdENhc2VEZWxldGlvbkFjdGlvbi5UcnkpXG4gICAgKTtcbiAgfVxuXG4gIGhhbmRsZURlbGV0ZVRlc3RDYXNlTW9kYWwoXG4gICAgaW5kZXg6IG51bWJlcixcbiAgICBhcHBsaWNhdGlvblRoZW1lOiBBcHBsaWNhdGlvblRoZW1lLFxuICAgIGNvbXBhbnlDb2xvcjogc3RyaW5nXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IGRlbGV0ZVRlc3RDYXNlVHJhbnNsYXRpb25Db250ZXh0ID0gYCR7Uk9PVF9UUkFOU0xBVElPTlNfU0NPUEV9Lk1PREFMUy5ERUxFVEVfVEVTVF9DQVNFLmA7XG4gICAgY29uc3QgbW9kYWxEYXRhID0ge1xuICAgICAgdGl0bGU6IHRyYW5zbGF0ZShgJHtkZWxldGVUZXN0Q2FzZVRyYW5zbGF0aW9uQ29udGV4dH1USVRMRWApLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlKGAke2RlbGV0ZVRlc3RDYXNlVHJhbnNsYXRpb25Db250ZXh0fU1FU1NBR0VgKSxcbiAgICAgIGNvbmZpcm1CdXR0b25UZXh0OiB0cmFuc2xhdGUoYCR7ZGVsZXRlVGVzdENhc2VUcmFuc2xhdGlvbkNvbnRleHR9U1VCTUlUYCksXG4gICAgICBjb2xvcjogY29tcGFueUNvbG9yLFxuICAgIH07XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBhcHBsaWNhdGlvblRoZW1lLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIGV4dHJhRGF0YTogbW9kYWxEYXRhLFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUoZmlsdGVyKEJvb2xlYW4pLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuY29uZmlybVRlc3RDYXNlRGVsZXRpb24oaW5kZXgpO1xuICAgICAgfSk7XG4gIH1cblxuICBoYW5kbGVMYW5ndWFnZUNoYW5nZU1vZGFsKFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlcixcbiAgICBzZWxlY3RlZExhbmd1YWdlPzogUHJvZ3JhbW1pbmdMYW5ndWFnZSxcbiAgICBhcHBsaWNhdGlvblRoZW1lOiBBcHBsaWNhdGlvblRoZW1lID0gJ2xpZ2h0JyxcbiAgICBjb21wYW55Q29sb3I/OiBzdHJpbmcsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IG1vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dCA9IGAke1JPT1RfVFJBTlNMQVRJT05TX1NDT1BFfS5NT0RBTFMuTEFOR1VBR0VfQ0hBTkdFLmA7XG4gICAgY29uc3QgbW9kYWxEYXRhID0ge1xuICAgICAgY29uZmlybUJ1dHRvblRleHQ6IHRyYW5zbGF0ZShcbiAgICAgICAgYCR7bW9kYWxMYW5nQ2hhbmdlVHJhbnNsYXRpb25Db250ZXh0fVNVQk1JVGBcbiAgICAgICksXG4gICAgICB0aXRsZTogdHJhbnNsYXRlKGAke21vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dH1USVRMRWApLFxuICAgICAgbWVzc2FnZTogdHJhbnNsYXRlKGAke21vZGFsTGFuZ0NoYW5nZVRyYW5zbGF0aW9uQ29udGV4dH1NRVNTQUdFYCksXG4gICAgICAuLi4oY29tcGFueUNvbG9yICYmIHsgY29sb3I6IGNvbXBhbnlDb2xvciB9KSxcbiAgICB9O1xuXG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtRGlhbG9nQ29tcG9uZW50LCB7XG4gICAgICBhcHBsaWNhdGlvblRoZW1lLFxuICAgICAgc2l6ZTogJ3NtYWxsJyxcbiAgICAgIGV4dHJhRGF0YTogbW9kYWxEYXRhLFxuICAgIH0pO1xuXG4gICAgZGlhbG9nUmVmXG4gICAgICAuYWZ0ZXJDbG9zZWQoKVxuICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3VsdCkgPT4ge1xuICAgICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jb25maXJtTGFuZ3VhZ2VDaGFuZ2UoKTtcbiAgICAgICAgICBpZiAoc2VsZWN0ZWRMYW5ndWFnZSkge1xuICAgICAgICAgICAgdGhpcy5zZXRDdXJyZW50TGFuZ3VhZ2VMQVQoc2VsZWN0ZWRMYW5ndWFnZSk7XG4gICAgICAgICAgICB0aGlzLnNlbmRMYW5ndWFnZUNoYW5nZUV2ZW50JChxdWVzdGlvblJlc3VsdElkKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jYW5jZWxMYW5ndWFnZUNoYW5nZSgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHNldEN1cnJlbnRMYW5ndWFnZUxBVChsYW5ndWFnZTogUHJvZ3JhbW1pbmdMYW5ndWFnZSk6IHZvaWQge1xuICAgIHRoaXMuY3VycmVudExhbmd1YWdlID0gbGFuZ3VhZ2U7XG4gIH1cblxuICBsaXN0ZW5Db2RpbmdUZXN0Q2hhbmdlcygpOiBPYnNlcnZhYmxlPFJlc2V0Q29kZUFjdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmxpYkNvZGluZ1Rlc3RTZXJ2aWNlLmNvZGVSZXNldCQucGlwZShcbiAgICAgIGZpbHRlcigodmFsKSA9PiB2YWwgPT09IFJlc2V0Q29kZUFjdGlvbi5UcnkpXG4gICAgKTtcbiAgfVxuXG4gIHJ1blRlc3QoXG4gICAgcmVzdWx0SWQ6IG51bWJlcixcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgaXNMQVQgPSB0cnVlLFxuICAgIGlzU1FMID0gZmFsc2UsXG4gICAgLy8gdG9kbzogcmVtb3ZlIGZyb20gZXZlcnl3aGVyZSBvciBjb21tZW50IHRlbXBvcmFyaWx5P1xuICAgIHB1YmxpY1ByZXZpZXcgPSBmYWxzZSxcbiAgICBwcmV2aWV3ID0gZmFsc2UsXG4gICAgaWQgPSAwLFxuICAgIHRlc3RSZXN1bHRJZCA9IDAsXG4gICAgdGVzdERhdGE/OiBUZXN0UmVzdWx0UmVhZFxuICApOiB2b2lkIHtcbiAgICB0aGlzLnByZVJ1blRlc3RzKCk7XG4gICAgaWYgKGlzU1FMKSB7XG4gICAgICB0aGlzLmdldFNRTHJlcXVlc3QoXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIGlkLFxuICAgICAgICBwdWJsaWNQcmV2aWV3LFxuICAgICAgICBwcmV2aWV3XG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAoaXNMQVQpIHtcbiAgICAgIGNvbnN0IHRlc3RDYXNlczogKEV4YW1wbGVUZXN0Q2FzZSB8IEN1c3RvbVRlc3RDYXNlKVtdID1cbiAgICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5nZXRWYWxpZFRlc3RDYXNlcygpO1xuICAgICAgY29uc3QgdGVzdENhc2VzRm9ybWF0dGVkID0gdGVzdENhc2VzLm1hcCgodGVzdENhc2UpID0+ICh7XG4gICAgICAgIGlucHV0OiB0ZXN0Q2FzZS5pbnB1dCxcbiAgICAgICAgc29sdXRpb246IHRlc3RDYXNlLmV4cGVjdGVkT3V0cHV0LFxuICAgICAgfSkpIGFzIExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdO1xuICAgICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jdXJyZW50TGFuZ3VhZ2UkXG4gICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgIC5zdWJzY3JpYmUoKGxhbmd1YWdlKSA9PiB7XG4gICAgICAgICAgY29uc3QgcnVuUmVxJCA9IHRoaXMuZ2V0TEFUcmVxdWVzdChcbiAgICAgICAgICAgIGlkLFxuICAgICAgICAgICAgcmVzdWx0SWQsXG4gICAgICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgICAgICBjb2RlLFxuICAgICAgICAgICAgdGVzdENhc2VzRm9ybWF0dGVkIGFzIExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdLFxuICAgICAgICAgICAgbGFuZ3VhZ2UsXG4gICAgICAgICAgICBwdWJsaWNQcmV2aWV3LFxuICAgICAgICAgICAgcHJldmlld1xuICAgICAgICAgICk7XG4gICAgICAgICAgdGhpcy5ydW5MQVQoXG4gICAgICAgICAgICBydW5SZXEkLFxuICAgICAgICAgICAgcHVibGljUHJldmlldyxcbiAgICAgICAgICAgIHByZXZpZXcsXG4gICAgICAgICAgICB0ZXN0RGF0YSB8fCAoe30gYXMgVGVzdFJlc3VsdFJlYWQpLFxuICAgICAgICAgICAgdGVzdENhc2VzLFxuICAgICAgICAgICAgY29kZSxcbiAgICAgICAgICAgIHJlc3VsdElkXG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgc2VuZENvcHlwYXN0ZUV2ZW50JChcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgY29waWVkVGV4dDogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGNvZGUsXG4gICAgICBldmVudF90eXBlOiAnQ09QWVBBU1RFJyxcbiAgICAgIGV4dHJhX3BheWxvYWQ6IGNvcGllZFRleHQsXG4gICAgICBxdWVzdGlvbl9yZXN1bHRfaWQ6IHF1ZXN0aW9uUmVzdWx0SWQsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gdGhpcy5jb2RlcnVubmVyQXBpU2VydmljZS5zZW5kQ29kZUV2ZW50JChldmVudCk7XG4gIH1cblxuICBzZW5kQXV0b3NhdmVFdmVudCQoXG4gICAgY29kZTogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlclxuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGNvZGUsXG4gICAgICBldmVudF90eXBlOiAnQVVUT1NBVkUnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2VcbiAgICAgIC5zZW5kQ29kZUV2ZW50JChldmVudClcbiAgICAgIC5waXBlKGNhdGNoRXJyb3IoKGVycikgPT4gb2YoZXJyKSkpO1xuICB9XG5cbiAgcHJpdmF0ZSBzZW5kTGFuZ3VhZ2VDaGFuZ2VFdmVudCQocXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyKTogdm9pZCB7XG4gICAgY29uc3QgZXZlbnQ6IENvZGVFdmVudCA9IHRoaXMuZ2V0QmFzZUV2ZW50KHtcbiAgICAgIGV2ZW50X3R5cGU6ICdTV0lUQ0gnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgdGhpcy5jb2RlcnVubmVyQXBpU2VydmljZS5zZW5kQ29kZUV2ZW50JChldmVudCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0QmFzZUV2ZW50KGV2ZW50OiBQYXJ0aWFsPENvZGVFdmVudD4pOiBDb2RlRXZlbnQge1xuICAgIGxldCBsYW5ndWFnZSA9ICcnO1xuXG4gICAgaWYgKHRoaXMuaXNTUUxUZXN0KSB7XG4gICAgICBsYW5ndWFnZSA9IFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCB7IG5hbWUsIHZlcnNpb24gfSA9IHRoaXMuY3VycmVudExhbmd1YWdlO1xuICAgICAgbGFuZ3VhZ2UgPSBgJHtuYW1lfS0ke3ZlcnNpb259YDtcbiAgICB9XG5cbiAgICBjb25zdCBiYXNlRXZlbnQ6IFBhcnRpYWw8Q29kZUV2ZW50PiA9IHtcbiAgICAgIGNvZGU6ICcnLFxuICAgICAgZXh0cmFfcGF5bG9hZDogJycsXG4gICAgICBhdHRlbXB0X2lkOiBudWxsLFxuICAgICAgbGFuZ3VhZ2UsXG4gICAgfTtcblxuICAgIHJldHVybiB7IC4uLmJhc2VFdmVudCwgLi4uZXZlbnQgfSBhcyBDb2RlRXZlbnQ7XG4gIH1cblxuICBwcml2YXRlIHNlbmRDb2RlRXZlbnQkKFxuICAgIGF0dGVtcHRJZDogc3RyaW5nLFxuICAgIHF1ZXN0aW9uUmVzdWx0SWQ6IG51bWJlcixcbiAgICBjb2RlOiBzdHJpbmdcbiAgKTogT2JzZXJ2YWJsZTxDb2RlRXZlbnRSZXNwb25zZT4ge1xuICAgIGNvbnN0IGV2ZW50OiBDb2RlRXZlbnQgPSB0aGlzLmdldEJhc2VFdmVudCh7XG4gICAgICBjb2RlLFxuICAgICAgYXR0ZW1wdF9pZDogYXR0ZW1wdElkLFxuICAgICAgZXZlbnRfdHlwZTogJ0FUVEVNUFQnLFxuICAgICAgcXVlc3Rpb25fcmVzdWx0X2lkOiBxdWVzdGlvblJlc3VsdElkLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2Uuc2VuZENvZGVFdmVudCQoZXZlbnQpO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3VudFRlc3RSZXN1bHRzKFxuICAgIGV4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10gfCB1bmRlZmluZWRcbiAgKToge1xuICAgIHBhc3NlZDogbnVtYmVyO1xuICAgIGVycm9yOiBudW1iZXI7XG4gICAgdG90YWw6IG51bWJlcjtcbiAgfSB7XG4gICAgaWYgKGV4ZWN1dGlvbnMpIHtcbiAgICAgIHJldHVybiBleGVjdXRpb25zLnJlZHVjZShcbiAgICAgICAgKGFjYywgcmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAocmVzcG9uc2UuZXZhbHVhdGlvbi50ZXN0Y2FzZSkge1xuICAgICAgICAgICAgYWNjLnBhc3NlZCsrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBhY2MuZXJyb3IrKztcbiAgICAgICAgICB9XG4gICAgICAgICAgYWNjLnRvdGFsKys7XG4gICAgICAgICAgcmV0dXJuIGFjYztcbiAgICAgICAgfSxcbiAgICAgICAgeyBwYXNzZWQ6IDAsIGVycm9yOiAwLCB0b3RhbDogMCB9XG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4geyBwYXNzZWQ6IDAsIGVycm9yOiAwLCB0b3RhbDogMCB9O1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVUZXN0Q2FzZXNSZXN1bHQoXG4gICAgdGVzdENhc2VzUmVzdWx0T2JqZWN0OiBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbFxuICApOiB2b2lkIHtcbiAgICB0aGlzLmNvZGluZ1Rlc3RSZXN1bHRzID0gdGVzdENhc2VzUmVzdWx0T2JqZWN0O1xuICAgIHRoaXMucHVibGlzaFRlc3RSZXN1bHRzKCk7XG4gICAgdGhpcy5pc1Rlc3RSZXN1bHRzTG9hZGluZy5zZXQoZmFsc2UpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRTUUxyZXF1ZXN0KFxuICAgIHJlc3VsdElkOiBudW1iZXIsXG4gICAgdGVzdFJlc3VsdElkOiBudW1iZXIsXG4gICAgY29kZTogc3RyaW5nLFxuICAgIGlkOiBudW1iZXIsXG4gICAgcHVibGljUHJldmlldzogYm9vbGVhbixcbiAgICBwcmV2aWV3OiBib29sZWFuXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHRlc3RDYXNlczogU3FsVGVzdENhc2VbXSA9IHRoaXMuZ2V0U3FsVGVzdENhc2VzKCk7XG4gICAgbGV0IHJ1blJlcSQ6IE9ic2VydmFibGU8Q29kZXJ1bm5lckF0dGVtcHRNb2RlbD47XG4gICAgaWYgKHB1YmxpY1ByZXZpZXcpIHtcbiAgICAgIHJ1blJlcSQgPSB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1blB1YmxpY1Rlc3QkKFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXMsXG4gICAgICAgIFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlXG4gICAgICApO1xuICAgIH0gZWxzZSBpZiAocHJldmlldykge1xuICAgICAgcnVuUmVxJCA9IHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2UucnVuUHJldmlld1Rlc3QkKFxuICAgICAgICB0ZXN0UmVzdWx0SWQsXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHRlc3RDYXNlcyxcbiAgICAgICAgUHJvZ3JhbW1pbmdMYW5ndWFnZVZlcnNpb25lZC5TUUxpdGVcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJ1blJlcSQgPSB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1bk5vblByZXZpZXdUZXN0JChcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXMsXG4gICAgICAgIFByb2dyYW1taW5nTGFuZ3VhZ2VWZXJzaW9uZWQuU1FMaXRlXG4gICAgICApO1xuICAgIH1cbiAgICB0aGlzLnJ1blNxbChydW5SZXEkLCB0ZXN0Q2FzZXMsIHJlc3VsdElkLCAhcHVibGljUHJldmlldyAmJiAhcHJldmlldywgY29kZSk7XG4gIH1cblxuICBwcml2YXRlIHJ1blNxbChcbiAgICBydW5SZXEkOiBPYnNlcnZhYmxlPENvZGVydW5uZXJBdHRlbXB0TW9kZWw+LFxuICAgIHRlc3RDYXNlczogU3FsVGVzdENhc2VbXSxcbiAgICBxdWVzdGlvblJlc3VsdElkOiBudW1iZXIsXG4gICAgaXNBY3R1YWxRdWVzdGlvbjogYm9vbGVhbixcbiAgICBjb2RlOiBzdHJpbmdcbiAgKSB7XG4gICAgbGV0IGF0dGVtcHRJZCA9ICcnO1xuXG4gICAgcnVuUmVxJFxuICAgICAgLnBpcGUoXG4gICAgICAgIGNhdGNoRXJyb3IoKGVycikgPT4ge1xuICAgICAgICAgIHRoaXMuZmluYWxpemVSZXEoZXJyKTtcbiAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBlcnIpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKChyZXMpID0+IHRoaXMuZmluYWxpemVSZXEocmVzIGFzIEN1c3RvbUVycm9yKSksXG4gICAgICAgIHRhcCgoeyBpZCB9KSA9PiAoYXR0ZW1wdElkID0gaWQgPz8gJycpKSxcbiAgICAgICAgc3dpdGNoTWFwKChyZXNwb25zZUFycmF5OiBDb2RlcnVubmVyQXR0ZW1wdE1vZGVsKSA9PlxuICAgICAgICAgIG9mKHJlc3BvbnNlQXJyYXkuZXhlY3V0aW9ucykucGlwZShcbiAgICAgICAgICAgIG1hcCgoZXhlY3V0aW9ucykgPT4gdGhpcy5jb3VudFRlc3RSZXN1bHRzKGV4ZWN1dGlvbnMpKSxcbiAgICAgICAgICAgIG1hcCgoY291bnRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgY29uc3Qgc3FsRXhlY3V0ZWRTdWNjZXNzZnVsbHlDb3B5ID0gdHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLlNRTF9FWEVDVVRFRF9TVUNDRVNTRlVMTFlgXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGNvbnN0IG5vT3V0cHV0Q29waWVzID0gdGhpcy5nZXROb091dHB1dENvcGllcygpO1xuXG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcmVzdW1lOiB7XG4gICAgICAgICAgICAgICAgICBvazogY291bnRSZXN1bHQucGFzc2VkLFxuICAgICAgICAgICAgICAgICAgZXJyb3I6IGNvdW50UmVzdWx0LmVycm9yLFxuICAgICAgICAgICAgICAgICAgdG90YWw6IGNvdW50UmVzdWx0LnRvdGFsLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGlzdFJlc3BvbnNlOiByZXNwb25zZUFycmF5LmV4ZWN1dGlvbnM/Lm1hcChcbiAgICAgICAgICAgICAgICAgICh7IHJ1biwgZXZhbHVhdGlvbiB9OiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsT3V0cHV0OiBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgPyBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgOiBydW4uc3RkZXJyIHx8IHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgICAgICAgICAgICAgICAgPyBub091dHB1dENvcGllc1snbm9SZXNwb25zZSddXG4gICAgICAgICAgICAgICAgICAgICAgOiBub091dHB1dENvcGllc1snbm9PdXRwdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbG9nczogdGhpcy5nZXRDb2RlcnVubmVyTG9ncyhcbiAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9TSUdOQUwsXG4gICAgICAgICAgICAgICAgICAgICAgbm9PdXRwdXRDb3BpZXNbJ3RpbWVvdXRFcnJvciddLFxuICAgICAgICAgICAgICAgICAgICAgIHNxbEV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weVxuICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IGV2YWx1YXRpb24udGVzdGNhc2UgPyAncGFzc2VkJyA6ICdlcnJvcicsXG4gICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIH0gYXMgQ29kaW5nVGVzdHNSZXN1bHRzTW9kZWw7XG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHRhcCgodGVzdENhc2VzUmVzdWx0T2JqZWN0KSA9PlxuICAgICAgICAgICAgICB0aGlzLmhhbmRsZVRlc3RDYXNlc1Jlc3VsdCh0ZXN0Q2FzZXNSZXN1bHRPYmplY3QpXG4gICAgICAgICAgICApXG4gICAgICAgICAgKVxuICAgICAgICApLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT5cbiAgICAgICAgICB0aGlzLmdldFNlbmRDb2RlRXZlbnRTdHJlYW0kKFxuICAgICAgICAgICAgaXNBY3R1YWxRdWVzdGlvbixcbiAgICAgICAgICAgIGF0dGVtcHRJZCxcbiAgICAgICAgICAgIHF1ZXN0aW9uUmVzdWx0SWQsXG4gICAgICAgICAgICBjb2RlXG4gICAgICAgICAgKVxuICAgICAgICApXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldExBVHJlcXVlc3QoXG4gICAgaWQ6IG51bWJlcixcbiAgICByZXN1bHRJZDogbnVtYmVyLFxuICAgIHRlc3RSZXN1bHRJZDogbnVtYmVyLFxuICAgIGNvZGU6IHN0cmluZyxcbiAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQ6IExBVEZvcm1hdHRlZFRlc3RDYXNlc1tdLFxuICAgIGxhbmd1YWdlOiBDb2RlRWRpdG9yTGFuZ3VhZ2VzLFxuICAgIHB1YmxpY1ByZXZpZXc6IGJvb2xlYW4sXG4gICAgcHJldmlldzogYm9vbGVhblxuICApOiBPYnNlcnZhYmxlPENvZGVydW5uZXJBdHRlbXB0TW9kZWw+IHtcbiAgICBpZiAocHVibGljUHJldmlldykge1xuICAgICAgcmV0dXJuIHRoaXMuY29kZXJ1bm5lckFwaVNlcnZpY2UucnVuUHVibGljVGVzdCQoXG4gICAgICAgIGNvZGUsXG4gICAgICAgIHRlc3RDYXNlc0Zvcm1hdHRlZCxcbiAgICAgICAgYCR7bGFuZ3VhZ2V9LSR7dGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5nZXRWZXJzaW9uKCl9YFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKHByZXZpZXcpIHtcbiAgICAgIHJldHVybiB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1blByZXZpZXdUZXN0JChcbiAgICAgICAgdGVzdFJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQsXG4gICAgICAgIGAke2xhbmd1YWdlfS0ke3RoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VmVyc2lvbigpfWBcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0aGlzLmNvZGVydW5uZXJBcGlTZXJ2aWNlLnJ1bk5vblByZXZpZXdUZXN0JChcbiAgICAgICAgaWQsXG4gICAgICAgIHJlc3VsdElkLFxuICAgICAgICBjb2RlLFxuICAgICAgICB0ZXN0Q2FzZXNGb3JtYXR0ZWQsXG4gICAgICAgIGAke2xhbmd1YWdlfS0ke3RoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VmVyc2lvbigpfWBcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgc2V0SXNTUUxUZXN0KGlzU1FMOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5pc1NRTFRlc3QgPSBpc1NRTDtcbiAgfVxuXG4gIHByaXZhdGUgcnVuTEFUKFxuICAgIHJ1bkNvZGVSZXF1ZXN0JDogT2JzZXJ2YWJsZTxDb2RlcnVubmVyQXR0ZW1wdE1vZGVsPixcbiAgICBpc1B1YmxpY1ByZXZpZXdMQVQ6IGJvb2xlYW4sXG4gICAgaXNQcmFjdGljZSA9IGZhbHNlLFxuICAgIHRlc3REYXRhOiBUZXN0UmVzdWx0UmVhZCxcbiAgICB0ZXN0Q2FzZXM6IEV4YW1wbGVUZXN0Q2FzZVtdIHwgQ3VzdG9tVGVzdENhc2VbXSxcbiAgICBjb2RlOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHBpc3RvblJlZ2V4ID0gL1xcL3Bpc3RvblxcL1teLyBdKyhcXC9bXi8gXSspKi9nO1xuICAgIGNvbnN0IHJlcVN0YXJ0VGltZSA9IHBlcmZvcm1hbmNlLm5vdygpO1xuICAgIGxldCByZXFFbmRUaW1lOiBudW1iZXI7XG4gICAgbGV0IGF0dGVtcHRJZCA9ICcnO1xuXG4gICAgcnVuQ29kZVJlcXVlc3QkXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG4gICAgICAgICAgdGhpcy5maW5hbGl6ZVJlcShlcnIpO1xuICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKCgpID0+IGVycik7XG4gICAgICAgIH0pLFxuICAgICAgICB0YXAoKHJlcykgPT4gdGhpcy5maW5hbGl6ZVJlcShyZXMgYXMgQ3VzdG9tRXJyb3IpKSxcbiAgICAgICAgdGFwKCgpID0+IChyZXFFbmRUaW1lID0gcGVyZm9ybWFuY2Uubm93KCkpKSxcbiAgICAgICAgdGFwKCh7IGlkIH0pID0+IChhdHRlbXB0SWQgPSBpZCA/PyAnJykpLFxuICAgICAgICBzd2l0Y2hNYXAoKHJlc3BvbnNlQXJyYXk6IENvZGVydW5uZXJBdHRlbXB0TW9kZWwpID0+XG4gICAgICAgICAgb2YocmVzcG9uc2VBcnJheS5leGVjdXRpb25zKS5waXBlKFxuICAgICAgICAgICAgbWFwKChleGVjdXRpb25zKSA9PiAoZXhlY3V0aW9ucyA/IGV4ZWN1dGlvbnMgOiBbXSkpLFxuICAgICAgICAgICAgbWFwKChleGVjdXRpb25zOiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbFtdKSA9PlxuICAgICAgICAgICAgICBleGVjdXRpb25zLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh4LnJ1bi5zdGRlcnIpIHtcbiAgICAgICAgICAgICAgICAgIHgucnVuLnN0ZGVyciA9IHgucnVuLnN0ZGVyci5yZXBsYWNlKHBpc3RvblJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh4LnJ1bi5zdGRvdXQpIHtcbiAgICAgICAgICAgICAgICAgIHgucnVuLnN0ZG91dCA9IHgucnVuLnN0ZG91dC5yZXBsYWNlKHBpc3RvblJlZ2V4LCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB4O1xuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIG1hcCgoZXhlY3V0aW9ucykgPT4gdGhpcy5jb3VudFRlc3RSZXN1bHRzKGV4ZWN1dGlvbnMpKSxcbiAgICAgICAgICAgIG1hcCgoY291bnRSZXN1bHQpID0+IHtcbiAgICAgICAgICAgICAgaWYgKCFpc1B1YmxpY1ByZXZpZXdMQVQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVRpbWUgPSBNYXRoLnJvdW5kKHJlcUVuZFRpbWUgLSByZXFTdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIHRoaXMudHJhY2tUZXN0Y2FzZXNSdW4oXG4gICAgICAgICAgICAgICAgICB0ZXN0RGF0YSxcbiAgICAgICAgICAgICAgICAgIGNvdW50UmVzdWx0LFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VBcnJheS5leGVjdXRpb25zIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgcmVzcG9uc2VUaW1lLFxuICAgICAgICAgICAgICAgICAgdGVzdENhc2VzXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjb25zdCBub091dHB1dENvcGllcyA9IHRoaXMuZ2V0Tm9PdXRwdXRDb3BpZXMoKTtcbiAgICAgICAgICAgICAgY29uc3QgZXhlY3V0ZWRTdWNjZXNzZnVsbHlDb3B5ID0gdHJhbnNsYXRlKFxuICAgICAgICAgICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLkVYRUNVVEVEX1NVQ0NFU1NGVUxMWWBcbiAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHJlc3VtZToge1xuICAgICAgICAgICAgICAgICAgb2s6IGNvdW50UmVzdWx0LnBhc3NlZCxcbiAgICAgICAgICAgICAgICAgIGVycm9yOiBjb3VudFJlc3VsdC5lcnJvcixcbiAgICAgICAgICAgICAgICAgIHRvdGFsOiBjb3VudFJlc3VsdC50b3RhbCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxpc3RSZXNwb25zZTogcmVzcG9uc2VBcnJheS5leGVjdXRpb25zPy5tYXAoXG4gICAgICAgICAgICAgICAgICAoe1xuICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgIGV2YWx1YXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBpbGUsXG4gICAgICAgICAgICAgICAgICB9OiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbCkgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsT3V0cHV0OiBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgPyBydW4uc3Rkb3V0XG4gICAgICAgICAgICAgICAgICAgICAgOiBydW4uc3RkZXJyIHx8IHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgICAgICAgICAgICAgICAgPyBub091dHB1dENvcGllc1snbm9SZXNwb25zZSddXG4gICAgICAgICAgICAgICAgICAgICAgOiBub091dHB1dENvcGllc1snbm9PdXRwdXQnXSxcbiAgICAgICAgICAgICAgICAgICAgbG9nczogdGhpcy5nZXRDb2RlcnVubmVyTG9ncyhcbiAgICAgICAgICAgICAgICAgICAgICBydW4sXG4gICAgICAgICAgICAgICAgICAgICAgVElNRU9VVF9TSUdOQUwsXG4gICAgICAgICAgICAgICAgICAgICAgbm9PdXRwdXRDb3BpZXNbJ3RpbWVvdXRFcnJvciddLFxuICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weSxcbiAgICAgICAgICAgICAgICAgICAgICBjb21waWxlXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIHN0YXR1czogZXZhbHVhdGlvbi50ZXN0Y2FzZSA/ICdwYXNzZWQnIDogJ2Vycm9yJyxcbiAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgfSBhcyBDb2RpbmdUZXN0c1Jlc3VsdHNNb2RlbDtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdGFwKCh0ZXN0Q2FzZXNSZXN1bHRPYmplY3QpID0+XG4gICAgICAgICAgICAgIHRoaXMuaGFuZGxlVGVzdENhc2VzUmVzdWx0KHRlc3RDYXNlc1Jlc3VsdE9iamVjdClcbiAgICAgICAgICAgIClcbiAgICAgICAgICApXG4gICAgICAgICksXG4gICAgICAgIHN3aXRjaE1hcCgoKSA9PlxuICAgICAgICAgIHRoaXMuZ2V0U2VuZENvZGVFdmVudFN0cmVhbSQoXG4gICAgICAgICAgICAhaXNQcmFjdGljZSAmJiAhaXNQdWJsaWNQcmV2aWV3TEFULFxuICAgICAgICAgICAgYXR0ZW1wdElkLFxuICAgICAgICAgICAgcXVlc3Rpb25SZXN1bHRJZCxcbiAgICAgICAgICAgIGNvZGVcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmluYWxpemVSZXEoZXJyOiBDdXN0b21FcnJvcik6IHZvaWQge1xuICAgIHRoaXMuaXNUZXN0UmVzdWx0c0xvYWRpbmcuc2V0KGZhbHNlKTtcbiAgICBpZiAoZXJyLmRldGFpbCkge1xuICAgICAgdGhpcy5zbmFja0Jhci5lcnJvcihlcnIuZGV0YWlsKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldE5vT3V0cHV0Q29waWVzKCk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIHJldHVybiB7XG4gICAgICBub1Jlc3BvbnNlOiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLk5PX1JFU1BPTlNFYFxuICAgICAgKSxcbiAgICAgIG5vT3V0cHV0OiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLk5PTkVgXG4gICAgICApLFxuICAgICAgdGltZW91dEVycm9yOiB0cmFuc2xhdGUoXG4gICAgICAgIGAke3RoaXMudHJhbnNsYXRpb25Db250ZXh0fVRFU1RfUkVTVUxUUy5URVNUX0NBU0VTLlRJTUVPVVRfRVJST1JgXG4gICAgICApLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldFNlbmRDb2RlRXZlbnRTdHJlYW0kKFxuICAgIGlzQWN0dWFsUXVlc3Rpb246IGJvb2xlYW4sXG4gICAgYXR0ZW1wdElkOiBzdHJpbmcsXG4gICAgcXVlc3Rpb25SZXN1bHRJZDogbnVtYmVyLFxuICAgIGNvZGU6IHN0cmluZ1xuICApOiBPYnNlcnZhYmxlPENvZGVFdmVudFJlc3BvbnNlPiB7XG4gICAgaWYgKGlzQWN0dWFsUXVlc3Rpb24pIHtcbiAgICAgIHJldHVybiB0aGlzLnNlbmRDb2RlRXZlbnQkKGF0dGVtcHRJZCwgcXVlc3Rpb25SZXN1bHRJZCwgY29kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBvZih7fSBhcyBDb2RlRXZlbnRSZXNwb25zZSk7XG4gICAgfVxuICB9XG5cbiAgLy8gdG9kbzogY2hlY2sgaWYgd2UgbmVlZCB0aGlzIGFueW1vcmUgZHVlIHRvIE1GRSBwcm92aWRlcnMgc3BlY2lmaWNpdHlcbiAgdW5zdWJzY3JpYmVBbGwoKTogdm9pZCB7XG4gICAgdGhpcy51bnN1YnNjcmliZSQubmV4dCgpO1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZXNldFJ1blRlc3RTdW1tYXJ5KCk6IHZvaWQge1xuICAgIHRoaXMuY29kaW5nVGVzdFJlc3VsdHMgPSB7XG4gICAgICBsaXN0UmVzcG9uc2U6IFtdLFxuICAgICAgcmVzdW1lOiB7XG4gICAgICAgIG9rOiAwLFxuICAgICAgICBlcnJvcjogMCxcbiAgICAgICAgdG90YWw6IDAsXG4gICAgICB9LFxuICAgIH07XG5cbiAgICB0aGlzLnB1Ymxpc2hUZXN0UmVzdWx0cygpO1xuICB9XG5cbiAgdHJhY2tDb25maWdDaGFuZ2VkKGlzUHJhY3RpY2VRdWVzdGlvbiA9IGZhbHNlKTogdm9pZCB7XG4gICAgdGhpcy5saWJDb2RpbmdUZXN0U2VydmljZS5jb25maWdGaWVsZENoYW5nZWQkXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy51bnN1YnNjcmliZSQpKVxuICAgICAgLnN1YnNjcmliZSgoY29uZmlnKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgc2V0dGluZ0luc3RhbmNlLCBjaGFuZ2VkS2V5LCBuZXdWYWx1ZVN0cmluZyB9ID1cbiAgICAgICAgICB0aGlzLmdldE1peHBhbmVsU2V0dGluZ3NEYXRhKGlzUHJhY3RpY2VRdWVzdGlvbiwgY29uZmlnKTtcblxuICAgICAgICB0aGlzLm1peHBhbmVsLnRyYWNrKE1peHBhbmVsRXZlbnRzLkNoYW5nZWRTZXR0aW5ncywge1xuICAgICAgICAgIGNvZGVydW5uZXJfc2V0dGluZzogY2hhbmdlZEtleSxcbiAgICAgICAgICBjb2RlcnVubmVyX3NldHRpbmdfbmV3X3ZhbHVlOiBuZXdWYWx1ZVN0cmluZyxcbiAgICAgICAgICBjb2RlcnVubmVyX3NldHRpbmdfaW5zdGFuY2U6IHNldHRpbmdJbnN0YW5jZSxcbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q29kZXJ1bm5lckxvZ3MoXG4gICAgcnVuOiBDb2RlUnVubmVyVGVzdENhc2VFeGVjdXRpb25PdXRwdXRNb2RlbCxcbiAgICBUSU1FT1VUX1NJR05BTDogc3RyaW5nLFxuICAgIHRpbWVvdXRFcnJvckNvcHk6IHN0cmluZyxcbiAgICBleGVjdXRlZFN1Y2Nlc3NmdWxseUNvcHk6IHN0cmluZyxcbiAgICBjb21waWxlPzogQ29kZVJ1bm5lclRlc3RDYXNlRXhlY3V0aW9uT3V0cHV0TW9kZWwsXG4gICAgaXNTUUw/OiBib29sZWFuXG4gICk6IHN0cmluZyB7XG4gICAgaWYgKGlzU1FMKSB7XG4gICAgICByZXR1cm4gcnVuPy5zdGRlcnIgPT09IFRJTUVPVVRfU0lHTkFMXG4gICAgICAgID8gcnVuLnN0ZGVyclxuICAgICAgICA6IGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weTtcbiAgICB9IGVsc2UgaWYgKHJ1bj8uc3RkZXJyKSB7XG4gICAgICByZXR1cm4gcnVuLnN0ZGVyciA9PT0gY29tcGlsZT8uc3RkZXJyXG4gICAgICAgID8gcnVuLnN0ZGVyclxuICAgICAgICA6IGAke3J1bi5zdGRlcnJ9XFxuJHtjb21waWxlPy5zdGRlcnIgfHwgJyd9YDtcbiAgICB9IGVsc2UgaWYgKHJ1bi5zaWduYWwgPT09IFRJTUVPVVRfU0lHTkFMKSB7XG4gICAgICByZXR1cm4gdGltZW91dEVycm9yQ29weTtcbiAgICB9XG4gICAgcmV0dXJuIGV4ZWN1dGVkU3VjY2Vzc2Z1bGx5Q29weTtcbiAgfVxuXG4gIHByaXZhdGUgdHJhY2tUZXN0Y2FzZXNSdW4oXG4gICAgdGVzdERhdGE6IFRlc3RSZXN1bHRSZWFkLFxuICAgIGNvdW50UmVzdWx0OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LFxuICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10sXG4gICAgcmVzcG9uc2VUaW1lOiBudW1iZXIsXG4gICAgdGVzdENhc2VzOiBFeGFtcGxlVGVzdENhc2VbXSB8IEN1c3RvbVRlc3RDYXNlW11cbiAgKTogdm9pZCB7XG4gICAgY29uc3Qge1xuICAgICAgaW5zdGFuY2UsXG4gICAgICBjdXN0b21QYXNzZWQsXG4gICAgICBjdXN0b21GYWlsZWQsXG4gICAgICBleGFtcGxlUGFzc2VkLFxuICAgICAgZXhhbXBsZUZhaWxlZCxcbiAgICAgIGN1c3RvbUVtcHR5LFxuICAgICAgdGVzdFV1aWQsXG4gICAgICB0ZXN0TmFtZSxcbiAgICB9ID0gdGhpcy5nZXRNaXhwYW5lbFRlc3RDYXNlc0RhdGEoXG4gICAgICB0ZXN0RGF0YSxcbiAgICAgIGNvdW50UmVzdWx0LFxuICAgICAgdGVzdENhc2VzRXhlY3V0aW9ucyxcbiAgICAgIHRlc3RDYXNlc1xuICAgICk7XG5cbiAgICB0aGlzLm1peHBhbmVsLnRyYWNrKCdDYW5kaWRhdGUgcmFuIHRlc3RzIGluIENvZGVydW5uZXInLCB7XG4gICAgICBjb2RpbmdfdGVzdF91dWlkOiB0ZXN0VXVpZCxcbiAgICAgIGNvZGluZ190ZXN0X25hbWU6IHRlc3ROYW1lLFxuICAgICAgY29kZXJ1bm5lcl90ZXN0X2luc3RhbmNlOiBpbnN0YW5jZSxcbiAgICAgIGN1c3RvbV90ZXN0Y2FzZXNfcGFzc2VkOiBjdXN0b21QYXNzZWQsXG4gICAgICBjdXN0b21fdGVzdGNhc2VzX2ZhaWxlZDogY3VzdG9tRmFpbGVkLFxuICAgICAgY3VzdG9tX3Rlc3RjYXNlc19lbXB0eTogY3VzdG9tRW1wdHksXG4gICAgICBleGFtcGxlX3Rlc3RjYXNlc19wYXNzZWQ6IGV4YW1wbGVQYXNzZWQsXG4gICAgICBleGFtcGxlX3Rlc3RjYXNlc19mYWlsZWQ6IGV4YW1wbGVGYWlsZWQsXG4gICAgICBjb2RlcnVubmVyX3Jlc3BvbnNlX3RpbWU6IHJlc3BvbnNlVGltZSxcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgcHJlUnVuVGVzdHMoKSB7XG4gICAgdGhpcy5pc1Rlc3RSZXN1bHRzTG9hZGluZy5zZXQodHJ1ZSk7XG4gICAgdGhpcy5yZXNldFJ1blRlc3RTdW1tYXJ5KCk7XG4gIH1cblxuICBwcml2YXRlIGdldE1peHBhbmVsVGVzdENhc2VzRGF0YShcbiAgICB0ZXN0RGF0YTogVGVzdFJlc3VsdFJlYWQsXG4gICAgeyB0b3RhbCB9OiB7IFtrZXk6IHN0cmluZ106IG51bWJlciB9LFxuICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnM6IENvZGVydW5uZXJUZXN0Q2FzZUV4ZWN1dGlvbk1vZGVsW10sXG4gICAgdmFsaWRUZXN0Q2FzZXM6IEV4YW1wbGVUZXN0Q2FzZVtdIHwgQ3VzdG9tVGVzdENhc2VbXVxuICApIHtcbiAgICBjb25zdCBhbGxUZXN0Q2FzZXNDb3VudCA9IHRoaXMubGliQ29kaW5nVGVzdFNlcnZpY2UuZ2V0VGVzdENhc2VzQ291bnQoKTtcbiAgICBjb25zdCBjdXN0b21FbXB0eSA9IGFsbFRlc3RDYXNlc0NvdW50IC0gdG90YWwgfHwgMDtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHRoaXMuZ2V0TWl4cGFuZWxJbnN0YW5jZVZhbHVlKCEhdGVzdERhdGEuaXNfcHJldmlld19tb2RlKTtcbiAgICBjb25zdCB7IHV1aWQ6IHRlc3RVdWlkIH0gPSB0ZXN0RGF0YTtcbiAgICBjb25zdCB7IG5hbWU6IHRlc3ROYW1lIH0gPSB0ZXN0RGF0YS50ZXN0ID8/IHsgbmFtZTogJycgfTtcbiAgICBjb25zdCBtaXhwYW5lbFJlc3VsdHMgPSB0aGlzLmdldEdyb3VwZWRUZXN0Q2FzZVJlc3VsdChcbiAgICAgIHRlc3RDYXNlc0V4ZWN1dGlvbnMsXG4gICAgICB2YWxpZFRlc3RDYXNlc1xuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdFV1aWQ6IHRlc3RVdWlkPy5yZXBsYWNlKC8tL2csICcnKSxcbiAgICAgIHRlc3ROYW1lLFxuICAgICAgaW5zdGFuY2UsXG4gICAgICBjdXN0b21FbXB0eSxcbiAgICAgIGN1c3RvbVBhc3NlZDogbWl4cGFuZWxSZXN1bHRzLmN1c3RvbS5wYXNzZWQsXG4gICAgICBjdXN0b21GYWlsZWQ6IG1peHBhbmVsUmVzdWx0cy5jdXN0b20uZmFpbGVkLFxuICAgICAgZXhhbXBsZVBhc3NlZDogbWl4cGFuZWxSZXN1bHRzLmV4YW1wbGUucGFzc2VkLFxuICAgICAgZXhhbXBsZUZhaWxlZDogbWl4cGFuZWxSZXN1bHRzLmV4YW1wbGUuZmFpbGVkLFxuICAgIH07XG4gIH1cblxuICBwcml2YXRlIGdldEdyb3VwZWRUZXN0Q2FzZVJlc3VsdChcbiAgICB0ZXN0Q2FzZXNFeGVjdXRpb25zOiBDb2RlcnVubmVyVGVzdENhc2VFeGVjdXRpb25Nb2RlbFtdLFxuICAgIHZhbGlkVGVzdENhc2VzOiBFeGFtcGxlVGVzdENhc2VbXSB8IEN1c3RvbVRlc3RDYXNlW11cbiAgKTogR3JvdXBlZFRlc3RDYXNlc1Jlc3VsdCB7XG4gICAgY29uc3QgZ3JvdXBlZFJlc3VsdCA9IHtcbiAgICAgIGN1c3RvbToge1xuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIHBhc3NlZDogMCxcbiAgICAgIH0sXG4gICAgICBleGFtcGxlOiB7XG4gICAgICAgIGZhaWxlZDogMCxcbiAgICAgICAgcGFzc2VkOiAwLFxuICAgICAgfSxcbiAgICB9O1xuXG4gICAgdGVzdENhc2VzRXhlY3V0aW9ucy5mb3JFYWNoKCh7IGlucHV0OiByZXN1bHRJbnB1dCwgZXZhbHVhdGlvbiB9KSA9PiB7XG4gICAgICBjb25zdCBsb2NhbFRlc3RDYXNlID0gdmFsaWRUZXN0Q2FzZXMuZmluZChcbiAgICAgICAgKHsgaW5wdXQgfSkgPT4gcmVzdWx0SW5wdXQgPT09IGlucHV0XG4gICAgICApO1xuICAgICAgY29uc3QgbWl4cGFuZWxSZXN1bHRCb2R5ID0gbG9jYWxUZXN0Q2FzZT8ucHJlbG9hZGVkXG4gICAgICAgID8gZ3JvdXBlZFJlc3VsdC5leGFtcGxlXG4gICAgICAgIDogZ3JvdXBlZFJlc3VsdC5jdXN0b207XG5cbiAgICAgIGlmIChldmFsdWF0aW9uPy50ZXN0Y2FzZSkge1xuICAgICAgICBtaXhwYW5lbFJlc3VsdEJvZHkucGFzc2VkKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBtaXhwYW5lbFJlc3VsdEJvZHkuZmFpbGVkKys7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gZ3JvdXBlZFJlc3VsdDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0TWl4cGFuZWxTZXR0aW5nc0RhdGEoXG4gICAgaXNQcmFjdGljZVF1ZXN0aW9uOiBib29sZWFuLFxuICAgIGNvbmZpZzogeyBba2V5OiBzdHJpbmddOiBib29sZWFuIHwgc3RyaW5nIHwgbnVtYmVyIH1cbiAgKSB7XG4gICAgY29uc3Qgc2V0dGluZ0luc3RhbmNlID0gdGhpcy5nZXRNaXhwYW5lbEluc3RhbmNlVmFsdWUoaXNQcmFjdGljZVF1ZXN0aW9uKTtcbiAgICBjb25zdCBjaGFuZ2VkS2V5ID0gT2JqZWN0LmtleXMoY29uZmlnKVswXTtcbiAgICBjb25zdCBUSEVNRV9JREVOVElGSUVSID0gJ3RoZW1lLSc7XG4gICAgbGV0IGNoYW5nZWRWYWx1ZTogYm9vbGVhbiB8IHN0cmluZyB8IG51bWJlciA9IGNvbmZpZ1tjaGFuZ2VkS2V5XTtcbiAgICBsZXQgbmV3VmFsdWVTdHJpbmc7XG5cbiAgICBpZiAodHlwZW9mIGNoYW5nZWRWYWx1ZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICBuZXdWYWx1ZVN0cmluZyA9IGNoYW5nZWRWYWx1ZSA/ICdPTicgOiAnT0ZGJztcbiAgICB9IGVsc2Uge1xuICAgICAgY2hhbmdlZFZhbHVlID0gU3RyaW5nKGNoYW5nZWRWYWx1ZSk7XG4gICAgICBuZXdWYWx1ZVN0cmluZyA9IGNoYW5nZWRWYWx1ZS5pbmNsdWRlcyhUSEVNRV9JREVOVElGSUVSKVxuICAgICAgICA/IGNoYW5nZWRWYWx1ZS5yZXBsYWNlKFRIRU1FX0lERU5USUZJRVIsICcnKVxuICAgICAgICA6IGNoYW5nZWRWYWx1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4geyBzZXR0aW5nSW5zdGFuY2UsIGNoYW5nZWRLZXksIG5ld1ZhbHVlU3RyaW5nIH07XG4gIH1cblxuICBwcml2YXRlIGdldE1peHBhbmVsSW5zdGFuY2VWYWx1ZShpc1ByYWN0aWNlUXVlc3Rpb246IGJvb2xlYW4pIHtcbiAgICByZXR1cm4gaXNQcmFjdGljZVF1ZXN0aW9uID8gJ3ByYWN0aWNlIHF1ZXN0aW9uJyA6ICdyZWFsIHRlc3QnO1xuICB9XG5cbiAgcHJpdmF0ZSBwdWJsaXNoVGVzdFJlc3VsdHMoKSB7XG4gICAgdGhpcy5jb2RpbmdUZXN0UmVzdXRzU3ViaiQubmV4dCh7IC4uLnRoaXMuY29kaW5nVGVzdFJlc3VsdHMgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './coding-test.service';
|
|
2
|
+
export * from './coding-test-tour.service';
|
|
3
|
+
export * from './candidature-api.service';
|
|
4
|
+
export * from './coderunner-api.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy90Z28tY29kaW5nLXRlc3Qvc3JjL2xpYi9zZXJ2aWNlcy9jYW5kaWRhdGUtY29kaW5nLXRlc3Qtc2VydmljZXMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYywwQkFBMEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29kaW5nLXRlc3Quc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NvZGluZy10ZXN0LXRvdXIuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2NhbmRpZGF0dXJlLWFwaS5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vY29kZXJ1bm5lci1hcGkuc2VydmljZSc7Il19
|