@sunbird-cb/toc 0.0.6 → 0.0.8

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.
Files changed (23) hide show
  1. package/esm2022/lib/_collection/_common/content-toc/app-toc-about/app-toc-about.component.mjs +3 -3
  2. package/esm2022/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.mjs +5 -3
  3. package/esm2022/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.mjs +159 -80
  4. package/esm2022/lib/components/app-toc-home-v2/app-toc-home-v2.component.mjs +57 -4
  5. package/esm2022/lib/services/app-toc-v2.service.mjs +21 -2
  6. package/esm2022/lib/services/app-toc.service.mjs +96 -7
  7. package/esm2022/lib/services/viewer-util.service.mjs +92 -2
  8. package/esm2022/public-api.mjs +2 -1
  9. package/fesm2022/sunbird-cb-toc.mjs +507 -174
  10. package/fesm2022/sunbird-cb-toc.mjs.map +1 -1
  11. package/lib/_collection/_common/content-toc/app-toc-content/app-toc-content.component.d.ts.map +1 -1
  12. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts +21 -10
  13. package/lib/_collection/_common/content-toc/app-toc-content-card-v2/app-toc-content-card-v2.component.d.ts.map +1 -1
  14. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts +8 -0
  15. package/lib/components/app-toc-home-v2/app-toc-home-v2.component.d.ts.map +1 -1
  16. package/lib/services/app-toc-v2.service.d.ts.map +1 -1
  17. package/lib/services/app-toc.service.d.ts +9 -1
  18. package/lib/services/app-toc.service.d.ts.map +1 -1
  19. package/lib/services/viewer-util.service.d.ts +14 -0
  20. package/lib/services/viewer-util.service.d.ts.map +1 -1
  21. package/package.json +1 -1
  22. package/public-api.d.ts +1 -0
  23. package/public-api.d.ts.map +1 -1
@@ -44,6 +44,8 @@ export class AppTocContentComponent {
44
44
  // console.log('qParamsMap--', qParamsMap)
45
45
  // console.log('this.content--', this.content)
46
46
  // console.log('this.hierarchyMapData', this.hierarchyMapData)
47
+ // Parse preEnrolmentResources if it exists as a string
48
+ // Note: This is separate from preliminary assessment which is in children array with isPreAssessment flag
47
49
  if (this.content && this.content?.preEnrolmentResources && typeof this.content?.preEnrolmentResources === 'string') {
48
50
  this.content['preEnrolmentResources'] = JSON.parse(this.content?.preEnrolmentResources);
49
51
  }
@@ -186,11 +188,11 @@ export class AppTocContentComponent {
186
188
  }
187
189
  }
188
190
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentComponent, deps: [{ token: i1.ActivatedRoute }, { token: i2.AppTocService }, { token: i3.ConfigurationsService }], target: i0.ɵɵFactoryTarget.Component }); }
189
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: { batchId: "batchId", content: "content", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", config: "config", hierarchyMapData: "hierarchyMapData", pathSet: "pathSet", componentName: "componentName", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", contentReadData: "contentReadData" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "component", type: i6.AppTocSessionsNewComponent, selector: "ws-widget-app-app-toc-sessions-new", inputs: ["batchData", "content", "forPreview", "config", "batchId", "rootId", "rootContentType", "pathSet"] }, { kind: "component", type: i7.AppTocContentCardV2SkeletonComponent, selector: "ws-widget-app-toc-content-card-v2-skeleton" }] }); }
191
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: AppTocContentComponent, selector: "ws-widget-app-toc-content", inputs: { batchId: "batchId", content: "content", forPreview: "forPreview", resumeData: "resumeData", batchData: "batchData", skeletonLoader: "skeletonLoader", tocStructure: "tocStructure", config: "config", hierarchyMapData: "hierarchyMapData", pathSet: "pathSet", componentName: "componentName", isPreAssessment: "isPreAssessment", baseContentReadData: "baseContentReadData", contentReadData: "contentReadData" }, usesOnChanges: true, ngImport: i0, template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length - 1 || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"], dependencies: [{ kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i5.AppTocContentCardV2Component, selector: "ws-widget-app-toc-content-card-v2", inputs: ["content", "expandAll", "rootId", "rootContentType", "forPreview", "batchId", "componentName", "index", "pathSet", "expandActive", "hierarchyMapData", "batchData", "isPreAssessment", "baseContentReadData", "mlCourse", "parentMilestoneLocked"] }, { kind: "component", type: i6.AppTocSessionsNewComponent, selector: "ws-widget-app-app-toc-sessions-new", inputs: ["batchData", "content", "forPreview", "config", "batchId", "rootId", "rootContentType", "pathSet"] }, { kind: "component", type: i7.AppTocContentCardV2SkeletonComponent, selector: "ws-widget-app-toc-content-card-v2-skeleton" }] }); }
190
192
  }
191
193
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: AppTocContentComponent, decorators: [{
192
194
  type: Component,
193
- args: [{ selector: 'ws-widget-app-toc-content', template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"] }]
195
+ args: [{ selector: 'ws-widget-app-toc-content', template: "<div *ngIf=\"content?.courseCategory === 'Learning Pathway' && componentName !== 'viewer'\">\n <!-- Milestone / Learning Path UI -->\n <div class=\"milestone-wrapper\" role=\"group\" aria-label=\"Learning path milestones\">\n <!-- Learning Path Header -->\n <div class=\"learning-path-header\">\n <h3 class=\"learning-path-title\">Learning Path</h3>\n <p class=\"learning-path-subtitle\">Complete {{content?.children?.length - 1 || 3}} key milestones</p>\n </div>\n <ng-container *ngIf=\"content?.children?.length; else fallbackMilestones\">\n <ul class=\"milestone-list\">\n <li *ngFor=\"let m of content?.children; let i = index\" class=\"milestone-item\"\n [class.completed]=\"m?.completionStatus === 2\" role=\"listitem\">\n <div class=\"milestone-circle\" [attr.aria-label]=\"m?.name || ('Milestone ' + (i+1))\">\n <img *ngIf=\"m?.completionStatus === 2\" src=\"assets/icons/toc/tick-orange.svg\"\n class=\"milestone-checkmark\" alt=\"Completed\" />\n <span *ngIf=\"m?.completionStatus !== 2\" class=\"milestone-index\"></span>\n </div>\n <div class=\"milestone-label\">{{ m?.name }}</div>\n </li>\n </ul>\n </ng-container>\n <ng-template #fallbackMilestones>\n <ul class=\"milestone-list\">\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"Pre Assessment\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">Pre Assessment</div>\n </li>\n <li class=\"milestone-item completed\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"1. Foundation of Workplace Ethics\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">1. Foundation of Workplace Ethics</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"2. Health and Productivity at Work\">\n <img src=\"assets/icons/toc/tick-orange.svg\" class=\"milestone-checkmark\" alt=\"Completed\" />\n </div>\n <div class=\"milestone-label\">2. Health and Productivity at Work</div>\n </li>\n <li class=\"milestone-item\" role=\"listitem\">\n <div class=\"milestone-circle\" aria-label=\"3. Health and Productivity at Work\">\n <span class=\"milestone-index\">4</span>\n </div>\n <div class=\"milestone-label\">3. Health and Productivity at Work</div>\n </li>\n </ul>\n </ng-template>\n </div>\n</div>\n<div class=\"bggrey\">\n <div class=\"py-4 content-container\" id=\"contentContainer\" *ngIf=\"!isPreAssessment\">\n <div class=\"main-container flex flex-col gap-4\">\n <ng-container *ngIf=\"content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <div class=\"padding-left-m flex gap-4 tab-list\">\n <ng-container *ngFor=\"let type of typesOfContent\">\n <div class=\"tab-data\" (click)=\"!type.disabled && selectedTabType = type.id\"\n [ngClass]=\"{'active-tab': selectedTabType === type.id, 'disabled':type.disabled}\">\n <span>{{type.name}}</span>\n </div>\n </ng-container>\n </div>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'content' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n <ng-container\n *ngIf=\"selectedTabType === 'session' && content?.primaryCategory === nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ws-widget-app-app-toc-sessions-new [batchData]=\"batchData\" [pathSet]=\"pathSet\" [rootId]=\"contextId\"\n [rootContentType]=\"contextPath\" [batchId]=\"batchId\" [config]=\"config\" [content]=\"content\">\n </ws-widget-app-app-toc-sessions-new>\n </ng-container>\n <ng-container *ngIf=\"content?.primaryCategory !== nsContent?.EPrimaryCategory?.BLENDED_PROGRAM\">\n <ng-container [ngTemplateOutlet]=\"contentBlock\"></ng-container>\n </ng-container>\n </div>\n </div>\n <!-- {{pathSet|json}} -->\n <ng-template #contentBlock>\n <ng-container *ngIf=\"!contentLoader\">\n <ng-container *ngIf=\"content?.children?.length; else noChildren\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.children; trackBy: contentTrackBy; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [content]=\"card\" [mlCourse]=\"content\" [index]=\"i+1\"\n [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\" [batchData]=\"batchData\"\n [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </ng-container>\n <ng-template #noChildren>\n <div *ngIf=\"!isPlayable\"\n class=\"ws-mat-primary-default-text ws-mat-primary-lite-background px-6 py-8 font-normal text-base noChildren\">\n The preview for this type of content is unavailable. Please click on Start button above to view.\n </div>\n <!-- <ng-container *ngIf=\"isPlayable\" [wsResolverWidget]=\"contentPlayWidgetConfig\"></ng-container> -->\n </ng-template>\n </ng-container>\n\n <ng-container *ngIf=\"contentLoader\">\n <ws-widget-app-toc-content-card-v2-skeleton></ws-widget-app-toc-content-card-v2-skeleton>\n </ng-container>\n </ng-template>\n <div *ngIf=\"isPreAssessment\">\n <div class=\"content-card \"\n *ngFor=\"let card of content?.preEnrolmentResources; trackBy: identifier; let i = index;\"\n [ngClass]=\"{ 'content-active': pathSet && pathSet.has(card.identifier) && isEnrolled}\">\n <!-- {{card|json}} -->\n <ws-widget-app-toc-content-card-v2 [forPreview]=\"forPreview\" [expandAll]=\"expandAll\"\n [componentName]=\"componentName\" [expandActive]=\"true\" [rootId]=\"contextId\" [batchId]=\"batchId\"\n [rootContentType]=\"contextPath\" [isPreAssessment]=\"isPreAssessment\" [content]=\"card\"\n [mlCourse]=\"content\" [index]=\"i+1\" [pathSet]=\"pathSet\" [hierarchyMapData]=\"hierarchyMapData\"\n [batchData]=\"batchData\" [baseContentReadData]=\"baseContentReadData\"></ws-widget-app-toc-content-card-v2>\n </div>\n </div>\n</div>", styles: [".bggrey{background-color:#eff3f9}.content-container{min-height:800px}.content-accordion .content-panel{box-shadow:none}.content-accordion .content-header{padding:20px;background-color:#fff;border:none;box-shadow:none}.content-key-values{color:#0009}.content-key-values mat-icon{width:14px;height:14px;font-size:14px;color:#0006}.main-container{width:100%;box-sizing:border-box}.main-container .toc-section{display:flex;justify-content:space-between;padding-bottom:12px}.main-container .content-card{background:#fff;border:1px solid rgb(221,221,221);overflow:hidden;position:relative}.main-container .content-card.content-active{border:1px solid #1a4ca1}.main-container .noChildren{color:#222!important}@media only screen and (max-width: 959px){.main-container{width:100%;padding-right:0;margin-bottom:32px}}::ng-deep .mat-expansion-indicator{display:none!important}.mat-panel-indicator{width:28px;height:28px;font-size:28px}.tab-list .tab-data{border-radius:18px;border:1px solid rgba(0,0,0,.08);opacity:1;background-color:#e5e9ef;padding:6px 16px;cursor:pointer}.tab-list .tab-data span{opacity:1;color:#000000de;font-family:Lato-Regular;font-size:14px;font-weight:400;font-style:Regular;letter-spacing:.25px;text-align:left;line-height:20px}.tab-list .active-tab{border-radius:18px;border:1px solid rgb(27,76,161);opacity:1;background-color:#dee6f2}.tab-list .active-tab span{color:#1b4ca1}.tab-list .disabled{opacity:.5;cursor:not-allowed;pointer-events:none}.milestone-wrapper{--milestone-size: 33px;--milestone-border: 3px;padding:16px;background:#fff;display:flex;align-items:center;margin-top:16px}.learning-path-header{padding-right:16px}.learning-path-title{font-size:18px;font-weight:700;color:#000000de;margin:0 0 4px;font-family:Lato-Bold,Lato,sans-serif}.learning-path-subtitle{font-size:14px;font-weight:400;color:#0009;margin:0;font-family:Lato-Regular,Lato,sans-serif}.milestone-list{display:flex;align-items:flex-start;justify-content:space-between;list-style:none;margin:0;gap:12px;flex:1}.milestone-item{display:flex;flex-direction:column;align-items:center;text-align:center;flex:1 1 0;position:relative}.milestone-item:after{content:\"\";position:absolute;top:calc(var(--milestone-size) / 2);left:50%;right:-50%;height:3px;background:#e0e0e0;border-top:3px dotted #BDBDBD;background:transparent;z-index:0}.milestone-item.completed:after{background:linear-gradient(90deg,#efa34f,#f3962f);border:none}.milestone-item:last-child:after{display:none}.milestone-circle{width:var(--milestone-size);height:var(--milestone-size);min-width:var(--milestone-size);border-radius:50%;background:#fff;border:var(--milestone-border) solid #F3962F;display:flex;align-items:center;justify-content:center;z-index:1;position:relative;box-shadow:0 2px 8px #00000014;transition:all .2s ease}.milestone-item.completed .milestone-circle{background:#fff;border-color:#f3962f;box-shadow:0 4px 12px #efa34f4d}.milestone-checkmark{width:80%;height:80%;object-fit:contain}.milestone-index{font-weight:700;font-size:18px;color:#757575}.milestone-item.completed .milestone-index{color:#fff}.milestone-label{margin-top:12px;font-size:14px;line-height:1.4;color:#000000de;max-width:140px;word-wrap:break-word;white-space:normal;font-weight:500}.milestone-item:focus-within .milestone-circle,.milestone-item:hover .milestone-circle{transform:translateY(-2px) scale(1.05);box-shadow:0 6px 16px #00000026}.milestone-item.completed:hover .milestone-circle{box-shadow:0 6px 20px #efa34f66}@media (max-width: 768px){.milestone-wrapper{--milestone-size: 48px;padding:20px 12px 28px}.milestone-list{gap:8px;padding:0 8px}.milestone-label{font-size:12px;max-width:100px}.milestone-index{font-size:16px}}@media (max-width: 480px){.milestone-wrapper{--milestone-size: 40px;padding:16px 8px 24px}.milestone-list{gap:6px;padding:0 4px}.milestone-label{font-size:11px;max-width:80px;margin-top:8px}.milestone-index{font-size:14px}.milestone-item:after{height:2px;border-top-width:2px}}\n"] }]
194
196
  }], ctorParameters: function () { return [{ type: i1.ActivatedRoute }, { type: i2.AppTocService }, { type: i3.ConfigurationsService }]; }, propDecorators: { batchId: [{
195
197
  type: Input
196
198
  }], content: [{
@@ -220,4 +222,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
220
222
  }], contentReadData: [{
221
223
  type: Input
222
224
  }] } });
223
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2FwcC10b2MtY29udGVudC9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50L2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUE7QUFHN0YsT0FBTyxFQUF5QixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7O0FBR3ZFLHFEQUFxRDtBQVFyRCxNQUFNLE9BQU8sc0JBQXNCO0lBaUNqQyxZQUNVLEtBQXFCLEVBQ3JCLE1BQXFCLEVBQ3JCLFNBQWdDO1FBRmhDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBdUI7UUFqQ2pDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsZUFBVSxHQUEyQyxJQUFJLENBQUE7UUFDekQsY0FBUyxHQUFrRCxJQUFJLENBQUE7UUFDL0QsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFHdEIscUJBQWdCLEdBQVEsRUFBRSxDQUFBO1FBRzFCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBR2hDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsNEJBQXVCLEdBQTRELElBQUksQ0FBQTtRQUN2RixxQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDckIsb0RBQW9EO1FBQzVDLHNCQUFpQixHQUF3QixJQUFJLENBQUE7UUFDN0MsMkJBQXNCLEdBQXdCLElBQUksQ0FBQTtRQUMxRCxtQkFBYyxHQUFnQyxFQUFFLENBQUE7UUFDaEQsY0FBUyxHQUFHLEtBQUssQ0FBQTtRQUNqQixpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUdwQixrQkFBYSxHQUFHLEtBQUssQ0FBQTtRQUdyQixvQkFBZSxHQUFRLFNBQVMsQ0FBQTtRQUNoQyxjQUFTLEdBQVEsU0FBUyxDQUFBO1FBQzFCLGtCQUFhLEdBQUcsQ0FBQyxDQUFBO1FBT2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUE7WUFDckIsK0JBQStCO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFFBQVE7UUFDTiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1RSwwQ0FBMEM7WUFDMUMsOENBQThDO1lBQzlDLDhEQUE4RDtZQUM5RCxJQUFJLElBQUksQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsSUFBSSxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLEtBQUssUUFBUSxFQUFFO2dCQUNsSCxJQUFJLENBQUMsT0FBTyxDQUFDLHVCQUF1QixDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixDQUFDLENBQUE7YUFDeEY7WUFDRCxNQUFNLFNBQVMsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFBO1lBQzdDLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7WUFDakQsTUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUN6QyxNQUFNLGVBQWUsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUE7WUFDekQsTUFBTSxhQUFhLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQTtZQUNyRCxJQUFJLGFBQWEsS0FBSyxNQUFNLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFBO2FBQzVCO1lBQ0QsSUFBSSxTQUFTLElBQUksV0FBVyxFQUFFO2dCQUM1QixJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtnQkFDMUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUE7YUFDL0I7WUFDRCxJQUFJLE9BQU8sRUFBRTtnQkFDWCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQTthQUN2QjtZQUNELElBQUksZUFBZSxFQUFFO2dCQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLGVBQWUsS0FBSyxJQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUE7YUFDbkg7UUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNGLElBQUksSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRTtZQUNuQyxJQUFJLENBQUMsaUJBQWlCLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQVUsRUFBRSxFQUFFO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFBO1lBQ3JCLENBQUMsQ0FBQyxDQUFBO1NBQ0g7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtZQUNoRCxJQUFJLENBQUMsYUFBYSxHQUFHLEdBQUcsQ0FBQTtRQUMxQixDQUFDLENBQUMsQ0FBQTtRQUNGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFBO1FBQ3BELElBQUksY0FBYyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxjQUFjLENBQUMsS0FBSyxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUE7U0FDbEU7UUFDRCxJQUFJLENBQUMsY0FBYyxHQUFHO1lBQ3BCO2dCQUNFLElBQUksRUFBRSxZQUFZO2dCQUNsQixFQUFFLEVBQUUsU0FBUztnQkFDYixRQUFRLEVBQUUsS0FBSzthQUNoQjtZQUNEO2dCQUNFLElBQUksRUFBRSxnQkFBZ0I7Z0JBQ3RCLEVBQUUsRUFBRSxTQUFTO2dCQUNiLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1NBQ0YsQ0FBQTtRQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFBO1FBQ3RCLElBQUksSUFBSSxDQUFDLFlBQVksRUFBRTtZQUNyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDbEQsSUFBSSxHQUFHLEtBQUssZ0JBQWdCLElBQUksR0FBRyxLQUFLLGdCQUFnQixFQUFFO2lCQUN6RDtxQkFBTTtvQkFFTCxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsQ0FBQTtpQkFDakU7WUFDSCxDQUFDLENBQUMsQ0FBQTtZQUNGLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFO2dCQUN2QixVQUFVLENBQUMsR0FBRyxFQUFFO29CQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsU0FBUyxDQUFBO29CQUNoQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUE7Z0JBQ3hDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQTthQUNUO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7YUFDckY7U0FDRjtJQUNILENBQUM7SUFFTyxRQUFRLENBQUMsS0FBVztRQUMxQix5R0FBeUc7UUFDekcsb0RBQW9EO1FBQ3BELGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTtnQkFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQTthQUNoRDtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUM5QixJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUU7Z0JBQzdCLCtCQUErQjthQUNoQztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDcEMsQ0FBQztJQUVELHVDQUF1QztJQUN2QywrQkFBK0I7SUFDL0IsSUFBSTtJQUVKLDRCQUE0QjtJQUM1Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLHlFQUF5RTtJQUN6RSx1REFBdUQ7SUFDdkQsMkRBQTJEO0lBQzNELGVBQWU7SUFDZixvREFBb0Q7SUFDcEQsUUFBUTtJQUNSLGtEQUFrRDtJQUNsRCxhQUFhO0lBQ2Isb0ZBQW9GO0lBQ3BGLDBEQUEwRDtJQUMxRCxNQUFNO0lBQ04sSUFBSTtJQUVKLHNDQUFzQztJQUN0QyxzQ0FBc0M7SUFDdEMscUVBQXFFO0lBQ3JFLDRDQUE0QztJQUM1QyxpRkFBaUY7SUFDakYsbURBQW1EO0lBQ25ELGtEQUFrRDtJQUNsRCwrQ0FBK0M7SUFDL0MsWUFBWTtJQUNaLE1BQU07SUFDTixJQUFJO0lBRUosaURBQWlEO0lBQ2pELGlCQUFpQjtJQUNqQixrREFBa0Q7SUFDbEQsbUZBQW1GO0lBQ25GLHVGQUF1RjtJQUN2RixlQUFlO0lBQ2Ysd0NBQXdDO0lBQ3hDLGlGQUFpRjtJQUNqRixRQUFRO0lBQ1IsTUFBTTtJQUVOLHNGQUFzRjtJQUN0RixhQUFhO0lBQ2IsdUNBQXVDO0lBQ3ZDLGlGQUFpRjtJQUNqRixNQUFNO0lBQ04sSUFBSTtJQUVKLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDMUM7SUFDSCxDQUFDOytHQXRNVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixzZkNkbkMsK3BQQXVITTs7NEZEekdPLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSwyQkFBMkI7cUtBTTVCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIERhdGEgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBOc1dpZGdldFJlc29sdmVyIH0gZnJvbSAnQHN1bmJpcmQtY2IvcmVzb2x2ZXItdjInXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIE5zQ29udGVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG4vLyBpbXBvcnQgeyBOc0FwcFRvYyB9IGZyb20gJy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtY29udGVudC5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIEFwcFRvY0NvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgYmF0Y2hJZCE6IHN0cmluZ1xuICBASW5wdXQoKSBjb250ZW50ITogTnNDb250ZW50LklDb250ZW50XG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxuICBASW5wdXQoKSByZXN1bWVEYXRhOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhIHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgQElucHV0KCkgdG9jU3RydWN0dXJlOiBhbnlcbiAgQElucHV0KCkgY29uZmlnOiBhbnlcbiAgQElucHV0KCkgaGllcmFyY2h5TWFwRGF0YTogYW55ID0ge31cbiAgQElucHV0KCkgcGF0aFNldDogYW55XG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWUhOiBzdHJpbmdcbiAgQElucHV0KCkgaXNQcmVBc3Nlc3NtZW50ID0gZmFsc2VcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YSE6IGFueVxuICBASW5wdXQoKSBjb250ZW50UmVhZERhdGEhOiBhbnlcbiAgaXNQbGF5YWJsZSA9IGZhbHNlXG4gIGNvbnRlbnRQbGF5V2lkZ2V0Q29uZmlnOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoVHlwZWREYXRhPGFueT4gfCBudWxsID0gbnVsbFxuICBkZWZhdWx0VGh1bWJuYWlsID0gJydcbiAgLy8gZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHJvdXRlUXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRQYXJlbnRzOiBOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10gPSBbXVxuICBleHBhbmRBbGwgPSBmYWxzZVxuICBleHBhbmRQYXJ0T2YgPSBmYWxzZVxuICBjb250ZXh0SWQhOiBzdHJpbmdcbiAgY29udGV4dFBhdGghOiBzdHJpbmdcbiAgY29udGVudExvYWRlciA9IGZhbHNlXG5cbiAgdHlwZXNPZkNvbnRlbnQ6IGFueVxuICBzZWxlY3RlZFRhYlR5cGU6IGFueSA9ICdjb250ZW50J1xuICBuc0NvbnRlbnQ6IGFueSA9IE5zQ29udGVudFxuICBvdGhlclJlc291cnNlID0gMFxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcm91dGU6IEFjdGl2YXRlZFJvdXRlLFxuICAgIHByaXZhdGUgdG9jU3ZjOiBBcHBUb2NTZXJ2aWNlLFxuICAgIHByaXZhdGUgY29uZmlnU3ZjOiBDb25maWd1cmF0aW9uc1NlcnZpY2VcbiAgKSB7XG4gICAgdGhpcy50b2NTdmMucmVzdW1lRGF0YS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLnJlc3VtZURhdGEgPSByZXNcbiAgICAgIC8vIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICB9KVxuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gdGhpcy5mb3JQcmV2aWV3ID0gd2luZG93LmxvY2F0aW9uLmhyZWYuaW5jbHVkZXMoJy9hdXRob3IvJylcbiAgICB0aGlzLnJvdXRlUXVlcnlTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnF1ZXJ5UGFyYW1NYXAuc3Vic2NyaWJlKHFQYXJhbXNNYXAgPT4ge1xuICAgICAgLy8gY29uc29sZS5sb2coJ3FQYXJhbXNNYXAtLScsIHFQYXJhbXNNYXApXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5jb250ZW50LS0nLCB0aGlzLmNvbnRlbnQpXG4gICAgICAvLyBjb25zb2xlLmxvZygndGhpcy5oaWVyYXJjaHlNYXBEYXRhJywgdGhpcy5oaWVyYXJjaHlNYXBEYXRhKVxuICAgICAgaWYgKHRoaXMuY29udGVudCAmJiB0aGlzLmNvbnRlbnQ/LnByZUVucm9sbWVudFJlc291cmNlcyAmJiB0eXBlb2YgdGhpcy5jb250ZW50Py5wcmVFbnJvbG1lbnRSZXNvdXJjZXMgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRoaXMuY29udGVudFsncHJlRW5yb2xtZW50UmVzb3VyY2VzJ10gPSBKU09OLnBhcnNlKHRoaXMuY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzKVxuICAgICAgfVxuICAgICAgY29uc3QgY29udGV4dElkID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRJZCcpXG4gICAgICBjb25zdCBjb250ZXh0UGF0aCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0UGF0aCcpXG4gICAgICBjb25zdCBiYXRjaElkID0gcVBhcmFtc01hcC5nZXQoJ2JhdGNoSWQnKVxuICAgICAgY29uc3QgcHJpbWFyeUNhdGVnb3J5ID0gcVBhcmFtc01hcC5nZXQoJ3ByaW1hcnlDYXRlZ29yeScpXG4gICAgICBjb25zdCBwcmVBc3Nlc3NtZW50ID0gcVBhcmFtc01hcC5nZXQoJ3ByZUFzc2Vzc21lbnQnKVxuICAgICAgaWYgKHByZUFzc2Vzc21lbnQgPT09ICd0cnVlJykge1xuICAgICAgICB0aGlzLmlzUHJlQXNzZXNzbWVudCA9IHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChjb250ZXh0SWQgJiYgY29udGV4dFBhdGgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0SWQgPSBjb250ZXh0SWRcbiAgICAgICAgdGhpcy5jb250ZXh0UGF0aCA9IGNvbnRleHRQYXRoXG4gICAgICB9XG4gICAgICBpZiAoYmF0Y2hJZCkge1xuICAgICAgICB0aGlzLmJhdGNoSWQgPSBiYXRjaElkXG4gICAgICB9XG4gICAgICBpZiAocHJpbWFyeUNhdGVnb3J5KSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJUeXBlID0gcHJpbWFyeUNhdGVnb3J5ID09PSB0aGlzLm5zQ29udGVudC5FUHJpbWFyeUNhdGVnb3J5Lk9GRkxJTkVfU0VTU0lPTiA/ICdzZXNzaW9uJyA6ICdjb250ZW50J1xuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKHRoaXMucm91dGUgJiYgdGhpcy5yb3V0ZS5wYXJlbnQpIHtcbiAgICAgIHRoaXMucm91dGVTdWJzY3JpcHRpb24gPSB0aGlzLnJvdXRlLnBhcmVudC5kYXRhLnN1YnNjcmliZSgoZGF0YTogRGF0YSkgPT4ge1xuICAgICAgICB0aGlzLmluaXREYXRhKGRhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgICB0aGlzLnRvY1N2Yy5jb250ZW50TG9hZGVyJC5zdWJzY3JpYmUoKHZhbDogYW55KSA9PiB7XG4gICAgICB0aGlzLmNvbnRlbnRMb2FkZXIgPSB2YWxcbiAgICB9KVxuICAgIGNvbnN0IGluc3RhbmNlQ29uZmlnID0gdGhpcy5jb25maWdTdmMuaW5zdGFuY2VDb25maWdcbiAgICBpZiAoaW5zdGFuY2VDb25maWcpIHtcbiAgICAgIHRoaXMuZGVmYXVsdFRodW1ibmFpbCA9IGluc3RhbmNlQ29uZmlnLmxvZ29zLmRlZmF1bHRDb250ZW50IHx8ICcnXG4gICAgfVxuICAgIHRoaXMudHlwZXNPZkNvbnRlbnQgPSBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTZWxmLXBhY2VkJyxcbiAgICAgICAgaWQ6ICdjb250ZW50JyxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ0luc3RydWN0b3ItbGVkJyxcbiAgICAgICAgaWQ6ICdzZXNzaW9uJyxcbiAgICAgICAgZGlzYWJsZWQ6IGZhbHNlLFxuICAgICAgfSxcbiAgICBdXG4gICAgdGhpcy5vdGhlclJlc291cnNlID0gMFxuICAgIGlmICh0aGlzLnRvY1N0cnVjdHVyZSkge1xuICAgICAgT2JqZWN0LmtleXModGhpcy50b2NTdHJ1Y3R1cmUpLmZvckVhY2goKGVsZTogYW55KSA9PiB7XG4gICAgICAgIGlmIChlbGUgPT09ICdvZmZsaW5lU2Vzc2lvbicgfHwgZWxlID09PSAnbGVhcm5pbmdNb2R1bGUnKSB7XG4gICAgICAgIH0gZWxzZSB7XG5cbiAgICAgICAgICB0aGlzLm90aGVyUmVzb3Vyc2UgPSB0aGlzLm90aGVyUmVzb3Vyc2UgKyB0aGlzLnRvY1N0cnVjdHVyZVtlbGVdXG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICBpZiAoIXRoaXMub3RoZXJSZXNvdXJzZSkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiVHlwZSA9ICdzZXNzaW9uJ1xuICAgICAgICAgIHRoaXMudHlwZXNPZkNvbnRlbnRbMF0uZGlzYWJsZWQgPSB0cnVlXG4gICAgICAgIH0sIDEwMDApXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnR5cGVzT2ZDb250ZW50WzFdLmRpc2FibGVkID0gdGhpcy50b2NTdHJ1Y3R1cmVbJ29mZmxpbmVTZXNzaW9uJ10gPyBmYWxzZSA6IHRydWVcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGluaXREYXRhKF9kYXRhOiBEYXRhKSB7XG4gICAgLy8gbm90IHJlcXVpcmVkIGluaXQgbm93IGJlY2F1c2UgbmV3IGltcGxlbWVudGF0aW9uIG9mICBoYXNobWFwIGFscmVhZHkgaGFzIG1hcHBlZCB0aGUgY29tcGxldGlvbiBwZXJjZW50XG4gICAgLy8gY29uc3QgaW5pdERhdGEgPSB0aGlzLnRvY1N2Yy5pbml0RGF0YShkYXRhLCB0cnVlKVxuICAgIC8vIHRoaXMuY29udGVudCA9IGluaXREYXRhLmNvbnRlbnRcbiAgICAvLyB0aGlzLmVycm9yQ29kZSA9IGluaXREYXRhLmVycm9yQ29kZVxuICAgIGlmICh0aGlzLmNvbnRlbnQpIHtcbiAgICAgIGlmICghdGhpcy5jb250ZXh0SWQgfHwgIXRoaXMuY29udGV4dFBhdGgpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0SWQgPSB0aGlzLmNvbnRlbnQuaWRlbnRpZmllclxuICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gdGhpcy5jb250ZW50LnByaW1hcnlDYXRlZ29yeVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpIHtcbiAgICBmb3IgKGNvbnN0IHByb3BlcnR5IGluIGNoYW5nZXMpIHtcbiAgICAgIGlmIChwcm9wZXJ0eSA9PT0gJ3Jlc3VtZURhdGEnKSB7XG4gICAgICAgIC8vIHRoaXMuZ2V0TGFzdFBsYXllZFJlc291cmNlKClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgaXNFbnJvbGxlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5iYXRjaElkID8gdHJ1ZSA6IGZhbHNlXG4gIH1cblxuICAvLyBwcml2YXRlIHByb2Nlc3NDb2xsZWN0aW9uRm9yVHJlZSgpIHtcbiAgLy8gICAgIHRoaXMucGF0aFNldCA9IG5ldyBTZXQoKVxuICAvLyB9XG5cbiAgLy8gZ2V0TGFzdFBsYXllZFJlc291cmNlKCkge1xuICAvLyAgIGxldCBmaXJzdFBsYXlhYmxlQ29udGVudFxuICAvLyAgIGxldCByZXN1bWVEYXRhVjI6IGFueVxuICAvLyAgIGlmICh0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5yZXN1bWVEYXRhLmxlbmd0aCA+IDAgJiYgdGhpcy5jb250ZW50KSB7XG4gIC8vICAgICBpZiAodGhpcy5jb250ZW50LmNvbXBsZXRpb25QZXJjZW50YWdlID09PSAxMDApIHtcbiAgLy8gICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoJ3N0YXJ0JylcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIHJlc3VtZURhdGFWMiA9IHRoaXMuZ2V0UmVzdW1lRGF0YUZyb21MaXN0KClcbiAgLy8gICAgIH1cbiAgLy8gICAgIHRoaXMuZXhwYW5kVGhlUGF0aChyZXN1bWVEYXRhVjIuaWRlbnRpZmllcilcbiAgLy8gICB9IGVsc2Uge1xuICAvLyAgICAgZmlyc3RQbGF5YWJsZUNvbnRlbnQgPSB0aGlzLmNvbnRlbnRTdmMuZ2V0Rmlyc3RDaGlsZEluSGllcmFyY2h5KHRoaXMuY29udGVudClcbiAgLy8gICAgIHRoaXMuZXhwYW5kVGhlUGF0aChmaXJzdFBsYXlhYmxlQ29udGVudC5pZGVudGlmaWVyKVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIGV4cGFuZFRoZVBhdGgocmVzb3VyY2VJZDogc3RyaW5nKSB7XG4gIC8vICAgaWYgKHRoaXMuY29udGVudCAmJiByZXNvdXJjZUlkKSB7XG4gIC8vICAgICBjb25zdCBwYXRoID0gdGhpcy51dGlsaXR5U3ZjLmdldFBhdGgodGhpcy5jb250ZW50LCByZXNvdXJjZUlkKVxuICAvLyAgICAgLy8gY29uc29sZS5sb2coJ1BhdGggOjogOjogOiAnLCBwYXRoKVxuICAvLyAgICAgdGhpcy5wYXRoU2V0ID0gbmV3IFNldChwYXRoLm1hcCgodTogeyBpZGVudGlmaWVyOiBhbnkgfSkgPT4gdS5pZGVudGlmaWVyKSlcbiAgLy8gICAgIC8vIGNvbnNvbGUubG9nKCdwYXRoU2V0IDo6OiAnLCB0aGlzLnBhdGhTZXQpXG4gIC8vICAgICAvLyBwYXRoLmZvckVhY2goKG5vZGU6IElWaWV3ZXJUb2NDYXJkKSA9PiB7XG4gIC8vICAgICAvLyAgIHRoaXMubmVzdGVkVHJlZUNvbnRyb2wuZXhwYW5kKG5vZGUpXG4gIC8vICAgICAvLyB9KVxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIC8vIHByaXZhdGUgZ2V0UmVzdW1lRGF0YUZyb21MaXN0KHR5cGU/OiBzdHJpbmcpIHtcbiAgLy8gICBpZiAoIXR5cGUpIHtcbiAgLy8gICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTptYXgtbGluZS1sZW5ndGhcbiAgLy8gICAgIGNvbnN0IGxhc3RJdGVtID0gdGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5zb3J0KChhOiBhbnksIGI6IGFueSkgPT5cbiAgLy8gbmV3IERhdGUoYi5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpIC0gbmV3IERhdGUoYS5sYXN0QWNjZXNzVGltZSkuZ2V0VGltZSgpKS5zaGlmdCgpXG4gIC8vICAgICByZXR1cm4ge1xuICAvLyAgICAgICBpZGVudGlmaWVyOiBsYXN0SXRlbS5jb250ZW50SWQsXG4gIC8vICAgICAgIG1pbWVUeXBlOiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgbGFzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAvLyAgICAgfVxuICAvLyAgIH1cblxuICAvLyAgIGNvbnN0IGZpcnN0SXRlbSA9IHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoICYmIHRoaXMucmVzdW1lRGF0YVswXVxuICAvLyAgIHJldHVybiB7XG4gIC8vICAgICBpZGVudGlmaWVyOiBmaXJzdEl0ZW0uY29udGVudElkLFxuICAvLyAgICAgbWltZVR5cGU6IGZpcnN0SXRlbS5wcm9ncmVzc2RldGFpbHMgJiYgZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscy5taW1lVHlwZSxcbiAgLy8gICB9XG4gIC8vIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICBpZiAodGhpcy5yb3V0ZVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICAgIGlmICh0aGlzLnJvdXRlUXVlcnlTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMucm91dGVRdWVyeVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpXG4gICAgfVxuICB9XG59XG4iLCI8ZGl2ICpuZ0lmPVwiY29udGVudD8uY291cnNlQ2F0ZWdvcnkgPT09ICdMZWFybmluZyBQYXRod2F5JyAmJiAgY29tcG9uZW50TmFtZSAhPT0gJ3ZpZXdlcidcIj5cbiAgICA8IS0tIE1pbGVzdG9uZSAvIExlYXJuaW5nIFBhdGggVUkgLS0+XG4gICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS13cmFwcGVyXCIgcm9sZT1cImdyb3VwXCIgYXJpYS1sYWJlbD1cIkxlYXJuaW5nIHBhdGggbWlsZXN0b25lc1wiPlxuICAgICAgICA8IS0tIExlYXJuaW5nIFBhdGggSGVhZGVyIC0tPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGVhcm5pbmctcGF0aC1oZWFkZXJcIj5cbiAgICAgICAgICAgIDxoMyBjbGFzcz1cImxlYXJuaW5nLXBhdGgtdGl0bGVcIj5MZWFybmluZyBQYXRoPC9oMz5cbiAgICAgICAgICAgIDxwIGNsYXNzPVwibGVhcm5pbmctcGF0aC1zdWJ0aXRsZVwiPkNvbXBsZXRlIHt7Y29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aCB8fCAzfX0ga2V5IG1pbGVzdG9uZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aDsgZWxzZSBmYWxsYmFja01pbGVzdG9uZXNcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1pbGVzdG9uZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtIG9mIGNvbnRlbnQ/LmNoaWxkcmVuOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb21wbGV0ZWRdPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwibT8ubmFtZSB8fCAoJ01pbGVzdG9uZSAnICsgKGkrMSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbGVzdG9uZS1jaGVja21hcmtcIiBhbHQ9XCJDb21wbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtPy5jb21wbGV0aW9uU3RhdHVzICE9PSAyXCIgY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+e3sgbT8ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNmYWxsYmFja01pbGVzdG9uZXM+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtaWxlc3RvbmUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1pbGVzdG9uZS1pdGVtIGNvbXBsZXRlZFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCJQcmUgQXNzZXNzbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+UHJlIEFzc2Vzc21lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1pbGVzdG9uZS1pdGVtIGNvbXBsZXRlZFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIxLiBGb3VuZGF0aW9uIG9mIFdvcmtwbGFjZSBFdGhpY3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL3RvYy90aWNrLW9yYW5nZS5zdmdcIiBjbGFzcz1cIm1pbGVzdG9uZS1jaGVja21hcmtcIiBhbHQ9XCJDb21wbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1sYWJlbFwiPjEuIEZvdW5kYXRpb24gb2YgV29ya3BsYWNlIEV0aGljczwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW1cIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1jaXJjbGVcIiBhcmlhLWxhYmVsPVwiMi4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29ya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+Mi4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW1cIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1jaXJjbGVcIiBhcmlhLWxhYmVsPVwiMy4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29ya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj40PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1sYWJlbFwiPjMuIEhlYWx0aCBhbmQgUHJvZHVjdGl2aXR5IGF0IFdvcms8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImJnZ3JleVwiPlxuICAgIDxkaXYgY2xhc3M9XCJweS00IGNvbnRlbnQtY29udGFpbmVyXCIgaWQ9XCJjb250ZW50Q29udGFpbmVyXCIgKm5nSWY9XCIhaXNQcmVBc3Nlc3NtZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBuc0NvbnRlbnQ/LkVQcmltYXJ5Q2F0ZWdvcnk/LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWRkaW5nLWxlZnQtbSBmbGV4IGdhcC00IHRhYi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNPZkNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItZGF0YVwiIChjbGljayk9XCIhdHlwZS5kaXNhYmxlZCAmJiBzZWxlY3RlZFRhYlR5cGUgPSB0eXBlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS10YWInOiBzZWxlY3RlZFRhYlR5cGUgPT09IHR5cGUuaWQsICdkaXNhYmxlZCc6dHlwZS5kaXNhYmxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3R5cGUubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYlR5cGUgPT09ICdjb250ZW50JyAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRUYWJUeXBlID09PSAnc2Vzc2lvbicgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBuc0NvbnRlbnQ/LkVQcmltYXJ5Q2F0ZWdvcnk/LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLWFwcC10b2Mtc2Vzc2lvbnMtbmV3IFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCIgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtyb290SWRdPVwiY29udGV4dElkXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvb3RDb250ZW50VHlwZV09XCJjb250ZXh0UGF0aFwiIFtiYXRjaElkXT1cImJhdGNoSWRcIiBbY29uZmlnXT1cImNvbmZpZ1wiIFtjb250ZW50XT1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hcHAtYXBwLXRvYy1zZXNzaW9ucy1uZXc+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHt7cGF0aFNldHxqc29ufX0gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNjb250ZW50QmxvY2s+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudExvYWRlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNoaWxkcmVuPy5sZW5ndGg7IGVsc2Ugbm9DaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNhcmQgXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNhcmQgb2YgY29udGVudD8uY2hpbGRyZW47IHRyYWNrQnk6IGNvbnRlbnRUcmFja0J5OyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NvbnRlbnQtYWN0aXZlJzogcGF0aFNldCAmJiBwYXRoU2V0LmhhcyhjYXJkLmlkZW50aWZpZXIpICAmJiBpc0Vucm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y2FyZHxqc29ufX0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtleHBhbmRBbGxdPVwiZXhwYW5kQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnROYW1lXT1cImNvbXBvbmVudE5hbWVcIiBbZXhwYW5kQWN0aXZlXT1cInRydWVcIiBbcm9vdElkXT1cImNvbnRleHRJZFwiIFtiYXRjaElkXT1cImJhdGNoSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvb3RDb250ZW50VHlwZV09XCJjb250ZXh0UGF0aFwiIFtjb250ZW50XT1cImNhcmRcIiBbbWxDb3Vyc2VdPVwiY29udGVudFwiIFtpbmRleF09XCJpKzFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cImhpZXJhcmNoeU1hcERhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCI+PC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9DaGlsZHJlbj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUGxheWFibGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LWRlZmF1bHQtdGV4dCB3cy1tYXQtcHJpbWFyeS1saXRlLWJhY2tncm91bmQgcHgtNiBweS04IGZvbnQtbm9ybWFsIHRleHQtYmFzZSBub0NoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIFRoZSBwcmV2aWV3IGZvciB0aGlzIHR5cGUgb2YgY29udGVudCBpcyB1bmF2YWlsYWJsZS4gUGxlYXNlIGNsaWNrIG9uIFN0YXJ0IGJ1dHRvbiBhYm92ZSB0byB2aWV3LlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUGxheWFibGVcIiBbd3NSZXNvbHZlcldpZGdldF09XCJjb250ZW50UGxheVdpZGdldENvbmZpZ1wiPjwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50TG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyLXNrZWxldG9uPjwvd3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyLXNrZWxldG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgKm5nSWY9XCJpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY2FyZCBcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNhcmQgb2YgY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzOyB0cmFja0J5OiBpZGVudGlmaWVyOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjb250ZW50LWFjdGl2ZSc6IHBhdGhTZXQgJiYgcGF0aFNldC5oYXMoY2FyZC5pZGVudGlmaWVyKSAgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgIDwhLS0ge3tjYXJkfGpzb259fSAtLT5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtleHBhbmRBbGxdPVwiZXhwYW5kQWxsXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50TmFtZV09XCJjb21wb25lbnROYW1lXCIgW2V4cGFuZEFjdGl2ZV09XCJ0cnVlXCIgW3Jvb3RJZF09XCJjb250ZXh0SWRcIiBbYmF0Y2hJZF09XCJiYXRjaElkXCJcbiAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2lzUHJlQXNzZXNzbWVudF09XCJpc1ByZUFzc2Vzc21lbnRcIiBbY29udGVudF09XCJjYXJkXCJcbiAgICAgICAgICAgICAgICBbbWxDb3Vyc2VdPVwiY29udGVudFwiIFtpbmRleF09XCJpKzFcIiBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiXG4gICAgICAgICAgICAgICAgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCI+PC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLXRvYy1jb250ZW50LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnJhcnkvc3VuYmlyZC1jYi90b2Mvc3JjL2xpYi9fY29sbGVjdGlvbi9fY29tbW9uL2NvbnRlbnQtdG9jL2FwcC10b2MtY29udGVudC9hcHAtdG9jLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicmFyeS9zdW5iaXJkLWNiL3RvYy9zcmMvbGliL19jb2xsZWN0aW9uL19jb21tb24vY29udGVudC10b2MvYXBwLXRvYy1jb250ZW50L2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBK0MsTUFBTSxlQUFlLENBQUE7QUFHN0YsT0FBTyxFQUF5QixTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7Ozs7Ozs7O0FBR3ZFLHFEQUFxRDtBQVFyRCxNQUFNLE9BQU8sc0JBQXNCO0lBaUNqQyxZQUNVLEtBQXFCLEVBQ3JCLE1BQXFCLEVBQ3JCLFNBQWdDO1FBRmhDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBQ3JCLFdBQU0sR0FBTixNQUFNLENBQWU7UUFDckIsY0FBUyxHQUFULFNBQVMsQ0FBdUI7UUFqQ2pDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsZUFBVSxHQUEyQyxJQUFJLENBQUE7UUFDekQsY0FBUyxHQUFrRCxJQUFJLENBQUE7UUFDL0QsbUJBQWMsR0FBRyxLQUFLLENBQUE7UUFHdEIscUJBQWdCLEdBQVEsRUFBRSxDQUFBO1FBRzFCLG9CQUFlLEdBQUcsS0FBSyxDQUFBO1FBR2hDLGVBQVUsR0FBRyxLQUFLLENBQUE7UUFDbEIsNEJBQXVCLEdBQTRELElBQUksQ0FBQTtRQUN2RixxQkFBZ0IsR0FBRyxFQUFFLENBQUE7UUFDckIsb0RBQW9EO1FBQzVDLHNCQUFpQixHQUF3QixJQUFJLENBQUE7UUFDN0MsMkJBQXNCLEdBQXdCLElBQUksQ0FBQTtRQUMxRCxtQkFBYyxHQUFnQyxFQUFFLENBQUE7UUFDaEQsY0FBUyxHQUFHLEtBQUssQ0FBQTtRQUNqQixpQkFBWSxHQUFHLEtBQUssQ0FBQTtRQUdwQixrQkFBYSxHQUFHLEtBQUssQ0FBQTtRQUdyQixvQkFBZSxHQUFRLFNBQVMsQ0FBQTtRQUNoQyxjQUFTLEdBQVMsU0FBUyxDQUFBO1FBQzNCLGtCQUFhLEdBQUcsQ0FBQyxDQUFBO1FBT2YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBUSxFQUFFLEVBQUU7WUFDNUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxHQUFHLENBQUE7WUFDckIsK0JBQStCO1FBQ2pDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFFBQVE7UUFDTiw4REFBOEQ7UUFDOUQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUM1RSwwQ0FBMEM7WUFDMUMsOENBQThDO1lBQzlDLDhEQUE4RDtZQUU5RCx1REFBdUQ7WUFDdkQsMEdBQTBHO1lBQzFHLElBQUcsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLHFCQUFxQixJQUFJLE9BQU8sSUFBSSxDQUFDLE9BQU8sRUFBRSxxQkFBcUIsS0FBSyxRQUFRLEVBQUU7Z0JBQ2pILElBQUksQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsR0FBSSxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUscUJBQXFCLENBQUMsQ0FBQTthQUN6RjtZQUNELE1BQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsV0FBVyxDQUFDLENBQUE7WUFDN0MsTUFBTSxXQUFXLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtZQUNqRCxNQUFNLE9BQU8sR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFBO1lBQ3pDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxHQUFHLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtZQUN6RCxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUMsR0FBRyxDQUFDLGVBQWUsQ0FBQyxDQUFBO1lBQ3JELElBQUcsYUFBYSxLQUFLLE1BQU0sRUFBRTtnQkFDM0IsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUE7YUFDNUI7WUFDRCxJQUFJLFNBQVMsSUFBSSxXQUFXLEVBQUU7Z0JBQzVCLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFBO2dCQUMxQixJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQTthQUMvQjtZQUNELElBQUksT0FBTyxFQUFFO2dCQUNYLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFBO2FBQ3ZCO1lBQ0QsSUFBRyxlQUFlLEVBQUc7Z0JBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQTthQUNuSDtRQUNILENBQUMsQ0FBQyxDQUFBO1FBQ0YsSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO1lBQ25DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBVSxFQUFFLEVBQUU7Z0JBQ3ZFLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUE7WUFDckIsQ0FBQyxDQUFDLENBQUE7U0FDSDtRQUNELElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO1lBQ2hELElBQUksQ0FBQyxhQUFhLEdBQUcsR0FBRyxDQUFBO1FBQzFCLENBQUMsQ0FBQyxDQUFBO1FBQ0YsTUFBTSxjQUFjLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUE7UUFDcEQsSUFBSSxjQUFjLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGdCQUFnQixHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsY0FBYyxJQUFJLEVBQUUsQ0FBQTtTQUNsRTtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUc7WUFDcEI7Z0JBQ0UsSUFBSSxFQUFFLFlBQVk7Z0JBQ2xCLEVBQUUsRUFBRSxTQUFTO2dCQUNiLFFBQVEsRUFBRSxLQUFLO2FBQ2hCO1lBQ0Q7Z0JBQ0UsSUFBSSxFQUFFLGdCQUFnQjtnQkFDdEIsRUFBRSxFQUFFLFNBQVM7Z0JBQ2IsUUFBUSxFQUFFLEtBQUs7YUFDaEI7U0FDRixDQUFBO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxDQUFDLENBQUE7UUFDdEIsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQ3JCLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQVEsRUFBRSxFQUFFO2dCQUNsRCxJQUFJLEdBQUcsS0FBSyxnQkFBZ0IsSUFBSSxHQUFHLEtBQUssZ0JBQWdCLEVBQUU7aUJBQ3pEO3FCQUFNO29CQUVMLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFBO2lCQUNqRTtZQUNILENBQUMsQ0FBQyxDQUFBO1lBQ0YsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3ZCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLGVBQWUsR0FBRyxTQUFTLENBQUE7b0JBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtnQkFDeEMsQ0FBQyxFQUFVLElBQUksQ0FBQyxDQUFBO2FBQ2pCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxHQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUE7YUFDdEY7U0FDRjtJQUNILENBQUM7SUFFTyxRQUFRLENBQUMsS0FBVztRQUMxQix5R0FBeUc7UUFDekcsb0RBQW9EO1FBQ3BELGtDQUFrQztRQUNsQyxzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRTtnQkFDeEMsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQTtnQkFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQTthQUNoRDtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUFzQjtRQUNoQyxLQUFLLE1BQU0sUUFBUSxJQUFJLE9BQU8sRUFBRTtZQUM5QixJQUFJLFFBQVEsS0FBSyxZQUFZLEVBQUU7Z0JBQzdCLCtCQUErQjthQUNoQztTQUNGO0lBQ0gsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUE7SUFDcEMsQ0FBQztJQUVELHVDQUF1QztJQUN2QywrQkFBK0I7SUFDL0IsSUFBSTtJQUVKLDRCQUE0QjtJQUM1Qiw2QkFBNkI7SUFDN0IsMEJBQTBCO0lBQzFCLHlFQUF5RTtJQUN6RSx1REFBdUQ7SUFDdkQsMkRBQTJEO0lBQzNELGVBQWU7SUFDZixvREFBb0Q7SUFDcEQsUUFBUTtJQUNSLGtEQUFrRDtJQUNsRCxhQUFhO0lBQ2Isb0ZBQW9GO0lBQ3BGLDBEQUEwRDtJQUMxRCxNQUFNO0lBQ04sSUFBSTtJQUVKLHNDQUFzQztJQUN0QyxzQ0FBc0M7SUFDdEMscUVBQXFFO0lBQ3JFLDRDQUE0QztJQUM1QyxpRkFBaUY7SUFDakYsbURBQW1EO0lBQ25ELGtEQUFrRDtJQUNsRCwrQ0FBK0M7SUFDL0MsWUFBWTtJQUNaLE1BQU07SUFDTixJQUFJO0lBRUosaURBQWlEO0lBQ2pELGlCQUFpQjtJQUNqQixrREFBa0Q7SUFDbEQsbUZBQW1GO0lBQ25GLHVGQUF1RjtJQUN2RixlQUFlO0lBQ2Ysd0NBQXdDO0lBQ3hDLGlGQUFpRjtJQUNqRixRQUFRO0lBQ1IsTUFBTTtJQUVOLHNGQUFzRjtJQUN0RixhQUFhO0lBQ2IsdUNBQXVDO0lBQ3ZDLGlGQUFpRjtJQUNqRixNQUFNO0lBQ04sSUFBSTtJQUVKLFdBQVc7UUFDVCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtZQUMxQixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDckM7UUFDRCxJQUFJLElBQUksQ0FBQyxzQkFBc0IsRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLENBQUMsV0FBVyxFQUFFLENBQUE7U0FDMUM7SUFDSCxDQUFDOytHQXpNVSxzQkFBc0I7bUdBQXRCLHNCQUFzQixzZkNkbkMsbXFQQXVITTs7NEZEekdPLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDRSwyQkFBMkI7cUtBTTVCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxPQUFPO3NCQUFmLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0csY0FBYztzQkFBdEIsS0FBSztnQkFDRyxZQUFZO3NCQUFwQixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxnQkFBZ0I7c0JBQXhCLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csZUFBZTtzQkFBdkIsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBPbkluaXQsIFNpbXBsZUNoYW5nZXMgfSBmcm9tICdAYW5ndWxhci9jb3JlJ1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIERhdGEgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInXG5pbXBvcnQgeyBOc1dpZGdldFJlc29sdmVyIH0gZnJvbSAnQHN1bmJpcmQtY2IvcmVzb2x2ZXItdjInXG5pbXBvcnQgeyBDb25maWd1cmF0aW9uc1NlcnZpY2UsIE5zQ29udGVudCB9IGZyb20gJ0BzdW5iaXJkLWNiL3V0aWxzLXYyJ1xuaW1wb3J0IHsgQXBwVG9jU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2FwcC10b2Muc2VydmljZSdcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG4vLyBpbXBvcnQgeyBOc0FwcFRvYyB9IGZyb20gJy4uL21vZGVscy9hcHAtdG9jLm1vZGVsJ1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICd3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50JyxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcC10b2MtY29udGVudC5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2FwcC10b2MtY29udGVudC5jb21wb25lbnQuc2NzcyddLFxufSlcblxuZXhwb3J0IGNsYXNzIEFwcFRvY0NvbnRlbnRDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgYmF0Y2hJZCE6IHN0cmluZ1xuICBASW5wdXQoKSBjb250ZW50ITogTnNDb250ZW50LklDb250ZW50XG4gIEBJbnB1dCgpIGZvclByZXZpZXcgPSBmYWxzZVxuICBASW5wdXQoKSByZXN1bWVEYXRhOiBOc0NvbnRlbnQuSUNvbnRpbnVlTGVhcm5pbmdEYXRhIHwgbnVsbCA9IG51bGxcbiAgQElucHV0KCkgYmF0Y2hEYXRhOiAvKipOc0NvbnRlbnQuSUJhdGNoTGlzdFJlc3BvbnNlICovIGFueSB8IG51bGwgPSBudWxsXG4gIEBJbnB1dCgpIHNrZWxldG9uTG9hZGVyID0gZmFsc2VcbiAgQElucHV0KCkgdG9jU3RydWN0dXJlOiBhbnlcbiAgQElucHV0KCkgY29uZmlnOiBhbnlcbiAgQElucHV0KCkgaGllcmFyY2h5TWFwRGF0YTogYW55ID0ge31cbiAgQElucHV0KCkgcGF0aFNldDogYW55XG4gIEBJbnB1dCgpIGNvbXBvbmVudE5hbWUhOiBzdHJpbmdcbiAgQElucHV0KCkgaXNQcmVBc3Nlc3NtZW50ID0gZmFsc2VcbiAgQElucHV0KCkgYmFzZUNvbnRlbnRSZWFkRGF0YSE6IGFueVxuICBASW5wdXQoKSBjb250ZW50UmVhZERhdGEhOiBhbnlcbiAgaXNQbGF5YWJsZSA9IGZhbHNlXG4gIGNvbnRlbnRQbGF5V2lkZ2V0Q29uZmlnOiBOc1dpZGdldFJlc29sdmVyLklSZW5kZXJDb25maWdXaXRoVHlwZWREYXRhPGFueT4gfCBudWxsID0gbnVsbFxuICBkZWZhdWx0VGh1bWJuYWlsID0gJydcbiAgLy8gZXJyb3JDb2RlOiBOc0FwcFRvYy5FV3NUb2NFcnJvckNvZGUgfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHJvdXRlU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb24gfCBudWxsID0gbnVsbFxuICBwcml2YXRlIHJvdXRlUXVlcnlTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbiB8IG51bGwgPSBudWxsXG4gIGNvbnRlbnRQYXJlbnRzOiBOc0NvbnRlbnQuSUNvbnRlbnRNaW5pbWFsW10gPSBbXVxuICBleHBhbmRBbGwgPSBmYWxzZVxuICBleHBhbmRQYXJ0T2YgPSBmYWxzZVxuICBjb250ZXh0SWQhOiBzdHJpbmdcbiAgY29udGV4dFBhdGghOiBzdHJpbmdcbiAgY29udGVudExvYWRlciA9IGZhbHNlXG5cbiAgdHlwZXNPZkNvbnRlbnQ6IGFueVxuICBzZWxlY3RlZFRhYlR5cGU6IGFueSA9ICdjb250ZW50J1xuICBuc0NvbnRlbnQ6IGFueSA9ICBOc0NvbnRlbnRcbiAgb3RoZXJSZXNvdXJzZSA9IDBcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICBwcml2YXRlIHRvY1N2YzogQXBwVG9jU2VydmljZSxcbiAgICBwcml2YXRlIGNvbmZpZ1N2YzogQ29uZmlndXJhdGlvbnNTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMudG9jU3ZjLnJlc3VtZURhdGEuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXN1bWVEYXRhID0gcmVzXG4gICAgICAvLyB0aGlzLmdldExhc3RQbGF5ZWRSZXNvdXJjZSgpXG4gICAgfSlcbiAgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIC8vIHRoaXMuZm9yUHJldmlldyA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluY2x1ZGVzKCcvYXV0aG9yLycpXG4gICAgdGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uID0gdGhpcy5yb3V0ZS5xdWVyeVBhcmFtTWFwLnN1YnNjcmliZShxUGFyYW1zTWFwID0+IHtcbiAgICAgIC8vIGNvbnNvbGUubG9nKCdxUGFyYW1zTWFwLS0nLCBxUGFyYW1zTWFwKVxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuY29udGVudC0tJywgdGhpcy5jb250ZW50KVxuICAgICAgLy8gY29uc29sZS5sb2coJ3RoaXMuaGllcmFyY2h5TWFwRGF0YScsIHRoaXMuaGllcmFyY2h5TWFwRGF0YSlcbiAgICAgIFxuICAgICAgLy8gUGFyc2UgcHJlRW5yb2xtZW50UmVzb3VyY2VzIGlmIGl0IGV4aXN0cyBhcyBhIHN0cmluZ1xuICAgICAgLy8gTm90ZTogVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHByZWxpbWluYXJ5IGFzc2Vzc21lbnQgd2hpY2ggaXMgaW4gY2hpbGRyZW4gYXJyYXkgd2l0aCBpc1ByZUFzc2Vzc21lbnQgZmxhZ1xuICAgICAgaWYodGhpcy5jb250ZW50ICYmIHRoaXMuY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzICYmIHR5cGVvZiB0aGlzLmNvbnRlbnQ/LnByZUVucm9sbWVudFJlc291cmNlcyA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5jb250ZW50WydwcmVFbnJvbG1lbnRSZXNvdXJjZXMnXSA9ICBKU09OLnBhcnNlKHRoaXMuY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzKVxuICAgICAgfVxuICAgICAgY29uc3QgY29udGV4dElkID0gcVBhcmFtc01hcC5nZXQoJ2NvbnRleHRJZCcpXG4gICAgICBjb25zdCBjb250ZXh0UGF0aCA9IHFQYXJhbXNNYXAuZ2V0KCdjb250ZXh0UGF0aCcpXG4gICAgICBjb25zdCBiYXRjaElkID0gcVBhcmFtc01hcC5nZXQoJ2JhdGNoSWQnKVxuICAgICAgY29uc3QgcHJpbWFyeUNhdGVnb3J5ID0gcVBhcmFtc01hcC5nZXQoJ3ByaW1hcnlDYXRlZ29yeScpXG4gICAgICBjb25zdCBwcmVBc3Nlc3NtZW50ID0gcVBhcmFtc01hcC5nZXQoJ3ByZUFzc2Vzc21lbnQnKVxuICAgICAgaWYocHJlQXNzZXNzbWVudCA9PT0gJ3RydWUnKSB7XG4gICAgICAgIHRoaXMuaXNQcmVBc3Nlc3NtZW50ID0gdHJ1ZVxuICAgICAgfVxuICAgICAgaWYgKGNvbnRleHRJZCAmJiBjb250ZXh0UGF0aCkge1xuICAgICAgICB0aGlzLmNvbnRleHRJZCA9IGNvbnRleHRJZFxuICAgICAgICB0aGlzLmNvbnRleHRQYXRoID0gY29udGV4dFBhdGhcbiAgICAgIH1cbiAgICAgIGlmIChiYXRjaElkKSB7XG4gICAgICAgIHRoaXMuYmF0Y2hJZCA9IGJhdGNoSWRcbiAgICAgIH1cbiAgICAgIGlmKHByaW1hcnlDYXRlZ29yeSApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYlR5cGUgPSBwcmltYXJ5Q2F0ZWdvcnkgPT09IHRoaXMubnNDb250ZW50LkVQcmltYXJ5Q2F0ZWdvcnkuT0ZGTElORV9TRVNTSU9OID8gJ3Nlc3Npb24nIDogJ2NvbnRlbnQnXG4gICAgICB9XG4gICAgfSlcbiAgICBpZiAodGhpcy5yb3V0ZSAmJiB0aGlzLnJvdXRlLnBhcmVudCkge1xuICAgICAgdGhpcy5yb3V0ZVN1YnNjcmlwdGlvbiA9IHRoaXMucm91dGUucGFyZW50LmRhdGEuc3Vic2NyaWJlKChkYXRhOiBEYXRhKSA9PiB7XG4gICAgICAgIHRoaXMuaW5pdERhdGEoZGF0YSlcbiAgICAgIH0pXG4gICAgfVxuICAgIHRoaXMudG9jU3ZjLmNvbnRlbnRMb2FkZXIkLnN1YnNjcmliZSgodmFsOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuY29udGVudExvYWRlciA9IHZhbFxuICAgIH0pXG4gICAgY29uc3QgaW5zdGFuY2VDb25maWcgPSB0aGlzLmNvbmZpZ1N2Yy5pbnN0YW5jZUNvbmZpZ1xuICAgIGlmIChpbnN0YW5jZUNvbmZpZykge1xuICAgICAgdGhpcy5kZWZhdWx0VGh1bWJuYWlsID0gaW5zdGFuY2VDb25maWcubG9nb3MuZGVmYXVsdENvbnRlbnQgfHwgJydcbiAgICB9XG4gICAgdGhpcy50eXBlc09mQ29udGVudCA9IFtcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NlbGYtcGFjZWQnLFxuICAgICAgICBpZDogJ2NvbnRlbnQnLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnSW5zdHJ1Y3Rvci1sZWQnLFxuICAgICAgICBpZDogJ3Nlc3Npb24nLFxuICAgICAgICBkaXNhYmxlZDogZmFsc2UsXG4gICAgICB9LFxuICAgIF1cbiAgICB0aGlzLm90aGVyUmVzb3Vyc2UgPSAwXG4gICAgaWYgKHRoaXMudG9jU3RydWN0dXJlKSB7XG4gICAgICBPYmplY3Qua2V5cyh0aGlzLnRvY1N0cnVjdHVyZSkuZm9yRWFjaCgoZWxlOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKGVsZSA9PT0gJ29mZmxpbmVTZXNzaW9uJyB8fCBlbGUgPT09ICdsZWFybmluZ01vZHVsZScpIHtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgIHRoaXMub3RoZXJSZXNvdXJzZSA9IHRoaXMub3RoZXJSZXNvdXJzZSArIHRoaXMudG9jU3RydWN0dXJlW2VsZV1cbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIGlmICghdGhpcy5vdGhlclJlc291cnNlKSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUYWJUeXBlID0gJ3Nlc3Npb24nXG4gICAgICAgICAgdGhpcy50eXBlc09mQ29udGVudFswXS5kaXNhYmxlZCA9IHRydWVcbiAgICAgICAgfSwgICAgICAgICAxMDAwKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy50eXBlc09mQ29udGVudFsxXS5kaXNhYmxlZCA9ICB0aGlzLnRvY1N0cnVjdHVyZVsnb2ZmbGluZVNlc3Npb24nXSA/IGZhbHNlIDogdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgaW5pdERhdGEoX2RhdGE6IERhdGEpIHtcbiAgICAvLyBub3QgcmVxdWlyZWQgaW5pdCBub3cgYmVjYXVzZSBuZXcgaW1wbGVtZW50YXRpb24gb2YgIGhhc2htYXAgYWxyZWFkeSBoYXMgbWFwcGVkIHRoZSBjb21wbGV0aW9uIHBlcmNlbnRcbiAgICAvLyBjb25zdCBpbml0RGF0YSA9IHRoaXMudG9jU3ZjLmluaXREYXRhKGRhdGEsIHRydWUpXG4gICAgLy8gdGhpcy5jb250ZW50ID0gaW5pdERhdGEuY29udGVudFxuICAgIC8vIHRoaXMuZXJyb3JDb2RlID0gaW5pdERhdGEuZXJyb3JDb2RlXG4gICAgaWYgKHRoaXMuY29udGVudCkge1xuICAgICAgaWYgKCF0aGlzLmNvbnRleHRJZCB8fCAhdGhpcy5jb250ZXh0UGF0aCkge1xuICAgICAgICB0aGlzLmNvbnRleHRJZCA9IHRoaXMuY29udGVudC5pZGVudGlmaWVyXG4gICAgICAgIHRoaXMuY29udGV4dFBhdGggPSB0aGlzLmNvbnRlbnQucHJpbWFyeUNhdGVnb3J5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgIGZvciAoY29uc3QgcHJvcGVydHkgaW4gY2hhbmdlcykge1xuICAgICAgaWYgKHByb3BlcnR5ID09PSAncmVzdW1lRGF0YScpIHtcbiAgICAgICAgLy8gdGhpcy5nZXRMYXN0UGxheWVkUmVzb3VyY2UoKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGdldCBpc0Vucm9sbGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmJhdGNoSWQgPyB0cnVlIDogZmFsc2VcbiAgfVxuXG4gIC8vIHByaXZhdGUgcHJvY2Vzc0NvbGxlY3Rpb25Gb3JUcmVlKCkge1xuICAvLyAgICAgdGhpcy5wYXRoU2V0ID0gbmV3IFNldCgpXG4gIC8vIH1cblxuICAvLyBnZXRMYXN0UGxheWVkUmVzb3VyY2UoKSB7XG4gIC8vICAgbGV0IGZpcnN0UGxheWFibGVDb250ZW50XG4gIC8vICAgbGV0IHJlc3VtZURhdGFWMjogYW55XG4gIC8vICAgaWYgKHRoaXMucmVzdW1lRGF0YSAmJiB0aGlzLnJlc3VtZURhdGEubGVuZ3RoID4gMCAmJiB0aGlzLmNvbnRlbnQpIHtcbiAgLy8gICAgIGlmICh0aGlzLmNvbnRlbnQuY29tcGxldGlvblBlcmNlbnRhZ2UgPT09IDEwMCkge1xuICAvLyAgICAgICByZXN1bWVEYXRhVjIgPSB0aGlzLmdldFJlc3VtZURhdGFGcm9tTGlzdCgnc3RhcnQnKVxuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgcmVzdW1lRGF0YVYyID0gdGhpcy5nZXRSZXN1bWVEYXRhRnJvbUxpc3QoKVxuICAvLyAgICAgfVxuICAvLyAgICAgdGhpcy5leHBhbmRUaGVQYXRoKHJlc3VtZURhdGFWMi5pZGVudGlmaWVyKVxuICAvLyAgIH0gZWxzZSB7XG4gIC8vICAgICBmaXJzdFBsYXlhYmxlQ29udGVudCA9IHRoaXMuY29udGVudFN2Yy5nZXRGaXJzdENoaWxkSW5IaWVyYXJjaHkodGhpcy5jb250ZW50KVxuICAvLyAgICAgdGhpcy5leHBhbmRUaGVQYXRoKGZpcnN0UGxheWFibGVDb250ZW50LmlkZW50aWZpZXIpXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gZXhwYW5kVGhlUGF0aChyZXNvdXJjZUlkOiBzdHJpbmcpIHtcbiAgLy8gICBpZiAodGhpcy5jb250ZW50ICYmIHJlc291cmNlSWQpIHtcbiAgLy8gICAgIGNvbnN0IHBhdGggPSB0aGlzLnV0aWxpdHlTdmMuZ2V0UGF0aCh0aGlzLmNvbnRlbnQsIHJlc291cmNlSWQpXG4gIC8vICAgICAvLyBjb25zb2xlLmxvZygnUGF0aCA6OiA6OiA6ICcsIHBhdGgpXG4gIC8vICAgICB0aGlzLnBhdGhTZXQgPSBuZXcgU2V0KHBhdGgubWFwKCh1OiB7IGlkZW50aWZpZXI6IGFueSB9KSA9PiB1LmlkZW50aWZpZXIpKVxuICAvLyAgICAgLy8gY29uc29sZS5sb2coJ3BhdGhTZXQgOjo6ICcsIHRoaXMucGF0aFNldClcbiAgLy8gICAgIC8vIHBhdGguZm9yRWFjaCgobm9kZTogSVZpZXdlclRvY0NhcmQpID0+IHtcbiAgLy8gICAgIC8vICAgdGhpcy5uZXN0ZWRUcmVlQ29udHJvbC5leHBhbmQobm9kZSlcbiAgLy8gICAgIC8vIH0pXG4gIC8vICAgfVxuICAvLyB9XG5cbiAgLy8gcHJpdmF0ZSBnZXRSZXN1bWVEYXRhRnJvbUxpc3QodHlwZT86IHN0cmluZykge1xuICAvLyAgIGlmICghdHlwZSkge1xuICAvLyAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm1heC1saW5lLWxlbmd0aFxuICAvLyAgICAgY29uc3QgbGFzdEl0ZW0gPSB0aGlzLnJlc3VtZURhdGEgJiYgdGhpcy5yZXN1bWVEYXRhLnNvcnQoKGE6IGFueSwgYjogYW55KSA9PlxuICAvLyBuZXcgRGF0ZShiLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkgLSBuZXcgRGF0ZShhLmxhc3RBY2Nlc3NUaW1lKS5nZXRUaW1lKCkpLnNoaWZ0KClcbiAgLy8gICAgIHJldHVybiB7XG4gIC8vICAgICAgIGlkZW50aWZpZXI6IGxhc3RJdGVtLmNvbnRlbnRJZCxcbiAgLy8gICAgICAgbWltZVR5cGU6IGxhc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBsYXN0SXRlbS5wcm9ncmVzc2RldGFpbHMubWltZVR5cGUsXG4gIC8vICAgICB9XG4gIC8vICAgfVxuXG4gIC8vICAgY29uc3QgZmlyc3RJdGVtID0gdGhpcy5yZXN1bWVEYXRhICYmIHRoaXMucmVzdW1lRGF0YS5sZW5ndGggJiYgdGhpcy5yZXN1bWVEYXRhWzBdXG4gIC8vICAgcmV0dXJuIHtcbiAgLy8gICAgIGlkZW50aWZpZXI6IGZpcnN0SXRlbS5jb250ZW50SWQsXG4gIC8vICAgICBtaW1lVHlwZTogZmlyc3RJdGVtLnByb2dyZXNzZGV0YWlscyAmJiBmaXJzdEl0ZW0ucHJvZ3Jlc3NkZXRhaWxzLm1pbWVUeXBlLFxuICAvLyAgIH1cbiAgLy8gfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIGlmICh0aGlzLnJvdXRlU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJvdXRlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gICAgaWYgKHRoaXMucm91dGVRdWVyeVN1YnNjcmlwdGlvbikge1xuICAgICAgdGhpcy5yb3V0ZVF1ZXJ5U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKClcbiAgICB9XG4gIH1cbn1cbiIsIjxkaXYgKm5nSWY9XCJjb250ZW50Py5jb3Vyc2VDYXRlZ29yeSA9PT0gJ0xlYXJuaW5nIFBhdGh3YXknICYmICBjb21wb25lbnROYW1lICE9PSAndmlld2VyJ1wiPlxuICAgIDwhLS0gTWlsZXN0b25lIC8gTGVhcm5pbmcgUGF0aCBVSSAtLT5cbiAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLXdyYXBwZXJcIiByb2xlPVwiZ3JvdXBcIiBhcmlhLWxhYmVsPVwiTGVhcm5pbmcgcGF0aCBtaWxlc3RvbmVzXCI+XG4gICAgICAgIDwhLS0gTGVhcm5pbmcgUGF0aCBIZWFkZXIgLS0+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsZWFybmluZy1wYXRoLWhlYWRlclwiPlxuICAgICAgICAgICAgPGgzIGNsYXNzPVwibGVhcm5pbmctcGF0aC10aXRsZVwiPkxlYXJuaW5nIFBhdGg8L2gzPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJsZWFybmluZy1wYXRoLXN1YnRpdGxlXCI+Q29tcGxldGUge3tjb250ZW50Py5jaGlsZHJlbj8ubGVuZ3RoIC0gMSB8fCAzfX0ga2V5IG1pbGVzdG9uZXM8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8uY2hpbGRyZW4/Lmxlbmd0aDsgZWxzZSBmYWxsYmFja01pbGVzdG9uZXNcIj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cIm1pbGVzdG9uZS1saXN0XCI+XG4gICAgICAgICAgICAgICAgPGxpICpuZ0Zvcj1cImxldCBtIG9mIGNvbnRlbnQ/LmNoaWxkcmVuOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJtaWxlc3RvbmUtaXRlbVwiXG4gICAgICAgICAgICAgICAgICAgIFtjbGFzcy5jb21wbGV0ZWRdPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwibT8ubmFtZSB8fCAoJ01pbGVzdG9uZSAnICsgKGkrMSkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nICpuZ0lmPVwibT8uY29tcGxldGlvblN0YXR1cyA9PT0gMlwiIHNyYz1cImFzc2V0cy9pY29ucy90b2MvdGljay1vcmFuZ2Uuc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1pbGVzdG9uZS1jaGVja21hcmtcIiBhbHQ9XCJDb21wbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJtPy5jb21wbGV0aW9uU3RhdHVzICE9PSAyXCIgY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+e3sgbT8ubmFtZSB9fTwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLXRlbXBsYXRlICNmYWxsYmFja01pbGVzdG9uZXM+XG4gICAgICAgICAgICA8dWwgY2xhc3M9XCJtaWxlc3RvbmUtbGlzdFwiPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1pbGVzdG9uZS1pdGVtIGNvbXBsZXRlZFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCJQcmUgQXNzZXNzbWVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+UHJlIEFzc2Vzc21lbnQ8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIm1pbGVzdG9uZS1pdGVtIGNvbXBsZXRlZFwiIHJvbGU9XCJsaXN0aXRlbVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWNpcmNsZVwiIGFyaWEtbGFiZWw9XCIxLiBGb3VuZGF0aW9uIG9mIFdvcmtwbGFjZSBFdGhpY3NcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ljb25zL3RvYy90aWNrLW9yYW5nZS5zdmdcIiBjbGFzcz1cIm1pbGVzdG9uZS1jaGVja21hcmtcIiBhbHQ9XCJDb21wbGV0ZWRcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1sYWJlbFwiPjEuIEZvdW5kYXRpb24gb2YgV29ya3BsYWNlIEV0aGljczwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW1cIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1jaXJjbGVcIiBhcmlhLWxhYmVsPVwiMi4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29ya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaWNvbnMvdG9jL3RpY2stb3JhbmdlLnN2Z1wiIGNsYXNzPVwibWlsZXN0b25lLWNoZWNrbWFya1wiIGFsdD1cIkNvbXBsZXRlZFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWlsZXN0b25lLWxhYmVsXCI+Mi4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29yazwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwibWlsZXN0b25lLWl0ZW1cIiByb2xlPVwibGlzdGl0ZW1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1jaXJjbGVcIiBhcmlhLWxhYmVsPVwiMy4gSGVhbHRoIGFuZCBQcm9kdWN0aXZpdHkgYXQgV29ya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtaWxlc3RvbmUtaW5kZXhcIj40PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1pbGVzdG9uZS1sYWJlbFwiPjMuIEhlYWx0aCBhbmQgUHJvZHVjdGl2aXR5IGF0IFdvcms8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cImJnZ3JleVwiPlxuICAgIDxkaXYgY2xhc3M9XCJweS00IGNvbnRlbnQtY29udGFpbmVyXCIgaWQ9XCJjb250ZW50Q29udGFpbmVyXCIgKm5nSWY9XCIhaXNQcmVBc3Nlc3NtZW50XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYWluLWNvbnRhaW5lciBmbGV4IGZsZXgtY29sIGdhcC00XCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBuc0NvbnRlbnQ/LkVQcmltYXJ5Q2F0ZWdvcnk/LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYWRkaW5nLWxlZnQtbSBmbGV4IGdhcC00IHRhYi1saXN0XCI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNPZkNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0YWItZGF0YVwiIChjbGljayk9XCIhdHlwZS5kaXNhYmxlZCAmJiBzZWxlY3RlZFRhYlR5cGUgPSB0eXBlLmlkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J2FjdGl2ZS10YWInOiBzZWxlY3RlZFRhYlR5cGUgPT09IHR5cGUuaWQsICdkaXNhYmxlZCc6dHlwZS5kaXNhYmxlZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj57e3R5cGUubmFtZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYlR5cGUgPT09ICdjb250ZW50JyAmJiBjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgPT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRUYWJUeXBlID09PSAnc2Vzc2lvbicgJiYgY29udGVudD8ucHJpbWFyeUNhdGVnb3J5ID09PSBuc0NvbnRlbnQ/LkVQcmltYXJ5Q2F0ZWdvcnk/LkJMRU5ERURfUFJPR1JBTVwiPlxuICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLWFwcC10b2Mtc2Vzc2lvbnMtbmV3IFtiYXRjaERhdGFdPVwiYmF0Y2hEYXRhXCIgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtyb290SWRdPVwiY29udGV4dElkXCJcbiAgICAgICAgICAgICAgICAgICAgW3Jvb3RDb250ZW50VHlwZV09XCJjb250ZXh0UGF0aFwiIFtiYXRjaElkXT1cImJhdGNoSWRcIiBbY29uZmlnXT1cImNvbmZpZ1wiIFtjb250ZW50XT1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8L3dzLXdpZGdldC1hcHAtYXBwLXRvYy1zZXNzaW9ucy1uZXc+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50Py5wcmltYXJ5Q2F0ZWdvcnkgIT09IG5zQ29udGVudD8uRVByaW1hcnlDYXRlZ29yeT8uQkxFTkRFRF9QUk9HUkFNXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdUZW1wbGF0ZU91dGxldF09XCJjb250ZW50QmxvY2tcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tIHt7cGF0aFNldHxqc29ufX0gLS0+XG4gICAgPG5nLXRlbXBsYXRlICNjb250ZW50QmxvY2s+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhY29udGVudExvYWRlclwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNvbnRlbnQ/LmNoaWxkcmVuPy5sZW5ndGg7IGVsc2Ugbm9DaGlsZHJlblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250ZW50LWNhcmQgXCJcbiAgICAgICAgICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNhcmQgb2YgY29udGVudD8uY2hpbGRyZW47IHRyYWNrQnk6IGNvbnRlbnRUcmFja0J5OyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2NvbnRlbnQtYWN0aXZlJzogcGF0aFNldCAmJiBwYXRoU2V0LmhhcyhjYXJkLmlkZW50aWZpZXIpICAmJiBpc0Vucm9sbGVkfVwiPlxuICAgICAgICAgICAgICAgICAgICA8IS0tIHt7Y2FyZHxqc29ufX0gLS0+XG4gICAgICAgICAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtleHBhbmRBbGxdPVwiZXhwYW5kQWxsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtjb21wb25lbnROYW1lXT1cImNvbXBvbmVudE5hbWVcIiBbZXhwYW5kQWN0aXZlXT1cInRydWVcIiBbcm9vdElkXT1cImNvbnRleHRJZFwiIFtiYXRjaElkXT1cImJhdGNoSWRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3Jvb3RDb250ZW50VHlwZV09XCJjb250ZXh0UGF0aFwiIFtjb250ZW50XT1cImNhcmRcIiBbbWxDb3Vyc2VdPVwiY29udGVudFwiIFtpbmRleF09XCJpKzFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3BhdGhTZXRdPVwicGF0aFNldFwiIFtoaWVyYXJjaHlNYXBEYXRhXT1cImhpZXJhcmNoeU1hcERhdGFcIiBbYmF0Y2hEYXRhXT1cImJhdGNoRGF0YVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCI+PC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbm9DaGlsZHJlbj5cbiAgICAgICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIWlzUGxheWFibGVcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIndzLW1hdC1wcmltYXJ5LWRlZmF1bHQtdGV4dCB3cy1tYXQtcHJpbWFyeS1saXRlLWJhY2tncm91bmQgcHgtNiBweS04IGZvbnQtbm9ybWFsIHRleHQtYmFzZSBub0NoaWxkcmVuXCI+XG4gICAgICAgICAgICAgICAgICAgIFRoZSBwcmV2aWV3IGZvciB0aGlzIHR5cGUgb2YgY29udGVudCBpcyB1bmF2YWlsYWJsZS4gUGxlYXNlIGNsaWNrIG9uIFN0YXJ0IGJ1dHRvbiBhYm92ZSB0byB2aWV3LlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdJZj1cImlzUGxheWFibGVcIiBbd3NSZXNvbHZlcldpZGdldF09XCJjb250ZW50UGxheVdpZGdldENvbmZpZ1wiPjwvbmctY29udGFpbmVyPiAtLT5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjb250ZW50TG9hZGVyXCI+XG4gICAgICAgICAgICA8d3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyLXNrZWxldG9uPjwvd3Mtd2lkZ2V0LWFwcC10b2MtY29udGVudC1jYXJkLXYyLXNrZWxldG9uPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxkaXYgKm5nSWY9XCJpc1ByZUFzc2Vzc21lbnRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtY2FyZCBcIlxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IGNhcmQgb2YgY29udGVudD8ucHJlRW5yb2xtZW50UmVzb3VyY2VzOyB0cmFja0J5OiBpZGVudGlmaWVyOyBsZXQgaSA9IGluZGV4O1wiXG4gICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdjb250ZW50LWFjdGl2ZSc6IHBhdGhTZXQgJiYgcGF0aFNldC5oYXMoY2FyZC5pZGVudGlmaWVyKSAgJiYgaXNFbnJvbGxlZH1cIj5cbiAgICAgICAgICAgIDwhLS0ge3tjYXJkfGpzb259fSAtLT5cbiAgICAgICAgICAgIDx3cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjIgW2ZvclByZXZpZXddPVwiZm9yUHJldmlld1wiIFtleHBhbmRBbGxdPVwiZXhwYW5kQWxsXCJcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50TmFtZV09XCJjb21wb25lbnROYW1lXCIgW2V4cGFuZEFjdGl2ZV09XCJ0cnVlXCIgW3Jvb3RJZF09XCJjb250ZXh0SWRcIiBbYmF0Y2hJZF09XCJiYXRjaElkXCJcbiAgICAgICAgICAgICAgICBbcm9vdENvbnRlbnRUeXBlXT1cImNvbnRleHRQYXRoXCIgW2lzUHJlQXNzZXNzbWVudF09XCJpc1ByZUFzc2Vzc21lbnRcIiBbY29udGVudF09XCJjYXJkXCJcbiAgICAgICAgICAgICAgICBbbWxDb3Vyc2VdPVwiY29udGVudFwiIFtpbmRleF09XCJpKzFcIiBbcGF0aFNldF09XCJwYXRoU2V0XCIgW2hpZXJhcmNoeU1hcERhdGFdPVwiaGllcmFyY2h5TWFwRGF0YVwiXG4gICAgICAgICAgICAgICAgW2JhdGNoRGF0YV09XCJiYXRjaERhdGFcIiBbYmFzZUNvbnRlbnRSZWFkRGF0YV09XCJiYXNlQ29udGVudFJlYWREYXRhXCI+PC93cy13aWRnZXQtYXBwLXRvYy1jb250ZW50LWNhcmQtdjI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19