@sunbird-cb/toc 0.0.2 → 0.0.3-ang-17-20
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/fesm2022/sunbird-cb-toc.mjs +16472 -13311
- package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
- package/index.d.ts +5883 -4
- package/package.json +13 -14
- package/sunbird-cb-toc-0.0.3-ang-17-20.tgz +0 -0
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.component.mjs +0 -55
- package/esm2022/lib/_collection/_common/attendance-card/attendance-card.module.mjs +0 -126
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.component.mjs +0 -32
- package/esm2022/lib/_collection/_common/attendance-helper/attendance-helper.module.mjs +0 -85
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.component.mjs +0 -100
- package/esm2022/lib/_collection/_common/avatar-photo/avatar-photo.module.mjs +0 -48
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.component.mjs +0 -120
- package/esm2022/lib/_collection/_common/certificate-dialog/certificate-dialog.module.mjs +0 -92
- package/esm2022/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.mjs +0 -48
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.component.mjs +0 -25
- package/esm2022/lib/_collection/_common/confirm-dialog/confirm-dialog.module.mjs +0 -41
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover-card.component.mjs +0 -89
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.module.mjs +0 -42
- package/esm2022/lib/_collection/_common/connection-hover-card/connection-hover.servive.mjs +0 -41
- package/esm2022/lib/_collection/_common/connection-name/connection-name.component.mjs +0 -78
- package/esm2022/lib/_collection/_common/connection-name/connection-name.module.mjs +0 -45
- package/esm2022/lib/_collection/_common/connection-name/profile-v2.model.mjs +0 -2
- package/esm2022/lib/_collection/_common/content-progress/content-progress.component.mjs +0 -70
- package/esm2022/lib/_collection/_common/content-progress/content-progress.module.mjs +0 -28
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.mjs +0 -187
- package/esm2022/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.mjs +0 -86
- package/esm2022/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.mjs +0 -31
- package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +0 -941
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.mjs +0 -183
- package/esm2022/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.mjs +0 -327
- package/esm2022/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.mjs +0 -297
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +0 -223
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +0 -887
- package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.mjs +0 -16
- package/esm2022/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.mjs +0 -43
- package/esm2022/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.mjs +0 -133
- package/esm2022/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.mjs +0 -66
- package/esm2022/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.mjs +0 -278
- package/esm2022/lib/_collection/_common/content-toc/content-services/handle-claim.service.mjs +0 -21
- package/esm2022/lib/_collection/_common/content-toc/content-services/review-component-data.service.mjs +0 -21
- package/esm2022/lib/_collection/_common/content-toc/content-toc.component.mjs +0 -847
- package/esm2022/lib/_collection/_common/content-toc/content-toc.module.mjs +0 -219
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.component.mjs +0 -209
- package/esm2022/lib/_collection/_common/content-toc/karma-points/karma-points.module.mjs +0 -26
- package/esm2022/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.mjs +0 -19
- package/esm2022/lib/_collection/_common/content-toc/pipes/truncate.pipe.mjs +0 -23
- package/esm2022/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.mjs +0 -113
- package/esm2022/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.mjs +0 -110
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.component.mjs +0 -26
- package/esm2022/lib/_collection/_common/display-content-type/display-content-type.module.mjs +0 -19
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.mjs +0 -67
- package/esm2022/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.mjs +0 -28
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.component.mjs +0 -77
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.model.mjs +0 -2
- package/esm2022/lib/_collection/_common/mark-as-complete/mark-as-complete.module.mjs +0 -61
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.module.mjs +0 -20
- package/esm2022/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.mjs +0 -73
- package/esm2022/lib/_collection/_common/player-brief/player-brief.component.mjs +0 -139
- package/esm2022/lib/_collection/_common/player-brief/player-brief.module.mjs +0 -71
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.component.mjs +0 -34
- package/esm2022/lib/_collection/_common/rating-summary/rating-summary.module.mjs +0 -56
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.component.mjs +0 -25
- package/esm2022/lib/_collection/_common/skeleton-loader/skeleton-loader.module.mjs +0 -37
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.mjs +0 -32
- package/esm2022/lib/_collection/_common/tips-for-learner/tips-for-learner.module.mjs +0 -30
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.mjs +0 -38
- package/esm2022/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.mjs +0 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.component.mjs +0 -115
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.model.mjs +0 -12
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.module.mjs +0 -51
- package/esm2022/lib/_collection/_common/user-autocomplete/user-autocomplete.service.mjs +0 -61
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.component.mjs +0 -87
- package/esm2022/lib/_collection/_common/user-content-rating/user-content-rating.module.mjs +0 -36
- package/esm2022/lib/_collection/_common/user-image/user-image.component.mjs +0 -62
- package/esm2022/lib/_collection/_common/user-image/user-image.module.mjs +0 -24
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.component.mjs +0 -192
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.module.mjs +0 -44
- package/esm2022/lib/_collection/btn-page-back/btn-page-back.service.mjs +0 -99
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.component.mjs +0 -58
- package/esm2022/lib/_collection/card-rating-comment/card-rating-comment.module.mjs +0 -67
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.component.mjs +0 -112
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.model.mjs +0 -2
- package/esm2022/lib/_collection/sliders-dynamic/sliders-dynamic.module.mjs +0 -69
- package/esm2022/lib/_collection-api.mjs +0 -57
- package/esm2022/lib/_constants/widget-content.constants.mjs +0 -19
- package/esm2022/lib/_directives/tooltip.directive.mjs +0 -68
- package/esm2022/lib/_models/common.model.mjs +0 -2
- package/esm2022/lib/_models/error.model.mjs +0 -2
- package/esm2022/lib/_pipes/highlight.pipe.mjs +0 -24
- package/esm2022/lib/_services/rating.service.mjs +0 -89
- package/esm2022/lib/_services/samuhik-charcha.service.mjs +0 -29
- package/esm2022/lib/_services/viewer-route-util.mjs +0 -103
- package/esm2022/lib/_services/widget-content.model.mjs +0 -247
- package/esm2022/lib/_services/widget-content.service.mjs +0 -594
- package/esm2022/lib/_shared/translate-loader.factory.mjs +0 -9
- package/esm2022/lib/app-toc-lib.module.mjs +0 -499
- package/esm2022/lib/collection.config.mjs +0 -161
- package/esm2022/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.mjs +0 -37
- package/esm2022/lib/components/app-toc-banner/app-toc-banner.component.mjs +0 -1436
- package/esm2022/lib/components/app-toc-cios-home/app-toc-cios-home.component.mjs +0 -475
- package/esm2022/lib/components/app-toc-cios-home/consent-dialog.component.mjs +0 -119
- package/esm2022/lib/components/app-toc-cohorts/app-toc-cohorts.component.mjs +0 -80
- package/esm2022/lib/components/app-toc-content-card/app-toc-content-card.component.mjs +0 -249
- package/esm2022/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.mjs +0 -39
- package/esm2022/lib/components/app-toc-discussion/app-toc-discussion.component.mjs +0 -58
- package/esm2022/lib/components/app-toc-home/app-toc-home.component.mjs +0 -2229
- package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +0 -2836
- package/esm2022/lib/components/app-toc-overview/app-toc-overview.component.mjs +0 -157
- package/esm2022/lib/components/app-toc-session-card/app-toc-session-card.component.mjs +0 -48
- package/esm2022/lib/components/app-toc-sessions/app-toc-sessions.component.mjs +0 -47
- package/esm2022/lib/components/app-toc-single-page/app-toc-single-page.component.mjs +0 -766
- package/esm2022/lib/components/completion-survey-form/completion-survey-form.component.mjs +0 -243
- package/esm2022/lib/components/create-batch-dialog/create-batch-dialog.component.mjs +0 -116
- package/esm2022/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.mjs +0 -44
- package/esm2022/lib/components/enroll-profile-form/enroll-profile-form.component.mjs +0 -1838
- package/esm2022/lib/components/enroll-questionnaire/enroll-questionnaire.component.mjs +0 -236
- package/esm2022/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.mjs +0 -213
- package/esm2022/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.mjs +0 -36
- package/esm2022/lib/components/public-survey-form/public-survey-form.component.mjs +0 -256
- package/esm2022/lib/components/survey-form-question/survey-form-question.component.mjs +0 -133
- package/esm2022/lib/components/survey-form-section/survey-form-section.component.mjs +0 -36
- package/esm2022/lib/models/app-toc-analytics.model.mjs +0 -2
- package/esm2022/lib/models/app-toc.model.mjs +0 -38
- package/esm2022/lib/models/auto-complete.model.mjs +0 -2
- package/esm2022/lib/models/card-content.model.mjs +0 -13
- package/esm2022/lib/models/content-strip-with-tabs.model.mjs +0 -2
- package/esm2022/lib/models/discussion-forum.model.mjs +0 -14
- package/esm2022/lib/models/goal.model.mjs +0 -2
- package/esm2022/lib/models/meta-tag.model.mjs +0 -8
- package/esm2022/lib/models/playlist.model.mjs +0 -2
- package/esm2022/lib/models/profile-revamp.model.mjs +0 -2
- package/esm2022/lib/models/rating.model.mjs +0 -2
- package/esm2022/lib/models/user-profile.model.mjs +0 -21
- package/esm2022/lib/resolvers/app-toc-cios-resolver.service.mjs +0 -24
- package/esm2022/lib/resolvers/app-toc-cios-user-enroll-resolver.service.mjs +0 -24
- package/esm2022/lib/resolvers/app-toc-content-read-resolver.service.mjs +0 -60
- package/esm2022/lib/resolvers/app-toc-ext-public-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/app-toc-resolver.service.mjs +0 -106
- package/esm2022/lib/resolvers/config-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/profile-resolver.service.mjs +0 -25
- package/esm2022/lib/resolvers/restricted-features-resolver.service.mjs +0 -25
- package/esm2022/lib/routes/app-toc-home/app-toc-home.component.mjs +0 -51
- package/esm2022/lib/routes/app-toc-home/app-toc-home.directive.mjs +0 -16
- package/esm2022/lib/routes/app-toc-home/app-toc-home.service.mjs +0 -18
- package/esm2022/lib/services/access-control.service.mjs +0 -56
- package/esm2022/lib/services/action.service.mjs +0 -23
- package/esm2022/lib/services/app-toc-v2.service.mjs +0 -230
- package/esm2022/lib/services/app-toc.service.mjs +0 -1300
- package/esm2022/lib/services/certificate.service.mjs +0 -69
- package/esm2022/lib/services/discuss-utils.service.mjs +0 -58
- package/esm2022/lib/services/editor.service.mjs +0 -34
- package/esm2022/lib/services/load-check.service.mjs +0 -21
- package/esm2022/lib/services/loader.service.mjs +0 -33
- package/esm2022/lib/services/mobile-apps.service.mjs +0 -67
- package/esm2022/lib/services/netcore.service.mjs +0 -56
- package/esm2022/lib/services/nps-grid.service.mjs +0 -31
- package/esm2022/lib/services/otp.service.mjs +0 -43
- package/esm2022/lib/services/profile-v2.service.mjs +0 -43
- package/esm2022/lib/services/reset-ratings.service.mjs +0 -19
- package/esm2022/lib/services/resource-download-helper.service.mjs +0 -64
- package/esm2022/lib/services/timer.service.mjs +0 -23
- package/esm2022/lib/services/title-tag.service.mjs +0 -71
- package/esm2022/lib/services/user-profile.service.mjs +0 -55
- package/esm2022/lib/services/viewer-data.service.mjs +0 -64
- package/esm2022/lib/services/viewer-util.service.mjs +0 -500
- package/esm2022/lib/share-toc/share-toc/share-toc.component.mjs +0 -291
- package/esm2022/lib/share-toc/share-toc.module.mjs +0 -119
- package/esm2022/public-api.mjs +0 -70
- package/esm2022/sunbird-cb-toc.mjs +0 -5
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts +0 -17
- package/lib/_collection/_common/attendance-card/attendance-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts +0 -32
- package/lib/_collection/_common/attendance-card/attendance-card.module.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts +0 -16
- package/lib/_collection/_common/attendance-helper/attendance-helper.component.d.ts.map +0 -1
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts +0 -21
- package/lib/_collection/_common/attendance-helper/attendance-helper.module.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts +0 -23
- package/lib/_collection/_common/avatar-photo/avatar-photo.component.d.ts.map +0 -1
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts +0 -16
- package/lib/_collection/_common/avatar-photo/avatar-photo.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts +0 -23
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts +0 -23
- package/lib/_collection/_common/certificate-dialog/certificate-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts +0 -10
- package/lib/_collection/_common/certificate-dialog/svg-to-pdf.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts +0 -12
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts +0 -13
- package/lib/_collection/_common/confirm-dialog/confirm-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts +0 -19
- package/lib/_collection/_common/connection-hover-card/connection-hover-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts +0 -15
- package/lib/_collection/_common/connection-hover-card/connection-hover.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts +0 -12
- package/lib/_collection/_common/connection-hover-card/connection-hover.servive.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts +0 -18
- package/lib/_collection/_common/connection-name/connection-name.component.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts +0 -15
- package/lib/_collection/_common/connection-name/connection-name.module.d.ts.map +0 -1
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts +0 -200
- package/lib/_collection/_common/connection-name/profile-v2.model.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts +0 -17
- package/lib/_collection/_common/content-progress/content-progress.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts +0 -11
- package/lib/_collection/_common/content-progress/content-progress.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts +0 -39
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts +0 -20
- package/lib/_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts +0 -12
- package/lib/_collection/_common/content-toc/ai-tutor-confirm-popup/ai-tutor-confirm-popup.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts +0 -184
- package/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts +0 -42
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewer/app-toc-assignment-viewer.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts +0 -55
- package/lib/_collection/_common/content-toc/app-toc-assignment-viewerV2/app-toc-assignment-viewerV2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts +0 -48
- package/lib/_collection/_common/content-toc/app-toc-batch-assignments/app-toc-batch-assignments.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts +0 -49
- package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +0 -136
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts +0 -9
- package/lib/_collection/_common/content-toc/app-toc-content-card-v2-skeleton/app-toc-content-card-v2-skeleton.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts +0 -17
- package/lib/_collection/_common/content-toc/app-toc-reference-notes/app-toc-reference-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts +0 -41
- package/lib/_collection/_common/content-toc/app-toc-session-card-new/app-toc-session-card-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts +0 -22
- package/lib/_collection/_common/content-toc/app-toc-sessions-new/app-toc-sessions-new.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts +0 -46
- package/lib/_collection/_common/content-toc/app-toc-teachers-notes/app-toc-teachers-notes.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts +0 -11
- package/lib/_collection/_common/content-toc/content-services/handle-claim.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts +0 -11
- package/lib/_collection/_common/content-toc/content-services/review-component-data.service.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts +0 -129
- package/lib/_collection/_common/content-toc/content-toc.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts +0 -52
- package/lib/_collection/_common/content-toc/content-toc.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts +0 -30
- package/lib/_collection/_common/content-toc/karma-points/karma-points.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts +0 -10
- package/lib/_collection/_common/content-toc/karma-points/karma-points.module.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts +0 -8
- package/lib/_collection/_common/content-toc/pipes/replace-nbsp.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts +0 -8
- package/lib/_collection/_common/content-toc/pipes/truncate.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts +0 -29
- package/lib/_collection/_common/content-toc/reviews-content/reviews-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts +0 -25
- package/lib/_collection/_common/content-toc/samuhik-charcha-content/samuhik-charcha-content/samuhik-charcha-content.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts +0 -15
- package/lib/_collection/_common/display-content-type/display-content-type.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts +0 -10
- package/lib/_collection/_common/display-content-type/display-content-type.module.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts +0 -13
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.component.d.ts.map +0 -1
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts +0 -11
- package/lib/_collection/_common/display-content-type-icon/display-content-type-icon.module.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts +0 -23
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.component.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts +0 -9
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.model.d.ts.map +0 -1
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts +0 -19
- package/lib/_collection/_common/mark-as-complete/mark-as-complete.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts +0 -9
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.module.d.ts.map +0 -1
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts +0 -17
- package/lib/_collection/_common/pipe-content-route/pipe-content-route.pipe.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts +0 -36
- package/lib/_collection/_common/player-brief/player-brief.component.d.ts.map +0 -1
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts +0 -20
- package/lib/_collection/_common/player-brief/player-brief.module.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts +0 -15
- package/lib/_collection/_common/rating-summary/rating-summary.component.d.ts.map +0 -1
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts +0 -14
- package/lib/_collection/_common/rating-summary/rating-summary.module.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts +0 -12
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.component.d.ts.map +0 -1
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts +0 -12
- package/lib/_collection/_common/skeleton-loader/skeleton-loader.module.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts +0 -16
- package/lib/_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component.d.ts.map +0 -1
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts +0 -11
- package/lib/_collection/_common/tips-for-learner/tips-for-learner.module.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts +0 -17
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.component.d.ts.map +0 -1
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts +0 -12
- package/lib/_collection/_common/toc-kpi-values/toc-kpi-values.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts +0 -35
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts +0 -18
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.model.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts +0 -16
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts +0 -16
- package/lib/_collection/_common/user-autocomplete/user-autocomplete.service.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts +0 -22
- package/lib/_collection/_common/user-content-rating/user-content-rating.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts +0 -13
- package/lib/_collection/_common/user-content-rating/user-content-rating.module.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.component.d.ts +0 -22
- package/lib/_collection/_common/user-image/user-image.component.d.ts.map +0 -1
- package/lib/_collection/_common/user-image/user-image.module.d.ts +0 -10
- package/lib/_collection/_common/user-image/user-image.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts +0 -48
- package/lib/_collection/btn-page-back/btn-page-back.component.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts +0 -15
- package/lib/_collection/btn-page-back/btn-page-back.module.d.ts.map +0 -1
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts +0 -23
- package/lib/_collection/btn-page-back/btn-page-back.service.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts +0 -20
- package/lib/_collection/card-rating-comment/card-rating-comment.component.d.ts.map +0 -1
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts +0 -16
- package/lib/_collection/card-rating-comment/card-rating-comment.module.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts +0 -26
- package/lib/_collection/sliders-dynamic/sliders-dynamic.component.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts +0 -22
- package/lib/_collection/sliders-dynamic/sliders-dynamic.model.d.ts.map +0 -1
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts +0 -19
- package/lib/_collection/sliders-dynamic/sliders-dynamic.module.d.ts.map +0 -1
- package/lib/_collection-api.d.ts +0 -35
- package/lib/_collection-api.d.ts.map +0 -1
- package/lib/_constants/widget-content.constants.d.ts +0 -8
- package/lib/_constants/widget-content.constants.d.ts.map +0 -1
- package/lib/_directives/tooltip.directive.d.ts +0 -18
- package/lib/_directives/tooltip.directive.d.ts.map +0 -1
- package/lib/_models/common.model.d.ts +0 -4
- package/lib/_models/common.model.d.ts.map +0 -1
- package/lib/_models/error.model.d.ts +0 -6
- package/lib/_models/error.model.d.ts.map +0 -1
- package/lib/_pipes/highlight.pipe.d.ts +0 -11
- package/lib/_pipes/highlight.pipe.d.ts.map +0 -1
- package/lib/_services/rating.service.d.ts +0 -19
- package/lib/_services/rating.service.d.ts.map +0 -1
- package/lib/_services/samuhik-charcha.service.d.ts +0 -14
- package/lib/_services/samuhik-charcha.service.d.ts.map +0 -1
- package/lib/_services/viewer-route-util.d.ts +0 -9
- package/lib/_services/viewer-route-util.d.ts.map +0 -1
- package/lib/_services/widget-content.model.d.ts +0 -516
- package/lib/_services/widget-content.model.d.ts.map +0 -1
- package/lib/_services/widget-content.service.d.ts +0 -102
- package/lib/_services/widget-content.service.d.ts.map +0 -1
- package/lib/_shared/translate-loader.factory.d.ts +0 -8
- package/lib/_shared/translate-loader.factory.d.ts.map +0 -1
- package/lib/app-toc-lib.module.d.ts +0 -89
- package/lib/app-toc-lib.module.d.ts.map +0 -1
- package/lib/collection.config.d.ts +0 -160
- package/lib/collection.config.d.ts.map +0 -1
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts +0 -18
- package/lib/components/app-toc-analytics-tiles/app-toc-analytics-tiles.component.d.ts.map +0 -1
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts +0 -226
- package/lib/components/app-toc-banner/app-toc-banner.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts +0 -79
- package/lib/components/app-toc-cios-home/app-toc-cios-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts +0 -23
- package/lib/components/app-toc-cios-home/consent-dialog.component.d.ts.map +0 -1
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts +0 -32
- package/lib/components/app-toc-cohorts/app-toc-cohorts.component.d.ts.map +0 -1
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts +0 -48
- package/lib/components/app-toc-content-card/app-toc-content-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts +0 -15
- package/lib/components/app-toc-dialog-intro-video/app-toc-dialog-intro-video.component.d.ts.map +0 -1
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts +0 -22
- package/lib/components/app-toc-discussion/app-toc-discussion.component.d.ts.map +0 -1
- package/lib/components/app-toc-home/app-toc-home.component.d.ts +0 -315
- package/lib/components/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +0 -392
- package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +0 -1
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts +0 -48
- package/lib/components/app-toc-overview/app-toc-overview.component.d.ts.map +0 -1
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts +0 -23
- package/lib/components/app-toc-session-card/app-toc-session-card.component.d.ts.map +0 -1
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts +0 -15
- package/lib/components/app-toc-sessions/app-toc-sessions.component.d.ts.map +0 -1
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts +0 -150
- package/lib/components/app-toc-single-page/app-toc-single-page.component.d.ts.map +0 -1
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts +0 -43
- package/lib/components/completion-survey-form/completion-survey-form.component.d.ts.map +0 -1
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts +0 -28
- package/lib/components/create-batch-dialog/create-batch-dialog.component.d.ts.map +0 -1
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts +0 -16
- package/lib/components/enroll-language-dialogue/enroll-language-dialogue.component.d.ts.map +0 -1
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts +0 -196
- package/lib/components/enroll-profile-form/enroll-profile-form.component.d.ts.map +0 -1
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts +0 -45
- package/lib/components/enroll-questionnaire/enroll-questionnaire.component.d.ts.map +0 -1
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts +0 -55
- package/lib/components/knowledge-artifact-details/knowledge-artifact-details.component.d.ts.map +0 -1
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts +0 -19
- package/lib/components/non-relevent-feedback-dialog/non-relevent-feedback-dialog.component.d.ts.map +0 -1
- package/lib/components/public-survey-form/public-survey-form.component.d.ts +0 -44
- package/lib/components/public-survey-form/public-survey-form.component.d.ts.map +0 -1
- package/lib/components/survey-form-question/survey-form-question.component.d.ts +0 -21
- package/lib/components/survey-form-question/survey-form-question.component.d.ts.map +0 -1
- package/lib/components/survey-form-section/survey-form-section.component.d.ts +0 -14
- package/lib/components/survey-form-section/survey-form-section.component.d.ts.map +0 -1
- package/lib/models/app-toc-analytics.model.d.ts +0 -153
- package/lib/models/app-toc-analytics.model.d.ts.map +0 -1
- package/lib/models/app-toc.model.d.ts +0 -85
- package/lib/models/app-toc.model.d.ts.map +0 -1
- package/lib/models/auto-complete.model.d.ts +0 -28
- package/lib/models/auto-complete.model.d.ts.map +0 -1
- package/lib/models/card-content.model.d.ts +0 -20
- package/lib/models/card-content.model.d.ts.map +0 -1
- package/lib/models/content-strip-with-tabs.model.d.ts +0 -45
- package/lib/models/content-strip-with-tabs.model.d.ts.map +0 -1
- package/lib/models/discussion-forum.model.d.ts +0 -41
- package/lib/models/discussion-forum.model.d.ts.map +0 -1
- package/lib/models/goal.model.d.ts +0 -23
- package/lib/models/goal.model.d.ts.map +0 -1
- package/lib/models/meta-tag.model.d.ts +0 -7
- package/lib/models/meta-tag.model.d.ts.map +0 -1
- package/lib/models/playlist.model.d.ts +0 -24
- package/lib/models/playlist.model.d.ts.map +0 -1
- package/lib/models/profile-revamp.model.d.ts +0 -15
- package/lib/models/profile-revamp.model.d.ts.map +0 -1
- package/lib/models/rating.model.d.ts +0 -18
- package/lib/models/rating.model.d.ts.map +0 -1
- package/lib/models/user-profile.model.d.ts +0 -38
- package/lib/models/user-profile.model.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts +0 -13
- package/lib/resolvers/app-toc-cios-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts +0 -13
- package/lib/resolvers/app-toc-cios-user-enroll-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts +0 -17
- package/lib/resolvers/app-toc-content-read-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts +0 -13
- package/lib/resolvers/app-toc-ext-public-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/app-toc-resolver.service.d.ts +0 -17
- package/lib/resolvers/app-toc-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/config-resolver.service.d.ts +0 -12
- package/lib/resolvers/config-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/profile-resolver.service.d.ts +0 -12
- package/lib/resolvers/profile-resolver.service.d.ts.map +0 -1
- package/lib/resolvers/restricted-features-resolver.service.d.ts +0 -12
- package/lib/resolvers/restricted-features-resolver.service.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts +0 -20
- package/lib/routes/app-toc-home/app-toc-home.component.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts +0 -9
- package/lib/routes/app-toc-home/app-toc-home.directive.d.ts.map +0 -1
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts +0 -9
- package/lib/routes/app-toc-home/app-toc-home.service.d.ts.map +0 -1
- package/lib/services/access-control.service.d.ts +0 -30
- package/lib/services/access-control.service.d.ts.map +0 -1
- package/lib/services/action.service.d.ts +0 -10
- package/lib/services/action.service.d.ts.map +0 -1
- package/lib/services/app-toc-v2.service.d.ts +0 -15
- package/lib/services/app-toc-v2.service.d.ts.map +0 -1
- package/lib/services/app-toc.service.d.ts +0 -162
- package/lib/services/app-toc.service.d.ts.map +0 -1
- package/lib/services/certificate.service.d.ts +0 -43
- package/lib/services/certificate.service.d.ts.map +0 -1
- package/lib/services/discuss-utils.service.d.ts +0 -34
- package/lib/services/discuss-utils.service.d.ts.map +0 -1
- package/lib/services/editor.service.d.ts +0 -18
- package/lib/services/editor.service.d.ts.map +0 -1
- package/lib/services/load-check.service.d.ts +0 -9
- package/lib/services/load-check.service.d.ts.map +0 -1
- package/lib/services/loader.service.d.ts +0 -17
- package/lib/services/loader.service.d.ts.map +0 -1
- package/lib/services/mobile-apps.service.d.ts +0 -39
- package/lib/services/mobile-apps.service.d.ts.map +0 -1
- package/lib/services/netcore.service.d.ts +0 -34
- package/lib/services/netcore.service.d.ts.map +0 -1
- package/lib/services/nps-grid.service.d.ts +0 -16
- package/lib/services/nps-grid.service.d.ts.map +0 -1
- package/lib/services/otp.service.d.ts +0 -21
- package/lib/services/otp.service.d.ts.map +0 -1
- package/lib/services/profile-v2.service.d.ts +0 -21
- package/lib/services/profile-v2.service.d.ts.map +0 -1
- package/lib/services/reset-ratings.service.d.ts +0 -9
- package/lib/services/reset-ratings.service.d.ts.map +0 -1
- package/lib/services/resource-download-helper.service.d.ts +0 -30
- package/lib/services/resource-download-helper.service.d.ts.map +0 -1
- package/lib/services/timer.service.d.ts +0 -10
- package/lib/services/timer.service.d.ts.map +0 -1
- package/lib/services/title-tag.service.d.ts +0 -22
- package/lib/services/title-tag.service.d.ts.map +0 -1
- package/lib/services/user-profile.service.d.ts +0 -25
- package/lib/services/user-profile.service.d.ts.map +0 -1
- package/lib/services/viewer-data.service.d.ts +0 -59
- package/lib/services/viewer-data.service.d.ts.map +0 -1
- package/lib/services/viewer-util.service.d.ts +0 -63
- package/lib/services/viewer-util.service.d.ts.map +0 -1
- package/lib/share-toc/share-toc/share-toc.component.d.ts +0 -57
- package/lib/share-toc/share-toc/share-toc.component.d.ts.map +0 -1
- package/lib/share-toc/share-toc.module.d.ts +0 -33
- package/lib/share-toc/share-toc.module.d.ts.map +0 -1
- package/public-api.d.ts +0 -56
- package/public-api.d.ts.map +0 -1
- package/sunbird-cb-toc.d.ts.map +0 -1
|
@@ -1,2836 +0,0 @@
|
|
|
1
|
-
import { Component, HostListener, ViewChild, ViewEncapsulation, Input, Inject, } from '@angular/core';
|
|
2
|
-
import { NavigationEnd } from '@angular/router';
|
|
3
|
-
import { UntypedFormControl, Validators } from '@angular/forms';
|
|
4
|
-
import { Subject, of, from } from 'rxjs';
|
|
5
|
-
import { catchError, share, switchMap, takeUntil } from 'rxjs/operators';
|
|
6
|
-
import dayjs from 'dayjs';
|
|
7
|
-
// tslint:disable-next-line
|
|
8
|
-
import _ from 'lodash';
|
|
9
|
-
import moment from 'moment';
|
|
10
|
-
import isSameOrBefore from 'dayjs/plugin/isSameOrBefore';
|
|
11
|
-
import { NsContent } from '../../_services/widget-content.model';
|
|
12
|
-
import { viewerRouteGenerator } from '../../_services/viewer-route-util';
|
|
13
|
-
import { WsEvents, } from '@sunbird-cb/utils-v2';
|
|
14
|
-
import { ConfirmationDialogComponent, TOCMultiLingualDialogComponent } from '@sunbird-cb/consumption';
|
|
15
|
-
import { NsAppToc } from '../../models/app-toc.model';
|
|
16
|
-
import { AppTocDialogIntroVideoComponent } from '../app-toc-dialog-intro-video/app-toc-dialog-intro-video.component';
|
|
17
|
-
import { ContentRatingV2DialogComponent } from '../../_collection/_common/content-rating-v2-dialog/content-rating-v2-dialog.component';
|
|
18
|
-
import { EnrollLanguageDialogueComponent } from '../enroll-language-dialogue/enroll-language-dialogue.component';
|
|
19
|
-
import { CompletionSurveyFormComponent } from '../completion-survey-form/completion-survey-form.component';
|
|
20
|
-
import { PublicSurveyFormComponent } from '../public-survey-form/public-survey-form.component';
|
|
21
|
-
import { NsCardContent } from '../../models/card-content.model';
|
|
22
|
-
import { NonReleventFeedbackDialogComponent } from '../non-relevent-feedback-dialog/non-relevent-feedback-dialog.component';
|
|
23
|
-
import * as i0 from "@angular/core";
|
|
24
|
-
import * as i1 from "@angular/router";
|
|
25
|
-
import * as i2 from "../../_services/widget-content.service";
|
|
26
|
-
import * as i3 from "../../services/app-toc.service";
|
|
27
|
-
import * as i4 from "@sunbird-cb/utils-v2";
|
|
28
|
-
import * as i5 from "@angular/platform-browser";
|
|
29
|
-
import * as i6 from "@angular/material/legacy-snack-bar";
|
|
30
|
-
import * as i7 from "@angular/material/legacy-dialog";
|
|
31
|
-
import * as i8 from "../../services/mobile-apps.service";
|
|
32
|
-
import * as i9 from "@sunbird-cb/consumption";
|
|
33
|
-
import * as i10 from "../../services/action.service";
|
|
34
|
-
import * as i11 from "../../services/viewer-util.service";
|
|
35
|
-
import * as i12 from "../../_services/rating.service";
|
|
36
|
-
import * as i13 from "@ngx-translate/core";
|
|
37
|
-
import * as i14 from "../../services/load-check.service";
|
|
38
|
-
import * as i15 from "../../_collection/_common/content-toc/content-services/handle-claim.service";
|
|
39
|
-
import * as i16 from "../../services/reset-ratings.service";
|
|
40
|
-
import * as i17 from "../../services/timer.service";
|
|
41
|
-
import * as i18 from "@angular/material/snack-bar";
|
|
42
|
-
import * as i19 from "../../services/netcore.service";
|
|
43
|
-
import * as i20 from "../../services/app-toc-v2.service";
|
|
44
|
-
import * as i21 from "@angular/common";
|
|
45
|
-
import * as i22 from "@angular/material/icon";
|
|
46
|
-
import * as i23 from "@angular/material/legacy-button";
|
|
47
|
-
import * as i24 from "@angular/material/legacy-menu";
|
|
48
|
-
import * as i25 from "@angular/material/legacy-chips";
|
|
49
|
-
import * as i26 from "@angular/material/legacy-radio";
|
|
50
|
-
import * as i27 from "../../_collection/_common/skeleton-loader/skeleton-loader.component";
|
|
51
|
-
import * as i28 from "../../_collection/_common/content-progress/content-progress.component";
|
|
52
|
-
import * as i29 from "../../_collection/_common/avatar-photo/avatar-photo.component";
|
|
53
|
-
import * as i30 from "../../_collection/_common/content-toc/content-toc.component";
|
|
54
|
-
import * as i31 from "../../share-toc/share-toc/share-toc.component";
|
|
55
|
-
import * as i32 from "../../_collection/_common/toc-kpi-values/toc-kpi-values.component";
|
|
56
|
-
import * as i33 from "../../_collection/_common/content-toc/karma-points/karma-points.component";
|
|
57
|
-
import * as i34 from "../../_collection/_common/tips-for-learner/tips-for-learner-card/tips-for-learner-card.component";
|
|
58
|
-
import * as i35 from "../app-toc-banner/app-toc-banner.component";
|
|
59
|
-
dayjs.extend(isSameOrBefore);
|
|
60
|
-
export var ErrorType;
|
|
61
|
-
(function (ErrorType) {
|
|
62
|
-
ErrorType["internalServer"] = "internalServer";
|
|
63
|
-
ErrorType["serviceUnavailable"] = "serviceUnavailable";
|
|
64
|
-
ErrorType["somethingWrong"] = "somethingWrong";
|
|
65
|
-
})(ErrorType || (ErrorType = {}));
|
|
66
|
-
const flattenItems = (items, key) => {
|
|
67
|
-
return items.reduce((flattenedItems, item) => {
|
|
68
|
-
flattenedItems.push(item);
|
|
69
|
-
if (Array.isArray(item[key])) {
|
|
70
|
-
// tslint:disable-next-line
|
|
71
|
-
flattenedItems = flattenedItems.concat(flattenItems(item[key], key));
|
|
72
|
-
}
|
|
73
|
-
return flattenedItems;
|
|
74
|
-
// tslint:disable-next-line
|
|
75
|
-
}, []);
|
|
76
|
-
};
|
|
77
|
-
const SNACKBAR_DURATION = 3000;
|
|
78
|
-
export class AppTocHomeV2Component {
|
|
79
|
-
handleScroll() {
|
|
80
|
-
const windowScroll = window.pageYOffset;
|
|
81
|
-
if (windowScroll >= this.elementPosition - 100) {
|
|
82
|
-
this.sticky = true;
|
|
83
|
-
}
|
|
84
|
-
else {
|
|
85
|
-
this.sticky = false;
|
|
86
|
-
}
|
|
87
|
-
if (this.scrollLimit) {
|
|
88
|
-
if ((window.scrollY + this.rcElem.BottomPos) >= this.scrollLimit) {
|
|
89
|
-
this.rcElement.nativeElement.style.position = 'sticky';
|
|
90
|
-
}
|
|
91
|
-
else {
|
|
92
|
-
if (this.rcElement) {
|
|
93
|
-
this.rcElement.nativeElement.style.position = 'fixed';
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
// 236... (OffsetTop of right container + 104)
|
|
98
|
-
if (window.scrollY > (this.rcElem.offSetTop + 104)) {
|
|
99
|
-
this.scrolled = true;
|
|
100
|
-
}
|
|
101
|
-
else {
|
|
102
|
-
this.scrolled = false;
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
constructor(route, router, contentSvc, tocSvc, loggerSvc, configSvc, domSanitizer, snackBar, dialog, mobileAppsSvc, utilitySvc,
|
|
106
|
-
// private progressSvc: ContentProgressService,
|
|
107
|
-
contentLangSvc, actionSVC, viewerSvc, ratingSvc, telemetryService, translate, langtranslations, events,
|
|
108
|
-
// private matSnackBar: MatSnackBar,
|
|
109
|
-
loadCheckService, handleClaimService, resetRatingsService, timerService, enrollSvc, contentLibSvc, dataTransferSvc, matSnackbarNew, userServiceLib, netCoreService, appTocV2Svc, environment) {
|
|
110
|
-
this.route = route;
|
|
111
|
-
this.router = router;
|
|
112
|
-
this.contentSvc = contentSvc;
|
|
113
|
-
this.tocSvc = tocSvc;
|
|
114
|
-
this.loggerSvc = loggerSvc;
|
|
115
|
-
this.configSvc = configSvc;
|
|
116
|
-
this.domSanitizer = domSanitizer;
|
|
117
|
-
this.snackBar = snackBar;
|
|
118
|
-
this.dialog = dialog;
|
|
119
|
-
this.mobileAppsSvc = mobileAppsSvc;
|
|
120
|
-
this.utilitySvc = utilitySvc;
|
|
121
|
-
this.contentLangSvc = contentLangSvc;
|
|
122
|
-
this.actionSVC = actionSVC;
|
|
123
|
-
this.viewerSvc = viewerSvc;
|
|
124
|
-
this.ratingSvc = ratingSvc;
|
|
125
|
-
this.telemetryService = telemetryService;
|
|
126
|
-
this.translate = translate;
|
|
127
|
-
this.langtranslations = langtranslations;
|
|
128
|
-
this.events = events;
|
|
129
|
-
this.loadCheckService = loadCheckService;
|
|
130
|
-
this.handleClaimService = handleClaimService;
|
|
131
|
-
this.resetRatingsService = resetRatingsService;
|
|
132
|
-
this.timerService = timerService;
|
|
133
|
-
this.enrollSvc = enrollSvc;
|
|
134
|
-
this.contentLibSvc = contentLibSvc;
|
|
135
|
-
this.dataTransferSvc = dataTransferSvc;
|
|
136
|
-
this.matSnackbarNew = matSnackbarNew;
|
|
137
|
-
this.userServiceLib = userServiceLib;
|
|
138
|
-
this.netCoreService = netCoreService;
|
|
139
|
-
this.appTocV2Svc = appTocV2Svc;
|
|
140
|
-
this.environment = environment;
|
|
141
|
-
this.queryParamsData = {}; // Initialize queryParamsData
|
|
142
|
-
this.show = false;
|
|
143
|
-
this.changeTab = false;
|
|
144
|
-
this.skeletonLoader = true;
|
|
145
|
-
this.banners = null;
|
|
146
|
-
this.showMoreGlance = false;
|
|
147
|
-
this.content = null;
|
|
148
|
-
this.contentReadData = null;
|
|
149
|
-
this.baseContentReadData = null;
|
|
150
|
-
this.errorCode = null;
|
|
151
|
-
this.resumeData = null;
|
|
152
|
-
this.nsCardContentData = NsCardContent.ACBPConst;
|
|
153
|
-
this.batchData = null;
|
|
154
|
-
this.currentCourseBatchId = null;
|
|
155
|
-
this.routeSubscription = null;
|
|
156
|
-
this.pageNavbar = this.configSvc.pageNavBar;
|
|
157
|
-
this.isCohortsRestricted = false;
|
|
158
|
-
this.sticky = false;
|
|
159
|
-
this.isInIframe = false;
|
|
160
|
-
this.forPreview = window.location.href.includes('/public/') || window.location.href.includes('/author/');
|
|
161
|
-
// forPreview = window.location.href.includes('/author/')
|
|
162
|
-
this.analytics = this.route.snapshot.data.pageData.data?.analytics;
|
|
163
|
-
this.errorWidgetData = {
|
|
164
|
-
widgetType: 'errorResolver',
|
|
165
|
-
widgetSubType: 'errorResolver',
|
|
166
|
-
widgetData: {
|
|
167
|
-
errorType: 'internalServer',
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
this.isAuthor = false;
|
|
171
|
-
this.authorBtnWidget = {
|
|
172
|
-
actionBtnId: 'feature_authoring',
|
|
173
|
-
config: {
|
|
174
|
-
type: 'mat-button',
|
|
175
|
-
},
|
|
176
|
-
};
|
|
177
|
-
this.tocConfig = null;
|
|
178
|
-
this.primaryCategory = NsContent.EPrimaryCategory;
|
|
179
|
-
this.courseCategory = NsContent.ECourseCategory;
|
|
180
|
-
this.WFBlendedProgramStatus = NsContent.WFBlendedProgramStatus;
|
|
181
|
-
this.askAuthorEnabled = true;
|
|
182
|
-
this.trainingLHubEnabled = false;
|
|
183
|
-
this.body = null;
|
|
184
|
-
this.viewMoreRelatedTopics = false;
|
|
185
|
-
this.hasTocStructure = false;
|
|
186
|
-
this.tocStructure = null;
|
|
187
|
-
this.contentParents = {};
|
|
188
|
-
this.objKeys = Object.keys;
|
|
189
|
-
this.activeFragment = this.route.fragment.pipe(share());
|
|
190
|
-
this.currentFragment = 'overview';
|
|
191
|
-
this.showScrollHeight = 300;
|
|
192
|
-
this.hideScrollHeight = 10;
|
|
193
|
-
this.batchSubscription = null;
|
|
194
|
-
this.batchDataSubscription = null;
|
|
195
|
-
this.resumeDataSubscription = null;
|
|
196
|
-
this.translationSubscription = null;
|
|
197
|
-
this.batchControl = new UntypedFormControl('', Validators.required);
|
|
198
|
-
this.contentProgress = 0;
|
|
199
|
-
this.bannerUrl = null;
|
|
200
|
-
this.routePath = 'overview';
|
|
201
|
-
this.validPaths = new Set(['overview', 'contents', 'analytics']);
|
|
202
|
-
this.routerParamSubscription = null;
|
|
203
|
-
this.actionBtnStatus = 'wait';
|
|
204
|
-
this.isRegistrationSupported = false;
|
|
205
|
-
this.showIntranetMessage = false;
|
|
206
|
-
this.firstResourceLink = null;
|
|
207
|
-
this.resumeDataLink = null;
|
|
208
|
-
this.certData = null;
|
|
209
|
-
this.showTakeAssessment = null;
|
|
210
|
-
this.checkRegistrationSources = new Set([
|
|
211
|
-
'SkillSoft Digitalization',
|
|
212
|
-
'SkillSoft Leadership',
|
|
213
|
-
'Pluralsight',
|
|
214
|
-
]);
|
|
215
|
-
this.externalContentFetchStatus = 'done';
|
|
216
|
-
this.registerForExternal = false;
|
|
217
|
-
this.isGoalsEnabled = false;
|
|
218
|
-
this.defaultSLogo = '';
|
|
219
|
-
this.disableEnrollBtn = false;
|
|
220
|
-
this.isAssessVisible = false;
|
|
221
|
-
this.isPracticeVisible = false;
|
|
222
|
-
this.certificateOpen = false;
|
|
223
|
-
this.courseCompleteState = 2;
|
|
224
|
-
this.dakshtaName = this.environment.dakshtaName;
|
|
225
|
-
this.cscmsUrl = this.environment.cscmsUrl;
|
|
226
|
-
this.showBtn = false;
|
|
227
|
-
this.kparray = [];
|
|
228
|
-
this.enrollBtnLoading = false;
|
|
229
|
-
this.isAcbpCourse = false;
|
|
230
|
-
this.isAcbpClaim = false;
|
|
231
|
-
this.isClaimed = false;
|
|
232
|
-
this.monthlyCapExceed = false;
|
|
233
|
-
this.isCompletedThisMonth = false;
|
|
234
|
-
this.sourceEllipsis = false;
|
|
235
|
-
this.scrollLimit = 0;
|
|
236
|
-
this.rcElem = {
|
|
237
|
-
offSetTop: 0,
|
|
238
|
-
BottomPos: 0,
|
|
239
|
-
};
|
|
240
|
-
this.scrolled = false;
|
|
241
|
-
this.pathSet = new Set();
|
|
242
|
-
this.canShare = false;
|
|
243
|
-
this.enableShare = false;
|
|
244
|
-
this.contentCreatorData = [];
|
|
245
|
-
// randomlearnAdvisoryObj: any
|
|
246
|
-
// learnAdvisoryDataLength: any
|
|
247
|
-
this.destroySubject$ = new Subject();
|
|
248
|
-
this.isReleventBtnHovered = false;
|
|
249
|
-
this.SAKSHAMAI_ICON_NORMAL = '/assets/images/sakshamAI/ai-icon.svg';
|
|
250
|
-
this.SAKSHAMAI_ICON_LOADER = '/assets/images/sakshamAI/saksham_ai_loader.gif';
|
|
251
|
-
this.recommendedCoursesId = '';
|
|
252
|
-
this.preAssessmentCompletionStatus = false;
|
|
253
|
-
this.fromAITutor = false;
|
|
254
|
-
this.languageList = [];
|
|
255
|
-
this.preAssessmentRequiredFlag = false;
|
|
256
|
-
this.lockCertificate = false;
|
|
257
|
-
this.historyData = history.state;
|
|
258
|
-
this.handleBreadcrumbs();
|
|
259
|
-
this.mobileAppsSvc.mobileTopHeaderVisibilityStatus.next(true);
|
|
260
|
-
if (localStorage.getItem('websiteLanguage')) {
|
|
261
|
-
this.translate.setDefaultLang('en');
|
|
262
|
-
const lang = localStorage.getItem('websiteLanguage');
|
|
263
|
-
this.translate.use(lang);
|
|
264
|
-
}
|
|
265
|
-
this.loadCheckService.childComponentLoaded$.subscribe(_isLoaded => {
|
|
266
|
-
// Present in app-toc-about.component
|
|
267
|
-
if (document.getElementById('ratingsDiv')) {
|
|
268
|
-
setTimeout(() => {
|
|
269
|
-
const ratingsDiv = document.getElementById('ratingsDiv');
|
|
270
|
-
if (ratingsDiv) {
|
|
271
|
-
this.scrollLimit = ratingsDiv.getBoundingClientRect().bottom;
|
|
272
|
-
}
|
|
273
|
-
}, 500);
|
|
274
|
-
}
|
|
275
|
-
if (document.getElementById('contentContainer')) {
|
|
276
|
-
const contentDiv = document.getElementById('contentContainer');
|
|
277
|
-
if (contentDiv) {
|
|
278
|
-
this.scrollLimit = contentDiv.getBoundingClientRect().bottom;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
});
|
|
282
|
-
this.handleClaimService.getClaimData().subscribe((_eventData) => {
|
|
283
|
-
this.onClickOfClaim(_eventData);
|
|
284
|
-
});
|
|
285
|
-
}
|
|
286
|
-
getKarmapointsLimit() {
|
|
287
|
-
if (!this.forPreview) {
|
|
288
|
-
this.contentSvc.userKarmaPoints().subscribe((res) => {
|
|
289
|
-
if (res && res.kpList) {
|
|
290
|
-
const info = res.kpList.addinfo;
|
|
291
|
-
if (info) {
|
|
292
|
-
this.monthlyCapExceed = JSON.parse(info).claimedNonACBPCourseKarmaQuota >= 4;
|
|
293
|
-
}
|
|
294
|
-
}
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
}
|
|
298
|
-
isCourseCompletedOnThisMonth() {
|
|
299
|
-
const now = moment(this.serverDate).format('YYYY-MM-DD');
|
|
300
|
-
if (this.content) {
|
|
301
|
-
const courseData = this.enrolledCourseData;
|
|
302
|
-
if (courseData && courseData.completionPercentage === 100 && courseData.completedOn) {
|
|
303
|
-
const completedOn = moment(courseData.completedOn).format('YYYY-MM-DD');
|
|
304
|
-
const completedMonth = moment(completedOn, 'YYYY-MM-DD').month();
|
|
305
|
-
const currentMonth = moment(now, 'YYYY-MM-DD').month();
|
|
306
|
-
this.isCompletedThisMonth = completedMonth === currentMonth;
|
|
307
|
-
this.content['viewMore'] = false;
|
|
308
|
-
this.content['completedOn'] = courseData.completedOn;
|
|
309
|
-
}
|
|
310
|
-
}
|
|
311
|
-
}
|
|
312
|
-
filteredAcbpList(res) {
|
|
313
|
-
return res.filter((v) => v.identifier === this.courseID);
|
|
314
|
-
}
|
|
315
|
-
findACPB() {
|
|
316
|
-
const localCbp = localStorage.getItem('cbpData');
|
|
317
|
-
if (localCbp) {
|
|
318
|
-
const storeageCbp = JSON.parse(localCbp);
|
|
319
|
-
const cbp = this.filteredAcbpList(storeageCbp);
|
|
320
|
-
if (cbp.length) {
|
|
321
|
-
const acbp = 'cbPlan';
|
|
322
|
-
this.cbPlanEndDate = cbp[0].endDate;
|
|
323
|
-
const sDate = dayjs(this.serverDate).format('YYYY-MM-DD');
|
|
324
|
-
const daysCount = dayjs(this.cbPlanEndDate).diff(this.serverDate, 'day');
|
|
325
|
-
this.cbPlanDuration = daysCount < 0 ? NsCardContent.ACBPConst.OVERDUE : daysCount > 29
|
|
326
|
-
? NsCardContent.ACBPConst.SUCCESS : NsCardContent.ACBPConst.UPCOMING;
|
|
327
|
-
if (acbp && this.cbPlanEndDate && acbp === 'cbPlan') {
|
|
328
|
-
this.isAcbpCourse = true;
|
|
329
|
-
const eDate = dayjs(this.cbPlanEndDate).format('YYYY-MM-DD');
|
|
330
|
-
if (dayjs(sDate).isSameOrBefore(eDate)) {
|
|
331
|
-
const requestObj = {
|
|
332
|
-
request: {
|
|
333
|
-
filters: {
|
|
334
|
-
contextType: 'Course',
|
|
335
|
-
contextId: this.courseID,
|
|
336
|
-
},
|
|
337
|
-
},
|
|
338
|
-
};
|
|
339
|
-
this.contentSvc.getCourseKarmaPoints(requestObj).subscribe((res) => {
|
|
340
|
-
if (res && res.kpList) {
|
|
341
|
-
const row = res.kpList;
|
|
342
|
-
if (row.addinfo) {
|
|
343
|
-
if (JSON.parse(row.addinfo).ACBP) {
|
|
344
|
-
this.isAcbpClaim = false;
|
|
345
|
-
this.isClaimed = true;
|
|
346
|
-
}
|
|
347
|
-
else {
|
|
348
|
-
this.isAcbpClaim = true;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
else {
|
|
352
|
-
this.isAcbpClaim = true;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
else {
|
|
356
|
-
this.isAcbpClaim = true;
|
|
357
|
-
}
|
|
358
|
-
});
|
|
359
|
-
}
|
|
360
|
-
}
|
|
361
|
-
}
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
raiseTelemeteryForProvider(providerName, prividerId) {
|
|
365
|
-
this.events.raiseInteractTelemetry({
|
|
366
|
-
type: 'click',
|
|
367
|
-
id: 'btn-provider',
|
|
368
|
-
}, {
|
|
369
|
-
id: providerName,
|
|
370
|
-
type: prividerId,
|
|
371
|
-
}, {
|
|
372
|
-
pageIdExt: 'btn-provider',
|
|
373
|
-
module: WsEvents.EnumTelemetrymodules.CONTENT,
|
|
374
|
-
});
|
|
375
|
-
}
|
|
376
|
-
raiseTelemetry() {
|
|
377
|
-
this.events.raiseInteractTelemetry({
|
|
378
|
-
type: 'click',
|
|
379
|
-
subType: 'karmapoints-claim',
|
|
380
|
-
id: this.courseID,
|
|
381
|
-
}, {
|
|
382
|
-
id: this.courseID,
|
|
383
|
-
type: 'course',
|
|
384
|
-
}, {
|
|
385
|
-
pageIdExt: 'btn-acbp-claim',
|
|
386
|
-
module: WsEvents.EnumTelemetrymodules.KARMAPOINTS,
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
onClickOfClaim(event) {
|
|
390
|
-
// tslint:disable:no-console
|
|
391
|
-
console.log(event);
|
|
392
|
-
const request = {
|
|
393
|
-
userId: this.configSvc.unMappedUser.identifier,
|
|
394
|
-
courseId: this.courseID,
|
|
395
|
-
};
|
|
396
|
-
this.raiseTelemetry();
|
|
397
|
-
this.contentSvc.claimKarmapoints(request).subscribe((res) => {
|
|
398
|
-
// tslint:disable:no-console
|
|
399
|
-
console.log(res);
|
|
400
|
-
this.isClaimed = true;
|
|
401
|
-
this.openSnackbar('Karma points are successfully claimed.');
|
|
402
|
-
// this.getUserEnrollmentList()
|
|
403
|
-
this.checkIfUserEnrolled();
|
|
404
|
-
}, (error) => {
|
|
405
|
-
// tslint:disable:no-console
|
|
406
|
-
console.log(error);
|
|
407
|
-
this.openSnackbar('something went wrong.');
|
|
408
|
-
});
|
|
409
|
-
}
|
|
410
|
-
ngAfterViewInit() {
|
|
411
|
-
if (this.rcElement) {
|
|
412
|
-
this.rcElem.BottomPos = this.rcElement.nativeElement.offsetTop + this.rcElement.nativeElement.offsetHeight;
|
|
413
|
-
this.rcElem.offSetTop = this.rcElement.nativeElement.offsetTop;
|
|
414
|
-
}
|
|
415
|
-
// Get Time for the batch
|
|
416
|
-
this.timerUnsubscribe = this.timerService.getTimerData()
|
|
417
|
-
.pipe(takeUntil(this.destroySubject$))
|
|
418
|
-
.subscribe((_timer) => {
|
|
419
|
-
this.timer = _timer;
|
|
420
|
-
});
|
|
421
|
-
}
|
|
422
|
-
handleBreadcrumbs() {
|
|
423
|
-
if (this.historyData) {
|
|
424
|
-
if (this.historyData.path === 'Search') {
|
|
425
|
-
const searchurl = `/app/globalsearch`;
|
|
426
|
-
const qParam = {
|
|
427
|
-
q: this.historyData.param,
|
|
428
|
-
};
|
|
429
|
-
// tslint:disable-next-line:max-line-length
|
|
430
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: 'Search', url: searchurl, queryParams: qParam }, { title: 'Details', url: 'none' }] };
|
|
431
|
-
}
|
|
432
|
-
else if (this.historyData.path === 'competency-details') {
|
|
433
|
-
const finalUrl = `/app/learn/browse-by/competency/${this.historyData.param}`;
|
|
434
|
-
// tslint:disable-next-line: max-line-length
|
|
435
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: this.historyData.param, url: finalUrl }, { title: 'Details', url: 'none' }] };
|
|
436
|
-
}
|
|
437
|
-
else if (this.historyData.path === 'all-CBP') {
|
|
438
|
-
const finalURL = `/app/learn/browse-by/provider/${this.historyData.param}`;
|
|
439
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: `all CBP's`, url: finalURL }, { title: 'Details', url: 'none' }] };
|
|
440
|
-
}
|
|
441
|
-
else if (this.historyData.path === 'all-competencies') {
|
|
442
|
-
const finalUrl = `/app/learn/browse-by/competency/all-competencies`;
|
|
443
|
-
// tslint:disable-next-line: max-line-length
|
|
444
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: 'all competencies', url: finalUrl }, { title: 'Details', url: 'none' }] };
|
|
445
|
-
}
|
|
446
|
-
else if (this.historyData.path === 'curatedCollections') {
|
|
447
|
-
const finalUrl = `/app/curatedCollections/home`;
|
|
448
|
-
// tslint:disable-next-line: max-line-length
|
|
449
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: 'curated collections', url: finalUrl }, { title: 'Details', url: 'none' }] };
|
|
450
|
-
}
|
|
451
|
-
else {
|
|
452
|
-
// tslint:disable-next-line:max-line-length
|
|
453
|
-
this.breadcrumbs = { url: 'home', titles: [{ title: 'Learn', url: '/page/learn', icon: 'school' }, { title: 'Details', url: 'none' }] };
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
ngAfterViewChecked() {
|
|
458
|
-
try {
|
|
459
|
-
if (this.fragment) {
|
|
460
|
-
// tslint:disable-next-line: no-non-null-assertion
|
|
461
|
-
document.querySelector(`#${this.fragment}`).scrollTo({
|
|
462
|
-
top: 80,
|
|
463
|
-
behavior: 'smooth',
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
}
|
|
467
|
-
catch (e) { }
|
|
468
|
-
}
|
|
469
|
-
get enableAnalytics() {
|
|
470
|
-
if (this.configSvc.restrictedFeatures) {
|
|
471
|
-
return !this.configSvc.restrictedFeatures.has('tocAnalytics');
|
|
472
|
-
}
|
|
473
|
-
return false;
|
|
474
|
-
}
|
|
475
|
-
get isResource() {
|
|
476
|
-
if (this.content) {
|
|
477
|
-
const isResource = this.content.primaryCategory === NsContent.EPrimaryCategory.KNOWLEDGE_ARTIFACT ||
|
|
478
|
-
this.content.primaryCategory === NsContent.EPrimaryCategory.RESOURCE
|
|
479
|
-
|| this.content.primaryCategory === NsContent.EPrimaryCategory.PRACTICE_RESOURCE
|
|
480
|
-
|| this.content.primaryCategory === NsContent.EPrimaryCategory.FINAL_ASSESSMENT
|
|
481
|
-
|| this.content.primaryCategory === NsContent.EPrimaryCategory.COMP_ASSESSMENT
|
|
482
|
-
|| this.content.primaryCategory === NsContent.EPrimaryCategory.OFFLINE_SESSION
|
|
483
|
-
|| !(this.content.children && this.content.children.length);
|
|
484
|
-
if (isResource) {
|
|
485
|
-
this.mobileAppsSvc.sendViewerData(this.content);
|
|
486
|
-
}
|
|
487
|
-
return isResource;
|
|
488
|
-
}
|
|
489
|
-
return false;
|
|
490
|
-
}
|
|
491
|
-
get getStartDate() {
|
|
492
|
-
if (this.enrolledCourseData) {
|
|
493
|
-
const now = new Date().getTime();
|
|
494
|
-
// const batch = _.first(_.filter(this.content['batches'], { batchId: this.currentCourseBatchId }) || [])
|
|
495
|
-
const batch = this.enrolledCourseData.batch;
|
|
496
|
-
this.currentCourseBatchId = batch.batchId;
|
|
497
|
-
if (batch && this.currentCourseBatchId) {
|
|
498
|
-
this.startDate = (_.get(batch, 'startDate'));
|
|
499
|
-
// const parsedDate = moment(this.startDate);
|
|
500
|
-
// const dateOnly = parsedDate.clone().startOf('day');
|
|
501
|
-
const startDateTime = this.startDate && new Date(this.startDate).getTime();
|
|
502
|
-
this.startDateDifference = startDateTime - now;
|
|
503
|
-
if (this.startDateDifference && this.startDateDifference > 0) {
|
|
504
|
-
const days = Math.floor(this.startDateDifference / (1000 * 60 * 60 * 24));
|
|
505
|
-
const hours = Math.floor((this.startDateDifference % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
|
|
506
|
-
const minutes = Math.floor((this.startDateDifference % (1000 * 60 * 60)) / (1000 * 60));
|
|
507
|
-
return (`${days} Days : ${hours} Hours : ${minutes} Minutes`);
|
|
508
|
-
}
|
|
509
|
-
return 'NA';
|
|
510
|
-
}
|
|
511
|
-
return 'NA';
|
|
512
|
-
// if (_.get(batch, 'startDate') && moment(_.get(batch, 'startDate')).isAfter()) {
|
|
513
|
-
// return moment(_.get(batch, 'startDate')).from(now)
|
|
514
|
-
// }
|
|
515
|
-
// if (_.get(batch, 'endDate') && moment(_.get(batch, 'endDate')).isBefore()) {
|
|
516
|
-
// return 'NA'
|
|
517
|
-
// }
|
|
518
|
-
// if (startDateTime && moment(startDateTime).isAfter()) {
|
|
519
|
-
// return moment(startDateTime).from(now)
|
|
520
|
-
// }
|
|
521
|
-
// if (endDateTime && moment(endDateTime).isBefore()) {
|
|
522
|
-
// return 'NA'
|
|
523
|
-
// }
|
|
524
|
-
// return 'NA'
|
|
525
|
-
}
|
|
526
|
-
return 'NA';
|
|
527
|
-
}
|
|
528
|
-
get isBatchInProgress() {
|
|
529
|
-
// if (this.content && this.content['batches']) {
|
|
530
|
-
// const batches = this.content['batches'] as NsContent.IBatch
|
|
531
|
-
// if (this.currentCourseBatchId) {
|
|
532
|
-
// // const now = moment().format('YYYY-MM-DD HH:mm:ss')
|
|
533
|
-
// const now = new Date().getTime()
|
|
534
|
-
// if (this.batchData && this.batchData.content) {
|
|
535
|
-
// const batch = _.first(_.filter(this.batchData.content, { batchId: this.currentCourseBatchId }) || [])
|
|
536
|
-
// if (batch) {
|
|
537
|
-
// // const startDate = moment(batch.startDate).format('YYYY-MM-DD HH:mm:ss')
|
|
538
|
-
// // const endDate = batch.endDate ? moment(batch.endDate).format('YYYY-MM-DD HH:mm:ss') : now
|
|
539
|
-
// // return (
|
|
540
|
-
// // // batch.status &&
|
|
541
|
-
// // moment(startDate).isSameOrBefore(now)
|
|
542
|
-
// // && moment(endDate).isSameOrAfter(now)
|
|
543
|
-
// // )
|
|
544
|
-
// this.startDate = batch && (_.get(batch, 'startTime'))
|
|
545
|
-
// this.endDate = batch && (_.get(batch, 'endTime'))
|
|
546
|
-
// const endDateTime = new Date(this.endDate).getTime()
|
|
547
|
-
// this.endDateDifference = endDateTime - now
|
|
548
|
-
// if(this.endDateDifference > 0) {
|
|
549
|
-
// return batch.status
|
|
550
|
-
// }
|
|
551
|
-
// }
|
|
552
|
-
// return false
|
|
553
|
-
// }
|
|
554
|
-
// return false
|
|
555
|
-
// } return false
|
|
556
|
-
if (this.enrolledCourseData) {
|
|
557
|
-
const now = new Date().getTime();
|
|
558
|
-
const batch = this.enrolledCourseData.batch;
|
|
559
|
-
this.currentCourseBatchId = batch.batchId;
|
|
560
|
-
if (batch && this.currentCourseBatchId) {
|
|
561
|
-
this.startDate = (_.get(batch, 'startDate'));
|
|
562
|
-
this.endDate = (_.get(batch, 'endDate'));
|
|
563
|
-
if (this.endDate) {
|
|
564
|
-
const startDateTime = this.startDate && new Date(this.startDate).getTime();
|
|
565
|
-
let endDate = this.endDate && new Date(this.endDate);
|
|
566
|
-
endDate.setHours(23, 59, 59, 999);
|
|
567
|
-
const endDateTime = endDate.getTime();
|
|
568
|
-
this.startDateDifference = now - startDateTime;
|
|
569
|
-
this.endDateDifference = endDateTime - now;
|
|
570
|
-
if (this.endDateDifference > 0 && this.startDateDifference > 0 && batch.status !== 2) {
|
|
571
|
-
return true;
|
|
572
|
-
}
|
|
573
|
-
return false;
|
|
574
|
-
}
|
|
575
|
-
return true;
|
|
576
|
-
}
|
|
577
|
-
return false;
|
|
578
|
-
}
|
|
579
|
-
return false;
|
|
580
|
-
}
|
|
581
|
-
getUserRating(fireUpdate) {
|
|
582
|
-
if (!this.forPreview) {
|
|
583
|
-
if (this.configSvc.userProfile) {
|
|
584
|
-
this.userId = this.configSvc.userProfile.userId || '';
|
|
585
|
-
}
|
|
586
|
-
if (this.content && this.content.identifier && this.content.primaryCategory) {
|
|
587
|
-
this.ratingSvc.getRating(this.content.identifier, this.content.primaryCategory, this.userId).subscribe((res) => {
|
|
588
|
-
if (res && res.result && res.result.response) {
|
|
589
|
-
this.userRating = res.result.response;
|
|
590
|
-
if (fireUpdate) {
|
|
591
|
-
this.tocSvc.changeUpdateReviews(true);
|
|
592
|
-
}
|
|
593
|
-
}
|
|
594
|
-
this.contentViewEventForNetCore('view');
|
|
595
|
-
}, (err) => {
|
|
596
|
-
this.loggerSvc.error('USER RATING FETCH ERROR >', err);
|
|
597
|
-
});
|
|
598
|
-
}
|
|
599
|
-
}
|
|
600
|
-
setTimeout(() => {
|
|
601
|
-
if (this.contentSource && this.contentSource.nativeElement.offsetHeight > 44) {
|
|
602
|
-
this.sourceEllipsis = true;
|
|
603
|
-
}
|
|
604
|
-
}, 250);
|
|
605
|
-
}
|
|
606
|
-
fetchUserWFForBlended() {
|
|
607
|
-
const applicationIds = (this.batchData && this.batchData.content && this.batchData.content.map(e => e.batchId)) || [];
|
|
608
|
-
const req = {
|
|
609
|
-
applicationIds,
|
|
610
|
-
serviceName: 'blendedprogram',
|
|
611
|
-
limit: 100,
|
|
612
|
-
offset: 0,
|
|
613
|
-
};
|
|
614
|
-
this.contentSvc.fetchBlendedUserWF(req).then((data) => {
|
|
615
|
-
if (data && data.result && data.result.data.length) {
|
|
616
|
-
const latestWF = _.maxBy(data.result.data[0].wfInfo, (el) => {
|
|
617
|
-
return new Date(el.lastUpdatedOn).getTime();
|
|
618
|
-
});
|
|
619
|
-
// latestWF.currentStatus = this.WFBlendedProgramStatus.REJECTED
|
|
620
|
-
/* tslint:disable-next-line */
|
|
621
|
-
this.batchData.workFlow = {
|
|
622
|
-
wfInitiated: true,
|
|
623
|
-
/* tslint:disable-next-line */
|
|
624
|
-
batch: this.batchData && this.batchData.content && this.batchData.content.find((e) => e.batchId === latestWF.applicationId),
|
|
625
|
-
wfItem: latestWF,
|
|
626
|
-
};
|
|
627
|
-
this.tocSvc.setWFData(this.batchData);
|
|
628
|
-
}
|
|
629
|
-
this.loggerSvc.info('fetchBlendedUserWF data == ', data);
|
|
630
|
-
}, (error) => {
|
|
631
|
-
this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
|
|
632
|
-
});
|
|
633
|
-
}
|
|
634
|
-
checkIfBatchExists(latest) {
|
|
635
|
-
if (!this.batchData || !this.batchData.content) {
|
|
636
|
-
return false;
|
|
637
|
-
}
|
|
638
|
-
return this.batchData.content.find(b => b.batchId === latest.batchId);
|
|
639
|
-
}
|
|
640
|
-
getBatchId() {
|
|
641
|
-
let batchId = '';
|
|
642
|
-
if (this.batchData && this.batchData.content) {
|
|
643
|
-
for (const batch of this.batchData.content) {
|
|
644
|
-
batchId = batch.batchId;
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
return batchId;
|
|
648
|
-
}
|
|
649
|
-
handleAutoBatchAssign() {
|
|
650
|
-
if (this.forPreview) {
|
|
651
|
-
this.navigateToPlayerPage('');
|
|
652
|
-
}
|
|
653
|
-
else {
|
|
654
|
-
this.enrollBtnLoading = true;
|
|
655
|
-
this.changeTab = !this.changeTab;
|
|
656
|
-
this.raiseEnrollTelemetry();
|
|
657
|
-
if (this.recommendedCoursesId) {
|
|
658
|
-
this.raiseEnrollTelementryForSakshamAIGenerated();
|
|
659
|
-
}
|
|
660
|
-
if (this.recommendedCoursesId) {
|
|
661
|
-
this.raiseEnrollTelementryForSakshamAIGenerated();
|
|
662
|
-
}
|
|
663
|
-
const batchData = this.contentReadData && this.contentReadData.batches && this.contentReadData.batches[0];
|
|
664
|
-
if (this.content && this.content.primaryCategory === NsContent.EPrimaryCategory.CURATED_PROGRAM) {
|
|
665
|
-
this.autoEnrollCuratedProgram(NsContent.ECourseCategory.CURATED_PROGRAM, batchData);
|
|
666
|
-
}
|
|
667
|
-
else if (this.content && this.content.courseCategory === NsContent.ECourseCategory.MODERATED_PROGRAM) {
|
|
668
|
-
let moderatedBatchData;
|
|
669
|
-
if (this.batchData && this.batchData.content && this.batchData.content.length > 1) {
|
|
670
|
-
moderatedBatchData = this.selectedBatchData && this.selectedBatchData.content && this.selectedBatchData.content[0];
|
|
671
|
-
}
|
|
672
|
-
else {
|
|
673
|
-
moderatedBatchData = this.batchData && this.batchData.content && this.batchData.content[0];
|
|
674
|
-
}
|
|
675
|
-
this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, moderatedBatchData);
|
|
676
|
-
}
|
|
677
|
-
else if (this.content.courseCategory === NsContent.ECourseCategory.LEARNING_PATHWAY) {
|
|
678
|
-
this.autoEnrollLearningPathway();
|
|
679
|
-
}
|
|
680
|
-
else {
|
|
681
|
-
this.autoAssignEnroll();
|
|
682
|
-
}
|
|
683
|
-
}
|
|
684
|
-
this.contentViewEventForNetCore('enroll');
|
|
685
|
-
}
|
|
686
|
-
autoEnrollLearningPathway() {
|
|
687
|
-
this.contentSvc.autoEnrollLP(this.content?.identifier).subscribe((res) => {
|
|
688
|
-
console.log('autoEnrollLearningPathway', res);
|
|
689
|
-
if (res) {
|
|
690
|
-
this.navigateToPlayerPage(res);
|
|
691
|
-
}
|
|
692
|
-
});
|
|
693
|
-
}
|
|
694
|
-
autoEnrollCuratedProgram(programType, batchData) {
|
|
695
|
-
if (!batchData) {
|
|
696
|
-
this.enrollBtnLoading = false;
|
|
697
|
-
this.snackBar.open('No bacthes found');
|
|
698
|
-
return;
|
|
699
|
-
}
|
|
700
|
-
if (this.content && this.content.identifier) {
|
|
701
|
-
let userId = '';
|
|
702
|
-
if (this.configSvc.userProfile && this.configSvc.userProfile.userId) {
|
|
703
|
-
userId = this.configSvc.userProfile.userId;
|
|
704
|
-
}
|
|
705
|
-
const req = {
|
|
706
|
-
request: {
|
|
707
|
-
userId,
|
|
708
|
-
programId: this.content.identifier,
|
|
709
|
-
// as of now curated program only one batch is coming need to check and modify
|
|
710
|
-
batchId: batchData?.batchId,
|
|
711
|
-
},
|
|
712
|
-
};
|
|
713
|
-
this.contentSvc.autoAssignCuratedBatchApi(req, programType).subscribe((data) => {
|
|
714
|
-
if (data) {
|
|
715
|
-
if (programType === NsContent.ECourseCategory.MODERATED_PROGRAM && batchData.endDate) {
|
|
716
|
-
this.batchData = {
|
|
717
|
-
content: [batchData],
|
|
718
|
-
enrolled: true,
|
|
719
|
-
};
|
|
720
|
-
this.routerChangeHandler(true);
|
|
721
|
-
setTimeout(() => {
|
|
722
|
-
// this.getUserEnrollmentList()
|
|
723
|
-
this.checkIfUserEnrolled();
|
|
724
|
-
}, 2000);
|
|
725
|
-
}
|
|
726
|
-
else {
|
|
727
|
-
this.navigateToPlayerPage(req.request.batchId);
|
|
728
|
-
}
|
|
729
|
-
}
|
|
730
|
-
}, (_error) => {
|
|
731
|
-
// console.log('_error', _error)
|
|
732
|
-
// if(_error && _error.error && _error.error.params && _error.error.params.err && _error.error.params.err.errmsg) {
|
|
733
|
-
this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
|
|
734
|
-
// }
|
|
735
|
-
this.enrollBtnLoading = false;
|
|
736
|
-
});
|
|
737
|
-
}
|
|
738
|
-
}
|
|
739
|
-
autoAssignEnroll() {
|
|
740
|
-
/************* ✨ Windsurf Command ⭐ *************/
|
|
741
|
-
/**
|
|
742
|
-
* If the user is not enrolled in the course, auto-assigns a batch and navigates to the player page.
|
|
743
|
-
* If the user is already enrolled, does nothing.
|
|
744
|
-
*/
|
|
745
|
-
/******* 6d94c646-254c-44d6-a7c3-90bdb9507318 *******/ if (this.baseContentReadData && this.baseContentReadData.identifier) {
|
|
746
|
-
this.contentSvc.autoAssignBatchApi(this.baseContentReadData.identifier, this.selectedLanguage).subscribe((data) => {
|
|
747
|
-
this.batchData = {
|
|
748
|
-
content: data.content,
|
|
749
|
-
enrolled: true,
|
|
750
|
-
};
|
|
751
|
-
const batchId = this.getBatchId();
|
|
752
|
-
if (batchId) {
|
|
753
|
-
this.navigateToPlayerPage(batchId);
|
|
754
|
-
}
|
|
755
|
-
// this.enrollBtnLoading = false
|
|
756
|
-
}, (_error) => {
|
|
757
|
-
this.snackBar.open(_.get(_error, 'error.params.errmsg') || 'Please try again later');
|
|
758
|
-
this.enrollBtnLoading = false;
|
|
759
|
-
});
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
|
-
async navigateToPlayerPage(batchId) {
|
|
763
|
-
if (this.content) {
|
|
764
|
-
this.enrollBtnLoading = true;
|
|
765
|
-
let firstPlayableContent;
|
|
766
|
-
if (this.content && this.content.identifier === this.selectedLanguage.identifier) {
|
|
767
|
-
firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
|
|
768
|
-
}
|
|
769
|
-
else {
|
|
770
|
-
// fetch hierarchy for the selected language in popup first, then get first playable content and redirect to it
|
|
771
|
-
await this.fetchContentHierarchy(this.selectedLanguage.identifier);
|
|
772
|
-
firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
|
|
773
|
-
}
|
|
774
|
-
let primaryCategory;
|
|
775
|
-
if (this.content.secureSettings !== undefined) {
|
|
776
|
-
primaryCategory = 'Learning Resource';
|
|
777
|
-
}
|
|
778
|
-
else {
|
|
779
|
-
primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
|
|
780
|
-
}
|
|
781
|
-
this.firstResourceLink = this.getResumeUrl(firstPlayableContent, batchId, primaryCategory);
|
|
782
|
-
this.router.navigate([`${this.firstResourceLink.url}`], { queryParams: { ...this.firstResourceLink.queryParams, fromAITutor: this.fromAITutor } });
|
|
783
|
-
}
|
|
784
|
-
}
|
|
785
|
-
fetchBatchDetails() {
|
|
786
|
-
if (this.content && this.content.identifier) {
|
|
787
|
-
const req = {
|
|
788
|
-
request: {
|
|
789
|
-
filters: {
|
|
790
|
-
courseId: this.content.identifier,
|
|
791
|
-
status: ['0', '1', '2'],
|
|
792
|
-
// createdBy: 'fca2925f-1eee-4654-9177-fece3fd6afc9',
|
|
793
|
-
},
|
|
794
|
-
sort_by: { createdDate: 'desc' },
|
|
795
|
-
},
|
|
796
|
-
};
|
|
797
|
-
this.contentSvc.fetchCourseBatches(req).subscribe((data) => {
|
|
798
|
-
this.batchData = data;
|
|
799
|
-
this.batchData.enrolled = false;
|
|
800
|
-
this.tocSvc.setBatchData(this.batchData);
|
|
801
|
-
this.routerChangeHandler(false);
|
|
802
|
-
}, (error) => {
|
|
803
|
-
this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
|
|
804
|
-
});
|
|
805
|
-
}
|
|
806
|
-
}
|
|
807
|
-
scrollToTop() {
|
|
808
|
-
(function smoothscroll() {
|
|
809
|
-
const currentScroll = document.documentElement.scrollTop || document.body.scrollTop;
|
|
810
|
-
if (currentScroll > 0) {
|
|
811
|
-
// window.requestAnimationFrame(smoothscroll)
|
|
812
|
-
// window.scrollTo(0, currentScroll - (currentScroll / 5))
|
|
813
|
-
window.scrollTo({
|
|
814
|
-
top: 0,
|
|
815
|
-
behavior: 'smooth',
|
|
816
|
-
});
|
|
817
|
-
}
|
|
818
|
-
})();
|
|
819
|
-
}
|
|
820
|
-
getCompetencies(competencies) {
|
|
821
|
-
const competenciesArray = JSON.parse(competencies);
|
|
822
|
-
const competencyStringArray = [];
|
|
823
|
-
competenciesArray.map((c) => {
|
|
824
|
-
competencyStringArray.push(c.name);
|
|
825
|
-
});
|
|
826
|
-
return competencyStringArray;
|
|
827
|
-
}
|
|
828
|
-
get showIntranetMsg() {
|
|
829
|
-
if (this.isMobile) {
|
|
830
|
-
return true;
|
|
831
|
-
}
|
|
832
|
-
return this.showIntranetMessage;
|
|
833
|
-
}
|
|
834
|
-
get showStart() {
|
|
835
|
-
return this.tocSvc.showStartButton(this.content);
|
|
836
|
-
}
|
|
837
|
-
get isPostAssessment() {
|
|
838
|
-
if (!(this.tocConfig && this.tocConfig.postAssessment)) {
|
|
839
|
-
return false;
|
|
840
|
-
}
|
|
841
|
-
if (this.content) {
|
|
842
|
-
return (this.content.primaryCategory === NsContent.EPrimaryCategory.COURSE &&
|
|
843
|
-
this.content.learningMode === 'Instructor-Led');
|
|
844
|
-
}
|
|
845
|
-
return false;
|
|
846
|
-
}
|
|
847
|
-
get isMobile() {
|
|
848
|
-
return this.utilitySvc.isMobile;
|
|
849
|
-
}
|
|
850
|
-
get showSubtitleOnBanner() {
|
|
851
|
-
return this.tocSvc.subtitleOnBanners;
|
|
852
|
-
}
|
|
853
|
-
handleEnrollmentEndDate(batch) {
|
|
854
|
-
const enrollmentEndDate = dayjs(_.get(batch, 'enrollmentEndDate')).format('YYYY-MM-DD');
|
|
855
|
-
const systemDate = dayjs();
|
|
856
|
-
return enrollmentEndDate ? dayjs(enrollmentEndDate).isBefore(systemDate) : false;
|
|
857
|
-
}
|
|
858
|
-
openSnackbar(primaryMsg, duration = 5000) {
|
|
859
|
-
this.snackBar.open(primaryMsg, 'X', {
|
|
860
|
-
duration,
|
|
861
|
-
});
|
|
862
|
-
}
|
|
863
|
-
get showInstructorLedMsg() {
|
|
864
|
-
return (this.showActionButtons &&
|
|
865
|
-
this.content &&
|
|
866
|
-
this.content.learningMode === 'Instructor-Led' &&
|
|
867
|
-
!this.content.children.length &&
|
|
868
|
-
!this.content.artifactUrl);
|
|
869
|
-
}
|
|
870
|
-
get isHeaderHidden() {
|
|
871
|
-
return this.isResource && this.content && !this.content.artifactUrl.length;
|
|
872
|
-
}
|
|
873
|
-
get showActionButtons() {
|
|
874
|
-
return (this.actionBtnStatus !== 'wait' &&
|
|
875
|
-
this.content &&
|
|
876
|
-
this.content.status !== 'Deleted' &&
|
|
877
|
-
this.content.status !== 'Expired');
|
|
878
|
-
}
|
|
879
|
-
get showButtonContainer() {
|
|
880
|
-
return (this.actionBtnStatus === 'grant' &&
|
|
881
|
-
!(this.isMobile && this.content && this.content.isInIntranet) &&
|
|
882
|
-
!(this.content &&
|
|
883
|
-
this.content.contentType === 'Course' &&
|
|
884
|
-
this.content.children.length === 0 &&
|
|
885
|
-
!this.content.artifactUrl) &&
|
|
886
|
-
!(this.content && this.content.contentType === 'Resource' && !this.content.artifactUrl));
|
|
887
|
-
}
|
|
888
|
-
getResumeDataFromList(type) {
|
|
889
|
-
const resumeCopy = [...this.resumeData];
|
|
890
|
-
if (resumeCopy && resumeCopy.length) {
|
|
891
|
-
if (!type) {
|
|
892
|
-
// tslint:disable-next-line:max-line-length
|
|
893
|
-
const lastItem = resumeCopy && resumeCopy.sort((a, b) => new Date(b.lastAccessTime).getTime() - new Date(a.lastAccessTime).getTime()).shift();
|
|
894
|
-
return {
|
|
895
|
-
identifier: lastItem.contentId,
|
|
896
|
-
mimeType: lastItem.progressdetails && lastItem.progressdetails.mimeType,
|
|
897
|
-
};
|
|
898
|
-
}
|
|
899
|
-
const firstItem = resumeCopy && resumeCopy.length && resumeCopy[0];
|
|
900
|
-
return {
|
|
901
|
-
identifier: firstItem.contentId,
|
|
902
|
-
mimeType: firstItem.progressdetails && firstItem.progressdetails.mimeType,
|
|
903
|
-
};
|
|
904
|
-
}
|
|
905
|
-
return {};
|
|
906
|
-
}
|
|
907
|
-
modifySensibleContentRating() {
|
|
908
|
-
if (this.content &&
|
|
909
|
-
this.content.averageRating &&
|
|
910
|
-
typeof this.content.averageRating !== 'number') {
|
|
911
|
-
this.content.averageRating = this.content.averageRating[this.configSvc.rootOrg || ''];
|
|
912
|
-
}
|
|
913
|
-
if (this.content && this.content.totalRating && typeof this.content.totalRating !== 'number') {
|
|
914
|
-
this.content.totalRating = this.content.totalRating[this.configSvc.rootOrg || ''];
|
|
915
|
-
}
|
|
916
|
-
}
|
|
917
|
-
getLearningUrls() {
|
|
918
|
-
if (this.content) {
|
|
919
|
-
this.isPracticeVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.PRACTICE));
|
|
920
|
-
this.isAssessVisible = Boolean(this.tocSvc.filterToc(this.content, NsContent.EFilterCategory.ASSESS));
|
|
921
|
-
const firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
|
|
922
|
-
let primaryCategory;
|
|
923
|
-
if (this.content.secureSettings !== undefined) {
|
|
924
|
-
primaryCategory = 'Learning Resource';
|
|
925
|
-
}
|
|
926
|
-
else {
|
|
927
|
-
primaryCategory = firstPlayableContent.primaryCategory || this.content.primaryCategory;
|
|
928
|
-
}
|
|
929
|
-
this.firstResourceLink = this.getResumeUrl(firstPlayableContent, null, primaryCategory);
|
|
930
|
-
/* tslint:disable-next-line */
|
|
931
|
-
// if (firstPlayableContent.optionalReading && firstPlayableContent.primaryCategory === 'Learning Resource') {
|
|
932
|
-
// this.updateProgress(2, firstPlayableContent.identifier)
|
|
933
|
-
// }
|
|
934
|
-
}
|
|
935
|
-
}
|
|
936
|
-
assignPathAndUpdateBanner(url) {
|
|
937
|
-
const path = url.split('/').pop();
|
|
938
|
-
if (path && this.validPaths.has(path)) {
|
|
939
|
-
this.routePath = path;
|
|
940
|
-
this.updateBannerUrl();
|
|
941
|
-
}
|
|
942
|
-
}
|
|
943
|
-
updateBannerUrl() {
|
|
944
|
-
if (this.banners) {
|
|
945
|
-
this.bannerUrl = this.domSanitizer.bypassSecurityTrustStyle(`url(${this.banners[this.routePath]})`);
|
|
946
|
-
}
|
|
947
|
-
}
|
|
948
|
-
playIntroVideo() {
|
|
949
|
-
if (this.content) {
|
|
950
|
-
this.dialog.open(AppTocDialogIntroVideoComponent, {
|
|
951
|
-
data: this.content.introductoryVideo,
|
|
952
|
-
height: '350px',
|
|
953
|
-
width: '620px',
|
|
954
|
-
});
|
|
955
|
-
}
|
|
956
|
-
}
|
|
957
|
-
get sanitizedIntroductoryVideoIcon() {
|
|
958
|
-
if (this.content && this.content.introductoryVideoIcon) {
|
|
959
|
-
return this.domSanitizer.bypassSecurityTrustStyle(`url(${this.content.introductoryVideoIcon})`);
|
|
960
|
-
}
|
|
961
|
-
return null;
|
|
962
|
-
}
|
|
963
|
-
fetchExternalContentAccess() {
|
|
964
|
-
if (this.content && this.content.registrationUrl) {
|
|
965
|
-
if (!this.forPreview) {
|
|
966
|
-
this.externalContentFetchStatus = 'fetching';
|
|
967
|
-
this.registerForExternal = false;
|
|
968
|
-
this.tocSvc.fetchExternalContentAccess(this.content.identifier).subscribe(data => {
|
|
969
|
-
this.externalContentFetchStatus = 'done';
|
|
970
|
-
this.registerForExternal = data.hasAccess;
|
|
971
|
-
}, _error => {
|
|
972
|
-
this.externalContentFetchStatus = 'done';
|
|
973
|
-
this.registerForExternal = false;
|
|
974
|
-
});
|
|
975
|
-
}
|
|
976
|
-
else {
|
|
977
|
-
this.externalContentFetchStatus = 'done';
|
|
978
|
-
this.registerForExternal = true;
|
|
979
|
-
}
|
|
980
|
-
}
|
|
981
|
-
}
|
|
982
|
-
getRatingIcon(ratingIndex) {
|
|
983
|
-
if (this.content && this.content.averageRating) {
|
|
984
|
-
const avgRating = this.content.averageRating;
|
|
985
|
-
const ratingFloor = Math.floor(avgRating);
|
|
986
|
-
if (ratingIndex <= ratingFloor) {
|
|
987
|
-
return 'star';
|
|
988
|
-
}
|
|
989
|
-
if (ratingFloor === ratingIndex - 1 && avgRating % 1 > 0) {
|
|
990
|
-
return 'star_half';
|
|
991
|
-
}
|
|
992
|
-
}
|
|
993
|
-
return 'star_border';
|
|
994
|
-
}
|
|
995
|
-
checkRegistrationStatus() {
|
|
996
|
-
const source = (this.content && this.content.sourceShortName) || '';
|
|
997
|
-
if (!this.forPreview &&
|
|
998
|
-
!this.isRegistrationSupported &&
|
|
999
|
-
this.checkRegistrationSources.has(source)) {
|
|
1000
|
-
this.contentSvc
|
|
1001
|
-
.getRegistrationStatus(source)
|
|
1002
|
-
.then(res => {
|
|
1003
|
-
if (res.hasAccess) {
|
|
1004
|
-
this.actionBtnStatus = 'grant';
|
|
1005
|
-
}
|
|
1006
|
-
else {
|
|
1007
|
-
this.actionBtnStatus = 'reject';
|
|
1008
|
-
if (res.registrationUrl && this.content) {
|
|
1009
|
-
this.content.registrationUrl = res.registrationUrl;
|
|
1010
|
-
}
|
|
1011
|
-
}
|
|
1012
|
-
})
|
|
1013
|
-
.catch(_err => { });
|
|
1014
|
-
}
|
|
1015
|
-
else {
|
|
1016
|
-
this.actionBtnStatus = 'grant';
|
|
1017
|
-
}
|
|
1018
|
-
}
|
|
1019
|
-
generateQuery(type) {
|
|
1020
|
-
if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
|
|
1021
|
-
let qParams = {
|
|
1022
|
-
...this.firstResourceLink.queryParams,
|
|
1023
|
-
viewMode: type,
|
|
1024
|
-
batchId: this.getBatchId(),
|
|
1025
|
-
};
|
|
1026
|
-
if (this.contextId && this.contextPath) {
|
|
1027
|
-
qParams = {
|
|
1028
|
-
...qParams,
|
|
1029
|
-
collectionId: this.contextId,
|
|
1030
|
-
collectionType: this.contextPath,
|
|
1031
|
-
};
|
|
1032
|
-
}
|
|
1033
|
-
if (this.forPreview) {
|
|
1034
|
-
delete qParams.viewMode;
|
|
1035
|
-
}
|
|
1036
|
-
qParams = {
|
|
1037
|
-
...qParams,
|
|
1038
|
-
channelId: this.channelId,
|
|
1039
|
-
};
|
|
1040
|
-
return qParams;
|
|
1041
|
-
}
|
|
1042
|
-
if (this.resumeDataLink && type === 'RESUME') {
|
|
1043
|
-
let qParams = {
|
|
1044
|
-
...this.resumeDataLink.queryParams,
|
|
1045
|
-
batchId: this.getBatchId(),
|
|
1046
|
-
viewMode: 'RESUME',
|
|
1047
|
-
// courseName: this.content ? this.content.name : '',
|
|
1048
|
-
};
|
|
1049
|
-
if (this.contextId && this.contextPath) {
|
|
1050
|
-
qParams = {
|
|
1051
|
-
...qParams,
|
|
1052
|
-
collectionId: this.contextId,
|
|
1053
|
-
collectionType: this.contextPath,
|
|
1054
|
-
};
|
|
1055
|
-
}
|
|
1056
|
-
if (this.forPreview) {
|
|
1057
|
-
delete qParams.viewMode;
|
|
1058
|
-
}
|
|
1059
|
-
qParams = {
|
|
1060
|
-
...qParams,
|
|
1061
|
-
channelId: this.channelId,
|
|
1062
|
-
};
|
|
1063
|
-
return qParams;
|
|
1064
|
-
}
|
|
1065
|
-
if (this.forPreview) {
|
|
1066
|
-
return {};
|
|
1067
|
-
}
|
|
1068
|
-
return {
|
|
1069
|
-
batchId: this.getBatchId(),
|
|
1070
|
-
viewMode: type,
|
|
1071
|
-
};
|
|
1072
|
-
}
|
|
1073
|
-
get isInIFrame() {
|
|
1074
|
-
try {
|
|
1075
|
-
return window.self !== window.top;
|
|
1076
|
-
}
|
|
1077
|
-
catch (e) {
|
|
1078
|
-
return true;
|
|
1079
|
-
}
|
|
1080
|
-
}
|
|
1081
|
-
openFeedbackDialog(content) {
|
|
1082
|
-
const dialogRef = this.dialog.open(ContentRatingV2DialogComponent, {
|
|
1083
|
-
width: '768px',
|
|
1084
|
-
data: { content, userId: this.userId, userRating: this.userRating },
|
|
1085
|
-
});
|
|
1086
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
1087
|
-
if (result) {
|
|
1088
|
-
this.getUserRating(true);
|
|
1089
|
-
// this.getUserEnrollmentList()
|
|
1090
|
-
this.checkIfUserEnrolled();
|
|
1091
|
-
this.resetRatingsService.setRatingServiceUpdate(true);
|
|
1092
|
-
}
|
|
1093
|
-
});
|
|
1094
|
-
}
|
|
1095
|
-
updateProgress(status, resourceId) {
|
|
1096
|
-
const collectionId = this.route.snapshot.params.id ?
|
|
1097
|
-
this.route.snapshot.params.id : '';
|
|
1098
|
-
const batchId = this.route.snapshot.queryParams.batchId ?
|
|
1099
|
-
this.route.snapshot.queryParams.batchId : '';
|
|
1100
|
-
const isPreAssessment = this.route.snapshot.queryParams.preAssessment;
|
|
1101
|
-
if (isPreAssessment) {
|
|
1102
|
-
return this.viewerSvc
|
|
1103
|
-
.realTimeProgressUpdateForPreAssessmentQuiz(resourceId, status);
|
|
1104
|
-
}
|
|
1105
|
-
return this.viewerSvc.realTimeProgressUpdateQuiz(resourceId, collectionId, batchId, status);
|
|
1106
|
-
}
|
|
1107
|
-
getProgramDuration(batchData) {
|
|
1108
|
-
if (batchData) {
|
|
1109
|
-
const startDate = dayjs(dayjs(batchData.startDate).format('YYYY-MM-DD'));
|
|
1110
|
-
const endDate = dayjs(dayjs(batchData.endDate).format('YYYY-MM-DD'));
|
|
1111
|
-
// adding 1 to include the start date
|
|
1112
|
-
return (endDate.diff(startDate, 'days') + 1);
|
|
1113
|
-
}
|
|
1114
|
-
return '';
|
|
1115
|
-
}
|
|
1116
|
-
withdrawOrEnroll(data) {
|
|
1117
|
-
if (data === NsContent.WFBlendedProgramStatus.INITIATE) {
|
|
1118
|
-
this.fetchUserWFForBlended();
|
|
1119
|
-
}
|
|
1120
|
-
}
|
|
1121
|
-
handleCapitalize(str, type) {
|
|
1122
|
-
let returnValue = '';
|
|
1123
|
-
if (str) {
|
|
1124
|
-
if (type === 'name') {
|
|
1125
|
-
returnValue = str.split(' ').map(_str => {
|
|
1126
|
-
return _str.charAt(0).toUpperCase() + _str.slice(1);
|
|
1127
|
-
}).join(' ');
|
|
1128
|
-
}
|
|
1129
|
-
else {
|
|
1130
|
-
returnValue = str && (str.charAt(0).toUpperCase() + str.slice(1));
|
|
1131
|
-
}
|
|
1132
|
-
}
|
|
1133
|
-
return returnValue;
|
|
1134
|
-
}
|
|
1135
|
-
handleParseJsonData(s) {
|
|
1136
|
-
try {
|
|
1137
|
-
const parsedString = JSON.parse(s);
|
|
1138
|
-
return parsedString;
|
|
1139
|
-
}
|
|
1140
|
-
catch {
|
|
1141
|
-
return [];
|
|
1142
|
-
}
|
|
1143
|
-
}
|
|
1144
|
-
handleNavigateToReviews() {
|
|
1145
|
-
const elementToView = document.getElementById('reviewContainer');
|
|
1146
|
-
if (elementToView) {
|
|
1147
|
-
window.scrollTo({
|
|
1148
|
-
top: elementToView.offsetTop,
|
|
1149
|
-
behavior: 'smooth',
|
|
1150
|
-
});
|
|
1151
|
-
}
|
|
1152
|
-
}
|
|
1153
|
-
raiseCertIntreactTelemetry() {
|
|
1154
|
-
this.events.raiseInteractTelemetry({
|
|
1155
|
-
type: WsEvents.EnumInteractTypes.CLICK,
|
|
1156
|
-
id: 'view-certificate',
|
|
1157
|
-
subType: WsEvents.EnumInteractSubTypes.CERTIFICATE,
|
|
1158
|
-
}, {
|
|
1159
|
-
id: this.certId,
|
|
1160
|
-
type: WsEvents.EnumInteractSubTypes.CERTIFICATE,
|
|
1161
|
-
});
|
|
1162
|
-
}
|
|
1163
|
-
translateLabels(label, type) {
|
|
1164
|
-
return this.langtranslations.translateLabel(label, type, '');
|
|
1165
|
-
}
|
|
1166
|
-
getLastPlayedResource() {
|
|
1167
|
-
let firstPlayableContent;
|
|
1168
|
-
let resumeDataV2;
|
|
1169
|
-
if (this.resumeData && this.resumeData.length > 0 && this.content) {
|
|
1170
|
-
if (this.content.completionPercentage === 100) {
|
|
1171
|
-
resumeDataV2 = this.getResumeDataFromList('start');
|
|
1172
|
-
}
|
|
1173
|
-
else {
|
|
1174
|
-
resumeDataV2 = this.getResumeDataFromList();
|
|
1175
|
-
}
|
|
1176
|
-
this.expandThePath(resumeDataV2.identifier);
|
|
1177
|
-
}
|
|
1178
|
-
else {
|
|
1179
|
-
if (this.content) {
|
|
1180
|
-
firstPlayableContent = this.contentSvc.getFirstChildInHierarchy(this.content);
|
|
1181
|
-
this.expandThePath(firstPlayableContent.identifier);
|
|
1182
|
-
}
|
|
1183
|
-
}
|
|
1184
|
-
}
|
|
1185
|
-
expandThePath(resourceId) {
|
|
1186
|
-
if (this.content && resourceId) {
|
|
1187
|
-
const path = this.utilitySvc.getPath(this.content, resourceId);
|
|
1188
|
-
this.pathSet = new Set(path.map((u) => u.identifier));
|
|
1189
|
-
}
|
|
1190
|
-
}
|
|
1191
|
-
raiseEnrollTelemetry() {
|
|
1192
|
-
this.events.raiseInteractTelemetry({
|
|
1193
|
-
type: 'click',
|
|
1194
|
-
subType: 'enroll',
|
|
1195
|
-
id: this.content ? this.content.identifier : '',
|
|
1196
|
-
}, {
|
|
1197
|
-
id: this.content ? this.content.identifier : '',
|
|
1198
|
-
type: this.content ? this.content.primaryCategory : '',
|
|
1199
|
-
}, {
|
|
1200
|
-
pageIdExt: `btn-enroll`,
|
|
1201
|
-
module: WsEvents.EnumTelemetrymodules.CONTENT,
|
|
1202
|
-
});
|
|
1203
|
-
}
|
|
1204
|
-
raiseEnrollTelementryForSakshamAIGenerated() {
|
|
1205
|
-
this.events.raiseInteractTelemetry({
|
|
1206
|
-
type: 'click',
|
|
1207
|
-
subType: 'enroll',
|
|
1208
|
-
id: this.content ? this.content.identifier : '',
|
|
1209
|
-
target: {
|
|
1210
|
-
id: this.recommendedCoursesId,
|
|
1211
|
-
ver: "1.0",
|
|
1212
|
-
type: "igot-ai"
|
|
1213
|
-
},
|
|
1214
|
-
}, {
|
|
1215
|
-
id: this.content ? this.content.identifier : '',
|
|
1216
|
-
type: this.content ? this.content.primaryCategory : '',
|
|
1217
|
-
}, {
|
|
1218
|
-
pageId: `/app/toc/${this.content?.identifier}/overview_btn-enroll`,
|
|
1219
|
-
module: WsEvents.EnumTelemetrymodules.CONTENT,
|
|
1220
|
-
});
|
|
1221
|
-
}
|
|
1222
|
-
onClickOfShare() {
|
|
1223
|
-
this.enableShare = true;
|
|
1224
|
-
this.raiseTelemetryForShare('shareContent');
|
|
1225
|
-
}
|
|
1226
|
-
/* tslint:disable */
|
|
1227
|
-
raiseTelemetryForShare(subType) {
|
|
1228
|
-
this.events.raiseInteractTelemetry({
|
|
1229
|
-
type: 'click',
|
|
1230
|
-
subType,
|
|
1231
|
-
id: this.content ? this.content.identifier : '',
|
|
1232
|
-
}, {
|
|
1233
|
-
id: this.content ? this.content.identifier : '',
|
|
1234
|
-
type: this.content ? this.content.primaryCategory : '',
|
|
1235
|
-
}, {
|
|
1236
|
-
pageIdExt: `btn-${subType}`,
|
|
1237
|
-
module: WsEvents.EnumTelemetrymodules.CONTENT,
|
|
1238
|
-
});
|
|
1239
|
-
}
|
|
1240
|
-
resetEnableShare() {
|
|
1241
|
-
this.enableShare = false;
|
|
1242
|
-
}
|
|
1243
|
-
translateLabel(label, type) {
|
|
1244
|
-
if (label && type) {
|
|
1245
|
-
return this.langtranslations.translateLabel(label, type, '');
|
|
1246
|
-
}
|
|
1247
|
-
}
|
|
1248
|
-
ngOnDestroy() {
|
|
1249
|
-
if (this.routeSubscription) {
|
|
1250
|
-
this.routeSubscription.unsubscribe();
|
|
1251
|
-
}
|
|
1252
|
-
if (this.batchSubscription) {
|
|
1253
|
-
this.batchSubscription.unsubscribe();
|
|
1254
|
-
}
|
|
1255
|
-
if (this.batchDataSubscription) {
|
|
1256
|
-
this.batchDataSubscription.unsubscribe();
|
|
1257
|
-
}
|
|
1258
|
-
this.tocSvc.analyticsFetchStatus = 'none';
|
|
1259
|
-
if (this.routerParamSubscription) {
|
|
1260
|
-
this.routerParamSubscription.unsubscribe();
|
|
1261
|
-
}
|
|
1262
|
-
if (this.selectedBatchSubscription) {
|
|
1263
|
-
this.selectedBatchSubscription.unsubscribe();
|
|
1264
|
-
}
|
|
1265
|
-
if (this.resumeDataSubscription) {
|
|
1266
|
-
this.resumeDataSubscription.unsubscribe();
|
|
1267
|
-
}
|
|
1268
|
-
if (this.timerUnsubscribe) {
|
|
1269
|
-
this.timerUnsubscribe.unsubscribe();
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
programEnrollCall(batchData) {
|
|
1273
|
-
this.autoEnrollCuratedProgram(NsContent.ECourseCategory.MODERATED_PROGRAM, batchData);
|
|
1274
|
-
}
|
|
1275
|
-
raiseTelemetryForPublic($event) {
|
|
1276
|
-
// Check if we should first prevent navigation to player page
|
|
1277
|
-
const shouldPreventNavigation = this.shouldShowSurveyPopup();
|
|
1278
|
-
if (shouldPreventNavigation) {
|
|
1279
|
-
$event.preventDefault();
|
|
1280
|
-
$event.stopPropagation();
|
|
1281
|
-
}
|
|
1282
|
-
this.events.raiseInteractTelemetry({
|
|
1283
|
-
type: 'click',
|
|
1284
|
-
id: "view-assessment",
|
|
1285
|
-
subType: "anonymous-assessment",
|
|
1286
|
-
}, {}, {
|
|
1287
|
-
module: 'Landing Page',
|
|
1288
|
-
});
|
|
1289
|
-
console.log('raiseTelemetryForPublic $event', $event);
|
|
1290
|
-
if (shouldPreventNavigation) {
|
|
1291
|
-
// Prepare navigation details
|
|
1292
|
-
const navigationUrl = (this.resumeData && !this.certData) ? this.resumeDataLink?.url : this.firstResourceLink?.url;
|
|
1293
|
-
const queryParams = (this.resumeData && !this.certData) ? this.generateQuery('RESUME') : this.generateQuery('START');
|
|
1294
|
-
// Open survey popup directly with navigation details
|
|
1295
|
-
if (navigationUrl) {
|
|
1296
|
-
this.openPublicSurveyPopup(navigationUrl, queryParams);
|
|
1297
|
-
}
|
|
1298
|
-
return false;
|
|
1299
|
-
}
|
|
1300
|
-
}
|
|
1301
|
-
shouldShowSurveyPopup() {
|
|
1302
|
-
// Single source of truth for survey popup condition
|
|
1303
|
-
// Check if it's public view and content is a case study
|
|
1304
|
-
return this.forPreview && this.content && this.contentReadData
|
|
1305
|
-
&& this.contentReadData.courseCategory === NsContent.ECourseCategory.CASE_STUDY;
|
|
1306
|
-
}
|
|
1307
|
-
async checkIfUserEnrolled() {
|
|
1308
|
-
this.contentLibSvc.oneStepResumeEnable = false;
|
|
1309
|
-
this.enrollBtnLoading = true;
|
|
1310
|
-
this.tocSvc.contentLoader.next(true);
|
|
1311
|
-
// only for resource
|
|
1312
|
-
// tslint:disable-next-line
|
|
1313
|
-
if (this.baseContentReadData && this.baseContentReadData.identifier && this.baseContentReadData.primaryCategory !== this.primaryCategory.COURSE &&
|
|
1314
|
-
this.baseContentReadData.primaryCategory !== this.primaryCategory.PROGRAM &&
|
|
1315
|
-
this.baseContentReadData.primaryCategory !== this.primaryCategory.MANDATORY_COURSE_GOAL &&
|
|
1316
|
-
this.baseContentReadData.primaryCategory !== this.primaryCategory.STANDALONE_ASSESSMENT &&
|
|
1317
|
-
this.baseContentReadData.primaryCategory !== this.primaryCategory.BLENDED_PROGRAM &&
|
|
1318
|
-
this.baseContentReadData.primaryCategory !== this.primaryCategory.CURATED_PROGRAM) {
|
|
1319
|
-
// const collectionId = this.isResource ? '' : this.baseContentReadData.identifier
|
|
1320
|
-
return this.getContinueLearningData(this.baseContentReadData.identifier);
|
|
1321
|
-
}
|
|
1322
|
-
let enrolledCourse;
|
|
1323
|
-
if (this.content && this.baseContentReadData && this.baseContentReadData.identifier && !this.forPreview) {
|
|
1324
|
-
if (this.userEnrollmentList && this.userEnrollmentList.length) {
|
|
1325
|
-
enrolledCourse = this.userEnrollmentList.find((course) => {
|
|
1326
|
-
const identifier = this.baseContentReadData && this.baseContentReadData.identifier || '';
|
|
1327
|
-
if (course.courseId !== identifier) {
|
|
1328
|
-
return undefined;
|
|
1329
|
-
}
|
|
1330
|
-
return course;
|
|
1331
|
-
});
|
|
1332
|
-
}
|
|
1333
|
-
// If current course is present in the list of user enrolled course
|
|
1334
|
-
if (enrolledCourse && enrolledCourse.batchId) {
|
|
1335
|
-
this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
|
|
1336
|
-
if (res) {
|
|
1337
|
-
this.resumeData = res;
|
|
1338
|
-
this.getLastPlayedResource();
|
|
1339
|
-
this.generateResumeDataLinkNew();
|
|
1340
|
-
}
|
|
1341
|
-
});
|
|
1342
|
-
this.tocSvc.checkModuleWiseData(this.content);
|
|
1343
|
-
this.enrolledCourseData = enrolledCourse;
|
|
1344
|
-
this.isCourseCompletedOnThisMonth();
|
|
1345
|
-
this.currentCourseBatchId = enrolledCourse.batchId;
|
|
1346
|
-
// this.downloadCert(enrolledCourse.issuedCertificates)
|
|
1347
|
-
if (enrolledCourse && enrolledCourse.issuedCertificates &&
|
|
1348
|
-
enrolledCourse.issuedCertificates.length) {
|
|
1349
|
-
const certificate = enrolledCourse.issuedCertificates.sort((a, b) => new Date(b.lastIssuedOn).getTime() - new Date(a.lastIssuedOn).getTime());
|
|
1350
|
-
const certId = certificate[0].identifier;
|
|
1351
|
-
this.certId = certId;
|
|
1352
|
-
if (this.content) {
|
|
1353
|
-
this.content['certificateObj'] = {
|
|
1354
|
-
certId,
|
|
1355
|
-
certData: '',
|
|
1356
|
-
};
|
|
1357
|
-
}
|
|
1358
|
-
}
|
|
1359
|
-
// if enrolled course is completed then to make all languages courses as well as all content as completed
|
|
1360
|
-
if (enrolledCourse.status === 2) {
|
|
1361
|
-
this.content['completionPercentage'] = 100;
|
|
1362
|
-
this.content['completionStatus'] = 2;
|
|
1363
|
-
await this.tocSvc.mapCompletionChildPercentageProgram(this.content);
|
|
1364
|
-
let contentLag = this.contentLangSvc.getContentLanguage(this.contentReadData);
|
|
1365
|
-
this.getContinueLearningData(this.baseContentReadData.identifier, enrolledCourse.batchId, contentLag);
|
|
1366
|
-
this.enrollBtnLoading = false;
|
|
1367
|
-
this.tocSvc.mapModuleCount(this.content);
|
|
1368
|
-
this.checkForCompletionSurveyTrigger();
|
|
1369
|
-
}
|
|
1370
|
-
else {
|
|
1371
|
-
if (this.contentReadData && this.contentReadData.cumulativeTracking) {
|
|
1372
|
-
await this.tocSvc.mapCompletionPercentageProgram(this.content, this.userEnrollmentList);
|
|
1373
|
-
this.checkForCompletionSurveyTrigger();
|
|
1374
|
-
this.resumeDataSubscription = this.tocSvc.resumeData.subscribe((res) => {
|
|
1375
|
-
if (res) {
|
|
1376
|
-
this.resumeData = res;
|
|
1377
|
-
this.getLastPlayedResource();
|
|
1378
|
-
this.generateResumeDataLinkNew();
|
|
1379
|
-
}
|
|
1380
|
-
});
|
|
1381
|
-
this.enrollBtnLoading = false;
|
|
1382
|
-
// this.tocSvc.contentLoader.next(false)
|
|
1383
|
-
}
|
|
1384
|
-
else {
|
|
1385
|
-
let contentLag = this.contentLangSvc.getContentLanguage(this.contentReadData);
|
|
1386
|
-
this.getContinueLearningData(this.baseContentReadData.identifier, enrolledCourse.batchId, contentLag);
|
|
1387
|
-
this.content['completionPercentage'] = enrolledCourse.completionPercentage;
|
|
1388
|
-
this.enrollBtnLoading = false;
|
|
1389
|
-
this.tocSvc.mapModuleCount(this.content);
|
|
1390
|
-
// this.tocSvc.contentLoader.next(false)
|
|
1391
|
-
}
|
|
1392
|
-
}
|
|
1393
|
-
this.batchData = {
|
|
1394
|
-
content: [enrolledCourse.batch],
|
|
1395
|
-
enrolled: true,
|
|
1396
|
-
};
|
|
1397
|
-
this.tocSvc.setBatchData(this.batchData);
|
|
1398
|
-
this.tocSvc.getSelectedBatchData(this.batchData);
|
|
1399
|
-
this.tocSvc.mapSessionCompletionPercentage(this.batchData, this.resumeData);
|
|
1400
|
-
this.routerChangeHandler(true);
|
|
1401
|
-
this.tocSvc.contentLoader.next(false);
|
|
1402
|
-
}
|
|
1403
|
-
else {
|
|
1404
|
-
this.tocSvc.checkModuleWiseData(this.content);
|
|
1405
|
-
this.tocSvc.mapModuleCount(this.content);
|
|
1406
|
-
// It's understood that user is not already enrolled
|
|
1407
|
-
// Fetch the available batches and present to user
|
|
1408
|
-
if (this.content.primaryCategory === this.primaryCategory.COURSE
|
|
1409
|
-
|| this.content.primaryCategory !== this.primaryCategory.PROGRAM) {
|
|
1410
|
-
// Disabling auto enrollment to batch
|
|
1411
|
-
if (this.content.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
|
|
1412
|
-
this.fetchBatchDetails();
|
|
1413
|
-
}
|
|
1414
|
-
}
|
|
1415
|
-
else {
|
|
1416
|
-
this.fetchBatchDetails();
|
|
1417
|
-
}
|
|
1418
|
-
this.tocSvc.callHirarchyProgressHashmap(this.content);
|
|
1419
|
-
this.enrollBtnLoading = false;
|
|
1420
|
-
this.tocSvc.contentLoader.next(false);
|
|
1421
|
-
}
|
|
1422
|
-
}
|
|
1423
|
-
this.skeletonLoader = false;
|
|
1424
|
-
}
|
|
1425
|
-
bindCompletionPercentage() {
|
|
1426
|
-
let completionPercentage = 0;
|
|
1427
|
-
let completionStatus = 0;
|
|
1428
|
-
if (this.languageMapProgress && Object.keys(this.languageMapProgress).length) {
|
|
1429
|
-
let langPercentage = this.languageMapProgress[this.selectedLanguage.langId] || 0;
|
|
1430
|
-
completionPercentage = langPercentage;
|
|
1431
|
-
completionStatus = langPercentage >= 100 ? 2 : 0;
|
|
1432
|
-
}
|
|
1433
|
-
else {
|
|
1434
|
-
let enrolledData = this.tocSvc.findEnrolmentByCollectionId(this.userEnrollmentList, (this.baseContentReadData?.identifier || ''));
|
|
1435
|
-
if (enrolledData && enrolledData.completionPercentage) {
|
|
1436
|
-
completionPercentage = enrolledData.completionPercentage;
|
|
1437
|
-
completionStatus = enrolledData.status;
|
|
1438
|
-
}
|
|
1439
|
-
}
|
|
1440
|
-
if (this.content) {
|
|
1441
|
-
this.content.completionPercentage = completionPercentage;
|
|
1442
|
-
this.content.completionStatus = completionStatus;
|
|
1443
|
-
}
|
|
1444
|
-
}
|
|
1445
|
-
handleAcceptRelevent() {
|
|
1446
|
-
this.saveFeedback('', 1);
|
|
1447
|
-
}
|
|
1448
|
-
handleDeclineRelevent() {
|
|
1449
|
-
const dialogRef = this.dialog.open(NonReleventFeedbackDialogComponent, {
|
|
1450
|
-
disableClose: true,
|
|
1451
|
-
width: '502px',
|
|
1452
|
-
panelClass: ['relevent-feedback-dialog'],
|
|
1453
|
-
});
|
|
1454
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
1455
|
-
if (result) {
|
|
1456
|
-
this.saveFeedback(result, 0);
|
|
1457
|
-
dialogRef.close();
|
|
1458
|
-
}
|
|
1459
|
-
else {
|
|
1460
|
-
dialogRef.close();
|
|
1461
|
-
}
|
|
1462
|
-
});
|
|
1463
|
-
}
|
|
1464
|
-
contentViewEventForNetCore(eventType) {
|
|
1465
|
-
if (this.configSvc.netcoreConfig && this.configSvc.netcoreConfig.netcoreWebConfig // NOSONAR
|
|
1466
|
-
&& this.configSvc.netcoreConfig.netcoreWebConfig.isActive // NOSONAR
|
|
1467
|
-
&& this.configSvc.netcoreConfig.netcoreWebConfig.events // NOSONAR
|
|
1468
|
-
&& this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view // NOSONAR
|
|
1469
|
-
&& this.configSvc.netcoreConfig.netcoreWebConfig.events.content_view.isActive // NOSONAR
|
|
1470
|
-
) {
|
|
1471
|
-
let payload = {};
|
|
1472
|
-
// if (this.configSvc && this.configSvc.unMappedUser && this.configSvc.unMappedUser.identifier) { // NOSONAR
|
|
1473
|
-
// payload['pk^userid'] = this.configSvc.unMappedUser.identifier.trim().toLowerCase()
|
|
1474
|
-
// }
|
|
1475
|
-
if (this.content && this.content.name) {
|
|
1476
|
-
payload['content_name'] = this.content.name;
|
|
1477
|
-
}
|
|
1478
|
-
if (this.content && this.content.courseCategory) {
|
|
1479
|
-
payload['content_category'] = this.content.courseCategory;
|
|
1480
|
-
}
|
|
1481
|
-
if (this.content && this.content.identifier) {
|
|
1482
|
-
payload['content_id'] = this.content.identifier;
|
|
1483
|
-
}
|
|
1484
|
-
// if(this.content && this.content.name) {
|
|
1485
|
-
payload['content_url'] = window.location.href;
|
|
1486
|
-
// }
|
|
1487
|
-
if (this.content && this.content.appIcon) {
|
|
1488
|
-
payload['content_image'] = this.content.appIcon;
|
|
1489
|
-
}
|
|
1490
|
-
if (this.content && this.content.duration) {
|
|
1491
|
-
payload['content_duration'] = this.content.duration && Number(this.content.duration) > 0 ? Number(this.content.duration) : 0;
|
|
1492
|
-
}
|
|
1493
|
-
else {
|
|
1494
|
-
payload['content_duration'] = 0;
|
|
1495
|
-
}
|
|
1496
|
-
if (this.content && this.content.avgRating) {
|
|
1497
|
-
payload['content_rating'] = this.content.avgRating;
|
|
1498
|
-
payload['content rating'] = this.content.avgRating;
|
|
1499
|
-
}
|
|
1500
|
-
if (this.content && this.content.totalNoOfRating) {
|
|
1501
|
-
payload['no_users_rated'] = this.content.totalNoOfRating;
|
|
1502
|
-
}
|
|
1503
|
-
// if(this.content && this.content.name) {
|
|
1504
|
-
payload['learning_path_content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
|
|
1505
|
-
payload['learning path content'] = this.userEnrollmentList && this.userEnrollmentList.length ? true : false;
|
|
1506
|
-
// }
|
|
1507
|
-
if (this.content && this.content.source) {
|
|
1508
|
-
payload['content_provider_name'] = this.content.source;
|
|
1509
|
-
}
|
|
1510
|
-
// console.log('payload', payload)
|
|
1511
|
-
if (eventType === 'view') {
|
|
1512
|
-
this.netCoreService.trackEventForContentAndEvent('content_view', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
1513
|
-
}
|
|
1514
|
-
else if (eventType === 'enroll') {
|
|
1515
|
-
this.netCoreService.trackEventForContentAndEvent('content_enrolment', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
1516
|
-
}
|
|
1517
|
-
else if (eventType === 'complete') {
|
|
1518
|
-
this.netCoreService.trackEventForContentAndEvent('content_completion', this.configSvc.unMappedUser.identifier.trim().toLowerCase(), payload);
|
|
1519
|
-
}
|
|
1520
|
-
}
|
|
1521
|
-
}
|
|
1522
|
-
secondsToTime(d) {
|
|
1523
|
-
d = Number(d);
|
|
1524
|
-
var h = Math.floor(d / 3600);
|
|
1525
|
-
var m = Math.floor(d % 3600 / 60);
|
|
1526
|
-
var s = Math.floor(d % 3600 % 60);
|
|
1527
|
-
var hDisplay = h > 0 ? h + (h == 1 ? " hour, " : " hours, ") : "";
|
|
1528
|
-
var mDisplay = m > 0 ? m + (m == 1 ? " minute, " : " minutes, ") : "";
|
|
1529
|
-
var sDisplay = s > 0 ? s + (s == 1 ? " second" : " seconds") : "";
|
|
1530
|
-
return hDisplay + mDisplay + sDisplay;
|
|
1531
|
-
}
|
|
1532
|
-
async saveFeedback(comment, rating = 0) {
|
|
1533
|
-
const payload = {
|
|
1534
|
-
"recommendation_id": this.recommendedCoursesId,
|
|
1535
|
-
"course_id": this.courseID,
|
|
1536
|
-
"rating": rating,
|
|
1537
|
-
"comments": comment,
|
|
1538
|
-
"user_id": this.configSvc.userProfile?.userId || ''
|
|
1539
|
-
};
|
|
1540
|
-
const response = await this.contentLibSvc.saveFeedbackSakshamAI(payload).toPromise().catch(() => { });
|
|
1541
|
-
if (response && response?.message) {
|
|
1542
|
-
this.matSnackbarNew.open('Thank you for your feedback.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['success'] });
|
|
1543
|
-
this.feedbackGiven = { course_id: this.courseID, rating: rating, comments: comment };
|
|
1544
|
-
}
|
|
1545
|
-
else if (!response) {
|
|
1546
|
-
this.matSnackbarNew.open('Something is wrong. Please try again later.', 'X', { duration: SNACKBAR_DURATION, panelClass: ['error'] });
|
|
1547
|
-
}
|
|
1548
|
-
}
|
|
1549
|
-
playResumeForAI() {
|
|
1550
|
-
if (this.content) {
|
|
1551
|
-
if (this.firstResourceLink) {
|
|
1552
|
-
this.router.navigate([this.firstResourceLink.url], { queryParams: this.firstResourceLink.queryParams });
|
|
1553
|
-
}
|
|
1554
|
-
}
|
|
1555
|
-
}
|
|
1556
|
-
enrollUserToAI() {
|
|
1557
|
-
this.fromAITutor = true;
|
|
1558
|
-
this.handleAutoBatchAssign();
|
|
1559
|
-
}
|
|
1560
|
-
openSurveyFormPopup(event) {
|
|
1561
|
-
if (event) {
|
|
1562
|
-
this.openCompletionSurveyFormPopup();
|
|
1563
|
-
}
|
|
1564
|
-
}
|
|
1565
|
-
generatePreAssessmentQuery(type) {
|
|
1566
|
-
if (this.firstResourceLink && (type === 'START' || type === 'START_OVER')) {
|
|
1567
|
-
let qParams = {
|
|
1568
|
-
...this.firstResourceLink.queryParams,
|
|
1569
|
-
viewMode: type,
|
|
1570
|
-
batchId: this.getBatchId(),
|
|
1571
|
-
};
|
|
1572
|
-
if (this.contextId && this.contextPath) {
|
|
1573
|
-
qParams = {
|
|
1574
|
-
...qParams,
|
|
1575
|
-
collectionId: this.contextId,
|
|
1576
|
-
collectionType: this.contextPath,
|
|
1577
|
-
};
|
|
1578
|
-
}
|
|
1579
|
-
if (this.forPreview) {
|
|
1580
|
-
delete qParams.viewMode;
|
|
1581
|
-
}
|
|
1582
|
-
qParams = {
|
|
1583
|
-
...qParams,
|
|
1584
|
-
channelId: this.channelId,
|
|
1585
|
-
};
|
|
1586
|
-
return qParams;
|
|
1587
|
-
}
|
|
1588
|
-
if (this.resumeDataLink && type === 'RESUME') {
|
|
1589
|
-
let qParams = {
|
|
1590
|
-
...this.resumeDataLink.queryParams,
|
|
1591
|
-
batchId: this.getBatchId(),
|
|
1592
|
-
viewMode: 'RESUME',
|
|
1593
|
-
// courseName: this.content ? this.content.name : '',
|
|
1594
|
-
};
|
|
1595
|
-
if (this.contextId && this.contextPath) {
|
|
1596
|
-
qParams = {
|
|
1597
|
-
...qParams,
|
|
1598
|
-
collectionId: this.contextId,
|
|
1599
|
-
collectionType: this.contextPath,
|
|
1600
|
-
};
|
|
1601
|
-
}
|
|
1602
|
-
if (this.forPreview) {
|
|
1603
|
-
delete qParams.viewMode;
|
|
1604
|
-
}
|
|
1605
|
-
qParams = {
|
|
1606
|
-
...qParams,
|
|
1607
|
-
channelId: this.channelId,
|
|
1608
|
-
};
|
|
1609
|
-
return qParams;
|
|
1610
|
-
}
|
|
1611
|
-
if (this.forPreview) {
|
|
1612
|
-
return {};
|
|
1613
|
-
}
|
|
1614
|
-
return {
|
|
1615
|
-
batchId: this.getBatchId(),
|
|
1616
|
-
viewMode: type,
|
|
1617
|
-
};
|
|
1618
|
-
}
|
|
1619
|
-
routeToPreAssessent() {
|
|
1620
|
-
if (this.contentReadData) {
|
|
1621
|
-
// this.generatePreAssessmentQuery('START')
|
|
1622
|
-
let firstResource = this.contentReadData.preEnrolmentResources[0];
|
|
1623
|
-
let mimeType = firstResource?.courseCategory === 'Pre Enrolment Assessment' ? 'application/vnd.sunbird.questionset' : firstResource.mimeType;
|
|
1624
|
-
this.firstResourceLink = viewerRouteGenerator(firstResource.identifier, mimeType, this.contentReadData?.identifier, this.contentReadData?.courseCategory, this.forPreview, this.contentReadData && this.contentReadData.preEnrolmentResources[0]?.primaryCategory || '', '');
|
|
1625
|
-
let routerLink = this.firstResourceLink?.url;
|
|
1626
|
-
let queryParams = this.generatePreAssessmentQuery('START');
|
|
1627
|
-
queryParams = { ...queryParams, preAssessment: 'true' };
|
|
1628
|
-
this.router.navigate([`${routerLink}`], { queryParams });
|
|
1629
|
-
}
|
|
1630
|
-
}
|
|
1631
|
-
getPreAssessmentRequired() {
|
|
1632
|
-
this.preAssessmentRequiredFlag = false;
|
|
1633
|
-
if (this.contentReadData?.preEnrolmentResources?.length) {
|
|
1634
|
-
this.contentReadData?.preEnrolmentResources?.forEach((item) => {
|
|
1635
|
-
if (item && item?.isMandatory) {
|
|
1636
|
-
this.preAssessmentRequiredFlag = true;
|
|
1637
|
-
}
|
|
1638
|
-
});
|
|
1639
|
-
}
|
|
1640
|
-
}
|
|
1641
|
-
getPreAssessmentCompletionStatus() {
|
|
1642
|
-
this.preAssessmentCompletionStatus = false;
|
|
1643
|
-
let preEnrollmentResourcesArr = [];
|
|
1644
|
-
let preEnrollmentMandatoryResourcesArr = [];
|
|
1645
|
-
if (this.contentReadData?.preEnrolmentResources?.length) {
|
|
1646
|
-
this.contentReadData?.preEnrolmentResources?.forEach((item) => {
|
|
1647
|
-
preEnrollmentResourcesArr.push(item?.identifier);
|
|
1648
|
-
if (item && item?.isMandatory) {
|
|
1649
|
-
preEnrollmentMandatoryResourcesArr.push(item?.identifier);
|
|
1650
|
-
}
|
|
1651
|
-
});
|
|
1652
|
-
}
|
|
1653
|
-
if (preEnrollmentResourcesArr && preEnrollmentResourcesArr.length) {
|
|
1654
|
-
let req = {
|
|
1655
|
-
"request": {
|
|
1656
|
-
"contentIds": preEnrollmentResourcesArr,
|
|
1657
|
-
"fields": []
|
|
1658
|
-
}
|
|
1659
|
-
};
|
|
1660
|
-
this.tocSvc.readPreEnrollmentResourcesState(req).subscribe((data) => {
|
|
1661
|
-
let mandatoryIdsCompleted = [];
|
|
1662
|
-
if (data && data.result && data.result.contentList && data.result.contentList.length) {
|
|
1663
|
-
for (let i = 0; i < data.result.contentList.length; i++) {
|
|
1664
|
-
if (data.result.contentList[i]['status'] === 2 && preEnrollmentMandatoryResourcesArr.includes(data.result.contentList[i]['contentId'])) {
|
|
1665
|
-
mandatoryIdsCompleted.push(data.result.contentList[i]['contentId']);
|
|
1666
|
-
}
|
|
1667
|
-
}
|
|
1668
|
-
if (preEnrollmentResourcesArr?.length === data.result.contentList?.length) {
|
|
1669
|
-
this.preAssessmentCompletionStatus = true;
|
|
1670
|
-
}
|
|
1671
|
-
else if (mandatoryIdsCompleted.length === preEnrollmentMandatoryResourcesArr.length) {
|
|
1672
|
-
this.preAssessmentCompletionStatus = true;
|
|
1673
|
-
}
|
|
1674
|
-
else {
|
|
1675
|
-
this.preAssessmentCompletionStatus = false;
|
|
1676
|
-
}
|
|
1677
|
-
}
|
|
1678
|
-
else {
|
|
1679
|
-
this.preAssessmentCompletionStatus = false;
|
|
1680
|
-
}
|
|
1681
|
-
});
|
|
1682
|
-
}
|
|
1683
|
-
}
|
|
1684
|
-
ngOnInit() {
|
|
1685
|
-
this.dataTransferSvc.setEnrollData(null);
|
|
1686
|
-
this.getServerDateTime();
|
|
1687
|
-
this.mobile1200 = window.innerWidth < 1201;
|
|
1688
|
-
this.getI18NTranslations();
|
|
1689
|
-
this.loadLearnerAdvisoryData();
|
|
1690
|
-
this.setupSelectedBatchSubscription();
|
|
1691
|
-
this.setChannelId();
|
|
1692
|
-
this.checkIframeContext();
|
|
1693
|
-
this.queryParamsData = this.setupRouteSubscriptions();
|
|
1694
|
-
this.setupFragmentSubscription();
|
|
1695
|
-
this.setupBatchSubscriptions();
|
|
1696
|
-
this.configureDefaultLogo();
|
|
1697
|
-
this.configureFeatureFlags();
|
|
1698
|
-
this.checkRegistrationStatus();
|
|
1699
|
-
this.setupRouterEventSubscription();
|
|
1700
|
-
this.getContentCreatorData();
|
|
1701
|
-
}
|
|
1702
|
-
initData(data) {
|
|
1703
|
-
const initData = this.tocSvc.initData(data, true);
|
|
1704
|
-
this.setErrorCode(initData.errorCode);
|
|
1705
|
-
this.initializeTocStructure();
|
|
1706
|
-
this.setupBatchControlSubscription();
|
|
1707
|
-
this.tocSvc.contentLoader.next(false);
|
|
1708
|
-
}
|
|
1709
|
-
setErrorCode(errorCode) {
|
|
1710
|
-
this.errorCode = errorCode;
|
|
1711
|
-
switch (this.errorCode) {
|
|
1712
|
-
case NsAppToc.EWsTocErrorCode.API_FAILURE:
|
|
1713
|
-
case NsAppToc.EWsTocErrorCode.INVALID_DATA:
|
|
1714
|
-
case NsAppToc.EWsTocErrorCode.NO_DATA:
|
|
1715
|
-
this.errorWidgetData.widgetData.errorType = ErrorType.internalServer;
|
|
1716
|
-
break;
|
|
1717
|
-
default:
|
|
1718
|
-
this.errorWidgetData.widgetData.errorType = ErrorType.somethingWrong;
|
|
1719
|
-
break;
|
|
1720
|
-
}
|
|
1721
|
-
}
|
|
1722
|
-
initializeTocStructure() {
|
|
1723
|
-
this.contentParents = {};
|
|
1724
|
-
this.tocStructure = {
|
|
1725
|
-
assessment: 0,
|
|
1726
|
-
course: 0,
|
|
1727
|
-
handsOn: 0,
|
|
1728
|
-
interactiveVideo: 0,
|
|
1729
|
-
learningModule: 0,
|
|
1730
|
-
other: 0,
|
|
1731
|
-
pdf: 0,
|
|
1732
|
-
survey: 0,
|
|
1733
|
-
podcast: 0,
|
|
1734
|
-
practiceTest: 0,
|
|
1735
|
-
finalTest: 0,
|
|
1736
|
-
quiz: 0,
|
|
1737
|
-
video: 0,
|
|
1738
|
-
webModule: 0,
|
|
1739
|
-
webPage: 0,
|
|
1740
|
-
youtube: 0,
|
|
1741
|
-
interactivecontent: 0,
|
|
1742
|
-
offlineSession: 0,
|
|
1743
|
-
};
|
|
1744
|
-
}
|
|
1745
|
-
setupBatchControlSubscription() {
|
|
1746
|
-
this.batchControl.valueChanges.subscribe((batch) => {
|
|
1747
|
-
if (batch) {
|
|
1748
|
-
this.handleBatchEnrollment(batch);
|
|
1749
|
-
}
|
|
1750
|
-
});
|
|
1751
|
-
}
|
|
1752
|
-
handleBatchEnrollment(batch) {
|
|
1753
|
-
this.disableEnrollBtn = true;
|
|
1754
|
-
let userId = this.configSvc.userProfile?.userId || '';
|
|
1755
|
-
const req = {
|
|
1756
|
-
request: {
|
|
1757
|
-
userId,
|
|
1758
|
-
courseId: batch.courseId,
|
|
1759
|
-
batchId: batch.batchId,
|
|
1760
|
-
},
|
|
1761
|
-
};
|
|
1762
|
-
this.contentSvc.enrollUserToBatch(req).then((datab) => {
|
|
1763
|
-
if (datab?.result?.response === 'SUCCESS') {
|
|
1764
|
-
this.handleSuccessfulEnrollment(batch);
|
|
1765
|
-
}
|
|
1766
|
-
else {
|
|
1767
|
-
this.handleEnrollmentFailure();
|
|
1768
|
-
}
|
|
1769
|
-
});
|
|
1770
|
-
}
|
|
1771
|
-
handleSuccessfulEnrollment(batch) {
|
|
1772
|
-
this.batchData = {
|
|
1773
|
-
content: [batch],
|
|
1774
|
-
enrolled: true,
|
|
1775
|
-
};
|
|
1776
|
-
this.tocSvc.getSelectedBatchData(this.batchData);
|
|
1777
|
-
this.tocSvc.mapSessionCompletionPercentage(this.batchData);
|
|
1778
|
-
this.routerChangeHandler(true);
|
|
1779
|
-
this.openSnackbar('Enrolled Successfully!');
|
|
1780
|
-
this.disableEnrollBtn = false;
|
|
1781
|
-
}
|
|
1782
|
-
handleEnrollmentFailure() {
|
|
1783
|
-
this.openSnackbar('Something went wrong, please try again later!');
|
|
1784
|
-
this.disableEnrollBtn = false;
|
|
1785
|
-
}
|
|
1786
|
-
loadLearnerAdvisoryData() {
|
|
1787
|
-
if (this.route.snapshot.data.pageData && this.route.snapshot.data.pageData.data) {
|
|
1788
|
-
this.learnAdvisoryData = this.route.snapshot.data.pageData.data.learnerAdvisory;
|
|
1789
|
-
}
|
|
1790
|
-
}
|
|
1791
|
-
setupSelectedBatchSubscription() {
|
|
1792
|
-
this.selectedBatchSubscription = this.tocSvc.getSelectedBatch.subscribe(batchData => {
|
|
1793
|
-
this.selectedBatchData = batchData;
|
|
1794
|
-
});
|
|
1795
|
-
}
|
|
1796
|
-
setChannelId() {
|
|
1797
|
-
this.channelId = this.telemetryService.telemetryConfig
|
|
1798
|
-
? this.telemetryService.telemetryConfig.channel
|
|
1799
|
-
: '';
|
|
1800
|
-
}
|
|
1801
|
-
checkIframeContext() {
|
|
1802
|
-
try {
|
|
1803
|
-
this.isInIframe = window.self !== window.top;
|
|
1804
|
-
}
|
|
1805
|
-
catch (_ex) {
|
|
1806
|
-
this.isInIframe = false;
|
|
1807
|
-
}
|
|
1808
|
-
}
|
|
1809
|
-
setupRouteSubscriptions() {
|
|
1810
|
-
let queryParamstemp = {};
|
|
1811
|
-
if (this.route) {
|
|
1812
|
-
this.skeletonLoader = true;
|
|
1813
|
-
this.routeSubscription = this.route.data.subscribe(async (data) => {
|
|
1814
|
-
if (data?.content?.data?.identifier) {
|
|
1815
|
-
queryParamstemp = await this.processRouteData(data);
|
|
1816
|
-
}
|
|
1817
|
-
});
|
|
1818
|
-
}
|
|
1819
|
-
return queryParamstemp;
|
|
1820
|
-
}
|
|
1821
|
-
async processRouteData(data) {
|
|
1822
|
-
this.courseID = data.content.data.identifier;
|
|
1823
|
-
const initData = this.tocSvc.initData(data, true);
|
|
1824
|
-
// Get query parameters
|
|
1825
|
-
const queryParamsDataTemp = await this.getQueryParams();
|
|
1826
|
-
// Handle multilingual content if mlId is present in query parameters
|
|
1827
|
-
if (queryParamsDataTemp.MLId) {
|
|
1828
|
-
// Store the original content data for reference
|
|
1829
|
-
this.baseContentReadData = initData.content;
|
|
1830
|
-
// Fetch the multilingual content
|
|
1831
|
-
try {
|
|
1832
|
-
const success = await this.fetchContentRead(queryParamsDataTemp.MLId);
|
|
1833
|
-
if (!success) {
|
|
1834
|
-
// If multilingual content fetch fails, fall back to the original content
|
|
1835
|
-
this.contentReadData = initData.content;
|
|
1836
|
-
this.loggerSvc.warn('Failed to load multilingual content, using original content instead');
|
|
1837
|
-
}
|
|
1838
|
-
}
|
|
1839
|
-
catch (error) {
|
|
1840
|
-
// On error, use the original content
|
|
1841
|
-
this.contentReadData = initData.content;
|
|
1842
|
-
this.loggerSvc.error('Error loading multilingual content:', error);
|
|
1843
|
-
this.snackBar.open('Failed to load content in selected language', 'X', {
|
|
1844
|
-
duration: 3000,
|
|
1845
|
-
});
|
|
1846
|
-
}
|
|
1847
|
-
}
|
|
1848
|
-
else {
|
|
1849
|
-
// No multilingual content requested, use the original content
|
|
1850
|
-
this.contentReadData = initData.content;
|
|
1851
|
-
this.baseContentReadData = initData.content;
|
|
1852
|
-
}
|
|
1853
|
-
// Added to make sure this reference was incorrect, assigning again to make sure global variable is properly updated
|
|
1854
|
-
this.queryParamsData = queryParamsDataTemp;
|
|
1855
|
-
// Continue with the rest of the processing
|
|
1856
|
-
this.loadLanguageData();
|
|
1857
|
-
this.getPreAssessmentCompletionStatus();
|
|
1858
|
-
this.getPreAssessmentRequired();
|
|
1859
|
-
await this.handleContentPreviewOrEnrollment();
|
|
1860
|
-
this.initialrouteData = data;
|
|
1861
|
-
this.loadBannerAndTocConfig(data);
|
|
1862
|
-
this.fetchPostAssessmentStatusIfNeeded();
|
|
1863
|
-
this.initData(data);
|
|
1864
|
-
// to clear public survey data if any on load,
|
|
1865
|
-
// if not cleared then it will be cleared on popup close,
|
|
1866
|
-
// but the teachers notes will be visible on ciming back from player page
|
|
1867
|
-
const surveyId = this.environment.publicContentSurveyId || '';
|
|
1868
|
-
const courseId = this.contentReadData?.identifier || '';
|
|
1869
|
-
this.clearExistingPublicSurveyData(surveyId, courseId);
|
|
1870
|
-
return queryParamsDataTemp;
|
|
1871
|
-
}
|
|
1872
|
-
openCompletionSurveyFormPopup() {
|
|
1873
|
-
if (this.baseContentReadData && _.get(this.baseContentReadData, 'completionSurveyLink')) {
|
|
1874
|
-
const sID = this.baseContentReadData.completionSurveyLink.split('surveys/');
|
|
1875
|
-
const surveyId = sID[1];
|
|
1876
|
-
const data = {
|
|
1877
|
-
surveyId,
|
|
1878
|
-
courseName: this.contentReadData?.name || '',
|
|
1879
|
-
courseID: this.contentReadData?.identifier || '',
|
|
1880
|
-
contextOrgId: this.contentReadData?.createdFor && this.contentReadData?.createdFor.length > 0 ?
|
|
1881
|
-
this.contentReadData?.createdFor[0] : ''
|
|
1882
|
-
};
|
|
1883
|
-
const dialogRef = this.dialog.open(CompletionSurveyFormComponent, {
|
|
1884
|
-
disableClose: true,
|
|
1885
|
-
width: '750px',
|
|
1886
|
-
maxWidth: '90vw',
|
|
1887
|
-
data: data,
|
|
1888
|
-
autoFocus: false,
|
|
1889
|
-
});
|
|
1890
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
1891
|
-
if (result) {
|
|
1892
|
-
this.openConfirmationDialog();
|
|
1893
|
-
}
|
|
1894
|
-
else {
|
|
1895
|
-
this.lockCertificate = true;
|
|
1896
|
-
}
|
|
1897
|
-
});
|
|
1898
|
-
}
|
|
1899
|
-
}
|
|
1900
|
-
openConfirmationDialog() {
|
|
1901
|
-
const dialogData = {
|
|
1902
|
-
messages: [
|
|
1903
|
-
{
|
|
1904
|
-
message: this.translate.instant('apptoc.surveySubmitted'),
|
|
1905
|
-
classes: 'dialog-title'
|
|
1906
|
-
},
|
|
1907
|
-
{
|
|
1908
|
-
message: this.translate.instant('apptoc.surveyCompletedCertificateGenerating'),
|
|
1909
|
-
classes: 'dialog-description mb-2'
|
|
1910
|
-
}
|
|
1911
|
-
],
|
|
1912
|
-
iconName: 'check_circle',
|
|
1913
|
-
type: 'primary',
|
|
1914
|
-
buttonsPositionClass: 'justify-center items-center',
|
|
1915
|
-
buttons: [
|
|
1916
|
-
{
|
|
1917
|
-
classes: 'succes-button width-full',
|
|
1918
|
-
text: this.translate.instant('apptoc.returnToProgramPage'),
|
|
1919
|
-
response: true
|
|
1920
|
-
}
|
|
1921
|
-
]
|
|
1922
|
-
};
|
|
1923
|
-
const dialogRef = this.dialog.open(ConfirmationDialogComponent, {
|
|
1924
|
-
data: dialogData,
|
|
1925
|
-
disableClose: true,
|
|
1926
|
-
width: '500px',
|
|
1927
|
-
maxWidth: '90vw'
|
|
1928
|
-
});
|
|
1929
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
1930
|
-
if (result) {
|
|
1931
|
-
this.lockCertificate = false;
|
|
1932
|
-
}
|
|
1933
|
-
});
|
|
1934
|
-
}
|
|
1935
|
-
loadLanguageData() {
|
|
1936
|
-
this.languageList = this.contentLangSvc.getAllContentLanguages(this.contentReadData);
|
|
1937
|
-
this.selectedLanguage = this.contentLangSvc.getSelectedLanguage(this.contentReadData);
|
|
1938
|
-
}
|
|
1939
|
-
async handleContentPreviewOrEnrollment() {
|
|
1940
|
-
if (this.forPreview) {
|
|
1941
|
-
await this.loadContentForPreview();
|
|
1942
|
-
}
|
|
1943
|
-
else {
|
|
1944
|
-
// // If we're working with multilingual content, make sure to fetch its hierarchy
|
|
1945
|
-
// if (this.queryParamsData.mlId && this.contentReadData &&
|
|
1946
|
-
// this.contentReadData.identifier === this.queryParamsData.mlId) {
|
|
1947
|
-
// // Fetch content hierarchy for the multilingual content
|
|
1948
|
-
// try {
|
|
1949
|
-
// await this.fetchContentHierarchy(this.contentReadData.identifier);
|
|
1950
|
-
// // After fetching hierarchy, update UI components
|
|
1951
|
-
// this.getLearningUrls();
|
|
1952
|
-
// } catch (error) {
|
|
1953
|
-
// this.loggerSvc.error('Error fetching hierarchy for multilingual content:', error);
|
|
1954
|
-
// }
|
|
1955
|
-
// }
|
|
1956
|
-
// Continue with regular enrollment flow
|
|
1957
|
-
this.fetchUserEnrollmentDataV2();
|
|
1958
|
-
}
|
|
1959
|
-
}
|
|
1960
|
-
async loadContentForPreview() {
|
|
1961
|
-
this.tocSvc.contentLoader.next(true);
|
|
1962
|
-
await this.fetchContentHierarchy(this.contentReadData?.identifier || '');
|
|
1963
|
-
this.tocSvc.contentLoader.next(false);
|
|
1964
|
-
this.tocSvc.checkModuleWiseData(this.content);
|
|
1965
|
-
this.skeletonLoader = false;
|
|
1966
|
-
}
|
|
1967
|
-
loadBannerAndTocConfig(data) {
|
|
1968
|
-
this.banners = data.pageData.data.banners;
|
|
1969
|
-
this.tocSvc.subtitleOnBanners = data.pageData.data.subtitleOnBanners || false;
|
|
1970
|
-
this.tocSvc.showDescription = data.pageData.data.showDescription || false;
|
|
1971
|
-
this.tocConfig = data.pageData.data;
|
|
1972
|
-
this.kparray = this.tocConfig.karmaPoints;
|
|
1973
|
-
}
|
|
1974
|
-
fetchPostAssessmentStatusIfNeeded() {
|
|
1975
|
-
if (this.content && this.isPostAssessment) {
|
|
1976
|
-
this.tocSvc.fetchPostAssessmentStatus(this.content.identifier).subscribe(res => {
|
|
1977
|
-
const assessmentData = res.result;
|
|
1978
|
-
for (const o of assessmentData) {
|
|
1979
|
-
if (o.contentId === (this.content && this.content.identifier)) {
|
|
1980
|
-
this.showTakeAssessment = o;
|
|
1981
|
-
break;
|
|
1982
|
-
}
|
|
1983
|
-
}
|
|
1984
|
-
});
|
|
1985
|
-
}
|
|
1986
|
-
}
|
|
1987
|
-
setupFragmentSubscription() {
|
|
1988
|
-
this.currentFragment = 'overview';
|
|
1989
|
-
this.route.fragment.subscribe((fragment) => {
|
|
1990
|
-
this.currentFragment = fragment || 'overview';
|
|
1991
|
-
});
|
|
1992
|
-
}
|
|
1993
|
-
setupBatchSubscriptions() {
|
|
1994
|
-
this.batchSubscription = this.tocSvc.batchReplaySubject.subscribe(() => this.handleBatchUpdate(), () => this.loggerSvc.error('error on batchSubscription'));
|
|
1995
|
-
this.batchDataSubscription = this.tocSvc.setBatchDataSubject.subscribe(() => this.handleBlendedProgramUpdate(), () => this.loggerSvc.error('error on batchDataSubscription'));
|
|
1996
|
-
}
|
|
1997
|
-
handleBatchUpdate() {
|
|
1998
|
-
this.fetchBatchDetails();
|
|
1999
|
-
if (this.content?.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
|
|
2000
|
-
this.fetchUserWFForBlended();
|
|
2001
|
-
}
|
|
2002
|
-
}
|
|
2003
|
-
handleBlendedProgramUpdate() {
|
|
2004
|
-
if (this.content?.primaryCategory === this.primaryCategory.BLENDED_PROGRAM) {
|
|
2005
|
-
this.fetchUserWFForBlended();
|
|
2006
|
-
}
|
|
2007
|
-
}
|
|
2008
|
-
configureDefaultLogo() {
|
|
2009
|
-
const instanceConfig = this.configSvc.instanceConfig;
|
|
2010
|
-
if (instanceConfig?.logos?.defaultSourceLogo) {
|
|
2011
|
-
this.defaultSLogo = instanceConfig.logos.defaultSourceLogo;
|
|
2012
|
-
}
|
|
2013
|
-
}
|
|
2014
|
-
configureFeatureFlags() {
|
|
2015
|
-
if (this.configSvc.restrictedFeatures) {
|
|
2016
|
-
this.isGoalsEnabled = !this.configSvc.restrictedFeatures.has('goals');
|
|
2017
|
-
this.isRegistrationSupported = this.configSvc.restrictedFeatures.has('registrationExternal');
|
|
2018
|
-
this.showIntranetMessage = !this.configSvc.restrictedFeatures.has('showIntranetMessageDesktop');
|
|
2019
|
-
}
|
|
2020
|
-
}
|
|
2021
|
-
setupRouterEventSubscription() {
|
|
2022
|
-
this.routerParamSubscription = this.router.events.subscribe((routerEvent) => {
|
|
2023
|
-
if (routerEvent instanceof NavigationEnd) {
|
|
2024
|
-
this.assignPathAndUpdateBanner(routerEvent.url);
|
|
2025
|
-
}
|
|
2026
|
-
});
|
|
2027
|
-
}
|
|
2028
|
-
fetchUserEnrollmentDataV2() {
|
|
2029
|
-
const identifier = this.baseContentReadData?.identifier || '';
|
|
2030
|
-
if (!identifier) {
|
|
2031
|
-
this.loggerSvc.error('Cannot fetch enrollment data: content identifier is missing');
|
|
2032
|
-
this.userEnrollmentList = [];
|
|
2033
|
-
this.checkIfUserEnrolled();
|
|
2034
|
-
return;
|
|
2035
|
-
}
|
|
2036
|
-
const request = {
|
|
2037
|
-
request: {
|
|
2038
|
-
retiredCoursesEnabled: true,
|
|
2039
|
-
courseId: [identifier]
|
|
2040
|
-
}
|
|
2041
|
-
};
|
|
2042
|
-
this.enrollSvc.fetchEnrollContentData(request).pipe(takeUntil(this.destroySubject$), switchMap((res) => {
|
|
2043
|
-
if (res?.result?.courses?.length) {
|
|
2044
|
-
this.userEnrollmentList = res.result.courses;
|
|
2045
|
-
// Check for completed content
|
|
2046
|
-
const completedContentData = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier &&
|
|
2047
|
-
el.completionPercentage === 100);
|
|
2048
|
-
if (completedContentData) {
|
|
2049
|
-
this.contentViewEventForNetCore('complete');
|
|
2050
|
-
}
|
|
2051
|
-
this.dataTransferSvc.setEnrollData(this.userEnrollmentList);
|
|
2052
|
-
// in case of back from player we need to check recent language and load
|
|
2053
|
-
if (!this.contentLibSvc?.oneStepResumeEnable && this.baseContentReadData?.identifier === this.contentReadData?.identifier) {
|
|
2054
|
-
let lang = this.baseContentReadData?.language.length ? this.baseContentReadData?.language[0] : '';
|
|
2055
|
-
let baseContentFromEnrollData = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier);
|
|
2056
|
-
if (lang && baseContentFromEnrollData && baseContentFromEnrollData?.recent_language?.toLowerCase() !== lang) {
|
|
2057
|
-
let localLang = this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, baseContentFromEnrollData?.recent_language);
|
|
2058
|
-
if (localLang && Object.keys(localLang).length) {
|
|
2059
|
-
this.processLanguageSelection(this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, baseContentFromEnrollData?.recent_language));
|
|
2060
|
-
}
|
|
2061
|
-
else {
|
|
2062
|
-
this.processLanguageSelection(this.contentLangSvc.getSelectedLanguage(this.contentReadData));
|
|
2063
|
-
}
|
|
2064
|
-
}
|
|
2065
|
-
return of(false);
|
|
2066
|
-
}
|
|
2067
|
-
else {
|
|
2068
|
-
// Always call fetchContentHierarchy first
|
|
2069
|
-
return from(this.fetchContentHierarchy(this.contentReadData?.identifier || ''));
|
|
2070
|
-
}
|
|
2071
|
-
}
|
|
2072
|
-
else {
|
|
2073
|
-
this.userEnrollmentList = [];
|
|
2074
|
-
// Check if we have content ID from either content or contentReadData
|
|
2075
|
-
const contentId = this.contentReadData?.identifier || this.baseContentReadData?.identifier || '';
|
|
2076
|
-
if (!contentId) {
|
|
2077
|
-
this.loggerSvc.error('Cannot fetch hierarchy: content identifier is missing');
|
|
2078
|
-
return of(false);
|
|
2079
|
-
}
|
|
2080
|
-
// Fetch hierarchy content for additional data
|
|
2081
|
-
return from(this.fetchContentHierarchy(contentId));
|
|
2082
|
-
}
|
|
2083
|
-
}),
|
|
2084
|
-
// Add catchError here to handle errors from fetchContentHierarchy
|
|
2085
|
-
catchError(error => {
|
|
2086
|
-
this.loggerSvc.error('Error in enrollment data processing', error);
|
|
2087
|
-
return of(false);
|
|
2088
|
-
})).subscribe({
|
|
2089
|
-
next: () => {
|
|
2090
|
-
if (this.userEnrollmentList?.length && this.contentLibSvc?.oneStepResumeEnable) {
|
|
2091
|
-
this.handleOneStepResume();
|
|
2092
|
-
this.checkIfUserEnrolled();
|
|
2093
|
-
}
|
|
2094
|
-
else {
|
|
2095
|
-
this.checkIfUserEnrolled();
|
|
2096
|
-
}
|
|
2097
|
-
},
|
|
2098
|
-
error: (error) => {
|
|
2099
|
-
this.loggerSvc.error('Failed to fetch user enrollment data', error);
|
|
2100
|
-
this.userEnrollmentList = [];
|
|
2101
|
-
this.checkIfUserEnrolled();
|
|
2102
|
-
},
|
|
2103
|
-
complete: () => {
|
|
2104
|
-
// Optional completion handler if needed
|
|
2105
|
-
}
|
|
2106
|
-
});
|
|
2107
|
-
}
|
|
2108
|
-
async handleOneStepResume() {
|
|
2109
|
-
try {
|
|
2110
|
-
if (!this.content) {
|
|
2111
|
-
this.loggerSvc.error('Content not available for one-step resume');
|
|
2112
|
-
}
|
|
2113
|
-
const foundContent = this.userEnrollmentList.find((el) => el.collectionId === this.baseContentReadData?.identifier);
|
|
2114
|
-
if (!foundContent) {
|
|
2115
|
-
this.loggerSvc.warn('No matching enrolled content found for one-step resume');
|
|
2116
|
-
}
|
|
2117
|
-
const urlData = await this.contentLibSvc.getResourseLink(this.content, [foundContent], true, this.baseContentReadData, this.contentReadData?.identifier || '');
|
|
2118
|
-
if (!urlData) {
|
|
2119
|
-
this.loggerSvc.warn('No URL data returned for one-step resume');
|
|
2120
|
-
}
|
|
2121
|
-
if (urlData?.url) {
|
|
2122
|
-
if (urlData.url.includes('app/toc')) {
|
|
2123
|
-
this.contentLibSvc.oneStepResumeEnable = false;
|
|
2124
|
-
}
|
|
2125
|
-
else {
|
|
2126
|
-
this.contentLibSvc.oneStepResumeEnable = false;
|
|
2127
|
-
// When coming from search page for particular language content, confirm first to one step resume or load the searched language
|
|
2128
|
-
if (urlData?.queryParams?.ML && (urlData?.queryParams?.ML !== this.queryParamsData['ML'])) {
|
|
2129
|
-
this.showOneStepResumeConfirm(urlData);
|
|
2130
|
-
}
|
|
2131
|
-
else {
|
|
2132
|
-
this.router.navigate([urlData.url], { queryParams: urlData.queryParams });
|
|
2133
|
-
}
|
|
2134
|
-
}
|
|
2135
|
-
}
|
|
2136
|
-
}
|
|
2137
|
-
catch (error) {
|
|
2138
|
-
this.loggerSvc.error('Error in handleOneStepResume', error);
|
|
2139
|
-
this.contentLibSvc.oneStepResumeEnable = false;
|
|
2140
|
-
}
|
|
2141
|
-
}
|
|
2142
|
-
fetchContentHierarchy(identifier) {
|
|
2143
|
-
if (this.baseContentReadData?.courseCategory === 'Learning Pathway') {
|
|
2144
|
-
return new Promise((resolve) => {
|
|
2145
|
-
const content = this.baseContentReadData;
|
|
2146
|
-
this.content = this.appTocV2Svc.constructHeirarchyData(content);
|
|
2147
|
-
this.appTocV2Svc.mapContentHierarchyProgressUpdate(this.content, this.userEnrollmentList);
|
|
2148
|
-
// Create hashmap and compute milestone locking after progress is updated
|
|
2149
|
-
this.tocSvc.callHirarchyProgressHashmap(this.content);
|
|
2150
|
-
// Compute milestone locking status with updated progress data
|
|
2151
|
-
this.tocSvc.computeMilestoneLockingStatus();
|
|
2152
|
-
// Sync content tree's isLocked with computed values
|
|
2153
|
-
this.syncMilestoneLockStatus();
|
|
2154
|
-
this.getOrgIdForShare();
|
|
2155
|
-
this.getTocStructure();
|
|
2156
|
-
console.log('content after locking sync', this.content);
|
|
2157
|
-
console.log('hashmap after locking', this.tocSvc.hashmap);
|
|
2158
|
-
resolve(true);
|
|
2159
|
-
return;
|
|
2160
|
-
});
|
|
2161
|
-
}
|
|
2162
|
-
else {
|
|
2163
|
-
return new Promise((resolve, reject) => {
|
|
2164
|
-
if (!identifier) {
|
|
2165
|
-
resolve(false);
|
|
2166
|
-
return;
|
|
2167
|
-
}
|
|
2168
|
-
// Make sure fetchHierarchyContent returns an Observable
|
|
2169
|
-
const observable = this.contentSvc.fetchHierarchyContent(identifier, 'detail');
|
|
2170
|
-
if (!observable) {
|
|
2171
|
-
this.loggerSvc.error('fetchHierarchyContent did not return an Observable');
|
|
2172
|
-
resolve(false);
|
|
2173
|
-
return;
|
|
2174
|
-
}
|
|
2175
|
-
const subscription = observable.subscribe({
|
|
2176
|
-
next: (response) => {
|
|
2177
|
-
if (response?.result?.content) {
|
|
2178
|
-
this.content = response.result.content;
|
|
2179
|
-
this.getOrgIdForShare();
|
|
2180
|
-
this.getTocStructure();
|
|
2181
|
-
if (!this.forPreview) {
|
|
2182
|
-
this.userRating = undefined;
|
|
2183
|
-
this.getUserRating(false);
|
|
2184
|
-
}
|
|
2185
|
-
resolve(true);
|
|
2186
|
-
}
|
|
2187
|
-
else {
|
|
2188
|
-
resolve(false);
|
|
2189
|
-
}
|
|
2190
|
-
subscription.unsubscribe();
|
|
2191
|
-
},
|
|
2192
|
-
error: (error) => {
|
|
2193
|
-
this.loggerSvc.error('Failed to fetch hierarchy content', error);
|
|
2194
|
-
reject(error);
|
|
2195
|
-
subscription.unsubscribe();
|
|
2196
|
-
}
|
|
2197
|
-
});
|
|
2198
|
-
});
|
|
2199
|
-
}
|
|
2200
|
-
}
|
|
2201
|
-
getTocStructure() {
|
|
2202
|
-
this.initializeTocStructure();
|
|
2203
|
-
if (this.content && this.tocStructure) {
|
|
2204
|
-
this.hasTocStructure = false;
|
|
2205
|
-
this.tocStructure.learningModule = this.content.primaryCategory === this.primaryCategory.MODULE ? -1 : 0;
|
|
2206
|
-
this.tocStructure.course = this.content.primaryCategory === this.primaryCategory.COURSE ? -1 : 0;
|
|
2207
|
-
this.tocStructure = this.tocSvc.getTocStructure(this.content, this.tocStructure);
|
|
2208
|
-
for (const progType in this.tocStructure) {
|
|
2209
|
-
if (this.tocStructure[progType] > 0) {
|
|
2210
|
-
this.hasTocStructure = true;
|
|
2211
|
-
break;
|
|
2212
|
-
}
|
|
2213
|
-
}
|
|
2214
|
-
// from ngOnChanges
|
|
2215
|
-
this.fetchExternalContentAccess();
|
|
2216
|
-
this.modifySensibleContentRating();
|
|
2217
|
-
this.assignPathAndUpdateBanner(this.router.url);
|
|
2218
|
-
this.getLearningUrls();
|
|
2219
|
-
}
|
|
2220
|
-
}
|
|
2221
|
-
/**
|
|
2222
|
-
* Sync milestone isLocked property with computed locking status from hashmap
|
|
2223
|
-
* This ensures the content tree reflects the actual lock status
|
|
2224
|
-
*/
|
|
2225
|
-
syncMilestoneLockStatus() {
|
|
2226
|
-
if (!this.content || !this.content.children)
|
|
2227
|
-
return;
|
|
2228
|
-
this.content.children.forEach((child) => {
|
|
2229
|
-
if (child.primaryCategory === 'Milestone' && child.identifier) {
|
|
2230
|
-
const hashData = this.tocSvc.hashmap[child.identifier];
|
|
2231
|
-
if (hashData && hashData.computedIsLocked !== undefined) {
|
|
2232
|
-
child.isLocked = hashData.computedIsLocked;
|
|
2233
|
-
console.log(`Synced milestone ${child.identifier} (${child.name}) isLocked: ${child.isLocked}`);
|
|
2234
|
-
}
|
|
2235
|
-
}
|
|
2236
|
-
});
|
|
2237
|
-
}
|
|
2238
|
-
onLanguageSelect(lang) {
|
|
2239
|
-
// Check if the selected language is already set
|
|
2240
|
-
if (this.selectedLanguage && this.selectedLanguage.identifier === lang.identifier) {
|
|
2241
|
-
console.log('Language is already selected:', lang.name);
|
|
2242
|
-
return; // Exit the function if the language is the same
|
|
2243
|
-
}
|
|
2244
|
-
if (this.userEnrollmentList && this.userEnrollmentList.length) {
|
|
2245
|
-
let data = {};
|
|
2246
|
-
// TODO: Remove hardcode strings
|
|
2247
|
-
const enrolledCourse = this.tocSvc.findEnrolmentByCollectionId(this.userEnrollmentList, (this.baseContentReadData?.identifier || ''));
|
|
2248
|
-
if (enrolledCourse && enrolledCourse.status === 2) {
|
|
2249
|
-
this.processLanguageSelection(lang);
|
|
2250
|
-
}
|
|
2251
|
-
else {
|
|
2252
|
-
// If there is progress in the selected language,
|
|
2253
|
-
if (this.languageMapProgress && this.languageMapProgress[lang.langId] > 0) {
|
|
2254
|
-
data = {
|
|
2255
|
-
width: '500px',
|
|
2256
|
-
height: 'auto',
|
|
2257
|
-
data: {
|
|
2258
|
-
from: 'languageSwitch',
|
|
2259
|
-
icon: 'translate',
|
|
2260
|
-
header: `Continue where you left off in ${lang.name}?`,
|
|
2261
|
-
message: `You've already made some progress in this language.\n If you continue it will resume from where you left off.`,
|
|
2262
|
-
cancelButton: 'Back',
|
|
2263
|
-
acceptButton: 'Resume',
|
|
2264
|
-
}
|
|
2265
|
-
};
|
|
2266
|
-
}
|
|
2267
|
-
else {
|
|
2268
|
-
// If there is no progress in the selected language, or first time selection
|
|
2269
|
-
data = {
|
|
2270
|
-
width: '500px',
|
|
2271
|
-
height: 'auto',
|
|
2272
|
-
data: {
|
|
2273
|
-
from: 'languageSwitch',
|
|
2274
|
-
icon: 'translate',
|
|
2275
|
-
header: 'Are you sure you want to change the language?',
|
|
2276
|
-
message: 'Switching the language will reset your progress. \n The course will restart from the beginning in the selected language.',
|
|
2277
|
-
cancelButton: 'Back',
|
|
2278
|
-
acceptButton: 'Change language',
|
|
2279
|
-
}
|
|
2280
|
-
};
|
|
2281
|
-
}
|
|
2282
|
-
this.showLangSwitchPopup(lang, data);
|
|
2283
|
-
}
|
|
2284
|
-
}
|
|
2285
|
-
else {
|
|
2286
|
-
this.processLanguageSelection(lang);
|
|
2287
|
-
}
|
|
2288
|
-
}
|
|
2289
|
-
showLangSwitchPopup(lang, data) {
|
|
2290
|
-
const dialogRef = this.dialog.open(TOCMultiLingualDialogComponent, data);
|
|
2291
|
-
dialogRef.afterClosed().subscribe((confirmed) => {
|
|
2292
|
-
if (confirmed) {
|
|
2293
|
-
console.log('confirmed');
|
|
2294
|
-
this.processLanguageSelection(lang);
|
|
2295
|
-
}
|
|
2296
|
-
});
|
|
2297
|
-
}
|
|
2298
|
-
showOneStepResumeConfirm(urlData) {
|
|
2299
|
-
const data = {
|
|
2300
|
-
width: '500px',
|
|
2301
|
-
height: 'auto',
|
|
2302
|
-
data: {
|
|
2303
|
-
from: 'languageSwitch',
|
|
2304
|
-
icon: 'translate',
|
|
2305
|
-
header: `You've already started this course`,
|
|
2306
|
-
message: `You’ve made some <b>progress</b> in another language of this course. \nWould you like to <b>resume where you left off</b>, or continue with this version instead?`,
|
|
2307
|
-
cancelButton: 'Continue Here',
|
|
2308
|
-
acceptButton: 'Resume',
|
|
2309
|
-
}
|
|
2310
|
-
};
|
|
2311
|
-
const dialogRef = this.dialog.open(TOCMultiLingualDialogComponent, data);
|
|
2312
|
-
dialogRef.afterClosed().subscribe((confirmed) => {
|
|
2313
|
-
if (confirmed) {
|
|
2314
|
-
this.router.navigate([urlData.url], { queryParams: urlData.queryParams });
|
|
2315
|
-
}
|
|
2316
|
-
else {
|
|
2317
|
-
const lang = this.contentLangSvc.getRequiredLanguageDetails(this.baseContentReadData, this.queryParamsData['ML']);
|
|
2318
|
-
this.processLanguageSelection(lang);
|
|
2319
|
-
}
|
|
2320
|
-
});
|
|
2321
|
-
}
|
|
2322
|
-
processLanguageSelection(lang) {
|
|
2323
|
-
this.selectedLanguage = lang;
|
|
2324
|
-
console.log('Selected language:', lang);
|
|
2325
|
-
// Set skeleton loader to show loading state
|
|
2326
|
-
this.skeletonLoader = true;
|
|
2327
|
-
// Check if language object has required properties
|
|
2328
|
-
if (lang && lang.identifier) {
|
|
2329
|
-
// Create a promise chain to fetch content data and hierarchy sequentially
|
|
2330
|
-
this.fetchContentRead(lang.identifier)
|
|
2331
|
-
.then(() => {
|
|
2332
|
-
// After content read is successful, fetch the hierarchy
|
|
2333
|
-
return this.fetchContentHierarchy(lang.identifier);
|
|
2334
|
-
})
|
|
2335
|
-
.then(() => {
|
|
2336
|
-
// Both operations were successful
|
|
2337
|
-
// Update UI as needed with new content
|
|
2338
|
-
this.routerChangeHandler(true);
|
|
2339
|
-
if (this.userEnrollmentList && this.userEnrollmentList.length) {
|
|
2340
|
-
this.generateResumeDataLinkNew();
|
|
2341
|
-
}
|
|
2342
|
-
if (this.content) {
|
|
2343
|
-
this.getLearningUrls();
|
|
2344
|
-
// Reset user progress and fetch enrollment data if not in preview mode
|
|
2345
|
-
if (!this.forPreview) {
|
|
2346
|
-
this.checkIfUserEnrolled();
|
|
2347
|
-
}
|
|
2348
|
-
}
|
|
2349
|
-
// Update subject to notify rating summry component and load the sumamry of selected language
|
|
2350
|
-
this.resetRatingsService.setRatingServiceUpdate(true);
|
|
2351
|
-
// Finally set loading state to false
|
|
2352
|
-
this.skeletonLoader = false;
|
|
2353
|
-
})
|
|
2354
|
-
.catch((error) => {
|
|
2355
|
-
// Handle any errors in the promise chain
|
|
2356
|
-
this.loggerSvc.error('Error during language change:', error);
|
|
2357
|
-
this.skeletonLoader = false;
|
|
2358
|
-
this.snackBar.open('Failed to load content in selected language', 'X', {
|
|
2359
|
-
duration: 3000,
|
|
2360
|
-
});
|
|
2361
|
-
});
|
|
2362
|
-
}
|
|
2363
|
-
else {
|
|
2364
|
-
this.loggerSvc.error('Invalid language selection', lang);
|
|
2365
|
-
this.skeletonLoader = false;
|
|
2366
|
-
this.snackBar.open('Invalid language selection', 'X', {
|
|
2367
|
-
duration: 3000,
|
|
2368
|
-
});
|
|
2369
|
-
}
|
|
2370
|
-
}
|
|
2371
|
-
/**
|
|
2372
|
-
* Fetches content data for a given identifier and updates the contentReadData property
|
|
2373
|
-
* @param identifier The content identifier to fetch
|
|
2374
|
-
* @returns Promise that resolves to true if content was fetched successfully, false otherwise
|
|
2375
|
-
*/
|
|
2376
|
-
async fetchContentRead(identifier) {
|
|
2377
|
-
return new Promise((resolve, reject) => {
|
|
2378
|
-
if (!identifier) {
|
|
2379
|
-
this.loggerSvc.error('Cannot fetch content: identifier is missing');
|
|
2380
|
-
resolve(false);
|
|
2381
|
-
return;
|
|
2382
|
-
}
|
|
2383
|
-
const observable = this.contentSvc.fetchContentData(identifier);
|
|
2384
|
-
if (!observable) {
|
|
2385
|
-
this.loggerSvc.error('fetchContentData did not return an Observable');
|
|
2386
|
-
resolve(false);
|
|
2387
|
-
return;
|
|
2388
|
-
}
|
|
2389
|
-
const subscription = observable.subscribe({
|
|
2390
|
-
next: (response) => {
|
|
2391
|
-
if (response?.result?.content) {
|
|
2392
|
-
// Update contentReadData with the fetched content
|
|
2393
|
-
this.contentReadData = response.result.content;
|
|
2394
|
-
// Update language list after content is fetched
|
|
2395
|
-
if (this.contentReadData) {
|
|
2396
|
-
this.languageList = this.contentLangSvc.getAllContentLanguages(this.contentReadData);
|
|
2397
|
-
this.selectedLanguage = this.contentLangSvc.getSelectedLanguage(this.contentReadData);
|
|
2398
|
-
}
|
|
2399
|
-
resolve(true);
|
|
2400
|
-
}
|
|
2401
|
-
else {
|
|
2402
|
-
this.loggerSvc.warn('Content data not found in response', response);
|
|
2403
|
-
resolve(false);
|
|
2404
|
-
}
|
|
2405
|
-
subscription.unsubscribe();
|
|
2406
|
-
},
|
|
2407
|
-
error: (error) => {
|
|
2408
|
-
this.loggerSvc.error('Failed to fetch content data', error);
|
|
2409
|
-
reject(error);
|
|
2410
|
-
subscription.unsubscribe();
|
|
2411
|
-
}
|
|
2412
|
-
});
|
|
2413
|
-
});
|
|
2414
|
-
}
|
|
2415
|
-
routerChangeHandler(appendBatchId) {
|
|
2416
|
-
const queryParams = {};
|
|
2417
|
-
// Add batch ID if needed
|
|
2418
|
-
if (appendBatchId && this.getBatchId()) {
|
|
2419
|
-
queryParams.batchId = this.getBatchId();
|
|
2420
|
-
}
|
|
2421
|
-
// Add multilingual ID and language to query params if available
|
|
2422
|
-
if (this.contentReadData && this.contentReadData.identifier) {
|
|
2423
|
-
let language = '';
|
|
2424
|
-
// Handle both string and array language formats
|
|
2425
|
-
if (Array.isArray(this.contentReadData.language)) {
|
|
2426
|
-
language = this.contentReadData.language[0].toLowerCase();
|
|
2427
|
-
}
|
|
2428
|
-
else if (this.contentReadData.language) {
|
|
2429
|
-
language = this.contentReadData.language.toLowerCase();
|
|
2430
|
-
}
|
|
2431
|
-
if (!(this.selectedLanguage && Object.keys(this.selectedLanguage).length)) {
|
|
2432
|
-
this.selectedLanguage = {
|
|
2433
|
-
langId: language,
|
|
2434
|
-
name: this.contentReadData.language[0]
|
|
2435
|
-
};
|
|
2436
|
-
}
|
|
2437
|
-
// Only add parameters if we have valid data
|
|
2438
|
-
if (language) {
|
|
2439
|
-
queryParams.ML = language;
|
|
2440
|
-
}
|
|
2441
|
-
queryParams.MLId = this.contentReadData.identifier;
|
|
2442
|
-
}
|
|
2443
|
-
// Only navigate if we have batch ID or other parameters
|
|
2444
|
-
if (Object.keys(queryParams).length > 0) {
|
|
2445
|
-
this.router.navigate([], {
|
|
2446
|
-
relativeTo: this.route,
|
|
2447
|
-
queryParams: queryParams,
|
|
2448
|
-
queryParamsHandling: 'merge',
|
|
2449
|
-
});
|
|
2450
|
-
}
|
|
2451
|
-
}
|
|
2452
|
-
getContinueLearningData(contentId, batchId, lang) {
|
|
2453
|
-
this.tocSvc.contentLoader.next(true);
|
|
2454
|
-
this.resumeData = null;
|
|
2455
|
-
let userId;
|
|
2456
|
-
if (this.configSvc.userProfile) {
|
|
2457
|
-
userId = this.configSvc.userProfile.userId || '';
|
|
2458
|
-
}
|
|
2459
|
-
const req = {
|
|
2460
|
-
request: {
|
|
2461
|
-
batchId,
|
|
2462
|
-
userId,
|
|
2463
|
-
courseId: contentId || '',
|
|
2464
|
-
contentIds: [],
|
|
2465
|
-
fields: ['progressdetails'],
|
|
2466
|
-
...(lang ? { language: lang } : null),
|
|
2467
|
-
},
|
|
2468
|
-
};
|
|
2469
|
-
if (this.content && this.content.primaryCategory !== NsContent.EPrimaryCategory.RESOURCE) {
|
|
2470
|
-
this.contentSvc.fetchContentHistoryV2(req).subscribe(data => {
|
|
2471
|
-
if (data && data.result && data.result.contentList && data.result.contentList.length) {
|
|
2472
|
-
const tempResumeData = _.get(data, 'result.contentList');
|
|
2473
|
-
this.languageMapProgress = _.get(data, 'result.languageProgress') || {};
|
|
2474
|
-
this.resumeData = _.map(tempResumeData, rr => {
|
|
2475
|
-
// tslint:disable-next-line
|
|
2476
|
-
const items = _.filter(flattenItems(_.get(this.content, 'children') || [], 'children'), { 'identifier': rr.contentId, primaryCategory: 'Learning Resource' });
|
|
2477
|
-
_.set(rr, 'progressdetails.mimeType', _.get(_.first(items), 'mimeType'));
|
|
2478
|
-
if (!_.get(rr, 'completionPercentage')) {
|
|
2479
|
-
if (_.get(rr, 'status') === 2) {
|
|
2480
|
-
_.set(rr, 'completionPercentage', 100);
|
|
2481
|
-
}
|
|
2482
|
-
else {
|
|
2483
|
-
_.set(rr, 'completionPercentage', 0);
|
|
2484
|
-
}
|
|
2485
|
-
}
|
|
2486
|
-
return rr;
|
|
2487
|
-
});
|
|
2488
|
-
const progress = _.map(this.resumeData, 'completionPercentage');
|
|
2489
|
-
const totalCount = _.toInteger(_.get(this.content, 'leafNodesCount')) || 1;
|
|
2490
|
-
if (progress.length < totalCount) {
|
|
2491
|
-
const diff = totalCount - progress.length;
|
|
2492
|
-
if (diff) {
|
|
2493
|
-
// tslint:disable-next-line
|
|
2494
|
-
_.each(new Array(diff), () => {
|
|
2495
|
-
progress.push(0);
|
|
2496
|
-
});
|
|
2497
|
-
}
|
|
2498
|
-
}
|
|
2499
|
-
this.generateResumeDataLinkNew();
|
|
2500
|
-
this.tocSvc.updateResumaData(this.resumeData);
|
|
2501
|
-
// this.tocSvc.mapModuleDurationAndProgress(this.content, this.content)
|
|
2502
|
-
this.getLastPlayedResource();
|
|
2503
|
-
if (this.content?.completionPercentage !== 100) {
|
|
2504
|
-
this.tocSvc.mapCompletionPercentage(this.content, this.resumeData);
|
|
2505
|
-
}
|
|
2506
|
-
this.tocSvc.callHirarchyProgressHashmap(this.content);
|
|
2507
|
-
this.tocSvc.contentLoader.next(false);
|
|
2508
|
-
}
|
|
2509
|
-
else {
|
|
2510
|
-
this.resumeData = null;
|
|
2511
|
-
this.tocSvc.callHirarchyProgressHashmap(this.content);
|
|
2512
|
-
this.tocSvc.contentLoader.next(false);
|
|
2513
|
-
}
|
|
2514
|
-
this.contentSvc.setProgramChildResumeData(this.resumeData, contentId);
|
|
2515
|
-
if (this.content?.completionPercentage !== 100) {
|
|
2516
|
-
this.bindCompletionPercentage();
|
|
2517
|
-
}
|
|
2518
|
-
}, (error) => {
|
|
2519
|
-
this.loggerSvc.error('CONTENT HISTORY FETCH ERROR >', error);
|
|
2520
|
-
});
|
|
2521
|
-
}
|
|
2522
|
-
}
|
|
2523
|
-
generateResumeDataLinkNew() {
|
|
2524
|
-
if (this.resumeData && this.content) {
|
|
2525
|
-
let resumeDataV2;
|
|
2526
|
-
if (this.content.completionPercentage === 100) {
|
|
2527
|
-
resumeDataV2 = this.getResumeDataFromList('start');
|
|
2528
|
-
}
|
|
2529
|
-
else {
|
|
2530
|
-
resumeDataV2 = this.getResumeDataFromList();
|
|
2531
|
-
}
|
|
2532
|
-
if (!resumeDataV2.mimeType) {
|
|
2533
|
-
resumeDataV2.mimeType = this.tocSvc.getMimeType(this.content, resumeDataV2.identifier);
|
|
2534
|
-
}
|
|
2535
|
-
this.resumeDataLink = this.getResumeUrl(resumeDataV2);
|
|
2536
|
-
this.actionSVC.setUpdateCompGroupO = this.resumeDataLink;
|
|
2537
|
-
/* tslint:disable-next-line */
|
|
2538
|
-
}
|
|
2539
|
-
}
|
|
2540
|
-
isSelectedInMoreDropdown() {
|
|
2541
|
-
if (!this.selectedLanguage?.identifier || !this.languageList) {
|
|
2542
|
-
return false;
|
|
2543
|
-
}
|
|
2544
|
-
return this.languageList.slice(5).some((lang) => lang?.identifier === this.selectedLanguage?.identifier);
|
|
2545
|
-
}
|
|
2546
|
-
async getQueryParams() {
|
|
2547
|
-
const tempQueryParamsData = {};
|
|
2548
|
-
this.routeSubscription = this.route.queryParamMap.subscribe(async (qParamsMap) => {
|
|
2549
|
-
// Extract all parameters from the ParamMap
|
|
2550
|
-
qParamsMap.keys.forEach(key => {
|
|
2551
|
-
tempQueryParamsData[key] = qParamsMap.get(key) ?? '';
|
|
2552
|
-
});
|
|
2553
|
-
tempQueryParamsData;
|
|
2554
|
-
// Process specific parameters
|
|
2555
|
-
const contextId = tempQueryParamsData['contextId'];
|
|
2556
|
-
const contextPath = tempQueryParamsData['contextPath'];
|
|
2557
|
-
const recommendedCoursesId = tempQueryParamsData['recommendationId'];
|
|
2558
|
-
if (contextId && contextPath) {
|
|
2559
|
-
this.contextId = contextId;
|
|
2560
|
-
this.contextPath = contextPath;
|
|
2561
|
-
}
|
|
2562
|
-
if (recommendedCoursesId) {
|
|
2563
|
-
this.recommendedCoursesId = recommendedCoursesId;
|
|
2564
|
-
try {
|
|
2565
|
-
const response = await this.userServiceLib.getRecommendedCoursesSakshamAI(recommendedCoursesId).toPromise();
|
|
2566
|
-
if (response && response.feedbacks && response.feedbacks.length) {
|
|
2567
|
-
this.feedbackGiven = response.feedbacks.find((feedback) => feedback?.course_id === this.courseID);
|
|
2568
|
-
}
|
|
2569
|
-
}
|
|
2570
|
-
catch (error) {
|
|
2571
|
-
this.loggerSvc.error('Error fetching recommended courses:', error);
|
|
2572
|
-
}
|
|
2573
|
-
}
|
|
2574
|
-
});
|
|
2575
|
-
return tempQueryParamsData;
|
|
2576
|
-
}
|
|
2577
|
-
getOrgIdForShare() {
|
|
2578
|
-
if (this.content && ![
|
|
2579
|
-
NsContent.ECourseCategory.MODERATED_COURSE,
|
|
2580
|
-
NsContent.ECourseCategory.MODERATED_ASSESSEMENT,
|
|
2581
|
-
NsContent.ECourseCategory.MODERATED_PROGRAM,
|
|
2582
|
-
NsContent.ECourseCategory.INVITE_ONLY_PROGRAM,
|
|
2583
|
-
].includes(this.content.courseCategory)) {
|
|
2584
|
-
this.canShare = true;
|
|
2585
|
-
if (this.configSvc.userProfile) {
|
|
2586
|
-
this.rootOrgId = this.configSvc.userProfile.rootOrgId;
|
|
2587
|
-
}
|
|
2588
|
-
}
|
|
2589
|
-
}
|
|
2590
|
-
/**
|
|
2591
|
-
* Fetches and processes content creator data from the current content
|
|
2592
|
-
* - Sets contentCreatorData from parsed creator contacts
|
|
2593
|
-
* - Determines if "show button" flag should be enabled based on content name
|
|
2594
|
-
* - Includes proper error handling for null values and parsing
|
|
2595
|
-
*/
|
|
2596
|
-
getContentCreatorData() {
|
|
2597
|
-
try {
|
|
2598
|
-
// Only proceed if we have valid content data
|
|
2599
|
-
if (!this.contentReadData) {
|
|
2600
|
-
this.loggerSvc.warn('Cannot get creator data: contentReadData is not available');
|
|
2601
|
-
return;
|
|
2602
|
-
}
|
|
2603
|
-
// Process content name for comparison (safely handle null/undefined)
|
|
2604
|
-
const contentName = this.contentReadData.name?.trim() || '';
|
|
2605
|
-
// Parse and set creator contacts if available
|
|
2606
|
-
if (this.contentReadData.creatorContacts) {
|
|
2607
|
-
// Use the existing parsing method to handle creator contacts
|
|
2608
|
-
this.contentCreatorData = this.handleParseJsonData(this.contentReadData.creatorContacts);
|
|
2609
|
-
}
|
|
2610
|
-
else {
|
|
2611
|
-
// Reset to empty array if no creator contacts
|
|
2612
|
-
this.contentCreatorData = [];
|
|
2613
|
-
}
|
|
2614
|
-
// Set showBtn flag based on dakshta name comparison (case insensitive)
|
|
2615
|
-
// This determines if the special button for dakshta content is shown
|
|
2616
|
-
this.showBtn = contentName.toLowerCase() === this.dakshtaName.toLowerCase();
|
|
2617
|
-
}
|
|
2618
|
-
catch (error) {
|
|
2619
|
-
// Handle any unexpected errors
|
|
2620
|
-
this.loggerSvc.error('Error processing content creator data:', error);
|
|
2621
|
-
this.contentCreatorData = [];
|
|
2622
|
-
this.showBtn = false;
|
|
2623
|
-
}
|
|
2624
|
-
}
|
|
2625
|
-
getI18NTranslations() {
|
|
2626
|
-
// Subscribe to language translation flag changes
|
|
2627
|
-
const translationSubscription = this.configSvc.languageTranslationFlag
|
|
2628
|
-
.pipe(takeUntil(this.destroySubject$)) // Ensure subscription is cleaned up on component destroy
|
|
2629
|
-
.subscribe({
|
|
2630
|
-
next: (data) => {
|
|
2631
|
-
// Only proceed if we have valid data
|
|
2632
|
-
if (data) {
|
|
2633
|
-
// Check if website language is set in localStorage
|
|
2634
|
-
const storedLanguage = localStorage.getItem('websiteLanguage');
|
|
2635
|
-
if (storedLanguage) {
|
|
2636
|
-
// Set default language as fallback
|
|
2637
|
-
this.translate.setDefaultLang('en');
|
|
2638
|
-
// Use the stored language preference
|
|
2639
|
-
this.translate.use(storedLanguage);
|
|
2640
|
-
}
|
|
2641
|
-
}
|
|
2642
|
-
},
|
|
2643
|
-
error: (error) => {
|
|
2644
|
-
// Log any errors that occur during subscription
|
|
2645
|
-
this.loggerSvc.error('Error in language translation subscription:', error);
|
|
2646
|
-
}
|
|
2647
|
-
});
|
|
2648
|
-
// Store subscription for cleanup (optional alternative to takeUntil)
|
|
2649
|
-
this.translationSubscription = translationSubscription;
|
|
2650
|
-
}
|
|
2651
|
-
getServerDateTime() {
|
|
2652
|
-
// Fetch the server date time and process the response
|
|
2653
|
-
this.tocSvc.getServerDate().subscribe((response) => {
|
|
2654
|
-
// Check if response contains valid system date
|
|
2655
|
-
if (response && response.systemDate) {
|
|
2656
|
-
// Update service with server date (removed duplicate call)
|
|
2657
|
-
this.tocSvc.changeServerDate(response.systemDate);
|
|
2658
|
-
this.serverDate = response.systemDate;
|
|
2659
|
-
}
|
|
2660
|
-
else {
|
|
2661
|
-
// Fallback to client's time if server time is not available
|
|
2662
|
-
const clientTime = new Date().getTime();
|
|
2663
|
-
this.tocSvc.changeServerDate(clientTime);
|
|
2664
|
-
this.serverDate = clientTime;
|
|
2665
|
-
}
|
|
2666
|
-
// Initialize dependent functions that need server date
|
|
2667
|
-
this.findACPB();
|
|
2668
|
-
this.getKarmapointsLimit();
|
|
2669
|
-
}, (error) => {
|
|
2670
|
-
// Log the error for debugging
|
|
2671
|
-
this.loggerSvc.error('Failed to get server date:', error);
|
|
2672
|
-
// Fallback to client's time on error
|
|
2673
|
-
const clientTime = new Date().getTime();
|
|
2674
|
-
this.tocSvc.changeServerDate(clientTime);
|
|
2675
|
-
this.serverDate = clientTime;
|
|
2676
|
-
});
|
|
2677
|
-
// Subscribe to server date changes from service
|
|
2678
|
-
this.serverDateSubscription = this.tocSvc.serverDate
|
|
2679
|
-
.pipe(takeUntil(this.destroySubject$)) // Ensure subscription is cleaned up
|
|
2680
|
-
.subscribe(serverDate => {
|
|
2681
|
-
this.serverDate = serverDate;
|
|
2682
|
-
});
|
|
2683
|
-
}
|
|
2684
|
-
get getBaseContentIdentifier() {
|
|
2685
|
-
return this.baseContentReadData?.identifier || this.content?.identifier || '';
|
|
2686
|
-
}
|
|
2687
|
-
get isMultilingual() {
|
|
2688
|
-
if (this.baseContentReadData && this.baseContentReadData.languageMapV1) {
|
|
2689
|
-
return this.languageList.length > 1;
|
|
2690
|
-
}
|
|
2691
|
-
return false;
|
|
2692
|
-
}
|
|
2693
|
-
handleEnrollment(event) {
|
|
2694
|
-
if (this.isMultilingual) {
|
|
2695
|
-
this.openLangDialog(event);
|
|
2696
|
-
}
|
|
2697
|
-
else {
|
|
2698
|
-
this.handleAutoBatchAssign();
|
|
2699
|
-
}
|
|
2700
|
-
}
|
|
2701
|
-
openLangDialog(_event) {
|
|
2702
|
-
const dialogRef = this.dialog.open(EnrollLanguageDialogueComponent, {
|
|
2703
|
-
width: '500px',
|
|
2704
|
-
height: 'auto',
|
|
2705
|
-
autoFocus: false,
|
|
2706
|
-
restoreFocus: false,
|
|
2707
|
-
data: {
|
|
2708
|
-
preSelect: this.selectedLanguage,
|
|
2709
|
-
languageList: this.languageList,
|
|
2710
|
-
}
|
|
2711
|
-
});
|
|
2712
|
-
dialogRef.afterClosed().subscribe((selectedLang) => {
|
|
2713
|
-
if (selectedLang) {
|
|
2714
|
-
this.selectedLanguage = selectedLang;
|
|
2715
|
-
console.log('this.selectedLanguage', this.selectedLanguage);
|
|
2716
|
-
this.handleAutoBatchAssign();
|
|
2717
|
-
}
|
|
2718
|
-
});
|
|
2719
|
-
}
|
|
2720
|
-
getResumeUrl(resourceData, batchId, primaryCategory) {
|
|
2721
|
-
let MLId = this.selectedLanguage?.identifier || '';
|
|
2722
|
-
let ML = this.selectedLanguage?.langId || '';
|
|
2723
|
-
let resumeDataUrl = viewerRouteGenerator(resourceData.identifier, resourceData.mimeType, this.isResource ? undefined : this.baseContentReadData && this.baseContentReadData?.identifier || '', this.isResource ? undefined : this.baseContentReadData && this.baseContentReadData?.contentType || '', this.forPreview, primaryCategory || 'Learning Resource', batchId || this.getBatchId(), this.baseContentReadData && this.baseContentReadData?.name || '', ML, MLId);
|
|
2724
|
-
return resumeDataUrl;
|
|
2725
|
-
}
|
|
2726
|
-
get contentCompletionPercent() {
|
|
2727
|
-
if (this.batchData?.enrolled) {
|
|
2728
|
-
if (this.contentReadData && this.contentReadData.primaryCategory === 'Course' && this.isMultilingual) {
|
|
2729
|
-
if (this.languageMapProgress && this.selectedLanguage?.langId && this.languageMapProgress[this.selectedLanguage?.langId]) {
|
|
2730
|
-
return this.languageMapProgress[this.selectedLanguage?.langId];
|
|
2731
|
-
}
|
|
2732
|
-
else {
|
|
2733
|
-
return 0;
|
|
2734
|
-
}
|
|
2735
|
-
}
|
|
2736
|
-
else {
|
|
2737
|
-
return this.content?.completionPercentage || 0;
|
|
2738
|
-
}
|
|
2739
|
-
}
|
|
2740
|
-
}
|
|
2741
|
-
checkForCompletionSurveyTrigger() {
|
|
2742
|
-
if (this.content && this.contentReadData) {
|
|
2743
|
-
console.log('checkForSurveyTrigger this.content', this.contentReadData);
|
|
2744
|
-
// check if completion survey is enabled and user has completed the course before 23rd DEC 2023 (release date of completion survey)
|
|
2745
|
-
if (this.configSvc.instanceConfig && this.configSvc.instanceConfig.completionSurvey && this.configSvc.instanceConfig.completionSurvey.enabled &&
|
|
2746
|
-
this.enrolledCourseData && this.enrolledCourseData && this.enrolledCourseData.completedOn >= this.configSvc.instanceConfig.completionSurvey.startDate) {
|
|
2747
|
-
if ((this.content.completionStatus === 2 || this.content.completionPercentage === 100) && this.contentReadData.completionSurveyLink) {
|
|
2748
|
-
const sID = this.contentReadData.completionSurveyLink.split('surveys/');
|
|
2749
|
-
const surveyId = sID[1];
|
|
2750
|
-
const courseId = this.contentReadData.identifier;
|
|
2751
|
-
// Call API to see if survey is submitted or not
|
|
2752
|
-
this.tocSvc.getApllicationsById(surveyId, courseId).subscribe((res) => {
|
|
2753
|
-
console.log('response of getApllicationsById', res);
|
|
2754
|
-
if (res.result.response && Object.keys(res.result.response).length > 0) {
|
|
2755
|
-
this.lockCertificate = false;
|
|
2756
|
-
}
|
|
2757
|
-
else {
|
|
2758
|
-
this.lockCertificate = true;
|
|
2759
|
-
this.openCompletionSurveyFormPopup();
|
|
2760
|
-
}
|
|
2761
|
-
});
|
|
2762
|
-
}
|
|
2763
|
-
}
|
|
2764
|
-
}
|
|
2765
|
-
}
|
|
2766
|
-
// Clear existing survey data from local storage before opening popup
|
|
2767
|
-
clearExistingPublicSurveyData(surveyId, courseId) {
|
|
2768
|
-
const storageKey = `survey_${surveyId}_${courseId}`;
|
|
2769
|
-
if (localStorage.getItem(storageKey)) {
|
|
2770
|
-
localStorage.removeItem(storageKey);
|
|
2771
|
-
}
|
|
2772
|
-
}
|
|
2773
|
-
openPublicSurveyPopup(navigationUrl, queryParams) {
|
|
2774
|
-
// Get survey ID and course ID from environment and content data
|
|
2775
|
-
const surveyId = this.environment.publicContentSurveyId || '';
|
|
2776
|
-
const courseId = this.contentReadData?.identifier || '';
|
|
2777
|
-
const courseName = this.contentReadData?.name || '';
|
|
2778
|
-
const contextOrgId = this.contentReadData?.createdFor && this.contentReadData?.createdFor.length > 0 ?
|
|
2779
|
-
this.contentReadData?.createdFor[0] : '';
|
|
2780
|
-
this.clearExistingPublicSurveyData(surveyId, courseId);
|
|
2781
|
-
const data = {
|
|
2782
|
-
surveyId: surveyId,
|
|
2783
|
-
courseId: courseId,
|
|
2784
|
-
courseName: courseName,
|
|
2785
|
-
contextOrgId: contextOrgId
|
|
2786
|
-
};
|
|
2787
|
-
const dialogRef = this.dialog.open(PublicSurveyFormComponent, {
|
|
2788
|
-
// disableClose: true,
|
|
2789
|
-
width: '750px',
|
|
2790
|
-
maxWidth: '90vw',
|
|
2791
|
-
height: '80vh',
|
|
2792
|
-
data: data,
|
|
2793
|
-
autoFocus: false,
|
|
2794
|
-
});
|
|
2795
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
2796
|
-
if (result) {
|
|
2797
|
-
// Navigate to the intended URL only when survey is submitted successfully
|
|
2798
|
-
if (navigationUrl) {
|
|
2799
|
-
this.router.navigate([navigationUrl], { queryParams: queryParams });
|
|
2800
|
-
}
|
|
2801
|
-
}
|
|
2802
|
-
});
|
|
2803
|
-
}
|
|
2804
|
-
resumeContentData() {
|
|
2805
|
-
const navigationUrl = (this.resumeData && !this.certData) ? this.resumeDataLink?.url : this.firstResourceLink?.url;
|
|
2806
|
-
const queryParams = (this.resumeData && !this.certData) ? this.generateQuery('RESUME') : this.generateQuery('START');
|
|
2807
|
-
this.router.navigate([navigationUrl], { queryParams: queryParams });
|
|
2808
|
-
}
|
|
2809
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, deps: [{ token: i1.ActivatedRoute }, { token: i1.Router }, { token: i2.WidgetContentService }, { token: i3.AppTocService }, { token: i4.LoggerService }, { token: i4.ConfigurationsService }, { token: i5.DomSanitizer }, { token: i6.MatLegacySnackBar }, { token: i7.MatLegacyDialog }, { token: i8.MobileAppsService }, { token: i4.UtilityService }, { token: i9.ContentLanguageService }, { token: i10.ActionService }, { token: i11.ViewerUtilService }, { token: i12.RatingService }, { token: i4.TelemetryService }, { token: i13.TranslateService }, { token: i4.MultilingualTranslationsService }, { token: i4.EventService }, { token: i14.LoadCheckService }, { token: i15.HandleClaimService }, { token: i16.ResetRatingsService }, { token: i17.TimerService }, { token: i4.WidgetEnrollService }, { token: i9.WidgetContentLibService }, { token: i4.DataTransferService }, { token: i18.MatSnackBar }, { token: i9.WidgetUserServiceLib }, { token: i19.NetCoreService }, { token: i20.AppTocV2Service }, { token: 'environment' }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2810
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocHomeV2Component, selector: "ws-app-app-toc-home-v2", inputs: { forPreview: "forPreview" }, host: { listeners: { "window:scroll": "handleScroll($event)" } }, viewQueries: [{ propertyName: "menuElement", first: true, predicate: ["stickyMenu"], descendants: true, static: true }, { propertyName: "rcElement", first: true, predicate: ["rightContainer"], descendants: true }, { propertyName: "bannerElem", first: true, predicate: ["bannerDetails"], descendants: true, static: true }, { propertyName: "contentSource", first: true, predicate: ["contentSource"], descendants: true }], ngImport: i0, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - <span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon> \n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon> \n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"], dependencies: [{ kind: "directive", type: i21.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i21.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i21.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i21.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i21.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i1.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i22.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: i23.MatLegacyButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { kind: "component", type: i24.MatLegacyMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { kind: "directive", type: i24.MatLegacyMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { kind: "component", type: i25.MatLegacyChipList, selector: "mat-chip-list", inputs: ["role", "aria-describedby", "errorStateMatcher", "multiple", "compareWith", "value", "required", "placeholder", "disabled", "aria-orientation", "selectable", "tabIndex"], outputs: ["change", "valueChange"], exportAs: ["matChipList"] }, { kind: "directive", type: i25.MatLegacyChip, selector: "mat-basic-chip, [mat-basic-chip], mat-chip, [mat-chip]", inputs: ["color", "disableRipple", "tabIndex", "role", "selected", "value", "selectable", "disabled", "removable"], outputs: ["selectionChange", "destroyed", "removed"], exportAs: ["matChip"] }, { kind: "directive", type: i26.MatLegacyRadioGroup, selector: "mat-radio-group", exportAs: ["matRadioGroup"] }, { kind: "component", type: i26.MatLegacyRadioButton, selector: "mat-radio-button", inputs: ["disableRipple", "tabIndex"], exportAs: ["matRadioButton"] }, { kind: "component", type: i27.SkeletonLoaderComponent, selector: "ws-widget-skeleton-loader", inputs: ["bindingClass", "height", "width"] }, { kind: "component", type: i28.ContentProgressComponent, selector: "ws-widget-content-progress", inputs: ["contentId", "progress", "progressType", "forPreview", "className", "customClassName"] }, { kind: "component", type: i29.AvatarPhotoComponent, selector: "ws-widget-avatar-photo", inputs: ["datalen", "photoUrl", "name", "size", "randomColor", "initials", "showBadge"] }, { kind: "component", type: i30.ContentTocComponent, selector: "ws-widget-content-toc", inputs: ["content", "contentReadData", "initialRouteData", "changeTab", "baseContentReadData", "forPreview", "contentTabFlag", "resumeData", "batchData", "skeletonLoader", "tocStructure", "pathSet", "fromViewer", "hierarchyMapData", "condition", "kparray", "selectedBatchData", "config", "componentName", "isEnrolled", "playResourceId", "sideNavBarOpened", "languageList", "lockCertificate"], outputs: ["playResumeForAI", "enrollUserToAI", "trigerCompletionSurveyForm", "resumeContent"] }, { kind: "component", type: i31.ShareTocComponent, selector: "ws-app-share-toc", inputs: ["rootOrgId", "content", "contentLink", "baseContentReadData"], outputs: ["resetEnableShare"] }, { kind: "component", type: i32.TocKpiValuesComponent, selector: "ws-widget-toc-kpi-values", inputs: ["tocStructure", "content", "contentReadData", "isMobile", "showInstructorLedMsg", "baseContentReadData", "languageList"] }, { kind: "component", type: i33.KarmaPointsComponent, selector: "ws-widget-karma-points", inputs: ["content", "data", "pCategory", "condition", "btnCategory"], outputs: ["clickClaimKarmaPoints"] }, { kind: "component", type: i34.TipsForLearnerCardComponent, selector: "ws-widget-tips-for-learner-card", inputs: ["learnAdvisoryData"] }, { kind: "component", type: i35.AppTocBannerComponent, selector: "ws-app-toc-banner", inputs: ["banners", "content", "resumeData", "analytics", "forPreview", "batchData", "userEnrollmentList", "contentReadData", "clickToShare"], outputs: ["withdrawOrEnroll", "programEnrollCall"] }, { kind: "pipe", type: i21.SlicePipe, name: "slice" }, { kind: "pipe", type: i21.DatePipe, name: "date" }, { kind: "pipe", type: i4.PipeCountTransformPipe, name: "pipeCountTransform" }, { kind: "pipe", type: i13.TranslatePipe, name: "translate" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
2811
|
-
}
|
|
2812
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocHomeV2Component, decorators: [{
|
|
2813
|
-
type: Component,
|
|
2814
|
-
args: [{ selector: 'ws-app-app-toc-home-v2', encapsulation: ViewEncapsulation.None, template: "<ng-container *ngIf=\"courseID else noDataFound\">\n <ng-template #enrollFunctionality>\n <div [hidden]=\"isResource && !content?.artifactUrl?.length\" class=\"flex flex-col gap-4 text-center\">\n <!-- Course block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.CURATED_PROGRAM\n && contentReadData?.primaryCategory !== primaryCategory.STANDALONE_ASSESSMENT &&\n contentReadData?.primaryCategory !== primaryCategory.BLENDED_PROGRAM\">\n <ng-container *ngIf=\"(actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 &&\n !content?.artifactUrl?.length) &&\n !(contentReadData?.primaryCategory === primaryCategory.COURSE && !batchData?.enrolled) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId)\">\n <a *ngIf=\"showStart.show && !isPostAssessment && !forPreview\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"(resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ content?.completionPercentage >= 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n\n <button *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"firstResourceLink?.url\" class=\"flex action-button justify-center\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </button>\n\n <!-- <div\n *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100 || certData)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div> -->\n\n <!-- <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n\n <ng-container *ngIf=\" (actionBtnStatus === 'grant' && !(isMobile && content?.isInIntranet) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && content?.children.length === 0 && !content?.artifactUrl?.length ) &&\n !( contentReadData?.primaryCategory === primaryCategory.COURSE && batchData?.enrolled ) &&\n !(contentReadData?.primaryCategory === primaryCategory.RESOURCE && !content?.artifactUrl)) &&\n !(contentReadData?.primaryCategory === primaryCategory.PROGRAM) &&\n !(contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL)\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory !== primaryCategory.RESOURCE && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\" [ngClass]=\"{'disable-start-btn': !canEnroll()}\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n <!-- <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n\n <!-- PRogram & mandatory course block -->\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.PROGRAM || contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL\">\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && (contentReadData?.batches && !batchData?.enrolled)\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && !contentReadData?.batches[0].endDate\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{'apptochome.enroll' | translate}}\n </ng-container>\n </a>\n <!-- <ng-container *ngIf=\"isAcbpCourse\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpCourse && !monthlyCapExceed && userEnrollmentList && !userEnrollmentList.length\">\n <ws-app-karmapoints-panel [btntype]=\"'Enroll'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container> -->\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n <ng-container\n *ngIf=\"((contentReadData?.primaryCategory !== primaryCategory.RESOURCE) && !enrollBtnLoading) && contentReadData?.batches[0].endDate\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" [analytics]=\"analytics\"\n (programEnrollCall)=\"programEnrollCall($event)\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"(courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory) && !contentReadData?.batches && !batchData?.enrolled && !enrollBtnLoading\">\n No Batches\n </ng-container>\n <ng-container\n *ngIf=\"courseCategory?.MODERATED_PROGRAM !== contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container\n *ngIf=\"!(contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) && contentReadData?.primaryCategory !== primaryCategory.MANDATORY_COURSE_GOAL\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvited' | translate }} </span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && courseCategory?.MODERATED_PROGRAM === contentReadData?.courseCategory && !enrollBtnLoading\">\n <ng-container *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"isBatchInProgress &&\n ( actionBtnStatus === 'grant' &&\n !(isMobile && content?.isInIntranet) &&\n (contentReadData?.primaryCategory === primaryCategory.PROGRAM && currentCourseBatchId) ||\n (contentReadData?.primaryCategory === primaryCategory.MANDATORY_COURSE_GOAL && currentCourseBatchId)\n )\">\n <a *ngIf=\"showStart.show && !isPostAssessment\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ (resumeData) || content?.completionPercentage === 100 ? \"Start again\" : \"Start\" }}\n </ng-container>\n </a>\n <a *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\" [routerLink]=\"firstResourceLink?.url\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!forPreview || isInIFrame\">{{ 'apptochome.takeAssessment' | translate\n }}</ng-container>\n </a>\n <!-- <div *ngIf=\"!isPostAssessment && (!content?.completionPercentage || content?.completionPercentage < 100)\">\n <ng-container *ngIf=\"isAcbpClaim\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n <ng-container *ngIf=\"!isAcbpClaim && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Resume'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </ng-container>\n </div> -->\n <!-- <div *ngIf=\"!isPostAssessment && (content?.completionPercentage === 100)\">\n <div *ngIf=\"isAcbpCourse && isAcbpClaim && !isClaimed\">\n <ws-app-karmapoints-panel [btntype]=\"'ACBP CLAIM'\" [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating}\" [data]=\"kparray\" [btnCategory]=\"'claim'\"\n (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && !monthlyCapExceed\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n <div *ngIf=\"!isAcbpCourse && monthlyCapExceed && !isCompletedThisMonth\">\n <ws-app-karmapoints-panel [btntype]=\"'Start again'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div>\n </div>\n <div *ngIf=\"isPostAssessment && showTakeAssessment?.post_assessment\">\n <ws-app-karmapoints-panel [btntype]=\"'Take Assessment'\" [data]=\"kparray\"></ws-app-karmapoints-panel>\n </div> -->\n </ng-container>\n </ng-container>\n </ng-container>\n\n <ng-container\n *ngIf=\"isBatchInProgress && (contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && batchData?.enrolled) && !enrollBtnLoading\">\n <a *ngIf=\"showStart.show && !isPostAssessment\" (click)=\"raiseTelemetryForPublic()\"\n [routerLink]=\"resumeData ? resumeDataLink?.url : firstResourceLink?.url\"\n [queryParams]=\"resumeData ? generateQuery('RESUME') : generateQuery('START')\"\n class=\"flex action-button justify-center resume\">\n <ng-container *ngIf=\"!content?.completionPercentage || content?.completionPercentage < 100\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('resume', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n\n <ng-container *ngIf=\"enrollBtnLoading\">\n <ws-widget-skeleton-loader [width]=\"'100%'\" [height]=\"'36px'\"\n [bindingClass]=\"'flex rounded h-8'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <!-- Curated program block -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.CURATED_PROGRAM && !batchData?.enrolled && !enrollBtnLoading\">\n <a class=\"flex action-button justify-center resume\" *ngIf=\"!forPreview || isInIFrame\"\n (click)=\"handleEnrollment()\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- STANDALONE_ASSESSMENT black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" (click)=\"handleEnrollment()\"\n *ngIf=\"!forPreview || isInIFrame\">\n <ng-container>\n {{ 'apptochome.enroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <!-- INVITE ONLY STANDALONE ASSESSMENT block-->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && !batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewForInviteOnlyAssessment\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.youAreNotInvitedForAssessment' | translate }}\n </span>\n </ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && isBatchInProgress && !enrollBtnLoading && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && !!currentCourseBatchId && getStartDate === 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.noActiveBatches' | translate }}</span>\n </ng-container>\n <ng-container\n *ngIf=\"!isBatchInProgress && currentCourseBatchId && getStartDate !== 'NA' && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <span class=\"font-bold shadow-lg text-info-div\">{{ 'apptochome.batchWillStart' | translate }}\n {{getStartDate}}!</span>\n </ng-container>\n\n <!-- STANDALONE_ASSESSMENT enrolled black -->\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.STANDALONE_ASSESSMENT && batchData?.enrolled && !enrollBtnLoading && contentReadData?.courseCategory !== 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container *ngIf=\"content?.completionPercentage === 100\">{{ 'apptochome.takeTestAgain' | translate\n }}</ng-container>\n <ng-container *ngIf=\"content?.completionPercentage < 100\">{{ 'apptochome.takeTest' | translate\n }}</ng-container>\n </a>\n </ng-container>\n <!-- BLENDED_PROGRAM block -->\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n\n <ng-container *ngIf=\"batchData?.workFlow?.wfInitiated &&\n !(batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REJECTED ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.WITHDRAWN ||\n batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.REMOVED)\">\n <div class=\"ws-mat-accent-text ws-mat-accent-light-bg flex items-center justify-center statusMsg\">\n <p class=\"margin-remove-bottom font-bold\">\n {{ 'apptochome.requestUnderReview' | translate }}\n </p>\n </div>\n </ng-container>\n <ng-container>\n <a *ngIf=\"showStart.show && batchData?.workFlow?.wfInitiated && batchData?.workFlow?.wfItem?.currentStatus === WFBlendedProgramStatus.APPROVED\"\n [routerLink]=\"isBatchInProgress? (resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url : '' \"\n (click)=\"raiseTelemetryForPublic()\"\n [queryParams]=\"isBatchInProgress ? (resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START') : '' \"\n class=\"flex action-button justify-center resume\" [ngClass]=\"{'disable-start-btn': !isBatchInProgress}\">\n <ng-container *ngIf=\"(!content?.completionPercentage || content?.completionPercentage < 100) && !certData\">\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authView\">\n {{ resumeData && (content?.completionPercentage < 100 && content?.completionPercentage> 0) ?\n translateLabels('resume', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"content?.completionPercentage === 100 || certData\">\n {{ resumeData || content?.completionPercentage === 100 ? translateLabels('Start again', 'apptochome') :\n translateLabels('start', 'apptochome') }}\n </ng-container>\n </a>\n </ng-container>\n </ng-container>\n\n <ng-container *ngIf=\"actionBtnStatus == 'reject' && content?.registrationUrl\">\n <a [href]=\"content?.registrationUrl\" target=\"_blank\" class=\"flex action-button justify-center\">{{\n 'apptochome.register' | translate }}</a>\n </ng-container>\n\n </div>\n </ng-template>\n\n <ng-template #progressFunctionality>\n <div class=\"flex flex-row gap-4\">\n <div class=\"flex-1\">\n <div class=\"flex flex-col gap-2\">\n <div class=\"flex flex-row gap-4 text-sm\">\n <div class=\"flex-1 text-xs\">{{ 'apptocsinglepage.overallProgress' | translate }}</div>\n <div class=\"text-xs\" *ngIf=\"content?.completionPercentage > 0\"> {{ content?.completionPercentage }} %</div>\n </div>\n <ws-widget-content-progress *ngIf=\"content?.identifier\" [forPreview]=\"forPreview\"\n [contentId]=\"content?.identifier\" [progress]=\"content?.completionPercentage\" [progressType]=\"'percentage'\"\n [customClassName]=\"'content-progress'\">\n </ws-widget-content-progress>\n </div>\n </div>\n\n <ng-container *ngIf=\"contentCompletionPercent >= 50\">\n <button mat-stroked-button color=\"accent\" type=\"button\" class=\"rate-button\"\n (click)=\"openFeedbackDialog(content)\">\n <mat-icon class=\"nodtranslate\">star_purple500</mat-icon>\n <ng-container *ngIf=\"!userRating\">\n <div>{{ 'apptocsinglepage.rateNow' | translate }}</div>\n </ng-container>\n <ng-container *ngIf=\"userRating\">\n <div>{{ 'apptocsinglepage.editRating' | translate }}</div>\n </ng-container>\n </button>\n </ng-container>\n </div>\n </ng-template>\n\n <div class=\"toc-banner\">\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"banner-details toc-content\" #bannerDetails>\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex items-center justify-between gap-4\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'132px'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'140px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-row gap-2\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\"\n *ngIf=\"contentReadData?.additionalTags?.includes('iGOT Specialization')\">\n <img class=\"approved-icon\" src=\"./assets/icons/approved.svg\" alt=\"approved\">\n <div class=\"text-xs font-bold text-white leading-3 nodtranslate\">{{\n 'cardcontentv2.iGOTSpecializationProgram' | translate }}</div>\n </div>\n <!-- Knowledge level block for search box -->\n <!-- {{content?.difficultyLevel}} -->\n <div *ngIf=\"contentReadData?.difficultyLevel\" class=\"knowledge-level-container\">\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'beginner'\"\n class=\"level-badge beginner\">\n <!-- <span *ngIf=\"false\" class=\"level-badge beginner\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#DBF4DC\" />\n <path\n d=\"M7.42267 5C7.67927 4.55555 8.32077 4.55556 8.57737 5L12.0415 11C12.2981 11.4444 11.9773 12 11.4641 12H4.53592C4.02272 12 3.70197 11.4444 3.95857 11L7.42267 5Z\"\n fill=\"#49C951\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'intermediate'\"\n class=\"level-badge intermediate\">\n <!-- <span *ngIf=\"true\" class=\"level-badge intermediate\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <rect width=\"16\" height=\"16\" fill=\"#D1DBEC\" />\n <path\n d=\"M7.42267 2.66666C7.67927 2.22221 8.32077 2.22221 8.57737 2.66666L12.0415 8.66666C12.2981 9.1111 11.9773 9.66666 11.4641 9.66666H4.53592C4.02272 9.66666 3.70197 9.1111 3.95857 8.66666L7.42267 2.66666Z\"\n fill=\"#1B4CA1\" />\n <path\n d=\"M7.42267 5.66666C7.67927 5.22221 8.32077 5.22221 8.57737 5.66666L12.0415 11.6667C12.2981 12.1111 11.9773 12.6667 11.4641 12.6667H4.53592C4.02272 12.6667 3.70197 12.1111 3.95857 11.6667L7.42267 5.66666Z\"\n fill=\"#1B4CA1\" stroke=\"#D1DBEC\" stroke-width=\"0.5\" />\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n <span *ngIf=\"contentReadData?.difficultyLevel?.toLowerCase() === 'advanced'\"\n class=\"level-badge advanced\">\n <!-- <span *ngIf=\"false\" class=\"level-badge advanced\"> -->\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" fill=\"none\">\n <g clip-path=\"url(#clip0)\">\n <rect width=\"16\" height=\"16\" fill=\"#FFE6E1\" />\n <path\n d=\"M7.42264 2.33334C7.67924 1.8889 8.32074 1.8889 8.57734 2.33334L12.0414 8.33334C12.298 8.77779 11.9773 9.33334 11.4641 9.33334H4.53589C4.02269 9.33334 3.70194 8.77779 3.95854 8.33334L7.42264 2.33334Z\"\n fill=\"#FF8268\" />\n <path\n d=\"M7.42264 5C7.67924 4.55555 8.32074 4.55556 8.57734 5L12.0414 11C12.298 11.4444 11.9773 12 11.4641 12H4.53589C4.02269 12 3.70194 11.4444 3.95854 11L7.42264 5Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n <path\n d=\"M7.42264 7.66669C7.67924 7.22224 8.32074 7.22224 8.57734 7.66669L12.0414 13.6667C12.298 14.1111 11.9773 14.6667 11.4641 14.6667H4.53589C4.02269 14.6667 3.70194 14.1111 3.95854 13.6667L7.42264 7.66669Z\"\n fill=\"#FF8268\" stroke=\"#FFE6E1\" stroke-width=\"0.5\" />\n </g>\n <defs>\n <clipPath id=\"clip0\">\n <rect width=\"16\" height=\"16\" fill=\"white\" />\n </clipPath>\n </defs>\n </svg>\n {{contentReadData?.difficultyLevel}}\n </span>\n </div>\n\n <div class=\"flex items-center\" *ngIf=\"cbPlanEndDate\">\n <div class=\"flex items-center due-tag text-xs leading-3\"\n [ngClass]=\"{'due-warning': cbPlanDuration === nsCardContentData.UPCOMING, 'due-overdue': cbPlanDuration === nsCardContentData.OVERDUE, 'due-success': cbPlanDuration === nsCardContentData.SUCCESS}\">\n {{ 'common.dueBy' | translate }} - <span class=\"font-bold\">{{ cbPlanEndDate | date: 'd\n MMM,y'}}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\">\n <div class=\"new-version-chip rounded-2xl\" (click)=\"navigateToNewVersion()\"\n (keydown)=\"navigateToNewVersion()\">\n <span class=\"new-version-text nodtranslate\">{{ 'apptoc.newVersion' | translate }}</span>\n </div>\n </ng-container>\n <div class=\"flex items-center text-white mob-share\" *ngIf=\"canShare\">\n <mat-icon class=\"nodtranslate\" (click)=\"onClickOfShare()\">share</mat-icon>\n </div>\n </div>\n <div class=\"flex flex-col gap-2\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'90%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'70%'\" [height]=\"'32px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"banner-text text-base sm:text-4xl leading-6 sm:leading-10 font-bold nodtranslate\">{{\n handleCapitalize(contentReadData?.name) }}</div>\n <div class=\"text-sm sm:text-base source-text font-semibold break-words nodtranslate\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{ 'cardcontentv2.by'\n | translate }} {{ contentReadData?.source }}</div>\n </ng-container>\n </div>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'120px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'88px'\" [height]=\"'24px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex gap-4 items-center\">\n <div class=\"flex flex-row rating-chip py-2 items-center cursor-pointer\"\n (click)=\"handleNavigateToReviews()\" *ngIf=\"content?.averageRating\">\n <div class=\"flex flex-row gap-1 margin-left-s items-center\">\n <mat-icon class=\"nodtranslate\">grade</mat-icon>\n <div class=\"text-white text-sm leading-4\">{{ content?.averageRating }}</div>\n </div>\n <div class=\"separator\"></div>\n <div class=\"text-white text-sm leading-4 margin-right-m\">{{ content?.totalRating | pipeCountTransform }}\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"content?.additionalTags?.length\">\n <div class=\"most-enrolled-chip text-xs leading-3\">\n <span *ngIf=\"content?.additionalTags?.includes('mostTrending')\">{{ 'cardcontentv2.mostTrending' |\n translate }}</span>\n <span *ngIf=\"content?.additionalTags?.includes('mostEnrolled')\">{{ 'cardcontentv2.mostEnrolled' |\n translate }}</span>\n </div>\n </div>\n <div class=\"flex items-center\" *ngIf=\"contentReadData?.retirementDate\">\n <div class=\"new-version-pill text-xs leading-3\" *ngIf=\"contentReadData?.status !== 'Retired'\">\n <span>{{ 'apptoc.pendingRetirement' | translate }}</span>\n </div>\n <div class=\"new-version-retire-pill text-xs leading-3\" *ngIf=\"contentReadData?.status === 'Retired'\">\n <span>{{ 'apptoc.retired' | translate }}</span>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'180px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded blue-2-loader'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader && contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON\">\n <div class=\"text-xs leading-4 source-text nodtranslate\">({{ 'apptoc.lastUpdatedOn' | translate }} {{\n contentReadData?.sYS_INTERNAL_LAST_UPDATED_ON | date: 'MMM d, y' }})</div>\n </ng-container>\n <ng-container>\n <div class=\"flex flex-row gap-2\" *ngIf=\"languageList?.length > 1\">\n <mat-chip-list class=\"lang-chips\">\n <!-- Show up to 6 chips -->\n <ng-container *ngFor=\"let lang of languageList | slice:0:5; let i = index\">\n <mat-chip class=\"matchip-custom\" selectable=\"true\"\n [selected]=\"lang?.identifier === selectedLanguage?.identifier\" (click)=\"onLanguageSelect(lang)\">\n {{ lang.name || lang.value }}\n </mat-chip>\n </ng-container>\n\n <!-- \"More\" chip if there are more than 6 languages -->\n <ng-container *ngIf=\"languageList.length > 5\">\n <mat-chip [matMenuTriggerFor]=\"moreLanguagesMenu\" selectable=\"false\" class=\"more-chip matchip-custom\"\n [selected]=\"isSelectedInMoreDropdown()\">\n More <mat-icon class=\"mat-icon\">keyboard_arrow_down</mat-icon>\n </mat-chip>\n <mat-menu #moreLanguagesMenu=\"matMenu\">\n <mat-radio-group class=\"mat-radio-group flex flex-col gap-2 p-3\" [value]=\"selectedLanguage\">\n <mat-radio-button *ngFor=\"let lang of languageList | slice:5\" [value]=\"lang\"\n [checked]=\"lang?.identifier === selectedLanguage?.identifier\" (change)=\"onLanguageSelect(lang)\">\n {{ lang.displayName || lang.name || lang }}\n </mat-radio-button>\n </mat-radio-group>\n </mat-menu>\n </ng-container>\n </mat-chip-list>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <div class=\"flex flex-row gap-6 fixed-width\">\n <div class=\"toc-content\">\n <ng-container *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM &&\n selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails &&\n selectedBatchData?.content[0]?.enrollmentEndDate\">\n <div class=\"location-details mt-6\">\n <div class=\"flex items-center gap-4 pb-3\">\n <mat-icon class=\"location-icon nodtranslate\">\n location_on\n </mat-icon>\n <div class=\"loc-desc\">\n {{selectedBatchData?.content[0]?.batchAttributes?.batchLocationDetails}}\n </div>\n </div>\n <div class=\"flex items-center gap-4\">\n <mat-icon class=\"event-icon nodtranslate\">\n event</mat-icon>\n <div class=\"loc-desc\">\n Last date of enrollment - {{selectedBatchData?.content[0]?.enrollmentEndDate | date: 'dd/MM/yyyy'}}\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"recommendedCoursesId && !feedbackGiven\">\n <div class=\"px-4 py-3 mt-6 relevent-wrapper\">\n <div class=\"flex gap-4 items-center flex-wrap flex justify-center md:justify-start\">\n <img src=\"/assets/images/sakshamAI/lady-greet.svg\" alt=\"greet\" width=\"56.89\" height=\"64\">\n <div class=\"relevent-info\">\n <span class=\"font-bolder text-sm relevent-heading block mb-1\">{{ 'home.tocReleventHeading' | translate\n }}</span>\n <span class=\"relevent-subinfo font-normal text-sm block\">{{ 'home.tocReleventSubHeading' | translate\n }}</span>\n </div>\n <div class=\"flex flex-middle relevant-container\">\n <div class=\"flex flex-middle relevent-normal relevent-btn py-2 px-4 relevant-box\"\n (mouseenter)=\"isReleventBtnHovered = true\" (mouseleave)=\"isReleventBtnHovered = false\"\n (click)=\"handleAcceptRelevent()\">\n <img [src]=\"isReleventBtnHovered && !isRelevent ? SAKSHAMAI_ICON_LOADER : SAKSHAMAI_ICON_NORMAL\"\n alt=\"loader\" width=\"16\" height=\"16\" class=\"mr-2\">\n <span class=\"text-relevent ff-lato text-sm font-bold\">{{ 'home.relevent' | translate }}</span>\n </div>\n\n <div class=\"flex flex-middle no-button ml-8\" (click)=\"handleDeclineRelevent()\">\n <mat-icon class=\"mat-icon text-no mr-1 nodtranslate\">thumb_down</mat-icon>\n <span class=\"text-no ff-lato text-sm font-bold\">{{ 'home.no' | translate }}</span>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n <div class=\"pb-4 lg:py-4\"\n *ngIf=\"contentReadData?.identifier && content?.identifier && baseContentReadData?.identifier\">\n <!-- Overall progress functionality -->\n <div class=\"mobile-progress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </div>\n <!-- Overall progress functionality -->\n <ws-widget-content-toc [content]=\"content\" [componentName]=\"'toc'\" [pathSet]=\"pathSet\"\n [tocStructure]=\"tocStructure\" [forPreview]=\"forPreview\" [isEnrolled]=\"batchData?.enrolled\"\n [resumeData]=\"resumeData\" [batchData]=\"selectedBatchData\" [skeletonLoader]=\"skeletonLoader\"\n [changeTab]=\"changeTab\" [hierarchyMapData]=\"tocSvc?.hashmap\" [selectedBatchData]=\"selectedBatchData\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"\n [kparray]=\"kparray\" (playResumeForAI)=\"playResumeForAI()\" (enrollUserToAI)=\"enrollUserToAI()\"\n [contentReadData]=\"contentReadData\" [baseContentReadData]=\"baseContentReadData\" [languageList]=\"languageList\"\n [lockCertificate]=\"lockCertificate\" (trigerCompletionSurveyForm)=\"openSurveyFormPopup($event)\"\n (resumeContent)=\"resumeContentData()\"></ws-widget-content-toc>\n <div class=\"mob-tip-for-learner\">\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n </div>\n </div>\n\n\n <div class=\"right-container\">\n\n <!-- if needed sticky of right container add this to below div => #rightContainer -->\n <div class=\"right-content\">\n <div class=\"right-content-inner\">\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'384px'\" [height]=\"'224px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col image-div\"\n [ngStyle]=\"{\n 'background-image': 'url(' + contentReadData?.posterImage + ')', 'background-repeat': 'no-repeat', 'background-size': 'cover'}\"\n [ngClass]=\"{'image-backdrop': scrolled}\">\n <div class=\"flex flex-col justify-between text-container\">\n <div class=\"flex items-center gap-4 justify-between\"\n [ngClass]=\"{'justify-between': scrolled, 'justify-end': !scrolled}\">\n <div class=\"flex flex-row tag-div rounded-2xl gap-1 items-center p-2\" *ngIf=\"scrolled\">\n <mat-icon class=\"ws-mat-orange-text nodtranslate\">video_library</mat-icon>\n <ng-container *ngIf=\"contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.courseCategory, 'searchfilters') }}</div>\n </ng-container>\n <ng-container *ngIf=\"!contentReadData?.courseCategory\">\n <div class=\"text-xs font-bold text-white leading-3\">{{\n translateLabel(contentReadData?.primaryCategory, 'searchfilters') }}</div>\n </ng-container>\n </div>\n <div (click)=\"onClickOfShare()\" class=\"flex flex-row items-center justify-end gap-2 share-tag\"\n *ngIf=\"canShare && !forPreview\">\n <mat-icon class=\"nodtranslate\">share</mat-icon>\n <div>{{ 'apptocsinglepage.share' | translate }}</div>\n </div>\n </div>\n <div class=\"flex flex-col gap-1\" *ngIf=\"scrolled\">\n <div class=\"text-xl leading-6 text-white font-bold\">{{ handleCapitalize(contentReadData?.name) }}\n </div>\n <div class=\"text-sm source-text font-semibold break-words\" #contentSource\n [ngClass]=\"{'sourceEllipsis': sourceEllipsis}\" title=\"{{contentReadData?.source}}\">{{\n 'cardcontentv2.by' | translate }} {{ contentReadData?.source }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n\n\n <div class=\"flex flex-col gap-4 p-5 border-bottom\">\n <div class=\"flex flex-col gap-1 cursor-pointer switch-version\"\n *ngIf=\"!skeletonLoader && contentReadData?.contentVersionInfo?.identifier\"\n (click)=\"navigateToNewVersion()\" (keydown)=\"navigateToNewVersion()\">\n <span class=\"btn-switch\">{{ 'apptoc.switchToNewVersion' | translate }}</span>\n </div>\n\n <div class=\"flex flex-col gap-4\"\n *ngIf=\"contentReadData && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-row gap-3 justify-around\">\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.content[0]?.batchAttributes?.currentBatchSize\n || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.batchSize' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.totalApplied || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalApplied' | translate }}</div>\n </div>\n <div class=\"batch-info\">\n <div class=\"font-base font-bold\">{{ selectedBatchData?.userCount?.enrolled || '0' }}</div>\n <div class=\"batch-label\">{{ 'apptoc.totalEnrolled' | translate }}</div>\n </div>\n </div>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && !preAssessmentCompletionStatus\">\n <a class=\"flex action-button enroll-btn justify-center resume\"\n *ngIf=\"contentReadData?.preEnrolmentResources?.length\" (click)=\"routeToPreAssessent()\">\n <ng-container>\n {{ 'apptochome.preEnroll' | translate }}\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM && preAssessmentCompletionStatus\">\n <a class=\"flex preenrolldone-btn justify-center resume\">\n <ng-container>\n {{ 'apptochome.preEnrollDone' | translate }}<img src=\"/assets/icons/Accept_icon.png\" alt=\"tick\"\n class=\"tick-icon\">\n </ng-container>\n </a>\n </ng-container>\n <ng-container\n *ngIf=\"timer && timer.days >= 0 && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM\">\n <div class=\"flex flex-col gap-6 batch-timer\">\n <div class=\"flex flex-row\">\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n <div class=\"flex\">\n <div class=\"timer-label\">{{ 'apptocsinglepage.batchStartsIn' | translate }}</div>\n </div>\n <div class=\"flex-1\">\n <div class=\"flex underline\"></div>\n </div>\n </div>\n <div class=\"flex flex-row gap-4 justify-center\">\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.days || 0 }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.days' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? timer.hours + 1 : timer.hours }}\n </div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.hours' | translate }}</div>\n </div>\n <div class=\"flex items-center counter-label\">\n :\n </div>\n <div class=\"flex flex-row gap-1 items-center\">\n <div class=\"text-4xl leading-10 counter\">{{ timer.min === 60 ? 00 : timer.min }}</div>\n <div class=\"counter-label\">{{ 'apptocsinglepage.minutes' | translate }}</div>\n </div>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"!forPreview || isInIFrame; else authViewBtn\">\n <ng-container *ngIf=\"!mobile1200 && (\n !contentReadData?.preEnrolmentResources?.length ||\n (contentReadData?.preEnrolmentResources?.length && (preAssessmentCompletionStatus || !preAssessmentRequiredFlag))\n )\">\n\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\"\n [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </ng-container>\n </ng-container>\n </div>\n\n\n <ng-container *ngIf=\"skeletonLoader\">\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'40px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'336px'\" [height]=\"'68px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-4\">\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"content?.isInIntranet && showIntranetMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon>\n <ng-container>{{ 'apptochome.viewedInIntranet' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showInstructorLedMsg\">\n <mat-icon class=\"nodtranslate\">info</mat-icon> \n <ng-container>{{ 'apptochome.notAvailableOnline' | translate }}</ng-container>\n </div>\n <div class=\"flex flex-row items-center gap-2 info-div\" *ngIf=\"showStart.msg === 'youtubeForbidden'\">\n <mat-icon class=\"nodtranslate\">info</mat-icon> \n <ng-container>{{ 'apptochome.youtubeContentBlocked' | translate }}</ng-container>\n </div>\n <div *ngIf=\"showBtn\">\n <a href=\"{{ cscmsUrl }}\" target=\"_blank\" class=\"flex action-button justify-center\">\n {{ 'apptochome.applyForPhysicalTraining' | translate }}</a>\n </div>\n\n <!-- Overall progress functionality -->\n <ng-container *ngIf=\"content?.completionStatus <= 2 && isBatchInProgress\">\n <ng-container [ngTemplateOutlet]=\"progressFunctionality\"></ng-container>\n </ng-container>\n <!-- Overall progress functionality -->\n\n <!-- <div *ngIf=\"resumeData && !userRating\"> -->\n <!-- <ws-app-karmapoints-panel [btntype]=\"'Rate this course'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel> -->\n <!-- </div> -->\n\n <!-- <div *ngIf=\"resumeData && userRating\">\n <ws-app-karmapoints-panel [btntype]=\"'Edit rating'\" [data]=\"kparray\"\n [pCategory]=\"contentReadData?.primaryCategory\"></ws-app-karmapoints-panel>\n </div> -->\n\n <ng-container\n *ngIf=\"actionBtnStatus !== 'wait' && contentReadData?.status !== 'Deleted' && contentReadData?.status !== 'Expired'\">\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </ng-container>\n </div>\n\n <div class=\"karma-points-div\">\n <ws-widget-karma-points [data]=\"kparray\" (clickClaimKarmaPoints)=\"onClickOfClaim($event)\"\n [content]=\"content\"\n [condition]=\"{isPostAssessment: isPostAssessment, content: content, isAcbpCourse: isAcbpCourse, isClaimed: isClaimed, monthlyCapExceed: monthlyCapExceed, isCompletedThisMonth: isCompletedThisMonth, showTakeAssessment: showTakeAssessment, userEnrollmentList: userEnrollmentList, isCompletedThisMonth: isCompletedThisMonth, resumeData: resumeData, userRating: userRating, enrollBtnLoading: enrollBtnLoading, primaryCategory: primaryCategory, currentCourseBatchId: currentCourseBatchId, isAcbpClaim: isAcbpClaim}\"></ws-widget-karma-points>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-wrap gap-6\">\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n <div class=\"flex flex-col items-center gap-2 kpi-loader-div\">\n <ws-widget-skeleton-loader [width]=\"'28px'\" [height]=\"'28px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'40px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'48px'\" [height]=\"'8px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <ws-widget-toc-kpi-values [content]=\"content\" [tocStructure]=\"tocStructure\"\n [showInstructorLedMsg]=\"showInstructorLedMsg\" [contentReadData]=\"contentReadData\"\n [languageList]=\"languageList\"></ws-widget-toc-kpi-values>\n </ng-container>\n </div>\n\n <div class=\"flex flex-col gap-8 p-5\">\n <ng-container *ngIf=\"skeletonLoader\">\n <div class=\"flex flex-col gap-4\" *ngFor=\"let i of [1, 2]\">\n <ws-widget-skeleton-loader [width]=\"'72px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n\n <div class=\"flex flex-row items-center gap-3\">\n <ws-widget-skeleton-loader [width]=\"'36px'\" [height]=\"'36px'\"\n [bindingClass]=\"'rounded-full'\"></ws-widget-skeleton-loader>\n <div class=\"flex flex-col gap-2\">\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'20px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n <ws-widget-skeleton-loader [width]=\"'124px'\" [height]=\"'12px'\"\n [bindingClass]=\"'rounded'\"></ws-widget-skeleton-loader>\n </div>\n </div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"!skeletonLoader\">\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorDetails)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.authors' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let author of handleParseJsonData(contentReadData?.creatorDetails)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"author?.photo || ''\" [name]=\"author?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(author?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.author' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\" *ngIf=\"handleParseJsonData(contentReadData?.creatorContacts)?.length\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.creators' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\"\n *ngFor=\"let creeator of handleParseJsonData(contentReadData?.creatorContacts)\">\n <div class=\"flex items-center justify-center\">\n <ws-widget-avatar-photo [randomColor]=\"true\" [datalen]=\"1\" [size]=\"'round-m'\"\n [photoUrl]=\"creeator?.photo || ''\" [name]=\"creeator?.name\">\n </ws-widget-avatar-photo>\n </div>\n <div class=\"flex flex-col gap-1 justify-center\">\n <div class=\"font-bold\">{{ handleCapitalize(creeator?.name, 'name') }}</div>\n <div class=\"text-xs leading-3\">{{ 'apptocsinglepage.creator' | translate }}</div>\n </div>\n </div>\n </div>\n <div class=\"flex flex-col gap-3\"\n *ngIf=\"contentReadData?.source && (contentCreatorData && contentCreatorData?.length)\">\n <div class=\"text-base font-bold\">{{ 'apptocsinglepage.provider' | translate }}</div>\n <div class=\"flex flex-row gap-4 items-center\" *ngFor=\"let creator of contentCreatorData\">\n <div class=\"flex provider-logo-div\">\n <img *ngIf=\"contentReadData?.creatorLogo\" [src]=\"contentReadData?.creatorLogo\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n <img *ngIf=\"!contentReadData?.creatorLogo\" class=\"mat-icon\"\n src=\"/assets/instances/eagle/app_logos/KarmayogiBharat_Logo.svg\"\n alt=\"{{ 'apptocsinglepage.provider' | translate }}\" />\n </div>\n <div class=\"text-sm word-break cursor-pointer\" *ngIf=\"contentReadData?.createdFor?.length\"\n (click)=\"raiseTelemeteryForProvider(contentReadData?.source, contentReadData?.createdFor[0])\"\n [routerLink]=\"['/app/learn/browse-by/provider', contentReadData?.source, contentReadData?.createdFor[0], 'micro-sites']\">\n {{ handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n <div class=\"text-sm word-break\" *ngIf=\"!contentReadData?.createdFor?.length\">{{\n handleCapitalize(contentReadData?.source, 'source') }}\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n\n <div *ngIf=\"learnAdvisoryData && learnAdvisoryData?.length\">\n <ws-widget-tips-for-learner-card [learnAdvisoryData]=\"learnAdvisoryData\"></ws-widget-tips-for-learner-card>\n </div>\n </div>\n\n\n\n </div>\n </div>\n <div class=\"mobile-enroll-div\"\n [ngClass]=\"{'bg-white': contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM }\">\n <ng-container *ngIf=\"content && contentReadData?.primaryCategory === primaryCategory.BLENDED_PROGRAM \">\n <div class=\"mb-2\" *ngIf=\"mobile1200 && !forPreview || isInIFrame; else authViewBtn\">\n <ws-app-toc-banner role=\"banner\" [banners]=\"banners\" [forPreview]=\"forPreview\" [content]=\"content\"\n [userEnrollmentList]=\"userEnrollmentList\" (withdrawOrEnroll)=\"withdrawOrEnroll($event)\"\n [analytics]=\"analytics\" [resumeData]=\"resumeData\" [batchData]=\"batchData\" [contentReadData]=\"contentReadData\">\n </ws-app-toc-banner>\n </div>\n </ng-container>\n <ng-container [ngTemplateOutlet]=\"enrollFunctionality\"></ng-container>\n </div>\n\n <ws-app-share-toc *ngIf=\"enableShare\" [rootOrgId]=\"rootOrgId\" [content]=\"content\"\n (resetEnableShare)=\"resetEnableShare($event)\" [baseContentReadData]=\"baseContentReadData\"></ws-app-share-toc>\n</ng-container>\n<ng-template #noDataFound>\n <div\n class=\"error-not-found flex flex-wrapped margin-left-m margin-top-xl margin-right-m flex-col justify-center align-items-center text-center\">\n <div class=\"error-logo\">\n <div class=\"error-message ws-mat-primary-text font-weight-bold\">\n The page you requested cannot be found\n </div>\n </div>\n <!-- <div class=\"error-support\">\n <div class=\"support-message\" >We have updated our web site and many URLs have changed.</div>\n <div class=\"support-message\" >You might want to:</div>\n </div> -->\n </div>\n\n</ng-template>\n\n<ng-template #authView>{{'apptochome.view' | translate}}</ng-template>\n\n<ng-template #authViewBtn i18n>\n <a (click)=\"raiseTelemetryForPublic($event)\"\n [routerLink]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? resumeDataLink?.url : firstResourceLink?.url)\"\n [queryParams]=\"shouldShowSurveyPopup() ? null : ((resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START'))\"\n class=\"flex action-button justify-center\">\n {{'apptochome.view' | translate}}\n </a>\n</ng-template>\n<ng-template #authViewForInviteOnlyAssessment>\n <ng-container *ngIf=\"forPreview && contentReadData?.courseCategory === 'Invite-Only Assessment'\">\n <a class=\"flex action-button justify-center resume\" [routerLink]=\"firstResourceLink?.url\"\n [queryParams]=\"(resumeData && !certData) ? generateQuery('RESUME') : generateQuery('START')\">\n <ng-container>{{ 'apptochome.takeTest' | translate }}</ng-container>\n </a>\n </ng-container>\n</ng-template>", styles: [".source-text{color:#ffffffb3}.approved-icon{width:12px;height:12px}.preenrolldone-btn{opacity:1;color:#1d8923;font-family:Lato-Bold,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:2px solid #1D8923;cursor:pointer;height:40px;box-sizing:border-box}.preenrolldone-btn img{margin-left:8px;margin-top:-2px}.toc-banner{background:#3a83cf;background:linear-gradient(135deg,#3a83cf,#1b4ca1);width:100%}.toc-banner .fixed-width{padding:0 16px}.toc-banner .banner-details{padding:36px 0}.toc-banner .banner-details .due-tag{padding:4px;color:#fff;border-radius:4px}.toc-banner .banner-details .due-warning{background-color:#ff9800;border:1px solid #FF9800}.toc-banner .banner-details .due-overdue{background-color:#f44336;border:1px solid #F44336}.toc-banner .banner-details .due-success{background-color:#4caf50;border:1px solid #4CAF50}.toc-banner .banner-details .rating-chip{border:1px solid rgba(0,0,0,.6);border-radius:20px;background-color:#0009}.toc-banner .banner-details .rating-chip mat-icon{width:16px;height:16px;color:#ff9800;font-size:16px}.toc-banner .banner-details .rating-chip .separator{width:1px;height:20px;border-right:1px solid rgba(255,255,255,.16);margin:0 8px}.toc-banner .banner-details .banner-text{color:#fffffff2}.toc-banner .info-div{max-width:384px;width:100%}.toc-banner .most-enrolled-chip{background-color:#ffea9e;border:1px solid #FFEA9E;padding:4px;border-radius:2px}.toc-banner .new-version-pill{background-color:#f9cb97;border:1px solid rgb(249,203,151);padding:4px;border-radius:2px}.toc-banner .new-version-retire-pill{background-color:#d13924;border:1px solid #d13924;padding:4px;color:#fff;border-radius:2px}.text-info-div{padding:8px;background-color:#fff;border-radius:64px}.tag-div{border:1px solid #FF9800;background-color:#00000080}.tag-div mat-icon{font-size:12px;width:12px;height:12px}.fixed-width{max-width:1200px;display:block;margin:0 auto}.mat-subheading-1{margin-bottom:4px!important}.initial-circle{width:36px;height:36px;border-radius:50%;background:#1b2133;color:#fff;text-transform:uppercase}.toc-content{max-width:792px;width:100%}.right-container .image-div{height:220px;background-color:#ccc;border-top-left-radius:12px;border-top-right-radius:12px}.right-container .image-div img{max-width:384px;width:100%;height:220px;border-top-left-radius:12px;border-top-right-radius:12px;position:relative;top:-42px}.right-container .image-div .share-container{position:relative;z-index:2;top:20px;margin-right:20px}.right-container .image-div .share-tag{font-weight:700;background-color:#000;border:1px solid #FFF;border-radius:20px;padding:6px 16px;color:#fff;cursor:pointer}.right-container .tag-div mat-icon{width:16px;height:16px;font-size:16px}.right-container .share-tag mat-icon{width:20px;height:20px;font-size:20px}.right-container .text-container{position:relative;z-index:2;height:220px;padding:16px}.right-container .right-content{position:absolute;z-index:10;top:132px;padding-bottom:1rem}.right-container .right-content-inner{background-color:#fff;border-radius:12px;width:384px;margin-bottom:1rem;box-shadow:0 2px 6px -1px #00000080,0 -4px 4px -2px #00000080}.right-container .border-bottom{border-bottom:1px solid rgba(0,0,0,.2)}.right-container .view-more{display:flex;align-items:center;text-align:center;height:40px;justify-content:center}.right-container .view-more:hover{background-color:#dcdfe5}.right-container .info-div{background-color:#fef7ed;border:none;border-radius:8px;padding:8px 12px;font-size:14px}.right-container .info-div .mat-icon{width:18px;height:18px;font-size:18px}.right-container .kpi-values{width:64px;padding:8px;text-align:center}.right-container .kpi-values .timer-icon{color:#1b4ca1;height:20px}.batch-info{padding:16px;border-radius:4px;background-color:#1b4ca114;border:1px solid rgba(27,76,161,.08);text-align:center}.batch-info .batch-label{font-size:.75rem;color:#0009;line-height:1rem}.mob-tip-for-learner{display:none}@media screen and (max-width: 1000px){.mob-tip-for-learner{display:block;width:100%;padding:0 16px;overflow:hidden;box-sizing:border-box}}.button{border-radius:64px;letter-spacing:.25px;padding:12px 36px;font-weight:700;cursor:pointer;text-align:center}@media screen and (max-width: 1200px){.right-container{display:none}.action-button:before{content:\"\";position:absolute;inset:-10px;background-color:#ffffff40;border-radius:inherit;filter:blur(10px);z-index:-1}.action-button:after{content:\"\";position:absolute;inset:-10px;box-shadow:0 0 -4px -4px #fff9;border-radius:inherit;z-index:-1}.karma-points-div{display:none}}.enroll-modal{max-width:600px!important;width:100%!important}.enroll-modal .mat-dialog-container{padding:0;border-radius:12px}.confirmation-modal{max-width:420px!important;width:100%!important}.confirmation-modal .mat-dialog-container{border-radius:12px;padding:0}.image-backdrop{background-color:#000!important;position:relative}.image-backdrop:after{-webkit-backdrop-filter:blur(5px);backdrop-filter:blur(5px);content:\"\";display:block;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#000000a6;border-top-left-radius:12px;border-top-right-radius:12px}@media screen and (max-width: 1000px){.confirmation-modal,.enroll-modal{max-width:90vw!important}}.kpi-loader-div{width:18%}a.action-button{color:#fff!important;width:auto;box-sizing:border-box;height:40px;line-height:24px!important}.rate-button{color:#1b4ca1!important;font-size:.875rem;font-weight:700;border:none!important}.rate-button .mat-button-wrapper{display:flex;gap:8px;align-items:center}.mobile-enroll-div{padding:16px;position:fixed;z-index:1000;bottom:0;width:calc(100% - 32px)}.mobile-enroll-div .action-button,.mobile-enroll-div .preenrolldone-btn{min-width:320px;max-width:400px;margin:auto}@media only screen and (max-width: 768px){.new-version-text{font-size:12px!important}.new-version-chip{padding-top:0!important}}@media screen and (min-width: 1201px){.mobile-enroll-div,.mob-share{display:none!important}.hideAbove1200{display:none}}.mobile-progress{padding:16px}@media screen and (min-width: 1200px){.mobile-progress{display:none}}.sourceEllipsis{white-space:break-spaces;position:relative;overflow:hidden;text-overflow:clip;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;word-break:break-word}.text-white{color:#fff!important}.custom-button,.fluid-width{width:100%}.toc-container{background:#fff;width:100%}mat-divider{border-top-color:#d9d9d9}.sticky{top:56px;overflow:hidden;z-index:10;width:100%}.statusMsg{border-radius:4px;height:40px}.toc-body{padding-bottom:1rem}.toc-body .toc-links{width:100%;z-index:1;border:none;background:transparent}.toc-body .toc-links .mat-tab-link{text-align:left;justify-content:flex-start}.toc-body .toc-links .mat-tab-link.justify-center{justify-content:center}.toc-body .toc-links .mat-tab-link.link-active{color:#0074b6!important}.tab:focus{outline:1px solid!important}.rounded-icon{background:#fff 0% 0% no-repeat padding-box;box-shadow:0 2px 4px #00000029;border:2px solid #00A9F4;border-radius:50%;min-width:0;opacity:1;height:35px;width:35px;padding:0;align-items:center;align-self:center;float:right}.rounded-icon mat-icon{color:#00a9f4}.blue-border{border:2px solid #0074b6!important}.hidden-xs-inline{display:inline}@media only screen and (max-width: 599px){.hidden-xs-inline{display:none}}.visible-xs-inline{display:none}@media only screen and (max-width: 599px){.visible-xs-inline{display:inline}}.meta-section{flex:1;min-width:1px}.meta-section .unit-meta-item{border-radius:2px;box-sizing:border-box;margin-bottom:16px;box-shadow:none;padding-left:0}@media only screen and (max-width: 599px){.meta-section{width:100%}}.font-bold-imp{font-weight:700!important}.info-section{width:20%;min-width:250px}.info-section .custom-button{background:#0074b6 0% 0% no-repeat padding-box!important;border-radius:4px}@media only screen and (max-width: 599px){.info-section{width:100%;margin-left:0!important}}.info-section .glance-container .at-glance-heading{letter-spacing:0px;color:#222}.info-section .glance-container .info-item .cs-icons .mat-icon{color:#666;vertical-align:middle;font-size:20px}.info-section .glance-container .info-item .cs-icons img{width:20px;height:20px;vertical-align:middle}.info-section .glance-container .info-item .item-heading{font:600 14px/21px Lato;margin:0 0 4px;letter-spacing:0px;color:#0074b6!important}.info-section .glance-container .info-item .item-value{letter-spacing:0px;color:#5f5f5f}.info-section .glance-container .info-item .item-icon{width:20px;height:20px;font-size:20px;margin-left:8px}.toc-discussion-container{display:flex;justify-content:space-between;flex-wrap:wrap-reverse}.toc-discussion-container .discussion{flex:1;min-width:1px}.toc-discussion-container .cohorts{width:100%;background:#fff 0% 0% no-repeat padding-box;border:1px solid #D9D9D9;border-radius:8px;box-shadow:none}@media only screen and (min-width: 600px) and (max-width: 959px){.toc-discussion-container .cohorts{margin-left:24px;min-width:250px}}@media only screen and (max-width: 599px){.toc-discussion-container .cohorts{margin-left:0;margin-bottom:24px;width:100%}}.mtb-xl{margin-top:3.5rem;margin-bottom:3.5rem}.detailBar{display:flex}.editDetails{margin:auto;display:flex}.white-bg{background:#fff!important;background-color:#fff!important}.contacts-container{padding:22px 0 10px;border:0;border-top:1px;border-style:solid;border-bottom:1px;border-color:#ececec}.contacts-container .contacts-head{letter-spacing:0px;color:#222;background:transparent;margin-bottom:24px}.contacts-container .author-card{min-width:291px;width:291px;display:flex;flex-direction:row;align-items:center;margin-bottom:30px;padding-right:10px}.contacts-container .author-card .right{padding:0 15px}.contacts-container .author-card .user-name{letter-spacing:0px;color:#5f5f5f}.contacts-container .author-card .user-university{letter-spacing:0px;color:#00a9f4}.contacts-container .author-card .user-button{background:#fff 0% 0% no-repeat padding-box;border:1px solid #F58634;border-radius:15px;letter-spacing:0px;color:#f58634;max-width:60px;padding:4px}.divider-transparent{border-top-color:transparent!important}.scroll-to-top{position:fixed;bottom:15px;right:15px;opacity:0;transition:all .2s ease-in-out;border-radius:50%}.scroll-to-top .icon{font-size:24px!important}.show-scroll{opacity:1;transition:all .2s ease-in-out}.sticky-breadcrumbs{position:sticky;z-index:999;top:72px;width:100%}.sticky-banner{position:sticky;z-index:999}.sticky-navs{position:sticky!important;background:#fff;z-index:999;top:auto}.actbutton{border:1px solid rgba(0,0,0,.16);border-radius:4px;padding:0 15px;width:100%;white-space:nowrap!important;overflow:hidden!important;text-overflow:ellipsis!important}.actbutton .mat-icon{margin-right:6px}.disable-start-btn{cursor:not-allowed!important;pointer-events:none!important;opacity:.5!important}.cb-plan-wrap{opacity:1;color:#1b4ca1;font-family:Lato-Regular;font-size:12px;font-weight:400;font-style:normal;letter-spacing:.25px;text-align:left;line-height:16px}.cb-plan-wrap .cb-danger{border-radius:2px;padding:4px 8px;border:1px solid #d13924;background-color:#d13924!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-success{padding:4px 8px;border-radius:2px;border:1px solid #1d8922;background-color:#1d8922!important;color:#fff!important;opacity:1}.cb-plan-wrap .cb-warning{padding:4px 8px;border-radius:2px;border:1px solid #ef951e;background-color:#ef951e!important;color:#fff!important;opacity:1}.bg-white{background-color:#fff}.provider-logo-div{border-radius:4px;box-shadow:0 2px 1px -1px #0003,0 1px 1px #00000024,0 1px 3px #0000001f}.provider-logo-div img{display:flex;border-radius:4px;width:40px;height:40px;padding:4px}.location-details{background-color:#1b4ca114;padding:16px;border-radius:4px}.location-details .location-icon,.location-details .event-icon{color:#1b4ca1;height:20px;width:14px;font-size:22px}.location-details .loc-desc{font-family:Lato;font-weight:700;font-size:14px;line-height:20px;letter-spacing:.25}.location-details .mat-icon{overflow:visible!important}.batch-timer .underline{border-top:1.5px solid rgba(0,0,0,.16);margin:16px 0}.batch-timer .timer-label{font-size:12px;padding:4px 8px;border:1px solid rgba(0,0,0,.16);border-radius:16px;color:#000000de}.batch-timer .counter{color:#000000de}.batch-timer .counter-label{color:#0006;text-transform:uppercase;font-size:12px;line-height:16px}.relevent-wrapper{background:#1b4ca129;border-radius:12px}.relevent-wrapper .relevent-info{max-width:400px;margin-right:auto}.relevent-wrapper .relevent-info .relevent-heading{font-family:Montserrat;line-height:17.07px;font-weight:600;color:#000!important}.relevent-wrapper .relevent-info .relevent-subinfo{font-family:Lato;line-height:16.8px;color:#545454}.relevent-normal.relevent-btn{position:relative;display:inline-flex;align-items:center;justify-content:center;font-size:16px;font-weight:700;color:#276de5;background-color:#fff;border-radius:21px;text-decoration:none;overflow:hidden;transition:all .3s ease-in-out}.relevent-normal.relevent-btn:hover{box-shadow:0 1px 10px #276de599}.relevent-normal.relevent-btn{cursor:pointer}.relevent-normal.relevent-btn:before{content:\"\";position:absolute;inset:0;padding:2px 2.5px;border-radius:21px;background:linear-gradient(89.96deg,#f3962f .04%,#276de5 99.96%);-webkit-mask:linear-gradient(white,white) content-box,linear-gradient(white,white);-webkit-mask-composite:xor;mask-composite:exclude;opacity:0;transition:opacity .3s ease-in-out;cursor:pointer}.relevent-normal.relevent-btn:hover:before{opacity:1}.relevant-container{width:max-content}.no-button{opacity:1;transform:scale(1);transition:opacity .3s ease-in-out,transform .3s ease-in-out;color:#1b4ca1;cursor:pointer}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom{background:transparent;border:1px solid #fff;color:#fff!important;cursor:pointer;margin:0!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon{color:#fff!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom mat-icon:hover{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected{background:#fff!important;border:1px solid #fff;color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:hover mat-icon,.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom.mat-chip-selected mat-icon{color:#1b4ca1!important}.theme-igot.day-mode .lang-chips .mat-chip.matchip-custom:after{opacity:0!important;background:transparent}.new-version-chip{gap:10px;padding:2px 8px;background-color:#f3962f;cursor:pointer;position:relative;overflow:hidden}.new-version-chip:before{content:\"\";position:absolute;top:0;left:-100%;width:25%;height:100%;background:linear-gradient(314deg,transparent,rgba(213,210,210,.6),transparent);animation:shimmer 1s infinite}.new-version-chip .new-version-text{font-family:Lato;font-weight:400;font-size:20px;line-height:100%}.btn-switch{font-family:Lato,sans-serif;font-size:14px;font-weight:700;font-style:normal;letter-spacing:.5px;text-align:center;line-height:20px;background:#fff;border-radius:64px;padding:8px 16px;border:none;border:1px solid rgb(243,150,47);color:#f3962f;background:#ef951e29!important}@keyframes shimmer{0%{left:-100%}to{left:100%}}.knowledge-level-container{margin-left:auto}.level-badge{display:inline-flex;height:24px;padding:2px 8px;align-items:center;gap:4px;flex-shrink:0;border-radius:12px;font-weight:600;font-size:12px;line-height:16px;white-space:nowrap}.level-badge.beginner{border:1px solid #49C951;background:linear-gradient(0deg,#49c95133 0% 100%),#fff;color:#2f8132;border-radius:16px}.level-badge.intermediate{border:1px solid #1B4CA1;background:linear-gradient(0deg,#1b4ca133 0% 100%),#fff;color:#1b4ca1;border-radius:16px}.level-badge.advanced{border:1px solid #FF8268;background:linear-gradient(0deg,#ff826833 0% 100%),#fff;color:#ff4b25;border-radius:16px}.level-badge svg{flex-shrink:0}\n"] }]
|
|
2815
|
-
}], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i1.Router }, { type: i2.WidgetContentService }, { type: i3.AppTocService }, { type: i4.LoggerService }, { type: i4.ConfigurationsService }, { type: i5.DomSanitizer }, { type: i6.MatLegacySnackBar }, { type: i7.MatLegacyDialog }, { type: i8.MobileAppsService }, { type: i4.UtilityService }, { type: i9.ContentLanguageService }, { type: i10.ActionService }, { type: i11.ViewerUtilService }, { type: i12.RatingService }, { type: i4.TelemetryService }, { type: i13.TranslateService }, { type: i4.MultilingualTranslationsService }, { type: i4.EventService }, { type: i14.LoadCheckService }, { type: i15.HandleClaimService }, { type: i16.ResetRatingsService }, { type: i17.TimerService }, { type: i4.WidgetEnrollService }, { type: i9.WidgetContentLibService }, { type: i4.DataTransferService }, { type: i18.MatSnackBar }, { type: i9.WidgetUserServiceLib }, { type: i19.NetCoreService }, { type: i20.AppTocV2Service }, { type: undefined, decorators: [{
|
|
2816
|
-
type: Inject,
|
|
2817
|
-
args: ['environment']
|
|
2818
|
-
}] }]; }, propDecorators: { forPreview: [{
|
|
2819
|
-
type: Input
|
|
2820
|
-
}], menuElement: [{
|
|
2821
|
-
type: ViewChild,
|
|
2822
|
-
args: ['stickyMenu', { static: true }]
|
|
2823
|
-
}], rcElement: [{
|
|
2824
|
-
type: ViewChild,
|
|
2825
|
-
args: ['rightContainer']
|
|
2826
|
-
}], bannerElem: [{
|
|
2827
|
-
type: ViewChild,
|
|
2828
|
-
args: ['bannerDetails', { static: true }]
|
|
2829
|
-
}], contentSource: [{
|
|
2830
|
-
type: ViewChild,
|
|
2831
|
-
args: ['contentSource']
|
|
2832
|
-
}], handleScroll: [{
|
|
2833
|
-
type: HostListener,
|
|
2834
|
-
args: ['window:scroll', ['$event']]
|
|
2835
|
-
}] } });
|
|
2836
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9jb21wb25lbnRzL2FwcC10b2MtaG9tZS12Mi9hcHAtdG9jLWhvbWUtdjIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL2NvbXBvbmVudHMvYXBwLXRvYy1ob21lLXYyL2FwcC10b2MtaG9tZS12Mi5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUNULFlBQVksRUFBYyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsS0FBSyxFQUM3RCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUE7QUFFdEIsT0FBTyxFQUF1QyxhQUFhLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUNwRixPQUFPLEVBQUUsa0JBQWtCLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFHL0QsT0FBTyxFQUE0QixPQUFPLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUNsRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFDeEUsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLDJCQUEyQjtBQUMzQixPQUFPLENBQUMsTUFBTSxRQUFRLENBQUE7QUFFdEIsT0FBTyxNQUFNLE1BQU0sUUFBUSxDQUFBO0FBQzNCLE9BQU8sY0FBYyxNQUFNLDZCQUE2QixDQUFBO0FBRXhELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQTtBQUVoRSxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQTtBQUV4RSxPQUFPLEVBSWdDLFFBQVEs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LFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFBO1FBQ3BILElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxXQUFXLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQTtJQUNyRSxDQUFDOytHQTMvRlUscUJBQXFCLHErQkEwTnRCLGFBQWE7bUdBMU5aLHFCQUFxQiwwa0JDaEZsQyxzOTlEQXkrQmM7OzRGRHo1QkQscUJBQXFCO2tCQVBqQyxTQUFTOytCQUNFLHdCQUF3QixpQkFJbkIsaUJBQWlCLENBQUMsSUFBSTs7MEJBNE5sQyxNQUFNOzJCQUFDLGFBQWE7NENBbE1kLFVBQVU7c0JBQWxCLEtBQUs7Z0JBeUNxQyxXQUFXO3NCQUFyRCxTQUFTO3VCQUFDLFlBQVksRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBdURaLFNBQVM7c0JBQXJDLFNBQVM7dUJBQUMsZ0JBQWdCO2dCQUNtQixVQUFVO3NCQUF2RCxTQUFTO3VCQUFDLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ2hCLGFBQWE7c0JBQXhDLFNBQVM7dUJBQUMsZUFBZTtnQkFvQzFCLFlBQVk7c0JBRFgsWUFBWTt1QkFBQyxlQUFlLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkLFxuICBIb3N0TGlzdGVuZXIsIEVsZW1lbnRSZWYsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24sIElucHV0LFxuICBJbmplY3QsIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgU2FmZUh0bWwsIERvbVNhbml0aXplciwgU2FmZVN0eWxlIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcidcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBFdmVudCwgRGF0YSwgUm91dGVyLCBOYXZpZ2F0aW9uRW5kIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJ1xuaW1wb3J0IHsgVW50eXBlZEZvcm1Db250cm9sLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnXG4vLyBpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJ1xuaW1wb3J0IHsgVHJhbnNsYXRlU2VydmljZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnXG5pbXBvcnQgeyBTdWJzY3JpcHRpb24sIE9ic2VydmFibGUsIFN1YmplY3QsIG9mLCBmcm9tIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIHNoYXJlLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuaW1wb3J0IGRheWpzIGZyb20gJ2RheWpzJ1xuLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnXG5kYXlqcy5leHRlbmQoaXNTYW1lT3JCZWZvcmUpXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCdcbmltcG9ydCBpc1NhbWVPckJlZm9yZSBmcm9tICdkYXlqcy9wbHVnaW4vaXNTYW1lT3JCZWZvcmUnXG5cbmltcG9ydCB7IE5zQ29udGVudCB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy93aWRnZXQtY29udGVudC5tb2RlbCdcbmltcG9ydCB7IFdpZGdldENvbnRlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3dpZGdldC1jb250ZW50LnNlcnZpY2UnXG5pbXBvcnQgeyB2aWV3ZXJSb3V0ZUdlbmVyYXRvciB9IGZyb20gJy4uLy4uL19zZXJ2aWNlcy92aWV3ZXItcm91dGUtdXRpbCdcbmltcG9ydCB7IE5zV2lkZ2V0UmVzb2x2ZXIgfSBmcm9tICdAc3VuYmlyZC1jYi9yZXNvbHZlci12MidcbmltcG9ydCB7XG4gIENvbmZpZ3VyYXRpb25zU2VydmljZSwgRGF0YVRyYW5zZmVyU2VydmljZSwgRXZlbnRTZXJ2aWNlLFxuICBMb2dnZXJTZXJ2aWNlLCBNdWx0aWxpbmd1YWxUcmFuc2xhdGlvbnNTZXJ2aWNlLFxuICBOc1BhZ2UsIFRGZXRjaFN0YXR1cywgVGVsZW1ldHJ5U2VydmljZSxcbiAgVXRpbGl0eVNlcnZpY2UsIFdpZGdldEVucm9sbFNlcnZpY2UsIFdzRXZlbnRzLFxufSBmcm9tICdAc3VuYmlyZC1jYi91dGlscy12MidcblxuaW1wb3J0IHsgQ29uZmlybWF0aW9uRGlhbG9nQ29tcG9uZW50LCBDb250ZW50TGFuZ3VhZ2VTZXJ2aWNlLCBUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIFdpZGdldENvbnRlbnRMaWJTZXJ2aWNlLCBXaWRnZXRVc2VyU2VydmljZUxpYiB9IGZyb20gJ0BzdW5iaXJkLWNiL2NvbnN1bXB0aW9uJ1xuaW1wb3J0IHsgTnNBcHBUb2MgfSBmcm9tICcuLi8uLi9tb2RlbHMvYXBwLXRvYy5tb2RlbCdcbmltcG9ydCB7IEFwcFRvY1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLnNlcnZpY2UnXG5pbXBvcnQgeyBNb2JpbGVBcHBzU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL21vYmlsZS1hcHBzLnNlcnZpY2UnXG5pbXBvcnQgeyBIYW5kbGVDbGFpbVNlcnZpY2UgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2NvbnRlbnQtc2VydmljZXMvaGFuZGxlLWNsYWltLnNlcnZpY2UnXG5pbXBvcnQgeyBBY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvYWN0aW9uLnNlcnZpY2UnXG5pbXBvcnQgeyBSYXRpbmdTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vX3NlcnZpY2VzL3JhdGluZy5zZXJ2aWNlJ1xuaW1wb3J0IHsgVmlld2VyVXRpbFNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy92aWV3ZXItdXRpbC5zZXJ2aWNlJ1xuaW1wb3J0IHsgTG9hZENoZWNrU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL2xvYWQtY2hlY2suc2VydmljZSdcbmltcG9ydCB7IFJlc2V0UmF0aW5nc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9yZXNldC1yYXRpbmdzLnNlcnZpY2UnXG5cbmltcG9ydCB7IEFwcFRvY0RpYWxvZ0ludHJvVmlkZW9Db21wb25lbnQgfSBmcm9tICcuLi9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby9hcHAtdG9jLWRpYWxvZy1pbnRyby12aWRlby5jb21wb25lbnQnXG5pbXBvcnQgeyBDb250ZW50UmF0aW5nVjJEaWFsb2dDb21wb25lbnQgfSBmcm9tICcuLi8uLi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtcmF0aW5nLXYyLWRpYWxvZy9jb250ZW50LXJhdGluZy12Mi1kaWFsb2cuY29tcG9uZW50J1xuaW1wb3J0IHsgVGltZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZXIuc2VydmljZSdcbmltcG9ydCB7IE1hdExlZ2FjeURpYWxvZyBhcyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktZGlhbG9nJ1xuaW1wb3J0IHsgTWF0TGVnYWN5U25hY2tCYXIgYXMgTWF0U25hY2tCYXIgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9sZWdhY3ktc25hY2stYmFyJ1xuaW1wb3J0IHsgTWF0U25hY2tCYXIgYXMgTWF0U25hY2tiYXJOZXcgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9zbmFjay1iYXInXG5pbXBvcnQgeyBOZXRDb3JlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL25ldGNvcmUuc2VydmljZSdcbmltcG9ydCB7IEVucm9sbExhbmd1YWdlRGlhbG9ndWVDb21wb25lbnQgfSBmcm9tICcuLi9lbnJvbGwtbGFuZ3VhZ2UtZGlhbG9ndWUvZW5yb2xsLWxhbmd1YWdlLWRpYWxvZ3VlLmNvbXBvbmVudCdcbmltcG9ydCB7IENvbXBsZXRpb25TdXJ2ZXlGb3JtQ29tcG9uZW50IH0gZnJvbSAnLi4vY29tcGxldGlvbi1zdXJ2ZXktZm9ybS9jb21wbGV0aW9uLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IFB1YmxpY1N1cnZleUZvcm1Db21wb25lbnQgfSBmcm9tICcuLi9wdWJsaWMtc3VydmV5LWZvcm0vcHVibGljLXN1cnZleS1mb3JtLmNvbXBvbmVudCdcbmltcG9ydCB7IE5zQ2FyZENvbnRlbnQgfSBmcm9tICcuLi8uLi9tb2RlbHMvY2FyZC1jb250ZW50Lm1vZGVsJ1xuaW1wb3J0IHsgTm9uUmVsZXZlbnRGZWVkYmFja0RpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4uL25vbi1yZWxldmVudC1mZWVkYmFjay1kaWFsb2cvbm9uLXJlbGV2ZW50LWZlZWRiYWNrLWRpYWxvZy5jb21wb25lbnQnXG5pbXBvcnQgeyBBcHBUb2NWMlNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9hcHAtdG9jLXYyLnNlcnZpY2UnXG5cbmV4cG9ydCBlbnVtIEVycm9yVHlwZSB7XG4gIGludGVybmFsU2VydmVyID0gJ2ludGVybmFsU2VydmVyJyxcbiAgc2VydmljZVVuYXZhaWxhYmxlID0gJ3NlcnZpY2VVbmF2YWlsYWJsZScsXG4gIHNvbWV0aGluZ1dyb25nID0gJ3NvbWV0aGluZ1dyb25nJyxcbn1cblxuY29uc3QgZmxhdHRlbkl0ZW1zID0gKGl0ZW1zOiBhbnlbXSwga2V5OiBzdHJpbmcgfCBudW1iZXIpID0+IHtcbiAgcmV0dXJuIGl0ZW1zLnJlZHVjZSgoZmxhdHRlbmVkSXRlbXMsIGl0ZW0pID0+IHtcbiAgICBmbGF0dGVuZWRJdGVtcy5wdXNoKGl0ZW0pXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoaXRlbVtrZXldKSkge1xuICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lXG4gICAgICBmbGF0dGVuZWRJdGVtcyA9IGZsYXR0ZW5lZEl0ZW1zLmNvbmNhdChmbGF0dGVuSXRlbXMoaXRlbVtrZXldLCBrZXkpKVxuICAgIH1cbiAgICByZXR1cm4gZmxhdHRlbmVkSXRlbXNcbiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgfSwgW10pXG59XG5jb25zdCBTTkFDS0JBUl9EVVJBVElPTiA9IDMwMDBcbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ3dzLWFwcC1hcHAtdG9jLWhvbWUtdjInLFxuICB0ZW1wbGF0ZVVybDogJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vYXBwLXRvYy1ob21lLXYyLmNvbXBvbmVudC5zY3NzJ10sXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdXNlLWNvbXBvbmVudC12aWV3LWVuY2Fwc3VsYXRpb25cbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgQXBwVG9jSG9tZVYyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBxdWVyeVBhcmFtc0RhdGE6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0gPSB7fTsgLy8gSW5pdGlhbGl6ZSBxdWVyeVBhcmFtc0RhdGFcbiAgc2hvdyA9IGZhbHNlXG4gIGNoYW5nZVRhYiA9IGZhbHNlXG4gIHNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICBiYW5uZXJzOiBOc0FwcFRvYy5JVG9jQmFubmVyIHwgbnVsbCA9IG51bGxcbiAgc2hvd01vcmVHbGFuY2UgPSBmYWxzZVxuICBjb250ZW50OiBOc0NvbnRlbnQuSUNvbnRlbnQgfCBudWxsID0gbnVsbFxuICBjb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGJhc2VDb250ZW50UmVhZERhdGE6IE5zQ29udGVudC5JQ29udGVudCB8IG51bGwgPSBudWxsXG4gIGVycm9yQ29kZTogTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlIHwgbnVsbCA9IG51bGxcbiAgcmVzdW1lRGF0YTogYW55ID0gbnVsbFxuICBuc0NhcmRDb250ZW50RGF0YTogYW55ID0gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3RcbiAgYmF0Y2hEYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlIHwgbnVsbCA9IG51bGxcbiAgY3VycmVudENvdXJzZUJhdGNoSWQ6IHN0cmluZyB8IG51bGwgPSBudWxsXG4gIHVzZXJFbnJvbGxtZW50TGlzdCE6IE5zQ29udGVudC5JQ291cnNlW11cbiAgcm91dGVTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIHBhZ2VOYXZiYXI6IFBhcnRpYWw8TnNQYWdlLklOYXZCYWNrZ3JvdW5kPiA9IHRoaXMuY29uZmlnU3ZjLnBhZ2VOYXZCYXJcbiAgaXNDb2hvcnRzUmVzdHJpY3RlZCA9IGZhbHNlXG4gIHN0aWNreSA9IGZhbHNlXG4gIGlzSW5JZnJhbWUgPSBmYWxzZVxuICBjYlBsYW5FbmREYXRlOiBhbnlcbiAgY2JQbGFuRHVyYXRpb246IGFueVxuICBlbnJvbGxlZENvdXJzZURhdGE6IGFueVxuICBASW5wdXQoKSBmb3JQcmV2aWV3OiBhbnkgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL3B1YmxpYy8nKSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZi5pbmNsdWRlcygnL2F1dGhvci8nKVxuICAvLyBmb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJylcbiAgYW5hbHl0aWNzID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGE/LmFuYWx5dGljc1xuICBlcnJvcldpZGdldERhdGE6IE5zV2lkZ2V0UmVzb2x2ZXIuSVJlbmRlckNvbmZpZ1dpdGhUeXBlZERhdGE8YW55PiA9IHtcbiAgICB3aWRnZXRUeXBlOiAnZXJyb3JSZXNvbHZlcicsXG4gICAgd2lkZ2V0U3ViVHlwZTogJ2Vycm9yUmVzb2x2ZXInLFxuICAgIHdpZGdldERhdGE6IHtcbiAgICAgIGVycm9yVHlwZTogJ2ludGVybmFsU2VydmVyJyxcbiAgICB9LFxuICB9XG4gIGlzQXV0aG9yID0gZmFsc2VcbiAgYXV0aG9yQnRuV2lkZ2V0OiBOc1BhZ2UuSU5hdkxpbmsgPSB7XG4gICAgYWN0aW9uQnRuSWQ6ICdmZWF0dXJlX2F1dGhvcmluZycsXG4gICAgY29uZmlnOiB7XG4gICAgICB0eXBlOiAnbWF0LWJ1dHRvbicsXG4gICAgfSxcbiAgfVxuICB0b2NDb25maWc6IGFueSA9IG51bGxcbiAgcHJpbWFyeUNhdGVnb3J5ID0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnlcbiAgY291cnNlQ2F0ZWdvcnkgPSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5XG4gIFdGQmxlbmRlZFByb2dyYW1TdGF0dXMgPSBOc0NvbnRlbnQuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1c1xuICBhc2tBdXRob3JFbmFibGVkID0gdHJ1ZVxuICB0cmFpbmluZ0xIdWJFbmFibGVkID0gZmFsc2VcbiAgdHJhaW5pbmdMSHViQ291bnQkPzogT2JzZXJ2YWJsZTxudW1iZXI+XG4gIGJvZHk6IFNhZmVIdG1sIHwgbnVsbCA9IG51bGxcbiAgdmlld01vcmVSZWxhdGVkVG9waWNzID0gZmFsc2VcbiAgaGFzVG9jU3RydWN0dXJlID0gZmFsc2VcbiAgdG9jU3RydWN0dXJlOiBOc0FwcFRvYy5JVG9jU3RydWN0dXJlIHwgbnVsbCA9IG51bGxcbiAgY29udGVudFBhcmVudHM6IHsgW2tleTogc3RyaW5nXTogTnNBcHBUb2MuSUNvbnRlbnRQYXJlbnRSZXNwb25zZVtdIH0gPSB7fVxuICBvYmpLZXlzID0gT2JqZWN0LmtleXNcbiAgZnJhZ21lbnQhOiBzdHJpbmdcbiAgYWN0aXZlRnJhZ21lbnQgPSB0aGlzLnJvdXRlLmZyYWdtZW50LnBpcGUoc2hhcmUoKSlcbiAgY3VycmVudEZyYWdtZW50ID0gJ292ZXJ2aWV3J1xuICBzaG93U2Nyb2xsITogYm9vbGVhblxuICBzaG93U2Nyb2xsSGVpZ2h0ID0gMzAwXG4gIGhpZGVTY3JvbGxIZWlnaHQgPSAxMFxuICBlbGVtZW50UG9zaXRpb246IGFueVxuICBiYXRjaFN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgYmF0Y2hEYXRhU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICByZXN1bWVEYXRhU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICB0cmFuc2xhdGlvblN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgQFZpZXdDaGlsZCgnc3RpY2t5TWVudScsIHsgc3RhdGljOiB0cnVlIH0pIG1lbnVFbGVtZW50ITogRWxlbWVudFJlZlxuICBiYXRjaENvbnRyb2wgPSBuZXcgVW50eXBlZEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICBjb250ZW50UHJvZ3Jlc3MgPSAwXG4gIGJhbm5lclVybDogU2FmZVN0eWxlIHwgbnVsbCA9IG51bGxcbiAgcm91dGVQYXRoID0gJ292ZXJ2aWV3J1xuICB2YWxpZFBhdGhzID0gbmV3IFNldChbJ292ZXJ2aWV3JywgJ2NvbnRlbnRzJywgJ2FuYWx5dGljcyddKVxuICByb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uIHwgbnVsbCA9IG51bGxcbiAgaW5pdGlhbHJvdXRlRGF0YTogYW55XG4gIGFjdGlvbkJ0blN0YXR1cyA9ICd3YWl0J1xuICBpc1JlZ2lzdHJhdGlvblN1cHBvcnRlZCA9IGZhbHNlXG4gIHNob3dJbnRyYW5ldE1lc3NhZ2UgPSBmYWxzZVxuICBmaXJzdFJlc291cmNlTGluazogeyB1cmw6IHN0cmluZzsgcXVlcnlQYXJhbXM6IHsgW2tleTogc3RyaW5nXTogYW55IH0gfSB8IG51bGwgPSBudWxsXG4gIHJlc3VtZURhdGFMaW5rOiB7IHVybDogc3RyaW5nOyBxdWVyeVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBhbnkgfSB9IHwgbnVsbCA9IG51bGxcbiAgY2VydERhdGE6IGFueSA9IG51bGxcbiAgc2hvd1Rha2VBc3Nlc3NtZW50OiBOc0FwcFRvYy5JUG9zdEFzc2Vzc21lbnQgfCBudWxsID0gbnVsbFxuICBjaGVja1JlZ2lzdHJhdGlvblNvdXJjZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldChbXG4gICAgJ1NraWxsU29mdCBEaWdpdGFsaXphdGlvbicsXG4gICAgJ1NraWxsU29mdCBMZWFkZXJzaGlwJyxcbiAgICAnUGx1cmFsc2lnaHQnLFxuICBdKVxuICBleHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1czogVEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gIHJlZ2lzdGVyRm9yRXh0ZXJuYWwgPSBmYWxzZVxuICBpc0dvYWxzRW5hYmxlZCA9IGZhbHNlXG4gIGNvbnRleHRJZD86IHN0cmluZ1xuICBjb250ZXh0UGF0aD86IHN0cmluZ1xuICBkZWZhdWx0U0xvZ28gPSAnJ1xuICBkaXNhYmxlRW5yb2xsQnRuID0gZmFsc2VcbiAgaXNBc3Nlc3NWaXNpYmxlID0gZmFsc2VcbiAgaXNQcmFjdGljZVZpc2libGUgPSBmYWxzZVxuICBjZXJ0aWZpY2F0ZU9wZW4gPSBmYWxzZVxuICBicmVhZGNydW1iczogYW55XG4gIGhpc3RvcnlEYXRhOiBhbnlcbiAgY291cnNlQ29tcGxldGVTdGF0ZSA9IDJcbiAgdXNlcklkOiBhbnlcbiAgdXNlclJhdGluZzogYW55XG4gIGRha3NodGFOYW1lID0gdGhpcy5lbnZpcm9ubWVudC5kYWtzaHRhTmFtZVxuICBjc2Ntc1VybCA9IHRoaXMuZW52aXJvbm1lbnQuY3NjbXNVcmxcbiAgc2hvd0J0biA9IGZhbHNlXG4gIGNoYW5uZWxJZDogYW55XG4gIHNlbGVjdGVkQmF0Y2hEYXRhOiBhbnlcbiAgc2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbjogYW55XG4gIHNlcnZlckRhdGVTdWJzY3JpcHRpb246IGFueVxuICBzZXJ2ZXJEYXRlOiBhbnlcbiAga3BhcnJheTogYW55ID0gW11cbiAgZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gIGlzQWNicENvdXJzZSA9IGZhbHNlXG4gIGlzQWNicENsYWltID0gZmFsc2VcbiAgY291cnNlSUQ6IGFueVxuICBpc0NsYWltZWQgPSBmYWxzZVxuICBtb250aGx5Q2FwRXhjZWVkID0gZmFsc2VcbiAgaXNDb21wbGV0ZWRUaGlzTW9udGggPSBmYWxzZVxuICBzdGFydERhdGU6IGFueVxuICBlbmREYXRlOiBhbnlcbiAgc3RhcnREYXRlRGlmZmVyZW5jZTogYW55XG4gIGVuZERhdGVEaWZmZXJlbmNlOiBhbnlcbiAgQFZpZXdDaGlsZCgncmlnaHRDb250YWluZXInKSByY0VsZW1lbnQhOiBFbGVtZW50UmVmXG4gIEBWaWV3Q2hpbGQoJ2Jhbm5lckRldGFpbHMnLCB7IHN0YXRpYzogdHJ1ZSB9KSBiYW5uZXJFbGVtITogRWxlbWVudFJlZlxuICBAVmlld0NoaWxkKCdjb250ZW50U291cmNlJykgY29udGVudFNvdXJjZSE6IEVsZW1lbnRSZWZcbiAgc291cmNlRWxsaXBzaXMgPSBmYWxzZVxuICBzY3JvbGxMaW1pdCA9IDBcbiAgcmNFbGVtID0ge1xuICAgIG9mZlNldFRvcDogMCxcbiAgICBCb3R0b21Qb3M6IDAsXG4gIH1cbiAgc2Nyb2xsZWQgPSBmYWxzZVxuICBwYXRoU2V0ID0gbmV3IFNldCgpXG4gIGNhblNoYXJlID0gZmFsc2VcbiAgZW5hYmxlU2hhcmUgPSBmYWxzZVxuICByb290T3JnSWQ6IGFueVxuICBjZXJ0SWQ6IGFueVxuICBtb2JpbGUxMjAwOiBhbnlcbiAgYXNzZXNzbWVudFN0cmlwOiBhbnlcbiAgbGVhcm5BZHZpc29yeURhdGE6IGFueVxuICBjb250ZW50Q3JlYXRvckRhdGE6IGFueSA9IFtdXG4gIC8vIHJhbmRvbWxlYXJuQWR2aXNvcnlPYmo6IGFueVxuICAvLyBsZWFybkFkdmlzb3J5RGF0YUxlbmd0aDogYW55XG5cbiAgcHJpdmF0ZSBkZXN0cm95U3ViamVjdCQgPSBuZXcgU3ViamVjdDxhbnk+KClcbiAgdGltZXJVbnN1YnNjcmliZTogYW55XG4gIHRpbWVyOiBhbnlcbiAgaXNSZWxldmVudEJ0bkhvdmVyZWQgPSBmYWxzZVxuICBTQUtTSEFNQUlfSUNPTl9OT1JNQUwgPSAnL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL2FpLWljb24uc3ZnJ1xuICBTQUtTSEFNQUlfSUNPTl9MT0FERVIgPSAnL2Fzc2V0cy9pbWFnZXMvc2Frc2hhbUFJL3Nha3NoYW1fYWlfbG9hZGVyLmdpZidcbiAgcmVjb21tZW5kZWRDb3Vyc2VzSWQgPSAnJ1xuICBmZWVkYmFja0dpdmVuOiBhbnlcbiAgcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSBmYWxzZVxuICBmcm9tQUlUdXRvciA9IGZhbHNlXG4gIGxhbmd1YWdlTGlzdDogYW55ID0gW11cbiAgc2VsZWN0ZWRMYW5ndWFnZTogYW55XG4gIGxhbmd1YWdlTWFwUHJvZ3Jlc3M6IGFueVxuICBwcmVBc3Nlc3NtZW50UmVxdWlyZWRGbGFnOiBhbnkgPSBmYWxzZVxuICBsb2NrQ2VydGlmaWNhdGUgPSBmYWxzZVxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgaGFuZGxlU2Nyb2xsKCkge1xuICAgIGNvbnN0IHdpbmRvd1Njcm9sbCA9IHdpbmRvdy5wYWdlWU9mZnNldFxuICAgIGlmICh3aW5kb3dTY3JvbGwgPj0gdGhpcy5lbGVtZW50UG9zaXRpb24gLSAxMDApIHtcbiAgICAgIHRoaXMuc3RpY2t5ID0gdHJ1ZVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnN0aWNreSA9IGZhbHNlXG4gICAgfVxuXG4gICAgaWYgKHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgIGlmICgod2luZG93LnNjcm9sbFkgKyB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MpID49IHRoaXMuc2Nyb2xsTGltaXQpIHtcbiAgICAgICAgdGhpcy5yY0VsZW1lbnQubmF0aXZlRWxlbWVudC5zdHlsZS5wb3NpdGlvbiA9ICdzdGlja3knXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAodGhpcy5yY0VsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJ1xuICAgICAgICB9XG5cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyAyMzYuLi4gKE9mZnNldFRvcCBvZiByaWdodCBjb250YWluZXIgKyAxMDQpXG4gICAgaWYgKHdpbmRvdy5zY3JvbGxZID4gKHRoaXMucmNFbGVtLm9mZlNldFRvcCArIDEwNCkpIHtcbiAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2Nyb2xsZWQgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsXG4gICAgcHJpdmF0ZSBjb250ZW50U3ZjOiBXaWRnZXRDb250ZW50U2VydmljZSxcbiAgICBwdWJsaWMgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgbG9nZ2VyU3ZjOiBMb2dnZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBkb21TYW5pdGl6ZXI6IERvbVNhbml0aXplcixcbiAgICBwcml2YXRlIHNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgbW9iaWxlQXBwc1N2YzogTW9iaWxlQXBwc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB1dGlsaXR5U3ZjOiBVdGlsaXR5U2VydmljZSxcbiAgICAvLyBwcml2YXRlIHByb2dyZXNzU3ZjOiBDb250ZW50UHJvZ3Jlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29udGVudExhbmdTdmM6IENvbnRlbnRMYW5ndWFnZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhY3Rpb25TVkM6IEFjdGlvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSB2aWV3ZXJTdmM6IFZpZXdlclV0aWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmF0aW5nU3ZjOiBSYXRpbmdTZXJ2aWNlLFxuICAgIHByaXZhdGUgdGVsZW1ldHJ5U2VydmljZTogVGVsZW1ldHJ5U2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGxhbmd0cmFuc2xhdGlvbnM6IE11bHRpbGluZ3VhbFRyYW5zbGF0aW9uc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBldmVudHM6IEV2ZW50U2VydmljZSxcbiAgICAvLyBwcml2YXRlIG1hdFNuYWNrQmFyOiBNYXRTbmFja0JhcixcbiAgICBwcml2YXRlIGxvYWRDaGVja1NlcnZpY2U6IExvYWRDaGVja1NlcnZpY2UsXG4gICAgcHJpdmF0ZSBoYW5kbGVDbGFpbVNlcnZpY2U6IEhhbmRsZUNsYWltU2VydmljZSxcbiAgICBwcml2YXRlIHJlc2V0UmF0aW5nc1NlcnZpY2U6IFJlc2V0UmF0aW5nc1NlcnZpY2UsXG4gICAgcHJpdmF0ZSB0aW1lclNlcnZpY2U6IFRpbWVyU2VydmljZSxcbiAgICBwdWJsaWMgZW5yb2xsU3ZjOiBXaWRnZXRFbnJvbGxTZXJ2aWNlLFxuICAgIHB1YmxpYyBjb250ZW50TGliU3ZjOiBXaWRnZXRDb250ZW50TGliU2VydmljZSxcbiAgICBwdWJsaWMgZGF0YVRyYW5zZmVyU3ZjOiBEYXRhVHJhbnNmZXJTZXJ2aWNlLFxuICAgIHByaXZhdGUgbWF0U25hY2tiYXJOZXc6IE1hdFNuYWNrYmFyTmV3LFxuICAgIHByaXZhdGUgdXNlclNlcnZpY2VMaWI6IFdpZGdldFVzZXJTZXJ2aWNlTGliLFxuICAgIHB1YmxpYyBuZXRDb3JlU2VydmljZTogTmV0Q29yZVNlcnZpY2UsXG4gICAgcHVibGljIGFwcFRvY1YyU3ZjOiBBcHBUb2NWMlNlcnZpY2UsXG4gICAgQEluamVjdCgnZW52aXJvbm1lbnQnKSBwdWJsaWMgZW52aXJvbm1lbnQ6IGFueVxuICApIHtcbiAgICB0aGlzLmhpc3RvcnlEYXRhID0gaGlzdG9yeS5zdGF0ZVxuICAgIHRoaXMuaGFuZGxlQnJlYWRjcnVtYnMoKVxuICAgIHRoaXMubW9iaWxlQXBwc1N2Yy5tb2JpbGVUb3BIZWFkZXJWaXNpYmlsaXR5U3RhdHVzLm5leHQodHJ1ZSlcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpKSB7XG4gICAgICB0aGlzLnRyYW5zbGF0ZS5zZXREZWZhdWx0TGFuZygnZW4nKVxuICAgICAgY29uc3QgbGFuZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd3ZWJzaXRlTGFuZ3VhZ2UnKSFcbiAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShsYW5nKVxuICAgIH1cblxuICAgIHRoaXMubG9hZENoZWNrU2VydmljZS5jaGlsZENvbXBvbmVudExvYWRlZCQuc3Vic2NyaWJlKF9pc0xvYWRlZCA9PiB7XG4gICAgICAvLyBQcmVzZW50IGluIGFwcC10b2MtYWJvdXQuY29tcG9uZW50XG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICBjb25zdCByYXRpbmdzRGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3JhdGluZ3NEaXYnKSBhcyBhbnlcbiAgICAgICAgICBpZiAocmF0aW5nc0Rpdikge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGxMaW1pdCA9IHJhdGluZ3NEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIGFzIGFueVxuICAgICAgICAgIH1cbiAgICAgICAgfSwgNTAwKVxuICAgICAgfVxuXG4gICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSkge1xuICAgICAgICBjb25zdCBjb250ZW50RGl2ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbnRlbnRDb250YWluZXInKSBhcyBhbnlcbiAgICAgICAgaWYgKGNvbnRlbnREaXYpIHtcbiAgICAgICAgICB0aGlzLnNjcm9sbExpbWl0ID0gY29udGVudERpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b20gYXMgYW55XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuXG4gICAgdGhpcy5oYW5kbGVDbGFpbVNlcnZpY2UuZ2V0Q2xhaW1EYXRhKCkuc3Vic2NyaWJlKChfZXZlbnREYXRhOiBhbnkpID0+IHtcbiAgICAgIHRoaXMub25DbGlja09mQ2xhaW0oX2V2ZW50RGF0YSlcbiAgICB9KVxuICB9XG5cbiAgZ2V0S2FybWFwb2ludHNMaW1pdCgpIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLnVzZXJLYXJtYVBvaW50cygpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcyAmJiByZXMua3BMaXN0KSB7XG4gICAgICAgICAgY29uc3QgaW5mbyA9IHJlcy5rcExpc3QuYWRkaW5mb1xuICAgICAgICAgIGlmIChpbmZvKSB7XG4gICAgICAgICAgICB0aGlzLm1vbnRobHlDYXBFeGNlZWQgPSBKU09OLnBhcnNlKGluZm8pLmNsYWltZWROb25BQ0JQQ291cnNlS2FybWFRdW90YSA+PSA0XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGlzQ291cnNlQ29tcGxldGVkT25UaGlzTW9udGgoKSB7XG4gICAgY29uc3Qgbm93ID0gbW9tZW50KHRoaXMuc2VydmVyRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJylcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBjb25zdCBjb3Vyc2VEYXRhID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGFcbiAgICAgIGlmIChjb3Vyc2VEYXRhICYmIGNvdXJzZURhdGEuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCAmJiBjb3Vyc2VEYXRhLmNvbXBsZXRlZE9uKSB7XG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE9uID0gbW9tZW50KGNvdXJzZURhdGEuY29tcGxldGVkT24pLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGNvbXBsZXRlZE1vbnRoID0gbW9tZW50KGNvbXBsZXRlZE9uLCAnWVlZWS1NTS1ERCcpLm1vbnRoKClcbiAgICAgICAgY29uc3QgY3VycmVudE1vbnRoID0gbW9tZW50KG5vdywgJ1lZWVktTU0tREQnKS5tb250aCgpXG4gICAgICAgIHRoaXMuaXNDb21wbGV0ZWRUaGlzTW9udGggPSBjb21wbGV0ZWRNb250aCA9PT0gY3VycmVudE1vbnRoXG4gICAgICAgIHRoaXMuY29udGVudFsndmlld01vcmUnXSA9IGZhbHNlXG4gICAgICAgIHRoaXMuY29udGVudFsnY29tcGxldGVkT24nXSA9IGNvdXJzZURhdGEuY29tcGxldGVkT25cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmaWx0ZXJlZEFjYnBMaXN0KHJlczogYW55KSB7XG4gICAgcmV0dXJuIHJlcy5maWx0ZXIoKHY6IGFueSkgPT4gdi5pZGVudGlmaWVyID09PSB0aGlzLmNvdXJzZUlEKVxuICB9XG5cbiAgZmluZEFDUEIoKSB7XG4gICAgY29uc3QgbG9jYWxDYnAgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnY2JwRGF0YScpXG4gICAgaWYgKGxvY2FsQ2JwKSB7XG4gICAgICBjb25zdCBzdG9yZWFnZUNicCA9IEpTT04ucGFyc2UobG9jYWxDYnApXG4gICAgICBjb25zdCBjYnAgPSB0aGlzLmZpbHRlcmVkQWNicExpc3Qoc3RvcmVhZ2VDYnApXG4gICAgICBpZiAoY2JwLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBhY2JwID0gJ2NiUGxhbidcbiAgICAgICAgdGhpcy5jYlBsYW5FbmREYXRlID0gY2JwWzBdLmVuZERhdGVcbiAgICAgICAgY29uc3Qgc0RhdGUgPSBkYXlqcyh0aGlzLnNlcnZlckRhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCcpXG4gICAgICAgIGNvbnN0IGRheXNDb3VudCA9IGRheWpzKHRoaXMuY2JQbGFuRW5kRGF0ZSkuZGlmZih0aGlzLnNlcnZlckRhdGUsICdkYXknKVxuICAgICAgICB0aGlzLmNiUGxhbkR1cmF0aW9uID0gZGF5c0NvdW50IDwgMCA/IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0Lk9WRVJEVUUgOiBkYXlzQ291bnQgPiAyOVxuICAgICAgICAgID8gTnNDYXJkQ29udGVudC5BQ0JQQ29uc3QuU1VDQ0VTUyA6IE5zQ2FyZENvbnRlbnQuQUNCUENvbnN0LlVQQ09NSU5HXG4gICAgICAgIGlmIChhY2JwICYmIHRoaXMuY2JQbGFuRW5kRGF0ZSAmJiBhY2JwID09PSAnY2JQbGFuJykge1xuICAgICAgICAgIHRoaXMuaXNBY2JwQ291cnNlID0gdHJ1ZVxuICAgICAgICAgIGNvbnN0IGVEYXRlID0gZGF5anModGhpcy5jYlBsYW5FbmREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgICAgICAgIGlmIChkYXlqcyhzRGF0ZSkuaXNTYW1lT3JCZWZvcmUoZURhdGUpKSB7XG4gICAgICAgICAgICBjb25zdCByZXF1ZXN0T2JqID0ge1xuICAgICAgICAgICAgICByZXF1ZXN0OiB7XG4gICAgICAgICAgICAgICAgZmlsdGVyczoge1xuICAgICAgICAgICAgICAgICAgY29udGV4dFR5cGU6ICdDb3Vyc2UnLFxuICAgICAgICAgICAgICAgICAgY29udGV4dElkOiB0aGlzLmNvdXJzZUlELFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRTdmMuZ2V0Q291cnNlS2FybWFQb2ludHMocmVxdWVzdE9iaikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocmVzICYmIHJlcy5rcExpc3QpIHtcbiAgICAgICAgICAgICAgICBjb25zdCByb3cgPSByZXMua3BMaXN0XG4gICAgICAgICAgICAgICAgaWYgKHJvdy5hZGRpbmZvKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoSlNPTi5wYXJzZShyb3cuYWRkaW5mbykuQUNCUCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gZmFsc2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NsYWltZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQWNicENsYWltID0gdHJ1ZVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlVGVsZW1ldGVyeUZvclByb3ZpZGVyKHByb3ZpZGVyTmFtZTogc3RyaW5nLCBwcml2aWRlcklkOiBzdHJpbmcpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBpZDogJ2J0bi1wcm92aWRlcicsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogcHJvdmlkZXJOYW1lLFxuICAgICAgICB0eXBlOiBwcml2aWRlcklkLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiAnYnRuLXByb3ZpZGVyJyxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfSlcblxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnkoKSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZTogJ2thcm1hcG9pbnRzLWNsYWltJyxcbiAgICAgICAgaWQ6IHRoaXMuY291cnNlSUQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb3Vyc2VJRCxcbiAgICAgICAgdHlwZTogJ2NvdXJzZScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6ICdidG4tYWNicC1jbGFpbScsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuS0FSTUFQT0lOVFMsXG4gICAgICB9KVxuICB9XG5cbiAgb25DbGlja09mQ2xhaW0oZXZlbnQ6IGFueSkge1xuICAgIC8vIHRzbGludDpkaXNhYmxlOm5vLWNvbnNvbGVcbiAgICBjb25zb2xlLmxvZyhldmVudClcbiAgICBjb25zdCByZXF1ZXN0ID0ge1xuICAgICAgdXNlcklkOiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllcixcbiAgICAgIGNvdXJzZUlkOiB0aGlzLmNvdXJzZUlELFxuICAgIH1cbiAgICB0aGlzLnJhaXNlVGVsZW1ldHJ5KClcbiAgICB0aGlzLmNvbnRlbnRTdmMuY2xhaW1LYXJtYXBvaW50cyhyZXF1ZXN0KS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhyZXMpXG4gICAgICB0aGlzLmlzQ2xhaW1lZCA9IHRydWVcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdLYXJtYSBwb2ludHMgYXJlIHN1Y2Nlc3NmdWxseSBjbGFpbWVkLicpXG4gICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZTpuby1jb25zb2xlXG4gICAgICBjb25zb2xlLmxvZyhlcnJvcilcbiAgICAgIHRoaXMub3BlblNuYWNrYmFyKCdzb21ldGhpbmcgd2VudCB3cm9uZy4nKVxuICAgIH0pXG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgaWYgKHRoaXMucmNFbGVtZW50KSB7XG4gICAgICB0aGlzLnJjRWxlbS5Cb3R0b21Qb3MgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcCArIHRoaXMucmNFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gICAgICB0aGlzLnJjRWxlbS5vZmZTZXRUb3AgPSB0aGlzLnJjRWxlbWVudC5uYXRpdmVFbGVtZW50Lm9mZnNldFRvcFxuICAgIH1cbiAgICAvLyBHZXQgVGltZSBmb3IgdGhlIGJhdGNoXG4gICAgdGhpcy50aW1lclVuc3Vic2NyaWJlID0gdGhpcy50aW1lclNlcnZpY2UuZ2V0VGltZXJEYXRhKClcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpXG4gICAgICAuc3Vic2NyaWJlKChfdGltZXI6IGFueSkgPT4ge1xuICAgICAgICB0aGlzLnRpbWVyID0gX3RpbWVyXG4gICAgICB9KVxuICB9XG5cbiAgaGFuZGxlQnJlYWRjcnVtYnMoKSB7XG4gICAgaWYgKHRoaXMuaGlzdG9yeURhdGEpIHtcbiAgICAgIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdTZWFyY2gnKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaHVybCA9IGAvYXBwL2dsb2JhbHNlYXJjaGBcbiAgICAgICAgY29uc3QgcVBhcmFtID0ge1xuICAgICAgICAgIHE6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sXG4gICAgICAgIH1cbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ1NlYXJjaCcsIHVybDogc2VhcmNodXJsLCBxdWVyeVBhcmFtczogcVBhcmFtIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjb21wZXRlbmN5LWRldGFpbHMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L2NvbXBldGVuY3kvJHt0aGlzLmhpc3RvcnlEYXRhLnBhcmFtfWBcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBtYXgtbGluZS1sZW5ndGhcbiAgICAgICAgdGhpcy5icmVhZGNydW1icyA9IHsgdXJsOiAnaG9tZScsIHRpdGxlczogW3sgdGl0bGU6IHRoaXMuaGlzdG9yeURhdGEucGFyYW0sIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2UgaWYgKHRoaXMuaGlzdG9yeURhdGEucGF0aCA9PT0gJ2FsbC1DQlAnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVVJMID0gYC9hcHAvbGVhcm4vYnJvd3NlLWJ5L3Byb3ZpZGVyLyR7dGhpcy5oaXN0b3J5RGF0YS5wYXJhbX1gXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiBgYWxsIENCUCdzYCwgdXJsOiBmaW5hbFVSTCB9LCB7IHRpdGxlOiAnRGV0YWlscycsIHVybDogJ25vbmUnIH1dIH1cbiAgICAgIH0gZWxzZSBpZiAodGhpcy5oaXN0b3J5RGF0YS5wYXRoID09PSAnYWxsLWNvbXBldGVuY2llcycpIHtcbiAgICAgICAgY29uc3QgZmluYWxVcmwgPSBgL2FwcC9sZWFybi9icm93c2UtYnkvY29tcGV0ZW5jeS9hbGwtY29tcGV0ZW5jaWVzYFxuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG1heC1saW5lLWxlbmd0aFxuICAgICAgICB0aGlzLmJyZWFkY3J1bWJzID0geyB1cmw6ICdob21lJywgdGl0bGVzOiBbeyB0aXRsZTogJ2FsbCBjb21wZXRlbmNpZXMnLCB1cmw6IGZpbmFsVXJsIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmhpc3RvcnlEYXRhLnBhdGggPT09ICdjdXJhdGVkQ29sbGVjdGlvbnMnKSB7XG4gICAgICAgIGNvbnN0IGZpbmFsVXJsID0gYC9hcHAvY3VyYXRlZENvbGxlY3Rpb25zL2hvbWVgXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnY3VyYXRlZCBjb2xsZWN0aW9ucycsIHVybDogZmluYWxVcmwgfSwgeyB0aXRsZTogJ0RldGFpbHMnLCB1cmw6ICdub25lJyB9XSB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bWF4LWxpbmUtbGVuZ3RoXG4gICAgICAgIHRoaXMuYnJlYWRjcnVtYnMgPSB7IHVybDogJ2hvbWUnLCB0aXRsZXM6IFt7IHRpdGxlOiAnTGVhcm4nLCB1cmw6ICcvcGFnZS9sZWFybicsIGljb246ICdzY2hvb2wnIH0sIHsgdGl0bGU6ICdEZXRhaWxzJywgdXJsOiAnbm9uZScgfV0gfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgaWYgKHRoaXMuZnJhZ21lbnQpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOiBuby1ub24tbnVsbC1hc3NlcnRpb25cbiAgICAgICAgZG9jdW1lbnQhLnF1ZXJ5U2VsZWN0b3IoYCMke3RoaXMuZnJhZ21lbnR9YCkhLnNjcm9sbFRvKHtcbiAgICAgICAgICB0b3A6IDgwLFxuICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7IH1cbiAgfVxuXG4gIGdldCBlbmFibGVBbmFseXRpY3MoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgcmV0dXJuICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCd0b2NBbmFseXRpY3MnKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc1Jlc291cmNlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGNvbnN0IGlzUmVzb3VyY2UgPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5LTk9XTEVER0VfQVJUSUZBQ1QgfHxcbiAgICAgICAgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuUFJBQ1RJQ0VfUkVTT1VSQ0VcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuRklOQUxfQVNTRVNTTUVOVFxuICAgICAgICB8fCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT01QX0FTU0VTU01FTlRcbiAgICAgICAgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OXG4gICAgICAgIHx8ICEodGhpcy5jb250ZW50LmNoaWxkcmVuICYmIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGgpXG4gICAgICBpZiAoaXNSZXNvdXJjZSkge1xuICAgICAgICB0aGlzLm1vYmlsZUFwcHNTdmMuc2VuZFZpZXdlckRhdGEodGhpcy5jb250ZW50KVxuICAgICAgfVxuICAgICAgcmV0dXJuIGlzUmVzb3VyY2VcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBnZXQgZ2V0U3RhcnREYXRlKCkge1xuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIC8vIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmNvbnRlbnRbJ2JhdGNoZXMnXSwgeyBiYXRjaElkOiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkIH0pIHx8IFtdKVxuICAgICAgY29uc3QgYmF0Y2ggPSB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5iYXRjaFxuICAgICAgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCA9IGJhdGNoLmJhdGNoSWRcbiAgICAgIGlmIChiYXRjaCAmJiB0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgICAgIHRoaXMuc3RhcnREYXRlID0gKF8uZ2V0KGJhdGNoLCAnc3RhcnREYXRlJykpXG4gICAgICAgIC8vIGNvbnN0IHBhcnNlZERhdGUgPSBtb21lbnQodGhpcy5zdGFydERhdGUpO1xuICAgICAgICAvLyBjb25zdCBkYXRlT25seSA9IHBhcnNlZERhdGUuY2xvbmUoKS5zdGFydE9mKCdkYXknKTtcbiAgICAgICAgY29uc3Qgc3RhcnREYXRlVGltZSA9IHRoaXMuc3RhcnREYXRlICYmIG5ldyBEYXRlKHRoaXMuc3RhcnREYXRlKS5nZXRUaW1lKClcbiAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gc3RhcnREYXRlVGltZSAtIG5vd1xuICAgICAgICBpZiAodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICYmIHRoaXMuc3RhcnREYXRlRGlmZmVyZW5jZSA+IDApIHtcbiAgICAgICAgICBjb25zdCBkYXlzID0gTWF0aC5mbG9vcih0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgLyAoMTAwMCAqIDYwICogNjAgKiAyNCkpXG4gICAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKCh0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgJSAoMTAwMCAqIDYwICogNjAgKiAyNCkpIC8gKDEwMDAgKiA2MCAqIDYwKSlcbiAgICAgICAgICBjb25zdCBtaW51dGVzID0gTWF0aC5mbG9vcigodGhpcy5zdGFydERhdGVEaWZmZXJlbmNlICUgKDEwMDAgKiA2MCAqIDYwKSkgLyAoMTAwMCAqIDYwKSlcbiAgICAgICAgICByZXR1cm4gKGAke2RheXN9IERheXMgOiAke2hvdXJzfSBIb3VycyA6ICR7bWludXRlc30gTWludXRlc2ApXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdOQSdcbiAgICAgIH1cbiAgICAgIHJldHVybiAnTkEnXG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSAmJiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuaXNBZnRlcigpKSB7XG4gICAgICAvLyAgIHJldHVybiBtb21lbnQoXy5nZXQoYmF0Y2gsICdzdGFydERhdGUnKSkuZnJvbShub3cpXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykgJiYgbW9tZW50KF8uZ2V0KGJhdGNoLCAnZW5kRGF0ZScpKS5pc0JlZm9yZSgpKSB7XG4gICAgICAvLyAgIHJldHVybiAnTkEnXG4gICAgICAvLyB9XG4gICAgICAvLyBpZiAoc3RhcnREYXRlVGltZSAmJiBtb21lbnQoc3RhcnREYXRlVGltZSkuaXNBZnRlcigpKSAge1xuICAgICAgLy8gICByZXR1cm4gbW9tZW50KHN0YXJ0RGF0ZVRpbWUpLmZyb20obm93KVxuICAgICAgLy8gfVxuICAgICAgLy8gaWYgKGVuZERhdGVUaW1lICYmIG1vbWVudChlbmREYXRlVGltZSkuaXNCZWZvcmUoKSkge1xuICAgICAgLy8gICAgIHJldHVybiAnTkEnXG4gICAgICAvLyAgIH1cbiAgICAgIC8vIHJldHVybiAnTkEnXG4gICAgfSByZXR1cm4gJ05BJ1xuICB9XG5cbiAgZ2V0IGlzQmF0Y2hJblByb2dyZXNzKCkge1xuICAgIC8vIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50WydiYXRjaGVzJ10pIHtcbiAgICAvLyBjb25zdCBiYXRjaGVzID0gdGhpcy5jb250ZW50WydiYXRjaGVzJ10gYXMgTnNDb250ZW50LklCYXRjaFxuICAgIC8vIGlmICh0aGlzLmN1cnJlbnRDb3Vyc2VCYXRjaElkKSB7XG4gICAgLy8gICAvLyBjb25zdCBub3cgPSBtb21lbnQoKS5mb3JtYXQoJ1lZWVktTU0tREQgSEg6bW06c3MnKVxuICAgIC8vICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAvLyAgIGlmICh0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgLy8gICAgIGNvbnN0IGJhdGNoID0gXy5maXJzdChfLmZpbHRlcih0aGlzLmJhdGNoRGF0YS5jb250ZW50LCB7IGJhdGNoSWQ6IHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgfSkgfHwgW10pXG4gICAgLy8gICAgIGlmIChiYXRjaCkge1xuICAgIC8vICAgICAgIC8vIGNvbnN0IHN0YXJ0RGF0ZSA9IG1vbWVudChiYXRjaC5zdGFydERhdGUpLmZvcm1hdCgnWVlZWS1NTS1ERCBISDptbTpzcycpXG4gICAgLy8gICAgICAgLy8gY29uc3QgZW5kRGF0ZSA9IGJhdGNoLmVuZERhdGUgPyBtb21lbnQoYmF0Y2guZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREIEhIOm1tOnNzJykgOiBub3dcbiAgICAvLyAgICAgICAvLyByZXR1cm4gKFxuICAgIC8vICAgICAgIC8vICAgLy8gYmF0Y2guc3RhdHVzICYmXG4gICAgLy8gICAgICAgLy8gICBtb21lbnQoc3RhcnREYXRlKS5pc1NhbWVPckJlZm9yZShub3cpXG4gICAgLy8gICAgICAgLy8gICAmJiBtb21lbnQoZW5kRGF0ZSkuaXNTYW1lT3JBZnRlcihub3cpXG4gICAgLy8gICAgICAgLy8gKVxuICAgIC8vICAgICAgIHRoaXMuc3RhcnREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnc3RhcnRUaW1lJykpXG4gICAgLy8gICAgICAgdGhpcy5lbmREYXRlID0gYmF0Y2ggJiYgKF8uZ2V0KGJhdGNoLCAnZW5kVGltZScpKVxuICAgIC8vICAgICAgIGNvbnN0IGVuZERhdGVUaW1lID0gbmV3IERhdGUodGhpcy5lbmREYXRlKS5nZXRUaW1lKClcbiAgICAvLyAgICAgICB0aGlzLmVuZERhdGVEaWZmZXJlbmNlID0gZW5kRGF0ZVRpbWUgLSBub3dcbiAgICAvLyAgICAgICBpZih0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCkge1xuICAgIC8vICAgICAgIHJldHVybiAgYmF0Y2guc3RhdHVzXG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICB9XG4gICAgLy8gICAgIHJldHVybiBmYWxzZVxuICAgIC8vICAgfVxuICAgIC8vICAgcmV0dXJuIGZhbHNlXG4gICAgLy8gfSByZXR1cm4gZmFsc2VcblxuICAgIGlmICh0aGlzLmVucm9sbGVkQ291cnNlRGF0YSkge1xuICAgICAgY29uc3Qgbm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKClcbiAgICAgIGNvbnN0IGJhdGNoID0gdGhpcy5lbnJvbGxlZENvdXJzZURhdGEuYmF0Y2hcbiAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICBpZiAoYmF0Y2ggJiYgdGhpcy5jdXJyZW50Q291cnNlQmF0Y2hJZCkge1xuICAgICAgICB0aGlzLnN0YXJ0RGF0ZSA9IChfLmdldChiYXRjaCwgJ3N0YXJ0RGF0ZScpKVxuICAgICAgICB0aGlzLmVuZERhdGUgPSAoXy5nZXQoYmF0Y2gsICdlbmREYXRlJykpXG4gICAgICAgIGlmICh0aGlzLmVuZERhdGUpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGVUaW1lID0gdGhpcy5zdGFydERhdGUgJiYgbmV3IERhdGUodGhpcy5zdGFydERhdGUpLmdldFRpbWUoKVxuICAgICAgICAgIGxldCBlbmREYXRlID0gdGhpcy5lbmREYXRlICYmIG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSlcbiAgICAgICAgICBlbmREYXRlLnNldEhvdXJzKDIzLCA1OSwgNTksIDk5OSlcbiAgICAgICAgICBjb25zdCBlbmREYXRlVGltZSA9IGVuZERhdGUuZ2V0VGltZSgpXG4gICAgICAgICAgdGhpcy5zdGFydERhdGVEaWZmZXJlbmNlID0gbm93IC0gc3RhcnREYXRlVGltZVxuICAgICAgICAgIHRoaXMuZW5kRGF0ZURpZmZlcmVuY2UgPSBlbmREYXRlVGltZSAtIG5vd1xuICAgICAgICAgIGlmICh0aGlzLmVuZERhdGVEaWZmZXJlbmNlID4gMCAmJiB0aGlzLnN0YXJ0RGF0ZURpZmZlcmVuY2UgPiAwICYmIGJhdGNoLnN0YXR1cyAhPT0gMikge1xuICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG5cblxuICBnZXRVc2VyUmF0aW5nKGZpcmVVcGRhdGU6IGJvb2xlYW4pIHtcbiAgICBpZiAoIXRoaXMuZm9yUHJldmlldykge1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlKSB7XG4gICAgICAgIHRoaXMudXNlcklkID0gdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUudXNlcklkIHx8ICcnXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkpIHtcbiAgICAgICAgdGhpcy5yYXRpbmdTdmMuZ2V0UmF0aW5nKHRoaXMuY29udGVudC5pZGVudGlmaWVyLCB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5LCB0aGlzLnVzZXJJZCkuc3Vic2NyaWJlKFxuICAgICAgICAgIChyZXM6IGFueSkgPT4ge1xuXG4gICAgICAgICAgICBpZiAocmVzICYmIHJlcy5yZXN1bHQgJiYgcmVzLnJlc3VsdC5yZXNwb25zZSkge1xuICAgICAgICAgICAgICB0aGlzLnVzZXJSYXRpbmcgPSByZXMucmVzdWx0LnJlc3BvbnNlXG4gICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlVXBkYXRlUmV2aWV3cyh0cnVlKVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCd2aWV3JylcbiAgICAgICAgICB9LFxuICAgICAgICAgIChlcnI6IGFueSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ1VTRVIgUkFUSU5HIEZFVENIIEVSUk9SID4nLCBlcnIpXG4gICAgICAgICAgfVxuICAgICAgICApXG4gICAgICB9XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy5jb250ZW50U291cmNlICYmIHRoaXMuY29udGVudFNvdXJjZS5uYXRpdmVFbGVtZW50Lm9mZnNldEhlaWdodCA+IDQ0KSB7XG4gICAgICAgIHRoaXMuc291cmNlRWxsaXBzaXMgPSB0cnVlXG4gICAgICB9XG4gICAgfSwgMjUwKVxuICB9XG5cblxuXG4gIHB1YmxpYyBmZXRjaFVzZXJXRkZvckJsZW5kZWQoKSB7XG4gICAgY29uc3QgYXBwbGljYXRpb25JZHMgPSAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lm1hcChlID0+IGUuYmF0Y2hJZCkpIHx8IFtdXG4gICAgY29uc3QgcmVxID0ge1xuICAgICAgYXBwbGljYXRpb25JZHMsXG4gICAgICBzZXJ2aWNlTmFtZTogJ2JsZW5kZWRwcm9ncmFtJyxcbiAgICAgIGxpbWl0OiAxMDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfVxuXG4gICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQmxlbmRlZFVzZXJXRihyZXEpLnRoZW4oXG4gICAgICAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgIGlmIChkYXRhICYmIGRhdGEucmVzdWx0ICYmIGRhdGEucmVzdWx0LmRhdGEubGVuZ3RoKSB7XG4gICAgICAgICAgY29uc3QgbGF0ZXN0V0YgPSBfLm1heEJ5KGRhdGEucmVzdWx0LmRhdGFbMF0ud2ZJbmZvLCAoZWw6IGFueSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGVsLmxhc3RVcGRhdGVkT24pLmdldFRpbWUoKVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLy8gbGF0ZXN0V0YuY3VycmVudFN0YXR1cyA9IHRoaXMuV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRUpFQ1RFRFxuICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhIS53b3JrRmxvdyA9IHtcbiAgICAgICAgICAgIHdmSW5pdGlhdGVkOiB0cnVlLFxuICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUtbmV4dC1saW5lICovXG4gICAgICAgICAgICBiYXRjaDogdGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50LmZpbmQoKGU6IGFueSkgPT4gZS5iYXRjaElkID09PSBsYXRlc3RXRi5hcHBsaWNhdGlvbklkKSxcbiAgICAgICAgICAgIHdmSXRlbTogbGF0ZXN0V0YsXG4gICAgICAgICAgfVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldFdGRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmluZm8oJ2ZldGNoQmxlbmRlZFVzZXJXRiBkYXRhID09ICcsIGRhdGEpXG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICB9LFxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBjaGVja0lmQmF0Y2hFeGlzdHMobGF0ZXN0OiBhbnkpIHtcbiAgICBpZiAoIXRoaXMuYmF0Y2hEYXRhIHx8ICF0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnQuZmluZChiID0+IGIuYmF0Y2hJZCA9PT0gbGF0ZXN0LmJhdGNoSWQpXG4gIH1cblxuICBwdWJsaWMgZ2V0QmF0Y2hJZCgpOiBzdHJpbmcge1xuICAgIGxldCBiYXRjaElkID0gJydcbiAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCkge1xuICAgICAgZm9yIChjb25zdCBiYXRjaCBvZiB0aGlzLmJhdGNoRGF0YS5jb250ZW50KSB7XG4gICAgICAgIGJhdGNoSWQgPSBiYXRjaC5iYXRjaElkXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiYXRjaElkXG4gIH1cblxuXG4gIHB1YmxpYyBoYW5kbGVBdXRvQmF0Y2hBc3NpZ24oKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgdGhpcy5uYXZpZ2F0ZVRvUGxheWVyUGFnZSgnJylcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgICAgdGhpcy5jaGFuZ2VUYWIgPSAhdGhpcy5jaGFuZ2VUYWJcbiAgICAgIHRoaXMucmFpc2VFbnJvbGxUZWxlbWV0cnkoKVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQpIHtcbiAgICAgICAgdGhpcy5yYWlzZUVucm9sbFRlbGVtZW50cnlGb3JTYWtzaGFtQUlHZW5lcmF0ZWQoKVxuICAgICAgfVxuICAgICAgY29uc3QgYmF0Y2hEYXRhID0gdGhpcy5jb250ZW50UmVhZERhdGEgJiYgdGhpcy5jb250ZW50UmVhZERhdGEuYmF0Y2hlcyAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5iYXRjaGVzWzBdXG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IE5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSkge1xuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSwgYmF0Y2hEYXRhKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNKSB7XG4gICAgICAgIGxldCBtb2RlcmF0ZWRCYXRjaERhdGE6IGFueVxuICAgICAgICBpZiAodGhpcy5iYXRjaERhdGEgJiYgdGhpcy5iYXRjaERhdGEuY29udGVudCAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50Lmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhICYmIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEuY29udGVudCAmJiB0aGlzLnNlbGVjdGVkQmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBtb2RlcmF0ZWRCYXRjaERhdGEgPSB0aGlzLmJhdGNoRGF0YSAmJiB0aGlzLmJhdGNoRGF0YS5jb250ZW50ICYmIHRoaXMuYmF0Y2hEYXRhLmNvbnRlbnRbMF1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLmF1dG9FbnJvbGxDdXJhdGVkUHJvZ3JhbShOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNLCBtb2RlcmF0ZWRCYXRjaERhdGEpXG4gICAgICB9IGVsc2UgaWYgKHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSA9PT0gTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5MRUFSTklOR19QQVRIV0FZKSB7XG4gICAgICAgIHRoaXMuYXV0b0Vucm9sbExlYXJuaW5nUGF0aHdheSgpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmF1dG9Bc3NpZ25FbnJvbGwoKVxuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLmNvbnRlbnRWaWV3RXZlbnRGb3JOZXRDb3JlKCdlbnJvbGwnKVxuICB9XG5cbiAgYXV0b0Vucm9sbExlYXJuaW5nUGF0aHdheSgpIHtcbiAgICB0aGlzLmNvbnRlbnRTdmMuYXV0b0Vucm9sbExQKHRoaXMuY29udGVudD8uaWRlbnRpZmllcikuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coJ2F1dG9FbnJvbGxMZWFybmluZ1BhdGh3YXknLCByZXMpXG4gICAgICBpZiAocmVzKSB7XG4gICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UocmVzKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwdWJsaWMgYXV0b0Vucm9sbEN1cmF0ZWRQcm9ncmFtKHByb2dyYW1UeXBlOiBhbnksIGJhdGNoRGF0YTogYW55KSB7XG4gICAgaWYgKCFiYXRjaERhdGEpIHtcbiAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ05vIGJhY3RoZXMgZm91bmQnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpIHtcbiAgICAgIGxldCB1c2VySWQgPSAnJ1xuICAgICAgaWYgKHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlICYmIHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCkge1xuICAgICAgICB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS51c2VySWRcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJlcSA9IHtcbiAgICAgICAgcmVxdWVzdDoge1xuICAgICAgICAgIHVzZXJJZCxcbiAgICAgICAgICBwcm9ncmFtSWQ6IHRoaXMuY29udGVudC5pZGVudGlmaWVyLFxuICAgICAgICAgIC8vIGFzIG9mIG5vdyBjdXJhdGVkIHByb2dyYW0gb25seSBvbmUgYmF0Y2ggaXMgY29taW5nIG5lZWQgdG8gY2hlY2sgYW5kIG1vZGlmeVxuICAgICAgICAgIGJhdGNoSWQ6IGJhdGNoRGF0YT8uYmF0Y2hJZCxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5hdXRvQXNzaWduQ3VyYXRlZEJhdGNoQXBpKHJlcSwgcHJvZ3JhbVR5cGUpLnN1YnNjcmliZShcbiAgICAgICAgKGRhdGE6IE5zQ29udGVudC5JQmF0Y2hMaXN0UmVzcG9uc2UpID0+IHtcbiAgICAgICAgICBpZiAoZGF0YSkge1xuICAgICAgICAgICAgaWYgKHByb2dyYW1UeXBlID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5Lk1PREVSQVRFRF9QUk9HUkFNICYmIGJhdGNoRGF0YS5lbmREYXRlKSB7XG4gICAgICAgICAgICAgIHRoaXMuYmF0Y2hEYXRhID0ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnQ6IFtiYXRjaERhdGFdLFxuICAgICAgICAgICAgICAgIGVucm9sbGVkOiB0cnVlLFxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcih0cnVlKVxuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgICAgICAgfSwgMjAwMClcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UocmVxLnJlcXVlc3QuYmF0Y2hJZClcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChfZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdfZXJyb3InLCBfZXJyb3IpXG4gICAgICAgICAgLy8gaWYoX2Vycm9yICYmIF9lcnJvci5lcnJvciAmJiBfZXJyb3IuZXJyb3IucGFyYW1zICYmIF9lcnJvci5lcnJvci5wYXJhbXMuZXJyICYmIF9lcnJvci5lcnJvci5wYXJhbXMuZXJyLmVycm1zZykge1xuICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbihfLmdldChfZXJyb3IsICdlcnJvci5wYXJhbXMuZXJybXNnJykgfHwgJ1BsZWFzZSB0cnkgYWdhaW4gbGF0ZXInKVxuICAgICAgICAgIC8vIH1cbiAgICAgICAgICB0aGlzLmVucm9sbEJ0bkxvYWRpbmcgPSBmYWxzZVxuICAgICAgICB9XG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcHVibGljIGF1dG9Bc3NpZ25FbnJvbGwoKSB7XG4vKioqKioqKioqKioqKiAg4pyoIFdpbmRzdXJmIENvbW1hbmQg4q2QICAqKioqKioqKioqKioqL1xuICAvKipcbiAgICogSWYgdGhlIHVzZXIgaXMgbm90IGVucm9sbGVkIGluIHRoZSBjb3Vyc2UsIGF1dG8tYXNzaWducyBhIGJhdGNoIGFuZCBuYXZpZ2F0ZXMgdG8gdGhlIHBsYXllciBwYWdlLlxuICAgKiBJZiB0aGUgdXNlciBpcyBhbHJlYWR5IGVucm9sbGVkLCBkb2VzIG5vdGhpbmcuXG4gICAqL1xuLyoqKioqKiogIDZkOTRjNjQ2LTI1NGMtNDRkNi1hN2MzLTkwYmRiOTUwNzMxOCAgKioqKioqKi8gICAgaWYgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllcikge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLmF1dG9Bc3NpZ25CYXRjaEFwaSh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciwgdGhpcy5zZWxlY3RlZExhbmd1YWdlKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgICBjb250ZW50OiBkYXRhLmNvbnRlbnQsXG4gICAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMuZ2V0QmF0Y2hJZCgpXG4gICAgICAgICAgaWYgKGJhdGNoSWQpIHtcbiAgICAgICAgICAgIHRoaXMubmF2aWdhdGVUb1BsYXllclBhZ2UoYmF0Y2hJZClcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfSxcbiAgICAgICAgKF9lcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKF8uZ2V0KF9lcnJvciwgJ2Vycm9yLnBhcmFtcy5lcnJtc2cnKSB8fCAnUGxlYXNlIHRyeSBhZ2FpbiBsYXRlcicpXG4gICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5hdmlnYXRlVG9QbGF5ZXJQYWdlKGJhdGNoSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IHRydWVcbiAgICAgIGxldCBmaXJzdFBsYXlhYmxlQ29udGVudFxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA9PT0gdGhpcy5zZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIpIHtcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGZldGNoIGhpZXJhcmNoeSBmb3IgdGhlIHNlbGVjdGVkIGxhbmd1YWdlIGluIHBvcHVwIGZpcnN0LCB0aGVuIGdldCBmaXJzdCBwbGF5YWJsZSBjb250ZW50IGFuZCByZWRpcmVjdCB0byBpdFxuICAgICAgICBhd2FpdCB0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UuaWRlbnRpZmllcilcbiAgICAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgICAgIH1cbiAgICAgIGxldCBwcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuc2VjdXJlU2V0dGluZ3MgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSAnTGVhcm5pbmcgUmVzb3VyY2UnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwcmltYXJ5Q2F0ZWdvcnkgPSBmaXJzdFBsYXlhYmxlQ29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgfHwgdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHRoaXMuZ2V0UmVzdW1lVXJsKGZpcnN0UGxheWFibGVDb250ZW50LCBiYXRjaElkLCBwcmltYXJ5Q2F0ZWdvcnkpXG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7dGhpcy5maXJzdFJlc291cmNlTGluay51cmx9YF0sIHsgcXVlcnlQYXJhbXM6IHsgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcywgZnJvbUFJVHV0b3I6IHRoaXMuZnJvbUFJVHV0b3IgfSB9KVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBmZXRjaEJhdGNoRGV0YWlscygpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICBjb25zdCByZXEgPSB7XG4gICAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgICBmaWx0ZXJzOiB7XG4gICAgICAgICAgICBjb3Vyc2VJZDogdGhpcy5jb250ZW50LmlkZW50aWZpZXIsXG4gICAgICAgICAgICBzdGF0dXM6IFsnMCcsICcxJywgJzInXSxcbiAgICAgICAgICAgIC8vIGNyZWF0ZWRCeTogJ2ZjYTI5MjVmLTFlZWUtNDY1NC05MTc3LWZlY2UzZmQ2YWZjOScsXG4gICAgICAgICAgfSxcbiAgICAgICAgICBzb3J0X2J5OiB7IGNyZWF0ZWREYXRlOiAnZGVzYycgfSxcbiAgICAgICAgfSxcbiAgICAgIH1cbiAgICAgIHRoaXMuY29udGVudFN2Yy5mZXRjaENvdXJzZUJhdGNoZXMocmVxKS5zdWJzY3JpYmUoXG4gICAgICAgIChkYXRhOiBOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEgPSBkYXRhXG4gICAgICAgICAgdGhpcy5iYXRjaERhdGEuZW5yb2xsZWQgPSBmYWxzZVxuICAgICAgICAgIHRoaXMudG9jU3ZjLnNldEJhdGNoRGF0YSh0aGlzLmJhdGNoRGF0YSlcbiAgICAgICAgICB0aGlzLnJvdXRlckNoYW5nZUhhbmRsZXIoZmFsc2UpXG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cblxuICBzY3JvbGxUb1RvcCgpIHtcbiAgICAoZnVuY3Rpb24gc21vb3Roc2Nyb2xsKCkge1xuICAgICAgY29uc3QgY3VycmVudFNjcm9sbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3BcbiAgICAgIGlmIChjdXJyZW50U2Nyb2xsID4gMCkge1xuICAgICAgICAvLyB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHNtb290aHNjcm9sbClcbiAgICAgICAgLy8gd2luZG93LnNjcm9sbFRvKDAsIGN1cnJlbnRTY3JvbGwgLSAoY3VycmVudFNjcm9sbCAvIDUpKVxuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgIHRvcDogMCxcbiAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCcsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSkoKVxuICB9XG5cbiAgcHVibGljIGdldENvbXBldGVuY2llcyhjb21wZXRlbmNpZXM6IGFueSkge1xuICAgIGNvbnN0IGNvbXBldGVuY2llc0FycmF5ID0gSlNPTi5wYXJzZShjb21wZXRlbmNpZXMpXG4gICAgY29uc3QgY29tcGV0ZW5jeVN0cmluZ0FycmF5OiBhbnlbXSA9IFtdXG4gICAgY29tcGV0ZW5jaWVzQXJyYXkubWFwKChjOiBhbnkpID0+IHtcbiAgICAgIGNvbXBldGVuY3lTdHJpbmdBcnJheS5wdXNoKGMubmFtZSlcbiAgICB9KVxuICAgIHJldHVybiBjb21wZXRlbmN5U3RyaW5nQXJyYXlcbiAgfVxuXG4gIGdldCBzaG93SW50cmFuZXRNc2coKSB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJldHVybiB0aGlzLnNob3dJbnRyYW5ldE1lc3NhZ2VcbiAgfVxuXG4gIGdldCBzaG93U3RhcnQoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnNob3dTdGFydEJ1dHRvbih0aGlzLmNvbnRlbnQpXG4gIH1cblxuICBnZXQgaXNQb3N0QXNzZXNzbWVudCgpOiBib29sZWFuIHtcbiAgICBpZiAoISh0aGlzLnRvY0NvbmZpZyAmJiB0aGlzLnRvY0NvbmZpZy5wb3N0QXNzZXNzbWVudCkpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiZcbiAgICAgICAgdGhpcy5jb250ZW50LmxlYXJuaW5nTW9kZSA9PT0gJ0luc3RydWN0b3ItTGVkJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGdldCBpc01vYmlsZSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy51dGlsaXR5U3ZjLmlzTW9iaWxlXG4gIH1cblxuICBnZXQgc2hvd1N1YnRpdGxlT25CYW5uZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMudG9jU3ZjLnN1YnRpdGxlT25CYW5uZXJzXG4gIH1cblxuICBwdWJsaWMgaGFuZGxlRW5yb2xsbWVudEVuZERhdGUoYmF0Y2g6IGFueSkge1xuICAgIGNvbnN0IGVucm9sbG1lbnRFbmREYXRlID0gZGF5anMoXy5nZXQoYmF0Y2gsICdlbnJvbGxtZW50RW5kRGF0ZScpKS5mb3JtYXQoJ1lZWVktTU0tREQnKVxuICAgIGNvbnN0IHN5c3RlbURhdGUgPSBkYXlqcygpXG4gICAgcmV0dXJuIGVucm9sbG1lbnRFbmREYXRlID8gZGF5anMoZW5yb2xsbWVudEVuZERhdGUpLmlzQmVmb3JlKHN5c3RlbURhdGUpIDogZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgb3BlblNuYWNrYmFyKHByaW1hcnlNc2c6IHN0cmluZywgZHVyYXRpb246IG51bWJlciA9IDUwMDApIHtcbiAgICB0aGlzLnNuYWNrQmFyLm9wZW4ocHJpbWFyeU1zZywgJ1gnLCB7XG4gICAgICBkdXJhdGlvbixcbiAgICB9KVxuICB9XG5cbiAgZ2V0IHNob3dJbnN0cnVjdG9yTGVkTXNnKCkge1xuICAgIHJldHVybiAoXG4gICAgICB0aGlzLnNob3dBY3Rpb25CdXR0b25zICYmXG4gICAgICB0aGlzLmNvbnRlbnQgJiZcbiAgICAgIHRoaXMuY29udGVudC5sZWFybmluZ01vZGUgPT09ICdJbnN0cnVjdG9yLUxlZCcgJiZcbiAgICAgICF0aGlzLmNvbnRlbnQuY2hpbGRyZW4ubGVuZ3RoICYmXG4gICAgICAhdGhpcy5jb250ZW50LmFydGlmYWN0VXJsXG4gICAgKVxuICB9XG5cbiAgZ2V0IGlzSGVhZGVySGlkZGVuKCkge1xuICAgIHJldHVybiB0aGlzLmlzUmVzb3VyY2UgJiYgdGhpcy5jb250ZW50ICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwubGVuZ3RoXG4gIH1cblxuICBnZXQgc2hvd0FjdGlvbkJ1dHRvbnMoKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzICE9PSAnd2FpdCcgJiZcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LnN0YXR1cyAhPT0gJ0RlbGV0ZWQnICYmXG4gICAgICB0aGlzLmNvbnRlbnQuc3RhdHVzICE9PSAnRXhwaXJlZCdcbiAgICApXG4gIH1cblxuICBnZXQgc2hvd0J1dHRvbkNvbnRhaW5lcigpIHtcbiAgICByZXR1cm4gKFxuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICEodGhpcy5pc01vYmlsZSAmJiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICEoXG4gICAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgICB0aGlzLmNvbnRlbnQuY29udGVudFR5cGUgPT09ICdDb3Vyc2UnICYmXG4gICAgICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5sZW5ndGggPT09IDAgJiZcbiAgICAgICAgIXRoaXMuY29udGVudC5hcnRpZmFjdFVybFxuICAgICAgKSAmJlxuICAgICAgISh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmNvbnRlbnRUeXBlID09PSAnUmVzb3VyY2UnICYmICF0aGlzLmNvbnRlbnQuYXJ0aWZhY3RVcmwpXG4gICAgKVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRSZXN1bWVEYXRhRnJvbUxpc3QodHlwZT86IHN0cmluZyk6IGFueSB8IHZvaWQge1xuICAgIGNvbnN0IHJlc3VtZUNvcHkgPSBbLi4udGhpcy5yZXN1bWVEYXRhXVxuICAgIGlmIChyZXN1bWVDb3B5ICYmIHJlc3VtZUNvcHkubGVuZ3RoKSB7XG4gICAgICBpZiAoIXR5cGUpIHtcbiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuXG4gICAgICAgIGNvbnN0IGxhc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5LnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgIG5ldyBEYXRlKGIubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdEFjY2Vzc1RpbWUpLmdldFRpbWUoKSkuc2hpZnQoKVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgICAgICAgICBtaW1lVHlwZTogbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzICYmIGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY29uc3QgZmlyc3RJdGVtID0gcmVzdW1lQ29weSAmJiByZXN1bWVDb3B5Lmxlbmd0aCAmJiByZXN1bWVDb3B5WzBdXG4gICAgICByZXR1cm4ge1xuICAgICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxuICAgICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge31cbiAgfVxuXG4gIHByaXZhdGUgbW9kaWZ5U2Vuc2libGVDb250ZW50UmF0aW5nKCkge1xuICAgIGlmIChcbiAgICAgIHRoaXMuY29udGVudCAmJlxuICAgICAgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcgJiZcbiAgICAgIHR5cGVvZiB0aGlzLmNvbnRlbnQuYXZlcmFnZVJhdGluZyAhPT0gJ251bWJlcidcbiAgICApIHtcbiAgICAgIHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nID0gKHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nIGFzIGFueSlbdGhpcy5jb25maWdTdmMucm9vdE9yZyB8fCAnJ11cbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgJiYgdHlwZW9mIHRoaXMuY29udGVudC50b3RhbFJhdGluZyAhPT0gJ251bWJlcicpIHtcbiAgICAgIHRoaXMuY29udGVudC50b3RhbFJhdGluZyA9ICh0aGlzLmNvbnRlbnQudG90YWxSYXRpbmcgYXMgYW55KVt0aGlzLmNvbmZpZ1N2Yy5yb290T3JnIHx8ICcnXVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0TGVhcm5pbmdVcmxzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuaXNQcmFjdGljZVZpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LlBSQUNUSUNFKSxcbiAgICAgIClcblxuICAgICAgdGhpcy5pc0Fzc2Vzc1Zpc2libGUgPSBCb29sZWFuKFxuICAgICAgICB0aGlzLnRvY1N2Yy5maWx0ZXJUb2ModGhpcy5jb250ZW50LCBOc0NvbnRlbnQuRUZpbHRlckNhdGVnb3J5LkFTU0VTUyksXG4gICAgICApXG5cbiAgICAgIGNvbnN0IGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICBsZXQgcHJpbWFyeUNhdGVnb3J5XG4gICAgICBpZiAodGhpcy5jb250ZW50LnNlY3VyZVNldHRpbmdzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gJ0xlYXJuaW5nIFJlc291cmNlJ1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcHJpbWFyeUNhdGVnb3J5ID0gZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnlcbiAgICAgIH1cbiAgICAgIHRoaXMuZmlyc3RSZXNvdXJjZUxpbmsgPSB0aGlzLmdldFJlc3VtZVVybChmaXJzdFBsYXlhYmxlQ29udGVudCwgbnVsbCwgcHJpbWFyeUNhdGVnb3J5KVxuXG4gICAgICAvKiB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmUgKi9cbiAgICAgIC8vIGlmIChmaXJzdFBsYXlhYmxlQ29udGVudC5vcHRpb25hbFJlYWRpbmcgJiYgZmlyc3RQbGF5YWJsZUNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ID09PSAnTGVhcm5pbmcgUmVzb3VyY2UnKSB7XG4gICAgICAvLyAgIHRoaXMudXBkYXRlUHJvZ3Jlc3MoMiwgZmlyc3RQbGF5YWJsZUNvbnRlbnQuaWRlbnRpZmllcilcbiAgICAgIC8vIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodXJsOiBzdHJpbmcpIHtcbiAgICBjb25zdCBwYXRoID0gdXJsLnNwbGl0KCcvJykucG9wKClcbiAgICBpZiAocGF0aCAmJiB0aGlzLnZhbGlkUGF0aHMuaGFzKHBhdGgpKSB7XG4gICAgICB0aGlzLnJvdXRlUGF0aCA9IHBhdGhcbiAgICAgIHRoaXMudXBkYXRlQmFubmVyVXJsKClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHVwZGF0ZUJhbm5lclVybCgpIHtcbiAgICBpZiAodGhpcy5iYW5uZXJzKSB7XG4gICAgICB0aGlzLmJhbm5lclVybCA9IHRoaXMuZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZShcbiAgICAgICAgYHVybCgke3RoaXMuYmFubmVyc1t0aGlzLnJvdXRlUGF0aF19KWAsXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgcGxheUludHJvVmlkZW8oKSB7XG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgdGhpcy5kaWFsb2cub3BlbihBcHBUb2NEaWFsb2dJbnRyb1ZpZGVvQ29tcG9uZW50LCB7XG4gICAgICAgIGRhdGE6IHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlbyxcbiAgICAgICAgaGVpZ2h0OiAnMzUwcHgnLFxuICAgICAgICB3aWR0aDogJzYyMHB4JyxcbiAgICAgIH0pXG4gICAgfVxuICB9XG5cbiAgZ2V0IHNhbml0aXplZEludHJvZHVjdG9yeVZpZGVvSWNvbigpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb24pIHtcbiAgICAgIHJldHVybiB0aGlzLmRvbVNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0U3R5bGUoYHVybCgke3RoaXMuY29udGVudC5pbnRyb2R1Y3RvcnlWaWRlb0ljb259KWApXG4gICAgfVxuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBwcml2YXRlIGZldGNoRXh0ZXJuYWxDb250ZW50QWNjZXNzKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCkge1xuICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdmZXRjaGluZydcbiAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgdGhpcy50b2NTdmMuZmV0Y2hFeHRlcm5hbENvbnRlbnRBY2Nlc3ModGhpcy5jb250ZW50LmlkZW50aWZpZXIpLnN1YnNjcmliZShcbiAgICAgICAgICBkYXRhID0+IHtcbiAgICAgICAgICAgIHRoaXMuZXh0ZXJuYWxDb250ZW50RmV0Y2hTdGF0dXMgPSAnZG9uZSdcbiAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IGRhdGEuaGFzQWNjZXNzXG4gICAgICAgICAgfSxcbiAgICAgICAgICBfZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5leHRlcm5hbENvbnRlbnRGZXRjaFN0YXR1cyA9ICdkb25lJ1xuICAgICAgICAgICAgdGhpcy5yZWdpc3RlckZvckV4dGVybmFsID0gZmFsc2VcbiAgICAgICAgICB9LFxuICAgICAgICApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmV4dGVybmFsQ29udGVudEZldGNoU3RhdHVzID0gJ2RvbmUnXG4gICAgICAgIHRoaXMucmVnaXN0ZXJGb3JFeHRlcm5hbCA9IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXRSYXRpbmdJY29uKHJhdGluZ0luZGV4OiBudW1iZXIpOiAnc3RhcicgfCAnc3Rhcl9ib3JkZXInIHwgJ3N0YXJfaGFsZicge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmF2ZXJhZ2VSYXRpbmcpIHtcbiAgICAgIGNvbnN0IGF2Z1JhdGluZyA9IHRoaXMuY29udGVudC5hdmVyYWdlUmF0aW5nXG4gICAgICBjb25zdCByYXRpbmdGbG9vciA9IE1hdGguZmxvb3IoYXZnUmF0aW5nKVxuICAgICAgaWYgKHJhdGluZ0luZGV4IDw9IHJhdGluZ0Zsb29yKSB7XG4gICAgICAgIHJldHVybiAnc3RhcidcbiAgICAgIH1cbiAgICAgIGlmIChyYXRpbmdGbG9vciA9PT0gcmF0aW5nSW5kZXggLSAxICYmIGF2Z1JhdGluZyAlIDEgPiAwKSB7XG4gICAgICAgIHJldHVybiAnc3Rhcl9oYWxmJ1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJ3N0YXJfYm9yZGVyJ1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja1JlZ2lzdHJhdGlvblN0YXR1cygpIHtcbiAgICBjb25zdCBzb3VyY2UgPSAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5zb3VyY2VTaG9ydE5hbWUpIHx8ICcnXG4gICAgaWYgKFxuICAgICAgIXRoaXMuZm9yUHJldmlldyAmJlxuICAgICAgIXRoaXMuaXNSZWdpc3RyYXRpb25TdXBwb3J0ZWQgJiZcbiAgICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25Tb3VyY2VzLmhhcyhzb3VyY2UpXG4gICAgKSB7XG4gICAgICB0aGlzLmNvbnRlbnRTdmNcbiAgICAgICAgLmdldFJlZ2lzdHJhdGlvblN0YXR1cyhzb3VyY2UpXG4gICAgICAgIC50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgaWYgKHJlcy5oYXNBY2Nlc3MpIHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uQnRuU3RhdHVzID0gJ2dyYW50J1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbkJ0blN0YXR1cyA9ICdyZWplY3QnXG4gICAgICAgICAgICBpZiAocmVzLnJlZ2lzdHJhdGlvblVybCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgdGhpcy5jb250ZW50LnJlZ2lzdHJhdGlvblVybCA9IHJlcy5yZWdpc3RyYXRpb25VcmxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5jYXRjaChfZXJyID0+IHsgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3Rpb25CdG5TdGF0dXMgPSAnZ3JhbnQnXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVRdWVyeSh0eXBlOiAnUkVTVU1FJyB8ICdTVEFSVF9PVkVSJyB8ICdTVEFSVCcpOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9IHtcbiAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluayAmJiAodHlwZSA9PT0gJ1NUQVJUJyB8fCB0eXBlID09PSAnU1RBUlRfT1ZFUicpKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5maXJzdFJlc291cmNlTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cblxuICAgIGlmICh0aGlzLnJlc3VtZURhdGFMaW5rICYmIHR5cGUgPT09ICdSRVNVTUUnKSB7XG4gICAgICBsZXQgcVBhcmFtczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmcgfSA9IHtcbiAgICAgICAgLi4udGhpcy5yZXN1bWVEYXRhTGluay5xdWVyeVBhcmFtcyxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICAgIHZpZXdNb2RlOiAnUkVTVU1FJyxcbiAgICAgICAgLy8gY291cnNlTmFtZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50Lm5hbWUgOiAnJyxcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRleHRJZCAmJiB0aGlzLmNvbnRleHRQYXRoKSB7XG4gICAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgICBjb2xsZWN0aW9uSWQ6IHRoaXMuY29udGV4dElkLFxuICAgICAgICAgIGNvbGxlY3Rpb25UeXBlOiB0aGlzLmNvbnRleHRQYXRoLFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgIGRlbGV0ZSBxUGFyYW1zLnZpZXdNb2RlXG4gICAgICB9XG4gICAgICBxUGFyYW1zID0ge1xuICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICBjaGFubmVsSWQ6IHRoaXMuY2hhbm5lbElkLFxuICAgICAgfVxuICAgICAgcmV0dXJuIHFQYXJhbXNcbiAgICB9XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgcmV0dXJuIHt9XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHZpZXdNb2RlOiB0eXBlLFxuICAgIH1cbiAgfVxuXG4gIGdldCBpc0luSUZyYW1lKCk6IGJvb2xlYW4ge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gd2luZG93LnNlbGYgIT09IHdpbmRvdy50b3BcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgfVxuXG4gIG9wZW5GZWVkYmFja0RpYWxvZyhjb250ZW50OiBhbnkpOiB2b2lkIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKENvbnRlbnRSYXRpbmdWMkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc3NjhweCcsXG4gICAgICBkYXRhOiB7IGNvbnRlbnQsIHVzZXJJZDogdGhpcy51c2VySWQsIHVzZXJSYXRpbmc6IHRoaXMudXNlclJhdGluZyB9LFxuICAgIH0pXG5cbiAgICBkaWFsb2dSZWYuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKHJlc3VsdDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMuZ2V0VXNlclJhdGluZyh0cnVlKVxuICAgICAgICAvLyB0aGlzLmdldFVzZXJFbnJvbGxtZW50TGlzdCgpXG4gICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgIHRoaXMucmVzZXRSYXRpbmdzU2VydmljZS5zZXRSYXRpbmdTZXJ2aWNlVXBkYXRlKHRydWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHVwZGF0ZVByb2dyZXNzKHN0YXR1czogbnVtYmVyLCByZXNvdXJjZUlkOiBhbnkpIHtcbiAgICBjb25zdCBjb2xsZWN0aW9uSWQgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnBhcmFtcy5pZCA6ICcnXG4gICAgY29uc3QgYmF0Y2hJZCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMuYmF0Y2hJZCA/XG4gICAgICB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zLmJhdGNoSWQgOiAnJ1xuICAgIGNvbnN0IGlzUHJlQXNzZXNzbWVudCA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMucHJlQXNzZXNzbWVudFxuICAgIGlmIChpc1ByZUFzc2Vzc21lbnQpIHtcbiAgICAgIHJldHVybiB0aGlzLnZpZXdlclN2Y1xuICAgICAgICAucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZUZvclByZUFzc2Vzc21lbnRRdWl6KHJlc291cmNlSWQsIHN0YXR1cylcblxuICAgIH1cbiAgICByZXR1cm4gdGhpcy52aWV3ZXJTdmMucmVhbFRpbWVQcm9ncmVzc1VwZGF0ZVF1aXoocmVzb3VyY2VJZCwgY29sbGVjdGlvbklkLCBiYXRjaElkLCBzdGF0dXMpXG4gIH1cblxuICBnZXRQcm9ncmFtRHVyYXRpb24oYmF0Y2hEYXRhOiBhbnkpIHtcbiAgICBpZiAoYmF0Y2hEYXRhKSB7XG4gICAgICBjb25zdCBzdGFydERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuc3RhcnREYXRlKS5mb3JtYXQoJ1lZWVktTU0tREQnKSlcbiAgICAgIGNvbnN0IGVuZERhdGUgPSBkYXlqcyhkYXlqcyhiYXRjaERhdGEuZW5kRGF0ZSkuZm9ybWF0KCdZWVlZLU1NLUREJykpXG4gICAgICAvLyBhZGRpbmcgMSB0byBpbmNsdWRlIHRoZSBzdGFydCBkYXRlXG4gICAgICByZXR1cm4gKGVuZERhdGUuZGlmZihzdGFydERhdGUsICdkYXlzJykgKyAxKVxuICAgIH1cbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIHdpdGhkcmF3T3JFbnJvbGwoZGF0YTogc3RyaW5nKSB7XG4gICAgaWYgKGRhdGEgPT09IE5zQ29udGVudC5XRkJsZW5kZWRQcm9ncmFtU3RhdHVzLklOSVRJQVRFKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cblxuXG4gIGhhbmRsZUNhcGl0YWxpemUoc3RyOiBzdHJpbmcsIHR5cGU/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCByZXR1cm5WYWx1ZSA9ICcnXG4gICAgaWYgKHN0cikge1xuICAgICAgaWYgKHR5cGUgPT09ICduYW1lJykge1xuICAgICAgICByZXR1cm5WYWx1ZSA9IHN0ci5zcGxpdCgnICcpLm1hcChfc3RyID0+IHtcbiAgICAgICAgICByZXR1cm4gX3N0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIF9zdHIuc2xpY2UoMSlcbiAgICAgICAgfSkuam9pbignICcpXG4gICAgICB9IGVsc2Uge1xuXG4gICAgICAgIHJldHVyblZhbHVlID0gc3RyICYmIChzdHIuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyBzdHIuc2xpY2UoMSkpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXR1cm5WYWx1ZVxuICB9XG5cbiAgcHVibGljIGhhbmRsZVBhcnNlSnNvbkRhdGEoczogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHBhcnNlZFN0cmluZyA9IEpTT04ucGFyc2UocylcbiAgICAgIHJldHVybiBwYXJzZWRTdHJpbmdcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiBbXVxuICAgIH1cbiAgfVxuXG4gIGhhbmRsZU5hdmlnYXRlVG9SZXZpZXdzKCk6IHZvaWQge1xuICAgIGNvbnN0IGVsZW1lbnRUb1ZpZXcgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncmV2aWV3Q29udGFpbmVyJykgYXMgYW55XG5cbiAgICBpZiAoZWxlbWVudFRvVmlldykge1xuICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgdG9wOiBlbGVtZW50VG9WaWV3Lm9mZnNldFRvcCxcbiAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnLFxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICByYWlzZUNlcnRJbnRyZWFjdFRlbGVtZXRyeSgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiBXc0V2ZW50cy5FbnVtSW50ZXJhY3RUeXBlcy5DTElDSyxcbiAgICAgICAgaWQ6ICd2aWV3LWNlcnRpZmljYXRlJyxcbiAgICAgICAgc3ViVHlwZTogV3NFdmVudHMuRW51bUludGVyYWN0U3ViVHlwZXMuQ0VSVElGSUNBVEUsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jZXJ0SWQsICAgLy8gaWQgb2YgdGhlIGNlcnRpZmljYXRlXG4gICAgICAgIHR5cGU6IFdzRXZlbnRzLkVudW1JbnRlcmFjdFN1YlR5cGVzLkNFUlRJRklDQVRFLFxuICAgICAgfSlcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVscyhsYWJlbDogc3RyaW5nLCB0eXBlOiBhbnkpIHtcbiAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJylcbiAgfVxuXG5cblxuICBnZXRMYXN0UGxheWVkUmVzb3VyY2UoKSB7XG4gICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAgICAgfVxuICAgICAgdGhpcy5leHBhbmRUaGVQYXRoKHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICAgIGZpcnN0UGxheWFibGVDb250ZW50ID0gdGhpcy5jb250ZW50U3ZjLmdldEZpcnN0Q2hpbGRJbkhpZXJhcmNoeSh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZXhwYW5kVGhlUGF0aChmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZXhwYW5kVGhlUGF0aChyZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHJlc291cmNlSWQpIHtcbiAgICAgIGNvbnN0IHBhdGggPSB0aGlzLnV0aWxpdHlTdmMuZ2V0UGF0aCh0aGlzLmNvbnRlbnQsIHJlc291cmNlSWQpXG4gICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KHBhdGgubWFwKCh1OiB7IGlkZW50aWZpZXI6IGFueSB9KSA9PiB1LmlkZW50aWZpZXIpKVxuICAgIH1cbiAgfVxuXG4gIHJhaXNlRW5yb2xsVGVsZW1ldHJ5KCkge1xuICAgIHRoaXMuZXZlbnRzLnJhaXNlSW50ZXJhY3RUZWxlbWV0cnkoXG4gICAgICB7XG4gICAgICAgIHR5cGU6ICdjbGljaycsXG4gICAgICAgIHN1YlR5cGU6ICdlbnJvbGwnLFxuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWRFeHQ6IGBidG4tZW5yb2xsYCxcbiAgICAgICAgbW9kdWxlOiBXc0V2ZW50cy5FbnVtVGVsZW1ldHJ5bW9kdWxlcy5DT05URU5ULFxuICAgICAgfVxuICAgIClcbiAgfVxuXG4gIHJhaXNlRW5yb2xsVGVsZW1lbnRyeUZvclNha3NoYW1BSUdlbmVyYXRlZCgpIHtcbiAgICB0aGlzLmV2ZW50cy5yYWlzZUludGVyYWN0VGVsZW1ldHJ5KFxuICAgICAge1xuICAgICAgICB0eXBlOiAnY2xpY2snLFxuICAgICAgICBzdWJUeXBlOiAnZW5yb2xsJyxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICAgIHRhcmdldDoge1xuICAgICAgICAgIGlkOiB0aGlzLnJlY29tbWVuZGVkQ291cnNlc0lkLFxuICAgICAgICAgIHZlcjogXCIxLjBcIixcbiAgICAgICAgICB0eXBlOiBcImlnb3QtYWlcIlxuICAgICAgICB9LFxuICAgICAgfSBhcyBhbnksXG4gICAgICB7XG4gICAgICAgIGlkOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQuaWRlbnRpZmllciA6ICcnLFxuICAgICAgICB0eXBlOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5IDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwYWdlSWQ6IGAvYXBwL3RvYy8ke3RoaXMuY29udGVudD8uaWRlbnRpZmllcn0vb3ZlcnZpZXdfYnRuLWVucm9sbGAsXG4gICAgICAgIG1vZHVsZTogV3NFdmVudHMuRW51bVRlbGVtZXRyeW1vZHVsZXMuQ09OVEVOVCxcbiAgICAgIH1cbiAgICApXG4gIH1cblxuICBvbkNsaWNrT2ZTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gdHJ1ZVxuICAgIHRoaXMucmFpc2VUZWxlbWV0cnlGb3JTaGFyZSgnc2hhcmVDb250ZW50JylcbiAgfVxuXG4gIC8qIHRzbGludDpkaXNhYmxlICovXG4gIHJhaXNlVGVsZW1ldHJ5Rm9yU2hhcmUoc3ViVHlwZTogYW55KSB7XG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgc3ViVHlwZSxcbiAgICAgICAgaWQ6IHRoaXMuY29udGVudCA/IHRoaXMuY29udGVudC5pZGVudGlmaWVyIDogJycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBpZDogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LmlkZW50aWZpZXIgOiAnJyxcbiAgICAgICAgdHlwZTogdGhpcy5jb250ZW50ID8gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA6ICcnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgcGFnZUlkRXh0OiBgYnRuLSR7c3ViVHlwZX1gLFxuICAgICAgICBtb2R1bGU6IFdzRXZlbnRzLkVudW1UZWxlbWV0cnltb2R1bGVzLkNPTlRFTlQsXG4gICAgICB9XG4gICAgKVxuICB9XG5cbiAgcmVzZXRFbmFibGVTaGFyZSgpIHtcbiAgICB0aGlzLmVuYWJsZVNoYXJlID0gZmFsc2VcbiAgfVxuXG4gIHRyYW5zbGF0ZUxhYmVsKGxhYmVsOiBzdHJpbmcsIHR5cGU6IGFueSkge1xuICAgIGlmIChsYWJlbCAmJiB0eXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndHJhbnNsYXRpb25zLnRyYW5zbGF0ZUxhYmVsKGxhYmVsLCB0eXBlLCAnJylcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLmJhdGNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmJhdGNoU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLmJhdGNoRGF0YVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIHRoaXMudG9jU3ZjLmFuYWx5dGljc0ZldGNoU3RhdHVzID0gJ25vbmUnXG4gICAgaWYgKHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVyUGFyYW1TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlc3VtZURhdGFTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgICBpZiAodGhpcy50aW1lclVuc3Vic2NyaWJlKSB7XG4gICAgICB0aGlzLnRpbWVyVW5zdWJzY3JpYmUudW5zdWJzY3JpYmUoKVxuICAgIH1cbiAgfVxuXG4gIHByb2dyYW1FbnJvbGxDYWxsKGJhdGNoRGF0YTogYW55KSB7XG4gICAgdGhpcy5hdXRvRW5yb2xsQ3VyYXRlZFByb2dyYW0oTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSwgYmF0Y2hEYXRhKVxuICB9XG5cbiAgcmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoJGV2ZW50OiBhbnkpIHtcbiAgICAvLyBDaGVjayBpZiB3ZSBzaG91bGQgZmlyc3QgcHJldmVudCBuYXZpZ2F0aW9uIHRvIHBsYXllciBwYWdlXG4gICAgY29uc3Qgc2hvdWxkUHJldmVudE5hdmlnYXRpb24gPSB0aGlzLnNob3VsZFNob3dTdXJ2ZXlQb3B1cCgpXG4gICAgaWYgKHNob3VsZFByZXZlbnROYXZpZ2F0aW9uKSB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKVxuICAgICAgJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXG4gICAgfVxuXG4gICAgdGhpcy5ldmVudHMucmFpc2VJbnRlcmFjdFRlbGVtZXRyeShcbiAgICAgIHtcbiAgICAgICAgdHlwZTogJ2NsaWNrJyxcbiAgICAgICAgaWQ6IFwidmlldy1hc3Nlc3NtZW50XCIsXG4gICAgICAgIHN1YlR5cGU6IFwiYW5vbnltb3VzLWFzc2Vzc21lbnRcIixcbiAgICAgIH0sIHt9LFxuICAgICAge1xuICAgICAgICBtb2R1bGU6ICdMYW5kaW5nIFBhZ2UnLFxuICAgICAgfSlcbiAgICBjb25zb2xlLmxvZygncmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMgJGV2ZW50JywgJGV2ZW50KVxuXG4gICAgaWYgKHNob3VsZFByZXZlbnROYXZpZ2F0aW9uKSB7XG4gICAgICAvLyBQcmVwYXJlIG5hdmlnYXRpb24gZGV0YWlsc1xuICAgICAgY29uc3QgbmF2aWdhdGlvblVybCA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5yZXN1bWVEYXRhTGluaz8udXJsIDogdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgICBjb25zdCBxdWVyeVBhcmFtcyA9ICh0aGlzLnJlc3VtZURhdGEgJiYgIXRoaXMuY2VydERhdGEpID8gdGhpcy5nZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IHRoaXMuZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVxuXG4gICAgICAvLyBPcGVuIHN1cnZleSBwb3B1cCBkaXJlY3RseSB3aXRoIG5hdmlnYXRpb24gZGV0YWlsc1xuICAgICAgaWYgKG5hdmlnYXRpb25VcmwpIHtcbiAgICAgICAgdGhpcy5vcGVuUHVibGljU3VydmV5UG9wdXAobmF2aWdhdGlvblVybCwgcXVlcnlQYXJhbXMpXG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICBzaG91bGRTaG93U3VydmV5UG9wdXAoKTogYm9vbGVhbiB7XG4gICAgLy8gU2luZ2xlIHNvdXJjZSBvZiB0cnV0aCBmb3Igc3VydmV5IHBvcHVwIGNvbmRpdGlvblxuICAgIC8vIENoZWNrIGlmIGl0J3MgcHVibGljIHZpZXcgYW5kIGNvbnRlbnQgaXMgYSBjYXNlIHN0dWR5XG4gICAgcmV0dXJuIHRoaXMuZm9yUHJldmlldyAmJiB0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50UmVhZERhdGFcbiAgICAgICYmIHRoaXMuY29udGVudFJlYWREYXRhLmNvdXJzZUNhdGVnb3J5ID09PSBOc0NvbnRlbnQuRUNvdXJzZUNhdGVnb3J5LkNBU0VfU1RVRFlcbiAgfVxuXG5cbiAgYXN5bmMgY2hlY2tJZlVzZXJFbnJvbGxlZCgpIHtcbiAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gdHJ1ZVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIC8vIG9ubHkgZm9yICByZXNvdXJjZVxuICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5QUk9HUkFNICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUwgJiZcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLnByaW1hcnlDYXRlZ29yeSAhPT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNICYmXG4gICAgICB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEucHJpbWFyeUNhdGVnb3J5ICE9PSB0aGlzLnByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0pIHtcbiAgICAgIC8vIGNvbnN0IGNvbGxlY3Rpb25JZCA9IHRoaXMuaXNSZXNvdXJjZSA/ICcnIDogdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICAgIHJldHVybiB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyKVxuICAgIH1cblxuICAgIGxldCBlbnJvbGxlZENvdXJzZTogTnNDb250ZW50LklDb3Vyc2UgfCB1bmRlZmluZWRcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEuaWRlbnRpZmllciAmJiAhdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICBpZiAodGhpcy51c2VyRW5yb2xsbWVudExpc3QgJiYgdGhpcy51c2VyRW5yb2xsbWVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgIGVucm9sbGVkQ291cnNlID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoY291cnNlOiBhbnkpID0+IHtcbiAgICAgICAgICBjb25zdCBpZGVudGlmaWVyID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyIHx8ICcnXG4gICAgICAgICAgaWYgKGNvdXJzZS5jb3Vyc2VJZCAhPT0gaWRlbnRpZmllcikge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY291cnNlXG4gICAgICAgIH0pXG4gICAgICB9XG5cbiAgICAgIC8vIElmIGN1cnJlbnQgY291cnNlIGlzIHByZXNlbnQgaW4gdGhlIGxpc3Qgb2YgdXNlciBlbnJvbGxlZCBjb3Vyc2VcbiAgICAgIGlmIChlbnJvbGxlZENvdXJzZSAmJiBlbnJvbGxlZENvdXJzZS5iYXRjaElkKSB7XG4gICAgICAgIHRoaXMucmVzdW1lRGF0YVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IHJlc1xuICAgICAgICAgICAgdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSA9IGVucm9sbGVkQ291cnNlXG4gICAgICAgIHRoaXMuaXNDb3Vyc2VDb21wbGV0ZWRPblRoaXNNb250aCgpXG4gICAgICAgIHRoaXMuY3VycmVudENvdXJzZUJhdGNoSWQgPSBlbnJvbGxlZENvdXJzZS5iYXRjaElkXG4gICAgICAgIC8vIHRoaXMuZG93bmxvYWRDZXJ0KGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcylcbiAgICAgICAgaWYgKGVucm9sbGVkQ291cnNlICYmIGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcyAmJlxuICAgICAgICAgIGVucm9sbGVkQ291cnNlLmlzc3VlZENlcnRpZmljYXRlcy5sZW5ndGgpIHtcbiAgICAgICAgICBjb25zdCBjZXJ0aWZpY2F0ZTogYW55ID0gZW5yb2xsZWRDb3Vyc2UuaXNzdWVkQ2VydGlmaWNhdGVzLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAgICAgICAgICAgbmV3IERhdGUoYi5sYXN0SXNzdWVkT24pLmdldFRpbWUoKSAtIG5ldyBEYXRlKGEubGFzdElzc3VlZE9uKS5nZXRUaW1lKCkpXG4gICAgICAgICAgY29uc3QgY2VydElkID0gY2VydGlmaWNhdGVbMF0uaWRlbnRpZmllclxuICAgICAgICAgIHRoaXMuY2VydElkID0gY2VydElkXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50WydjZXJ0aWZpY2F0ZU9iaiddID0ge1xuICAgICAgICAgICAgICBjZXJ0SWQsXG4gICAgICAgICAgICAgIGNlcnREYXRhOiAnJyxcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gaWYgZW5yb2xsZWQgY291cnNlIGlzIGNvbXBsZXRlZCB0aGVuIHRvIG1ha2UgYWxsIGxhbmd1YWdlcyBjb3Vyc2VzIGFzIHdlbGwgYXMgYWxsIGNvbnRlbnQgYXMgY29tcGxldGVkXG4gICAgICAgIGlmIChlbnJvbGxlZENvdXJzZS5zdGF0dXMgPT09IDIpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSAxMDBcbiAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25TdGF0dXMnXSA9IDJcbiAgICAgICAgICBhd2FpdCB0aGlzLnRvY1N2Yy5tYXBDb21wbGV0aW9uQ2hpbGRQZXJjZW50YWdlUHJvZ3JhbSh0aGlzLmNvbnRlbnQpXG4gICAgICAgICAgbGV0IGNvbnRlbnRMYWcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICB0aGlzLmdldENvbnRpbnVlTGVhcm5pbmdEYXRhKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyLCBlbnJvbGxlZENvdXJzZS5iYXRjaElkLCBjb250ZW50TGFnKVxuICAgICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgICAgdGhpcy50b2NTdmMubWFwTW9kdWxlQ291bnQodGhpcy5jb250ZW50KVxuICAgICAgICAgIHRoaXMuY2hlY2tGb3JDb21wbGV0aW9uU3VydmV5VHJpZ2dlcigpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmN1bXVsYXRpdmVUcmFja2luZykge1xuICAgICAgICAgICAgYXdhaXQgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2VQcm9ncmFtKHRoaXMuY29udGVudCwgdGhpcy51c2VyRW5yb2xsbWVudExpc3QpXG4gICAgICAgICAgICB0aGlzLmNoZWNrRm9yQ29tcGxldGlvblN1cnZleVRyaWdnZXIoKVxuICAgICAgICAgICAgdGhpcy5yZXN1bWVEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGlmIChyZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgICAgICAgICAgICB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcblxuICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRMYWcgPSB0aGlzLmNvbnRlbnRMYW5nU3ZjLmdldENvbnRlbnRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGludWVMZWFybmluZ0RhdGEodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmlkZW50aWZpZXIsIGVucm9sbGVkQ291cnNlLmJhdGNoSWQsIGNvbnRlbnRMYWcpXG4gICAgICAgICAgICB0aGlzLmNvbnRlbnRbJ2NvbXBsZXRpb25QZXJjZW50YWdlJ10gPSBlbnJvbGxlZENvdXJzZS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICAgICAgdGhpcy5lbnJvbGxCdG5Mb2FkaW5nID0gZmFsc2VcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLm1hcE1vZHVsZUNvdW50KHRoaXMuY29udGVudClcbiAgICAgICAgICAgIC8vIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iYXRjaERhdGEgPSB7XG4gICAgICAgICAgY29udGVudDogW2Vucm9sbGVkQ291cnNlLmJhdGNoXSxcbiAgICAgICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnRvY1N2Yy5zZXRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgICAgIHRoaXMudG9jU3ZjLmdldFNlbGVjdGVkQmF0Y2hEYXRhKHRoaXMuYmF0Y2hEYXRhKVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBTZXNzaW9uQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5iYXRjaERhdGEsIHRoaXMucmVzdW1lRGF0YSlcbiAgICAgICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMudG9jU3ZjLmNoZWNrTW9kdWxlV2lzZURhdGEodGhpcy5jb250ZW50KVxuICAgICAgICB0aGlzLnRvY1N2Yy5tYXBNb2R1bGVDb3VudCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIC8vIEl0J3MgdW5kZXJzdG9vZCB0aGF0IHVzZXIgaXMgbm90IGFscmVhZHkgZW5yb2xsZWRcbiAgICAgICAgLy8gRmV0Y2ggdGhlIGF2YWlsYWJsZSBiYXRjaGVzIGFuZCBwcmVzZW50IHRvIHVzZXJcbiAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkNPVVJTRVxuICAgICAgICAgIHx8IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgIT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pIHtcbiAgICAgICAgICAvLyBEaXNhYmxpbmcgYXV0byBlbnJvbGxtZW50IHRvIGJhdGNoXG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgICAgICAgdGhpcy5mZXRjaEJhdGNoRGV0YWlscygpXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudG9jU3ZjLmNhbGxIaXJhcmNoeVByb2dyZXNzSGFzaG1hcCh0aGlzLmNvbnRlbnQpXG4gICAgICAgIHRoaXMuZW5yb2xsQnRuTG9hZGluZyA9IGZhbHNlXG4gICAgICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICAgIH1cblxuXG4gICAgfVxuXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlXG4gIH1cblxuICBiaW5kQ29tcGxldGlvblBlcmNlbnRhZ2UoKSB7XG4gICAgbGV0IGNvbXBsZXRpb25QZXJjZW50YWdlID0gMFxuICAgIGxldCBjb21wbGV0aW9uU3RhdHVzID0gMFxuICAgIGlmICh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgJiYgT2JqZWN0LmtleXModGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzKS5sZW5ndGgpIHtcbiAgICAgIGxldCBsYW5nUGVyY2VudGFnZSA9IHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzc1t0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UubGFuZ0lkXSB8fCAwXG4gICAgICBjb21wbGV0aW9uUGVyY2VudGFnZSA9IGxhbmdQZXJjZW50YWdlXG4gICAgICBjb21wbGV0aW9uU3RhdHVzID0gbGFuZ1BlcmNlbnRhZ2UgPj0gMTAwID8gMiA6IDBcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IGVucm9sbGVkRGF0YSA9IHRoaXMudG9jU3ZjLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZCh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICBpZiAoZW5yb2xsZWREYXRhICYmIGVucm9sbGVkRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZSkge1xuICAgICAgICBjb21wbGV0aW9uUGVyY2VudGFnZSA9IGVucm9sbGVkRGF0YS5jb21wbGV0aW9uUGVyY2VudGFnZVxuICAgICAgICBjb21wbGV0aW9uU3RhdHVzID0gZW5yb2xsZWREYXRhLnN0YXR1c1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9IGNvbXBsZXRpb25QZXJjZW50YWdlXG4gICAgICB0aGlzLmNvbnRlbnQuY29tcGxldGlvblN0YXR1cyA9IGNvbXBsZXRpb25TdGF0dXNcbiAgICB9XG4gIH1cblxuICBoYW5kbGVBY2NlcHRSZWxldmVudCgpIHtcbiAgICB0aGlzLnNhdmVGZWVkYmFjaygnJywgMSlcbiAgfVxuXG4gIGhhbmRsZURlY2xpbmVSZWxldmVudCgpIHtcbiAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLmRpYWxvZy5vcGVuKE5vblJlbGV2ZW50RmVlZGJhY2tEaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRpc2FibGVDbG9zZTogdHJ1ZSxcbiAgICAgIHdpZHRoOiAnNTAycHgnLFxuICAgICAgcGFuZWxDbGFzczogWydyZWxldmVudC1mZWVkYmFjay1kaWFsb2cnXSxcbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0OiBhbnkpID0+IHtcbiAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgdGhpcy5zYXZlRmVlZGJhY2socmVzdWx0LCAwKVxuICAgICAgICBkaWFsb2dSZWYuY2xvc2UoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGlhbG9nUmVmLmNsb3NlKClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgY29udGVudFZpZXdFdmVudEZvck5ldENvcmUoZXZlbnRUeXBlOiBhbnkpIHtcbiAgICBpZiAodGhpcy5jb25maWdTdmMubmV0Y29yZUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcgIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5pc0FjdGl2ZSAvLyBOT1NPTkFSXG4gICAgICAmJiB0aGlzLmNvbmZpZ1N2Yy5uZXRjb3JlQ29uZmlnLm5ldGNvcmVXZWJDb25maWcuZXZlbnRzIC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMuY29udGVudF92aWV3IC8vIE5PU09OQVJcbiAgICAgICYmIHRoaXMuY29uZmlnU3ZjLm5ldGNvcmVDb25maWcubmV0Y29yZVdlYkNvbmZpZy5ldmVudHMuY29udGVudF92aWV3LmlzQWN0aXZlIC8vIE5PU09OQVJcbiAgICApIHtcbiAgICAgIGxldCBwYXlsb2FkOiBhbnkgPSB7fVxuICAgICAgLy8gaWYgKHRoaXMuY29uZmlnU3ZjICYmIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlciAmJiB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllcikgeyAvLyBOT1NPTkFSXG4gICAgICAvLyAgIHBheWxvYWRbJ3BrXnVzZXJpZCddID0gdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKClcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50Lm5hbWUpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9uYW1lJ10gPSB0aGlzLmNvbnRlbnQubmFtZVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuY291cnNlQ2F0ZWdvcnkpIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9jYXRlZ29yeSddID0gdGhpcy5jb250ZW50LmNvdXJzZUNhdGVnb3J5XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5pZGVudGlmaWVyKSB7XG4gICAgICAgIHBheWxvYWRbJ2NvbnRlbnRfaWQnXSA9IHRoaXMuY29udGVudC5pZGVudGlmaWVyXG4gICAgICB9XG4gICAgICAvLyBpZih0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50Lm5hbWUpIHtcbiAgICAgIHBheWxvYWRbJ2NvbnRlbnRfdXJsJ10gPSB3aW5kb3cubG9jYXRpb24uaHJlZlxuICAgICAgLy8gfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXBwSWNvbikge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X2ltYWdlJ10gPSB0aGlzLmNvbnRlbnQuYXBwSWNvblxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuZHVyYXRpb24pIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9kdXJhdGlvbiddID0gdGhpcy5jb250ZW50LmR1cmF0aW9uICYmIE51bWJlcih0aGlzLmNvbnRlbnQuZHVyYXRpb24pID4gMCA/IE51bWJlcih0aGlzLmNvbnRlbnQuZHVyYXRpb24pIDogMFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9kdXJhdGlvbiddID0gMFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQuYXZnUmF0aW5nXG4gICAgICApIHtcbiAgICAgICAgcGF5bG9hZFsnY29udGVudF9yYXRpbmcnXSA9IHRoaXMuY29udGVudC5hdmdSYXRpbmdcbiAgICAgICAgcGF5bG9hZFsnY29udGVudCByYXRpbmcnXSA9IHRoaXMuY29udGVudC5hdmdSYXRpbmdcbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnRvdGFsTm9PZlJhdGluZykge1xuICAgICAgICBwYXlsb2FkWydub191c2Vyc19yYXRlZCddID0gdGhpcy5jb250ZW50LnRvdGFsTm9PZlJhdGluZ1xuICAgICAgfVxuICAgICAgLy8gaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudC5uYW1lKSB7XG4gICAgICBwYXlsb2FkWydsZWFybmluZ19wYXRoX2NvbnRlbnQnXSA9IHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCA/IHRydWUgOiBmYWxzZVxuICAgICAgcGF5bG9hZFsnbGVhcm5pbmcgcGF0aCBjb250ZW50J10gPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGggPyB0cnVlIDogZmFsc2VcbiAgICAgIC8vIH1cbiAgICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LnNvdXJjZSkge1xuICAgICAgICBwYXlsb2FkWydjb250ZW50X3Byb3ZpZGVyX25hbWUnXSA9IHRoaXMuY29udGVudC5zb3VyY2VcbiAgICAgIH1cbiAgICAgIC8vIGNvbnNvbGUubG9nKCdwYXlsb2FkJywgcGF5bG9hZClcbiAgICAgIGlmIChldmVudFR5cGUgPT09ICd2aWV3Jykge1xuICAgICAgICB0aGlzLm5ldENvcmVTZXJ2aWNlLnRyYWNrRXZlbnRGb3JDb250ZW50QW5kRXZlbnQoJ2NvbnRlbnRfdmlldycsIHRoaXMuY29uZmlnU3ZjLnVuTWFwcGVkVXNlci5pZGVudGlmaWVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpLCBwYXlsb2FkKVxuICAgICAgfSBlbHNlIGlmIChldmVudFR5cGUgPT09ICdlbnJvbGwnKSB7XG4gICAgICAgIHRoaXMubmV0Q29yZVNlcnZpY2UudHJhY2tFdmVudEZvckNvbnRlbnRBbmRFdmVudCgnY29udGVudF9lbnJvbG1lbnQnLCB0aGlzLmNvbmZpZ1N2Yy51bk1hcHBlZFVzZXIuaWRlbnRpZmllci50cmltKCkudG9Mb3dlckNhc2UoKSwgcGF5bG9hZClcbiAgICAgIH0gZWxzZSBpZiAoZXZlbnRUeXBlID09PSAnY29tcGxldGUnKSB7XG4gICAgICAgIHRoaXMubmV0Q29yZVNlcnZpY2UudHJhY2tFdmVudEZvckNvbnRlbnRBbmRFdmVudCgnY29udGVudF9jb21wbGV0aW9uJywgdGhpcy5jb25maWdTdmMudW5NYXBwZWRVc2VyLmlkZW50aWZpZXIudHJpbSgpLnRvTG93ZXJDYXNlKCksIHBheWxvYWQpXG4gICAgICB9XG5cbiAgICB9XG4gIH1cblxuICBzZWNvbmRzVG9UaW1lKGQ6IGFueSkge1xuICAgIGQgPSBOdW1iZXIoZClcbiAgICB2YXIgaCA9IE1hdGguZmxvb3IoZCAvIDM2MDApXG4gICAgdmFyIG0gPSBNYXRoLmZsb29yKGQgJSAzNjAwIC8gNjApXG4gICAgdmFyIHMgPSBNYXRoLmZsb29yKGQgJSAzNjAwICUgNjApXG5cbiAgICB2YXIgaERpc3BsYXkgPSBoID4gMCA/IGggKyAoaCA9PSAxID8gXCIgaG91ciwgXCIgOiBcIiBob3VycywgXCIpIDogXCJcIlxuICAgIHZhciBtRGlzcGxheSA9IG0gPiAwID8gbSArIChtID09IDEgPyBcIiBtaW51dGUsIFwiIDogXCIgbWludXRlcywgXCIpIDogXCJcIlxuICAgIHZhciBzRGlzcGxheSA9IHMgPiAwID8gcyArIChzID09IDEgPyBcIiBzZWNvbmRcIiA6IFwiIHNlY29uZHNcIikgOiBcIlwiXG4gICAgcmV0dXJuIGhEaXNwbGF5ICsgbURpc3BsYXkgKyBzRGlzcGxheVxuICB9XG5cblxuICBhc3luYyBzYXZlRmVlZGJhY2soY29tbWVudDogc3RyaW5nLCByYXRpbmcgPSAwKSB7XG4gICAgY29uc3QgcGF5bG9hZCA9IHtcbiAgICAgIFwicmVjb21tZW5kYXRpb25faWRcIjogdGhpcy5yZWNvbW1lbmRlZENvdXJzZXNJZCxcbiAgICAgIFwiY291cnNlX2lkXCI6IHRoaXMuY291cnNlSUQsXG4gICAgICBcInJhdGluZ1wiOiByYXRpbmcsXG4gICAgICBcImNvbW1lbnRzXCI6IGNvbW1lbnQsXG4gICAgICBcInVzZXJfaWRcIjogdGhpcy5jb25maWdTdmMudXNlclByb2ZpbGU/LnVzZXJJZCB8fCAnJ1xuICAgIH1cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuY29udGVudExpYlN2Yy5zYXZlRmVlZGJhY2tTYWtzaGFtQUkocGF5bG9hZCkudG9Qcm9taXNlKCkuY2F0Y2goKCkgPT4geyB9KVxuICAgIGlmIChyZXNwb25zZSAmJiByZXNwb25zZT8ubWVzc2FnZSkge1xuICAgICAgdGhpcy5tYXRTbmFja2Jhck5ldy5vcGVuKFxuICAgICAgICAnVGhhbmsgeW91IGZvciB5b3VyIGZlZWRiYWNrLicsICdYJyxcbiAgICAgICAgeyBkdXJhdGlvbjogU05BQ0tCQVJfRFVSQVRJT04sIHBhbmVsQ2xhc3M6IFsnc3VjY2VzcyddIH1cbiAgICAgIClcbiAgICAgIHRoaXMuZmVlZGJhY2tHaXZlbiA9IHsgY291cnNlX2lkOiB0aGlzLmNvdXJzZUlELCByYXRpbmc6IHJhdGluZywgY29tbWVudHM6IGNvbW1lbnQgfVxuXG4gICAgfSBlbHNlIGlmICghcmVzcG9uc2UpIHtcbiAgICAgIHRoaXMubWF0U25hY2tiYXJOZXcub3BlbihcbiAgICAgICAgJ1NvbWV0aGluZyBpcyB3cm9uZy4gUGxlYXNlIHRyeSBhZ2FpbiBsYXRlci4nLCAnWCcsXG4gICAgICAgIHsgZHVyYXRpb246IFNOQUNLQkFSX0RVUkFUSU9OLCBwYW5lbENsYXNzOiBbJ2Vycm9yJ10gfVxuICAgICAgKVxuICAgIH1cbiAgfVxuXG4gIHBsYXlSZXN1bWVGb3JBSSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50KSB7XG4gICAgICBpZiAodGhpcy5maXJzdFJlc291cmNlTGluaykge1xuICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbdGhpcy5maXJzdFJlc291cmNlTGluay51cmxdLCB7IHF1ZXJ5UGFyYW1zOiB0aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zIH0pXG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICBlbnJvbGxVc2VyVG9BSSgpIHtcbiAgICB0aGlzLmZyb21BSVR1dG9yID0gdHJ1ZVxuICAgIHRoaXMuaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcbiAgfVxuXG4gIG9wZW5TdXJ2ZXlGb3JtUG9wdXAoZXZlbnQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoZXZlbnQpIHtcbiAgICAgIHRoaXMub3BlbkNvbXBsZXRpb25TdXJ2ZXlGb3JtUG9wdXAoKVxuICAgIH1cbiAgfVxuXG4gIGdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KHR5cGU6ICdSRVNVTUUnIHwgJ1NUQVJUX09WRVInIHwgJ1NUQVJUJyk6IHsgW2tleTogc3RyaW5nXTogc3RyaW5nIH0ge1xuICAgIGlmICh0aGlzLmZpcnN0UmVzb3VyY2VMaW5rICYmICh0eXBlID09PSAnU1RBUlQnIHx8IHR5cGUgPT09ICdTVEFSVF9PVkVSJykpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLmZpcnN0UmVzb3VyY2VMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICB2aWV3TW9kZTogdHlwZSxcbiAgICAgICAgYmF0Y2hJZDogdGhpcy5nZXRCYXRjaElkKCksXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5jb250ZXh0SWQgJiYgdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICBxUGFyYW1zID0ge1xuICAgICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgICAgY29sbGVjdGlvbklkOiB0aGlzLmNvbnRleHRJZCxcbiAgICAgICAgICBjb2xsZWN0aW9uVHlwZTogdGhpcy5jb250ZXh0UGF0aCxcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgICBkZWxldGUgcVBhcmFtcy52aWV3TW9kZVxuICAgICAgfVxuICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgLi4ucVBhcmFtcyxcbiAgICAgICAgY2hhbm5lbElkOiB0aGlzLmNoYW5uZWxJZCxcbiAgICAgIH1cbiAgICAgIHJldHVybiBxUGFyYW1zXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucmVzdW1lRGF0YUxpbmsgJiYgdHlwZSA9PT0gJ1JFU1VNRScpIHtcbiAgICAgIGxldCBxUGFyYW1zOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZyB9ID0ge1xuICAgICAgICAuLi50aGlzLnJlc3VtZURhdGFMaW5rLnF1ZXJ5UGFyYW1zLFxuICAgICAgICBiYXRjaElkOiB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgICAgdmlld01vZGU6ICdSRVNVTUUnLFxuICAgICAgICAvLyBjb3Vyc2VOYW1lOiB0aGlzLmNvbnRlbnQgPyB0aGlzLmNvbnRlbnQubmFtZSA6ICcnLFxuICAgICAgfVxuICAgICAgaWYgKHRoaXMuY29udGV4dElkICYmIHRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgcVBhcmFtcyA9IHtcbiAgICAgICAgICAuLi5xUGFyYW1zLFxuICAgICAgICAgIGNvbGxlY3Rpb25JZDogdGhpcy5jb250ZXh0SWQsXG4gICAgICAgICAgY29sbGVjdGlvblR5cGU6IHRoaXMuY29udGV4dFBhdGgsXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICh0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgZGVsZXRlIHFQYXJhbXMudmlld01vZGVcbiAgICAgIH1cbiAgICAgIHFQYXJhbXMgPSB7XG4gICAgICAgIC4uLnFQYXJhbXMsXG4gICAgICAgIGNoYW5uZWxJZDogdGhpcy5jaGFubmVsSWQsXG4gICAgICB9XG4gICAgICByZXR1cm4gcVBhcmFtc1xuICAgIH1cbiAgICBpZiAodGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gICAgcmV0dXJuIHtcbiAgICAgIGJhdGNoSWQ6IHRoaXMuZ2V0QmF0Y2hJZCgpLFxuICAgICAgdmlld01vZGU6IHR5cGUsXG4gICAgfVxuICB9XG5cbiAgcm91dGVUb1ByZUFzc2Vzc2VudCgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGEpIHtcbiAgICAgIC8vIHRoaXMuZ2VuZXJhdGVQcmVBc3Nlc3NtZW50UXVlcnkoJ1NUQVJUJylcbiAgICAgIGxldCBmaXJzdFJlc291cmNlID0gdGhpcy5jb250ZW50UmVhZERhdGEucHJlRW5yb2xtZW50UmVzb3VyY2VzWzBdXG4gICAgICBsZXQgbWltZVR5cGUgPSBmaXJzdFJlc291cmNlPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ1ByZSBFbnJvbG1lbnQgQXNzZXNzbWVudCcgPyAnYXBwbGljYXRpb24vdm5kLnN1bmJpcmQucXVlc3Rpb25zZXQnIDogZmlyc3RSZXNvdXJjZS5taW1lVHlwZVxuICAgICAgdGhpcy5maXJzdFJlc291cmNlTGluayA9IHZpZXdlclJvdXRlR2VuZXJhdG9yKFxuICAgICAgICBmaXJzdFJlc291cmNlLmlkZW50aWZpZXIsXG4gICAgICAgIG1pbWVUeXBlLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllcixcbiAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5LFxuICAgICAgICB0aGlzLmZvclByZXZpZXcsXG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLnByZUVucm9sbWVudFJlc291cmNlc1swXT8ucHJpbWFyeUNhdGVnb3J5IHx8ICcnLFxuICAgICAgICAnJyxcbiAgICAgIClcbiAgICAgIGxldCByb3V0ZXJMaW5rID0gdGhpcy5maXJzdFJlc291cmNlTGluaz8udXJsXG4gICAgICBsZXQgcXVlcnlQYXJhbXMgPSB0aGlzLmdlbmVyYXRlUHJlQXNzZXNzbWVudFF1ZXJ5KCdTVEFSVCcpXG4gICAgICBxdWVyeVBhcmFtcyA9IHsgLi4ucXVlcnlQYXJhbXMsIHByZUFzc2Vzc21lbnQ6ICd0cnVlJyB9XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7cm91dGVyTGlua31gXSwgeyBxdWVyeVBhcmFtcyB9KVxuICAgIH1cbiAgfVxuXG4gIGdldFByZUFzc2Vzc21lbnRSZXF1aXJlZCgpIHtcbiAgICB0aGlzLnByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWcgPSBmYWxzZVxuICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29udGVudFJlYWREYXRhPy5wcmVFbnJvbG1lbnRSZXNvdXJjZXM/LmZvckVhY2goKGl0ZW06IGFueSkgPT4ge1xuICAgICAgICBpZiAoaXRlbSAmJiBpdGVtPy5pc01hbmRhdG9yeSkge1xuICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudFJlcXVpcmVkRmxhZyA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXRQcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cygpIHtcbiAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICBsZXQgcHJlRW5yb2xsbWVudFJlc291cmNlc0FycjogYW55ID0gW11cbiAgICBsZXQgcHJlRW5yb2xsbWVudE1hbmRhdG9yeVJlc291cmNlc0FycjogYW55ID0gW11cbiAgICBpZiAodGhpcy5jb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgcHJlRW5yb2xsbWVudFJlc291cmNlc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgICAgIGlmIChpdGVtICYmIGl0ZW0/LmlzTWFuZGF0b3J5KSB7XG4gICAgICAgICAgcHJlRW5yb2xsbWVudE1hbmRhdG9yeVJlc291cmNlc0Fyci5wdXNoKGl0ZW0/LmlkZW50aWZpZXIpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyICYmIHByZUVucm9sbG1lbnRSZXNvdXJjZXNBcnIubGVuZ3RoKSB7XG4gICAgICBsZXQgcmVxID0ge1xuICAgICAgICBcInJlcXVlc3RcIjoge1xuICAgICAgICAgIFwiY29udGVudElkc1wiOiBwcmVFbnJvbGxtZW50UmVzb3VyY2VzQXJyLFxuICAgICAgICAgIFwiZmllbGRzXCI6IFtcbiAgICAgICAgICBdXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRoaXMudG9jU3ZjLnJlYWRQcmVFbnJvbGxtZW50UmVzb3VyY2VzU3RhdGUocmVxKS5zdWJzY3JpYmUoKGRhdGE6IGFueSkgPT4ge1xuICAgICAgICBsZXQgbWFuZGF0b3J5SWRzQ29tcGxldGVkID0gW11cbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLnJlc3VsdC5jb250ZW50TGlzdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgaWYgKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydzdGF0dXMnXSA9PT0gMiAmJiBwcmVFbnJvbGxtZW50TWFuZGF0b3J5UmVzb3VyY2VzQXJyLmluY2x1ZGVzKGRhdGEucmVzdWx0LmNvbnRlbnRMaXN0W2ldWydjb250ZW50SWQnXSkpIHtcbiAgICAgICAgICAgICAgbWFuZGF0b3J5SWRzQ29tcGxldGVkLnB1c2goZGF0YS5yZXN1bHQuY29udGVudExpc3RbaV1bJ2NvbnRlbnRJZCddKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocHJlRW5yb2xsbWVudFJlc291cmNlc0Fycj8ubGVuZ3RoID09PSBkYXRhLnJlc3VsdC5jb250ZW50TGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gdHJ1ZVxuICAgICAgICAgIH0gZWxzZSBpZiAobWFuZGF0b3J5SWRzQ29tcGxldGVkLmxlbmd0aCA9PT0gcHJlRW5yb2xsbWVudE1hbmRhdG9yeVJlc291cmNlc0Fyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSB0cnVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMgPSBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzID0gZmFsc2VcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmRhdGFUcmFuc2ZlclN2Yy5zZXRFbnJvbGxEYXRhKG51bGwpXG4gICAgdGhpcy5nZXRTZXJ2ZXJEYXRlVGltZSgpXG4gICAgdGhpcy5tb2JpbGUxMjAwID0gd2luZG93LmlubmVyV2lkdGggPCAxMjAxXG4gICAgdGhpcy5nZXRJMThOVHJhbnNsYXRpb25zKClcbiAgICB0aGlzLmxvYWRMZWFybmVyQWR2aXNvcnlEYXRhKClcbiAgICB0aGlzLnNldHVwU2VsZWN0ZWRCYXRjaFN1YnNjcmlwdGlvbigpXG4gICAgdGhpcy5zZXRDaGFubmVsSWQoKVxuICAgIHRoaXMuY2hlY2tJZnJhbWVDb250ZXh0KClcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zRGF0YSA9IHRoaXMuc2V0dXBSb3V0ZVN1YnNjcmlwdGlvbnMoKVxuICAgIHRoaXMuc2V0dXBGcmFnbWVudFN1YnNjcmlwdGlvbigpXG4gICAgdGhpcy5zZXR1cEJhdGNoU3Vic2NyaXB0aW9ucygpXG4gICAgdGhpcy5jb25maWd1cmVEZWZhdWx0TG9nbygpXG4gICAgdGhpcy5jb25maWd1cmVGZWF0dXJlRmxhZ3MoKVxuICAgIHRoaXMuY2hlY2tSZWdpc3RyYXRpb25TdGF0dXMoKVxuICAgIHRoaXMuc2V0dXBSb3V0ZXJFdmVudFN1YnNjcmlwdGlvbigpXG4gICAgdGhpcy5nZXRDb250ZW50Q3JlYXRvckRhdGEoKVxuICB9XG5cbiAgcHJpdmF0ZSBpbml0RGF0YShkYXRhOiBEYXRhKSB7XG4gICAgY29uc3QgaW5pdERhdGE6IGFueSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG4gICAgdGhpcy5zZXRFcnJvckNvZGUoaW5pdERhdGEuZXJyb3JDb2RlKVxuICAgIHRoaXMuaW5pdGlhbGl6ZVRvY1N0cnVjdHVyZSgpXG4gICAgdGhpcy5zZXR1cEJhdGNoQ29udHJvbFN1YnNjcmlwdGlvbigpXG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRFcnJvckNvZGUoZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUpIHtcbiAgICB0aGlzLmVycm9yQ29kZSA9IGVycm9yQ29kZVxuICAgIHN3aXRjaCAodGhpcy5lcnJvckNvZGUpIHtcbiAgICAgIGNhc2UgTnNBcHBUb2MuRVdzVG9jRXJyb3JDb2RlLkFQSV9GQUlMVVJFOlxuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuSU5WQUxJRF9EQVRBOlxuICAgICAgY2FzZSBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUuTk9fREFUQTpcbiAgICAgICAgdGhpcy5lcnJvcldpZGdldERhdGEud2lkZ2V0RGF0YS5lcnJvclR5cGUgPSBFcnJvclR5cGUuaW50ZXJuYWxTZXJ2ZXJcbiAgICAgICAgYnJlYWtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRoaXMuZXJyb3JXaWRnZXREYXRhLndpZGdldERhdGEuZXJyb3JUeXBlID0gRXJyb3JUeXBlLnNvbWV0aGluZ1dyb25nXG4gICAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cblxuXG4gIHByaXZhdGUgaW5pdGlhbGl6ZVRvY1N0cnVjdHVyZSgpIHtcbiAgICB0aGlzLmNvbnRlbnRQYXJlbnRzID0ge31cbiAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHtcbiAgICAgIGFzc2Vzc21lbnQ6IDAsXG4gICAgICBjb3Vyc2U6IDAsXG4gICAgICBoYW5kc09uOiAwLFxuICAgICAgaW50ZXJhY3RpdmVWaWRlbzogMCxcbiAgICAgIGxlYXJuaW5nTW9kdWxlOiAwLFxuICAgICAgb3RoZXI6IDAsXG4gICAgICBwZGY6IDAsXG4gICAgICBzdXJ2ZXk6IDAsXG4gICAgICBwb2RjYXN0OiAwLFxuICAgICAgcHJhY3RpY2VUZXN0OiAwLFxuICAgICAgZmluYWxUZXN0OiAwLFxuICAgICAgcXVpejogMCxcbiAgICAgIHZpZGVvOiAwLFxuICAgICAgd2ViTW9kdWxlOiAwLFxuICAgICAgd2ViUGFnZTogMCxcbiAgICAgIHlvdXR1YmU6IDAsXG4gICAgICBpbnRlcmFjdGl2ZWNvbnRlbnQ6IDAsXG4gICAgICBvZmZsaW5lU2Vzc2lvbjogMCxcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwQmF0Y2hDb250cm9sU3Vic2NyaXB0aW9uKCkge1xuICAgIHRoaXMuYmF0Y2hDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKGJhdGNoOiBOc0NvbnRlbnQuSUJhdGNoKSA9PiB7XG4gICAgICBpZiAoYmF0Y2gpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVCYXRjaEVucm9sbG1lbnQoYmF0Y2gpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlQmF0Y2hFbnJvbGxtZW50KGJhdGNoOiBOc0NvbnRlbnQuSUJhdGNoKSB7XG4gICAgdGhpcy5kaXNhYmxlRW5yb2xsQnRuID0gdHJ1ZVxuICAgIGxldCB1c2VySWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZT8udXNlcklkIHx8ICcnXG5cbiAgICBjb25zdCByZXEgPSB7XG4gICAgICByZXF1ZXN0OiB7XG4gICAgICAgIHVzZXJJZCxcbiAgICAgICAgY291cnNlSWQ6IGJhdGNoLmNvdXJzZUlkLFxuICAgICAgICBiYXRjaElkOiBiYXRjaC5iYXRjaElkLFxuICAgICAgfSxcbiAgICB9XG5cbiAgICB0aGlzLmNvbnRlbnRTdmMuZW5yb2xsVXNlclRvQmF0Y2gocmVxKS50aGVuKChkYXRhYjogYW55KSA9PiB7XG4gICAgICBpZiAoZGF0YWI/LnJlc3VsdD8ucmVzcG9uc2UgPT09ICdTVUNDRVNTJykge1xuICAgICAgICB0aGlzLmhhbmRsZVN1Y2Nlc3NmdWxFbnJvbGxtZW50KGJhdGNoKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5oYW5kbGVFbnJvbGxtZW50RmFpbHVyZSgpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlU3VjY2Vzc2Z1bEVucm9sbG1lbnQoYmF0Y2g6IE5zQ29udGVudC5JQmF0Y2gpIHtcbiAgICB0aGlzLmJhdGNoRGF0YSA9IHtcbiAgICAgIGNvbnRlbnQ6IFtiYXRjaF0sXG4gICAgICBlbnJvbGxlZDogdHJ1ZSxcbiAgICB9XG4gICAgdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaERhdGEodGhpcy5iYXRjaERhdGEpXG4gICAgdGhpcy50b2NTdmMubWFwU2Vzc2lvbkNvbXBsZXRpb25QZXJjZW50YWdlKHRoaXMuYmF0Y2hEYXRhKVxuICAgIHRoaXMucm91dGVyQ2hhbmdlSGFuZGxlcih0cnVlKVxuICAgIHRoaXMub3BlblNuYWNrYmFyKCdFbnJvbGxlZCBTdWNjZXNzZnVsbHkhJylcbiAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFbnJvbGxtZW50RmFpbHVyZSgpIHtcbiAgICB0aGlzLm9wZW5TbmFja2JhcignU29tZXRoaW5nIHdlbnQgd3JvbmcsIHBsZWFzZSB0cnkgYWdhaW4gbGF0ZXIhJylcbiAgICB0aGlzLmRpc2FibGVFbnJvbGxCdG4gPSBmYWxzZVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTGVhcm5lckFkdmlzb3J5RGF0YSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhICYmIHRoaXMucm91dGUuc25hcHNob3QuZGF0YS5wYWdlRGF0YS5kYXRhKSB7XG4gICAgICB0aGlzLmxlYXJuQWR2aXNvcnlEYXRhID0gdGhpcy5yb3V0ZS5zbmFwc2hvdC5kYXRhLnBhZ2VEYXRhLmRhdGEubGVhcm5lckFkdmlzb3J5XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBzZXR1cFNlbGVjdGVkQmF0Y2hTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5zZWxlY3RlZEJhdGNoU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuZ2V0U2VsZWN0ZWRCYXRjaC5zdWJzY3JpYmUoYmF0Y2hEYXRhID0+IHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRCYXRjaERhdGEgPSBiYXRjaERhdGFcbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBzZXRDaGFubmVsSWQoKSB7XG4gICAgdGhpcy5jaGFubmVsSWQgPSB0aGlzLnRlbGVtZXRyeVNlcnZpY2UudGVsZW1ldHJ5Q29uZmlnXG4gICAgICA/IHRoaXMudGVsZW1ldHJ5U2VydmljZS50ZWxlbWV0cnlDb25maWcuY2hhbm5lbFxuICAgICAgOiAnJ1xuICB9XG5cbiAgcHJpdmF0ZSBjaGVja0lmcmFtZUNvbnRleHQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaXNJbklmcmFtZSA9IHdpbmRvdy5zZWxmICE9PSB3aW5kb3cudG9wXG4gICAgfSBjYXRjaCAoX2V4KSB7XG4gICAgICB0aGlzLmlzSW5JZnJhbWUgPSBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBSb3V0ZVN1YnNjcmlwdGlvbnMoKSB7XG4gICAgbGV0IHF1ZXJ5UGFyYW1zdGVtcDogYW55ID0ge31cbiAgICBpZiAodGhpcy5yb3V0ZSkge1xuICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWVcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLmRhdGEuc3Vic2NyaWJlKGFzeW5jIChkYXRhOiBEYXRhKSA9PiB7XG4gICAgICAgIGlmIChkYXRhPy5jb250ZW50Py5kYXRhPy5pZGVudGlmaWVyKSB7XG4gICAgICAgICAgcXVlcnlQYXJhbXN0ZW1wID0gYXdhaXQgdGhpcy5wcm9jZXNzUm91dGVEYXRhKGRhdGEpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBxdWVyeVBhcmFtc3RlbXBcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgcHJvY2Vzc1JvdXRlRGF0YShkYXRhOiBEYXRhKSB7XG4gICAgdGhpcy5jb3Vyc2VJRCA9IGRhdGEuY29udGVudC5kYXRhLmlkZW50aWZpZXJcbiAgICBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG5cbiAgICAvLyBHZXQgcXVlcnkgcGFyYW1ldGVyc1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zRGF0YVRlbXAgPSBhd2FpdCB0aGlzLmdldFF1ZXJ5UGFyYW1zKClcbiAgICAvLyBIYW5kbGUgbXVsdGlsaW5ndWFsIGNvbnRlbnQgaWYgbWxJZCBpcyBwcmVzZW50IGluIHF1ZXJ5IHBhcmFtZXRlcnNcbiAgICBpZiAocXVlcnlQYXJhbXNEYXRhVGVtcC5NTElkKSB7XG4gICAgICAvLyBTdG9yZSB0aGUgb3JpZ2luYWwgY29udGVudCBkYXRhIGZvciByZWZlcmVuY2VcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcblxuICAgICAgLy8gRmV0Y2ggdGhlIG11bHRpbGluZ3VhbCBjb250ZW50XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBzdWNjZXNzID0gYXdhaXQgdGhpcy5mZXRjaENvbnRlbnRSZWFkKHF1ZXJ5UGFyYW1zRGF0YVRlbXAuTUxJZClcbiAgICAgICAgaWYgKCFzdWNjZXNzKSB7XG4gICAgICAgICAgLy8gSWYgbXVsdGlsaW5ndWFsIGNvbnRlbnQgZmV0Y2ggZmFpbHMsIGZhbGwgYmFjayB0byB0aGUgb3JpZ2luYWwgY29udGVudFxuICAgICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ0ZhaWxlZCB0byBsb2FkIG11bHRpbGluZ3VhbCBjb250ZW50LCB1c2luZyBvcmlnaW5hbCBjb250ZW50IGluc3RlYWQnKVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAvLyBPbiBlcnJvciwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICAgIHRoaXMuY29udGVudFJlYWREYXRhID0gaW5pdERhdGEuY29udGVudFxuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgbG9hZGluZyBtdWx0aWxpbmd1YWwgY29udGVudDonLCBlcnJvcilcbiAgICAgICAgdGhpcy5zbmFja0Jhci5vcGVuKCdGYWlsZWQgdG8gbG9hZCBjb250ZW50IGluIHNlbGVjdGVkIGxhbmd1YWdlJywgJ1gnLCB7XG4gICAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIE5vIG11bHRpbGluZ3VhbCBjb250ZW50IHJlcXVlc3RlZCwgdXNlIHRoZSBvcmlnaW5hbCBjb250ZW50XG4gICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSA9IGluaXREYXRhLmNvbnRlbnRcbiAgICB9XG4gICAgLy8gQWRkZWQgdG8gbWFrZSBzdXJlIHRoaXMgcmVmZXJlbmNlIHdhcyBpbmNvcnJlY3QsIGFzc2lnbmluZyBhZ2FpbiB0byBtYWtlIHN1cmUgZ2xvYmFsIHZhcmlhYmxlIGlzIHByb3Blcmx5IHVwZGF0ZWRcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zRGF0YSA9IHF1ZXJ5UGFyYW1zRGF0YVRlbXBcblxuICAgIC8vIENvbnRpbnVlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHByb2Nlc3NpbmdcbiAgICB0aGlzLmxvYWRMYW5ndWFnZURhdGEoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXMoKVxuICAgIHRoaXMuZ2V0UHJlQXNzZXNzbWVudFJlcXVpcmVkKClcblxuICAgIGF3YWl0IHRoaXMuaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKVxuXG4gICAgdGhpcy5pbml0aWFscm91dGVEYXRhID0gZGF0YVxuICAgIHRoaXMubG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhKVxuICAgIHRoaXMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1c0lmTmVlZGVkKClcbiAgICB0aGlzLmluaXREYXRhKGRhdGEpXG5cbiAgICAvLyB0byBjbGVhciBwdWJsaWMgc3VydmV5IGRhdGEgaWYgYW55IG9uIGxvYWQsXG4gICAgLy8gaWYgbm90IGNsZWFyZWQgdGhlbiBpdCB3aWxsIGJlIGNsZWFyZWQgb24gcG9wdXAgY2xvc2UsXG4gICAgLy8gIGJ1dCB0aGUgdGVhY2hlcnMgbm90ZXMgd2lsbCBiZSB2aXNpYmxlIG9uIGNpbWluZyBiYWNrIGZyb20gcGxheWVyIHBhZ2VcbiAgICBjb25zdCBzdXJ2ZXlJZCA9IHRoaXMuZW52aXJvbm1lbnQucHVibGljQ29udGVudFN1cnZleUlkIHx8ICcnXG4gICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIHRoaXMuY2xlYXJFeGlzdGluZ1B1YmxpY1N1cnZleURhdGEoc3VydmV5SWQsIGNvdXJzZUlkKVxuXG4gICAgcmV0dXJuIHF1ZXJ5UGFyYW1zRGF0YVRlbXBcbiAgfVxuXG4gIG9wZW5Db21wbGV0aW9uU3VydmV5Rm9ybVBvcHVwKCkge1xuICAgIGlmICh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgXy5nZXQodGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCAnY29tcGxldGlvblN1cnZleUxpbmsnKSkge1xuICAgICAgY29uc3Qgc0lEID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLmNvbXBsZXRpb25TdXJ2ZXlMaW5rLnNwbGl0KCdzdXJ2ZXlzLycpXG4gICAgICBjb25zdCBzdXJ2ZXlJZCA9IHNJRFsxXVxuICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgc3VydmV5SWQsXG4gICAgICAgIGNvdXJzZU5hbWU6IHRoaXMuY29udGVudFJlYWREYXRhPy5uYW1lIHx8ICcnLFxuICAgICAgICBjb3Vyc2VJRDogdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICAgIGNvbnRleHRPcmdJZDogdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IgJiYgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3IubGVuZ3RoID4gMCA/XG4gICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0gOiAnJ1xuICAgICAgfVxuICAgICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb21wbGV0aW9uU3VydmV5Rm9ybUNvbXBvbmVudCwge1xuICAgICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICAgIHdpZHRoOiAnNzUwcHgnLFxuICAgICAgICBtYXhXaWR0aDogJzkwdncnLFxuICAgICAgICBkYXRhOiBkYXRhLFxuICAgICAgICBhdXRvRm9jdXM6IGZhbHNlLFxuICAgICAgfSlcbiAgICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgICB0aGlzLm9wZW5Db25maXJtYXRpb25EaWFsb2coKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5Db25maXJtYXRpb25EaWFsb2coKSB7XG4gICAgY29uc3QgZGlhbG9nRGF0YSA9IHtcbiAgICAgIG1lc3NhZ2VzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBtZXNzYWdlOiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2Muc3VydmV5U3VibWl0dGVkJyksXG4gICAgICAgICAgY2xhc3NlczogJ2RpYWxvZy10aXRsZSdcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1lc3NhZ2U6IHRoaXMudHJhbnNsYXRlLmluc3RhbnQoJ2FwcHRvYy5zdXJ2ZXlDb21wbGV0ZWRDZXJ0aWZpY2F0ZUdlbmVyYXRpbmcnKSxcbiAgICAgICAgICBjbGFzc2VzOiAnZGlhbG9nLWRlc2NyaXB0aW9uIG1iLTInXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBpY29uTmFtZTogJ2NoZWNrX2NpcmNsZScsXG4gICAgICB0eXBlOiAncHJpbWFyeScsXG4gICAgICBidXR0b25zUG9zaXRpb25DbGFzczogJ2p1c3RpZnktY2VudGVyIGl0ZW1zLWNlbnRlcicsXG4gICAgICBidXR0b25zOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBjbGFzc2VzOiAnc3VjY2VzLWJ1dHRvbiB3aWR0aC1mdWxsJyxcbiAgICAgICAgICB0ZXh0OiB0aGlzLnRyYW5zbGF0ZS5pbnN0YW50KCdhcHB0b2MucmV0dXJuVG9Qcm9ncmFtUGFnZScpLFxuICAgICAgICAgIHJlc3BvbnNlOiB0cnVlXG4gICAgICAgIH1cbiAgICAgIF1cbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihDb25maXJtYXRpb25EaWFsb2dDb21wb25lbnQsIHtcbiAgICAgIGRhdGE6IGRpYWxvZ0RhdGEsXG4gICAgICBkaXNhYmxlQ2xvc2U6IHRydWUsXG4gICAgICB3aWR0aDogJzUwMHB4JyxcbiAgICAgIG1heFdpZHRoOiAnOTB2dydcbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIHRoaXMubG9ja0NlcnRpZmljYXRlID0gZmFsc2VcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgcHJpdmF0ZSBsb2FkTGFuZ3VhZ2VEYXRhKCkge1xuICAgIHRoaXMubGFuZ3VhZ2VMaXN0ID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRBbGxDb250ZW50TGFuZ3VhZ2VzKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlQ29udGVudFByZXZpZXdPckVucm9sbG1lbnQoKSB7XG4gICAgaWYgKHRoaXMuZm9yUHJldmlldykge1xuICAgICAgYXdhaXQgdGhpcy5sb2FkQ29udGVudEZvclByZXZpZXcoKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyAvLyBJZiB3ZSdyZSB3b3JraW5nIHdpdGggbXVsdGlsaW5ndWFsIGNvbnRlbnQsIG1ha2Ugc3VyZSB0byBmZXRjaCBpdHMgaGllcmFyY2h5XG4gICAgICAvLyBpZiAodGhpcy5xdWVyeVBhcmFtc0RhdGEubWxJZCAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJlxuICAgICAgLy8gICAgIHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIgPT09IHRoaXMucXVlcnlQYXJhbXNEYXRhLm1sSWQpIHtcbiAgICAgIC8vICAgLy8gRmV0Y2ggY29udGVudCBoaWVyYXJjaHkgZm9yIHRoZSBtdWx0aWxpbmd1YWwgY29udGVudFxuICAgICAgLy8gICB0cnkge1xuICAgICAgLy8gICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpO1xuICAgICAgLy8gICAgIC8vIEFmdGVyIGZldGNoaW5nIGhpZXJhcmNoeSwgdXBkYXRlIFVJIGNvbXBvbmVudHNcbiAgICAgIC8vICAgICB0aGlzLmdldExlYXJuaW5nVXJscygpO1xuICAgICAgLy8gICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBmZXRjaGluZyBoaWVyYXJjaHkgZm9yIG11bHRpbGluZ3VhbCBjb250ZW50OicsIGVycm9yKTtcbiAgICAgIC8vICAgfVxuICAgICAgLy8gfVxuXG4gICAgICAvLyBDb250aW51ZSB3aXRoIHJlZ3VsYXIgZW5yb2xsbWVudCBmbG93XG4gICAgICB0aGlzLmZldGNoVXNlckVucm9sbG1lbnREYXRhVjIoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgbG9hZENvbnRlbnRGb3JQcmV2aWV3KCkge1xuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dCh0cnVlKVxuICAgIGF3YWl0IHRoaXMuZmV0Y2hDb250ZW50SGllcmFyY2h5KHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8ICcnKVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIubmV4dChmYWxzZSlcbiAgICB0aGlzLnRvY1N2Yy5jaGVja01vZHVsZVdpc2VEYXRhKHRoaXMuY29udGVudClcbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgfVxuXG4gIHByaXZhdGUgbG9hZEJhbm5lckFuZFRvY0NvbmZpZyhkYXRhOiBEYXRhKSB7XG4gICAgdGhpcy5iYW5uZXJzID0gZGF0YS5wYWdlRGF0YS5kYXRhLmJhbm5lcnNcbiAgICB0aGlzLnRvY1N2Yy5zdWJ0aXRsZU9uQmFubmVycyA9IGRhdGEucGFnZURhdGEuZGF0YS5zdWJ0aXRsZU9uQmFubmVycyB8fCBmYWxzZVxuICAgIHRoaXMudG9jU3ZjLnNob3dEZXNjcmlwdGlvbiA9IGRhdGEucGFnZURhdGEuZGF0YS5zaG93RGVzY3JpcHRpb24gfHwgZmFsc2VcbiAgICB0aGlzLnRvY0NvbmZpZyA9IGRhdGEucGFnZURhdGEuZGF0YVxuICAgIHRoaXMua3BhcnJheSA9IHRoaXMudG9jQ29uZmlnLmthcm1hUG9pbnRzXG4gIH1cblxuICBwcml2YXRlIGZldGNoUG9zdEFzc2Vzc21lbnRTdGF0dXNJZk5lZWRlZCgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuaXNQb3N0QXNzZXNzbWVudCkge1xuICAgICAgdGhpcy50b2NTdmMuZmV0Y2hQb3N0QXNzZXNzbWVudFN0YXR1cyh0aGlzLmNvbnRlbnQuaWRlbnRpZmllcikuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgIGNvbnN0IGFzc2Vzc21lbnREYXRhID0gcmVzLnJlc3VsdFxuICAgICAgICBmb3IgKGNvbnN0IG8gb2YgYXNzZXNzbWVudERhdGEpIHtcbiAgICAgICAgICBpZiAoby5jb250ZW50SWQgPT09ICh0aGlzLmNvbnRlbnQgJiYgdGhpcy5jb250ZW50LmlkZW50aWZpZXIpKSB7XG4gICAgICAgICAgICB0aGlzLnNob3dUYWtlQXNzZXNzbWVudCA9IG9cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBGcmFnbWVudFN1YnNjcmlwdGlvbigpIHtcbiAgICB0aGlzLmN1cnJlbnRGcmFnbWVudCA9ICdvdmVydmlldydcbiAgICB0aGlzLnJvdXRlLmZyYWdtZW50LnN1YnNjcmliZSgoZnJhZ21lbnQ6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jdXJyZW50RnJhZ21lbnQgPSBmcmFnbWVudCB8fCAnb3ZlcnZpZXcnXG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgc2V0dXBCYXRjaFN1YnNjcmlwdGlvbnMoKSB7XG4gICAgdGhpcy5iYXRjaFN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLmJhdGNoUmVwbGF5U3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB0aGlzLmhhbmRsZUJhdGNoVXBkYXRlKCksXG4gICAgICAoKSA9PiB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZXJyb3Igb24gYmF0Y2hTdWJzY3JpcHRpb24nKVxuICAgIClcblxuICAgIHRoaXMuYmF0Y2hEYXRhU3Vic2NyaXB0aW9uID0gdGhpcy50b2NTdmMuc2V0QmF0Y2hEYXRhU3ViamVjdC5zdWJzY3JpYmUoXG4gICAgICAoKSA9PiB0aGlzLmhhbmRsZUJsZW5kZWRQcm9ncmFtVXBkYXRlKCksXG4gICAgICAoKSA9PiB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZXJyb3Igb24gYmF0Y2hEYXRhU3Vic2NyaXB0aW9uJylcbiAgICApXG4gIH1cblxuICBwcml2YXRlIGhhbmRsZUJhdGNoVXBkYXRlKCkge1xuICAgIHRoaXMuZmV0Y2hCYXRjaERldGFpbHMoKVxuICAgIGlmICh0aGlzLmNvbnRlbnQ/LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNKSB7XG4gICAgICB0aGlzLmZldGNoVXNlcldGRm9yQmxlbmRlZCgpXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVCbGVuZGVkUHJvZ3JhbVVwZGF0ZSgpIHtcbiAgICBpZiAodGhpcy5jb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSkge1xuICAgICAgdGhpcy5mZXRjaFVzZXJXRkZvckJsZW5kZWQoKVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY29uZmlndXJlRGVmYXVsdExvZ28oKSB7XG4gICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xuICAgIGlmIChpbnN0YW5jZUNvbmZpZz8ubG9nb3M/LmRlZmF1bHRTb3VyY2VMb2dvKSB7XG4gICAgICB0aGlzLmRlZmF1bHRTTG9nbyA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRTb3VyY2VMb2dvXG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjb25maWd1cmVGZWF0dXJlRmxhZ3MoKSB7XG4gICAgaWYgKHRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcykge1xuICAgICAgdGhpcy5pc0dvYWxzRW5hYmxlZCA9ICF0aGlzLmNvbmZpZ1N2Yy5yZXN0cmljdGVkRmVhdHVyZXMuaGFzKCdnb2FscycpXG4gICAgICB0aGlzLmlzUmVnaXN0cmF0aW9uU3VwcG9ydGVkID0gdGhpcy5jb25maWdTdmMucmVzdHJpY3RlZEZlYXR1cmVzLmhhcygncmVnaXN0cmF0aW9uRXh0ZXJuYWwnKVxuICAgICAgdGhpcy5zaG93SW50cmFuZXRNZXNzYWdlID0gIXRoaXMuY29uZmlnU3ZjLnJlc3RyaWN0ZWRGZWF0dXJlcy5oYXMoJ3Nob3dJbnRyYW5ldE1lc3NhZ2VEZXNrdG9wJylcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHNldHVwUm91dGVyRXZlbnRTdWJzY3JpcHRpb24oKSB7XG4gICAgdGhpcy5yb3V0ZXJQYXJhbVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGVyLmV2ZW50cy5zdWJzY3JpYmUoKHJvdXRlckV2ZW50OiBFdmVudCkgPT4ge1xuICAgICAgaWYgKHJvdXRlckV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCkge1xuICAgICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIocm91dGVyRXZlbnQudXJsKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuXG5cbiAgZmV0Y2hVc2VyRW5yb2xsbWVudERhdGFWMigpIHtcblxuICAgIGNvbnN0IGlkZW50aWZpZXIgPSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJydcbiAgICBpZiAoIWlkZW50aWZpZXIpIHtcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdDYW5ub3QgZmV0Y2ggZW5yb2xsbWVudCBkYXRhOiBjb250ZW50IGlkZW50aWZpZXIgaXMgbWlzc2luZycpXG4gICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IFtdXG4gICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgcmVxdWVzdCA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgcmV0aXJlZENvdXJzZXNFbmFibGVkOiB0cnVlLFxuICAgICAgICBjb3Vyc2VJZDogW2lkZW50aWZpZXJdXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5lbnJvbGxTdmMuZmV0Y2hFbnJvbGxDb250ZW50RGF0YShyZXF1ZXN0KS5waXBlKFxuICAgICAgdGFrZVVudGlsKHRoaXMuZGVzdHJveVN1YmplY3QkKSxcbiAgICAgIHN3aXRjaE1hcCgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcz8ucmVzdWx0Py5jb3Vyc2VzPy5sZW5ndGgpIHtcbiAgICAgICAgICB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCA9IHJlcy5yZXN1bHQuY291cnNlc1xuICAgICAgICAgIC8vIENoZWNrIGZvciBjb21wbGV0ZWQgY29udGVudFxuICAgICAgICAgIGNvbnN0IGNvbXBsZXRlZENvbnRlbnREYXRhID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZChcbiAgICAgICAgICAgIChlbDogYW55KSA9PiBlbC5jb2xsZWN0aW9uSWQgPT09IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciAmJlxuICAgICAgICAgICAgICBlbC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXG4gICAgICAgICAgKVxuICAgICAgICAgIGlmIChjb21wbGV0ZWRDb250ZW50RGF0YSkge1xuICAgICAgICAgICAgdGhpcy5jb250ZW50Vmlld0V2ZW50Rm9yTmV0Q29yZSgnY29tcGxldGUnKVxuICAgICAgICAgIH1cbiAgICAgICAgICB0aGlzLmRhdGFUcmFuc2ZlclN2Yy5zZXRFbnJvbGxEYXRhKHRoaXMudXNlckVucm9sbG1lbnRMaXN0KVxuICAgICAgICAgIC8vIGluIGNhc2Ugb2YgYmFjayBmcm9tIHBsYXllciB3ZSBuZWVkIHRvIGNoZWNrIHJlY2VudCBsYW5ndWFnZSBhbmQgbG9hZFxuICAgICAgICAgIGlmICghdGhpcy5jb250ZW50TGliU3ZjPy5vbmVTdGVwUmVzdW1lRW5hYmxlICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciA9PT0gdGhpcy5jb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIpIHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5sYW5ndWFnZS5sZW5ndGggPyB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lmxhbmd1YWdlWzBdIDogJydcbiAgICAgICAgICAgIGxldCBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhID0gdGhpcy51c2VyRW5yb2xsbWVudExpc3QuZmluZCgoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIpXG4gICAgICAgICAgICBpZiAobGFuZyAmJiBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhICYmIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZT8udG9Mb3dlckNhc2UoKSAhPT0gbGFuZykge1xuICAgICAgICAgICAgICBsZXQgbG9jYWxMYW5nID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRSZXF1aXJlZExhbmd1YWdlRGV0YWlscyh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIGJhc2VDb250ZW50RnJvbUVucm9sbERhdGE/LnJlY2VudF9sYW5ndWFnZSlcbiAgICAgICAgICAgICAgaWYgKGxvY2FsTGFuZyAmJiBPYmplY3Qua2V5cyhsb2NhbExhbmcpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKHRoaXMuY29udGVudExhbmdTdmMuZ2V0UmVxdWlyZWRMYW5ndWFnZURldGFpbHModGhpcy5iYXNlQ29udGVudFJlYWREYXRhLCBiYXNlQ29udGVudEZyb21FbnJvbGxEYXRhPy5yZWNlbnRfbGFuZ3VhZ2UpKVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKHRoaXMuY29udGVudExhbmdTdmMuZ2V0U2VsZWN0ZWRMYW5ndWFnZSh0aGlzLmNvbnRlbnRSZWFkRGF0YSkpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvZihmYWxzZSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gQWx3YXlzIGNhbGwgZmV0Y2hDb250ZW50SGllcmFyY2h5IGZpcnN0XG4gICAgICAgICAgICByZXR1cm4gZnJvbSh0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeSh0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy51c2VyRW5yb2xsbWVudExpc3QgPSBbXVxuICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgY29udGVudCBJRCBmcm9tIGVpdGhlciBjb250ZW50IG9yIGNvbnRlbnRSZWFkRGF0YVxuICAgICAgICAgIGNvbnN0IGNvbnRlbnRJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5pZGVudGlmaWVyIHx8IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgICAgICAgIGlmICghY29udGVudElkKSB7XG4gICAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ2Fubm90IGZldGNoIGhpZXJhcmNoeTogY29udGVudCBpZGVudGlmaWVyIGlzIG1pc3NpbmcnKVxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBGZXRjaCBoaWVyYXJjaHkgY29udGVudCBmb3IgYWRkaXRpb25hbCBkYXRhXG4gICAgICAgICAgcmV0dXJuIGZyb20odGhpcy5mZXRjaENvbnRlbnRIaWVyYXJjaHkoY29udGVudElkKSlcbiAgICAgICAgfVxuICAgICAgfSksXG4gICAgICAvLyBBZGQgY2F0Y2hFcnJvciBoZXJlIHRvIGhhbmRsZSBlcnJvcnMgZnJvbSBmZXRjaENvbnRlbnRIaWVyYXJjaHlcbiAgICAgIGNhdGNoRXJyb3IoZXJyb3IgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gZW5yb2xsbWVudCBkYXRhIHByb2Nlc3NpbmcnLCBlcnJvcilcbiAgICAgICAgcmV0dXJuIG9mKGZhbHNlKVxuICAgICAgfSlcbiAgICApLnN1YnNjcmliZSh7XG4gICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdD8ubGVuZ3RoICYmIHRoaXMuY29udGVudExpYlN2Yz8ub25lU3RlcFJlc3VtZUVuYWJsZSkge1xuICAgICAgICAgIHRoaXMuaGFuZGxlT25lU3RlcFJlc3VtZSgpXG4gICAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmNoZWNrSWZVc2VyRW5yb2xsZWQoKVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRmFpbGVkIHRvIGZldGNoIHVzZXIgZW5yb2xsbWVudCBkYXRhJywgZXJyb3IpXG4gICAgICAgIHRoaXMudXNlckVucm9sbG1lbnRMaXN0ID0gW11cbiAgICAgICAgdGhpcy5jaGVja0lmVXNlckVucm9sbGVkKClcbiAgICAgIH0sXG4gICAgICBjb21wbGV0ZTogKCkgPT4ge1xuICAgICAgICAvLyBPcHRpb25hbCBjb21wbGV0aW9uIGhhbmRsZXIgaWYgbmVlZGVkXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgaGFuZGxlT25lU3RlcFJlc3VtZSgpIHtcbiAgICB0cnkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NvbnRlbnQgbm90IGF2YWlsYWJsZSBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCBmb3VuZENvbnRlbnQgPSB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5maW5kKFxuICAgICAgICAoZWw6IGFueSkgPT4gZWwuY29sbGVjdGlvbklkID09PSB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXJcbiAgICAgIClcblxuICAgICAgaWYgKCFmb3VuZENvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5sb2dnZXJTdmMud2FybignTm8gbWF0Y2hpbmcgZW5yb2xsZWQgY29udGVudCBmb3VuZCBmb3Igb25lLXN0ZXAgcmVzdW1lJylcblxuICAgICAgfVxuXG4gICAgICBjb25zdCB1cmxEYXRhID0gYXdhaXQgdGhpcy5jb250ZW50TGliU3ZjLmdldFJlc291cnNlTGluayhcbiAgICAgICAgdGhpcy5jb250ZW50LFxuICAgICAgICBbZm91bmRDb250ZW50XSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhLFxuICAgICAgICB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJyxcbiAgICAgIClcblxuICAgICAgaWYgKCF1cmxEYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ05vIFVSTCBkYXRhIHJldHVybmVkIGZvciBvbmUtc3RlcCByZXN1bWUnKVxuXG4gICAgICB9XG5cbiAgICAgIGlmICh1cmxEYXRhPy51cmwpIHtcbiAgICAgICAgaWYgKHVybERhdGEudXJsLmluY2x1ZGVzKCdhcHAvdG9jJykpIHtcbiAgICAgICAgICB0aGlzLmNvbnRlbnRMaWJTdmMub25lU3RlcFJlc3VtZUVuYWJsZSA9IGZhbHNlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgICAgICAgIC8vIFdoZW4gY29taW5nIGZyb20gc2VhcmNoIHBhZ2UgZm9yIHBhcnRpY3VsYXIgbGFuZ3VhZ2UgY29udGVudCwgY29uZmlybSBmaXJzdCB0byBvbmUgc3RlcCByZXN1bWUgb3IgbG9hZCB0aGUgc2VhcmNoZWQgbGFuZ3VhZ2VcbiAgICAgICAgICBpZiAodXJsRGF0YT8ucXVlcnlQYXJhbXM/Lk1MICYmICh1cmxEYXRhPy5xdWVyeVBhcmFtcz8uTUwgIT09IHRoaXMucXVlcnlQYXJhbXNEYXRhWydNTCddKSkge1xuICAgICAgICAgICAgdGhpcy5zaG93T25lU3RlcFJlc3VtZUNvbmZpcm0odXJsRGF0YSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgICAgIFt1cmxEYXRhLnVybF0sXG4gICAgICAgICAgICAgIHsgcXVlcnlQYXJhbXM6IHVybERhdGEucXVlcnlQYXJhbXMgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gaGFuZGxlT25lU3RlcFJlc3VtZScsIGVycm9yKVxuICAgICAgdGhpcy5jb250ZW50TGliU3ZjLm9uZVN0ZXBSZXN1bWVFbmFibGUgPSBmYWxzZVxuICAgIH1cbiAgfVxuICBwcml2YXRlIGZldGNoQ29udGVudEhpZXJhcmNoeShpZGVudGlmaWVyOiBzdHJpbmcpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknKSB7XG4gICAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YVxuICAgICAgICB0aGlzLmNvbnRlbnQgPSB0aGlzLmFwcFRvY1YyU3ZjLmNvbnN0cnVjdEhlaXJhcmNoeURhdGEoY29udGVudClcbiAgICAgICAgdGhpcy5hcHBUb2NWMlN2Yy5tYXBDb250ZW50SGllcmFyY2h5UHJvZ3Jlc3NVcGRhdGUodGhpcy5jb250ZW50LCB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdClcbiAgICAgICAgLy8gQ3JlYXRlIGhhc2htYXAgYW5kIGNvbXB1dGUgbWlsZXN0b25lIGxvY2tpbmcgYWZ0ZXIgcHJvZ3Jlc3MgaXMgdXBkYXRlZFxuICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAvLyBDb21wdXRlIG1pbGVzdG9uZSBsb2NraW5nIHN0YXR1cyB3aXRoIHVwZGF0ZWQgcHJvZ3Jlc3MgZGF0YVxuICAgICAgICB0aGlzLnRvY1N2Yy5jb21wdXRlTWlsZXN0b25lTG9ja2luZ1N0YXR1cygpXG4gICAgICAgIC8vIFN5bmMgY29udGVudCB0cmVlJ3MgaXNMb2NrZWQgd2l0aCBjb21wdXRlZCB2YWx1ZXNcbiAgICAgICAgdGhpcy5zeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpXG4gICAgICAgIHRoaXMuZ2V0T3JnSWRGb3JTaGFyZSgpXG4gICAgICAgIHRoaXMuZ2V0VG9jU3RydWN0dXJlKClcbiAgICAgICAgY29uc29sZS5sb2coJ2NvbnRlbnQgYWZ0ZXIgbG9ja2luZyBzeW5jJywgdGhpcy5jb250ZW50KVxuICAgICAgICBjb25zb2xlLmxvZygnaGFzaG1hcCBhZnRlciBsb2NraW5nJywgdGhpcy50b2NTdmMuaGFzaG1hcClcbiAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZTxib29sZWFuPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYWtlIHN1cmUgZmV0Y2hIaWVyYXJjaHlDb250ZW50IHJldHVybnMgYW4gT2JzZXJ2YWJsZVxuICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5jb250ZW50U3ZjLmZldGNoSGllcmFyY2h5Q29udGVudChpZGVudGlmaWVyLCAnZGV0YWlsJylcblxuICAgICAgICBpZiAoIW9ic2VydmFibGUpIHtcbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignZmV0Y2hIaWVyYXJjaHlDb250ZW50IGRpZCBub3QgcmV0dXJuIGFuIE9ic2VydmFibGUnKVxuICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBvYnNlcnZhYmxlLnN1YnNjcmliZSh7XG4gICAgICAgICAgbmV4dDogKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChyZXNwb25zZT8ucmVzdWx0Py5jb250ZW50KSB7XG4gICAgICAgICAgICAgIHRoaXMuY29udGVudCA9IHJlc3BvbnNlLnJlc3VsdC5jb250ZW50XG4gICAgICAgICAgICAgIHRoaXMuZ2V0T3JnSWRGb3JTaGFyZSgpXG4gICAgICAgICAgICAgIHRoaXMuZ2V0VG9jU3RydWN0dXJlKClcbiAgICAgICAgICAgICAgaWYgKCF0aGlzLmZvclByZXZpZXcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVzZXJSYXRpbmcgPSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICB0aGlzLmdldFVzZXJSYXRpbmcoZmFsc2UpXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVzb2x2ZShmYWxzZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgfSxcbiAgICAgICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggaGllcmFyY2h5IGNvbnRlbnQnLCBlcnJvcilcbiAgICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICBnZXRUb2NTdHJ1Y3R1cmUoKSB7XG4gICAgdGhpcy5pbml0aWFsaXplVG9jU3RydWN0dXJlKClcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICB0aGlzLmhhc1RvY1N0cnVjdHVyZSA9IGZhbHNlXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZS5sZWFybmluZ01vZHVsZSA9IHRoaXMuY29udGVudC5wcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMucHJpbWFyeUNhdGVnb3J5Lk1PRFVMRSA/IC0xIDogMFxuICAgICAgdGhpcy50b2NTdHJ1Y3R1cmUuY291cnNlID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeSA9PT0gdGhpcy5wcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFID8gLTEgOiAwXG4gICAgICB0aGlzLnRvY1N0cnVjdHVyZSA9IHRoaXMudG9jU3ZjLmdldFRvY1N0cnVjdHVyZSh0aGlzLmNvbnRlbnQsIHRoaXMudG9jU3RydWN0dXJlKVxuICAgICAgZm9yIChjb25zdCBwcm9nVHlwZSBpbiB0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgICBpZiAodGhpcy50b2NTdHJ1Y3R1cmVbcHJvZ1R5cGVdID4gMCkge1xuICAgICAgICAgIHRoaXMuaGFzVG9jU3RydWN0dXJlID0gdHJ1ZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gZnJvbSBuZ09uQ2hhbmdlc1xuICAgICAgdGhpcy5mZXRjaEV4dGVybmFsQ29udGVudEFjY2VzcygpXG4gICAgICB0aGlzLm1vZGlmeVNlbnNpYmxlQ29udGVudFJhdGluZygpXG4gICAgICB0aGlzLmFzc2lnblBhdGhBbmRVcGRhdGVCYW5uZXIodGhpcy5yb3V0ZXIudXJsKVxuICAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBTeW5jIG1pbGVzdG9uZSBpc0xvY2tlZCBwcm9wZXJ0eSB3aXRoIGNvbXB1dGVkIGxvY2tpbmcgc3RhdHVzIGZyb20gaGFzaG1hcFxuICAgKiBUaGlzIGVuc3VyZXMgdGhlIGNvbnRlbnQgdHJlZSByZWZsZWN0cyB0aGUgYWN0dWFsIGxvY2sgc3RhdHVzXG4gICAqL1xuICBzeW5jTWlsZXN0b25lTG9ja1N0YXR1cygpIHtcbiAgICBpZiAoIXRoaXMuY29udGVudCB8fCAhdGhpcy5jb250ZW50LmNoaWxkcmVuKSByZXR1cm5cblxuICAgIHRoaXMuY29udGVudC5jaGlsZHJlbi5mb3JFYWNoKChjaGlsZDogYW55KSA9PiB7XG4gICAgICBpZiAoY2hpbGQucHJpbWFyeUNhdGVnb3J5ID09PSAnTWlsZXN0b25lJyAmJiBjaGlsZC5pZGVudGlmaWVyKSB7XG4gICAgICAgIGNvbnN0IGhhc2hEYXRhID0gdGhpcy50b2NTdmMuaGFzaG1hcFtjaGlsZC5pZGVudGlmaWVyXVxuICAgICAgICBpZiAoaGFzaERhdGEgJiYgaGFzaERhdGEuY29tcHV0ZWRJc0xvY2tlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgY2hpbGQuaXNMb2NrZWQgPSBoYXNoRGF0YS5jb21wdXRlZElzTG9ja2VkXG4gICAgICAgICAgY29uc29sZS5sb2coYFN5bmNlZCBtaWxlc3RvbmUgJHtjaGlsZC5pZGVudGlmaWVyfSAoJHtjaGlsZC5uYW1lfSkgaXNMb2NrZWQ6ICR7Y2hpbGQuaXNMb2NrZWR9YClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBvbkxhbmd1YWdlU2VsZWN0KGxhbmc6IGFueSkge1xuICAgIC8vIENoZWNrIGlmIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSBpcyBhbHJlYWR5IHNldFxuICAgIGlmICh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UgJiYgdGhpcy5zZWxlY3RlZExhbmd1YWdlLmlkZW50aWZpZXIgPT09IGxhbmcuaWRlbnRpZmllcikge1xuICAgICAgY29uc29sZS5sb2coJ0xhbmd1YWdlIGlzIGFscmVhZHkgc2VsZWN0ZWQ6JywgbGFuZy5uYW1lKVxuICAgICAgcmV0dXJuIC8vIEV4aXQgdGhlIGZ1bmN0aW9uIGlmIHRoZSBsYW5ndWFnZSBpcyB0aGUgc2FtZVxuICAgIH1cblxuICAgIGlmICh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCAmJiB0aGlzLnVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGgpIHtcbiAgICAgIGxldCBkYXRhID0ge31cbiAgICAgIC8vIFRPRE86IFJlbW92ZSBoYXJkY29kZSBzdHJpbmdzXG4gICAgICBjb25zdCBlbnJvbGxlZENvdXJzZSA9IHRoaXMudG9jU3ZjLmZpbmRFbnJvbG1lbnRCeUNvbGxlY3Rpb25JZCh0aGlzLnVzZXJFbnJvbGxtZW50TGlzdCwgKHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJykpXG4gICAgICBpZiAoZW5yb2xsZWRDb3Vyc2UgJiYgZW5yb2xsZWRDb3Vyc2Uuc3RhdHVzID09PSAyKSB7XG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBJZiB0aGVyZSBpcyBwcm9ncmVzcyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UsXG4gICAgICAgIGlmICh0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3MgJiYgdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzW2xhbmcubGFuZ0lkXSA+IDApIHtcbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogYENvbnRpbnVlIHdoZXJlIHlvdSBsZWZ0IG9mZiBpbiAke2xhbmcubmFtZX0/YCxcbiAgICAgICAgICAgICAgbWVzc2FnZTogYFlvdSd2ZSBhbHJlYWR5IG1hZGUgc29tZSBwcm9ncmVzcyBpbiB0aGlzIGxhbmd1YWdlLlxcbiBJZiB5b3UgY29udGludWUgaXQgd2lsbCByZXN1bWUgZnJvbSB3aGVyZSB5b3UgbGVmdCBvZmYuYCxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ1Jlc3VtZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vIHByb2dyZXNzIGluIHRoZSBzZWxlY3RlZCBsYW5ndWFnZSwgb3IgZmlyc3QgdGltZSBzZWxlY3Rpb25cbiAgICAgICAgICBkYXRhID0ge1xuICAgICAgICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICAgICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgICAgICAgIGhlYWRlcjogJ0FyZSB5b3Ugc3VyZSB5b3Ugd2FudCB0byBjaGFuZ2UgdGhlIGxhbmd1YWdlPycsXG4gICAgICAgICAgICAgIG1lc3NhZ2U6ICdTd2l0Y2hpbmcgdGhlIGxhbmd1YWdlIHdpbGwgcmVzZXQgeW91ciBwcm9ncmVzcy4gXFxuIFRoZSBjb3Vyc2Ugd2lsbCByZXN0YXJ0IGZyb20gdGhlIGJlZ2lubmluZyBpbiB0aGUgc2VsZWN0ZWQgbGFuZ3VhZ2UuJyxcbiAgICAgICAgICAgICAgY2FuY2VsQnV0dG9uOiAnQmFjaycsXG4gICAgICAgICAgICAgIGFjY2VwdEJ1dHRvbjogJ0NoYW5nZSBsYW5ndWFnZScsXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0xhbmdTd2l0Y2hQb3B1cChsYW5nLCBkYXRhKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nKVxuICAgIH1cbiAgfVxuXG4gIHNob3dMYW5nU3dpdGNoUG9wdXAobGFuZzogYW55LCBkYXRhPzogYW55KSB7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIGRhdGEpXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChjb25maXJtZWQpID0+IHtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgY29uc29sZS5sb2coJ2NvbmZpcm1lZCcpXG4gICAgICAgIHRoaXMucHJvY2Vzc0xhbmd1YWdlU2VsZWN0aW9uKGxhbmcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHNob3dPbmVTdGVwUmVzdW1lQ29uZmlybSh1cmxEYXRhOiBhbnkpIHtcbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgIGRhdGE6IHtcbiAgICAgICAgZnJvbTogJ2xhbmd1YWdlU3dpdGNoJyxcbiAgICAgICAgaWNvbjogJ3RyYW5zbGF0ZScsXG4gICAgICAgIGhlYWRlcjogYFlvdSd2ZSBhbHJlYWR5IHN0YXJ0ZWQgdGhpcyBjb3Vyc2VgLFxuICAgICAgICBtZXNzYWdlOiBgWW914oCZdmUgbWFkZSBzb21lIDxiPnByb2dyZXNzPC9iPiBpbiBhbm90aGVyIGxhbmd1YWdlIG9mIHRoaXMgY291cnNlLiBcXG5Xb3VsZCB5b3UgbGlrZSB0byA8Yj5yZXN1bWUgd2hlcmUgeW91IGxlZnQgb2ZmPC9iPiwgb3IgY29udGludWUgd2l0aCB0aGlzIHZlcnNpb24gaW5zdGVhZD9gLFxuICAgICAgICBjYW5jZWxCdXR0b246ICdDb250aW51ZSBIZXJlJyxcbiAgICAgICAgYWNjZXB0QnV0dG9uOiAnUmVzdW1lJyxcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihUT0NNdWx0aUxpbmd1YWxEaWFsb2dDb21wb25lbnQsIGRhdGEpXG4gICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKChjb25maXJtZWQpID0+IHtcbiAgICAgIGlmIChjb25maXJtZWQpIHtcbiAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoXG4gICAgICAgICAgW3VybERhdGEudXJsXSxcbiAgICAgICAgICB7IHF1ZXJ5UGFyYW1zOiB1cmxEYXRhLnF1ZXJ5UGFyYW1zIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBsYW5nID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRSZXF1aXJlZExhbmd1YWdlRGV0YWlscyh0aGlzLmJhc2VDb250ZW50UmVhZERhdGEsIHRoaXMucXVlcnlQYXJhbXNEYXRhWydNTCddKVxuICAgICAgICB0aGlzLnByb2Nlc3NMYW5ndWFnZVNlbGVjdGlvbihsYW5nKVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBwcm9jZXNzTGFuZ3VhZ2VTZWxlY3Rpb24obGFuZzogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gbGFuZ1xuICAgIGNvbnNvbGUubG9nKCdTZWxlY3RlZCBsYW5ndWFnZTonLCBsYW5nKVxuXG4gICAgLy8gU2V0IHNrZWxldG9uIGxvYWRlciB0byBzaG93IGxvYWRpbmcgc3RhdGVcbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxuICAgIC8vIENoZWNrIGlmIGxhbmd1YWdlIG9iamVjdCBoYXMgcmVxdWlyZWQgcHJvcGVydGllc1xuICAgIGlmIChsYW5nICYmIGxhbmcuaWRlbnRpZmllcikge1xuICAgICAgLy8gQ3JlYXRlIGEgcHJvbWlzZSBjaGFpbiB0byBmZXRjaCBjb250ZW50IGRhdGEgYW5kIGhpZXJhcmNoeSBzZXF1ZW50aWFsbHlcbiAgICAgIHRoaXMuZmV0Y2hDb250ZW50UmVhZChsYW5nLmlkZW50aWZpZXIpXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBBZnRlciBjb250ZW50IHJlYWQgaXMgc3VjY2Vzc2Z1bCwgZmV0Y2ggdGhlIGhpZXJhcmNoeVxuICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoQ29udGVudEhpZXJhcmNoeShsYW5nLmlkZW50aWZpZXIpXG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAvLyBCb3RoIG9wZXJhdGlvbnMgd2VyZSBzdWNjZXNzZnVsXG4gICAgICAgICAgLy8gVXBkYXRlIFVJIGFzIG5lZWRlZCB3aXRoIG5ldyBjb250ZW50XG4gICAgICAgICAgdGhpcy5yb3V0ZXJDaGFuZ2VIYW5kbGVyKHRydWUpXG4gICAgICAgICAgaWYgKHRoaXMudXNlckVucm9sbG1lbnRMaXN0ICYmIHRoaXMudXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgICAgICAgdGhpcy5nZXRMZWFybmluZ1VybHMoKVxuICAgICAgICAgICAgLy8gUmVzZXQgdXNlciBwcm9ncmVzcyBhbmQgZmV0Y2ggZW5yb2xsbWVudCBkYXRhIGlmIG5vdCBpbiBwcmV2aWV3IG1vZGVcbiAgICAgICAgICAgIGlmICghdGhpcy5mb3JQcmV2aWV3KSB7XG4gICAgICAgICAgICAgIHRoaXMuY2hlY2tJZlVzZXJFbnJvbGxlZCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vIFVwZGF0ZSBzdWJqZWN0IHRvIG5vdGlmeSByYXRpbmcgc3VtbXJ5IGNvbXBvbmVudCBhbmQgbG9hZCB0aGUgc3VtYW1yeSBvZiBzZWxlY3RlZCBsYW5ndWFnZVxuICAgICAgICAgIHRoaXMucmVzZXRSYXRpbmdzU2VydmljZS5zZXRSYXRpbmdTZXJ2aWNlVXBkYXRlKHRydWUpXG4gICAgICAgICAgLy8gRmluYWxseSBzZXQgbG9hZGluZyBzdGF0ZSB0byBmYWxzZVxuICAgICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgLy8gSGFuZGxlIGFueSBlcnJvcnMgaW4gdGhlIHByb21pc2UgY2hhaW5cbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgZHVyaW5nIGxhbmd1YWdlIGNoYW5nZTonLCBlcnJvcilcbiAgICAgICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgICAgICAgICB0aGlzLnNuYWNrQmFyLm9wZW4oJ0ZhaWxlZCB0byBsb2FkIGNvbnRlbnQgaW4gc2VsZWN0ZWQgbGFuZ3VhZ2UnLCAnWCcsIHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAzMDAwLFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdJbnZhbGlkIGxhbmd1YWdlIHNlbGVjdGlvbicsIGxhbmcpXG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgICAgIHRoaXMuc25hY2tCYXIub3BlbignSW52YWxpZCBsYW5ndWFnZSBzZWxlY3Rpb24nLCAnWCcsIHtcbiAgICAgICAgZHVyYXRpb246IDMwMDAsXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIGNvbnRlbnQgZGF0YSBmb3IgYSBnaXZlbiBpZGVudGlmaWVyIGFuZCB1cGRhdGVzIHRoZSBjb250ZW50UmVhZERhdGEgcHJvcGVydHlcbiAgICogQHBhcmFtIGlkZW50aWZpZXIgVGhlIGNvbnRlbnQgaWRlbnRpZmllciB0byBmZXRjaFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBpZiBjb250ZW50IHdhcyBmZXRjaGVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGZldGNoQ29udGVudFJlYWQoaWRlbnRpZmllcjogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlPGJvb2xlYW4+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGlmICghaWRlbnRpZmllcikge1xuICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignQ2Fubm90IGZldGNoIGNvbnRlbnQ6IGlkZW50aWZpZXIgaXMgbWlzc2luZycpXG4gICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICBjb25zdCBvYnNlcnZhYmxlID0gdGhpcy5jb250ZW50U3ZjLmZldGNoQ29udGVudERhdGEoaWRlbnRpZmllcilcblxuICAgICAgaWYgKCFvYnNlcnZhYmxlKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdmZXRjaENvbnRlbnREYXRhIGRpZCBub3QgcmV0dXJuIGFuIE9ic2VydmFibGUnKVxuICAgICAgICByZXNvbHZlKGZhbHNlKVxuICAgICAgICByZXR1cm5cbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gb2JzZXJ2YWJsZS5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgIGlmIChyZXNwb25zZT8ucmVzdWx0Py5jb250ZW50KSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgY29udGVudFJlYWREYXRhIHdpdGggdGhlIGZldGNoZWQgY29udGVudFxuICAgICAgICAgICAgdGhpcy5jb250ZW50UmVhZERhdGEgPSByZXNwb25zZS5yZXN1bHQuY29udGVudFxuXG4gICAgICAgICAgICAvLyBVcGRhdGUgbGFuZ3VhZ2UgbGlzdCBhZnRlciBjb250ZW50IGlzIGZldGNoZWRcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSkge1xuICAgICAgICAgICAgICB0aGlzLmxhbmd1YWdlTGlzdCA9IHRoaXMuY29udGVudExhbmdTdmMuZ2V0QWxsQ29udGVudExhbmd1YWdlcyh0aGlzLmNvbnRlbnRSZWFkRGF0YSlcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0gdGhpcy5jb250ZW50TGFuZ1N2Yy5nZXRTZWxlY3RlZExhbmd1YWdlKHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHRydWUpXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ0NvbnRlbnQgZGF0YSBub3QgZm91bmQgaW4gcmVzcG9uc2UnLCByZXNwb25zZSlcbiAgICAgICAgICAgIHJlc29sdmUoZmFsc2UpXG4gICAgICAgICAgfVxuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdGYWlsZWQgdG8gZmV0Y2ggY29udGVudCBkYXRhJywgZXJyb3IpXG4gICAgICAgICAgcmVqZWN0KGVycm9yKVxuICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJvdXRlckNoYW5nZUhhbmRsZXIoYXBwZW5kQmF0Y2hJZDogYm9vbGVhbikge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zOiBhbnkgPSB7fVxuXG4gICAgLy8gQWRkIGJhdGNoIElEIGlmIG5lZWRlZFxuICAgIGlmIChhcHBlbmRCYXRjaElkICYmIHRoaXMuZ2V0QmF0Y2hJZCgpKSB7XG4gICAgICBxdWVyeVBhcmFtcy5iYXRjaElkID0gdGhpcy5nZXRCYXRjaElkKClcbiAgICB9XG5cbiAgICAvLyBBZGQgbXVsdGlsaW5ndWFsIElEIGFuZCBsYW5ndWFnZSB0byBxdWVyeSBwYXJhbXMgaWYgYXZhaWxhYmxlXG4gICAgaWYgKHRoaXMuY29udGVudFJlYWREYXRhICYmIHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXIpIHtcbiAgICAgIGxldCBsYW5ndWFnZSA9ICcnXG5cbiAgICAgIC8vIEhhbmRsZSBib3RoIHN0cmluZyBhbmQgYXJyYXkgbGFuZ3VhZ2UgZm9ybWF0c1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2UpKSB7XG4gICAgICAgIGxhbmd1YWdlID0gdGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2VbMF0udG9Mb3dlckNhc2UoKVxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZSkge1xuICAgICAgICBsYW5ndWFnZSA9IHRoaXMuY29udGVudFJlYWREYXRhLmxhbmd1YWdlLnRvTG93ZXJDYXNlKClcbiAgICAgIH1cbiAgICAgIGlmICghKHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSAmJiBPYmplY3Qua2V5cyh0aGlzLnNlbGVjdGVkTGFuZ3VhZ2UpLmxlbmd0aCkpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZExhbmd1YWdlID0ge1xuICAgICAgICAgIGxhbmdJZDogbGFuZ3VhZ2UsXG4gICAgICAgICAgbmFtZTogdGhpcy5jb250ZW50UmVhZERhdGEubGFuZ3VhZ2VbMF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gT25seSBhZGQgcGFyYW1ldGVycyBpZiB3ZSBoYXZlIHZhbGlkIGRhdGFcbiAgICAgIGlmIChsYW5ndWFnZSkge1xuICAgICAgICBxdWVyeVBhcmFtcy5NTCA9IGxhbmd1YWdlXG4gICAgICB9XG5cbiAgICAgIHF1ZXJ5UGFyYW1zLk1MSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YS5pZGVudGlmaWVyXG4gICAgfVxuXG4gICAgLy8gT25seSBuYXZpZ2F0ZSBpZiB3ZSBoYXZlIGJhdGNoIElEIG9yIG90aGVyIHBhcmFtZXRlcnNcbiAgICBpZiAoT2JqZWN0LmtleXMocXVlcnlQYXJhbXMpLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFxuICAgICAgICBbXSxcbiAgICAgICAge1xuICAgICAgICAgIHJlbGF0aXZlVG86IHRoaXMucm91dGUsXG4gICAgICAgICAgcXVlcnlQYXJhbXM6IHF1ZXJ5UGFyYW1zLFxuICAgICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldENvbnRpbnVlTGVhcm5pbmdEYXRhKGNvbnRlbnRJZDogc3RyaW5nLCBiYXRjaElkPzogc3RyaW5nLCBsYW5nPzogc3RyaW5nKSB7XG4gICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KHRydWUpXG4gICAgdGhpcy5yZXN1bWVEYXRhID0gbnVsbFxuICAgIGxldCB1c2VySWRcbiAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgIHVzZXJJZCA9IHRoaXMuY29uZmlnU3ZjLnVzZXJQcm9maWxlLnVzZXJJZCB8fCAnJ1xuICAgIH1cblxuICAgIGNvbnN0IHJlcTogTnNDb250ZW50LklDb250aW51ZUxlYXJuaW5nRGF0YVJlcSA9IHtcbiAgICAgIHJlcXVlc3Q6IHtcbiAgICAgICAgYmF0Y2hJZCxcbiAgICAgICAgdXNlcklkLFxuICAgICAgICBjb3Vyc2VJZDogY29udGVudElkIHx8ICcnLFxuICAgICAgICBjb250ZW50SWRzOiBbXSxcbiAgICAgICAgZmllbGRzOiBbJ3Byb2dyZXNzZGV0YWlscyddLFxuICAgICAgICAuLi4obGFuZyA/IHsgbGFuZ3VhZ2U6IGxhbmcgfSA6IG51bGwpLFxuICAgICAgfSxcbiAgICB9XG4gICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5ICE9PSBOc0NvbnRlbnQuRVByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkge1xuICAgICAgdGhpcy5jb250ZW50U3ZjLmZldGNoQ29udGVudEhpc3RvcnlWMihyZXEpLnN1YnNjcmliZShcbiAgICAgICAgZGF0YSA9PiB7XG4gICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5yZXN1bHQgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QgJiYgZGF0YS5yZXN1bHQuY29udGVudExpc3QubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCB0ZW1wUmVzdW1lRGF0YSA9IF8uZ2V0KGRhdGEsICdyZXN1bHQuY29udGVudExpc3QnKVxuICAgICAgICAgICAgdGhpcy5sYW5ndWFnZU1hcFByb2dyZXNzID0gXy5nZXQoZGF0YSwgJ3Jlc3VsdC5sYW5ndWFnZVByb2dyZXNzJykgfHwge31cbiAgICAgICAgICAgIHRoaXMucmVzdW1lRGF0YSA9IF8ubWFwKHRlbXBSZXN1bWVEYXRhLCByciA9PiB7XG4gICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZVxuICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IF8uZmlsdGVyKGZsYXR0ZW5JdGVtcyhfLmdldCh0aGlzLmNvbnRlbnQsICdjaGlsZHJlbicpIHx8IFtdLCAnY2hpbGRyZW4nKSwgeyAnaWRlbnRpZmllcic6IHJyLmNvbnRlbnRJZCwgcHJpbWFyeUNhdGVnb3J5OiAnTGVhcm5pbmcgUmVzb3VyY2UnIH0pXG4gICAgICAgICAgICAgIF8uc2V0KHJyLCAncHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlJywgXy5nZXQoXy5maXJzdChpdGVtcyksICdtaW1lVHlwZScpKVxuICAgICAgICAgICAgICBpZiAoIV8uZ2V0KHJyLCAnY29tcGxldGlvblBlcmNlbnRhZ2UnKSkge1xuICAgICAgICAgICAgICAgIGlmIChfLmdldChyciwgJ3N0YXR1cycpID09PSAyKSB7XG4gICAgICAgICAgICAgICAgICBfLnNldChyciwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJywgMTAwKVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBfLnNldChyciwgJ2NvbXBsZXRpb25QZXJjZW50YWdlJywgMClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHJyXG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgY29uc3QgcHJvZ3Jlc3MgPSBfLm1hcCh0aGlzLnJlc3VtZURhdGEsICdjb21wbGV0aW9uUGVyY2VudGFnZScpXG4gICAgICAgICAgICBjb25zdCB0b3RhbENvdW50ID0gXy50b0ludGVnZXIoXy5nZXQodGhpcy5jb250ZW50LCAnbGVhZk5vZGVzQ291bnQnKSkgfHwgMVxuICAgICAgICAgICAgaWYgKHByb2dyZXNzLmxlbmd0aCA8IHRvdGFsQ291bnQpIHtcbiAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IHRvdGFsQ291bnQgLSBwcm9ncmVzcy5sZW5ndGhcbiAgICAgICAgICAgICAgaWYgKGRpZmYpIHtcbiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmVcbiAgICAgICAgICAgICAgICBfLmVhY2gobmV3IEFycmF5KGRpZmYpLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICBwcm9ncmVzcy5wdXNoKDApXG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5nZW5lcmF0ZVJlc3VtZURhdGFMaW5rTmV3KClcbiAgICAgICAgICAgIHRoaXMudG9jU3ZjLnVwZGF0ZVJlc3VtYURhdGEodGhpcy5yZXN1bWVEYXRhKVxuICAgICAgICAgICAgLy8gdGhpcy50b2NTdmMubWFwTW9kdWxlRHVyYXRpb25BbmRQcm9ncmVzcyh0aGlzLmNvbnRlbnQsIHRoaXMuY29udGVudClcbiAgICAgICAgICAgIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSAxMDApIHtcbiAgICAgICAgICAgICAgdGhpcy50b2NTdmMubWFwQ29tcGxldGlvblBlcmNlbnRhZ2UodGhpcy5jb250ZW50LCB0aGlzLnJlc3VtZURhdGEpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnJlc3VtZURhdGEgPSBudWxsXG4gICAgICAgICAgICB0aGlzLnRvY1N2Yy5jYWxsSGlyYXJjaHlQcm9ncmVzc0hhc2htYXAodGhpcy5jb250ZW50KVxuICAgICAgICAgICAgdGhpcy50b2NTdmMuY29udGVudExvYWRlci5uZXh0KGZhbHNlKVxuICAgICAgICAgIH1cblxuICAgICAgICAgIHRoaXMuY29udGVudFN2Yy5zZXRQcm9ncmFtQ2hpbGRSZXN1bWVEYXRhKHRoaXMucmVzdW1lRGF0YSwgY29udGVudElkKVxuICAgICAgICAgIGlmICh0aGlzLmNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlICE9PSAxMDApIHtcbiAgICAgICAgICAgIHRoaXMuYmluZENvbXBsZXRpb25QZXJjZW50YWdlKClcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0NPTlRFTlQgSElTVE9SWSBGRVRDSCBFUlJPUiA+JywgZXJyb3IpXG4gICAgICAgIH0sXG4gICAgICApXG4gICAgfVxuICB9XG5cbiAgZ2VuZXJhdGVSZXN1bWVEYXRhTGlua05ldygpIHtcbiAgICBpZiAodGhpcy5yZXN1bWVEYXRhICYmIHRoaXMuY29udGVudCkge1xuICAgICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gICAgICBpZiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KClcbiAgICAgIH1cbiAgICAgIGlmICghcmVzdW1lRGF0YVYyLm1pbWVUeXBlKSB7XG4gICAgICAgIHJlc3VtZURhdGFWMi5taW1lVHlwZSA9IHRoaXMudG9jU3ZjLmdldE1pbWVUeXBlKHRoaXMuY29udGVudCwgcmVzdW1lRGF0YVYyLmlkZW50aWZpZXIpXG4gICAgICB9XG4gICAgICB0aGlzLnJlc3VtZURhdGFMaW5rID0gdGhpcy5nZXRSZXN1bWVVcmwocmVzdW1lRGF0YVYyKVxuICAgICAgdGhpcy5hY3Rpb25TVkMuc2V0VXBkYXRlQ29tcEdyb3VwTyA9IHRoaXMucmVzdW1lRGF0YUxpbmtcbiAgICAgIC8qIHRzbGludDpkaXNhYmxlLW5leHQtbGluZSAqL1xuICAgIH1cbiAgfVxuICBpc1NlbGVjdGVkSW5Nb3JlRHJvcGRvd24oKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXIgfHwgIXRoaXMubGFuZ3VhZ2VMaXN0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VMaXN0LnNsaWNlKDUpLnNvbWUoKGxhbmc6IGFueSkgPT5cbiAgICAgIGxhbmc/LmlkZW50aWZpZXIgPT09IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllclxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGdldFF1ZXJ5UGFyYW1zKCkge1xuICAgIGNvbnN0IHRlbXBRdWVyeVBhcmFtc0RhdGE6IGFueSA9IHt9XG4gICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucXVlcnlQYXJhbU1hcC5zdWJzY3JpYmUoYXN5bmMgcVBhcmFtc01hcCA9PiB7XG5cbiAgICAgIC8vIEV4dHJhY3QgYWxsIHBhcmFtZXRlcnMgZnJvbSB0aGUgUGFyYW1NYXBcbiAgICAgIHFQYXJhbXNNYXAua2V5cy5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgIHRlbXBRdWVyeVBhcmFtc0RhdGFba2V5XSA9IHFQYXJhbXNNYXAuZ2V0KGtleSkgPz8gJydcbiAgICAgIH0pXG4gICAgICB0ZW1wUXVlcnlQYXJhbXNEYXRhXG5cbiAgICAgIC8vIFByb2Nlc3Mgc3BlY2lmaWMgcGFyYW1ldGVyc1xuICAgICAgY29uc3QgY29udGV4dElkID0gdGVtcFF1ZXJ5UGFyYW1zRGF0YVsnY29udGV4dElkJ11cbiAgICAgIGNvbnN0IGNvbnRleHRQYXRoID0gdGVtcFF1ZXJ5UGFyYW1zRGF0YVsnY29udGV4dFBhdGgnXVxuICAgICAgY29uc3QgcmVjb21tZW5kZWRDb3Vyc2VzSWQgPSB0ZW1wUXVlcnlQYXJhbXNEYXRhWydyZWNvbW1lbmRhdGlvbklkJ11cblxuICAgICAgaWYgKGNvbnRleHRJZCAmJiBjb250ZXh0UGF0aCkge1xuICAgICAgICB0aGlzLmNvbnRleHRJZCA9IGNvbnRleHRJZFxuICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGhcbiAgICAgIH1cblxuICAgICAgaWYgKHJlY29tbWVuZGVkQ291cnNlc0lkKSB7XG4gICAgICAgIHRoaXMucmVjb21tZW5kZWRDb3Vyc2VzSWQgPSByZWNvbW1lbmRlZENvdXJzZXNJZFxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy51c2VyU2VydmljZUxpYi5nZXRSZWNvbW1lbmRlZENvdXJzZXNTYWtzaGFtQUkocmVjb21tZW5kZWRDb3Vyc2VzSWQpLnRvUHJvbWlzZSgpXG4gICAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLmZlZWRiYWNrcyAmJiByZXNwb25zZS5mZWVkYmFja3MubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLmZlZWRiYWNrR2l2ZW4gPSByZXNwb25zZS5mZWVkYmFja3MuZmluZCgoZmVlZGJhY2s6IGFueSkgPT4gZmVlZGJhY2s/LmNvdXJzZV9pZCA9PT0gdGhpcy5jb3Vyc2VJRClcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgdGhpcy5sb2dnZXJTdmMuZXJyb3IoJ0Vycm9yIGZldGNoaW5nIHJlY29tbWVuZGVkIGNvdXJzZXM6JywgZXJyb3IpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiB0ZW1wUXVlcnlQYXJhbXNEYXRhXG4gIH1cblxuICBnZXRPcmdJZEZvclNoYXJlKCkge1xuICAgIGlmICh0aGlzLmNvbnRlbnQgJiYgIVtcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX0NPVVJTRSxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuTU9ERVJBVEVEX0FTU0VTU0VNRU5ULFxuICAgICAgTnNDb250ZW50LkVDb3Vyc2VDYXRlZ29yeS5NT0RFUkFURURfUFJPR1JBTSxcbiAgICAgIE5zQ29udGVudC5FQ291cnNlQ2F0ZWdvcnkuSU5WSVRFX09OTFlfUFJPR1JBTSxcbiAgICBdLmluY2x1ZGVzKHRoaXMuY29udGVudC5jb3Vyc2VDYXRlZ29yeSkpIHtcbiAgICAgIHRoaXMuY2FuU2hhcmUgPSB0cnVlXG4gICAgICBpZiAodGhpcy5jb25maWdTdmMudXNlclByb2ZpbGUpIHtcbiAgICAgICAgdGhpcy5yb290T3JnSWQgPSB0aGlzLmNvbmZpZ1N2Yy51c2VyUHJvZmlsZS5yb290T3JnSWRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyBhbmQgcHJvY2Vzc2VzIGNvbnRlbnQgY3JlYXRvciBkYXRhIGZyb20gdGhlIGN1cnJlbnQgY29udGVudFxuICAgKiAtIFNldHMgY29udGVudENyZWF0b3JEYXRhIGZyb20gcGFyc2VkIGNyZWF0b3IgY29udGFjdHNcbiAgICogLSBEZXRlcm1pbmVzIGlmIFwic2hvdyBidXR0b25cIiBmbGFnIHNob3VsZCBiZSBlbmFibGVkIGJhc2VkIG9uIGNvbnRlbnQgbmFtZVxuICAgKiAtIEluY2x1ZGVzIHByb3BlciBlcnJvciBoYW5kbGluZyBmb3IgbnVsbCB2YWx1ZXMgYW5kIHBhcnNpbmdcbiAgICovXG4gIGdldENvbnRlbnRDcmVhdG9yRGF0YSgpIHtcbiAgICB0cnkge1xuICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGhhdmUgdmFsaWQgY29udGVudCBkYXRhXG4gICAgICBpZiAoIXRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLndhcm4oJ0Nhbm5vdCBnZXQgY3JlYXRvciBkYXRhOiBjb250ZW50UmVhZERhdGEgaXMgbm90IGF2YWlsYWJsZScpXG4gICAgICAgIHJldHVyblxuICAgICAgfVxuXG4gICAgICAvLyBQcm9jZXNzIGNvbnRlbnQgbmFtZSBmb3IgY29tcGFyaXNvbiAoc2FmZWx5IGhhbmRsZSBudWxsL3VuZGVmaW5lZClcbiAgICAgIGNvbnN0IGNvbnRlbnROYW1lID0gdGhpcy5jb250ZW50UmVhZERhdGEubmFtZT8udHJpbSgpIHx8ICcnXG5cbiAgICAgIC8vIFBhcnNlIGFuZCBzZXQgY3JlYXRvciBjb250YWN0cyBpZiBhdmFpbGFibGVcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YS5jcmVhdG9yQ29udGFjdHMpIHtcbiAgICAgICAgLy8gVXNlIHRoZSBleGlzdGluZyBwYXJzaW5nIG1ldGhvZCB0byBoYW5kbGUgY3JlYXRvciBjb250YWN0c1xuICAgICAgICB0aGlzLmNvbnRlbnRDcmVhdG9yRGF0YSA9IHRoaXMuaGFuZGxlUGFyc2VKc29uRGF0YSh0aGlzLmNvbnRlbnRSZWFkRGF0YS5jcmVhdG9yQ29udGFjdHMpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBSZXNldCB0byBlbXB0eSBhcnJheSBpZiBubyBjcmVhdG9yIGNvbnRhY3RzXG4gICAgICAgIHRoaXMuY29udGVudENyZWF0b3JEYXRhID0gW11cbiAgICAgIH1cblxuICAgICAgLy8gU2V0IHNob3dCdG4gZmxhZyBiYXNlZCBvbiBkYWtzaHRhIG5hbWUgY29tcGFyaXNvbiAoY2FzZSBpbnNlbnNpdGl2ZSlcbiAgICAgIC8vIFRoaXMgZGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lhbCBidXR0b24gZm9yIGRha3NodGEgY29udGVudCBpcyBzaG93blxuICAgICAgdGhpcy5zaG93QnRuID0gY29udGVudE5hbWUudG9Mb3dlckNhc2UoKSA9PT0gdGhpcy5kYWtzaHRhTmFtZS50b0xvd2VyQ2FzZSgpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIC8vIEhhbmRsZSBhbnkgdW5leHBlY3RlZCBlcnJvcnNcbiAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdFcnJvciBwcm9jZXNzaW5nIGNvbnRlbnQgY3JlYXRvciBkYXRhOicsIGVycm9yKVxuICAgICAgdGhpcy5jb250ZW50Q3JlYXRvckRhdGEgPSBbXVxuICAgICAgdGhpcy5zaG93QnRuID0gZmFsc2VcbiAgICB9XG4gIH1cblxuICBnZXRJMThOVHJhbnNsYXRpb25zKCkge1xuICAgIC8vIFN1YnNjcmliZSB0byBsYW5ndWFnZSB0cmFuc2xhdGlvbiBmbGFnIGNoYW5nZXNcbiAgICBjb25zdCB0cmFuc2xhdGlvblN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnU3ZjLmxhbmd1YWdlVHJhbnNsYXRpb25GbGFnXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95U3ViamVjdCQpKSAvLyBFbnN1cmUgc3Vic2NyaXB0aW9uIGlzIGNsZWFuZWQgdXAgb24gY29tcG9uZW50IGRlc3Ryb3lcbiAgICAgIC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiAoZGF0YTogYW55KSA9PiB7XG4gICAgICAgICAgLy8gT25seSBwcm9jZWVkIGlmIHdlIGhhdmUgdmFsaWQgZGF0YVxuICAgICAgICAgIGlmIChkYXRhKSB7XG4gICAgICAgICAgICAvLyBDaGVjayBpZiB3ZWJzaXRlIGxhbmd1YWdlIGlzIHNldCBpbiBsb2NhbFN0b3JhZ2VcbiAgICAgICAgICAgIGNvbnN0IHN0b3JlZExhbmd1YWdlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3dlYnNpdGVMYW5ndWFnZScpXG4gICAgICAgICAgICBpZiAoc3RvcmVkTGFuZ3VhZ2UpIHtcbiAgICAgICAgICAgICAgLy8gU2V0IGRlZmF1bHQgbGFuZ3VhZ2UgYXMgZmFsbGJhY2tcbiAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUuc2V0RGVmYXVsdExhbmcoJ2VuJylcblxuICAgICAgICAgICAgICAvLyBVc2UgdGhlIHN0b3JlZCBsYW5ndWFnZSBwcmVmZXJlbmNlXG4gICAgICAgICAgICAgIHRoaXMudHJhbnNsYXRlLnVzZShzdG9yZWRMYW5ndWFnZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAvLyBMb2cgYW55IGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBzdWJzY3JpcHRpb25cbiAgICAgICAgICB0aGlzLmxvZ2dlclN2Yy5lcnJvcignRXJyb3IgaW4gbGFuZ3VhZ2UgdHJhbnNsYXRpb24gc3Vic2NyaXB0aW9uOicsIGVycm9yKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgLy8gU3RvcmUgc3Vic2NyaXB0aW9uIGZvciBjbGVhbnVwIChvcHRpb25hbCBhbHRlcm5hdGl2ZSB0byB0YWtlVW50aWwpXG4gICAgdGhpcy50cmFuc2xhdGlvblN1YnNjcmlwdGlvbiA9IHRyYW5zbGF0aW9uU3Vic2NyaXB0aW9uXG4gIH1cblxuICBnZXRTZXJ2ZXJEYXRlVGltZSgpIHtcbiAgICAvLyBGZXRjaCB0aGUgc2VydmVyIGRhdGUgdGltZSBhbmQgcHJvY2VzcyB0aGUgcmVzcG9uc2VcbiAgICB0aGlzLnRvY1N2Yy5nZXRTZXJ2ZXJEYXRlKCkuc3Vic2NyaWJlKFxuICAgICAgKHJlc3BvbnNlOiBhbnkpID0+IHtcbiAgICAgICAgLy8gQ2hlY2sgaWYgcmVzcG9uc2UgY29udGFpbnMgdmFsaWQgc3lzdGVtIGRhdGVcbiAgICAgICAgaWYgKHJlc3BvbnNlICYmIHJlc3BvbnNlLnN5c3RlbURhdGUpIHtcbiAgICAgICAgICAvLyBVcGRhdGUgc2VydmljZSB3aXRoIHNlcnZlciBkYXRlIChyZW1vdmVkIGR1cGxpY2F0ZSBjYWxsKVxuICAgICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUocmVzcG9uc2Uuc3lzdGVtRGF0ZSlcbiAgICAgICAgICB0aGlzLnNlcnZlckRhdGUgPSByZXNwb25zZS5zeXN0ZW1EYXRlXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gY2xpZW50J3MgdGltZSBpZiBzZXJ2ZXIgdGltZSBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgY29uc3QgY2xpZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgICAgdGhpcy50b2NTdmMuY2hhbmdlU2VydmVyRGF0ZShjbGllbnRUaW1lKVxuICAgICAgICAgIHRoaXMuc2VydmVyRGF0ZSA9IGNsaWVudFRpbWVcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgZGVwZW5kZW50IGZ1bmN0aW9ucyB0aGF0IG5lZWQgc2VydmVyIGRhdGVcbiAgICAgICAgdGhpcy5maW5kQUNQQigpXG4gICAgICAgIHRoaXMuZ2V0S2FybWFwb2ludHNMaW1pdCgpXG4gICAgICB9LFxuICAgICAgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgLy8gTG9nIHRoZSBlcnJvciBmb3IgZGVidWdnaW5nXG4gICAgICAgIHRoaXMubG9nZ2VyU3ZjLmVycm9yKCdGYWlsZWQgdG8gZ2V0IHNlcnZlciBkYXRlOicsIGVycm9yKVxuXG4gICAgICAgIC8vIEZhbGxiYWNrIHRvIGNsaWVudCdzIHRpbWUgb24gZXJyb3JcbiAgICAgICAgY29uc3QgY2xpZW50VGltZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpXG4gICAgICAgIHRoaXMudG9jU3ZjLmNoYW5nZVNlcnZlckRhdGUoY2xpZW50VGltZSlcbiAgICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gY2xpZW50VGltZVxuICAgICAgfVxuICAgIClcblxuICAgIC8vIFN1YnNjcmliZSB0byBzZXJ2ZXIgZGF0ZSBjaGFuZ2VzIGZyb20gc2VydmljZVxuICAgIHRoaXMuc2VydmVyRGF0ZVN1YnNjcmlwdGlvbiA9IHRoaXMudG9jU3ZjLnNlcnZlckRhdGVcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3lTdWJqZWN0JCkpIC8vIEVuc3VyZSBzdWJzY3JpcHRpb24gaXMgY2xlYW5lZCB1cFxuICAgICAgLnN1YnNjcmliZShzZXJ2ZXJEYXRlID0+IHtcbiAgICAgICAgdGhpcy5zZXJ2ZXJEYXRlID0gc2VydmVyRGF0ZVxuICAgICAgfSlcbiAgfVxuXG4gIGdldCBnZXRCYXNlQ29udGVudElkZW50aWZpZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCB0aGlzLmNvbnRlbnQ/LmlkZW50aWZpZXIgfHwgJydcbiAgfVxuXG4gIGdldCBpc011bHRpbGluZ3VhbCgpIHtcbiAgICBpZiAodGhpcy5iYXNlQ29udGVudFJlYWREYXRhICYmIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YS5sYW5ndWFnZU1hcFYxKSB7XG4gICAgICByZXR1cm4gdGhpcy5sYW5ndWFnZUxpc3QubGVuZ3RoID4gMVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGhhbmRsZUVucm9sbG1lbnQoZXZlbnQ6IGFueSkge1xuXG4gICAgaWYgKHRoaXMuaXNNdWx0aWxpbmd1YWwpIHtcbiAgICAgIHRoaXMub3BlbkxhbmdEaWFsb2coZXZlbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGFuZGxlQXV0b0JhdGNoQXNzaWduKClcbiAgICB9XG4gIH1cblxuICBvcGVuTGFuZ0RpYWxvZyhfZXZlbnQ6IGFueSkge1xuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oRW5yb2xsTGFuZ3VhZ2VEaWFsb2d1ZUNvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc1MDBweCcsXG4gICAgICBoZWlnaHQ6ICdhdXRvJyxcbiAgICAgIGF1dG9Gb2N1czogZmFsc2UsXG4gICAgICByZXN0b3JlRm9jdXM6IGZhbHNlLFxuICAgICAgZGF0YToge1xuICAgICAgICBwcmVTZWxlY3Q6IHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSxcbiAgICAgICAgbGFuZ3VhZ2VMaXN0OiB0aGlzLmxhbmd1YWdlTGlzdCxcbiAgICAgIH1cbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgoc2VsZWN0ZWRMYW5nKSA9PiB7XG4gICAgICBpZiAoc2VsZWN0ZWRMYW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRMYW5ndWFnZSA9IHNlbGVjdGVkTGFuZ1xuICAgICAgICBjb25zb2xlLmxvZygndGhpcy5zZWxlY3RlZExhbmd1YWdlJywgdGhpcy5zZWxlY3RlZExhbmd1YWdlKVxuICAgICAgICB0aGlzLmhhbmRsZUF1dG9CYXRjaEFzc2lnbigpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGdldFJlc3VtZVVybChyZXNvdXJjZURhdGE6IGFueSwgYmF0Y2hJZD86IGFueSwgcHJpbWFyeUNhdGVnb3J5PzogYW55KSB7XG4gICAgbGV0IE1MSWQgPSB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXIgfHwgJydcbiAgICBsZXQgTUwgPSB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmxhbmdJZCB8fCAnJ1xuICAgIGxldCByZXN1bWVEYXRhVXJsID0gdmlld2VyUm91dGVHZW5lcmF0b3IoXG4gICAgICByZXNvdXJjZURhdGEuaWRlbnRpZmllcixcbiAgICAgIHJlc291cmNlRGF0YS5taW1lVHlwZSxcbiAgICAgIHRoaXMuaXNSZXNvdXJjZSA/IHVuZGVmaW5lZCA6IHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXIgfHwgJycsXG4gICAgICB0aGlzLmlzUmVzb3VyY2UgPyB1bmRlZmluZWQgOiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGEgJiYgdGhpcy5iYXNlQ29udGVudFJlYWREYXRhPy5jb250ZW50VHlwZSB8fCAnJyxcbiAgICAgIHRoaXMuZm9yUHJldmlldyxcbiAgICAgIHByaW1hcnlDYXRlZ29yeSB8fCAnTGVhcm5pbmcgUmVzb3VyY2UnLFxuICAgICAgYmF0Y2hJZCB8fCB0aGlzLmdldEJhdGNoSWQoKSxcbiAgICAgIHRoaXMuYmFzZUNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmJhc2VDb250ZW50UmVhZERhdGE/Lm5hbWUgfHwgJycsXG4gICAgICBNTCxcbiAgICAgIE1MSWQsXG4gICAgKVxuICAgIHJldHVybiByZXN1bWVEYXRhVXJsXG4gIH1cblxuICBnZXQgY29udGVudENvbXBsZXRpb25QZXJjZW50KCkge1xuICAgIGlmICh0aGlzLmJhdGNoRGF0YT8uZW5yb2xsZWQpIHtcbiAgICAgIGlmICh0aGlzLmNvbnRlbnRSZWFkRGF0YSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5wcmltYXJ5Q2F0ZWdvcnkgPT09ICdDb3Vyc2UnICYmIHRoaXMuaXNNdWx0aWxpbmd1YWwpIHtcbiAgICAgICAgaWYgKHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzcyAmJiB0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmxhbmdJZCAmJiB0aGlzLmxhbmd1YWdlTWFwUHJvZ3Jlc3NbdGhpcy5zZWxlY3RlZExhbmd1YWdlPy5sYW5nSWRdKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMubGFuZ3VhZ2VNYXBQcm9ncmVzc1t0aGlzLnNlbGVjdGVkTGFuZ3VhZ2U/LmxhbmdJZF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gMFxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCAwXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgY2hlY2tGb3JDb21wbGV0aW9uU3VydmV5VHJpZ2dlcigpIHtcbiAgICBpZiAodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudFJlYWREYXRhKSB7XG4gICAgICBjb25zb2xlLmxvZygnY2hlY2tGb3JTdXJ2ZXlUcmlnZ2VyIHRoaXMuY29udGVudCcsIHRoaXMuY29udGVudFJlYWREYXRhKVxuICAgICAgLy8gY2hlY2sgaWYgY29tcGxldGlvbiBzdXJ2ZXkgaXMgZW5hYmxlZCBhbmQgdXNlciBoYXMgY29tcGxldGVkIHRoZSBjb3Vyc2UgYmVmb3JlIDIzcmQgREVDIDIwMjMgKHJlbGVhc2UgZGF0ZSBvZiBjb21wbGV0aW9uIHN1cnZleSlcbiAgICAgIGlmICh0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZyAmJiB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5ICYmIHRoaXMuY29uZmlnU3ZjLmluc3RhbmNlQ29uZmlnLmNvbXBsZXRpb25TdXJ2ZXkuZW5hYmxlZCAmJlxuICAgICAgICB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSAmJiB0aGlzLmVucm9sbGVkQ291cnNlRGF0YSAmJiB0aGlzLmVucm9sbGVkQ291cnNlRGF0YS5jb21wbGV0ZWRPbiA+PSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZy5jb21wbGV0aW9uU3VydmV5LnN0YXJ0RGF0ZSkge1xuICAgICAgICBpZiAoKHRoaXMuY29udGVudC5jb21wbGV0aW9uU3RhdHVzID09PSAyIHx8IHRoaXMuY29udGVudC5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKSAmJiB0aGlzLmNvbnRlbnRSZWFkRGF0YS5jb21wbGV0aW9uU3VydmV5TGluaykge1xuICAgICAgICAgIGNvbnN0IHNJRCA9IHRoaXMuY29udGVudFJlYWREYXRhLmNvbXBsZXRpb25TdXJ2ZXlMaW5rLnNwbGl0KCdzdXJ2ZXlzLycpXG4gICAgICAgICAgY29uc3Qgc3VydmV5SWQgPSBzSURbMV1cbiAgICAgICAgICBjb25zdCBjb3Vyc2VJZCA9IHRoaXMuY29udGVudFJlYWREYXRhLmlkZW50aWZpZXJcbiAgICAgICAgICAvLyBDYWxsIEFQSSB0byBzZWUgaWYgc3VydmV5IGlzIHN1Ym1pdHRlZCBvciBub3RcbiAgICAgICAgICB0aGlzLnRvY1N2Yy5nZXRBcGxsaWNhdGlvbnNCeUlkKHN1cnZleUlkLCBjb3Vyc2VJZCkuc3Vic2NyaWJlKChyZXMpID0+IHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdyZXNwb25zZSBvZiBnZXRBcGxsaWNhdGlvbnNCeUlkJywgcmVzKVxuICAgICAgICAgICAgaWYgKHJlcy5yZXN1bHQucmVzcG9uc2UgJiYgT2JqZWN0LmtleXMocmVzLnJlc3VsdC5yZXNwb25zZSkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICB0aGlzLmxvY2tDZXJ0aWZpY2F0ZSA9IGZhbHNlXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLmxvY2tDZXJ0aWZpY2F0ZSA9IHRydWVcbiAgICAgICAgICAgICAgdGhpcy5vcGVuQ29tcGxldGlvblN1cnZleUZvcm1Qb3B1cCgpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIENsZWFyIGV4aXN0aW5nIHN1cnZleSBkYXRhIGZyb20gbG9jYWwgc3RvcmFnZSBiZWZvcmUgb3BlbmluZyBwb3B1cFxuICBjbGVhckV4aXN0aW5nUHVibGljU3VydmV5RGF0YShzdXJ2ZXlJZDogc3RyaW5nLCBjb3Vyc2VJZDogc3RyaW5nKSB7XG4gICAgY29uc3Qgc3RvcmFnZUtleSA9IGBzdXJ2ZXlfJHtzdXJ2ZXlJZH1fJHtjb3Vyc2VJZH1gXG4gICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKHN0b3JhZ2VLZXkpKSB7XG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShzdG9yYWdlS2V5KVxuICAgIH1cbiAgfVxuXG4gIG9wZW5QdWJsaWNTdXJ2ZXlQb3B1cChuYXZpZ2F0aW9uVXJsPzogc3RyaW5nLCBxdWVyeVBhcmFtcz86IGFueSkge1xuICAgIC8vIEdldCBzdXJ2ZXkgSUQgYW5kIGNvdXJzZSBJRCBmcm9tIGVudmlyb25tZW50IGFuZCBjb250ZW50IGRhdGFcbiAgICBjb25zdCBzdXJ2ZXlJZCA9IHRoaXMuZW52aXJvbm1lbnQucHVibGljQ29udGVudFN1cnZleUlkIHx8ICcnXG4gICAgY29uc3QgY291cnNlSWQgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciB8fCAnJ1xuICAgIGNvbnN0IGNvdXJzZU5hbWUgPSB0aGlzLmNvbnRlbnRSZWFkRGF0YT8ubmFtZSB8fCAnJ1xuICAgIGNvbnN0IGNvbnRleHRPcmdJZCA9IHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yICYmIHRoaXMuY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yLmxlbmd0aCA+IDAgP1xuICAgICAgdGhpcy5jb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0gOiAnJ1xuXG4gICAgdGhpcy5jbGVhckV4aXN0aW5nUHVibGljU3VydmV5RGF0YShzdXJ2ZXlJZCwgY291cnNlSWQpXG5cbiAgICBjb25zdCBkYXRhID0ge1xuICAgICAgc3VydmV5SWQ6IHN1cnZleUlkLFxuICAgICAgY291cnNlSWQ6IGNvdXJzZUlkLFxuICAgICAgY291cnNlTmFtZTogY291cnNlTmFtZSxcbiAgICAgIGNvbnRleHRPcmdJZDogY29udGV4dE9yZ0lkXG4gICAgfVxuICAgIGNvbnN0IGRpYWxvZ1JlZiA9IHRoaXMuZGlhbG9nLm9wZW4oUHVibGljU3VydmV5Rm9ybUNvbXBvbmVudCwge1xuICAgICAgLy8gZGlzYWJsZUNsb3NlOiB0cnVlLFxuICAgICAgd2lkdGg6ICc3NTBweCcsXG4gICAgICBtYXhXaWR0aDogJzkwdncnLFxuICAgICAgaGVpZ2h0OiAnODB2aCcsXG4gICAgICBkYXRhOiBkYXRhLFxuICAgICAgYXV0b0ZvY3VzOiBmYWxzZSxcbiAgICB9KVxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICBpZiAocmVzdWx0KSB7XG4gICAgICAgIC8vIE5hdmlnYXRlIHRvIHRoZSBpbnRlbmRlZCBVUkwgb25seSB3aGVuIHN1cnZleSBpcyBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5XG4gICAgICAgIGlmIChuYXZpZ2F0aW9uVXJsKSB7XG4gICAgICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25hdmlnYXRpb25VcmxdLCB7IHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIHJlc3VtZUNvbnRlbnREYXRhKCkge1xuICAgIGNvbnN0IG5hdmlnYXRpb25VcmwgPSAodGhpcy5yZXN1bWVEYXRhICYmICF0aGlzLmNlcnREYXRhKSA/IHRoaXMucmVzdW1lRGF0YUxpbms/LnVybCA6IHRoaXMuZmlyc3RSZXNvdXJjZUxpbms/LnVybFxuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0gKHRoaXMucmVzdW1lRGF0YSAmJiAhdGhpcy5jZXJ0RGF0YSkgPyB0aGlzLmdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogdGhpcy5nZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoW25hdmlnYXRpb25VcmxdLCB7IHF1ZXJ5UGFyYW1zOiBxdWVyeVBhcmFtcyB9KVxuICB9XG59XG4iLCI8bmctY29udGFpbmVyICpuZ0lmPVwiY291cnNlSUQgZWxzZSBub0RhdGFGb3VuZFwiPlxuICA8bmctdGVtcGxhdGUgI2Vucm9sbEZ1bmN0aW9uYWxpdHk+XG4gICAgPGRpdiBbaGlkZGVuXT1cImlzUmVzb3VyY2UgJiYgIWNvbnRlbnQ/LmFydGlmYWN0VXJsPy5sZW5ndGhcIiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgdGV4dC1jZW50ZXJcIj5cbiAgICAgIDwhLS0gQ291cnNlIGJsb2NrIC0tPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTVxuICAgICAgICAgICAgICAgICAgICAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJlxuICAgICAgICAgICAgICAgICAgICBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKGFjdGlvbkJ0blN0YXR1cyA9PT0gJ2dyYW50JyAmJiAhKGlzTW9iaWxlICYmIGNvbnRlbnQ/LmlzSW5JbnRyYW5ldCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJlxuICAgICAgICAgICAgICAgICAgICAgICFjb250ZW50Py5hcnRpZmFjdFVybD8ubGVuZ3RoKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMKSkgJiZcbiAgICAgICAgICAgICAgICAgICAgICAhKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuUFJPR1JBTSAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcIj5cbiAgICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50ICYmICFmb3JQcmV2aWV3XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IHJlc3VtZURhdGFMaW5rPy51cmwgOiBmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICAgIFtxdWVyeVBhcmFtc109XCIocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCB8fCBjZXJ0RGF0YVwiPlxuICAgICAgICAgICAgICB7eyBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuXG4gICAgICAgICAgPGJ1dHRvbiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIiAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCIgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+e3sgJ2FwcHRvY2hvbWUudGFrZUFzc2Vzc21lbnQnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICA8IS0tIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzUG9zdEFzc2Vzc21lbnQgJiYgKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInUmVzdW1lJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PiAtLT5cblxuICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwIHx8IGNlcnREYXRhKVwiPlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzQWNicENvdXJzZSAmJiBpc0FjYnBDbGFpbSAmJiAhaXNDbGFpbWVkXCI+XG4gICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0FDQlAgQ0xBSU0nXCIgW2RhdGFdPVwia3BhcnJheVwiIFtidG5DYXRlZ29yeV09XCInY2xhaW0nXCJcbiAgICAgICAgICAgICAgICAoY2xpY2tDbGFpbUthcm1hUG9pbnRzKT1cIm9uQ2xpY2tPZkNsYWltKCRldmVudClcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cIiFpc0FjYnBDb3Vyc2UgJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiBtb250aGx5Q2FwRXhjZWVkICYmICFpc0NvbXBsZXRlZFRoaXNNb250aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidTdGFydCBhZ2FpbidcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCI+XG4gICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidUYWtlIEFzc2Vzc21lbnQnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiAoYWN0aW9uQnRuU3RhdHVzID09PSAnZ3JhbnQnICYmICEoaXNNb2JpbGUgJiYgY29udGVudD8uaXNJbkludHJhbmV0KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQ09VUlNFICYmIGNvbnRlbnQ/LmNoaWxkcmVuLmxlbmd0aCA9PT0gMCAmJiAhY29udGVudD8uYXJ0aWZhY3RVcmw/Lmxlbmd0aCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgISggY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DT1VSU0UgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCApICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFICYmICFjb250ZW50Py5hcnRpZmFjdFVybCkpICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0pICYmXG4gICAgICAgICAgICAgICAgICAgICAgIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTClcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSAgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiXG4gICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVFbnJvbGxtZW50KClcIiBbbmdDbGFzc109XCJ7J2Rpc2FibGUtc3RhcnQtYnRuJzogIWNhbkVucm9sbCgpfVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0FjYnBDb3Vyc2VcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8IS0tIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmICFtb250aGx5Q2FwRXhjZWVkICYmIHVzZXJFbnJvbGxtZW50TGlzdCAmJiAhdXNlckVucm9sbG1lbnRMaXN0Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG5cbiAgICAgIDwhLS0gUFJvZ3JhbSAmIG1hbmRhdG9yeSBjb3Vyc2UgYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZTsgZWxzZSBhdXRoVmlld0J0blwiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gfHwgY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5NQU5EQVRPUllfQ09VUlNFX0dPQUxcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdJZj1cIihjb3Vyc2VDYXRlZ29yeT8uTU9ERVJBVEVEX1BST0dSQU0gPT09IGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkpICYmIChjb250ZW50UmVhZERhdGE/LmJhdGNoZXMgJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQpXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiKChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSAhPT0gcHJpbWFyeUNhdGVnb3J5LlJFU09VUkNFKSAgJiYgIWVucm9sbEJ0bkxvYWRpbmcpICYmICFjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7J2FwcHRvY2hvbWUuZW5yb2xsJyB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgPCEtLSA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ291cnNlXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInQUNCUCdcIiBbZGF0YV09XCJrcGFycmF5XCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZCAmJiB1c2VyRW5yb2xsbWVudExpc3QgJiYgIXVzZXJFbnJvbGxtZW50TGlzdC5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidFbnJvbGwnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj4gLS0+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdJZj1cIigoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgIT09IHByaW1hcnlDYXRlZ29yeS5SRVNPVVJDRSkgICYmICFlbnJvbGxCdG5Mb2FkaW5nKSAmJiBjb250ZW50UmVhZERhdGE/LmJhdGNoZXNbMF0uZW5kRGF0ZVwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAtdG9jLWJhbm5lciByb2xlPVwiYmFubmVyXCIgW2Jhbm5lcnNdPVwiYmFubmVyc1wiIFtmb3JQcmV2aWV3XT1cImZvclByZXZpZXdcIiBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgW2FuYWx5dGljc109XCJhbmFseXRpY3NcIlxuICAgICAgICAgICAgICAgICAgKHByb2dyYW1FbnJvbGxDYWxsKT1cInByb2dyYW1FbnJvbGxDYWxsKCRldmVudClcIiBbcmVzdW1lRGF0YV09XCJyZXN1bWVEYXRhXCIgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIlxuICAgICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICA8L3dzLWFwcC10b2MtYmFubmVyPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiKGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSkgJiYgIWNvbnRlbnRSZWFkRGF0YT8uYmF0Y2hlcyAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgTm8gQmF0Y2hlc1xuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiY291cnNlQ2F0ZWdvcnk/Lk1PREVSQVRFRF9QUk9HUkFNICE9PSBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICYmICFlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICpuZ0lmPVwiIShjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ICE9PSBwcmltYXJ5Q2F0ZWdvcnkuTUFOREFUT1JZX0NPVVJTRV9HT0FMXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUueW91QXJlTm90SW52aXRlZCcgfCB0cmFuc2xhdGUgfX0gPC9zcGFuPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmICEhY3VycmVudENvdXJzZUJhdGNoSWQgJiYgZ2V0U3RhcnREYXRlID09PSAnTkEnXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ0lmPVwiIWlzQmF0Y2hJblByb2dyZXNzICYmIGNvdXJzZUNhdGVnb3J5Py5NT0RFUkFURURfUFJPR1JBTSA9PT0gY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQSdcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGQgc2hhZG93LWxnIHRleHQtaW5mby1kaXZcIj57eyAnYXBwdG9jaG9tZS5iYXRjaFdpbGxTdGFydCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICB7e2dldFN0YXJ0RGF0ZX19ITwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJpc0JhdGNoSW5Qcm9ncmVzcyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgKCBhY3Rpb25CdG5TdGF0dXMgPT09ICdncmFudCcgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIShpc01vYmlsZSAmJiBjb250ZW50Py5pc0luSW50cmFuZXQpICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlBST0dSQU0gJiYgY3VycmVudENvdXJzZUJhdGNoSWQpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5Lk1BTkRBVE9SWV9DT1VSU0VfR09BTCAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZClcbiAgICAgICAgICAgICAgICAgICAgICAgIClcIj5cbiAgICAgICAgICAgIDxhICpuZ0lmPVwic2hvd1N0YXJ0LnNob3cgJiYgIWlzUG9zdEFzc2Vzc21lbnRcIlxuICAgICAgICAgICAgICBbcm91dGVyTGlua109XCJyZXN1bWVEYXRhID8gcmVzdW1lRGF0YUxpbms/LnVybCA6IGZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwicmVzdW1lRGF0YSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWVcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygnc3RhcnQnLCAnYXBwdG9jaG9tZScpIH19XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPlxuICAgICAgICAgICAgICAgIHt7IChyZXN1bWVEYXRhKSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gXCJTdGFydCBhZ2FpblwiIDogXCJTdGFydFwiIH19XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPGEgKm5nSWY9XCJpc1Bvc3RBc3Nlc3NtZW50ICYmIHNob3dUYWtlQXNzZXNzbWVudD8ucG9zdF9hc3Nlc3NtZW50XCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWZvclByZXZpZXcgfHwgaXNJbklGcmFtZVwiPnt7ICdhcHB0b2Nob21lLnRha2VBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICA8IS0tIDxkaXYgKm5nSWY9XCIhaXNQb3N0QXNzZXNzbWVudCAmJiAoIWNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwKVwiPlxuICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiaXNBY2JwQ2xhaW1cIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBY2JwQ2xhaW0gJiYgIW1vbnRobHlDYXBFeGNlZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSZXN1bWUnXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cIiFpc1Bvc3RBc3Nlc3NtZW50ICYmIChjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwKVwiPlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiaXNBY2JwQ291cnNlICYmIGlzQWNicENsYWltICYmICFpc0NsYWltZWRcIj5cbiAgICAgICAgICAgICAgICA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidBQ0JQIENMQUlNJ1wiIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZ31cIiBbZGF0YV09XCJrcGFycmF5XCIgW2J0bkNhdGVnb3J5XT1cIidjbGFpbSdcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrQ2xhaW1LYXJtYVBvaW50cyk9XCJvbkNsaWNrT2ZDbGFpbSgkZXZlbnQpXCI+PC93cy1hcHAta2FybWFwb2ludHMtcGFuZWw+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzQWNicENvdXJzZSAmJiAhbW9udGhseUNhcEV4Y2VlZFwiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ1N0YXJ0IGFnYWluJ1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhaXNBY2JwQ291cnNlICYmIG1vbnRobHlDYXBFeGNlZWQgJiYgIWlzQ29tcGxldGVkVGhpc01vbnRoXCI+XG4gICAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInU3RhcnQgYWdhaW4nXCIgW2RhdGFdPVwia3BhcnJheVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cImlzUG9zdEFzc2Vzc21lbnQgJiYgc2hvd1Rha2VBc3Nlc3NtZW50Py5wb3N0X2Fzc2Vzc21lbnRcIj5cbiAgICAgICAgICAgICAgPHdzLWFwcC1rYXJtYXBvaW50cy1wYW5lbCBbYnRudHlwZV09XCInVGFrZSBBc3Nlc3NtZW50J1wiIFtkYXRhXT1cImtwYXJyYXlcIj48L3dzLWFwcC1rYXJtYXBvaW50cy1wYW5lbD5cbiAgICAgICAgICAgIDwvZGl2PiAtLT5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImlzQmF0Y2hJblByb2dyZXNzICYmIChjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkNVUkFURURfUFJPR1JBTSAmJiBiYXRjaERhdGE/LmVucm9sbGVkKSAmJiAhZW5yb2xsQnRuTG9hZGluZ1wiPlxuICAgICAgICA8YSAqbmdJZj1cInNob3dTdGFydC5zaG93ICYmICFpc1Bvc3RBc3Nlc3NtZW50XCIgKGNsaWNrKT1cInJhaXNlVGVsZW1ldHJ5Rm9yUHVibGljKClcIlxuICAgICAgICAgIFtyb3V0ZXJMaW5rXT1cInJlc3VtZURhdGEgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cInJlc3VtZURhdGEgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIlxuICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfHwgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDBcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgIHt7IHJlc3VtZURhdGEgJiYgKGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwICYmIGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlPiAwKSA/XG4gICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWxzKCdyZXN1bWUnLCAnYXBwdG9jaG9tZScpIDpcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+XG4gICAgICAgICAgICB7eyByZXN1bWVEYXRhIHx8IGNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgPyB0cmFuc2xhdGVMYWJlbHMoJ1N0YXJ0IGFnYWluJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3Jlc3VtZScsICdhcHB0b2Nob21lJykgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJlbnJvbGxCdG5Mb2FkaW5nXCI+XG4gICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTAwJSdcIiBbaGVpZ2h0XT1cIiczNnB4J1wiXG4gICAgICAgICAgW2JpbmRpbmdDbGFzc109XCInZmxleCByb3VuZGVkIGgtOCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBDdXJhdGVkIHByb2dyYW0gYmxvY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5DVVJBVEVEX1BST0dSQU0gJiYgIWJhdGNoRGF0YT8uZW5yb2xsZWQgJiYgIWVucm9sbEJ0bkxvYWRpbmdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCJcbiAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlRW5yb2xsbWVudCgpXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIFNUQU5EQUxPTkVfQVNTRVNTTUVOVCBibGFjayAtLT5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiAhYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgKGNsaWNrKT1cImhhbmRsZUVucm9sbG1lbnQoKVwiXG4gICAgICAgICAgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lXCI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLmVucm9sbCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIElOVklURSBPTkxZIFNUQU5EQUxPTkUgQVNTRVNTTUVOVCBibG9jay0tPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuU1RBTkRBTE9ORV9BU1NFU1NNRU5UICYmICFiYXRjaERhdGE/LmVucm9sbGVkICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnRcIj5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCBzaGFkb3ctbGcgdGV4dC1pbmZvLWRpdlwiPnt7ICdhcHB0b2Nob21lLnlvdUFyZU5vdEludml0ZWRGb3JBc3Nlc3NtZW50JyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LlNUQU5EQUxPTkVfQVNTRVNTTUVOVCAmJiBiYXRjaERhdGE/LmVucm9sbGVkICYmIGlzQmF0Y2hJblByb2dyZXNzICYmICFlbnJvbGxCdG5Mb2FkaW5nICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgICAgICA8YSBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIiBbcm91dGVyTGlua109XCJmaXJzdFJlc291cmNlTGluaz8udXJsXCJcbiAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3RBZ2FpbicgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgIH19PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlIDwgMTAwXCI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2E+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCIhaXNCYXRjaEluUHJvZ3Jlc3MgJiYgISFjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgPT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUubm9BY3RpdmVCYXRjaGVzJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cIiFpc0JhdGNoSW5Qcm9ncmVzcyAmJiBjdXJyZW50Q291cnNlQmF0Y2hJZCAmJiBnZXRTdGFydERhdGUgIT09ICdOQScgJiYgY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0ludml0ZS1Pbmx5IEFzc2Vzc21lbnQnXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZm9udC1ib2xkIHNoYWRvdy1sZyB0ZXh0LWluZm8tZGl2XCI+e3sgJ2FwcHRvY2hvbWUuYmF0Y2hXaWxsU3RhcnQnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAge3tnZXRTdGFydERhdGV9fSE8L3NwYW4+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgPCEtLSBTVEFOREFMT05FX0FTU0VTU01FTlQgZW5yb2xsZWQgYmxhY2sgLS0+XG4gICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5TVEFOREFMT05FX0FTU0VTU01FTlQgJiYgYmF0Y2hEYXRhPy5lbnJvbGxlZCAmJiAhZW5yb2xsQnRuTG9hZGluZyAmJiBjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5ICE9PSAnSW52aXRlLU9ubHkgQXNzZXNzbWVudCdcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCIgW3JvdXRlckxpbmtdPVwiZmlyc3RSZXNvdXJjZUxpbms/LnVybFwiXG4gICAgICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0QWdhaW4nIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMFwiPnt7ICdhcHB0b2Nob21lLnRha2VUZXN0JyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8IS0tIEJMRU5ERURfUFJPR1JBTSBibG9jayAtLT5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTVwiPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICEoYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLkFQUFJPVkVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLlJFSkVDVEVEIHx8XG4gICAgICAgICAgICAgICAgICAgICAgYmF0Y2hEYXRhPy53b3JrRmxvdz8ud2ZJdGVtPy5jdXJyZW50U3RhdHVzID09PSBXRkJsZW5kZWRQcm9ncmFtU3RhdHVzLldJVEhEUkFXTiB8fFxuICAgICAgICAgICAgICAgICAgICAgIGJhdGNoRGF0YT8ud29ya0Zsb3c/LndmSXRlbT8uY3VycmVudFN0YXR1cyA9PT0gV0ZCbGVuZGVkUHJvZ3JhbVN0YXR1cy5SRU1PVkVEKVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3cy1tYXQtYWNjZW50LXRleHQgd3MtbWF0LWFjY2VudC1saWdodC1iZyBmbGV4IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNlbnRlciBzdGF0dXNNc2dcIj5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibWFyZ2luLXJlbW92ZS1ib3R0b20gZm9udC1ib2xkXCI+XG4gICAgICAgICAgICAgIHt7ICdhcHB0b2Nob21lLnJlcXVlc3RVbmRlclJldmlldycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgPGEgKm5nSWY9XCJzaG93U3RhcnQuc2hvdyAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53ZkluaXRpYXRlZCAmJiBiYXRjaERhdGE/LndvcmtGbG93Py53Zkl0ZW0/LmN1cnJlbnRTdGF0dXMgPT09IFdGQmxlbmRlZFByb2dyYW1TdGF0dXMuQVBQUk9WRURcIlxuICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiaXNCYXRjaEluUHJvZ3Jlc3M/IChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybCA6ICcnIFwiXG4gICAgICAgICAgICAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoKVwiXG4gICAgICAgICAgICBbcXVlcnlQYXJhbXNdPVwiaXNCYXRjaEluUHJvZ3Jlc3MgPyAocmVzdW1lRGF0YSAmJiAhY2VydERhdGEpID8gZ2VuZXJhdGVRdWVyeSgnUkVTVU1FJykgOiBnZW5lcmF0ZVF1ZXJ5KCdTVEFSVCcpIDogJycgXCJcbiAgICAgICAgICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtuZ0NsYXNzXT1cInsnZGlzYWJsZS1zdGFydC1idG4nOiAhaXNCYXRjaEluUHJvZ3Jlc3N9XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKCFjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA8IDEwMCkgJiYgIWNlcnREYXRhXCI+XG4gICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhZm9yUHJldmlldyB8fCBpc0luSUZyYW1lOyBlbHNlIGF1dGhWaWV3XCI+XG4gICAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSAmJiAoY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgPCAxMDAgJiYgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2U+IDApID9cbiAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVscygncmVzdW1lJywgJ2FwcHRvY2hvbWUnKSA6XG4gICAgICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDAgfHwgY2VydERhdGFcIj5cbiAgICAgICAgICAgICAge3sgcmVzdW1lRGF0YSB8fCBjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA9PT0gMTAwID8gdHJhbnNsYXRlTGFiZWxzKCdTdGFydCBhZ2FpbicsICdhcHB0b2Nob21lJykgOlxuICAgICAgICAgICAgICB0cmFuc2xhdGVMYWJlbHMoJ3N0YXJ0JywgJ2FwcHRvY2hvbWUnKSB9fVxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPC9hPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiYWN0aW9uQnRuU3RhdHVzID09ICdyZWplY3QnICYmIGNvbnRlbnQ/LnJlZ2lzdHJhdGlvblVybFwiPlxuICAgICAgICA8YSBbaHJlZl09XCJjb250ZW50Py5yZWdpc3RyYXRpb25VcmxcIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPnt7XG4gICAgICAgICAgJ2FwcHRvY2hvbWUucmVnaXN0ZXInIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICA8L2Rpdj5cbiAgPC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI3Byb2dyZXNzRnVuY3Rpb25hbGl0eT5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtMVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IHRleHQtc21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTEgdGV4dC14c1wiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLm92ZXJhbGxQcm9ncmVzcycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzXCIgKm5nSWY9XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZSA+IDBcIj4ge3sgY29udGVudD8uY29tcGxldGlvblBlcmNlbnRhZ2UgfX0gJTwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDx3cy13aWRnZXQtY29udGVudC1wcm9ncmVzcyAqbmdJZj1cImNvbnRlbnQ/LmlkZW50aWZpZXJcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCJcbiAgICAgICAgICAgIFtjb250ZW50SWRdPVwiY29udGVudD8uaWRlbnRpZmllclwiIFtwcm9ncmVzc109XCJjb250ZW50Py5jb21wbGV0aW9uUGVyY2VudGFnZVwiIFtwcm9ncmVzc1R5cGVdPVwiJ3BlcmNlbnRhZ2UnXCJcbiAgICAgICAgICAgIFtjdXN0b21DbGFzc05hbWVdPVwiJ2NvbnRlbnQtcHJvZ3Jlc3MnXCI+XG4gICAgICAgICAgPC93cy13aWRnZXQtY29udGVudC1wcm9ncmVzcz5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRDb21wbGV0aW9uUGVyY2VudCA+PSA1MFwiPlxuICAgICAgICA8YnV0dG9uIG1hdC1zdHJva2VkLWJ1dHRvbiBjb2xvcj1cImFjY2VudFwiIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cInJhdGUtYnV0dG9uXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkZlZWRiYWNrRGlhbG9nKGNvbnRlbnQpXCI+XG4gICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwibm9kdHJhbnNsYXRlXCI+c3Rhcl9wdXJwbGU1MDA8L21hdC1pY29uPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5yYXRlTm93JyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ1c2VyUmF0aW5nXCI+XG4gICAgICAgICAgICA8ZGl2Pnt7ICdhcHB0b2NzaW5nbGVwYWdlLmVkaXRSYXRpbmcnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG5cbiAgPGRpdiBjbGFzcz1cInRvYy1iYW5uZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNiBmaXhlZC13aWR0aFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImJhbm5lci1kZXRhaWxzIHRvYy1jb250ZW50XCIgI2Jhbm5lckRldGFpbHM+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGp1c3RpZnktYmV0d2VlbiBnYXAtNFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTMycHgnXCIgW2hlaWdodF09XCInMzJweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTQwcHgnXCIgW2hlaWdodF09XCInMjRweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHRhZy1kaXYgcm91bmRlZC0yeGwgZ2FwLTEgaXRlbXMtY2VudGVyIHAtMlwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwid3MtbWF0LW9yYW5nZS10ZXh0IG5vZHRyYW5zbGF0ZVwiPnZpZGVvX2xpYnJhcnk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWwoY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zIG5vZHRyYW5zbGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWwoY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnksICdzZWFyY2hmaWx0ZXJzJykgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHRhZy1kaXYgcm91bmRlZC0yeGwgZ2FwLTEgaXRlbXMtY2VudGVyIHAtMlwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdpR09UIFNwZWNpYWxpemF0aW9uJylcIj5cbiAgICAgICAgICAgICAgICAgIDxpbWcgY2xhc3M9XCJhcHByb3ZlZC1pY29uXCIgc3JjPVwiLi9hc3NldHMvaWNvbnMvYXBwcm92ZWQuc3ZnXCIgYWx0PVwiYXBwcm92ZWRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGZvbnQtYm9sZCB0ZXh0LXdoaXRlIGxlYWRpbmctMyBub2R0cmFuc2xhdGVcIj57e1xuICAgICAgICAgICAgICAgICAgICAnY2FyZGNvbnRlbnR2Mi5pR09UU3BlY2lhbGl6YXRpb25Qcm9ncmFtJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gS25vd2xlZGdlIGxldmVsIGJsb2NrIGZvciBzZWFyY2ggYm94IC0tPlxuICAgICAgICAgICAgICAgIDwhLS0ge3tjb250ZW50Py5kaWZmaWN1bHR5TGV2ZWx9fSAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWxcIiBjbGFzcz1cImtub3dsZWRnZS1sZXZlbC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWw/LnRvTG93ZXJDYXNlKCkgPT09ICdiZWdpbm5lcidcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImxldmVsLWJhZGdlIGJlZ2lubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJmYWxzZVwiIGNsYXNzPVwibGV2ZWwtYmFkZ2UgYmVnaW5uZXJcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIiNEQkY0RENcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgNUM3LjY3OTI3IDQuNTU1NTUgOC4zMjA3NyA0LjU1NTU2IDguNTc3MzcgNUwxMi4wNDE1IDExQzEyLjI5ODEgMTEuNDQ0NCAxMS45NzczIDEyIDExLjQ2NDEgMTJINC41MzU5MkM0LjAyMjcyIDEyIDMuNzAxOTcgMTEuNDQ0NCAzLjk1ODU3IDExTDcuNDIyNjcgNVpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiM0OUM5NTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAge3tjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uZGlmZmljdWx0eUxldmVsPy50b0xvd2VyQ2FzZSgpID09PSAnaW50ZXJtZWRpYXRlJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGV2ZWwtYmFkZ2UgaW50ZXJtZWRpYXRlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwhLS0gPHNwYW4gKm5nSWY9XCJ0cnVlXCIgY2xhc3M9XCJsZXZlbC1iYWRnZSBpbnRlcm1lZGlhdGVcIj4gLS0+XG4gICAgICAgICAgICAgICAgICAgIDxzdmcgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGZpbGw9XCJub25lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIiNEMURCRUNcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICBkPVwiTTcuNDIyNjcgMi42NjY2NkM3LjY3OTI3IDIuMjIyMjEgOC4zMjA3NyAyLjIyMjIxIDguNTc3MzcgMi42NjY2NkwxMi4wNDE1IDguNjY2NjZDMTIuMjk4MSA5LjExMTEgMTEuOTc3MyA5LjY2NjY2IDExLjQ2NDEgOS42NjY2Nkg0LjUzNTkyQzQuMDIyNzIgOS42NjY2NiAzLjcwMTk3IDkuMTExMSAzLjk1ODU3IDguNjY2NjZMNy40MjI2NyAyLjY2NjY2WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWxsPVwiIzFCNENBMVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NyA1LjY2NjY2QzcuNjc5MjcgNS4yMjIyMSA4LjMyMDc3IDUuMjIyMjEgOC41NzczNyA1LjY2NjY2TDEyLjA0MTUgMTEuNjY2N0MxMi4yOTgxIDEyLjExMTEgMTEuOTc3MyAxMi42NjY3IDExLjQ2NDEgMTIuNjY2N0g0LjUzNTkyQzQuMDIyNzIgMTIuNjY2NyAzLjcwMTk3IDEyLjExMTEgMy45NTg1NyAxMS42NjY3TDcuNDIyNjcgNS42NjY2NlpcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiMxQjRDQTFcIiBzdHJva2U9XCIjRDFEQkVDXCIgc3Ryb2tlLXdpZHRoPVwiMC41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XG4gICAgICAgICAgICAgICAgICAgIHt7Y29udGVudFJlYWREYXRhPy5kaWZmaWN1bHR5TGV2ZWx9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbD8udG9Mb3dlckNhc2UoKSA9PT0gJ2FkdmFuY2VkJ1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwibGV2ZWwtYmFkZ2UgYWR2YW5jZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPCEtLSA8c3BhbiAqbmdJZj1cImZhbHNlXCIgY2xhc3M9XCJsZXZlbC1iYWRnZSBhZHZhbmNlZFwiPiAtLT5cbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIm5vbmVcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZyBjbGlwLXBhdGg9XCJ1cmwoI2NsaXAwKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIiNGRkU2RTFcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHBhdGhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZD1cIk03LjQyMjY0IDIuMzMzMzRDNy42NzkyNCAxLjg4ODkgOC4zMjA3NCAxLjg4ODkgOC41NzczNCAyLjMzMzM0TDEyLjA0MTQgOC4zMzMzNEMxMi4yOTggOC43Nzc3OSAxMS45NzczIDkuMzMzMzQgMTEuNDY0MSA5LjMzMzM0SDQuNTM1ODlDNC4wMjI2OSA5LjMzMzM0IDMuNzAxOTQgOC43Nzc3OSAzLjk1ODU0IDguMzMzMzRMNy40MjI2NCAyLjMzMzM0WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NCA1QzcuNjc5MjQgNC41NTU1NSA4LjMyMDc0IDQuNTU1NTYgOC41NzczNCA1TDEyLjA0MTQgMTFDMTIuMjk4IDExLjQ0NDQgMTEuOTc3MyAxMiAxMS40NjQxIDEySDQuNTM1ODlDNC4wMjI2OSAxMiAzLjcwMTk0IDExLjQ0NDQgMy45NTg1NCAxMUw3LjQyMjY0IDVaXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsbD1cIiNGRjgyNjhcIiBzdHJva2U9XCIjRkZFNkUxXCIgc3Ryb2tlLXdpZHRoPVwiMC41XCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwYXRoXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGQ9XCJNNy40MjI2NCA3LjY2NjY5QzcuNjc5MjQgNy4yMjIyNCA4LjMyMDc0IDcuMjIyMjQgOC41NzczNCA3LjY2NjY5TDEyLjA0MTQgMTMuNjY2N0MxMi4yOTggMTQuMTExMSAxMS45NzczIDE0LjY2NjcgMTEuNDY0MSAxNC42NjY3SDQuNTM1ODlDNC4wMjI2OSAxNC42NjY3IDMuNzAxOTQgMTQuMTExMSAzLjk1ODU0IDEzLjY2NjdMNy40MjI2NCA3LjY2NjY5WlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGw9XCIjRkY4MjY4XCIgc3Ryb2tlPVwiI0ZGRTZFMVwiIHN0cm9rZS13aWR0aD1cIjAuNVwiIC8+XG4gICAgICAgICAgICAgICAgICAgICAgPC9nPlxuICAgICAgICAgICAgICAgICAgICAgIDxkZWZzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGNsaXBQYXRoIGlkPVwiY2xpcDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHJlY3Qgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjE2XCIgZmlsbD1cIndoaXRlXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvY2xpcFBhdGg+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kZWZzPlxuICAgICAgICAgICAgICAgICAgICA8L3N2Zz5cbiAgICAgICAgICAgICAgICAgICAge3tjb250ZW50UmVhZERhdGE/LmRpZmZpY3VsdHlMZXZlbH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNiUGxhbkVuZERhdGVcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBkdWUtdGFnIHRleHQteHMgbGVhZGluZy0zXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydkdWUtd2FybmluZyc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5VUENPTUlORywgJ2R1ZS1vdmVyZHVlJzogY2JQbGFuRHVyYXRpb24gPT09IG5zQ2FyZENvbnRlbnREYXRhLk9WRVJEVUUsICdkdWUtc3VjY2Vzcyc6IGNiUGxhbkR1cmF0aW9uID09PSBuc0NhcmRDb250ZW50RGF0YS5TVUNDRVNTfVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnY29tbW9uLmR1ZUJ5JyB8IHRyYW5zbGF0ZSB9fSAtICZuYnNwOzxzcGFuIGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgY2JQbGFuRW5kRGF0ZSB8IGRhdGU6ICdkXG4gICAgICAgICAgICAgICAgICAgICAgTU1NLHknfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXIgJiYgY29udGVudFJlYWREYXRhPy5jb250ZW50VmVyc2lvbkluZm8/LmlkZW50aWZpZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy12ZXJzaW9uLWNoaXAgcm91bmRlZC0yeGxcIiAoY2xpY2spPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24pPVwibmF2aWdhdGVUb05ld1ZlcnNpb24oKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibmV3LXZlcnNpb24tdGV4dCBub2R0cmFuc2xhdGVcIj57eyAnYXBwdG9jLm5ld1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIHRleHQtd2hpdGUgbW9iLXNoYXJlXCIgKm5nSWY9XCJjYW5TaGFyZVwiPlxuICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIiAoY2xpY2spPVwib25DbGlja09mU2hhcmUoKVwiPnNoYXJlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0yXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic5MCUnXCIgW2hlaWdodF09XCInMzJweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInNzAlJ1wiIFtoZWlnaHRdPVwiJzMycHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkIGJsdWUtMi1sb2FkZXInXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYW5uZXItdGV4dCB0ZXh0LWJhc2Ugc206dGV4dC00eGwgbGVhZGluZy02IHNtOmxlYWRpbmctMTAgZm9udC1ib2xkIG5vZHRyYW5zbGF0ZVwiPnt7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/Lm5hbWUpIH19PC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHNtOnRleHQtYmFzZSBzb3VyY2UtdGV4dCBmb250LXNlbWlib2xkIGJyZWFrLXdvcmRzIG5vZHRyYW5zbGF0ZVwiICNjb250ZW50U291cmNlXG4gICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieydzb3VyY2VFbGxpcHNpcyc6IHNvdXJjZUVsbGlwc2lzfVwiIHRpdGxlPVwie3tjb250ZW50UmVhZERhdGE/LnNvdXJjZX19XCI+e3sgJ2NhcmRjb250ZW50djIuYnknXG4gICAgICAgICAgICAgICAgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudFJlYWREYXRhPy5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzEyMHB4J1wiIFtoZWlnaHRdPVwiJzQwcHgnXCJcbiAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCBibHVlLTItbG9hZGVyJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInODhweCdcIiBbaGVpZ2h0XT1cIicyNHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZ2FwLTQgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IHJhdGluZy1jaGlwIHB5LTIgaXRlbXMtY2VudGVyIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlTmF2aWdhdGVUb1Jldmlld3MoKVwiICpuZ0lmPVwiY29udGVudD8uYXZlcmFnZVJhdGluZ1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIG1hcmdpbi1sZWZ0LXMgaXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5ncmFkZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC13aGl0ZSB0ZXh0LXNtIGxlYWRpbmctNFwiPnt7IGNvbnRlbnQ/LmF2ZXJhZ2VSYXRpbmcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VwYXJhdG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtd2hpdGUgdGV4dC1zbSBsZWFkaW5nLTQgbWFyZ2luLXJpZ2h0LW1cIj57eyBjb250ZW50Py50b3RhbFJhdGluZyB8IHBpcGVDb3VudFRyYW5zZm9ybSB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyXCIgKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1vc3QtZW5yb2xsZWQtY2hpcCB0ZXh0LXhzIGxlYWRpbmctM1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJjb250ZW50Py5hZGRpdGlvbmFsVGFncz8uaW5jbHVkZXMoJ21vc3RUcmVuZGluZycpXCI+e3sgJ2NhcmRjb250ZW50djIubW9zdFRyZW5kaW5nJyB8XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwiY29udGVudD8uYWRkaXRpb25hbFRhZ3M/LmluY2x1ZGVzKCdtb3N0RW5yb2xsZWQnKVwiPnt7ICdjYXJkY29udGVudHYyLm1vc3RFbnJvbGxlZCcgfFxuICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8ucmV0aXJlbWVudERhdGVcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibmV3LXZlcnNpb24tcGlsbCB0ZXh0LXhzIGxlYWRpbmctM1wiICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5zdGF0dXMgIT09ICdSZXRpcmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgJ2FwcHRvYy5wZW5kaW5nUmV0aXJlbWVudCcgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm5ldy12ZXJzaW9uLXJldGlyZS1waWxsIHRleHQteHMgbGVhZGluZy0zXCIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnN0YXR1cyA9PT0gJ1JldGlyZWQnXCI+XG4gICAgICAgICAgICAgICAgICA8c3Bhbj57eyAnYXBwdG9jLnJldGlyZWQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxODBweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQgYmx1ZS0yLWxvYWRlcidcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiBjb250ZW50UmVhZERhdGE/LnNZU19JTlRFUk5BTF9MQVNUX1VQREFURURfT05cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXhzIGxlYWRpbmctNCBzb3VyY2UtdGV4dCBub2R0cmFuc2xhdGVcIj4oe3sgJ2FwcHRvYy5sYXN0VXBkYXRlZE9uJyB8IHRyYW5zbGF0ZSB9fSB7e1xuICAgICAgICAgICAgICBjb250ZW50UmVhZERhdGE/LnNZU19JTlRFUk5BTF9MQVNUX1VQREFURURfT04gfCBkYXRlOiAnTU1NIGQsIHknIH19KTwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMlwiICpuZ0lmPVwibGFuZ3VhZ2VMaXN0Py5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgIDxtYXQtY2hpcC1saXN0IGNsYXNzPVwibGFuZy1jaGlwc1wiPlxuICAgICAgICAgICAgICAgIDwhLS0gU2hvdyB1cCB0byA2IGNoaXBzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhbmcgb2YgbGFuZ3VhZ2VMaXN0IHwgc2xpY2U6MDo1OyBsZXQgaSA9IGluZGV4XCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWNoaXAgY2xhc3M9XCJtYXRjaGlwLWN1c3RvbVwiIHNlbGVjdGFibGU9XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImxhbmc/LmlkZW50aWZpZXIgPT09IHNlbGVjdGVkTGFuZ3VhZ2U/LmlkZW50aWZpZXJcIiAoY2xpY2spPVwib25MYW5ndWFnZVNlbGVjdChsYW5nKVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBsYW5nLm5hbWUgfHwgbGFuZy52YWx1ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9tYXQtY2hpcD5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgIDwhLS0gXCJNb3JlXCIgY2hpcCBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuIDYgbGFuZ3VhZ2VzIC0tPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsYW5ndWFnZUxpc3QubGVuZ3RoID4gNVwiPlxuICAgICAgICAgICAgICAgICAgPG1hdC1jaGlwIFttYXRNZW51VHJpZ2dlckZvcl09XCJtb3JlTGFuZ3VhZ2VzTWVudVwiIHNlbGVjdGFibGU9XCJmYWxzZVwiIGNsYXNzPVwibW9yZS1jaGlwIG1hdGNoaXAtY3VzdG9tXCJcbiAgICAgICAgICAgICAgICAgICAgW3NlbGVjdGVkXT1cImlzU2VsZWN0ZWRJbk1vcmVEcm9wZG93bigpXCI+XG4gICAgICAgICAgICAgICAgICAgIE1vcmUgPG1hdC1pY29uIGNsYXNzPVwibWF0LWljb25cIj5rZXlib2FyZF9hcnJvd19kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDwvbWF0LWNoaXA+XG4gICAgICAgICAgICAgICAgICA8bWF0LW1lbnUgI21vcmVMYW5ndWFnZXNNZW51PVwibWF0TWVudVwiPlxuICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWdyb3VwIGNsYXNzPVwibWF0LXJhZGlvLWdyb3VwIGZsZXggZmxleC1jb2wgZ2FwLTIgcC0zXCIgW3ZhbHVlXT1cInNlbGVjdGVkTGFuZ3VhZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bWF0LXJhZGlvLWJ1dHRvbiAqbmdGb3I9XCJsZXQgbGFuZyBvZiBsYW5ndWFnZUxpc3QgfCBzbGljZTo1XCIgW3ZhbHVlXT1cImxhbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2NoZWNrZWRdPVwibGFuZz8uaWRlbnRpZmllciA9PT0gc2VsZWN0ZWRMYW5ndWFnZT8uaWRlbnRpZmllclwiIChjaGFuZ2UpPVwib25MYW5ndWFnZVNlbGVjdChsYW5nKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAge3sgbGFuZy5kaXNwbGF5TmFtZSB8fCBsYW5nLm5hbWUgfHwgbGFuZyB9fVxuICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LXJhZGlvLWJ1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9tYXQtcmFkaW8tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8L21hdC1tZW51PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICA8L21hdC1jaGlwLWxpc3Q+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgZ2FwLTYgZml4ZWQtd2lkdGhcIj5cbiAgICA8ZGl2IGNsYXNzPVwidG9jLWNvbnRlbnRcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSAmJlxuICAgICAgICBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uYmF0Y2hBdHRyaWJ1dGVzPy5iYXRjaExvY2F0aW9uRGV0YWlscyAmJlxuICAgICAgICBzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uZW5yb2xsbWVudEVuZERhdGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHMgbXQtNlwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNCBwYi0zXCI+XG4gICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJsb2NhdGlvbi1pY29uIG5vZHRyYW5zbGF0ZVwiPlxuICAgICAgICAgICAgICBsb2NhdGlvbl9vblxuICAgICAgICAgICAgPC9tYXQtaWNvbj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2MtZGVzY1wiPlxuICAgICAgICAgICAgICB7e3NlbGVjdGVkQmF0Y2hEYXRhPy5jb250ZW50WzBdPy5iYXRjaEF0dHJpYnV0ZXM/LmJhdGNoTG9jYXRpb25EZXRhaWxzfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBnYXAtNFwiPlxuICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiZXZlbnQtaWNvbiBub2R0cmFuc2xhdGVcIj5cbiAgICAgICAgICAgICAgZXZlbnQ8L21hdC1pY29uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvYy1kZXNjXCI+XG4gICAgICAgICAgICAgIExhc3QgZGF0ZSBvZiBlbnJvbGxtZW50IC0ge3tzZWxlY3RlZEJhdGNoRGF0YT8uY29udGVudFswXT8uZW5yb2xsbWVudEVuZERhdGUgfCBkYXRlOiAnZGQvTU0veXl5eSd9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwicmVjb21tZW5kZWRDb3Vyc2VzSWQgJiYgIWZlZWRiYWNrR2l2ZW5cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInB4LTQgcHktMyBtdC02IHJlbGV2ZW50LXdyYXBwZXJcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBnYXAtNCBpdGVtcy1jZW50ZXIgZmxleC13cmFwIGZsZXgganVzdGlmeS1jZW50ZXIgbWQ6anVzdGlmeS1zdGFydFwiPlxuICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltYWdlcy9zYWtzaGFtQUkvbGFkeS1ncmVldC5zdmdcIiBhbHQ9XCJncmVldFwiIHdpZHRoPVwiNTYuODlcIiBoZWlnaHQ9XCI2NFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlbGV2ZW50LWluZm9cIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmb250LWJvbGRlciB0ZXh0LXNtIHJlbGV2ZW50LWhlYWRpbmcgYmxvY2sgbWItMVwiPnt7ICdob21lLnRvY1JlbGV2ZW50SGVhZGluZycgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZWxldmVudC1zdWJpbmZvIGZvbnQtbm9ybWFsIHRleHQtc20gYmxvY2tcIj57eyAnaG9tZS50b2NSZWxldmVudFN1YkhlYWRpbmcnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX08L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtbWlkZGxlIHJlbGV2YW50LWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSByZWxldmVudC1ub3JtYWwgcmVsZXZlbnQtYnRuIHB5LTIgcHgtNCByZWxldmFudC1ib3hcIlxuICAgICAgICAgICAgICAgIChtb3VzZWVudGVyKT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gdHJ1ZVwiIChtb3VzZWxlYXZlKT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkID0gZmFsc2VcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJoYW5kbGVBY2NlcHRSZWxldmVudCgpXCI+XG4gICAgICAgICAgICAgICAgPGltZyBbc3JjXT1cImlzUmVsZXZlbnRCdG5Ib3ZlcmVkICYmICFpc1JlbGV2ZW50ID8gU0FLU0hBTUFJX0lDT05fTE9BREVSIDogU0FLU0hBTUFJX0lDT05fTk9STUFMXCJcbiAgICAgICAgICAgICAgICAgIGFsdD1cImxvYWRlclwiIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIGNsYXNzPVwibXItMlwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1yZWxldmVudCBmZi1sYXRvIHRleHQtc20gZm9udC1ib2xkXCI+e3sgJ2hvbWUucmVsZXZlbnQnIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LW1pZGRsZSBuby1idXR0b24gbWwtOFwiIChjbGljayk9XCJoYW5kbGVEZWNsaW5lUmVsZXZlbnQoKVwiPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm1hdC1pY29uIHRleHQtbm8gbXItMSBub2R0cmFuc2xhdGVcIj50aHVtYl9kb3duPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbm8gZmYtbGF0byB0ZXh0LXNtIGZvbnQtYm9sZFwiPnt7ICdob21lLm5vJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDxkaXYgY2xhc3M9XCJwYi00IGxnOnB5LTRcIlxuICAgICAgICAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uaWRlbnRpZmllciAmJiBjb250ZW50Py5pZGVudGlmaWVyICYmIGJhc2VDb250ZW50UmVhZERhdGE/LmlkZW50aWZpZXJcIj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtcHJvZ3Jlc3NcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInByb2dyZXNzRnVuY3Rpb25hbGl0eVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgIDx3cy13aWRnZXQtY29udGVudC10b2MgW2NvbnRlbnRdPVwiY29udGVudFwiIFtjb21wb25lbnROYW1lXT1cIid0b2MnXCIgW3BhdGhTZXRdPVwicGF0aFNldFwiXG4gICAgICAgICAgW3RvY1N0cnVjdHVyZV09XCJ0b2NTdHJ1Y3R1cmVcIiBbZm9yUHJldmlld109XCJmb3JQcmV2aWV3XCIgW2lzRW5yb2xsZWRdPVwiYmF0Y2hEYXRhPy5lbnJvbGxlZFwiXG4gICAgICAgICAgW3Jlc3VtZURhdGFdPVwicmVzdW1lRGF0YVwiIFtiYXRjaERhdGFdPVwic2VsZWN0ZWRCYXRjaERhdGFcIiBbc2tlbGV0b25Mb2FkZXJdPVwic2tlbGV0b25Mb2FkZXJcIlxuICAgICAgICAgIFtjaGFuZ2VUYWJdPVwiY2hhbmdlVGFiXCIgW2hpZXJhcmNoeU1hcERhdGFdPVwidG9jU3ZjPy5oYXNobWFwXCIgW3NlbGVjdGVkQmF0Y2hEYXRhXT1cInNlbGVjdGVkQmF0Y2hEYXRhXCJcbiAgICAgICAgICBbY29uZGl0aW9uXT1cIntpc1Bvc3RBc3Nlc3NtZW50OiBpc1Bvc3RBc3Nlc3NtZW50LCBjb250ZW50OiBjb250ZW50LCBpc0FjYnBDb3Vyc2U6IGlzQWNicENvdXJzZSwgaXNDbGFpbWVkOiBpc0NsYWltZWQsIG1vbnRobHlDYXBFeGNlZWQ6IG1vbnRobHlDYXBFeGNlZWQsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgc2hvd1Rha2VBc3Nlc3NtZW50OiBzaG93VGFrZUFzc2Vzc21lbnQsIHVzZXJFbnJvbGxtZW50TGlzdDogdXNlckVucm9sbG1lbnRMaXN0LCByZXN1bWVEYXRhOiByZXN1bWVEYXRhLCB1c2VyUmF0aW5nOiB1c2VyUmF0aW5nLCBlbnJvbGxCdG5Mb2FkaW5nOiBlbnJvbGxCdG5Mb2FkaW5nLCBwcmltYXJ5Q2F0ZWdvcnk6IHByaW1hcnlDYXRlZ29yeSwgY3VycmVudENvdXJzZUJhdGNoSWQ6IGN1cnJlbnRDb3Vyc2VCYXRjaElkLCBpc0FjYnBDbGFpbTogaXNBY2JwQ2xhaW19XCJcbiAgICAgICAgICBba3BhcnJheV09XCJrcGFycmF5XCIgKHBsYXlSZXN1bWVGb3JBSSk9XCJwbGF5UmVzdW1lRm9yQUkoKVwiIChlbnJvbGxVc2VyVG9BSSk9XCJlbnJvbGxVc2VyVG9BSSgpXCJcbiAgICAgICAgICBbY29udGVudFJlYWREYXRhXT1cImNvbnRlbnRSZWFkRGF0YVwiIFtiYXNlQ29udGVudFJlYWREYXRhXT1cImJhc2VDb250ZW50UmVhZERhdGFcIiBbbGFuZ3VhZ2VMaXN0XT1cImxhbmd1YWdlTGlzdFwiXG4gICAgICAgICAgW2xvY2tDZXJ0aWZpY2F0ZV09XCJsb2NrQ2VydGlmaWNhdGVcIiAodHJpZ2VyQ29tcGxldGlvblN1cnZleUZvcm0pPVwib3BlblN1cnZleUZvcm1Qb3B1cCgkZXZlbnQpXCJcbiAgICAgICAgICAocmVzdW1lQ29udGVudCk9XCJyZXN1bWVDb250ZW50RGF0YSgpXCI+PC93cy13aWRnZXQtY29udGVudC10b2M+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb2ItdGlwLWZvci1sZWFybmVyXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImxlYXJuQWR2aXNvcnlEYXRhICYmIGxlYXJuQWR2aXNvcnlEYXRhPy5sZW5ndGhcIj5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkIFtsZWFybkFkdmlzb3J5RGF0YV09XCJsZWFybkFkdmlzb3J5RGF0YVwiPjwvd3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cblxuXG4gICAgPGRpdiBjbGFzcz1cInJpZ2h0LWNvbnRhaW5lclwiPlxuXG4gICAgICA8IS0tIGlmIG5lZWRlZCBzdGlja3kgb2YgcmlnaHQgY29udGFpbmVyIGFkZCB0aGlzIHRvIGJlbG93IGRpdiA9PiAjcmlnaHRDb250YWluZXIgLS0+XG4gICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicmlnaHQtY29udGVudC1pbm5lclwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIiczODRweCdcIiBbaGVpZ2h0XT1cIicyMjRweCdcIlxuICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBpbWFnZS1kaXZcIlxuICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ7XG4gICAgICAgICdiYWNrZ3JvdW5kLWltYWdlJzogJ3VybCgnICsgY29udGVudFJlYWREYXRhPy5wb3N0ZXJJbWFnZSArICcpJywgJ2JhY2tncm91bmQtcmVwZWF0JzogJ25vLXJlcGVhdCcsICdiYWNrZ3JvdW5kLXNpemUnOiAnY292ZXInfVwiXG4gICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnaW1hZ2UtYmFja2Ryb3AnOiBzY3JvbGxlZH1cIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wganVzdGlmeS1iZXR3ZWVuIHRleHQtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGdhcC00IGp1c3RpZnktYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2p1c3RpZnktYmV0d2Vlbic6IHNjcm9sbGVkLCAnanVzdGlmeS1lbmQnOiAhc2Nyb2xsZWR9XCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyB0YWctZGl2IHJvdW5kZWQtMnhsIGdhcC0xIGl0ZW1zLWNlbnRlciBwLTJcIiAqbmdJZj1cInNjcm9sbGVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIndzLW1hdC1vcmFuZ2UtdGV4dCBub2R0cmFuc2xhdGVcIj52aWRlb19saWJyYXJ5PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBmb250LWJvbGQgdGV4dC13aGl0ZSBsZWFkaW5nLTNcIj57e1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlTGFiZWwoY29udGVudFJlYWREYXRhPy5jb3Vyc2VDYXRlZ29yeSwgJ3NlYXJjaGZpbHRlcnMnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFjb250ZW50UmVhZERhdGE/LmNvdXJzZUNhdGVnb3J5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteHMgZm9udC1ib2xkIHRleHQtd2hpdGUgbGVhZGluZy0zXCI+e3tcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZUxhYmVsKGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5LCAnc2VhcmNoZmlsdGVycycpIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IChjbGljayk9XCJvbkNsaWNrT2ZTaGFyZSgpXCIgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBqdXN0aWZ5LWVuZCBnYXAtMiBzaGFyZS10YWdcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cImNhblNoYXJlICYmICFmb3JQcmV2aWV3XCI+XG4gICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cIm5vZHRyYW5zbGF0ZVwiPnNoYXJlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdj57eyAnYXBwdG9jc2luZ2xlcGFnZS5zaGFyZScgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xXCIgKm5nSWY9XCJzY3JvbGxlZFwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQteGwgbGVhZGluZy02IHRleHQtd2hpdGUgZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjb250ZW50UmVhZERhdGE/Lm5hbWUpIH19XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHNvdXJjZS10ZXh0IGZvbnQtc2VtaWJvbGQgYnJlYWstd29yZHNcIiAjY29udGVudFNvdXJjZVxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3NvdXJjZUVsbGlwc2lzJzogc291cmNlRWxsaXBzaXN9XCIgdGl0bGU9XCJ7e2NvbnRlbnRSZWFkRGF0YT8uc291cmNlfX1cIj57e1xuICAgICAgICAgICAgICAgICAgICAnY2FyZGNvbnRlbnR2Mi5ieScgfCB0cmFuc2xhdGUgfX0ge3sgY29udGVudFJlYWREYXRhPy5zb3VyY2UgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTQgcC01IGJvcmRlci1ib3R0b21cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xICBjdXJzb3ItcG9pbnRlciBzd2l0Y2gtdmVyc2lvblwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIGNvbnRlbnRSZWFkRGF0YT8uY29udGVudFZlcnNpb25JbmZvPy5pZGVudGlmaWVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm5hdmlnYXRlVG9OZXdWZXJzaW9uKClcIiAoa2V5ZG93bik9XCJuYXZpZ2F0ZVRvTmV3VmVyc2lvbigpXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLXN3aXRjaFwiPnt7ICdhcHB0b2Muc3dpdGNoVG9OZXdWZXJzaW9uJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtNFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0zIGp1c3RpZnktYXJvdW5kXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJhc2UgZm9udC1ib2xkXCI+e3sgc2VsZWN0ZWRCYXRjaERhdGE/LmNvbnRlbnRbMF0/LmJhdGNoQXR0cmlidXRlcz8uY3VycmVudEJhdGNoU2l6ZVxuICAgICAgICAgICAgICAgICAgICB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MuYmF0Y2hTaXplJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LnRvdGFsQXBwbGllZCB8fCAnMCcgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1sYWJlbFwiPnt7ICdhcHB0b2MudG90YWxBcHBsaWVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJiYXRjaC1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1iYXNlIGZvbnQtYm9sZFwiPnt7IHNlbGVjdGVkQmF0Y2hEYXRhPy51c2VyQ291bnQ/LmVucm9sbGVkIHx8ICcwJyB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhdGNoLWxhYmVsXCI+e3sgJ2FwcHRvYy50b3RhbEVucm9sbGVkJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiYgIXByZUFzc2Vzc21lbnRDb21wbGV0aW9uU3RhdHVzXCI+XG4gICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJmbGV4IGFjdGlvbi1idXR0b24gZW5yb2xsLWJ0biBqdXN0aWZ5LWNlbnRlciByZXN1bWVcIlxuICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoXCIgKGNsaWNrKT1cInJvdXRlVG9QcmVBc3Nlc3NlbnQoKVwiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ2FwcHRvY2hvbWUucHJlRW5yb2xsJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY29udGVudFJlYWREYXRhPy5wcmltYXJ5Q2F0ZWdvcnkgPT09IHByaW1hcnlDYXRlZ29yeS5CTEVOREVEX1BST0dSQU0gJiYgcHJlQXNzZXNzbWVudENvbXBsZXRpb25TdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImZsZXggcHJlZW5yb2xsZG9uZS1idG4ganVzdGlmeS1jZW50ZXIgcmVzdW1lXCI+XG4gICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5wcmVFbnJvbGxEb25lJyB8IHRyYW5zbGF0ZSB9fTxpbWcgc3JjPVwiL2Fzc2V0cy9pY29ucy9BY2NlcHRfaWNvbi5wbmdcIiBhbHQ9XCJ0aWNrXCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRpY2staWNvblwiPlxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwidGltZXIgJiYgdGltZXIuZGF5cyA+PSAwICYmIGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTYgYmF0Y2gtdGltZXJcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVyLWxhYmVsXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYmF0Y2hTdGFydHNJbicgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCB1bmRlcmxpbmVcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5kYXlzIHx8IDAgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmRheXMnIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY291bnRlci1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDpcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC0xIGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LTR4bCBsZWFkaW5nLTEwIGNvdW50ZXJcIj57eyB0aW1lci5taW4gPT09IDYwID8gdGltZXIuaG91cnMgKyAxIDogdGltZXIuaG91cnMgfX1cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY291bnRlci1sYWJlbFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLmhvdXJzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggaXRlbXMtY2VudGVyIGNvdW50ZXItbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICA6XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtMSBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC00eGwgbGVhZGluZy0xMCBjb3VudGVyXCI+e3sgdGltZXIubWluID09PSA2MCA/IDAwIDogdGltZXIubWluIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvdW50ZXItbGFiZWxcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5taW51dGVzJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIW1vYmlsZTEyMDAgJiYgKFxuICAgICAgICAgIWNvbnRlbnRSZWFkRGF0YT8ucHJlRW5yb2xtZW50UmVzb3VyY2VzPy5sZW5ndGggfHxcbiAgICAgICAgIChjb250ZW50UmVhZERhdGE/LnByZUVucm9sbWVudFJlc291cmNlcz8ubGVuZ3RoICYmIChwcmVBc3Nlc3NtZW50Q29tcGxldGlvblN0YXR1cyB8fCAgIXByZUFzc2Vzc21lbnRSZXF1aXJlZEZsYWcpKVxuICAgICAgIClcIj5cblxuICAgICAgICAgICAgICAgICAgPHdzLWFwcC10b2MtYmFubmVyIHJvbGU9XCJiYW5uZXJcIiBbYmFubmVyc109XCJiYW5uZXJzXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgICAgICAgICAgICBbdXNlckVucm9sbG1lbnRMaXN0XT1cInVzZXJFbnJvbGxtZW50TGlzdFwiICh3aXRoZHJhd09yRW5yb2xsKT1cIndpdGhkcmF3T3JFbnJvbGwoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIFthbmFseXRpY3NdPVwiYW5hbHl0aWNzXCIgW3Jlc3VtZURhdGFdPVwicmVzdW1lRGF0YVwiIFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCJcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIj5cbiAgICAgICAgICAgICAgICAgIDwvd3MtYXBwLXRvYy1iYW5uZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMzM2cHgnXCIgW2hlaWdodF09XCInNDBweCdcIlxuICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzMzNnB4J1wiIFtoZWlnaHRdPVwiJzY4cHgnXCJcbiAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0yIGluZm8tZGl2XCIgKm5nSWY9XCJjb250ZW50Py5pc0luSW50cmFuZXQgJiYgc2hvd0ludHJhbmV0TXNnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgJ2FwcHRvY2hvbWUudmlld2VkSW5JbnRyYW5ldCcgfCB0cmFuc2xhdGUgfX08L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBpdGVtcy1jZW50ZXIgZ2FwLTIgaW5mby1kaXZcIiAqbmdJZj1cInNob3dJbnN0cnVjdG9yTGVkTXNnXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgJ2FwcHRvY2hvbWUubm90QXZhaWxhYmxlT25saW5lJyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGl0ZW1zLWNlbnRlciBnYXAtMiBpbmZvLWRpdlwiICpuZ0lmPVwic2hvd1N0YXJ0Lm1zZyA9PT0gJ3lvdXR1YmVGb3JiaWRkZW4nXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJub2R0cmFuc2xhdGVcIj5pbmZvPC9tYXQtaWNvbj4mbmJzcDtcbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXI+e3sgJ2FwcHRvY2hvbWUueW91dHViZUNvbnRlbnRCbG9ja2VkJyB8IHRyYW5zbGF0ZSB9fTwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJzaG93QnRuXCI+XG4gICAgICAgICAgICAgICAgICA8YSBocmVmPVwie3sgY3NjbXNVcmwgfX1cIiB0YXJnZXQ9XCJfYmxhbmtcIiBjbGFzcz1cImZsZXggYWN0aW9uLWJ1dHRvbiBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eyAnYXBwdG9jaG9tZS5hcHBseUZvclBoeXNpY2FsVHJhaW5pbmcnIHwgdHJhbnNsYXRlIH19PC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBPdmVyYWxsIHByb2dyZXNzIGZ1bmN0aW9uYWxpdHkgLS0+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNvbXBsZXRpb25TdGF0dXMgPD0gMiAmJiBpc0JhdGNoSW5Qcm9ncmVzc1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJwcm9ncmVzc0Z1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8IS0tIE92ZXJhbGwgcHJvZ3Jlc3MgZnVuY3Rpb25hbGl0eSAtLT5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgIXVzZXJSYXRpbmdcIj4gLS0+XG4gICAgICAgICAgICAgICAgPCEtLSA8d3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsIFtidG50eXBlXT1cIidSYXRlIHRoaXMgY291cnNlJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPiAtLT5cbiAgICAgICAgICAgICAgICA8IS0tIDwvZGl2PiAtLT5cblxuICAgICAgICAgICAgICAgIDwhLS0gPGRpdiAqbmdJZj1cInJlc3VtZURhdGEgJiYgdXNlclJhdGluZ1wiPlxuICAgICAgICAgICAgICAgIDx3cy1hcHAta2FybWFwb2ludHMtcGFuZWwgW2J0bnR5cGVdPVwiJ0VkaXQgcmF0aW5nJ1wiIFtkYXRhXT1cImtwYXJyYXlcIlxuICAgICAgICAgICAgICAgICAgW3BDYXRlZ29yeV09XCJjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeVwiPjwvd3MtYXBwLWthcm1hcG9pbnRzLXBhbmVsPlxuICAgICAgICAgICAgICA8L2Rpdj4gLS0+XG5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImFjdGlvbkJ0blN0YXR1cyAhPT0gJ3dhaXQnICYmIGNvbnRlbnRSZWFkRGF0YT8uc3RhdHVzICE9PSAnRGVsZXRlZCcgJiYgY29udGVudFJlYWREYXRhPy5zdGF0dXMgIT09ICdFeHBpcmVkJ1wiPlxuICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJlbnJvbGxGdW5jdGlvbmFsaXR5XCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJrYXJtYS1wb2ludHMtZGl2XCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1rYXJtYS1wb2ludHMgW2RhdGFdPVwia3BhcnJheVwiIChjbGlja0NsYWltS2FybWFQb2ludHMpPVwib25DbGlja09mQ2xhaW0oJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICBbY29udGVudF09XCJjb250ZW50XCJcbiAgICAgICAgICAgICAgICAgIFtjb25kaXRpb25dPVwie2lzUG9zdEFzc2Vzc21lbnQ6IGlzUG9zdEFzc2Vzc21lbnQsIGNvbnRlbnQ6IGNvbnRlbnQsIGlzQWNicENvdXJzZTogaXNBY2JwQ291cnNlLCBpc0NsYWltZWQ6IGlzQ2xhaW1lZCwgbW9udGhseUNhcEV4Y2VlZDogbW9udGhseUNhcEV4Y2VlZCwgaXNDb21wbGV0ZWRUaGlzTW9udGg6IGlzQ29tcGxldGVkVGhpc01vbnRoLCBzaG93VGFrZUFzc2Vzc21lbnQ6IHNob3dUYWtlQXNzZXNzbWVudCwgdXNlckVucm9sbG1lbnRMaXN0OiB1c2VyRW5yb2xsbWVudExpc3QsIGlzQ29tcGxldGVkVGhpc01vbnRoOiBpc0NvbXBsZXRlZFRoaXNNb250aCwgcmVzdW1lRGF0YTogcmVzdW1lRGF0YSwgdXNlclJhdGluZzogdXNlclJhdGluZywgZW5yb2xsQnRuTG9hZGluZzogZW5yb2xsQnRuTG9hZGluZywgcHJpbWFyeUNhdGVnb3J5OiBwcmltYXJ5Q2F0ZWdvcnksIGN1cnJlbnRDb3Vyc2VCYXRjaElkOiBjdXJyZW50Q291cnNlQmF0Y2hJZCwgaXNBY2JwQ2xhaW06IGlzQWNicENsYWltfVwiPjwvd3Mtd2lkZ2V0LWthcm1hLXBvaW50cz5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtd3JhcCBnYXAtNlwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQ4cHgnXCIgW2hlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGl0ZW1zLWNlbnRlciBnYXAtMiBrcGktbG9hZGVyLWRpdlwiPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicyOHB4J1wiIFtoZWlnaHRdPVwiJzI4cHgnXCJcbiAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzQwcHgnXCIgW2hlaWdodF09XCInOHB4J1wiXG4gICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic0OHB4J1wiIFtoZWlnaHRdPVwiJzhweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkJ1wiPjwvd3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlcj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxuICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXRvYy1rcGktdmFsdWVzIFtjb250ZW50XT1cImNvbnRlbnRcIiBbdG9jU3RydWN0dXJlXT1cInRvY1N0cnVjdHVyZVwiXG4gICAgICAgICAgICAgICAgW3Nob3dJbnN0cnVjdG9yTGVkTXNnXT1cInNob3dJbnN0cnVjdG9yTGVkTXNnXCIgW2NvbnRlbnRSZWFkRGF0YV09XCJjb250ZW50UmVhZERhdGFcIlxuICAgICAgICAgICAgICAgIFtsYW5ndWFnZUxpc3RdPVwibGFuZ3VhZ2VMaXN0XCI+PC93cy13aWRnZXQtdG9jLWtwaS12YWx1ZXM+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC04IHAtNVwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNrZWxldG9uTG9hZGVyXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC00XCIgKm5nRm9yPVwibGV0IGkgb2YgWzEsIDJdXCI+XG4gICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIic3MnB4J1wiIFtoZWlnaHRdPVwiJzIwcHgnXCJcbiAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1yb3cgaXRlbXMtY2VudGVyIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICA8d3Mtd2lkZ2V0LXNrZWxldG9uLWxvYWRlciBbd2lkdGhdPVwiJzM2cHgnXCIgW2hlaWdodF09XCInMzZweCdcIlxuICAgICAgICAgICAgICAgICAgICBbYmluZGluZ0NsYXNzXT1cIidyb3VuZGVkLWZ1bGwnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1za2VsZXRvbi1sb2FkZXIgW3dpZHRoXT1cIicxMjRweCdcIiBbaGVpZ2h0XT1cIicyMHB4J1wiXG4gICAgICAgICAgICAgICAgICAgICAgW2JpbmRpbmdDbGFzc109XCIncm91bmRlZCdcIj48L3dzLXdpZGdldC1za2VsZXRvbi1sb2FkZXI+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyIFt3aWR0aF09XCInMTI0cHgnXCIgW2hlaWdodF09XCInMTJweCdcIlxuICAgICAgICAgICAgICAgICAgICAgIFtiaW5kaW5nQ2xhc3NdPVwiJ3JvdW5kZWQnXCI+PC93cy13aWRnZXQtc2tlbGV0b24tbG9hZGVyPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggZmxleC1jb2wgZ2FwLTNcIiAqbmdJZj1cImhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudFJlYWREYXRhPy5jcmVhdG9yRGV0YWlscyk/Lmxlbmd0aFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWJhc2UgZm9udC1ib2xkXCI+e3sgJ2FwcHRvY3NpbmdsZXBhZ2UuYXV0aG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGF1dGhvciBvZiBoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckRldGFpbHMpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGhvdG9VcmxdPVwiYXV0aG9yPy5waG90byB8fCAnJ1wiIFtuYW1lXT1cImF1dGhvcj8ubmFtZVwiPlxuICAgICAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hdmF0YXItcGhvdG8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0xIGp1c3RpZnktY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb250LWJvbGRcIj57eyBoYW5kbGVDYXBpdGFsaXplKGF1dGhvcj8ubmFtZSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTNcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5hdXRob3InIHwgdHJhbnNsYXRlIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtY29sIGdhcC0zXCIgKm5nSWY9XCJoYW5kbGVQYXJzZUpzb25EYXRhKGNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckNvbnRhY3RzKT8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtYmFzZSBmb250LWJvbGRcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jcmVhdG9ycycgfCB0cmFuc2xhdGUgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LXJvdyBnYXAtNCBpdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNyZWVhdG9yIG9mIGhhbmRsZVBhcnNlSnNvbkRhdGEoY29udGVudFJlYWREYXRhPy5jcmVhdG9yQ29udGFjdHMpXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIganVzdGlmeS1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPHdzLXdpZGdldC1hdmF0YXItcGhvdG8gW3JhbmRvbUNvbG9yXT1cInRydWVcIiBbZGF0YWxlbl09XCIxXCIgW3NpemVdPVwiJ3JvdW5kLW0nXCJcbiAgICAgICAgICAgICAgICAgICAgICBbcGhvdG9VcmxdPVwiY3JlZWF0b3I/LnBob3RvIHx8ICcnXCIgW25hbWVdPVwiY3JlZWF0b3I/Lm5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPC93cy13aWRnZXQtYXZhdGFyLXBob3RvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtMSBqdXN0aWZ5LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9udC1ib2xkXCI+e3sgaGFuZGxlQ2FwaXRhbGl6ZShjcmVlYXRvcj8ubmFtZSwgJ25hbWUnKSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC14cyBsZWFkaW5nLTNcIj57eyAnYXBwdG9jc2luZ2xlcGFnZS5jcmVhdG9yJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleCBmbGV4LWNvbCBnYXAtM1wiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJjb250ZW50UmVhZERhdGE/LnNvdXJjZSAgJiYgKGNvbnRlbnRDcmVhdG9yRGF0YSAmJiBjb250ZW50Q3JlYXRvckRhdGE/Lmxlbmd0aClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1iYXNlIGZvbnQtYm9sZFwiPnt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGZsZXgtcm93IGdhcC00IGl0ZW1zLWNlbnRlclwiICpuZ0Zvcj1cImxldCBjcmVhdG9yIG9mIGNvbnRlbnRDcmVhdG9yRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXggcHJvdmlkZXItbG9nby1kaXZcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckxvZ29cIiBbc3JjXT1cImNvbnRlbnRSZWFkRGF0YT8uY3JlYXRvckxvZ29cIlxuICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgKm5nSWY9XCIhY29udGVudFJlYWREYXRhPy5jcmVhdG9yTG9nb1wiIGNsYXNzPVwibWF0LWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgIHNyYz1cIi9hc3NldHMvaW5zdGFuY2VzL2VhZ2xlL2FwcF9sb2dvcy9LYXJtYXlvZ2lCaGFyYXRfTG9nby5zdmdcIlxuICAgICAgICAgICAgICAgICAgICAgIGFsdD1cInt7ICdhcHB0b2NzaW5nbGVwYWdlLnByb3ZpZGVyJyB8IHRyYW5zbGF0ZSB9fVwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXNtIHdvcmQtYnJlYWsgY3Vyc29yLXBvaW50ZXJcIiAqbmdJZj1cImNvbnRlbnRSZWFkRGF0YT8uY3JlYXRlZEZvcj8ubGVuZ3RoXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJhaXNlVGVsZW1ldGVyeUZvclByb3ZpZGVyKGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCBjb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0pXCJcbiAgICAgICAgICAgICAgICAgICAgW3JvdXRlckxpbmtdPVwiWycvYXBwL2xlYXJuL2Jyb3dzZS1ieS9wcm92aWRlcicsIGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCBjb250ZW50UmVhZERhdGE/LmNyZWF0ZWRGb3JbMF0sICdtaWNyby1zaXRlcyddXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGhhbmRsZUNhcGl0YWxpemUoY29udGVudFJlYWREYXRhPy5zb3VyY2UsICdzb3VyY2UnKSB9fVxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1zbSB3b3JkLWJyZWFrXCIgKm5nSWY9XCIhY29udGVudFJlYWREYXRhPy5jcmVhdGVkRm9yPy5sZW5ndGhcIj57e1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVDYXBpdGFsaXplKGNvbnRlbnRSZWFkRGF0YT8uc291cmNlLCAnc291cmNlJykgfX1cbiAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2ICpuZ0lmPVwibGVhcm5BZHZpc29yeURhdGEgJiYgbGVhcm5BZHZpc29yeURhdGE/Lmxlbmd0aFwiPlxuICAgICAgICAgIDx3cy13aWRnZXQtdGlwcy1mb3ItbGVhcm5lci1jYXJkIFtsZWFybkFkdmlzb3J5RGF0YV09XCJsZWFybkFkdmlzb3J5RGF0YVwiPjwvd3Mtd2lkZ2V0LXRpcHMtZm9yLWxlYXJuZXItY2FyZD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cblxuXG5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2JpbGUtZW5yb2xsLWRpdlwiXG4gICAgW25nQ2xhc3NdPVwieydiZy13aGl0ZSc6IGNvbnRlbnRSZWFkRGF0YT8ucHJpbWFyeUNhdGVnb3J5ID09PSBwcmltYXJ5Q2F0ZWdvcnkuQkxFTkRFRF9QUk9HUkFNIH1cIj5cbiAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudCAmJiBjb250ZW50UmVhZERhdGE/LnByaW1hcnlDYXRlZ29yeSA9PT0gcHJpbWFyeUNhdGVnb3J5LkJMRU5ERURfUFJPR1JBTSBcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0yXCIgKm5nSWY9XCJtb2JpbGUxMjAwICYmICFmb3JQcmV2aWV3IHx8IGlzSW5JRnJhbWU7IGVsc2UgYXV0aFZpZXdCdG5cIj5cbiAgICAgICAgPHdzLWFwcC10b2MtYmFubmVyIHJvbGU9XCJiYW5uZXJcIiBbYmFubmVyc109XCJiYW5uZXJzXCIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtjb250ZW50XT1cImNvbnRlbnRcIlxuICAgICAgICAgIFt1c2VyRW5yb2xsbWVudExpc3RdPVwidXNlckVucm9sbG1lbnRMaXN0XCIgKHdpdGhkcmF3T3JFbnJvbGwpPVwid2l0aGRyYXdPckVucm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICBbYW5hbHl0aWNzXT1cImFuYWx5dGljc1wiIFtyZXN1bWVEYXRhXT1cInJlc3VtZURhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiIFtjb250ZW50UmVhZERhdGFdPVwiY29udGVudFJlYWREYXRhXCI+XG4gICAgICAgIDwvd3MtYXBwLXRvYy1iYW5uZXI+XG4gICAgICA8L2Rpdj5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImVucm9sbEZ1bmN0aW9uYWxpdHlcIj48L25nLWNvbnRhaW5lcj5cbiAgPC9kaXY+XG5cbiAgPHdzLWFwcC1zaGFyZS10b2MgKm5nSWY9XCJlbmFibGVTaGFyZVwiIFtyb290T3JnSWRdPVwicm9vdE9yZ0lkXCIgW2NvbnRlbnRdPVwiY29udGVudFwiXG4gICAgKHJlc2V0RW5hYmxlU2hhcmUpPVwicmVzZXRFbmFibGVTaGFyZSgkZXZlbnQpXCIgW2Jhc2VDb250ZW50UmVhZERhdGFdPVwiYmFzZUNvbnRlbnRSZWFkRGF0YVwiPjwvd3MtYXBwLXNoYXJlLXRvYz5cbjwvbmctY29udGFpbmVyPlxuPG5nLXRlbXBsYXRlICNub0RhdGFGb3VuZD5cbiAgPGRpdlxuICAgIGNsYXNzPVwiZXJyb3Itbm90LWZvdW5kIGZsZXggZmxleC13cmFwcGVkIG1hcmdpbi1sZWZ0LW0gbWFyZ2luLXRvcC14bCBtYXJnaW4tcmlnaHQtbSBmbGV4LWNvbCBqdXN0aWZ5LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXIgdGV4dC1jZW50ZXJcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZXJyb3ItbG9nb1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImVycm9yLW1lc3NhZ2Ugd3MtbWF0LXByaW1hcnktdGV4dCBmb250LXdlaWdodC1ib2xkXCI+XG4gICAgICAgIFRoZSBwYWdlIHlvdSByZXF1ZXN0ZWQgY2Fubm90IGJlIGZvdW5kXG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJlcnJvci1zdXBwb3J0XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwic3VwcG9ydC1tZXNzYWdlXCIgPldlIGhhdmUgdXBkYXRlZCBvdXIgd2ViIHNpdGUgYW5kIG1hbnkgVVJMcyBoYXZlIGNoYW5nZWQuPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwic3VwcG9ydC1tZXNzYWdlXCIgPllvdSBtaWdodCB3YW50IHRvOjwvZGl2PlxuICAgIDwvZGl2PiAtLT5cbiAgPC9kaXY+XG5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjYXV0aFZpZXc+e3snYXBwdG9jaG9tZS52aWV3JyB8IHRyYW5zbGF0ZX19PC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNhdXRoVmlld0J0biBpMThuPlxuICA8YSAoY2xpY2spPVwicmFpc2VUZWxlbWV0cnlGb3JQdWJsaWMoJGV2ZW50KVwiXG4gICAgW3JvdXRlckxpbmtdPVwic2hvdWxkU2hvd1N1cnZleVBvcHVwKCkgPyBudWxsIDogKChyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyByZXN1bWVEYXRhTGluaz8udXJsIDogZmlyc3RSZXNvdXJjZUxpbms/LnVybClcIlxuICAgIFtxdWVyeVBhcmFtc109XCJzaG91bGRTaG93U3VydmV5UG9wdXAoKSA/IG51bGwgOiAoKHJlc3VtZURhdGEgJiYgIWNlcnREYXRhKSA/IGdlbmVyYXRlUXVlcnkoJ1JFU1VNRScpIDogZ2VuZXJhdGVRdWVyeSgnU1RBUlQnKSlcIlxuICAgIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyXCI+XG4gICAge3snYXBwdG9jaG9tZS52aWV3JyB8IHRyYW5zbGF0ZX19XG4gIDwvYT5cbjwvbmctdGVtcGxhdGU+XG48bmctdGVtcGxhdGUgI2F1dGhWaWV3Rm9ySW52aXRlT25seUFzc2Vzc21lbnQ+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJmb3JQcmV2aWV3ICYmIGNvbnRlbnRSZWFkRGF0YT8uY291cnNlQ2F0ZWdvcnkgPT09ICdJbnZpdGUtT25seSBBc3Nlc3NtZW50J1wiPlxuICAgIDxhIGNsYXNzPVwiZmxleCBhY3Rpb24tYnV0dG9uIGp1c3RpZnktY2VudGVyIHJlc3VtZVwiIFtyb3V0ZXJMaW5rXT1cImZpcnN0UmVzb3VyY2VMaW5rPy51cmxcIlxuICAgICAgW3F1ZXJ5UGFyYW1zXT1cIihyZXN1bWVEYXRhICYmICFjZXJ0RGF0YSkgPyBnZW5lcmF0ZVF1ZXJ5KCdSRVNVTUUnKSA6IGdlbmVyYXRlUXVlcnkoJ1NUQVJUJylcIj5cbiAgICAgIDxuZy1jb250YWluZXI+e3sgJ2FwcHRvY2hvbWUudGFrZVRlc3QnIHwgdHJhbnNsYXRlIH19PC9uZy1jb250YWluZXI+XG4gICAgPC9hPlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+Il19
|