simpo-component-library 3.7.7 → 3.7.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.
@@ -462,15 +462,15 @@ export class MyBookingsComponent {
462
462
  });
463
463
  }
464
464
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, deps: [{ token: i1.RestService }, { token: i2.StorageServiceService }, { token: i3.MessageService }, { token: i4.EventsService }], target: i0.ɵɵFactoryTarget.Component }); }
465
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.invoiceId && selected.status === 'COMPLETED'\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"downloadInvoice()\"\n >Download invoice</button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">&times;</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{background:#f6f2fc;border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
465
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: MyBookingsComponent, isStandalone: true, selector: "simpo-my-bookings", inputs: { data: "data" }, providers: [MessageService], viewQueries: [{ propertyName: "reschDayStripRef", first: true, predicate: ["reschDayStrip"], descendants: true }], ngImport: i0, template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.invoiceId && selected.status === 'COMPLETED'\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"downloadInvoice()\"\n >Download invoice</button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">&times;</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i7.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }] }); }
466
466
  }
467
467
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: MyBookingsComponent, decorators: [{
468
468
  type: Component,
469
- args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.invoiceId && selected.status === 'COMPLETED'\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"downloadInvoice()\"\n >Download invoice</button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">&times;</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{background:#f6f2fc;border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
469
+ args: [{ selector: 'simpo-my-bookings', standalone: true, imports: [CommonModule, MatIconModule, ToastModule], providers: [MessageService], template: "<p-toast position=\"bottom-right\"></p-toast>\n\n<div class=\"mb-root\">\n <ng-container *ngIf=\"currentTab === 'LIST'\">\n <div class=\"mb-title\">My Bookings</div>\n\n <div class=\"mb-tabs\">\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'upcoming'\" (click)=\"setProfTab('upcoming')\">Upcoming</button>\n <button type=\"button\" class=\"mb-tab\" [class.active]=\"profTab === 'past'\" (click)=\"setProfTab('past')\">Past</button>\n </div>\n\n <div class=\"mb-loading\" *ngIf=\"loading\">Loading your bookings\u2026</div>\n\n <div class=\"mb-rows\" *ngIf=\"!loading && !isEmpty\">\n <button type=\"button\" class=\"mb-row\" *ngFor=\"let b of rows\" (click)=\"viewBookingDetail(b)\">\n <div class=\"mb-row-stripe\" [ngClass]=\"b.mode === 'HOME_VISIT' ? 'stripe-home' : b.mode === 'VIDEO_CALL' ? 'stripe-video' : 'stripe-store'\"></div>\n <div class=\"mb-row-info\">\n <div class=\"mb-row-top\">\n <div class=\"mb-row-title\">{{title(b)}}</div>\n </div>\n <div class=\"mb-row-when\">{{when(b)}}</div>\n <div class=\"mb-row-detail\">{{detail(b)}}</div>\n </div>\n <div class=\"mb-row-end\">\n <span class=\"mb-status\" [ngClass]=\"statusClass(b.status)\">{{statusLabel(b.status)}}</span>\n </div>\n </button>\n </div>\n\n <div class=\"mb-empty\" *ngIf=\"isEmpty\">\n <mat-icon class=\"mb-empty-icon\">event_busy</mat-icon>\n <div class=\"mb-empty-title\">No {{profTab}} bookings yet.</div>\n </div>\n </ng-container>\n\n <ng-container *ngIf=\"currentTab === 'DETAIL' && selected\">\n <button type=\"button\" class=\"mb-back\" (click)=\"backToList()\">\n <mat-icon>arrow_back</mat-icon> Back to My Bookings\n </button>\n\n <div class=\"mb-detail-card\">\n <div class=\"mb-detail-header\">\n <div class=\"mb-detail-title-row\">\n <div class=\"mb-detail-title\">{{title(selected)}}</div>\n <span class=\"mb-status\" [ngClass]=\"statusClass(selected.status)\">{{statusLabel(selected.status)}}</span>\n </div>\n <div class=\"mb-detail-when\">{{when(selected)}}</div>\n </div>\n\n <div class=\"mb-detail-rows\">\n <div class=\"mb-detail-row\" *ngIf=\"selected.services?.length\">\n <div class=\"mb-detail-k\">Services</div>\n <div class=\"mb-detail-v\">{{serviceNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.productLines?.length\">\n <div class=\"mb-detail-k\">Products</div>\n <div class=\"mb-detail-v\">{{productNames(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.customerDetail\">\n <div class=\"mb-detail-k\">Contact</div>\n <div class=\"mb-detail-v\">{{selected.customerDetail?.name}} \u00B7 {{selected.customerDetail?.phoneNumber}} \u00B7 {{selected.customerDetail?.email}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.mode === 'HOME_VISIT' && selected.addressDetails\">\n <div class=\"mb-detail-k\">Address</div>\n <div class=\"mb-detail-v\">{{selected.addressDetails?.addressLine1}}, {{selected.addressDetails?.city}}, {{selected.addressDetails?.state}} {{selected.addressDetails?.zipCode}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"servicePriceTotal(selected) > 0\">\n <div class=\"mb-detail-k\">Service price</div>\n <div class=\"mb-detail-v\">\u20B9{{servicePriceTotal(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"selected.homeVisitCharge\">\n <div class=\"mb-detail-k\">Home visit charge</div>\n <div class=\"mb-detail-v\">\u20B9{{selected.homeVisitCharge}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Total</div>\n <div class=\"mb-detail-v\">\u20B9{{totalDue(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\">\n <div class=\"mb-detail-k\">Paid</div>\n <div class=\"mb-detail-v\">{{paidLabel(selected)}}</div>\n </div>\n <div class=\"mb-detail-row\" *ngIf=\"pendingAmount(selected) > 0\">\n <div class=\"mb-detail-k\">Pending at appointment</div>\n <div class=\"mb-detail-v\">\u20B9{{pendingAmount(selected)}}</div>\n </div>\n </div>\n\n <div class=\"mb-video-link\" *ngIf=\"selected.mode === 'VIDEO_CALL' && selected.videoCallLink && selected.status !== 'CANCELLED'\">\n <mat-icon>videocam</mat-icon>\n <a [href]=\"selected.videoCallLink\" target=\"_blank\">{{selected.videoCallLink}}</a>\n </div>\n\n <div class=\"mb-policy\" *ngIf=\"canRescheduleSelected\">\n <div class=\"mb-policy-title\">Reschedule policy</div>\n <div class=\"mb-policy-text\">You can reschedule this booking up to {{rescheduleCutoffHours}} hour{{rescheduleCutoffHours === 1 ? '' : 's'}} before the appointment time.</div>\n </div>\n <div class=\"mb-policy\" *ngIf=\"canCancelSelected && cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.status === 'BOOKED' || canCancelSelected\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"selected.status === 'BOOKED'\"\n [disabled]=\"!canRescheduleSelected\"\n [title]=\"!canRescheduleSelected ? selected.rescheduleBlockedReason : ''\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openReschedulePanel()\"\n >Reschedule booking</button>\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n *ngIf=\"canAddServiceSelected\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openAddServicePanel()\"\n >Add service</button>\n <button\n type=\"button\"\n class=\"mb-cancel-btn\"\n *ngIf=\"canCancelSelected\"\n [disabled]=\"cancelling\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"openCancelConfirm()\"\n >\n {{cancelling ? 'Cancelling\u2026' : 'Cancel booking'}}\n </button>\n </div>\n\n <div class=\"mb-actions-row\" *ngIf=\"selected.invoiceId && selected.status === 'COMPLETED'\">\n <button\n type=\"button\"\n class=\"mb-reschedule-btn\"\n [style.borderColor]=\"styles?.background?.accentColor\"\n [style.color]=\"styles?.background?.accentColor\"\n (click)=\"downloadInvoice()\"\n >Download invoice</button>\n </div>\n\n <div class=\"mb-cancelled-note\" *ngIf=\"selected.status === 'CANCELLED'\">This booking has been cancelled.</div>\n </div>\n </ng-container>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"reschedulePanelOpen\" (click)=\"closeReschedulePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Choose a new date &amp; time</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeReschedulePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-daystrip-row\">\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(-1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M15 18l-6-6 6-6\"></path></svg>\n </button>\n <div class=\"mb-resch-daystrip\" #reschDayStrip>\n <button\n type=\"button\"\n class=\"mb-resch-day\"\n *ngFor=\"let day of reschDays\"\n [class.active]=\"day.iso === reschSelectedIso\"\n [style.background]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"day.iso === reschSelectedIso ? styles?.background?.accentColor : null\"\n (click)=\"selectReschDay(day)\"\n >\n <span class=\"mb-resch-day-dow\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.dow}}</span>\n <span class=\"mb-resch-day-num\" [style.color]=\"day.iso === reschSelectedIso ? contrastColor : null\">{{day.num}}</span>\n </button>\n </div>\n <button type=\"button\" class=\"mb-resch-nav\" (click)=\"scrollReschDays(1)\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M9 18l6-6-6-6\"></path></svg>\n </button>\n </div>\n\n <div class=\"mb-resch-slots-loading\" *ngIf=\"reschLoadingSlots\">Loading available times\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!reschLoadingSlots && reschNoSlots\">No slots available on this date. Try another date.</div>\n <div class=\"mb-resch-slots\" *ngIf=\"!reschLoadingSlots && reschSlots.length\">\n <button\n type=\"button\"\n class=\"mb-resch-slot\"\n *ngFor=\"let slot of reschSlots\"\n [class.active]=\"slot === reschSelectedTime\"\n [style.background]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.borderColor]=\"slot === reschSelectedTime ? styles?.background?.accentColor : null\"\n [style.color]=\"slot === reschSelectedTime ? contrastColor : null\"\n (click)=\"selectReschTime(slot)\"\n >{{slot}}</button>\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"reschError\">{{reschError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeReschedulePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"reschInvalid\"\n [style.background]=\"reschInvalid ? null : styles?.background?.accentColor\"\n [style.color]=\"reschInvalid ? null : contrastColor\"\n (click)=\"confirmReschedule()\"\n >\n {{reschConfirming ? 'Confirming\u2026' : 'Confirm new slot'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"cancelConfirmOpen\" (click)=\"closeCancelConfirm()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Cancel this booking?</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeCancelConfirm()\">&times;</button>\n </div>\n <div class=\"mb-resch-body\">\n <div class=\"mb-policy-text\">This can't be undone.</div>\n <div class=\"mb-policy\" *ngIf=\"cancellationPolicy\">\n <div class=\"mb-policy-title\">{{cancellationPolicy.title}}</div>\n <div class=\"mb-policy-text\">{{cancellationPolicy.policyDetails}}</div>\n </div>\n </div>\n <div class=\"mb-resch-footer\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeCancelConfirm()\">Keep booking</button>\n <button type=\"button\" class=\"mb-resch-confirm\" [disabled]=\"cancelling\" (click)=\"cancelBooking()\">\n {{cancelling ? 'Cancelling\u2026' : 'Yes, cancel booking'}}\n </button>\n </div>\n </div>\n </div>\n\n <div class=\"mb-resch-backdrop\" *ngIf=\"addServicePanelOpen\" (click)=\"closeAddServicePanel()\">\n <div class=\"mb-resch-panel\" (click)=\"$event.stopPropagation()\">\n <div class=\"mb-resch-header\">\n <div class=\"mb-resch-title\">Add service(s)</div>\n <button type=\"button\" class=\"mb-resch-close\" (click)=\"closeAddServicePanel()\">&times;</button>\n </div>\n\n <div class=\"mb-resch-body\">\n <div class=\"mb-resch-slots-loading\" *ngIf=\"addServiceLoading\">Loading services\u2026</div>\n <div class=\"mb-resch-slots-empty\" *ngIf=\"!addServiceLoading && addServiceOptions.length === 0\">\n No services available to add right now.\n </div>\n\n <div class=\"mb-addsvc-list\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button\n type=\"button\"\n class=\"mb-addsvc-row\"\n [class.selected]=\"isAddServiceSelected(service)\"\n *ngFor=\"let service of addServiceOptions\"\n [disabled]=\"addServiceSubmitting\"\n (click)=\"toggleAddService(service)\"\n >\n <input type=\"checkbox\" class=\"mb-addsvc-checkbox\" [checked]=\"isAddServiceSelected(service)\" (click)=\"$event.stopPropagation()\" (change)=\"toggleAddService(service)\" />\n <div class=\"f1\">\n <div class=\"mb-addsvc-name\">\n {{service.name}}\n <span class=\"mb-addsvc-meta\" *ngIf=\"service.duration\">{{service.duration}} min</span>\n </div>\n </div>\n <div class=\"mb-addsvc-price\" *ngIf=\"service.priceDetails?.totalPrice\">\u20B9{{service.priceDetails.totalPrice}}</div>\n </button>\n </div>\n\n <div class=\"mb-addsvc-total\" *ngIf=\"addServiceSelected.length && addServiceTotalDeposit > 0\">\n Deposit due now: \u20B9{{addServiceTotalDeposit}}\n </div>\n\n <div class=\"mb-resch-error\" *ngIf=\"addServiceError\">{{addServiceError}}</div>\n </div>\n\n <div class=\"mb-resch-footer\" *ngIf=\"!addServiceLoading && addServiceOptions.length\">\n <button type=\"button\" class=\"mb-resch-cancel\" (click)=\"closeAddServicePanel()\">Cancel</button>\n <button\n type=\"button\"\n class=\"mb-resch-confirm\"\n [disabled]=\"!addServiceSelected.length || addServiceSubmitting\"\n [style.background]=\"!addServiceSelected.length ? null : styles?.background?.accentColor\"\n [style.color]=\"!addServiceSelected.length ? null : contrastColor\"\n (click)=\"addService()\"\n >\n {{addServiceSubmitting ? 'Adding\u2026' : 'Add ' + (addServiceSelected.length || '') + ' service' + (addServiceSelected.length === 1 ? '' : 's')}}\n </button>\n </div>\n </div>\n </div>\n</div>\n", styles: [".mb-root{display:flex;flex-direction:column;gap:16px;padding:4px 0 24px}.mb-title{font-size:20px;font-weight:600;color:#1b2436}.mb-tabs{display:flex;background:#f5f2ee;border-radius:8px;padding:4px;gap:4px;width:fit-content}.mb-tab{border:none;background:transparent;border-radius:6px;padding:8px 18px;font-size:13.5px;font-weight:500;color:#8a94a3;cursor:pointer}.mb-tab.active{background:#fff;color:#1b2436;font-weight:600;box-shadow:0 1px 3px #00000012}.mb-loading{font-size:13.5px;color:#8a94a3;padding:20px 0}.mb-rows{display:flex;flex-direction:column;gap:12px}.mb-row{border:1px solid #EEE9E3;border-radius:10px;padding:16px 18px;display:flex;align-items:flex-start;gap:14px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-row-stripe{width:3px;align-self:stretch;border-radius:999px;flex:none}.stripe-home{background:#16233a}.stripe-video{background:#7c3a11}.stripe-store{background:#8a94a3}.mb-row-info{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}.mb-row-title{font-size:14.5px;font-weight:600;color:#1b2436}.mb-row-when{font-size:12.5px;color:#6b7688}.mb-row-detail{font-size:12px;color:#8a94a3}.mb-row-end{flex:none}.mb-status{font-size:10.5px;letter-spacing:.06em;text-transform:uppercase;font-weight:600;border-radius:999px;padding:4px 9px;white-space:nowrap}.status-confirmed{background:#e8f4ee;color:#1e7a4b}.status-completed{background:#f2eee9;color:#8a7c6c}.status-cancelled{background:#fbedec;color:#b4432e}.status-pending{background:#fdf3e3;color:#b36b00}.status-ongoing{background:#e3f2fd;color:#1565c0}.mb-empty{display:flex;flex-direction:column;align-items:center;gap:10px;padding:50px 20px;text-align:center}.mb-empty-icon{font-size:40px!important;height:40px!important;width:40px!important;color:#c9b7a2!important}.mb-empty-title{font-size:14.5px;color:#8a94a3}.mb-back{display:flex;align-items:center;gap:6px;border:none;background:none;padding:0;cursor:pointer;font-size:12.5px;color:#7c3a11;margin-bottom:6px;width:fit-content}.mb-back mat-icon{font-size:16px!important;height:16px!important;width:16px!important}.mb-detail-card{border:1px solid #EEE9E3;border-radius:12px;padding:20px 22px;display:flex;flex-direction:column;gap:16px;background:#fff}.mb-detail-header{display:flex;flex-direction:column;gap:6px;padding-bottom:14px;border-bottom:1px solid #F0ECE7}.mb-detail-title-row{display:flex;align-items:center;gap:10px}.mb-detail-title{font-size:17px;font-weight:600;color:#1b2436}.mb-detail-when{font-size:13px;color:#6b7688}.mb-detail-rows{display:flex;flex-direction:column;gap:12px}.mb-detail-row{display:flex;justify-content:space-between;gap:16px;font-size:13px}.mb-detail-k{color:#8a94a3;flex:none}.mb-detail-v{color:#1b2436;font-weight:500;text-align:right}.mb-video-link{display:flex;align-items:center;gap:10px;padding:12px 14px;background:#f2f9f5;border-radius:8px;font-size:13px;color:#2c6a4b}.mb-video-link mat-icon{color:#1e7a4b!important;flex:none}.mb-policy{background:#fbfaf8;border:1px solid #EDE8E2;border-radius:8px;padding:12px 14px;display:flex;flex-direction:column;gap:4px}.mb-policy-title{font-size:12px;font-weight:600;color:#a08b72;text-transform:uppercase;letter-spacing:.06em}.mb-policy-text{font-size:12.5px;line-height:1.6;color:#5f6b7c}.mb-cancel-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-cancel-btn:disabled{opacity:.6;cursor:not-allowed}.mb-cancelled-note{font-size:13px;color:#b4432e;font-weight:600}.mb-actions-row{display:flex;gap:12px}.mb-actions-row .mb-reschedule-btn,.mb-actions-row .mb-cancel-btn{flex:1}.mb-reschedule-btn{height:46px;border:1.5px solid;border-radius:8px;background:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-reschedule-btn:disabled{opacity:.5;cursor:not-allowed}.mb-resch-backdrop{position:fixed;inset:0;background:#1b243673;display:flex;align-items:center;justify-content:center;padding:16px;z-index:1000}.mb-resch-panel{width:100%;max-width:440px;max-height:85vh;border-radius:14px;background:#fff;box-shadow:0 20px 50px #14141e40;display:flex;flex-direction:column;overflow:hidden}.mb-resch-header{display:flex;align-items:center;justify-content:space-between;padding:18px 20px;border-bottom:1px solid #F0ECE7;flex:none}.mb-resch-body{padding:18px 20px;overflow-y:auto}.mb-resch-footer{display:flex;gap:10px;padding:14px 20px;border-top:1px solid #F0ECE7;flex:none}.mb-resch-footer .mb-resch-cancel,.mb-resch-footer .mb-resch-confirm{flex:1}.mb-resch-cancel{height:46px;border:1.5px solid #E2E2E9;border-radius:8px;background:#fff;color:#5f6b7c;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-title{font-size:14px;font-weight:600;color:#1b2436}.mb-resch-close{border:none;background:none;font-size:18px;color:#8a94a3;cursor:pointer;line-height:1;width:max-content}.mb-resch-daystrip-row{display:flex;align-items:center;gap:4px;margin-bottom:14px}.mb-resch-daystrip{display:flex;gap:8px;overflow-x:auto;padding-bottom:4px;scroll-behavior:smooth}.mb-resch-daystrip::-webkit-scrollbar{height:5px}.mb-resch-daystrip::-webkit-scrollbar-thumb{background:#eee9e3;border-radius:999px}.mb-resch-nav{flex:none;width:26px!important;height:26px;border:1px solid #EEE9E3;border-radius:999px;background:#fff;color:#8a94a3;cursor:pointer;display:flex;align-items:center;justify-content:center}.mb-resch-nav:hover{border-color:#7c3a11;color:#7c3a11}.mb-resch-day{flex:none;display:flex;flex-direction:column;align-items:center;gap:2px;width:50px!important;padding:8px 0;border:1px solid #EEE9E3;border-radius:10px;background:#fff;cursor:pointer}.mb-resch-day:hover{border-color:#7c3a11}.mb-resch-day-dow{font-size:10.5px;color:#8a94a3;text-transform:uppercase}.mb-resch-day-num{font-size:13.5px;font-weight:600;color:#1b2436}.mb-resch-slots-loading,.mb-resch-slots-empty{font-size:12.5px;color:#8a94a3;margin-bottom:14px}.mb-resch-slots{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}.mb-resch-slot{padding:9px 6px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;font-size:12.5px!important;color:#1b2436;cursor:pointer}.mb-resch-error{margin-top:14px;font-size:12.5px;color:#b4432e}.mb-addsvc-list{display:flex;flex-direction:column;gap:8px}.mb-addsvc-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:11px 12px;border:1px solid #EEE9E3;border-radius:8px;background:#fff;cursor:pointer;text-align:left;width:100%}.mb-addsvc-row.selected{border-color:#6d28d9}.mb-addsvc-row:disabled{opacity:.6;cursor:default}.mb-addsvc-checkbox{flex:none;width:16px;height:16px;cursor:pointer}.mb-addsvc-row .f1{flex:1}.mb-addsvc-name{font-size:13px;color:#1b2436}.mb-addsvc-meta{display:block;font-size:11.5px;color:#8a94a3;margin-top:2px}.mb-addsvc-price{font-size:13px;font-weight:600;color:#1b2436;flex:none}.mb-addsvc-total{margin-top:12px;font-size:12.5px;font-weight:600;color:#1b2436}.mb-resch-confirm{height:46px;border:none;border-radius:8px;background:#94a3b8;color:#fff;font-size:13.5px;font-weight:600;cursor:pointer}.mb-resch-confirm:disabled{opacity:.5;cursor:not-allowed}\n"] }]
470
470
  }], ctorParameters: () => [{ type: i1.RestService }, { type: i2.StorageServiceService }, { type: i3.MessageService }, { type: i4.EventsService }], propDecorators: { data: [{
471
471
  type: Input
472
472
  }], reschDayStripRef: [{
473
473
  type: ViewChild,
474
474
  args: ['reschDayStrip']
475
475
  }] } });
476
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQXFDNUM7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQ21CLFdBQXdCLEVBQ3hCLGNBQXFDLEVBQ3JDLGNBQThCLEVBQzlCLGFBQTRCO1FBSDVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEyQi9DLGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLFlBQU8sR0FBd0IsVUFBVSxDQUFDO1FBQzFDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFD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MEZBSm5CLENBQUMsY0FBYyxDQUFDLDZJQ3JEN0Isd2lkQW1TQSw4OE5EL09ZLFlBQVksNlZBQUUsYUFBYSxtTEFBRSxXQUFXOzs0RkFLdkMsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUN4QyxDQUFDLGNBQWMsQ0FBQzs2S0FZbEIsSUFBSTtzQkFBWixLQUFLO2dCQXNDc0IsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XG5cbmludGVyZmFjZSBCb29raW5nUm93IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIGVuZFRpbWU/OiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0JPT0tFRCcgfCAnSE9MRCcgfCAnT05HT0lORycgfCAnQ09NUExFVEVEJyB8ICdDQU5DRUxMRUQnO1xuICBzdG9yZU5hbWU/OiBzdHJpbmc7XG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgYWRkcmVzc0RldGFpbHM/OiB7IHJlY2VpdmVyTmFtZTogc3RyaW5nOyByZWNlaXZlclBob25lOiBzdHJpbmc7IGFkZHJlc3NMaW5lMTogc3RyaW5nOyBhZGRyZXNzTGluZTI/OiBzdHJpbmc7IGNpdHk6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgemlwQ29kZTogc3RyaW5nIH07XG4gIHByb2R1Y3RMaW5lcz86IHsgaXRlbU5hbWU6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9W107XG4gIC8qKiBOb3QgcGFydCBvZiB0aGUgR0VUIC9ib29raW5nL2dyb3VwL215IHJlc3BvbnNlIC0gc2VydmljZXMgbGl2ZSBvbiB0aGUgc2VwYXJhdGVcbiAgICogQm9va2luZ0RldGFpbCBjb2xsZWN0aW9uIChGSydkIHZpYSBzZXJ2aWNlTGluZUlkcywgbm90IGRlbm9ybWFsaXplZCBvbnRvIEJvb2tpbmdHcm91cCksIHNvXG4gICAqIHRoaXMgaXMgZmlsbGVkIGluIGNsaWVudC1zaWRlIGFmdGVyIGxvYWQoKSB2aWEgYSBwZXItcm93IEdFVCAuLi4vbGluZXMgY2FsbC4gKi9cbiAgc2VydmljZXM/OiB7IG5hbWU6IHN0cmluZzsgZHVyYXRpb25NaW51dGVzOiBudW1iZXI7IHByaWNlOiBudW1iZXIgfVtdO1xuICB2aWRlb0NhbGxMaW5rPzogc3RyaW5nO1xuICB0b3RhbENvbGxlY3RlZEF0Qm9va2luZz86IG51bWJlcjtcbiAgdG90YWxQYXlhYmxlPzogbnVtYmVyO1xuICBob21lVmlzaXRDaGFyZ2U/OiBudW1iZXI7XG4gIC8qKiBQcmVzZW5jZSAob25jZSB0aGUgYm9va2luZyBpcyBDT01QTEVURUQpIGlzIHRoZSBzaWduYWwgdG8gc2hvdyBcIkRvd25sb2FkIEludm9pY2VcIiAtIHRoZSBQREZcbiAgICogdXJsIGl0c2VsZiBpcyBmZXRjaGVkIG9uLWRlbWFuZCB2aWEgcmVzdFNlcnZpY2UuZ2V0Qm9va2luZ0ludm9pY2VVcmwsIG5vdCBzdG9yZWQgb24gdGhlIHJvdy4gKi9cbiAgaW52b2ljZUlkPzogc3RyaW5nO1xuICAvKiogVHJhbnNpZW50LCBjb21wdXRlZCBvbiBldmVyeSBiYWNrZW5kIHJlYWQgb2YgdGhpcyBncm91cCAtIHNlZSBCb29raW5nR3JvdXAjY2FuUmVzY2hlZHVsZS4gKi9cbiAgY2FuUmVzY2hlZHVsZT86IGJvb2xlYW47XG4gIHJlc2NoZWR1bGVCbG9ja2VkUmVhc29uPzogc3RyaW5nO1xuICAvKiogTm90IHBhcnQgb2YgdGhlIEdFVCAvYm9va2luZy9ncm91cC9teSByZXNwb25zZSBlaXRoZXIgLSByZXNvbHZlZCBsYXppbHksIG9uY2UsIHRoZSBmaXJzdFxuICAgKiB0aW1lIHRoaXMgYm9va2luZydzIGRldGFpbCBpcyB2aWV3ZWQgKHNlZSB2aWV3Qm9va2luZ0RldGFpbCgpKSwgc28gdGhlIFwiQWRkIHNlcnZpY2VcIiBhY3Rpb25cbiAgICogb25seSBzaG93cyB3aGVuIHRoZXJlJ3MgYWN0dWFsbHkgc29tZXRoaW5nIGxlZnQgdG8gYWRkLiB1bmRlZmluZWQgPSBub3QgY2hlY2tlZCB5ZXQuICovXG4gIGFkZFNlcnZpY2VBdmFpbGFibGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFwiTXkgQm9va2luZ3NcIiAtIGEgY3VzdG9tZXIncyBvd24gYm9va2luZyBoaXN0b3J5IChVcGNvbWluZy9QYXN0KSwgYSBkZXRhaWwgdmlldyBwZXIgYm9va2luZyxcbiAqIGFuZCBjYW5jZWxsYXRpb24uIFRoZSBsaXN0IGVuZHBvaW50IHJldHVybnMgZnVsbCBCb29raW5nR3JvdXAgcmVjb3JkcyAtIGVub3VnaCBmb3JcbiAqIGRhdGUvc3RhdHVzL2FkZHJlc3MvcHJvZHVjdHMgLSBidXQgc2VydmljZXMgYm9va2VkIGFyZW4ndCBvbiB0aGF0IHJlY29yZCAoc2VlIEJvb2tpbmdSb3cuc2VydmljZXNcbiAqIGFib3ZlKSwgc28gbG9hZCgpIGlzc3VlcyBvbmUgZXh0cmEgR0VUIC4uLi9saW5lcyBjYWxsIHBlciByb3cgdG8gZmlsbCB0aGVtIGluLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1teS1ib29raW5ncycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFRvYXN0TW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTXlCb29raW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50c1NlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBzdHlsZXM6IGFueTtcblxuICAvKiogU2FtZSBjb250cmFzdCBhbGdvcml0aG0gYXMgQ29sb3JEaXJlY3RpdmUgKGRpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUudHMpIC0gcmVpbXBsZW1lbnRlZCBhc1xuICAgKiBhIHB1cmUgZ2V0dGVyIHJhdGhlciB0aGFuIHJldXNpbmcgdGhhdCBkaXJlY3RpdmUgZGlyZWN0bHksIHNpbmNlIGl0cyBbc2ltcG9Db2xvcl0gb25seSBldmVyXG4gICAqICpzZXRzKiBhIGNvbXB1dGVkIGNvbG9yIGFuZCBuZXZlciBjbGVhcnMgaXQsIHdoaWNoIHdvdWxkIGxlYXZlIGEgc3RhbGUgY29sb3Igc3R1Y2sgb24gYVxuICAgKiBjaGlwIGFmdGVyIGl0IHRvZ2dsZXMgZnJvbSBhY3RpdmUgYmFjayB0byBpbmFjdGl2ZS4gRXZlcnkgYWNjZW50LWNvbG9yZWQgZWxlbWVudCBoZXJlIGlzXG4gICAqIGVpdGhlciBhbHdheXMtb24gKG5ldmVyIHRvZ2dsZXMpIG9yIGRyaXZlbiBieSB0aGlzIHNhbWUgZ2V0dGVyLCBzbyB0aGVyZSdzIGV4YWN0bHkgb25lXG4gICAqIGRlZmluaXRpb24gb2YgXCJ3aGF0IHRleHQgY29sb3IgZ29lcyBvbiB0aGUgYWNjZW50IGNvbG9yXCIgaW4gdGhpcyBmaWxlLiAqL1xuICBnZXQgY29udHJhc3RDb2xvcigpOiBzdHJpbmcge1xuICAgIGxldCBoZXggPSB0aGlzLnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3I7XG4gICAgaWYgKCFoZXgpIHJldHVybiAnI2ZmZmZmZic7XG4gICAgaWYgKGhleC5sZW5ndGggPCA2KSB7XG4gICAgICBsZXQgZXhwYW5kZWQgPSAnIyc7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhleC5sZW5ndGg7IGkrKykgZXhwYW5kZWQgKz0gaGV4W2ldICsgaGV4W2ldO1xuICAgICAgaGV4ID0gZXhwYW5kZWQ7XG4gICAgfVxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LCA3KSwgMTYpO1xuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMzAgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBjdXJyZW50VGFiOiAnTElTVCcgfCAnREVUQUlMJyA9ICdMSVNUJztcbiAgcHJvZlRhYjogJ3VwY29taW5nJyB8ICdwYXN0JyA9ICd1cGNvbWluZyc7XG4gIGxvYWRpbmcgPSB0cnVlO1xuICBjYW5jZWxsaW5nID0gZmFsc2U7XG4gIGNhbmNlbENvbmZpcm1PcGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhbGxCb29raW5nczogQm9va2luZ1Jvd1tdID0gW107XG4gIHVwY29taW5nOiBCb29raW5nUm93W10gPSBbXTtcbiAgcGFzdDogQm9va2luZ1Jvd1tdID0gW107XG4gIHNlbGVjdGVkOiBCb29raW5nUm93IHwgbnVsbCA9IG51bGw7XG4gIGNhbmNlbGxhdGlvblBvbGljeTogeyB0aXRsZTogc3RyaW5nOyBwb2xpY3lEZXRhaWxzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICByZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPSAyNDtcblxuICAvLyBSZXNjaGVkdWxlIHBhbmVsIC0gZGF0ZSBzdHJpcCArIHNsb3QgZ3JpZCwgbWF0Y2hpbmcgdGhlIGFkbWluIHNpZGUncyBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQuXG4gIEBWaWV3Q2hpbGQoJ3Jlc2NoRGF5U3RyaXAnKSByZXNjaERheVN0cmlwUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIHJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgcmVzY2hEYXlzOiB7IGlzbzogc3RyaW5nOyBkb3c6IHN0cmluZzsgbnVtOiBzdHJpbmcgfVtdID0gW107XG4gIHJlc2NoU2VsZWN0ZWRJc28gPSAnJztcbiAgcmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgcmVzY2hTbG90czogc3RyaW5nW10gPSBbXTtcbiAgcmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgcmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gIHJlc2NoRXJyb3IgPSAnJztcbiAgcmVzY2hOb1Nsb3RzID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgPz8gJyc7XG4gICAgY29uc3QgdXNlcklkID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpPy51c2VySWQgPz8gJyc7XG4gICAgaWYgKCFidXNpbmVzc0lkIHx8ICF1c2VySWQpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldE15Qm9va2luZ3MoYnVzaW5lc3NJZCwgdXNlcklkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzID0gKHJlcyA/PyBbXSkgYXMgQm9va2luZ1Jvd1tdO1xuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9hZFNlcnZpY2VMaW5lcygpO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRDYW5jZWxsYXRpb25Qb2xpY3koYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsYXRpb25Qb2xpY3kgPSAocmVzID8/IFtdKVswXSA/PyBudWxsO1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIHRoZSBkZXRhaWwgdmlldyBqdXN0IHdvbid0IHNob3cgYSBwb2xpY3kgbm90ZS5cbiAgICB9KTtcblxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QnVzaW5lc3NBcHBvaW50bWVudFNldHRpbmdzKGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gcmVzPy5yZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPz8gMjQ7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgLy8gTm9uLWZhdGFsIC0gZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBjdXRvZmYgdXNlZCBmb3IgZGlzcGxheSBvbmx5OyB0aGUgYmFja2VuZCBpcyB0aGVcbiAgICAgIC8vIHJlYWwgc291cmNlIG9mIHRydXRoIGFuZCBlbmZvcmNlcyBpdHMgb3duIGFjdHVhbCBjb25maWd1cmVkIHZhbHVlIHJlZ2FyZGxlc3MuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzVXBjb21pbmcoYjogQm9va2luZ1Jvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKGIuc3RhdHVzID09PSAnSE9MRCcgfHwgYi5zdGF0dXMgPT09ICdCT09LRUQnIHx8IGIuc3RhdHVzID09PSAnUEVORElORycgfHwgYi5zdGF0dXMgPT09ICdPTkdPSU5HJykgJiYgbmV3IERhdGUoYi5ib29raW5nRGF0ZSkgPj0gdG9kYXk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0Qm9va2luZ3MoKSB7XG4gICAgdGhpcy51cGNvbWluZyA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiB0aGlzLmlzVXBjb21pbmcoYikpO1xuICAgIHRoaXMucGFzdCA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiAhdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgfVxuXG4gIC8qKiBPbmUgYm9va2luZyBoaXN0b3J5IGxvYWQsIGJvdW5kZWQgdG8gdGhpcyBjdXN0b21lcidzIG93biBib29raW5ncyAtIGEgcGVyLXJvdyBjYWxsIGhlcmUgaXNcbiAgICogZmluZSwgdW5saWtlIGFuIHVuYm91bmRlZC9wYWdpbmF0ZWQgbGlzdC4gRmFpbHVyZXMgYXJlIHN3YWxsb3dlZCBwZXItcm93IChmYWxscyBiYWNrIHRvIG5vXG4gICAqIHNlcnZpY2UgbmFtZXMgZm9yIHRoYXQgcm93KSByYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgd2hvbGUgcGFnZSBvbiBvbmUgYmFkIGdyb3VwLiAqL1xuICBwcml2YXRlIGxvYWRTZXJ2aWNlTGluZXMoKSB7XG4gICAgaWYgKCF0aGlzLmFsbEJvb2tpbmdzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvcmtKb2luKFxuICAgICAgdGhpcy5hbGxCb29raW5ncy5tYXAoKGIpID0+XG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0R3JvdXBMaW5lcyhiLmdyb3VwSWQpLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihbXSkpKVxuICAgICAgKVxuICAgICkuc3Vic2NyaWJlKChhbGxMaW5lczogYW55W10pID0+IHtcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MuZm9yRWFjaCgoYiwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGFsbExpbmVzW2ldID8/IFtdO1xuICAgICAgICBiLnNlcnZpY2VzID0gbGluZXMuZmxhdE1hcCgobDogYW55KSA9PiAobC5zZXJ2aWNlcyA/PyBbXSkubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLCBkdXJhdGlvbk1pbnV0ZXM6IHMuZHVyYXRpb25NaW51dGVzLCBwcmljZTogcy5wcmljZVxuICAgICAgICB9KSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcm93cygpOiBCb29raW5nUm93W10ge1xuICAgIHJldHVybiB0aGlzLnByb2ZUYWIgPT09ICd1cGNvbWluZycgPyB0aGlzLnVwY29taW5nIDogdGhpcy5wYXN0O1xuICB9XG4gIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5sb2FkaW5nICYmIHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gIH1cblxuICBzZXRQcm9mVGFiKHRhYjogJ3VwY29taW5nJyB8ICdwYXN0Jykge1xuICAgIHRoaXMucHJvZlRhYiA9IHRhYjtcbiAgfVxuXG4gIHByb2R1Y3ROYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGIucHJvZHVjdExpbmVzID8/IFtdKS5tYXAoKHApID0+IHAuaXRlbU5hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuICB9XG4gIHNlcnZpY2VOYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGIuc2VydmljZXMgPz8gW10pLm1hcCgocykgPT4gcy5uYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgfVxuICB0aXRsZShiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlTGFiZWwgPSBiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyA/ICdIb21lIFZpc2l0JyA6IGIubW9kZSA9PT0gJ1ZJREVPX0NBTEwnID8gJ1ZpZGVvIENhbGwnIDogJ1N0b3JlIFZpc2l0JztcbiAgICBjb25zdCBpdGVtcyA9IFt0aGlzLnNlcnZpY2VOYW1lcyhiKSwgdGhpcy5wcm9kdWN0TmFtZXMoYildLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuICAgIHJldHVybiBpdGVtcyA/IGAke21vZGVMYWJlbH0gwrcgJHtpdGVtc31gIDogbW9kZUxhYmVsO1xuICB9XG4gIHdoZW4oYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIHJldHVybiBiLnN0YXJ0VGltZSA/IGAke2RhdGV9IMK3ICR7Yi5zdGFydFRpbWV9YCA6IGRhdGU7XG4gIH1cbiAgZGV0YWlsKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGlmIChiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBiLmFkZHJlc3NEZXRhaWxzKSByZXR1cm4gYCR7Yi5hZGRyZXNzRGV0YWlscy5jaXR5fSwgJHtiLmFkZHJlc3NEZXRhaWxzLnN0YXRlfWA7XG4gICAgaWYgKGIubW9kZSA9PT0gJ1NUT1JFX1ZJU0lUJyAmJiBiLnN0b3JlTmFtZSkgcmV0dXJuIGIuc3RvcmVOYW1lO1xuICAgIHJldHVybiBiLmN1c3RvbWVyRGV0YWlsPy5uYW1lID8/ICcnO1xuICB9XG4gIHN0YXR1c0xhYmVsKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3RhdHVzID09PSAnQ09NUExFVEVEJykgcmV0dXJuICdDb21wbGV0ZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gJ0NhbmNlbGxlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0hPTEQnIHx8IHN0YXR1cyA9PT0gJ1BFTkRJTkcnKSByZXR1cm4gJ1BheW1lbnQgUGVuZGluZyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ09OR09JTkcnKSByZXR1cm4gJ0luIFByb2dyZXNzJztcbiAgICByZXR1cm4gJ0NvbmZpcm1lZCc7XG4gIH1cbiAgc3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzdGF0dXMgPT09ICdDT01QTEVURUQnKSByZXR1cm4gJ3N0YXR1cy1jb21wbGV0ZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gJ3N0YXR1cy1jYW5jZWxsZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdzdGF0dXMtcGVuZGluZyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ09OR09JTkcnKSByZXR1cm4gJ3N0YXR1cy1vbmdvaW5nJztcbiAgICByZXR1cm4gJ3N0YXR1cy1jb25maXJtZWQnO1xuICB9XG4gIHBhaWRMYWJlbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyAmJiBiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nID4gMCA/IGDigrkke2IudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmd9YCA6ICdOb3RoaW5nIOKAlCBmcmVlJztcbiAgfVxuICBzZXJ2aWNlUHJpY2VUb3RhbChiOiBCb29raW5nUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGIuc2VydmljZXMgPz8gW10pLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyAocy5wcmljZSB8fCAwKSwgMCk7XG4gIH1cbiAgdG90YWxEdWUoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChiLnRvdGFsUGF5YWJsZSA/PyAwKSArIChiLmhvbWVWaXNpdENoYXJnZSA/PyAwKTtcbiAgfVxuICBwZW5kaW5nQW1vdW50KGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLnRvdGFsRHVlKGIpIC0gKGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgPz8gMCkpO1xuICB9XG4gIC8qKiBGZXRjaGVkIG9uIGNsaWNrLCBub3QgcHJlLWNhY2hlZCAtIGVjb21tZXJjZSBnZW5lcmF0ZXMvY2FjaGVzIHRoZSBpbnZvaWNlIFBERiB0aGUgZmlyc3QgdGltZVxuICAgKiBpdCdzIGFza2VkIGZvciwgc28gdGhlcmUncyBub3RoaW5nIHRvIGdhaW4gYnkgZmV0Y2hpbmcgaXQgZWFybGllci4gU2FtZSBTMyBQREYgdXJsIHBhdHRlcm5cbiAgICogZWNvbW1lcmNlJ3Mgb3duIG9yZGVyLWRldGFpbHMuY29tcG9uZW50LnRzIHJlYWRzIGludm9pY2VVcmwvcmVjZWlwdFVybCBmcm9tLCBqdXN0IHJlc29sdmVkXG4gICAqIGxpdmUgaGVyZSBpbnN0ZWFkIG9mIGJlaW5nIHByZXNlbnQgb24gdGhlIHJvdyBhbHJlYWR5LiAqL1xuICBkb3dubG9hZEludm9pY2UoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkPy5pbnZvaWNlSWQpIHJldHVybjtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJvb2tpbmdJbnZvaWNlVXJsKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh1cmw6IGFueSkgPT4ge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnSW52b2ljZSBub3QgYXZhaWxhYmxlIHlldCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/LmRldGFpbCA/PyAnVW5hYmxlIHRvIGZldGNoIGludm9pY2UnIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBnZXQgY2FuQ2FuY2VsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdIT0xEJyB8fCB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdQRU5ESU5HJyk7XG4gIH1cbiAgZ2V0IGNhblJlc2NoZWR1bGVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyAmJiAhIXRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZTtcbiAgfVxuICBnZXQgY2FuQWRkU2VydmljZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnICYmICEhdGhpcy5zZWxlY3RlZC5hZGRTZXJ2aWNlQXZhaWxhYmxlO1xuICB9XG5cbiAgdmlld0Jvb2tpbmdEZXRhaWwoYjogQm9va2luZ1Jvdykge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdERVRBSUwnO1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2hlY2tBZGRTZXJ2aWNlQXZhaWxhYmlsaXR5KGIpO1xuICB9XG5cbiAgLyoqIExhenksIGNhY2hlZCBvbiB0aGUgcm93IC0gb25seSBldmVyIHF1ZXJpZWQgb25jZSBwZXIgYm9va2luZyAocmUtcXVlcmllZCBhZnRlciBhIHN1Y2Nlc3NmdWxcbiAgICogYWRkLCBzaW5jZSB3aGF0J3MgYWRkYWJsZSBqdXN0IGNoYW5nZWQpLiBCZXN0LWVmZm9ydDogYSBmYWlsdXJlIGp1c3QgbGVhdmVzIHRoZSBhY3Rpb25cbiAgICogaGlkZGVuLCBzYW1lIGFzIHRoaXMgY29tcG9uZW50J3Mgb3RoZXIgbm9uLWNyaXRpY2FsIGxvb2t1cHMuICovXG4gIHByaXZhdGUgY2hlY2tBZGRTZXJ2aWNlQXZhaWxhYmlsaXR5KGI6IEJvb2tpbmdSb3cpIHtcbiAgICBpZiAoYi5zdGF0dXMgIT09ICdCT09LRUQnIHx8IGIuYWRkU2VydmljZUF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBZGRTZXJ2aWNlT3B0aW9ucyhiLmdyb3VwSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGIuYWRkU2VydmljZUF2YWlsYWJsZSA9IChyZXMgPz8gW10pLmxlbmd0aCA+IDA7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgYi5hZGRTZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgYmFja1RvTGlzdCgpIHtcbiAgICB0aGlzLmN1cnJlbnRUYWIgPSAnTElTVCc7XG4gICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzY2hlZHVsZVxuXG4gIG9wZW5SZXNjaGVkdWxlUGFuZWwoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gJyc7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5idWlsZFJlc2NoRGF5U3RyaXAoKTtcbiAgICBpZiAodGhpcy5yZXNjaERheXMubGVuZ3RoKSB0aGlzLnNlbGVjdFJlc2NoRGF5KHRoaXMucmVzY2hEYXlzWzBdKTtcbiAgfVxuICBjbG9zZVJlc2NoZWR1bGVQYW5lbCgpIHtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZXNjaERheVN0cmlwKCkge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnJlc2NoRGF5cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSArIGkpO1xuICAgICAgdGhpcy5yZXNjaERheXMucHVzaCh7XG4gICAgICAgIGlzbzogZC50b0lTT1N0cmluZygpLFxuICAgICAgICBkb3c6IGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1JTicsIHsgd2Vla2RheTogJ3Nob3J0JyB9KSxcbiAgICAgICAgbnVtOiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IGRheTogJ251bWVyaWMnIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1vdXNlIHVzZXJzIGhhdmUgbm8gc3dpcGUvdHJhY2twYWQgZ2VzdHVyZSBmb3IgdGhlIGhvcml6b250YWxseS1zY3JvbGxpbmcgZGF5IHN0cmlwIC0gZ2l2ZVxuICAgKiB0aGVtIGV4cGxpY2l0IHByZXYvbmV4dCBhcnJvd3MgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHNoaWZ0K3doZWVsIChtYXRjaGVzIHRoZSBhZG1pbiBzaWRlJ3NcbiAgICogUmVzY2hlZHVsZUFwcG9pbnRtZW50Q29tcG9uZW50I3Njcm9sbERheXMpLiAqL1xuICBzY3JvbGxSZXNjaERheXMoZGlyZWN0aW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMucmVzY2hEYXlTdHJpcFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc2Nyb2xsQnkoeyBsZWZ0OiBkaXJlY3Rpb24gKiAxNjAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIHNlbGVjdFJlc2NoRGF5KGRheTogeyBpc286IHN0cmluZyB9KSB7XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkSXNvID0gZGF5LmlzbztcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gJyc7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5mZXRjaFJlc2NoU2xvdHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hSZXNjaFNsb3RzKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSB0cnVlO1xuICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gZmFsc2U7XG4gICAgdGhpcy5yZXNjaFNsb3RzID0gW107XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZXNjaGVkdWxlU2xvdHModGhpcy5zZWxlY3RlZC5ncm91cElkLCB0aGlzLnJlc2NoU2VsZWN0ZWRJc28pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hTbG90cyA9IHJlcyA/PyBbXTtcbiAgICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gdGhpcy5yZXNjaFNsb3RzLmxlbmd0aCA9PT0gMDtcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc2NoTG9hZGluZ1Nsb3RzID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoTm9TbG90cyA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RSZXNjaFRpbWUodGltZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSA9IHRpbWU7XG4gIH1cblxuICBnZXQgcmVzY2hJbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5yZXNjaFNlbGVjdGVkSXNvIHx8ICF0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lIHx8IHRoaXMucmVzY2hDb25maXJtaW5nO1xuICB9XG5cbiAgY29uZmlybVJlc2NoZWR1bGUoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMucmVzY2hJbnZhbGlkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzY2hFcnJvciA9ICcnO1xuICAgIHRoaXMucmVzdFNlcnZpY2UucmVzY2hlZHVsZUJvb2tpbmcodGhpcy5zZWxlY3RlZC5ncm91cElkLCB0aGlzLnJlc2NoU2VsZWN0ZWRJc28sIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUpLnN1YnNjcmliZSgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5ib29raW5nRGF0ZSA9IGdyb3VwPy5ib29raW5nRGF0ZSA/PyB0aGlzLnJlc2NoU2VsZWN0ZWRJc287XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3RhcnRUaW1lID0gZ3JvdXA/LnN0YXJ0VGltZSA/PyB0aGlzLnNlbGVjdGVkLnN0YXJ0VGltZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbmRUaW1lID0gZ3JvdXA/LmVuZFRpbWUgPz8gdGhpcy5zZWxlY3RlZC5lbmRUaW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmNhblJlc2NoZWR1bGUgPSBncm91cD8uY2FuUmVzY2hlZHVsZSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA9IGdyb3VwPy5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA/PyAnJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyByZXNjaGVkdWxlZCcgfSk7XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoRXJyb3IgPSBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VuYWJsZSB0byByZXNjaGVkdWxlIHRoaXMgYm9va2luZyc7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRkIFNlcnZpY2VcblxuICBhZGRTZXJ2aWNlUGFuZWxPcGVuID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VMb2FkaW5nID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBhZGRTZXJ2aWNlU2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIGFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VFcnJvciA9ICcnO1xuXG4gIG9wZW5BZGRTZXJ2aWNlUGFuZWwoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5hZGRTZXJ2aWNlUGFuZWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9ICcnO1xuICAgIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkID0gW107XG4gICAgdGhpcy5hZGRTZXJ2aWNlTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBZGRTZXJ2aWNlT3B0aW9ucyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkU2VydmljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRkU2VydmljZU9wdGlvbnMgPSByZXMgPz8gW107XG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlT3B0aW9ucyA9IFtdO1xuICAgIH0pO1xuICB9XG4gIGNsb3NlQWRkU2VydmljZVBhbmVsKCkge1xuICAgIHRoaXMuYWRkU2VydmljZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgaXNBZGRTZXJ2aWNlU2VsZWN0ZWQoc2VydmljZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLnNvbWUoKHMpID0+IHMuc2VydmljZUlkID09PSBzZXJ2aWNlLnNlcnZpY2VJZCk7XG4gIH1cbiAgdG9nZ2xlQWRkU2VydmljZShzZXJ2aWNlOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmZpbmRJbmRleCgocykgPT4gcy5zZXJ2aWNlSWQgPT09IHNlcnZpY2Uuc2VydmljZUlkKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBlbHNlIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLnB1c2goc2VydmljZSk7XG4gIH1cblxuICAvKiogTWlycm9ycyBhcHBvaW50bWVudF9zZXJ2aWNlJ3MgRGVwb3NpdFV0aWxzI2dldFNlcnZpY2VEZXBvc2l0QW1vdW50IGV4YWN0bHkgLSBmaXhlZCBhbW91bnRcbiAgICogdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHBlcmNlbnQsIDAgd2hlbiBubyBkZXBvc2l0IGlzIGNvbmZpZ3VyZWQuIE9ubHkgdXNlZCB0byBkZWNpZGUgd2hpY2hcbiAgICogZW5kcG9pbnQgdG8gY2FsbCAoYSBsaXZlIENhc2hmcmVlIGNoZWNrb3V0IHZzLiB0aGUgZGlyZWN0IGFkZCkgLSB0aGUgYmFja2VuZCByZS1kZXJpdmVzIHRoaXNcbiAgICogaXRzZWxmIGFuZCBuZXZlciB0cnVzdHMgYSBjbGllbnQtY29tcHV0ZWQgYW1vdW50LiAqL1xuICBwcml2YXRlIHNlcnZpY2VEZXBvc2l0KHNlcnZpY2U6IGFueSk6IG51bWJlciB7XG4gICAgY29uc3QgZCA9IHNlcnZpY2U/LmRlcG9zaXRBbW91bnQ7XG4gICAgaWYgKCFkPy5kZXBvc2l0UmVxdWlyZWQpIHJldHVybiAwO1xuICAgIGlmIChkLmZpeGVkQW1vdW50ID4gMCkgcmV0dXJuIGQuZml4ZWRBbW91bnQ7XG4gICAgY29uc3QgcHJpY2UgPSBzZXJ2aWNlPy5wcmljZURldGFpbHM/LnRvdGFsUHJpY2UgPz8gMDtcbiAgICByZXR1cm4gKChkLmRlcG9zaXRQZXJjZW50ID8/IDApIC8gMTAwKSAqIHByaWNlO1xuICB9XG5cbiAgLyoqIFN1bW1lZCBhY3Jvc3MgZXZlcnkgY3VycmVudGx5LWNoZWNrZWQgc2VydmljZSAtIGRyaXZlcyBib3RoIHRoZSBydW5uaW5nIHRvdGFsIHNob3duIGluIHRoZVxuICAgKiBwYW5lbCBhbmQgd2hpY2ggZW5kcG9pbnQgYWRkU2VydmljZSgpIGNhbGxzIChzYW1lIHRvdGFsIHRoZSBiYWNrZW5kIGluZGVwZW5kZW50bHkgcmUtZGVyaXZlc1xuICAgKiBhbmQgYWN0dWFsbHkgZW5mb3JjZXMpLiAqL1xuICBnZXQgYWRkU2VydmljZVRvdGFsRGVwb3NpdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgdGhpcy5zZXJ2aWNlRGVwb3NpdChzKSwgMCk7XG4gIH1cblxuICBhZGRTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nIHx8ICF0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZXJ2aWNlSWRzID0gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQubWFwKChzKSA9PiBzLnNlcnZpY2VJZCk7XG4gICAgY29uc3QgZGVwb3NpdCA9IHRoaXMuYWRkU2VydmljZVRvdGFsRGVwb3NpdDtcbiAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9ICcnO1xuXG4gICAgaWYgKGRlcG9zaXQgPD0gMCkge1xuICAgICAgdGhpcy5yZXN0U2VydmljZS5hZGRTZXJ2aWNlVG9Cb29raW5nKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgc2VydmljZUlkcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VQYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWRbMF0ubmFtZSArICcgYWRkZWQnXG4gICAgICAgICAgOiB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggKyAnIHNlcnZpY2VzIGFkZGVkJztcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5IH0pO1xuICAgICAgICB0aGlzLnJlZnJlc2hTZWxlY3RlZFNlcnZpY2VMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuYWRkU2VydmljZUF2YWlsYWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmNoZWNrQWRkU2VydmljZUF2YWlsYWJpbGl0eSh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnVW5hYmxlIHRvIGFkZCB0aGVzZSBzZXJ2aWNlcyc7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEZXBvc2l0IHJlcXVpcmVkIC0gbm90aGluZyBpcyBhdHRhY2hlZCB0byB0aGUgYm9va2luZyB1bnRpbCB0aGlzIHBheW1lbnQgaXMgdmVyaWZpZWRcbiAgICAvLyAoQm9va2luZ0dyb3VwU2VydmljZSNjb25maXJtU2VydmljZUFkZE9uKSwgc2FtZSBsaXZlLWNoZWNrb3V0IHBhdHRlcm4gdGhlIG9yaWdpbmFsIGJvb2tpbmdcbiAgICAvLyBmbG93IGFscmVhZHkgdXNlcyAoc2VlIHRoaXMgY29tcG9uZW50J3Mgb3duIGNvbmZpcm1SZXNjaGVkdWxlL2NhbmNlbEJvb2tpbmcgbmVpZ2hib3JzIC1cbiAgICAvLyBub25lIG9mIHRob3NlIHRvdWNoIHBheW1lbnQgLSBhbmQgYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQudHMncyBob2xkQm9va2luZyBzdWNjZXNzXG4gICAgLy8gaGFuZGxlciBmb3IgdGhlIGFjdHVhbCBwcmVjZWRlbnQpLiBPbmUgY2hlY2tvdXQgZm9yIHRoZSB3aG9sZSBiYXRjaCdzIHN1bW1lZCBkZXBvc2l0LlxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2VuZXJhdGVBZGRTZXJ2aWNlUGF5bWVudFRva2VuKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgc2VydmljZUlkcykuc3Vic2NyaWJlKChvcmRlcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWRkT25QYXltZW50SWQnLCBvcmRlci5wZ09yZGVySWQpO1xuICAgICAgdGhpcy5ldmVudHNTZXJ2aWNlLmNhc2hGcmVlRXZlbnQuZW1pdCh7IGRhdGE6IHsgb3JkZXJTaWduYXR1cmU6IG9yZGVyLm9yZGVyU2lnbmF0dXJlIH0gfSk7XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkU2VydmljZVN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRkU2VydmljZUVycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdVbmFibGUgdG8gc3RhcnQgcGF5bWVudCBmb3IgdGhlc2Ugc2VydmljZXMnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoU2VsZWN0ZWRTZXJ2aWNlTGluZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZDtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEdyb3VwTGluZXMoZ3JvdXBJZCkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpLnN1YnNjcmliZSgobGluZXM6IGFueSkgPT4ge1xuICAgICAgY29uc3QgYm9va2luZyA9IHRoaXMuYWxsQm9va2luZ3MuZmluZCgoYikgPT4gYi5ncm91cElkID09PSBncm91cElkKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gKGxpbmVzID8/IFtdKS5mbGF0TWFwKChsOiBhbnkpID0+IChsLnNlcnZpY2VzID8/IFtdKS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLCBkdXJhdGlvbk1pbnV0ZXM6IHMuZHVyYXRpb25NaW51dGVzLCBwcmljZTogcy5wcmljZVxuICAgICAgfSkpKTtcbiAgICAgIGlmIChib29raW5nKSBib29raW5nLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZD8uZ3JvdXBJZCA9PT0gZ3JvdXBJZCkgdGhpcy5zZWxlY3RlZC5zZXJ2aWNlcyA9IHNlcnZpY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgb3BlbkNhbmNlbENvbmZpcm0oKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IHRydWU7XG4gIH1cbiAgY2xvc2VDYW5jZWxDb25maXJtKCkge1xuICAgIHRoaXMuY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGNhbmNlbEJvb2tpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMuY2FuY2VsbGluZykgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsbGluZyA9IHRydWU7XG4gICAgdGhpcy5yZXN0U2VydmljZS5jYW5jZWxCb29raW5nR3JvdXAodGhpcy5zZWxlY3RlZC5ncm91cElkLCAnQ2FuY2VsbGVkIGJ5IGN1c3RvbWVyJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID0gJ0NBTkNFTExFRCc7XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0Jvb2tpbmcgY2FuY2VsbGVkJyB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8uZGV0YWlsID8/ICdDb3VsZCBub3QgY2FuY2VsIHRoaXMgYm9va2luZycgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxuXG48ZGl2IGNsYXNzPVwibWItcm9vdFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0xJU1QnXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXRpdGxlXCI+TXkgQm9va2luZ3M8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi10YWJzXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwicHJvZlRhYiA9PT0gJ3VwY29taW5nJ1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCd1cGNvbWluZycpXCI+VXBjb21pbmc8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAncGFzdCdcIiAoY2xpY2spPVwic2V0UHJvZlRhYigncGFzdCcpXCI+UGFzdDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWxvYWRpbmdcIiAqbmdJZj1cImxvYWRpbmdcIj5Mb2FkaW5nIHlvdXIgYm9va2luZ3PigKY8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi1yb3dzXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNFbXB0eVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiByb3dzXCIgKGNsaWNrKT1cInZpZXdCb29raW5nRGV0YWlsKGIpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctc3RyaXBlXCIgW25nQ2xhc3NdPVwiYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnc3RyaXBlLWhvbWUnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnc3RyaXBlLXZpZGVvJyA6ICdzdHJpcGUtc3RvcmUnXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdG9wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXRpdGxlXCI+e3t0aXRsZShiKX19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy13aGVuXCI+e3t3aGVuKGIpfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LWRldGFpbFwiPnt7ZGV0YWlsKGIpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZW5kXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhiLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKGIuc3RhdHVzKX19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWVtcHR5XCIgKm5nSWY9XCJpc0VtcHR5XCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYi1lbXB0eS1pY29uXCI+ZXZlbnRfYnVzeTwvbWF0LWljb24+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHktdGl0bGVcIj5ObyB7e3Byb2ZUYWJ9fSBib29raW5ncyB5ZXQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnREVUQUlMJyAmJiBzZWxlY3RlZFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItYmFja1wiIChjbGljayk9XCJiYWNrVG9MaXN0KClcIj5cbiAgICAgIDxtYXQtaWNvbj5hcnJvd19iYWNrPC9tYXQtaWNvbj4gQmFjayB0byBNeSBCb29raW5nc1xuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXRpdGxlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGVcIj57e3RpdGxlKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhzZWxlY3RlZC5zdGF0dXMpXCI+e3tzdGF0dXNMYWJlbChzZWxlY3RlZC5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXdoZW5cIj57e3doZW4oc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnNlcnZpY2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VydmljZU5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQucHJvZHVjdExpbmVzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Qcm9kdWN0czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cHJvZHVjdE5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Db250YWN0PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ubmFtZX19IMK3IHt7c2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWw/LnBob25lTnVtYmVyfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8uZW1haWx9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBzZWxlY3RlZC5hZGRyZXNzRGV0YWlsc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkFkZHJlc3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZTF9fSwge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uY2l0eX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5zdGF0ZX19IHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnppcENvZGV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKSA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlIHByaWNlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZXJ2aWNlUHJpY2VUb3RhbChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLmhvbWVWaXNpdENoYXJnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkhvbWUgdmlzaXQgY2hhcmdlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZWxlY3RlZC5ob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Ub3RhbDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7dG90YWxEdWUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGFpZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cGFpZExhYmVsKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwicGVuZGluZ0Ftb3VudChzZWxlY3RlZCkgPiAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGVuZGluZyBhdCBhcHBvaW50bWVudDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7cGVuZGluZ0Ftb3VudChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItdmlkZW8tbGlua1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ1ZJREVPX0NBTEwnICYmIHNlbGVjdGVkLnZpZGVvQ2FsbExpbmsgJiYgc2VsZWN0ZWQuc3RhdHVzICE9PSAnQ0FOQ0VMTEVEJ1wiPlxuICAgICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8YSBbaHJlZl09XCJzZWxlY3RlZC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tzZWxlY3RlZC52aWRlb0NhbGxMaW5rfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuUmVzY2hlZHVsZVNlbGVjdGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxlIHBvbGljeTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj5Zb3UgY2FuIHJlc2NoZWR1bGUgdGhpcyBib29raW5nIHVwIHRvIHt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzfX0gaG91cnt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzID09PSAxID8gJycgOiAncyd9fSBiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHRpbWUuPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3lcIiAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkICYmIGNhbmNlbGxhdGlvblBvbGljeVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItYWN0aW9ucy1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgY2FuQ2FuY2VsU2VsZWN0ZWRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2hlZHVsZS1idG5cIlxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZXNjaGVkdWxlU2VsZWN0ZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCIhY2FuUmVzY2hlZHVsZVNlbGVjdGVkID8gc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gOiAnJ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblJlc2NoZWR1bGVQYW5lbCgpXCJcbiAgICAgICAgPlJlc2NoZWR1bGUgYm9va2luZzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgKm5nSWY9XCJjYW5BZGRTZXJ2aWNlU2VsZWN0ZWRcIlxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRTZXJ2aWNlUGFuZWwoKVwiXG4gICAgICAgID5BZGQgc2VydmljZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1jYW5jZWwtYnRuXCJcbiAgICAgICAgICAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNhbmNlbENvbmZpcm0oKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e2NhbmNlbGxpbmcgPyAnQ2FuY2VsbGluZ+KApicgOiAnQ2FuY2VsIGJvb2tpbmcnfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLWFjdGlvbnMtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5pbnZvaWNlSWQgJiYgc2VsZWN0ZWQuc3RhdHVzID09PSAnQ09NUExFVEVEJ1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRJbnZvaWNlKClcIlxuICAgICAgICA+RG93bmxvYWQgaW52b2ljZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1jYW5jZWxsZWQtbm90ZVwiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQ0FOQ0VMTEVEJ1wiPlRoaXMgYm9va2luZyBoYXMgYmVlbiBjYW5jZWxsZWQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1iYWNrZHJvcFwiICpuZ0lmPVwicmVzY2hlZHVsZVBhbmVsT3BlblwiIChjbGljayk9XCJjbG9zZVJlc2NoZWR1bGVQYW5lbCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtdGl0bGVcIj5DaG9vc2UgYSBuZXcgZGF0ZSAmYW1wOyB0aW1lPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXAtcm93XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKC0xKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE1IDE4bC02LTYgNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1kYXlzdHJpcFwiICNyZXNjaERheVN0cmlwPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1kYXlcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHJlc2NoRGF5c1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzb1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hEYXkoZGF5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LWRvd1wiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5kb3d9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1yZXNjaC1kYXktbnVtXCIgW3N0eWxlLmNvbG9yXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBjb250cmFzdENvbG9yIDogbnVsbFwiPnt7ZGF5Lm51bX19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKDEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNOSAxOGw2LTYtNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtbG9hZGluZ1wiICpuZ0lmPVwicmVzY2hMb2FkaW5nU2xvdHNcIj5Mb2FkaW5nIGF2YWlsYWJsZSB0aW1lc+KApjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtZW1wdHlcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaE5vU2xvdHNcIj5ObyBzbG90cyBhdmFpbGFibGUgb24gdGhpcyBkYXRlLiBUcnkgYW5vdGhlciBkYXRlLjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHNcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaFNsb3RzLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1zbG90XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIHJlc2NoU2xvdHNcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZVwiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSZXNjaFRpbWUoc2xvdClcIlxuICAgICAgICAgID57e3Nsb3R9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZXJyb3JcIiAqbmdJZj1cInJlc2NoRXJyb3JcIj57e3Jlc2NoRXJyb3J9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVzY2hJbnZhbGlkXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyZXNjaEludmFsaWQgPyBudWxsIDogc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInJlc2NoSW52YWxpZCA/IG51bGwgOiBjb250cmFzdENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVJlc2NoZWR1bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e3Jlc2NoQ29uZmlybWluZyA/ICdDb25maXJtaW5n4oCmJyA6ICdDb25maXJtIG5ldyBzbG90J319XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1iYWNrZHJvcFwiICpuZ0lmPVwiY2FuY2VsQ29uZmlybU9wZW5cIiAoY2xpY2spPVwiY2xvc2VDYW5jZWxDb25maXJtKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtcGFuZWxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC10aXRsZVwiPkNhbmNlbCB0aGlzIGJvb2tpbmc/PC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYW5jZWxDb25maXJtKClcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPlRoaXMgY2FuJ3QgYmUgdW5kb25lLjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnBvbGljeURldGFpbHN9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUNhbmNlbENvbmZpcm0oKVwiPktlZXAgYm9va2luZzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNvbmZpcm1cIiBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiIChjbGljayk9XCJjYW5jZWxCb29raW5nKClcIj5cbiAgICAgICAgICB7e2NhbmNlbGxpbmcgPyAnQ2FuY2VsbGluZ+KApicgOiAnWWVzLCBjYW5jZWwgYm9va2luZyd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cImFkZFNlcnZpY2VQYW5lbE9wZW5cIiAoY2xpY2spPVwiY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1wYW5lbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+QWRkIHNlcnZpY2Uocyk8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jbG9zZVwiIChjbGljayk9XCJjbG9zZUFkZFNlcnZpY2VQYW5lbCgpXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1zbG90cy1sb2FkaW5nXCIgKm5nSWY9XCJhZGRTZXJ2aWNlTG9hZGluZ1wiPkxvYWRpbmcgc2VydmljZXPigKY8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWVtcHR5XCIgKm5nSWY9XCIhYWRkU2VydmljZUxvYWRpbmcgJiYgYWRkU2VydmljZU9wdGlvbnMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgTm8gc2VydmljZXMgYXZhaWxhYmxlIHRvIGFkZCByaWdodCBub3cuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1hZGRzdmMtbGlzdFwiICpuZ0lmPVwiIWFkZFNlcnZpY2VMb2FkaW5nICYmIGFkZFNlcnZpY2VPcHRpb25zLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi1hZGRzdmMtcm93XCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc0FkZFNlcnZpY2VTZWxlY3RlZChzZXJ2aWNlKVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VydmljZSBvZiBhZGRTZXJ2aWNlT3B0aW9uc1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRkU2VydmljZVN1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkZFNlcnZpY2Uoc2VydmljZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cIm1iLWFkZHN2Yy1jaGVja2JveFwiIFtjaGVja2VkXT1cImlzQWRkU2VydmljZVNlbGVjdGVkKHNlcnZpY2UpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwidG9nZ2xlQWRkU2VydmljZShzZXJ2aWNlKVwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZjFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWFkZHN2Yy1uYW1lXCI+XG4gICAgICAgICAgICAgICAge3tzZXJ2aWNlLm5hbWV9fVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItYWRkc3ZjLW1ldGFcIiAqbmdJZj1cInNlcnZpY2UuZHVyYXRpb25cIj57e3NlcnZpY2UuZHVyYXRpb259fSBtaW48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItYWRkc3ZjLXByaWNlXCIgKm5nSWY9XCJzZXJ2aWNlLnByaWNlRGV0YWlscz8udG90YWxQcmljZVwiPuKCuXt7c2VydmljZS5wcmljZURldGFpbHMudG90YWxQcmljZX19PC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1hZGRzdmMtdG90YWxcIiAqbmdJZj1cImFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggJiYgYWRkU2VydmljZVRvdGFsRGVwb3NpdCA+IDBcIj5cbiAgICAgICAgICBEZXBvc2l0IGR1ZSBub3c6IOKCuXt7YWRkU2VydmljZVRvdGFsRGVwb3NpdH19XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1lcnJvclwiICpuZ0lmPVwiYWRkU2VydmljZUVycm9yXCI+e3thZGRTZXJ2aWNlRXJyb3J9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIiAqbmdJZj1cIiFhZGRTZXJ2aWNlTG9hZGluZyAmJiBhZGRTZXJ2aWNlT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggfHwgYWRkU2VydmljZVN1Ym1pdHRpbmdcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIiFhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoID8gbnVsbCA6IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCIhYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA/IG51bGwgOiBjb250cmFzdENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkU2VydmljZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7YWRkU2VydmljZVN1Ym1pdHRpbmcgPyAnQWRkaW5n4oCmJyA6ICdBZGQgJyArIChhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoIHx8ICcnKSArICcgc2VydmljZScgKyAoYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKX19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=
476
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXktYm9va2luZ3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9lbGVtZW50cy9teS1ib29raW5ncy9teS1ib29raW5ncy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL2VsZW1lbnRzL215LWJvb2tpbmdzL215LWJvb2tpbmdzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1QyxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNwQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7OztBQXFDNUM7Ozs7O0dBS0c7QUFTSCxNQUFNLE9BQU8sbUJBQW1CO0lBQzlCLFlBQ21CLFdBQXdCLEVBQ3hCLGNBQXFDLEVBQ3JDLGNBQThCLEVBQzlCLGFBQTRCO1FBSDVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLG1CQUFjLEdBQWQsY0FBYyxDQUF1QjtRQUNyQyxtQkFBYyxHQUFkLGNBQWMsQ0FBZ0I7UUFDOUIsa0JBQWEsR0FBYixhQUFhLENBQWU7UUEyQi9DLGVBQVUsR0FBc0IsTUFBTSxDQUFDO1FBQ3ZDLFlBQU8sR0FBd0IsVUFBVSxDQUFDO1FBQzFDLFlBQU8sR0FBRyxJQUFJLENBQUM7UUFD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MEZBSm5CLENBQUMsY0FBYyxDQUFDLDZJQ3JEN0Isd2lkQW1TQSwyN05EL09ZLFlBQVksNlZBQUUsYUFBYSxtTEFBRSxXQUFXOzs0RkFLdkMsbUJBQW1CO2tCQVIvQixTQUFTOytCQUNFLG1CQUFtQixjQUNqQixJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsQ0FBQyxhQUN4QyxDQUFDLGNBQWMsQ0FBQzs2S0FZbEIsSUFBSTtzQkFBWixLQUFLO2dCQXNDc0IsZ0JBQWdCO3NCQUEzQyxTQUFTO3VCQUFDLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1hdEljb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9pY29uJztcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tICdwcmltZW5nL3RvYXN0JztcbmltcG9ydCB7IGZvcmtKb2luLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJlc3RTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvcmVzdC5zZXJ2aWNlJztcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xuaW1wb3J0IHsgVXNlciB9IGZyb20gJy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XG5cbmludGVyZmFjZSBCb29raW5nUm93IHtcbiAgZ3JvdXBJZDogc3RyaW5nO1xuICBtb2RlOiAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuICBib29raW5nRGF0ZTogc3RyaW5nO1xuICBzdGFydFRpbWU/OiBzdHJpbmc7XG4gIGVuZFRpbWU/OiBzdHJpbmc7XG4gIHN0YXR1czogJ1BFTkRJTkcnIHwgJ0JPT0tFRCcgfCAnSE9MRCcgfCAnT05HT0lORycgfCAnQ09NUExFVEVEJyB8ICdDQU5DRUxMRUQnO1xuICBzdG9yZU5hbWU/OiBzdHJpbmc7XG4gIGN1c3RvbWVyRGV0YWlsPzogeyBuYW1lOiBzdHJpbmc7IHBob25lTnVtYmVyOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgYWRkcmVzc0RldGFpbHM/OiB7IHJlY2VpdmVyTmFtZTogc3RyaW5nOyByZWNlaXZlclBob25lOiBzdHJpbmc7IGFkZHJlc3NMaW5lMTogc3RyaW5nOyBhZGRyZXNzTGluZTI/OiBzdHJpbmc7IGNpdHk6IHN0cmluZzsgc3RhdGU6IHN0cmluZzsgemlwQ29kZTogc3RyaW5nIH07XG4gIHByb2R1Y3RMaW5lcz86IHsgaXRlbU5hbWU6IHN0cmluZzsgcXVhbnRpdHk6IG51bWJlciB9W107XG4gIC8qKiBOb3QgcGFydCBvZiB0aGUgR0VUIC9ib29raW5nL2dyb3VwL215IHJlc3BvbnNlIC0gc2VydmljZXMgbGl2ZSBvbiB0aGUgc2VwYXJhdGVcbiAgICogQm9va2luZ0RldGFpbCBjb2xsZWN0aW9uIChGSydkIHZpYSBzZXJ2aWNlTGluZUlkcywgbm90IGRlbm9ybWFsaXplZCBvbnRvIEJvb2tpbmdHcm91cCksIHNvXG4gICAqIHRoaXMgaXMgZmlsbGVkIGluIGNsaWVudC1zaWRlIGFmdGVyIGxvYWQoKSB2aWEgYSBwZXItcm93IEdFVCAuLi4vbGluZXMgY2FsbC4gKi9cbiAgc2VydmljZXM/OiB7IG5hbWU6IHN0cmluZzsgZHVyYXRpb25NaW51dGVzOiBudW1iZXI7IHByaWNlOiBudW1iZXIgfVtdO1xuICB2aWRlb0NhbGxMaW5rPzogc3RyaW5nO1xuICB0b3RhbENvbGxlY3RlZEF0Qm9va2luZz86IG51bWJlcjtcbiAgdG90YWxQYXlhYmxlPzogbnVtYmVyO1xuICBob21lVmlzaXRDaGFyZ2U/OiBudW1iZXI7XG4gIC8qKiBQcmVzZW5jZSAob25jZSB0aGUgYm9va2luZyBpcyBDT01QTEVURUQpIGlzIHRoZSBzaWduYWwgdG8gc2hvdyBcIkRvd25sb2FkIEludm9pY2VcIiAtIHRoZSBQREZcbiAgICogdXJsIGl0c2VsZiBpcyBmZXRjaGVkIG9uLWRlbWFuZCB2aWEgcmVzdFNlcnZpY2UuZ2V0Qm9va2luZ0ludm9pY2VVcmwsIG5vdCBzdG9yZWQgb24gdGhlIHJvdy4gKi9cbiAgaW52b2ljZUlkPzogc3RyaW5nO1xuICAvKiogVHJhbnNpZW50LCBjb21wdXRlZCBvbiBldmVyeSBiYWNrZW5kIHJlYWQgb2YgdGhpcyBncm91cCAtIHNlZSBCb29raW5nR3JvdXAjY2FuUmVzY2hlZHVsZS4gKi9cbiAgY2FuUmVzY2hlZHVsZT86IGJvb2xlYW47XG4gIHJlc2NoZWR1bGVCbG9ja2VkUmVhc29uPzogc3RyaW5nO1xuICAvKiogTm90IHBhcnQgb2YgdGhlIEdFVCAvYm9va2luZy9ncm91cC9teSByZXNwb25zZSBlaXRoZXIgLSByZXNvbHZlZCBsYXppbHksIG9uY2UsIHRoZSBmaXJzdFxuICAgKiB0aW1lIHRoaXMgYm9va2luZydzIGRldGFpbCBpcyB2aWV3ZWQgKHNlZSB2aWV3Qm9va2luZ0RldGFpbCgpKSwgc28gdGhlIFwiQWRkIHNlcnZpY2VcIiBhY3Rpb25cbiAgICogb25seSBzaG93cyB3aGVuIHRoZXJlJ3MgYWN0dWFsbHkgc29tZXRoaW5nIGxlZnQgdG8gYWRkLiB1bmRlZmluZWQgPSBub3QgY2hlY2tlZCB5ZXQuICovXG4gIGFkZFNlcnZpY2VBdmFpbGFibGU/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFwiTXkgQm9va2luZ3NcIiAtIGEgY3VzdG9tZXIncyBvd24gYm9va2luZyBoaXN0b3J5IChVcGNvbWluZy9QYXN0KSwgYSBkZXRhaWwgdmlldyBwZXIgYm9va2luZyxcbiAqIGFuZCBjYW5jZWxsYXRpb24uIFRoZSBsaXN0IGVuZHBvaW50IHJldHVybnMgZnVsbCBCb29raW5nR3JvdXAgcmVjb3JkcyAtIGVub3VnaCBmb3JcbiAqIGRhdGUvc3RhdHVzL2FkZHJlc3MvcHJvZHVjdHMgLSBidXQgc2VydmljZXMgYm9va2VkIGFyZW4ndCBvbiB0aGF0IHJlY29yZCAoc2VlIEJvb2tpbmdSb3cuc2VydmljZXNcbiAqIGFib3ZlKSwgc28gbG9hZCgpIGlzc3VlcyBvbmUgZXh0cmEgR0VUIC4uLi9saW5lcyBjYWxsIHBlciByb3cgdG8gZmlsbCB0aGVtIGluLlxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1teS1ib29raW5ncycsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIFRvYXN0TW9kdWxlXSxcbiAgcHJvdmlkZXJzOiBbTWVzc2FnZVNlcnZpY2VdLFxuICB0ZW1wbGF0ZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vbXktYm9va2luZ3MuY29tcG9uZW50LmNzcydcbn0pXG5leHBvcnQgY2xhc3MgTXlCb29raW5nc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVhZG9ubHkgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgc3RvcmFnZVNlcnZpY2U6IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IGV2ZW50c1NlcnZpY2U6IEV2ZW50c1NlcnZpY2UsXG4gICkgeyB9XG5cbiAgQElucHV0KCkgZGF0YTogYW55O1xuICBzdHlsZXM6IGFueTtcblxuICAvKiogU2FtZSBjb250cmFzdCBhbGdvcml0aG0gYXMgQ29sb3JEaXJlY3RpdmUgKGRpcmVjdGl2ZS9jb2xvci5kaXJlY3RpdmUudHMpIC0gcmVpbXBsZW1lbnRlZCBhc1xuICAgKiBhIHB1cmUgZ2V0dGVyIHJhdGhlciB0aGFuIHJldXNpbmcgdGhhdCBkaXJlY3RpdmUgZGlyZWN0bHksIHNpbmNlIGl0cyBbc2ltcG9Db2xvcl0gb25seSBldmVyXG4gICAqICpzZXRzKiBhIGNvbXB1dGVkIGNvbG9yIGFuZCBuZXZlciBjbGVhcnMgaXQsIHdoaWNoIHdvdWxkIGxlYXZlIGEgc3RhbGUgY29sb3Igc3R1Y2sgb24gYVxuICAgKiBjaGlwIGFmdGVyIGl0IHRvZ2dsZXMgZnJvbSBhY3RpdmUgYmFjayB0byBpbmFjdGl2ZS4gRXZlcnkgYWNjZW50LWNvbG9yZWQgZWxlbWVudCBoZXJlIGlzXG4gICAqIGVpdGhlciBhbHdheXMtb24gKG5ldmVyIHRvZ2dsZXMpIG9yIGRyaXZlbiBieSB0aGlzIHNhbWUgZ2V0dGVyLCBzbyB0aGVyZSdzIGV4YWN0bHkgb25lXG4gICAqIGRlZmluaXRpb24gb2YgXCJ3aGF0IHRleHQgY29sb3IgZ29lcyBvbiB0aGUgYWNjZW50IGNvbG9yXCIgaW4gdGhpcyBmaWxlLiAqL1xuICBnZXQgY29udHJhc3RDb2xvcigpOiBzdHJpbmcge1xuICAgIGxldCBoZXggPSB0aGlzLnN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3I7XG4gICAgaWYgKCFoZXgpIHJldHVybiAnI2ZmZmZmZic7XG4gICAgaWYgKGhleC5sZW5ndGggPCA2KSB7XG4gICAgICBsZXQgZXhwYW5kZWQgPSAnIyc7XG4gICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGhleC5sZW5ndGg7IGkrKykgZXhwYW5kZWQgKz0gaGV4W2ldICsgaGV4W2ldO1xuICAgICAgaGV4ID0gZXhwYW5kZWQ7XG4gICAgfVxuICAgIGNvbnN0IHIgPSBwYXJzZUludChoZXguc2xpY2UoMSwgMyksIDE2KTtcbiAgICBjb25zdCBnID0gcGFyc2VJbnQoaGV4LnNsaWNlKDMsIDUpLCAxNik7XG4gICAgY29uc3QgYiA9IHBhcnNlSW50KGhleC5zbGljZSg1LCA3KSwgMTYpO1xuICAgIGNvbnN0IGJyaWdodG5lc3MgPSAociAqIDI5OSArIGcgKiA1ODcgKyBiICogMTE0KSAvIDEwMDA7XG4gICAgcmV0dXJuIGJyaWdodG5lc3MgPiAxMzAgPyAnIzAwMDAwMCcgOiAnI2ZmZmZmZic7XG4gIH1cblxuICBjdXJyZW50VGFiOiAnTElTVCcgfCAnREVUQUlMJyA9ICdMSVNUJztcbiAgcHJvZlRhYjogJ3VwY29taW5nJyB8ICdwYXN0JyA9ICd1cGNvbWluZyc7XG4gIGxvYWRpbmcgPSB0cnVlO1xuICBjYW5jZWxsaW5nID0gZmFsc2U7XG4gIGNhbmNlbENvbmZpcm1PcGVuID0gZmFsc2U7XG5cbiAgcHJpdmF0ZSBhbGxCb29raW5nczogQm9va2luZ1Jvd1tdID0gW107XG4gIHVwY29taW5nOiBCb29raW5nUm93W10gPSBbXTtcbiAgcGFzdDogQm9va2luZ1Jvd1tdID0gW107XG4gIHNlbGVjdGVkOiBCb29raW5nUm93IHwgbnVsbCA9IG51bGw7XG4gIGNhbmNlbGxhdGlvblBvbGljeTogeyB0aXRsZTogc3RyaW5nOyBwb2xpY3lEZXRhaWxzOiBzdHJpbmcgfSB8IG51bGwgPSBudWxsO1xuICByZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPSAyNDtcblxuICAvLyBSZXNjaGVkdWxlIHBhbmVsIC0gZGF0ZSBzdHJpcCArIHNsb3QgZ3JpZCwgbWF0Y2hpbmcgdGhlIGFkbWluIHNpZGUncyBSZXNjaGVkdWxlQXBwb2ludG1lbnRDb21wb25lbnQuXG4gIEBWaWV3Q2hpbGQoJ3Jlc2NoRGF5U3RyaXAnKSByZXNjaERheVN0cmlwUmVmPzogRWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD47XG4gIHJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgcmVzY2hEYXlzOiB7IGlzbzogc3RyaW5nOyBkb3c6IHN0cmluZzsgbnVtOiBzdHJpbmcgfVtdID0gW107XG4gIHJlc2NoU2VsZWN0ZWRJc28gPSAnJztcbiAgcmVzY2hTZWxlY3RlZFRpbWUgPSAnJztcbiAgcmVzY2hTbG90czogc3RyaW5nW10gPSBbXTtcbiAgcmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgcmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gIHJlc2NoRXJyb3IgPSAnJztcbiAgcmVzY2hOb1Nsb3RzID0gZmFsc2U7XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5zdHlsZXMgPSB0aGlzLmRhdGE/LnN0eWxlcztcbiAgICB0aGlzLmxvYWQoKTtcbiAgfVxuXG4gIGxvYWQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBjb25zdCBidXNpbmVzc0lkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA/PyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgPz8gJyc7XG4gICAgY29uc3QgdXNlcklkID0gKHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXIpPy51c2VySWQgPz8gJyc7XG4gICAgaWYgKCFidXNpbmVzc0lkIHx8ICF1c2VySWQpIHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldE15Qm9va2luZ3MoYnVzaW5lc3NJZCwgdXNlcklkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICB0aGlzLmFsbEJvb2tpbmdzID0gKHJlcyA/PyBbXSkgYXMgQm9va2luZ1Jvd1tdO1xuICAgICAgdGhpcy5zcGxpdEJvb2tpbmdzKCk7XG4gICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMubG9hZFNlcnZpY2VMaW5lcygpO1xuICAgIH0sICgpID0+IHtcbiAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRDYW5jZWxsYXRpb25Qb2xpY3koYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsYXRpb25Qb2xpY3kgPSAocmVzID8/IFtdKVswXSA/PyBudWxsO1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIHRoZSBkZXRhaWwgdmlldyBqdXN0IHdvbid0IHNob3cgYSBwb2xpY3kgbm90ZS5cbiAgICB9KTtcblxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QnVzaW5lc3NBcHBvaW50bWVudFNldHRpbmdzKGJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hlZHVsZUN1dG9mZkhvdXJzID0gcmVzPy5yZXNjaGVkdWxlQ3V0b2ZmSG91cnMgPz8gMjQ7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgLy8gTm9uLWZhdGFsIC0gZmFsbHMgYmFjayB0byB0aGUgZGVmYXVsdCBjdXRvZmYgdXNlZCBmb3IgZGlzcGxheSBvbmx5OyB0aGUgYmFja2VuZCBpcyB0aGVcbiAgICAgIC8vIHJlYWwgc291cmNlIG9mIHRydXRoIGFuZCBlbmZvcmNlcyBpdHMgb3duIGFjdHVhbCBjb25maWd1cmVkIHZhbHVlIHJlZ2FyZGxlc3MuXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGlzVXBjb21pbmcoYjogQm9va2luZ1Jvdyk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICByZXR1cm4gKGIuc3RhdHVzID09PSAnSE9MRCcgfHwgYi5zdGF0dXMgPT09ICdCT09LRUQnIHx8IGIuc3RhdHVzID09PSAnUEVORElORycgfHwgYi5zdGF0dXMgPT09ICdPTkdPSU5HJykgJiYgbmV3IERhdGUoYi5ib29raW5nRGF0ZSkgPj0gdG9kYXk7XG4gIH1cblxuICBwcml2YXRlIHNwbGl0Qm9va2luZ3MoKSB7XG4gICAgdGhpcy51cGNvbWluZyA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiB0aGlzLmlzVXBjb21pbmcoYikpO1xuICAgIHRoaXMucGFzdCA9IHRoaXMuYWxsQm9va2luZ3MuZmlsdGVyKChiKSA9PiAhdGhpcy5pc1VwY29taW5nKGIpKTtcbiAgfVxuXG4gIC8qKiBPbmUgYm9va2luZyBoaXN0b3J5IGxvYWQsIGJvdW5kZWQgdG8gdGhpcyBjdXN0b21lcidzIG93biBib29raW5ncyAtIGEgcGVyLXJvdyBjYWxsIGhlcmUgaXNcbiAgICogZmluZSwgdW5saWtlIGFuIHVuYm91bmRlZC9wYWdpbmF0ZWQgbGlzdC4gRmFpbHVyZXMgYXJlIHN3YWxsb3dlZCBwZXItcm93IChmYWxscyBiYWNrIHRvIG5vXG4gICAqIHNlcnZpY2UgbmFtZXMgZm9yIHRoYXQgcm93KSByYXRoZXIgdGhhbiBibG9ja2luZyB0aGUgd2hvbGUgcGFnZSBvbiBvbmUgYmFkIGdyb3VwLiAqL1xuICBwcml2YXRlIGxvYWRTZXJ2aWNlTGluZXMoKSB7XG4gICAgaWYgKCF0aGlzLmFsbEJvb2tpbmdzLmxlbmd0aCkgcmV0dXJuO1xuICAgIGZvcmtKb2luKFxuICAgICAgdGhpcy5hbGxCb29raW5ncy5tYXAoKGIpID0+XG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0R3JvdXBMaW5lcyhiLmdyb3VwSWQpLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZihbXSkpKVxuICAgICAgKVxuICAgICkuc3Vic2NyaWJlKChhbGxMaW5lczogYW55W10pID0+IHtcbiAgICAgIHRoaXMuYWxsQm9va2luZ3MuZm9yRWFjaCgoYiwgaSkgPT4ge1xuICAgICAgICBjb25zdCBsaW5lcyA9IGFsbExpbmVzW2ldID8/IFtdO1xuICAgICAgICBiLnNlcnZpY2VzID0gbGluZXMuZmxhdE1hcCgobDogYW55KSA9PiAobC5zZXJ2aWNlcyA/PyBbXSkubWFwKChzOiBhbnkpID0+ICh7XG4gICAgICAgICAgbmFtZTogcy5uYW1lLCBkdXJhdGlvbk1pbnV0ZXM6IHMuZHVyYXRpb25NaW51dGVzLCBwcmljZTogcy5wcmljZVxuICAgICAgICB9KSkpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBnZXQgcm93cygpOiBCb29raW5nUm93W10ge1xuICAgIHJldHVybiB0aGlzLnByb2ZUYWIgPT09ICd1cGNvbWluZycgPyB0aGlzLnVwY29taW5nIDogdGhpcy5wYXN0O1xuICB9XG4gIGdldCBpc0VtcHR5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5sb2FkaW5nICYmIHRoaXMucm93cy5sZW5ndGggPT09IDA7XG4gIH1cblxuICBzZXRQcm9mVGFiKHRhYjogJ3VwY29taW5nJyB8ICdwYXN0Jykge1xuICAgIHRoaXMucHJvZlRhYiA9IHRhYjtcbiAgfVxuXG4gIHByb2R1Y3ROYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGIucHJvZHVjdExpbmVzID8/IFtdKS5tYXAoKHApID0+IHAuaXRlbU5hbWUpLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuICB9XG4gIHNlcnZpY2VOYW1lcyhiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gKGIuc2VydmljZXMgPz8gW10pLm1hcCgocykgPT4gcy5uYW1lKS5maWx0ZXIoQm9vbGVhbikuam9pbignLCAnKTtcbiAgfVxuICB0aXRsZShiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICBjb25zdCBtb2RlTGFiZWwgPSBiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyA/ICdIb21lIFZpc2l0JyA6IGIubW9kZSA9PT0gJ1ZJREVPX0NBTEwnID8gJ1ZpZGVvIENhbGwnIDogJ1N0b3JlIFZpc2l0JztcbiAgICBjb25zdCBpdGVtcyA9IFt0aGlzLnNlcnZpY2VOYW1lcyhiKSwgdGhpcy5wcm9kdWN0TmFtZXMoYildLmZpbHRlcihCb29sZWFuKS5qb2luKCcsICcpO1xuICAgIHJldHVybiBpdGVtcyA/IGAke21vZGVMYWJlbH0gwrcgJHtpdGVtc31gIDogbW9kZUxhYmVsO1xuICB9XG4gIHdoZW4oYjogQm9va2luZ1Jvdyk6IHN0cmluZyB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKGIuYm9va2luZ0RhdGUpLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IHdlZWtkYXk6ICdzaG9ydCcsIGRheTogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JywgeWVhcjogJ251bWVyaWMnIH0pO1xuICAgIHJldHVybiBiLnN0YXJ0VGltZSA/IGAke2RhdGV9IMK3ICR7Yi5zdGFydFRpbWV9YCA6IGRhdGU7XG4gIH1cbiAgZGV0YWlsKGI6IEJvb2tpbmdSb3cpOiBzdHJpbmcge1xuICAgIGlmIChiLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBiLmFkZHJlc3NEZXRhaWxzKSByZXR1cm4gYCR7Yi5hZGRyZXNzRGV0YWlscy5jaXR5fSwgJHtiLmFkZHJlc3NEZXRhaWxzLnN0YXRlfWA7XG4gICAgaWYgKGIubW9kZSA9PT0gJ1NUT1JFX1ZJU0lUJyAmJiBiLnN0b3JlTmFtZSkgcmV0dXJuIGIuc3RvcmVOYW1lO1xuICAgIHJldHVybiBiLmN1c3RvbWVyRGV0YWlsPy5uYW1lID8/ICcnO1xuICB9XG4gIHN0YXR1c0xhYmVsKHN0YXR1czogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBpZiAoc3RhdHVzID09PSAnQ09NUExFVEVEJykgcmV0dXJuICdDb21wbGV0ZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gJ0NhbmNlbGxlZCc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ0hPTEQnIHx8IHN0YXR1cyA9PT0gJ1BFTkRJTkcnKSByZXR1cm4gJ1BheW1lbnQgUGVuZGluZyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ09OR09JTkcnKSByZXR1cm4gJ0luIFByb2dyZXNzJztcbiAgICByZXR1cm4gJ0NvbmZpcm1lZCc7XG4gIH1cbiAgc3RhdHVzQ2xhc3Moc3RhdHVzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGlmIChzdGF0dXMgPT09ICdDT01QTEVURUQnKSByZXR1cm4gJ3N0YXR1cy1jb21wbGV0ZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdDQU5DRUxMRUQnKSByZXR1cm4gJ3N0YXR1cy1jYW5jZWxsZWQnO1xuICAgIGlmIChzdGF0dXMgPT09ICdIT0xEJyB8fCBzdGF0dXMgPT09ICdQRU5ESU5HJykgcmV0dXJuICdzdGF0dXMtcGVuZGluZyc7XG4gICAgaWYgKHN0YXR1cyA9PT0gJ09OR09JTkcnKSByZXR1cm4gJ3N0YXR1cy1vbmdvaW5nJztcbiAgICByZXR1cm4gJ3N0YXR1cy1jb25maXJtZWQnO1xuICB9XG4gIHBhaWRMYWJlbChiOiBCb29raW5nUm93KTogc3RyaW5nIHtcbiAgICByZXR1cm4gYi50b3RhbENvbGxlY3RlZEF0Qm9va2luZyAmJiBiLnRvdGFsQ29sbGVjdGVkQXRCb29raW5nID4gMCA/IGDigrkke2IudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmd9YCA6ICdOb3RoaW5nIOKAlCBmcmVlJztcbiAgfVxuICBzZXJ2aWNlUHJpY2VUb3RhbChiOiBCb29raW5nUm93KTogbnVtYmVyIHtcbiAgICByZXR1cm4gKGIuc2VydmljZXMgPz8gW10pLnJlZHVjZSgoc3VtLCBzKSA9PiBzdW0gKyAocy5wcmljZSB8fCAwKSwgMCk7XG4gIH1cbiAgdG90YWxEdWUoYjogQm9va2luZ1Jvdyk6IG51bWJlciB7XG4gICAgcmV0dXJuIChiLnRvdGFsUGF5YWJsZSA/PyAwKSArIChiLmhvbWVWaXNpdENoYXJnZSA/PyAwKTtcbiAgfVxuICBwZW5kaW5nQW1vdW50KGI6IEJvb2tpbmdSb3cpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLnRvdGFsRHVlKGIpIC0gKGIudG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgPz8gMCkpO1xuICB9XG4gIC8qKiBGZXRjaGVkIG9uIGNsaWNrLCBub3QgcHJlLWNhY2hlZCAtIGVjb21tZXJjZSBnZW5lcmF0ZXMvY2FjaGVzIHRoZSBpbnZvaWNlIFBERiB0aGUgZmlyc3QgdGltZVxuICAgKiBpdCdzIGFza2VkIGZvciwgc28gdGhlcmUncyBub3RoaW5nIHRvIGdhaW4gYnkgZmV0Y2hpbmcgaXQgZWFybGllci4gU2FtZSBTMyBQREYgdXJsIHBhdHRlcm5cbiAgICogZWNvbW1lcmNlJ3Mgb3duIG9yZGVyLWRldGFpbHMuY29tcG9uZW50LnRzIHJlYWRzIGludm9pY2VVcmwvcmVjZWlwdFVybCBmcm9tLCBqdXN0IHJlc29sdmVkXG4gICAqIGxpdmUgaGVyZSBpbnN0ZWFkIG9mIGJlaW5nIHByZXNlbnQgb24gdGhlIHJvdyBhbHJlYWR5LiAqL1xuICBkb3dubG9hZEludm9pY2UoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkPy5pbnZvaWNlSWQpIHJldHVybjtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJvb2tpbmdJbnZvaWNlVXJsKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCkuc3Vic2NyaWJlKHtcbiAgICAgIG5leHQ6ICh1cmw6IGFueSkgPT4ge1xuICAgICAgICBpZiAodXJsKSB7XG4gICAgICAgICAgd2luZG93Lm9wZW4odXJsLCAnX2JsYW5rJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiAnSW52b2ljZSBub3QgYXZhaWxhYmxlIHlldCcgfSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnJvcjogKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Vycm9yJywgZGV0YWlsOiBlcnJvcj8uZXJyb3I/LmRldGFpbCA/PyAnVW5hYmxlIHRvIGZldGNoIGludm9pY2UnIH0pO1xuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuICBnZXQgY2FuQ2FuY2VsU2VsZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuICEhdGhpcy5zZWxlY3RlZCAmJiAodGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdIT0xEJyB8fCB0aGlzLnNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdQRU5ESU5HJyk7XG4gIH1cbiAgZ2V0IGNhblJlc2NoZWR1bGVTZWxlY3RlZCgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gISF0aGlzLnNlbGVjdGVkICYmIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJyAmJiAhIXRoaXMuc2VsZWN0ZWQuY2FuUmVzY2hlZHVsZTtcbiAgfVxuICBnZXQgY2FuQWRkU2VydmljZVNlbGVjdGVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhIXRoaXMuc2VsZWN0ZWQgJiYgdGhpcy5zZWxlY3RlZC5zdGF0dXMgPT09ICdCT09LRUQnICYmICEhdGhpcy5zZWxlY3RlZC5hZGRTZXJ2aWNlQXZhaWxhYmxlO1xuICB9XG5cbiAgdmlld0Jvb2tpbmdEZXRhaWwoYjogQm9va2luZ1Jvdykge1xuICAgIHRoaXMuc2VsZWN0ZWQgPSBiO1xuICAgIHRoaXMuY3VycmVudFRhYiA9ICdERVRBSUwnO1xuICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICAgIHRoaXMuY2hlY2tBZGRTZXJ2aWNlQXZhaWxhYmlsaXR5KGIpO1xuICB9XG5cbiAgLyoqIExhenksIGNhY2hlZCBvbiB0aGUgcm93IC0gb25seSBldmVyIHF1ZXJpZWQgb25jZSBwZXIgYm9va2luZyAocmUtcXVlcmllZCBhZnRlciBhIHN1Y2Nlc3NmdWxcbiAgICogYWRkLCBzaW5jZSB3aGF0J3MgYWRkYWJsZSBqdXN0IGNoYW5nZWQpLiBCZXN0LWVmZm9ydDogYSBmYWlsdXJlIGp1c3QgbGVhdmVzIHRoZSBhY3Rpb25cbiAgICogaGlkZGVuLCBzYW1lIGFzIHRoaXMgY29tcG9uZW50J3Mgb3RoZXIgbm9uLWNyaXRpY2FsIGxvb2t1cHMuICovXG4gIHByaXZhdGUgY2hlY2tBZGRTZXJ2aWNlQXZhaWxhYmlsaXR5KGI6IEJvb2tpbmdSb3cpIHtcbiAgICBpZiAoYi5zdGF0dXMgIT09ICdCT09LRUQnIHx8IGIuYWRkU2VydmljZUF2YWlsYWJsZSAhPT0gdW5kZWZpbmVkKSByZXR1cm47XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBZGRTZXJ2aWNlT3B0aW9ucyhiLmdyb3VwSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIGIuYWRkU2VydmljZUF2YWlsYWJsZSA9IChyZXMgPz8gW10pLmxlbmd0aCA+IDA7XG4gICAgfSwgKCkgPT4ge1xuICAgICAgYi5hZGRTZXJ2aWNlQXZhaWxhYmxlID0gZmFsc2U7XG4gICAgfSk7XG4gIH1cbiAgYmFja1RvTGlzdCgpIHtcbiAgICB0aGlzLmN1cnJlbnRUYWIgPSAnTElTVCc7XG4gICAgdGhpcy5zZWxlY3RlZCA9IG51bGw7XG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gZmFsc2U7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVzY2hlZHVsZVxuXG4gIG9wZW5SZXNjaGVkdWxlUGFuZWwoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaGVkdWxlUGFuZWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gJyc7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5idWlsZFJlc2NoRGF5U3RyaXAoKTtcbiAgICBpZiAodGhpcy5yZXNjaERheXMubGVuZ3RoKSB0aGlzLnNlbGVjdFJlc2NoRGF5KHRoaXMucmVzY2hEYXlzWzBdKTtcbiAgfVxuICBjbG9zZVJlc2NoZWR1bGVQYW5lbCgpIHtcbiAgICB0aGlzLnJlc2NoZWR1bGVQYW5lbE9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSZXNjaERheVN0cmlwKCkge1xuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcbiAgICB0b2RheS5zZXRIb3VycygwLCAwLCAwLCAwKTtcbiAgICB0aGlzLnJlc2NoRGF5cyA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgMTQ7IGkrKykge1xuICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKHRvZGF5KTtcbiAgICAgIGQuc2V0RGF0ZShkLmdldERhdGUoKSArIGkpO1xuICAgICAgdGhpcy5yZXNjaERheXMucHVzaCh7XG4gICAgICAgIGlzbzogZC50b0lTT1N0cmluZygpLFxuICAgICAgICBkb3c6IGQudG9Mb2NhbGVEYXRlU3RyaW5nKCdlbi1JTicsIHsgd2Vla2RheTogJ3Nob3J0JyB9KSxcbiAgICAgICAgbnVtOiBkLnRvTG9jYWxlRGF0ZVN0cmluZygnZW4tSU4nLCB7IGRheTogJ251bWVyaWMnIH0pLFxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgLyoqIE1vdXNlIHVzZXJzIGhhdmUgbm8gc3dpcGUvdHJhY2twYWQgZ2VzdHVyZSBmb3IgdGhlIGhvcml6b250YWxseS1zY3JvbGxpbmcgZGF5IHN0cmlwIC0gZ2l2ZVxuICAgKiB0aGVtIGV4cGxpY2l0IHByZXYvbmV4dCBhcnJvd3MgaW5zdGVhZCBvZiByZWx5aW5nIG9uIHNoaWZ0K3doZWVsIChtYXRjaGVzIHRoZSBhZG1pbiBzaWRlJ3NcbiAgICogUmVzY2hlZHVsZUFwcG9pbnRtZW50Q29tcG9uZW50I3Njcm9sbERheXMpLiAqL1xuICBzY3JvbGxSZXNjaERheXMoZGlyZWN0aW9uOiBudW1iZXIpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMucmVzY2hEYXlTdHJpcFJlZj8ubmF0aXZlRWxlbWVudDtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgZWwuc2Nyb2xsQnkoeyBsZWZ0OiBkaXJlY3Rpb24gKiAxNjAsIGJlaGF2aW9yOiAnc21vb3RoJyB9KTtcbiAgfVxuXG4gIHNlbGVjdFJlc2NoRGF5KGRheTogeyBpc286IHN0cmluZyB9KSB7XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkSXNvID0gZGF5LmlzbztcbiAgICB0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lID0gJyc7XG4gICAgdGhpcy5yZXNjaEVycm9yID0gJyc7XG4gICAgdGhpcy5mZXRjaFJlc2NoU2xvdHMoKTtcbiAgfVxuXG4gIHByaXZhdGUgZmV0Y2hSZXNjaFNsb3RzKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSB0cnVlO1xuICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gZmFsc2U7XG4gICAgdGhpcy5yZXNjaFNsb3RzID0gW107XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRSZXNjaGVkdWxlU2xvdHModGhpcy5zZWxlY3RlZC5ncm91cElkLCB0aGlzLnJlc2NoU2VsZWN0ZWRJc28pLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hMb2FkaW5nU2xvdHMgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hTbG90cyA9IHJlcyA/PyBbXTtcbiAgICAgIHRoaXMucmVzY2hOb1Nsb3RzID0gdGhpcy5yZXNjaFNsb3RzLmxlbmd0aCA9PT0gMDtcbiAgICB9LCAoKSA9PiB7XG4gICAgICB0aGlzLnJlc2NoTG9hZGluZ1Nsb3RzID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoTm9TbG90cyA9IHRydWU7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RSZXNjaFRpbWUodGltZTogc3RyaW5nKSB7XG4gICAgdGhpcy5yZXNjaFNlbGVjdGVkVGltZSA9IHRpbWU7XG4gIH1cblxuICBnZXQgcmVzY2hJbnZhbGlkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiAhdGhpcy5yZXNjaFNlbGVjdGVkSXNvIHx8ICF0aGlzLnJlc2NoU2VsZWN0ZWRUaW1lIHx8IHRoaXMucmVzY2hDb25maXJtaW5nO1xuICB9XG5cbiAgY29uZmlybVJlc2NoZWR1bGUoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMucmVzY2hJbnZhbGlkKSByZXR1cm47XG4gICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMucmVzY2hFcnJvciA9ICcnO1xuICAgIHRoaXMucmVzdFNlcnZpY2UucmVzY2hlZHVsZUJvb2tpbmcodGhpcy5zZWxlY3RlZC5ncm91cElkLCB0aGlzLnJlc2NoU2VsZWN0ZWRJc28sIHRoaXMucmVzY2hTZWxlY3RlZFRpbWUpLnN1YnNjcmliZSgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNjaENvbmZpcm1pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMucmVzY2hlZHVsZVBhbmVsT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5ib29raW5nRGF0ZSA9IGdyb3VwPy5ib29raW5nRGF0ZSA/PyB0aGlzLnJlc2NoU2VsZWN0ZWRJc287XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQuc3RhcnRUaW1lID0gZ3JvdXA/LnN0YXJ0VGltZSA/PyB0aGlzLnNlbGVjdGVkLnN0YXJ0VGltZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5lbmRUaW1lID0gZ3JvdXA/LmVuZFRpbWUgPz8gdGhpcy5zZWxlY3RlZC5lbmRUaW1lO1xuICAgICAgICB0aGlzLnNlbGVjdGVkLmNhblJlc2NoZWR1bGUgPSBncm91cD8uY2FuUmVzY2hlZHVsZSA/PyBmYWxzZTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA9IGdyb3VwPy5yZXNjaGVkdWxlQmxvY2tlZFJlYXNvbiA/PyAnJztcbiAgICAgIH1cbiAgICAgIHRoaXMuc3BsaXRCb29raW5ncygpO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5OiAnQm9va2luZyByZXNjaGVkdWxlZCcgfSk7XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzY2hDb25maXJtaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLnJlc2NoRXJyb3IgPSBlcnJvcj8uZXJyb3I/Lm1lc3NhZ2UgfHwgZXJyb3I/LmVycm9yPy5kZXRhaWwgfHwgJ1VuYWJsZSB0byByZXNjaGVkdWxlIHRoaXMgYm9va2luZyc7XG4gICAgfSk7XG4gIH1cblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQWRkIFNlcnZpY2VcblxuICBhZGRTZXJ2aWNlUGFuZWxPcGVuID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VMb2FkaW5nID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VPcHRpb25zOiBhbnlbXSA9IFtdO1xuICBhZGRTZXJ2aWNlU2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIGFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gIGFkZFNlcnZpY2VFcnJvciA9ICcnO1xuXG4gIG9wZW5BZGRTZXJ2aWNlUGFuZWwoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5hZGRTZXJ2aWNlUGFuZWxPcGVuID0gdHJ1ZTtcbiAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9ICcnO1xuICAgIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkID0gW107XG4gICAgdGhpcy5hZGRTZXJ2aWNlTG9hZGluZyA9IHRydWU7XG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBZGRTZXJ2aWNlT3B0aW9ucyh0aGlzLnNlbGVjdGVkLmdyb3VwSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkU2VydmljZUxvYWRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRkU2VydmljZU9wdGlvbnMgPSByZXMgPz8gW107XG4gICAgfSwgKCkgPT4ge1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlTG9hZGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5hZGRTZXJ2aWNlT3B0aW9ucyA9IFtdO1xuICAgIH0pO1xuICB9XG4gIGNsb3NlQWRkU2VydmljZVBhbmVsKCkge1xuICAgIHRoaXMuYWRkU2VydmljZVBhbmVsT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgaXNBZGRTZXJ2aWNlU2VsZWN0ZWQoc2VydmljZTogYW55KTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLnNvbWUoKHMpID0+IHMuc2VydmljZUlkID09PSBzZXJ2aWNlLnNlcnZpY2VJZCk7XG4gIH1cbiAgdG9nZ2xlQWRkU2VydmljZShzZXJ2aWNlOiBhbnkpIHtcbiAgICBjb25zdCBpbmRleCA9IHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmZpbmRJbmRleCgocykgPT4gcy5zZXJ2aWNlSWQgPT09IHNlcnZpY2Uuc2VydmljZUlkKTtcbiAgICBpZiAoaW5kZXggPiAtMSkgdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBlbHNlIHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLnB1c2goc2VydmljZSk7XG4gIH1cblxuICAvKiogTWlycm9ycyBhcHBvaW50bWVudF9zZXJ2aWNlJ3MgRGVwb3NpdFV0aWxzI2dldFNlcnZpY2VEZXBvc2l0QW1vdW50IGV4YWN0bHkgLSBmaXhlZCBhbW91bnRcbiAgICogdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHBlcmNlbnQsIDAgd2hlbiBubyBkZXBvc2l0IGlzIGNvbmZpZ3VyZWQuIE9ubHkgdXNlZCB0byBkZWNpZGUgd2hpY2hcbiAgICogZW5kcG9pbnQgdG8gY2FsbCAoYSBsaXZlIENhc2hmcmVlIGNoZWNrb3V0IHZzLiB0aGUgZGlyZWN0IGFkZCkgLSB0aGUgYmFja2VuZCByZS1kZXJpdmVzIHRoaXNcbiAgICogaXRzZWxmIGFuZCBuZXZlciB0cnVzdHMgYSBjbGllbnQtY29tcHV0ZWQgYW1vdW50LiAqL1xuICBwcml2YXRlIHNlcnZpY2VEZXBvc2l0KHNlcnZpY2U6IGFueSk6IG51bWJlciB7XG4gICAgY29uc3QgZCA9IHNlcnZpY2U/LmRlcG9zaXRBbW91bnQ7XG4gICAgaWYgKCFkPy5kZXBvc2l0UmVxdWlyZWQpIHJldHVybiAwO1xuICAgIGlmIChkLmZpeGVkQW1vdW50ID4gMCkgcmV0dXJuIGQuZml4ZWRBbW91bnQ7XG4gICAgY29uc3QgcHJpY2UgPSBzZXJ2aWNlPy5wcmljZURldGFpbHM/LnRvdGFsUHJpY2UgPz8gMDtcbiAgICByZXR1cm4gKChkLmRlcG9zaXRQZXJjZW50ID8/IDApIC8gMTAwKSAqIHByaWNlO1xuICB9XG5cbiAgLyoqIFN1bW1lZCBhY3Jvc3MgZXZlcnkgY3VycmVudGx5LWNoZWNrZWQgc2VydmljZSAtIGRyaXZlcyBib3RoIHRoZSBydW5uaW5nIHRvdGFsIHNob3duIGluIHRoZVxuICAgKiBwYW5lbCBhbmQgd2hpY2ggZW5kcG9pbnQgYWRkU2VydmljZSgpIGNhbGxzIChzYW1lIHRvdGFsIHRoZSBiYWNrZW5kIGluZGVwZW5kZW50bHkgcmUtZGVyaXZlc1xuICAgKiBhbmQgYWN0dWFsbHkgZW5mb3JjZXMpLiAqL1xuICBnZXQgYWRkU2VydmljZVRvdGFsRGVwb3NpdCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5yZWR1Y2UoKHN1bSwgcykgPT4gc3VtICsgdGhpcy5zZXJ2aWNlRGVwb3NpdChzKSwgMCk7XG4gIH1cblxuICBhZGRTZXJ2aWNlKCkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZCB8fCB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nIHx8ICF0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGgpIHJldHVybjtcbiAgICBjb25zdCBzZXJ2aWNlSWRzID0gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWQubWFwKChzKSA9PiBzLnNlcnZpY2VJZCk7XG4gICAgY29uc3QgZGVwb3NpdCA9IHRoaXMuYWRkU2VydmljZVRvdGFsRGVwb3NpdDtcbiAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gdHJ1ZTtcbiAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9ICcnO1xuXG4gICAgaWYgKGRlcG9zaXQgPD0gMCkge1xuICAgICAgdGhpcy5yZXN0U2VydmljZS5hZGRTZXJ2aWNlVG9Cb29raW5nKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgc2VydmljZUlkcykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VQYW5lbE9wZW4gPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc3VtbWFyeSA9IHRoaXMuYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA9PT0gMVxuICAgICAgICAgID8gdGhpcy5hZGRTZXJ2aWNlU2VsZWN0ZWRbMF0ubmFtZSArICcgYWRkZWQnXG4gICAgICAgICAgOiB0aGlzLmFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggKyAnIHNlcnZpY2VzIGFkZGVkJztcbiAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ3N1Y2Nlc3MnLCBzdW1tYXJ5IH0pO1xuICAgICAgICB0aGlzLnJlZnJlc2hTZWxlY3RlZFNlcnZpY2VMaW5lcygpO1xuICAgICAgICBpZiAodGhpcy5zZWxlY3RlZCkge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuYWRkU2VydmljZUF2YWlsYWJsZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICB0aGlzLmNoZWNrQWRkU2VydmljZUF2YWlsYWJpbGl0eSh0aGlzLnNlbGVjdGVkKTtcbiAgICAgICAgfVxuICAgICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgICAgdGhpcy5hZGRTZXJ2aWNlU3VibWl0dGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFkZFNlcnZpY2VFcnJvciA9IGVycm9yPy5lcnJvcj8ubWVzc2FnZSB8fCAnVW5hYmxlIHRvIGFkZCB0aGVzZSBzZXJ2aWNlcyc7XG4gICAgICB9KTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEZXBvc2l0IHJlcXVpcmVkIC0gbm90aGluZyBpcyBhdHRhY2hlZCB0byB0aGUgYm9va2luZyB1bnRpbCB0aGlzIHBheW1lbnQgaXMgdmVyaWZpZWRcbiAgICAvLyAoQm9va2luZ0dyb3VwU2VydmljZSNjb25maXJtU2VydmljZUFkZE9uKSwgc2FtZSBsaXZlLWNoZWNrb3V0IHBhdHRlcm4gdGhlIG9yaWdpbmFsIGJvb2tpbmdcbiAgICAvLyBmbG93IGFscmVhZHkgdXNlcyAoc2VlIHRoaXMgY29tcG9uZW50J3Mgb3duIGNvbmZpcm1SZXNjaGVkdWxlL2NhbmNlbEJvb2tpbmcgbmVpZ2hib3JzIC1cbiAgICAvLyBub25lIG9mIHRob3NlIHRvdWNoIHBheW1lbnQgLSBhbmQgYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQudHMncyBob2xkQm9va2luZyBzdWNjZXNzXG4gICAgLy8gaGFuZGxlciBmb3IgdGhlIGFjdHVhbCBwcmVjZWRlbnQpLiBPbmUgY2hlY2tvdXQgZm9yIHRoZSB3aG9sZSBiYXRjaCdzIHN1bW1lZCBkZXBvc2l0LlxuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2VuZXJhdGVBZGRTZXJ2aWNlUGF5bWVudFRva2VuKHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZCwgc2VydmljZUlkcykuc3Vic2NyaWJlKChvcmRlcjogYW55KSA9PiB7XG4gICAgICB0aGlzLmFkZFNlcnZpY2VTdWJtaXR0aW5nID0gZmFsc2U7XG4gICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYWRkT25QYXltZW50SWQnLCBvcmRlci5wZ09yZGVySWQpO1xuICAgICAgdGhpcy5ldmVudHNTZXJ2aWNlLmNhc2hGcmVlRXZlbnQuZW1pdCh7IGRhdGE6IHsgb3JkZXJTaWduYXR1cmU6IG9yZGVyLm9yZGVyU2lnbmF0dXJlIH0gfSk7XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuYWRkU2VydmljZVN1Ym1pdHRpbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuYWRkU2VydmljZUVycm9yID0gZXJyb3I/LmVycm9yPy5tZXNzYWdlIHx8ICdVbmFibGUgdG8gc3RhcnQgcGF5bWVudCBmb3IgdGhlc2Ugc2VydmljZXMnO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWZyZXNoU2VsZWN0ZWRTZXJ2aWNlTGluZXMoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgY29uc3QgZ3JvdXBJZCA9IHRoaXMuc2VsZWN0ZWQuZ3JvdXBJZDtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEdyb3VwTGluZXMoZ3JvdXBJZCkucGlwZShjYXRjaEVycm9yKCgpID0+IG9mKFtdKSkpLnN1YnNjcmliZSgobGluZXM6IGFueSkgPT4ge1xuICAgICAgY29uc3QgYm9va2luZyA9IHRoaXMuYWxsQm9va2luZ3MuZmluZCgoYikgPT4gYi5ncm91cElkID09PSBncm91cElkKTtcbiAgICAgIGNvbnN0IHNlcnZpY2VzID0gKGxpbmVzID8/IFtdKS5mbGF0TWFwKChsOiBhbnkpID0+IChsLnNlcnZpY2VzID8/IFtdKS5tYXAoKHM6IGFueSkgPT4gKHtcbiAgICAgICAgbmFtZTogcy5uYW1lLCBkdXJhdGlvbk1pbnV0ZXM6IHMuZHVyYXRpb25NaW51dGVzLCBwcmljZTogcy5wcmljZVxuICAgICAgfSkpKTtcbiAgICAgIGlmIChib29raW5nKSBib29raW5nLnNlcnZpY2VzID0gc2VydmljZXM7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZD8uZ3JvdXBJZCA9PT0gZ3JvdXBJZCkgdGhpcy5zZWxlY3RlZC5zZXJ2aWNlcyA9IHNlcnZpY2VzO1xuICAgIH0pO1xuICB9XG5cbiAgb3BlbkNhbmNlbENvbmZpcm0oKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkKSByZXR1cm47XG4gICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IHRydWU7XG4gIH1cbiAgY2xvc2VDYW5jZWxDb25maXJtKCkge1xuICAgIHRoaXMuY2FuY2VsQ29uZmlybU9wZW4gPSBmYWxzZTtcbiAgfVxuXG4gIGNhbmNlbEJvb2tpbmcoKSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkIHx8IHRoaXMuY2FuY2VsbGluZykgcmV0dXJuO1xuICAgIHRoaXMuY2FuY2VsbGluZyA9IHRydWU7XG4gICAgdGhpcy5yZXN0U2VydmljZS5jYW5jZWxCb29raW5nR3JvdXAodGhpcy5zZWxlY3RlZC5ncm91cElkLCAnQ2FuY2VsbGVkIGJ5IGN1c3RvbWVyJykuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMuY2FuY2VsbGluZyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYW5jZWxDb25maXJtT3BlbiA9IGZhbHNlO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHRoaXMuc2VsZWN0ZWQuc3RhdHVzID0gJ0NBTkNFTExFRCc7XG4gICAgICB0aGlzLnNwbGl0Qm9va2luZ3MoKTtcbiAgICAgIHRoaXMubWVzc2FnZVNlcnZpY2UuYWRkKHsgc2V2ZXJpdHk6ICdzdWNjZXNzJywgc3VtbWFyeTogJ0Jvb2tpbmcgY2FuY2VsbGVkJyB9KTtcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5jYW5jZWxsaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnRXJyb3InLCBkZXRhaWw6IGVycm9yPy5lcnJvcj8uZGV0YWlsID8/ICdDb3VsZCBub3QgY2FuY2VsIHRoaXMgYm9va2luZycgfSk7XG4gICAgfSk7XG4gIH1cbn1cbiIsIjxwLXRvYXN0IHBvc2l0aW9uPVwiYm90dG9tLXJpZ2h0XCI+PC9wLXRvYXN0PlxuXG48ZGl2IGNsYXNzPVwibWItcm9vdFwiPlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwiY3VycmVudFRhYiA9PT0gJ0xJU1QnXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXRpdGxlXCI+TXkgQm9va2luZ3M8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi10YWJzXCI+XG4gICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXRhYlwiIFtjbGFzcy5hY3RpdmVdPVwicHJvZlRhYiA9PT0gJ3VwY29taW5nJ1wiIChjbGljayk9XCJzZXRQcm9mVGFiKCd1cGNvbWluZycpXCI+VXBjb21pbmc8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItdGFiXCIgW2NsYXNzLmFjdGl2ZV09XCJwcm9mVGFiID09PSAncGFzdCdcIiAoY2xpY2spPVwic2V0UHJvZlRhYigncGFzdCcpXCI+UGFzdDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWxvYWRpbmdcIiAqbmdJZj1cImxvYWRpbmdcIj5Mb2FkaW5nIHlvdXIgYm9va2luZ3PigKY8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtYi1yb3dzXCIgKm5nSWY9XCIhbG9hZGluZyAmJiAhaXNFbXB0eVwiPlxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yb3dcIiAqbmdGb3I9XCJsZXQgYiBvZiByb3dzXCIgKGNsaWNrKT1cInZpZXdCb29raW5nRGV0YWlsKGIpXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctc3RyaXBlXCIgW25nQ2xhc3NdPVwiYi5tb2RlID09PSAnSE9NRV9WSVNJVCcgPyAnc3RyaXBlLWhvbWUnIDogYi5tb2RlID09PSAnVklERU9fQ0FMTCcgPyAnc3RyaXBlLXZpZGVvJyA6ICdzdHJpcGUtc3RvcmUnXCI+PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctaW5mb1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctdG9wXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LXRpdGxlXCI+e3t0aXRsZShiKX19PC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJvdy13aGVuXCI+e3t3aGVuKGIpfX08L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcm93LWRldGFpbFwiPnt7ZGV0YWlsKGIpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yb3ctZW5kXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhiLnN0YXR1cylcIj57e3N0YXR1c0xhYmVsKGIuc3RhdHVzKX19PC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWVtcHR5XCIgKm5nSWY9XCJpc0VtcHR5XCI+XG4gICAgICA8bWF0LWljb24gY2xhc3M9XCJtYi1lbXB0eS1pY29uXCI+ZXZlbnRfYnVzeTwvbWF0LWljb24+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZW1wdHktdGl0bGVcIj5ObyB7e3Byb2ZUYWJ9fSBib29raW5ncyB5ZXQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJjdXJyZW50VGFiID09PSAnREVUQUlMJyAmJiBzZWxlY3RlZFwiPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItYmFja1wiIChjbGljayk9XCJiYWNrVG9MaXN0KClcIj5cbiAgICAgIDxtYXQtaWNvbj5hcnJvd19iYWNrPC9tYXQtaWNvbj4gQmFjayB0byBNeSBCb29raW5nc1xuICAgIDwvYnV0dG9uPlxuXG4gICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1jYXJkXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXRpdGxlLXJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdGl0bGVcIj57e3RpdGxlKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1zdGF0dXNcIiBbbmdDbGFzc109XCJzdGF0dXNDbGFzcyhzZWxlY3RlZC5zdGF0dXMpXCI+e3tzdGF0dXNMYWJlbChzZWxlY3RlZC5zdGF0dXMpfX08L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXdoZW5cIj57e3doZW4oc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd3NcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnNlcnZpY2VzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlczwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7c2VydmljZU5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQucHJvZHVjdExpbmVzPy5sZW5ndGhcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Qcm9kdWN0czwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cHJvZHVjdE5hbWVzKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwic2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWxcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Db250YWN0PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+e3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8ubmFtZX19IMK3IHt7c2VsZWN0ZWQuY3VzdG9tZXJEZXRhaWw/LnBob25lTnVtYmVyfX0gwrcge3tzZWxlY3RlZC5jdXN0b21lckRldGFpbD8uZW1haWx9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLm1vZGUgPT09ICdIT01FX1ZJU0lUJyAmJiBzZWxlY3RlZC5hZGRyZXNzRGV0YWlsc1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkFkZHJlc3M8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXZcIj57e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZTF9fSwge3tzZWxlY3RlZC5hZGRyZXNzRGV0YWlscz8uY2l0eX19LCB7e3NlbGVjdGVkLmFkZHJlc3NEZXRhaWxzPy5zdGF0ZX19IHt7c2VsZWN0ZWQuYWRkcmVzc0RldGFpbHM/LnppcENvZGV9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlcnZpY2VQcmljZVRvdGFsKHNlbGVjdGVkKSA+IDBcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5TZXJ2aWNlIHByaWNlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZXJ2aWNlUHJpY2VUb3RhbChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLmhvbWVWaXNpdENoYXJnZVwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwta1wiPkhvbWUgdmlzaXQgY2hhcmdlPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC12XCI+4oK5e3tzZWxlY3RlZC5ob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1yb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLWtcIj5Ub3RhbDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7dG90YWxEdWUoc2VsZWN0ZWQpfX08L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtcm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGFpZDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPnt7cGFpZExhYmVsKHNlbGVjdGVkKX19PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItZGV0YWlsLXJvd1wiICpuZ0lmPVwicGVuZGluZ0Ftb3VudChzZWxlY3RlZCkgPiAwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWRldGFpbC1rXCI+UGVuZGluZyBhdCBhcHBvaW50bWVudDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1kZXRhaWwtdlwiPuKCuXt7cGVuZGluZ0Ftb3VudChzZWxlY3RlZCl9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItdmlkZW8tbGlua1wiICpuZ0lmPVwic2VsZWN0ZWQubW9kZSA9PT0gJ1ZJREVPX0NBTEwnICYmIHNlbGVjdGVkLnZpZGVvQ2FsbExpbmsgJiYgc2VsZWN0ZWQuc3RhdHVzICE9PSAnQ0FOQ0VMTEVEJ1wiPlxuICAgICAgICA8bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPlxuICAgICAgICA8YSBbaHJlZl09XCJzZWxlY3RlZC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tzZWxlY3RlZC52aWRlb0NhbGxMaW5rfX08L2E+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXBvbGljeVwiICpuZ0lmPVwiY2FuUmVzY2hlZHVsZVNlbGVjdGVkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGl0bGVcIj5SZXNjaGVkdWxlIHBvbGljeTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj5Zb3UgY2FuIHJlc2NoZWR1bGUgdGhpcyBib29raW5nIHVwIHRvIHt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzfX0gaG91cnt7cmVzY2hlZHVsZUN1dG9mZkhvdXJzID09PSAxID8gJycgOiAncyd9fSBiZWZvcmUgdGhlIGFwcG9pbnRtZW50IHRpbWUuPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3lcIiAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkICYmIGNhbmNlbGxhdGlvblBvbGljeVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRleHRcIj57e2NhbmNlbGxhdGlvblBvbGljeS5wb2xpY3lEZXRhaWxzfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItYWN0aW9ucy1yb3dcIiAqbmdJZj1cInNlbGVjdGVkLnN0YXR1cyA9PT0gJ0JPT0tFRCcgfHwgY2FuQ2FuY2VsU2VsZWN0ZWRcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwibWItcmVzY2hlZHVsZS1idG5cIlxuICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQk9PS0VEJ1wiXG4gICAgICAgICAgW2Rpc2FibGVkXT1cIiFjYW5SZXNjaGVkdWxlU2VsZWN0ZWRcIlxuICAgICAgICAgIFt0aXRsZV09XCIhY2FuUmVzY2hlZHVsZVNlbGVjdGVkID8gc2VsZWN0ZWQucmVzY2hlZHVsZUJsb2NrZWRSZWFzb24gOiAnJ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlblJlc2NoZWR1bGVQYW5lbCgpXCJcbiAgICAgICAgPlJlc2NoZWR1bGUgYm9va2luZzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgKm5nSWY9XCJjYW5BZGRTZXJ2aWNlU2VsZWN0ZWRcIlxuICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICBbc3R5bGUuY29sb3JdPVwic3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgKGNsaWNrKT1cIm9wZW5BZGRTZXJ2aWNlUGFuZWwoKVwiXG4gICAgICAgID5BZGQgc2VydmljZTwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1jYW5jZWwtYnRuXCJcbiAgICAgICAgICAqbmdJZj1cImNhbkNhbmNlbFNlbGVjdGVkXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwib3BlbkNhbmNlbENvbmZpcm0oKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e2NhbmNlbGxpbmcgPyAnQ2FuY2VsbGluZ+KApicgOiAnQ2FuY2VsIGJvb2tpbmcnfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cblxuICAgICAgPGRpdiBjbGFzcz1cIm1iLWFjdGlvbnMtcm93XCIgKm5nSWY9XCJzZWxlY3RlZC5pbnZvaWNlSWQgJiYgc2VsZWN0ZWQuc3RhdHVzID09PSAnQ09NUExFVEVEJ1wiPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaGVkdWxlLWJ0blwiXG4gICAgICAgICAgW3N0eWxlLmJvcmRlckNvbG9yXT1cInN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRJbnZvaWNlKClcIlxuICAgICAgICA+RG93bmxvYWQgaW52b2ljZTwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1jYW5jZWxsZWQtbm90ZVwiICpuZ0lmPVwic2VsZWN0ZWQuc3RhdHVzID09PSAnQ0FOQ0VMTEVEJ1wiPlRoaXMgYm9va2luZyBoYXMgYmVlbiBjYW5jZWxsZWQuPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1iYWNrZHJvcFwiICpuZ0lmPVwicmVzY2hlZHVsZVBhbmVsT3BlblwiIChjbGljayk9XCJjbG9zZVJlc2NoZWR1bGVQYW5lbCgpXCI+XG4gICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXBhbmVsXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWhlYWRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtdGl0bGVcIj5DaG9vc2UgYSBuZXcgZGF0ZSAmYW1wOyB0aW1lPC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPiZ0aW1lczs8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZGF5c3RyaXAtcm93XCI+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKC0xKVwiPlxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjE2XCIgaGVpZ2h0PVwiMTZcIiB2aWV3Qm94PVwiMCAwIDI0IDI0XCIgZmlsbD1cIm5vbmVcIiBzdHJva2U9XCJjdXJyZW50Q29sb3JcIiBzdHJva2Utd2lkdGg9XCIyLjJcIiBzdHJva2UtbGluZWNhcD1cInJvdW5kXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIj48cGF0aCBkPVwiTTE1IDE4bC02LTYgNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1kYXlzdHJpcFwiICNyZXNjaERheVN0cmlwPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1kYXlcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgZGF5IG9mIHJlc2NoRGF5c1wiXG4gICAgICAgICAgICAgIFtjbGFzcy5hY3RpdmVdPVwiZGF5LmlzbyA9PT0gcmVzY2hTZWxlY3RlZElzb1wiXG4gICAgICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBzdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIDogbnVsbFwiXG4gICAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0UmVzY2hEYXkoZGF5KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItcmVzY2gtZGF5LWRvd1wiIFtzdHlsZS5jb2xvcl09XCJkYXkuaXNvID09PSByZXNjaFNlbGVjdGVkSXNvID8gY29udHJhc3RDb2xvciA6IG51bGxcIj57e2RheS5kb3d9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYi1yZXNjaC1kYXktbnVtXCIgW3N0eWxlLmNvbG9yXT1cImRheS5pc28gPT09IHJlc2NoU2VsZWN0ZWRJc28gPyBjb250cmFzdENvbG9yIDogbnVsbFwiPnt7ZGF5Lm51bX19PC9zcGFuPlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1uYXZcIiAoY2xpY2spPVwic2Nyb2xsUmVzY2hEYXlzKDEpXCI+XG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiMTZcIiBoZWlnaHQ9XCIxNlwiIHZpZXdCb3g9XCIwIDAgMjQgMjRcIiBmaWxsPVwibm9uZVwiIHN0cm9rZT1cImN1cnJlbnRDb2xvclwiIHN0cm9rZS13aWR0aD1cIjIuMlwiIHN0cm9rZS1saW5lY2FwPVwicm91bmRcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiPjxwYXRoIGQ9XCJNOSAxOGw2LTYtNi02XCI+PC9wYXRoPjwvc3ZnPlxuICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtbG9hZGluZ1wiICpuZ0lmPVwicmVzY2hMb2FkaW5nU2xvdHNcIj5Mb2FkaW5nIGF2YWlsYWJsZSB0aW1lc+KApjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHMtZW1wdHlcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaE5vU2xvdHNcIj5ObyBzbG90cyBhdmFpbGFibGUgb24gdGhpcyBkYXRlLiBUcnkgYW5vdGhlciBkYXRlLjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtc2xvdHNcIiAqbmdJZj1cIiFyZXNjaExvYWRpbmdTbG90cyAmJiByZXNjaFNsb3RzLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1zbG90XCJcbiAgICAgICAgICAgICpuZ0Zvcj1cImxldCBzbG90IG9mIHJlc2NoU2xvdHNcIlxuICAgICAgICAgICAgW2NsYXNzLmFjdGl2ZV09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZVwiXG4gICAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5ib3JkZXJDb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCJzbG90ID09PSByZXNjaFNlbGVjdGVkVGltZSA/IGNvbnRyYXN0Q29sb3IgOiBudWxsXCJcbiAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RSZXNjaFRpbWUoc2xvdClcIlxuICAgICAgICAgID57e3Nsb3R9fTwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtZXJyb3JcIiAqbmdJZj1cInJlc2NoRXJyb3JcIj57e3Jlc2NoRXJyb3J9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VSZXNjaGVkdWxlUGFuZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwicmVzY2hJbnZhbGlkXCJcbiAgICAgICAgICBbc3R5bGUuYmFja2dyb3VuZF09XCJyZXNjaEludmFsaWQgPyBudWxsIDogc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvclwiXG4gICAgICAgICAgW3N0eWxlLmNvbG9yXT1cInJlc2NoSW52YWxpZCA/IG51bGwgOiBjb250cmFzdENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiY29uZmlybVJlc2NoZWR1bGUoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7e3Jlc2NoQ29uZmlybWluZyA/ICdDb25maXJtaW5n4oCmJyA6ICdDb25maXJtIG5ldyBzbG90J319XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1iYWNrZHJvcFwiICpuZ0lmPVwiY2FuY2VsQ29uZmlybU9wZW5cIiAoY2xpY2spPVwiY2xvc2VDYW5jZWxDb25maXJtKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtcGFuZWxcIiAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtaGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC10aXRsZVwiPkNhbmNlbCB0aGlzIGJvb2tpbmc/PC9kaXY+XG4gICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwibWItcmVzY2gtY2xvc2VcIiAoY2xpY2spPVwiY2xvc2VDYW5jZWxDb25maXJtKClcIj4mdGltZXM7PC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPlRoaXMgY2FuJ3QgYmUgdW5kb25lLjwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5XCIgKm5nSWY9XCJjYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItcG9saWN5LXRpdGxlXCI+e3tjYW5jZWxsYXRpb25Qb2xpY3kudGl0bGV9fTwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi1wb2xpY3ktdGV4dFwiPnt7Y2FuY2VsbGF0aW9uUG9saWN5LnBvbGljeURldGFpbHN9fTwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLWZvb3RlclwiPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNhbmNlbFwiIChjbGljayk9XCJjbG9zZUNhbmNlbENvbmZpcm0oKVwiPktlZXAgYm9va2luZzwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cIm1iLXJlc2NoLWNvbmZpcm1cIiBbZGlzYWJsZWRdPVwiY2FuY2VsbGluZ1wiIChjbGljayk9XCJjYW5jZWxCb29raW5nKClcIj5cbiAgICAgICAgICB7e2NhbmNlbGxpbmcgPyAnQ2FuY2VsbGluZ+KApicgOiAnWWVzLCBjYW5jZWwgYm9va2luZyd9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibWItcmVzY2gtYmFja2Ryb3BcIiAqbmdJZj1cImFkZFNlcnZpY2VQYW5lbE9wZW5cIiAoY2xpY2spPVwiY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1wYW5lbFwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1oZWFkZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXRpdGxlXCI+QWRkIHNlcnZpY2Uocyk8L2Rpdj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jbG9zZVwiIChjbGljayk9XCJjbG9zZUFkZFNlcnZpY2VQYW5lbCgpXCI+JnRpbWVzOzwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1ib2R5XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1zbG90cy1sb2FkaW5nXCIgKm5nSWY9XCJhZGRTZXJ2aWNlTG9hZGluZ1wiPkxvYWRpbmcgc2VydmljZXPigKY8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1iLXJlc2NoLXNsb3RzLWVtcHR5XCIgKm5nSWY9XCIhYWRkU2VydmljZUxvYWRpbmcgJiYgYWRkU2VydmljZU9wdGlvbnMubGVuZ3RoID09PSAwXCI+XG4gICAgICAgICAgTm8gc2VydmljZXMgYXZhaWxhYmxlIHRvIGFkZCByaWdodCBub3cuXG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1hZGRzdmMtbGlzdFwiICpuZ0lmPVwiIWFkZFNlcnZpY2VMb2FkaW5nICYmIGFkZFNlcnZpY2VPcHRpb25zLmxlbmd0aFwiPlxuICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgY2xhc3M9XCJtYi1hZGRzdmMtcm93XCJcbiAgICAgICAgICAgIFtjbGFzcy5zZWxlY3RlZF09XCJpc0FkZFNlcnZpY2VTZWxlY3RlZChzZXJ2aWNlKVwiXG4gICAgICAgICAgICAqbmdGb3I9XCJsZXQgc2VydmljZSBvZiBhZGRTZXJ2aWNlT3B0aW9uc1wiXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiYWRkU2VydmljZVN1Ym1pdHRpbmdcIlxuICAgICAgICAgICAgKGNsaWNrKT1cInRvZ2dsZUFkZFNlcnZpY2Uoc2VydmljZSlcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cIm1iLWFkZHN2Yy1jaGVja2JveFwiIFtjaGVja2VkXT1cImlzQWRkU2VydmljZVNlbGVjdGVkKHNlcnZpY2UpXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiIChjaGFuZ2UpPVwidG9nZ2xlQWRkU2VydmljZShzZXJ2aWNlKVwiIC8+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZjFcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLWFkZHN2Yy1uYW1lXCI+XG4gICAgICAgICAgICAgICAge3tzZXJ2aWNlLm5hbWV9fVxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWItYWRkc3ZjLW1ldGFcIiAqbmdJZj1cInNlcnZpY2UuZHVyYXRpb25cIj57e3NlcnZpY2UuZHVyYXRpb259fSBtaW48L3NwYW4+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItYWRkc3ZjLXByaWNlXCIgKm5nSWY9XCJzZXJ2aWNlLnByaWNlRGV0YWlscz8udG90YWxQcmljZVwiPuKCuXt7c2VydmljZS5wcmljZURldGFpbHMudG90YWxQcmljZX19PC9kaXY+XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1hZGRzdmMtdG90YWxcIiAqbmdJZj1cImFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggJiYgYWRkU2VydmljZVRvdGFsRGVwb3NpdCA+IDBcIj5cbiAgICAgICAgICBEZXBvc2l0IGR1ZSBub3c6IOKCuXt7YWRkU2VydmljZVRvdGFsRGVwb3NpdH19XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1lcnJvclwiICpuZ0lmPVwiYWRkU2VydmljZUVycm9yXCI+e3thZGRTZXJ2aWNlRXJyb3J9fTwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJtYi1yZXNjaC1mb290ZXJcIiAqbmdJZj1cIiFhZGRTZXJ2aWNlTG9hZGluZyAmJiBhZGRTZXJ2aWNlT3B0aW9ucy5sZW5ndGhcIj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJtYi1yZXNjaC1jYW5jZWxcIiAoY2xpY2spPVwiY2xvc2VBZGRTZXJ2aWNlUGFuZWwoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJtYi1yZXNjaC1jb25maXJtXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiIWFkZFNlcnZpY2VTZWxlY3RlZC5sZW5ndGggfHwgYWRkU2VydmljZVN1Ym1pdHRpbmdcIlxuICAgICAgICAgIFtzdHlsZS5iYWNrZ3JvdW5kXT1cIiFhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoID8gbnVsbCA6IHN0eWxlcz8uYmFja2dyb3VuZD8uYWNjZW50Q29sb3JcIlxuICAgICAgICAgIFtzdHlsZS5jb2xvcl09XCIhYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA/IG51bGwgOiBjb250cmFzdENvbG9yXCJcbiAgICAgICAgICAoY2xpY2spPVwiYWRkU2VydmljZSgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIHt7YWRkU2VydmljZVN1Ym1pdHRpbmcgPyAnQWRkaW5n4oCmJyA6ICdBZGQgJyArIChhZGRTZXJ2aWNlU2VsZWN0ZWQubGVuZ3RoIHx8ICcnKSArICcgc2VydmljZScgKyAoYWRkU2VydmljZVNlbGVjdGVkLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnKX19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=