simpo-component-library 3.6.968 → 3.6.970
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -24
- package/esm2022/lib/components/delete-hover-element/delete-hover-element.component.mjs +3 -3
- package/esm2022/lib/components/deprecated-section/deprecated-section.component.mjs +1 -1
- package/esm2022/lib/components/document/document.component.mjs +3 -3
- package/esm2022/lib/components/image-loading/image-loading.component.mjs +3 -3
- package/esm2022/lib/components/payment-details/payment-details.component.mjs +3 -3
- package/esm2022/lib/constants/business.constant.mjs +1 -1
- package/esm2022/lib/directive/alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/blur-content.directive.mjs +1 -1
- package/esm2022/lib/directive/borderlessImage.directive.mjs +1 -1
- package/esm2022/lib/directive/button-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/button-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/color.directive.mjs +1 -1
- package/esm2022/lib/directive/column-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/container-alignment.directive.mjs +1 -1
- package/esm2022/lib/directive/container-fir.directive.mjs +1 -1
- package/esm2022/lib/directive/content-title-spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/contenteditable.directive.mjs +1 -1
- package/esm2022/lib/directive/corner-directive.mjs +1 -1
- package/esm2022/lib/directive/height.directive.mjs +1 -1
- package/esm2022/lib/directive/hover-animation.directive.mjs +1 -1
- package/esm2022/lib/directive/hoverborder.directive.mjs +1 -1
- package/esm2022/lib/directive/icon-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-container.directive.mjs +1 -1
- package/esm2022/lib/directive/image-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/image-editor.directive.mjs +1 -1
- package/esm2022/lib/directive/image-position.directive.mjs +1 -1
- package/esm2022/lib/directive/letters-only.directive.mjs +1 -1
- package/esm2022/lib/directive/merge-header.directive.mjs +1 -1
- package/esm2022/lib/directive/numbers-only.directive.mjs +1 -1
- package/esm2022/lib/directive/position-layout-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/set-dynamic-background.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-around.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing-horizontal.directive.mjs +1 -1
- package/esm2022/lib/directive/spacing.directive.mjs +1 -1
- package/esm2022/lib/directive/text-background-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/text-size.directive.mjs +1 -1
- package/esm2022/lib/directive/translate-onhover.directive.mjs +1 -1
- package/esm2022/lib/directive/video-directive.directive.mjs +1 -1
- package/esm2022/lib/directive/wrap-containers.directive.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/address/address.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authenticate-user/authenticate-user.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/authentication-required/authentication-required.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/book-appointment/book-appointment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/cart/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/categories-with-image-background-columns/categories-with-image-background-columns.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/category-product/category-product.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/category-product/category-product.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/checkout/checkout.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/checkout/checkout.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/customer-review/customer-review.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/enrollment-form/enrollment-form.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-category/featured-category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/featured-category/featured-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/featured-products/featured-products.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/item-varient/item-varient.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/new-collection/new-collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/order-details/order-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/pagnination/pagnination.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/passbook-transactions/passbook-transactions.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-category-list/product-category-list.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-desc/product-desc.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/product-list/product-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/product-list/product-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/refer-earn/refer-earn.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.component.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/returns-calculator/returns-calculator.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/scheme-details/scheme-details.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/scheme-selection/scheme-selection.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/schemes/schemes.component.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/small-product-listing/small-product-listing.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-list/store-list.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/store-page/store-page.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/store-page/store-page.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/user-basic-info/user-basic-info.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/user-profile/user-profile.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.component.mjs +3 -3
- package/esm2022/lib/ecommerce/sections/verify-payment/verify-payment.model.mjs +1 -1
- package/esm2022/lib/ecommerce/sections/whislist/whislist.component.mjs +3 -3
- package/esm2022/lib/ecommerce/styles/BaseCollection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/Collection.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/OrderedItems.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocation.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/PincodeLocationInter.model.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/cart.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/category.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/order.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/product.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/review.modal.mjs +1 -1
- package/esm2022/lib/ecommerce/styles/user.modal.mjs +1 -1
- package/esm2022/lib/elements/add-section/add-section.component.mjs +3 -3
- package/esm2022/lib/elements/address-list/address-list.component.mjs +3 -3
- package/esm2022/lib/elements/below-image-card/below-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/booking-cart-groups/booking-cart-groups.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.component.mjs +3 -3
- package/esm2022/lib/elements/button/button.model.mjs +1 -1
- package/esm2022/lib/elements/card-skeleton-loader/card-skeleton-loader.component.mjs +3 -3
- package/esm2022/lib/elements/covering-image-card/covering-image-card.component.mjs +3 -3
- package/esm2022/lib/elements/editor-service.service.mjs +1 -1
- package/esm2022/lib/elements/heading-element/heading-element.component.mjs +3 -3
- package/esm2022/lib/elements/index.mjs +1 -1
- package/esm2022/lib/elements/link-editor/link-editor.component.mjs +3 -3
- package/esm2022/lib/elements/list-home-appointment/list-home-appointment.component.mjs +3 -3
- package/esm2022/lib/elements/media-selector/media-selector.component.mjs +3 -3
- package/esm2022/lib/elements/my-bookings/my-bookings.component.mjs +3 -3
- package/esm2022/lib/elements/portfolio/portfolio.component.mjs +3 -3
- package/esm2022/lib/elements/pricing-s1/pricing-s1.component.mjs +3 -3
- package/esm2022/lib/elements/property/property.component.mjs +3 -3
- package/esm2022/lib/elements/simpo-button/simpo-button.component.mjs +3 -3
- package/esm2022/lib/elements/svg-divider/svg-divider.component.mjs +3 -3
- package/esm2022/lib/elements/text/text.component.mjs +3 -3
- package/esm2022/lib/elements/text-editor/text-editor.component.mjs +7 -7
- package/esm2022/lib/elements/top-of-image-card/top-of-image-card.component.mjs +3 -3
- package/esm2022/lib/pipes/amount.pipe.mjs +1 -1
- package/esm2022/lib/pipes/gender.pipe.mjs +1 -1
- package/esm2022/lib/sections/BaseSection.mjs +1 -1
- package/esm2022/lib/sections/add-new-section/add-new-section.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-booking/appointment-booking/appointment-booking.component.mjs +3 -3
- package/esm2022/lib/sections/appointment-form/appointment-form.model.mjs +1 -1
- package/esm2022/lib/sections/banner-carousel/banner-carousel.component.mjs +3 -3
- package/esm2022/lib/sections/banner-carousel/banner-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/banner-grid-section/banner-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.component.mjs +3 -3
- package/esm2022/lib/sections/blog-list/blog-list.model.mjs +1 -1
- package/esm2022/lib/sections/brand-story-section/brand-story-section.component.mjs +3 -3
- package/esm2022/lib/sections/brand-story-section/brand-story-section.modal.mjs +1 -1
- package/esm2022/lib/sections/button-grid-section/button-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.component.mjs +3 -3
- package/esm2022/lib/sections/choose-us-section/choose-us-section.model.mjs +1 -1
- package/esm2022/lib/sections/condensed-and-gradient/condensed-and-gradient.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.mjs +3 -3
- package/esm2022/lib/sections/countdown-banner/countdown-banner.component.model.mjs +1 -1
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.component.mjs +3 -3
- package/esm2022/lib/sections/faq-columns-cards/faq-columns-cards.modal.mjs +1 -1
- package/esm2022/lib/sections/faq-section/faq-section.component.mjs +3 -3
- package/esm2022/lib/sections/faq-section/faq-section.modal.mjs +1 -1
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.component.mjs +3 -3
- package/esm2022/lib/sections/feature-experience-section/feature-experience-section.modal.mjs +1 -1
- package/esm2022/lib/sections/features-section/features-section.component.mjs +3 -3
- package/esm2022/lib/sections/features-section/features-section.model.mjs +1 -1
- package/esm2022/lib/sections/footer/footer.component.mjs +3 -3
- package/esm2022/lib/sections/footer/footer.modal.mjs +1 -1
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.component.mjs +3 -3
- package/esm2022/lib/sections/four-features-centered-image/four-features-centered-image.modal.mjs +1 -1
- package/esm2022/lib/sections/header-section/header-section.component.mjs +3 -3
- package/esm2022/lib/sections/header-section/header-section.model.mjs +1 -1
- package/esm2022/lib/sections/header-text/header-text.component.mjs +3 -3
- package/esm2022/lib/sections/header-text/header-text.model.mjs +1 -1
- package/esm2022/lib/sections/image-background/image-background/image-background.component.mjs +3 -3
- package/esm2022/lib/sections/image-background/image-background/image-background.component.model.mjs +1 -1
- package/esm2022/lib/sections/image-carousel-section/image-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-carousel-section/image-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-hotspot/image-grid-hotspot.model.mjs +1 -1
- package/esm2022/lib/sections/image-grid-section/image-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-grid-section/image-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/image-section/image-section.component.mjs +3 -3
- package/esm2022/lib/sections/image-section/image-section.model.mjs +1 -1
- package/esm2022/lib/sections/location-section/location-section.component.mjs +3 -3
- package/esm2022/lib/sections/location-section/location-section.modal.mjs +1 -1
- package/esm2022/lib/sections/logo-showcase/logo-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/logo-showcase/logo-showcase.modal.mjs +1 -1
- package/esm2022/lib/sections/moving-text/moving-text.component.mjs +3 -3
- package/esm2022/lib/sections/moving-text/moving-text.modal.mjs +1 -1
- package/esm2022/lib/sections/new-services/new-services.component.mjs +3 -3
- package/esm2022/lib/sections/new-services/new-services.model.mjs +1 -1
- package/esm2022/lib/sections/new-testimonials/new-testimonials.component.mjs +3 -3
- package/esm2022/lib/sections/new-testimonials/new-testimonials.model.mjs +1 -1
- package/esm2022/lib/sections/news-letter-component/news-letter-component.component.mjs +3 -3
- package/esm2022/lib/sections/news-letter-component/news-letter.modal.mjs +1 -1
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.mjs +3 -3
- package/esm2022/lib/sections/overlapping-image/overlapping-image.component.modal.mjs +1 -1
- package/esm2022/lib/sections/pricing-section/pricing-section.component.mjs +3 -3
- package/esm2022/lib/sections/pricing-section/pricing-section.modal.mjs +1 -1
- package/esm2022/lib/sections/process-modern/process-modern.component.mjs +3 -3
- package/esm2022/lib/sections/process-modern/process-modern.model.mjs +1 -1
- package/esm2022/lib/sections/process-section/process-section.component.mjs +3 -3
- package/esm2022/lib/sections/process-section/process-section.modal.mjs +1 -1
- package/esm2022/lib/sections/product-info-section/product-info-section.component.mjs +3 -3
- package/esm2022/lib/sections/product-info-section/product-info-section.component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-component/property-component.component.mjs +3 -3
- package/esm2022/lib/sections/property-component/property-component.modal.mjs +1 -1
- package/esm2022/lib/sections/property-list/property-list.component.mjs +3 -3
- package/esm2022/lib/sections/property-list/property-list.modal.mjs +1 -1
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.component.mjs +91 -13
- package/esm2022/lib/sections/recent-blog-post-section/recent-blog-post-section.model.mjs +1 -1
- package/esm2022/lib/sections/registration-form/registration-form.component.mjs +3 -3
- package/esm2022/lib/sections/registration-form/registrationForm.model.mjs +1 -1
- package/esm2022/lib/sections/scheme-detail/scheme-detail.component.mjs +3 -3
- package/esm2022/lib/sections/scheme-detail/scheme-detail.modal.mjs +1 -1
- package/esm2022/lib/sections/service-section/service-section.component.mjs +3 -3
- package/esm2022/lib/sections/service-section/service-section.model.mjs +1 -1
- package/esm2022/lib/sections/skeleton-loader-section/skeleton-loader-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.component.mjs +3 -3
- package/esm2022/lib/sections/team-member-section/team-member-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-fullwidth/testimonial-fullwidth.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-masonry/testimonial-masonry.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-section/testimonial-section.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-section/testimonial-section.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-slider/testimonial-slider.model.mjs +1 -1
- package/esm2022/lib/sections/testimonial-video/testimonial-video.component.mjs +3 -3
- package/esm2022/lib/sections/testimonial-video/testimonial-video.model.mjs +1 -1
- package/esm2022/lib/sections/text-section/text-section.model.mjs +1 -1
- package/esm2022/lib/sections/usp-video-section/usp-video-section.component.mjs +3 -3
- package/esm2022/lib/sections/usp-video-section/usp-video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-carousel-section/video-carousel-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-carousel-section/video-carousel.model.mjs +1 -1
- package/esm2022/lib/sections/video-grid-section/video-grid-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-grid-section/video-grid-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-section/video-section.component.mjs +3 -3
- package/esm2022/lib/sections/video-section/video-section.model.mjs +1 -1
- package/esm2022/lib/sections/video-showcase/video-showcase.component.mjs +3 -3
- package/esm2022/lib/sections/view-blog/view-blog.component.mjs +357 -1143
- package/esm2022/lib/services/analytics.service.mjs +1 -1
- package/esm2022/lib/services/booking-product-cart.service.mjs +1 -1
- package/esm2022/lib/services/cart.service.mjs +1 -1
- package/esm2022/lib/services/endUser.service.mjs +1 -1
- package/esm2022/lib/services/image-upload-service.service.mjs +1 -1
- package/esm2022/lib/services/rest.service.mjs +19 -2
- package/esm2022/lib/services/sanitizeHtml.mjs +1 -1
- package/esm2022/lib/services/storage.service.mjs +1 -1
- package/esm2022/lib/styles/gradient-extension.mjs +1 -1
- package/esm2022/lib/styles/index.mjs +1 -1
- package/esm2022/lib/styles/style.model.mjs +1 -1
- package/esm2022/lib/styles/text-size.extension.mjs +1 -1
- package/esm2022/lib/styles/types.mjs +1 -1
- package/esm2022/lib/tokens/api-token.mjs +1 -1
- package/esm2022/public-api.mjs +1 -1
- package/fesm2022/simpo-component-library.mjs +611 -1306
- package/fesm2022/simpo-component-library.mjs.map +1 -1
- package/lib/sections/recent-blog-post-section/recent-blog-post-section.component.d.ts +20 -2
- package/lib/sections/view-blog/view-blog.component.d.ts +7 -1
- package/lib/services/rest.service.d.ts +2 -0
- package/package.json +1 -1
- package/simpo-component-library-3.6.970.tgz +0 -0
- package/simpo-component-library-3.6.968.tgz +0 -0
|
@@ -711,11 +711,11 @@ export class AppointmentBookingComponent extends BaseSection {
|
|
|
711
711
|
this.resetWizard();
|
|
712
712
|
}
|
|
713
713
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, deps: [{ token: i1.RestService }, { token: i2.EventsService }, { token: i3.Router }, { token: i4.MessageService }, { token: i5.BookingProductCartService }, { token: i6.StorageServiceService }, { token: i7.MatDialog }, { token: i7.MatDialogRef, optional: true }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
714
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppointmentBookingComponent, isStandalone: true, selector: "simpo-appointment-booking", inputs: { data: "data", index: "index", edit: "edit", isAdminBooking: "isAdminBooking", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor", prefillContact: "prefillContact" }, host: { listeners: { "window: resize": "getScreenSize($event)", "document:click": "closeOnOutsideClick()" } }, providers: [MessageService], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\n<section class=\"main_section\" [id]=\"data?.id\" simpoHover (hovering)=\"showEditTabs($event)\"\n [simpoBackground]=\"backgroundInfo\" [style.--color-accent-gradient]=\"accentColor\">\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div class=\"main_header\">\n <div class=\"header d-flex justify-content-between align-items-center\">\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\n (click)=\"goBack()\">\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\n </div>\n <div class=\"header-title\">\n <h1>Book New Appointment</h1>\n <p>{{businessName ?? \"N/A\" }}</p>\n </div>\n </div>\n\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\n </div>\n </div>\n <div class=\"main_body w-100 d-flex justify-content-center\">\n <ng-container *ngIf=\"selectedTab === 'modeSelection'\">\n <ng-container *ngTemplateOutlet=\"modeSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'serviceListing'\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\n </ng-container>\n </div>\n <div class=\"main_footer d-flex justify-content-center align-items-center\"\n *ngIf=\"selectedTab!=='statusTemplate' && selectedTab!=='modeSelection'\">\n <div class=\"footer-buttons\"\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"confirmBooking()\" [disabled]=\"isProcessing\"\n [ngClass]=\"{'pay-now-btn' : bookingGroup?.totalCollectedAtBooking > 0 || !bookingGroup,'complete_booking' : bookingGroup && !bookingGroup?.totalCollectedAtBooking}\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\n {{isProcessing ? 'Please wait...' : 'Confirm Booking'}}\n </button>\n </div>\n </div>\n</section>\n\n<ng-template #modeSelection>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>How would you like this?</h2>\n <p>Choose how you'd like to be served</p>\n <div class=\"services-grid\">\n <div class=\"service-card\" (click)=\"selectMode('STORE_VISIT')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>storefront</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">Visit our Store</div>\n </div>\n </div>\n <div class=\"service-description\">Come to us at one of our locations</div>\n </div>\n <div class=\"service-card\" (click)=\"selectMode('HOME_VISIT')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>home</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">We come to you</div>\n </div>\n </div>\n <div class=\"service-description\">A professional visits your address</div>\n </div>\n <div class=\"service-card\" (click)=\"selectMode('VIDEO_CALL')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>videocam</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">Video consultation</div>\n </div>\n </div>\n <div class=\"service-description\">Connect over a video call</div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #serviceListing>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>Select a Service</h2>\n <p>Choose the service(s) you'd like to book<span *ngIf=\"cartServices.length > 0\"> \u2014 {{cartServices.length}} selected</span></p>\n <p *ngIf=\"productCartItems.length > 0\" class=\"cart-hint\">{{productCartItems.length}} product(s) already in your cart \u2014 you can continue without picking a service.</p>\n\n <div class=\"services-grid\">\n <ng-container *ngFor=\"let service of serviceData\">\n <div class=\"\" (click)=\"selectService(service)\"\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\n <div class=\" service-header\">\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\n service?.priceDetails?.price : 'N/A' }}</div>\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\n </div>\n </div>\n </div>\n <div class=\"service-description\" *ngIf=\"service?.description\">\n {{service?.description ? service?.description : 'N/A'}}\n </div>\n <div class=\"home-visit\" *ngIf=\"selectedMode === 'STORE_VISIT' && service?.homeAppointmentAvailable\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\n Visit Available</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #locationListing>\n <div class=\"location_section\">\n <div class=\"header flex-column align-items-start\">\n <h1>Choose Location</h1>\n <p>Select where you'd like to receive the service</p>\n </div>\n\n <div class=\"location-list\">\n <ng-container *ngFor=\"let location of locationData\">\n <div (click)=\"selectLocation(location)\"\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\n </div>\n <div class=\"location-details\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\n </div>\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #staffListing>\n <div class=\"w-60 overflow-hidden staff-listing\">\n <div class=\"d-flex w-100 h-100\">\n <div class=\"w-100\">\n <div class=\"staff-header mb-3\">\n <h1>Select Staff Member</h1>\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\n </div>\n\n <div class=\"search-container mb-4\">\n <div class=\"search-input-wrapper d-flex align-items-center\">\n <mat-icon class=\"search-icon me-2\">search</mat-icon>\n <input type=\"text\" class=\"search-input border-0 flex-grow-1\" placeholder=\"Search staff member by name...\" [(ngModel)]=\"staffSearchQuery\">\n <mat-icon class=\"clear-icon cursor-pointer ms-2\" *ngIf=\"staffSearchQuery\" (click)=\"staffSearchQuery = ''\">close</mat-icon>\n </div>\n </div>\n\n <!-- Pure product-only line: one flat staff list, same as the old single-service flow -->\n <div class=\"staff-list\" *ngIf=\"cartServices.length === 0\">\n <ng-container *ngFor=\"let staff of filteredStaff\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForProductOnlyLine(staff)\"\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center flex-grow-1\">\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.staffName.slice(0,2).toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{(staff?.staffName ? staff?.staffName : 'N/A') | titlecase}}</h3>\n <p class=\"staff-specialty\">{{(businessName && businessName !== 'N/A') ? businessName : 'Booking Specialist'}}</p>\n </div>\n </div>\n <div class=\"selection-indicator\">\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"staff?.selected\">\n <mat-icon *ngIf=\"staff?.selected\">check</mat-icon>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Bundled cart: one pool per line that resolution couldn't collapse to a single provider -->\n <ng-container *ngIf=\"cartServices.length > 0\">\n <div class=\"staff-line-group mb-4\" *ngFor=\"let line of resolvedLines\">\n <ng-container *ngIf=\"line.candidateStaffPool?.length\">\n <h4 class=\"mb-2\">For {{line.services.length}} service(s): {{ (line.services | slice:0:3).length ? '' : '' }}<span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></h4>\n <div class=\"staff-list mb-3\">\n <ng-container *ngFor=\"let staff of line.candidateStaffPool\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForLine(line, staff)\"\n [ngClass]=\"{ 'staff-card-selected' : line.selectedStaffId === staff.id, 'staff-card': line.selectedStaffId !== staff.id }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center flex-grow-1\">\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.name?.slice(0,2)?.toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{(staff?.name ? staff?.name : 'N/A') | titlecase}}</h3>\n </div>\n </div>\n <div class=\"selection-indicator\">\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"line.selectedStaffId === staff.id\">\n <mat-icon *ngIf=\"line.selectedStaffId === staff.id\">check</mat-icon>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dateSelection>\n <div class=\"w-60 date_section\">\n <div class=\"row justify-content-center h-100\">\n <div class=\"col-12 h-100\">\n <div class=\"datetime-header mb-2\">\n <h1>Select Date & Time</h1>\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\n </div>\n\n <div class=\"d-flex gap-4 main_container\">\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Select Date</h3>\n\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\n\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\n </div>\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\n </mat-calendar>\n </div>\n </div>\n </div>\n </div>\n\n <!-- One slot-picker per resolved line, side by side when there's more than one (design doc \u00A73b) -->\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\" *ngIf=\"resolvedLines.length <= 1\">\n <div class=\"section-card card h-100 rounded-3 p-4\">\n <h3 class=\"section-title\">Available Times</h3>\n <div class=\"row g-2 mb-4 overflow-scroll\">\n <ng-container *ngIf=\"!skeletonLoader && resolvedLines[0]\">\n <div class=\"col-4\" *ngFor=\"let time of resolvedLines[0].slots\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectSlotForLine(resolvedLines[0], time)\">{{time ? time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Multi-line case: each line gets its own full-width card with a staff header -->\n <div class=\"d-flex gap-4 main_container flex-wrap\" *ngIf=\"resolvedLines.length > 1\">\n <div class=\"w-100\" *ngFor=\"let line of resolvedLines\">\n <div class=\"section-card card rounded-3 p-4\">\n <h3 class=\"section-title\">Professional: {{line.staffName || line.selectedStaffName}}</h3>\n <p class=\"mb-2\" *ngIf=\"line.services.length\"><span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></p>\n <div class=\"row g-2 mb-2 overflow-scroll\">\n <ng-container *ngIf=\"!line.slotsLoading\">\n <div class=\"col-4\" *ngFor=\"let time of line.slots\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectSlotForLine(line, time)\">{{time ? time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #contactDetails>\n <div class=\"w-60 contact_section\">\n <div class=\"contact-header mb-2\">\n <h1>Contact Details</h1>\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\n </div>\n\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\n <div class=\"d-flex gap-4\">\n <div [ngClass]=\"{'w-50' : selectedMode === 'HOME_VISIT', 'w-100' : selectedMode !== 'HOME_VISIT'}\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Personal Information</h3>\n\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Full Name\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"text\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\n </div>\n\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Email Address\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"email\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\n (ngModelChange)=\"checkRequiredValues()\"\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\" #emailField=\"ngModel\"\n name=\"email\" required>\n </div>\n\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Phone Number\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"tel\" class=\"form-control rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\n </div>\n </div>\n </div>\n <!-- Home Visit address. Customer context: same saved-address flow as\n checkout/BookAppointmentComponent. Admin context (isAdminBooking): no\n logged-in customer account to read a saved address book from, so staff type\n the address manually instead. -->\n <div class=\"w-50\" *ngIf=\"selectedMode === 'HOME_VISIT'\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Home Visit Details</h3>\n\n <ng-container *ngIf=\"!isAdminBooking; else manualHomeVisitAddress\">\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\n <div class=\"address-info\">\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\n {{defaultAddress?.stateName}}</div>\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\n </div>\n </div>\n <button type=\"button\" class=\"change-address-btn w-100\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">\n CHANGE OR ADD ADDRESS\n </button>\n\n <div class=\"addLinks\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\n <mat-icon>add</mat-icon>\n <span class=\"ms-2\">Add an address</span>\n </div>\n </ng-container>\n\n <ng-template #manualHomeVisitAddress>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Receiver Name</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.receiverName\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Receiver Phone</label>\n <input type=\"tel\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.receiverPhone\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Address Line 1</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine1\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Address Line 2 (optional)</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine2\">\n </div>\n <div class=\"d-flex gap-2 mb-3\">\n <div class=\"w-50\">\n <label class=\"form-label d-flex align-items-center\">City</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.city\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"w-50\">\n <label class=\"form-label d-flex align-items-center\">State</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.state\">\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Pincode</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.zipCode\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n </ng-template>\n\n <div class=\"mb-0 mt-3\">\n <label class=\"form-label d-flex align-items-center\">Special Instructions</label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Any special instructions for the professional (optional)\"\n [(ngModel)]=\"instructions\"></textarea>\n </div>\n </div>\n </div>\n </div>\n <div class=\"policies-container\"\n *ngIf=\"cartServices[0]?.cancellationPolicy?.length > 0 || cartServices[0]?.reschedulePolicy?.length\">\n <h2 class=\"policies-title\">Policies & Terms</h2>\n\n <div class=\"policy-items-container d-flex flex-column gap-3\">\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\n <h3 class=\"policy-title\">Cancellation Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showCancellationPolicy\">\n <span *ngFor=\"let policy of cartServices[0]?.cancellationPolicy\">•\n {{policy}}</span>\n </div>\n\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showReducingPolicy = !showReducingPolicy\">\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showReducingPolicy\">\n <span *ngFor=\"let policy of cartServices[0]?.reschedulePolicy\">• {{policy}}</span>\n </div>\n </div>\n\n <div class=\"acceptance-section\">\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\n (ngModelChange)=\"checkRequiredValues()\">\n <p class=\"acceptance-text\" style=\"margin-bottom:0px !important\">\n I understand and accept the cancellation & rescheduling policies.\n </p>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #paymentTab>\n <div class=\"w-60 payment_section\">\n <div class=\"w-100 h-100\">\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\n <div class=\"payment-header mb-3 w-100\">\n <h1 style=\"font-size:24px;font-weight: 600;\">Booking Summary</h1>\n <p class=\"payment-subtitle mb-0\">Review your booking before confirming</p>\n </div>\n\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\n <div *ngFor=\"let line of resolvedLines; let i = index\">\n <h2 class=\"summary-title\" *ngIf=\"resolvedLines.length > 1\">Line {{i + 1}}</h2>\n <div class=\"summary-row\" *ngFor=\"let s of line.services\">\n <div class=\"summary-label\">{{s.name}}</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{servicePrice(s.id)}}</div>\n </div>\n <div class=\"summary-row\" *ngIf=\"line.staffName || line.selectedStaffName\">\n <div class=\"summary-label\">Professional</div>\n <div class=\"summary-value\">{{line.staffName || line.selectedStaffName}}</div>\n </div>\n <div class=\"summary-row\" *ngIf=\"selectedMode === 'STORE_VISIT'\">\n <div class=\"summary-label\">Location</div>\n <div class=\"summary-value\">{{selectedLocation?.storeName ?? 'N/A'}}</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Date & Time</div>\n <div class=\"summary-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</div>\n </div>\n </div>\n\n <div *ngIf=\"productCartItems.length > 0\">\n <h2 class=\"summary-title\">Products</h2>\n <div class=\"summary-row\" *ngFor=\"let p of productCartItems\">\n <div class=\"summary-label\">{{p.itemName}} x{{p.quantity}}</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{(p.sellingPrice ?? p.price ?? 0) * (p.quantity ?? 1)}}</div>\n </div>\n </div>\n\n <h2 class=\"summary-title\">Payment</h2>\n <div class=\"summary-row\" *ngIf=\"homeVisitCharge > 0\">\n <div class=\"summary-label\">Home visit charge</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{homeVisitCharge}}</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Total</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{reviewTotal}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusTemplate>\n <div class=\"booking-confirmation\">\n <div class=\"success-icon\">\n <div class=\"checkmark-circle\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\n </div>\n </div>\n\n <div class=\"confirmation-content\">\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\n <p class=\"confirmation-message\">\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\n try again later'}}\n </p>\n\n <!-- Video Call link, when already present on the confirmed group (a paid Video Call's\n link only appears once payment verification completes, handled elsewhere - see\n verify-payment.component.ts, not this screen). -->\n <div class=\"video-call-link-card d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus && selectedMode === 'VIDEO_CALL' && bookingGroup?.videoCallLink\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Your Video Call Link</h3>\n <a [href]=\"bookingGroup.videoCallLink\" target=\"_blank\">{{bookingGroup.videoCallLink}}</a>\n </div>\n </div>\n\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Appointment Details</h3>\n <div class=\"details-row\" *ngFor=\"let line of resolvedLines\">\n <span class=\"detail-label\">{{line.services.length ? (line.services[0].name) : 'Products'}}</span>\n <span class=\"detail-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Payment</h3>\n <div class=\"details-row\" *ngIf=\"bookingGroup?.homeVisitCharge > 0\">\n <span class=\"detail-label\">Home visit charge</span>\n <span class=\"detail-value\">\u20B9{{bookingGroup.homeVisitCharge}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Total</span>\n <span class=\"detail-value\">\u20B9{{bookingTotal}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Paid</span>\n <span class=\"detail-value\">\u20B9{{bookingPaid}}</span>\n </div>\n <div class=\"details-row\" *ngIf=\"bookingDue > 0\">\n <span class=\"detail-label\">Due</span>\n <span class=\"detail-value\">\u20B9{{bookingDue}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"done-actions d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <ng-container *ngIf=\"!isAdminContext; else adminDoneActions\">\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToMyBookings()\">View my bookings</button>\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"goToListing()\">Keep shopping</button>\n </ng-container>\n <ng-template #adminDoneActions>\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToAppointmentsList()\">Back to Appointments List</button>\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"bookAnother()\">Book Another</button>\n </ng-template>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&display=swap\";mat-icon{font-family:Material Icons!important}:host{--font-sans: \"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;--slate-50: #f8fafc;--slate-100: #f1f5f9;--slate-200: #e2e8f0;--slate-300: #cbd5e1;--slate-400: #94a3b8;--slate-500: #64748b;--slate-600: #475569;--slate-700: #334155;--slate-800: #1e293b;--slate-900: #0f172a;--color-primary: #230860;--color-secondary: #00b6ff;--color-accent-gradient: linear-gradient(135deg, #230860 0%, #00b6ff 100%);--color-success: #10b981;--color-success-bg: #ecfdf5;--color-error: #ef4444;--color-error-bg: #fef2f2;--border-radius-sm: 8px;--border-radius-md: 12px;--border-radius-lg: 16px;--border-radius-xl: 24px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .05), 0 2px 4px -2px rgba(0, 0, 0, .05);--shadow-lg: 0 10px 15px -3px rgba(35, 8, 96, .05), 0 4px 6px -4px rgba(35, 8, 96, .05);--shadow-xl: 0 20px 25px -5px rgba(35, 8, 96, .08), 0 8px 10px -6px rgba(35, 8, 96, .08);--transition-smooth: all .3s cubic-bezier(.4, 0, .2, 1);--transition-bounce: all .4s cubic-bezier(.175, .885, .32, 1.275)}*{box-sizing:border-box;font-family:var(--font-sans)}.main_section{position:relative;height:100vh;background-color:var(--slate-50);display:flex;flex-direction:column;overflow:hidden}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.main_header{padding:15px;background:#fff;border-bottom:1px solid var(--slate-100);flex-shrink:0;box-shadow:0 2px 8px #00000003}.header{display:flex;align-items:center;justify-content:space-between}.back-btn{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.6rem 1.2rem;border-radius:var(--border-radius-md);background:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-700)!important;transition:var(--transition-smooth);font-weight:500;font-size:.9rem;cursor:pointer}.back-btn mat-icon{font-size:18px!important;width:18px!important;height:18px!important;color:var(--slate-700)!important;display:flex;align-items:center;justify-content:center}.back-btn:hover{background:var(--slate-100);transform:translate(-3px);color:var(--slate-900)!important}.header-title{flex-grow:1;text-align:right}.header-title h1{font-size:1.5rem;font-weight:700;margin-bottom:.2rem;color:var(--slate-900)!important;letter-spacing:-.025em}.header-title p{color:var(--slate-500)!important;font-size:.9rem;font-weight:500;margin-bottom:0}.progress-bar{width:100%;height:6px;background-color:var(--slate-100);margin-top:3px;border-radius:10px;overflow:hidden;position:relative}.progress-fill{height:100%;background:var(--color-accent-gradient);border-radius:10px;transition:width .5s cubic-bezier(.4,0,.2,1);position:relative}.progress-fill:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0);animation:shimmer 2s infinite linear}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.main_body{flex-grow:1;overflow-y:auto;padding:10px;display:flex;justify-content:center;background:var(--slate-50)}.w-60{width:100%;max-width:800px}.service_section,.location_section,.staff-listing,.date_section,.contact_section,.payment_section,.booking-confirmation{animation:slideUp .5s cubic-bezier(.16,1,.3,1) forwards}@keyframes slideUp{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}h2{font-size:1.5rem;font-weight:700;color:var(--slate-900)!important;letter-spacing:-.02em;margin-bottom:.3rem}p.subtitle,.service-selection p,.location_section p,.staff-subtitle,.datetime-subtitle,.contact-subtitle,.payment-subtitle{color:var(--slate-500)!important;font-size:13px;margin-bottom:2rem}.services-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding-bottom:2rem}.service-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px}.service-card:hover{border-color:var(--slate-400);transform:translateY(-4px);box-shadow:var(--shadow-lg)}.service-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px;transform:translateY(-2px)}.service-card-selected:before,.location-card-selected:before{content:\"\\2713\";position:absolute;top:-10px;right:-10px;background:var(--color-accent-gradient);color:#fff!important;width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:700;box-shadow:0 4px 8px #2308604d;animation:popIn .3s cubic-bezier(.175,.885,.32,1.275);z-index:10}@keyframes popIn{0%{transform:scale(0)}to{transform:scale(1)}}.service-header{display:flex;align-items:flex-start;gap:1rem;margin-bottom:1rem}.service-icon{width:48px;height:48px;border-radius:var(--border-radius-md);background-color:var(--slate-100);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.service-icon mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:var(--color-primary)!important}.service-card-selected .service-icon{background:var(--slate-900)}.service-card-selected .service-icon mat-icon{color:#fff!important}.service-info{flex-grow:1}.service-title{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;line-height:1.3;margin-bottom:.2rem}.service-price{font-size:1.25rem;font-weight:800;color:var(--slate-900)!important;text-align:right}.service-duration{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;text-align:right;margin-top:.1rem}.service-description{color:var(--slate-600)!important;font-size:.9rem;line-height:1.5;margin-bottom:1.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.home-visit{align-self:flex-start;display:inline-flex;align-items:center;gap:.5rem;font-size:.75rem;font-weight:600;color:var(--slate-700)!important;border:1px solid var(--slate-200);padding:.35rem .75rem;border-radius:20px;background-color:var(--slate-50);transition:var(--transition-smooth)}.home-visit img{width:14px;height:14px}.home-visit:before{content:\"\";display:inline-block;width:6px;height:6px;border-radius:50%;background-color:var(--color-success);box-shadow:0 0 #10b98166;animation:pulseGlow 1.8s infinite}@keyframes pulseGlow{0%{box-shadow:0 0 #10b981b3}70%{box-shadow:0 0 0 6px #10b98100}to{box-shadow:0 0 #10b98100}}.location-list{display:flex;flex-direction:column;gap:1.25rem;padding-bottom:2rem}.location-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm)}.location-card:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md)}.location-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px)}.location-content{display:flex;align-items:center}.location-info{display:flex;align-items:center;gap:1.25rem;width:100%}.location-icon{width:52px;height:52px;background-color:var(--slate-100);border-radius:var(--border-radius-md);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.location-icon img{width:28px;height:28px}.location-card-selected .location-icon{background:var(--slate-900)}.location-details{flex-grow:1}.location-details h3{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.3rem}.location-details p{font-size:.9rem;color:var(--slate-500)!important;font-weight:450;line-height:1.4;margin-bottom:0}.search-container{width:100%;margin-bottom:1.25rem}.search-input-wrapper{width:100%;background-color:var(--slate-100);border:1.5px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;transition:var(--transition-smooth)}.search-input-wrapper:focus-within{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #23086014}.search-input{font-size:.95rem;font-weight:500;color:var(--slate-900)!important;background:transparent;outline:none;width:100%}.search-input::placeholder{color:var(--slate-400)}.search-icon{color:var(--slate-400)!important;font-size:20px!important;width:20px!important;height:20px!important}.clear-icon{color:var(--slate-400)!important;font-size:18px!important;width:18px!important;height:18px!important;transition:var(--transition-smooth)}.clear-icon:hover{color:var(--slate-600)!important}.staff-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1rem;max-height:48vh;overflow-y:auto;padding-right:.5rem;padding-bottom:1rem}.staff-list::-webkit-scrollbar{width:6px}.staff-list::-webkit-scrollbar-track{background:var(--slate-50);border-radius:4px}.staff-list::-webkit-scrollbar-thumb{background:var(--slate-200);border-radius:4px}.staff-list::-webkit-scrollbar-thumb:hover{background:var(--slate-300)}.staff-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);margin-bottom:0!important}.staff-card:hover{border-color:var(--slate-300);transform:translateY(-2px);box-shadow:var(--shadow-md)}.staff-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px);margin-bottom:0!important}.staff-avatar{width:48px;height:48px;background:var(--color-accent-gradient);font-size:.95rem;font-weight:700;color:#fff!important;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 10px #2308601a;letter-spacing:.5px;transition:var(--transition-smooth)}.staff-card-selected .staff-avatar{transform:scale(1.05)}.staff-name{font-size:1.05rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.2rem;letter-spacing:-.015em}.staff-specialty{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;margin-bottom:0;text-transform:uppercase;letter-spacing:.05em}.selection-indicator{display:flex;align-items:center;justify-content:center;margin-left:auto;padding-left:1rem}.checkmark-circle-mini{width:24px;height:24px;border:2px solid var(--slate-300);border-radius:50%;background-color:#fff;transition:var(--transition-bounce);color:#fff!important}.checkmark-circle-mini.selected{background:var(--color-accent-gradient);border-color:transparent;box-shadow:0 3px 8px #23086040}.checkmark-circle-mini mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#fff!important;font-weight:800!important;display:flex;align-items:center;justify-content:center}.main_container{display:flex;gap:2rem;margin-bottom:2rem}.section-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm);height:100%}.section-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:10px!important;letter-spacing:-.01em}.date-picker-container{border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;display:flex;align-items:center;justify-content:space-between;transition:var(--transition-smooth);background-color:var(--slate-50);cursor:pointer}.date-picker-container:hover{border-color:var(--slate-400);background-color:#fff}.date-input{font-size:.95rem;font-weight:600;color:var(--slate-800)!important;background:transparent;border:none;outline:none;cursor:pointer;width:100%}.date-picker-container mat-icon{color:var(--color-primary)!important;font-size:20px!important;width:20px!important;height:20px!important}.datepicker-popover{position:absolute;z-index:1000;margin-top:4px;border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);background:#fff;border:1px solid var(--slate-200);width:320px}::ng-deep .datepicker-calendar{border-radius:var(--border-radius-lg)!important;width:100%!important}::ng-deep .mat-calendar-header{background:var(--color-accent-gradient)!important;color:#fff!important;padding:.5rem!important}::ng-deep .mat-calendar-content{padding:8px!important}::ng-deep .mat-calendar-controls{margin:0!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:1rem!important}::ng-deep .mat-calendar-arrow{fill:#fff!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important}::ng-deep .mat-calendar-body-cell{font-size:13px!important}::ng-deep .mat-calendar-body-cell-content{font-weight:600!important;color:var(--slate-800)!important;border-radius:8px!important}::ng-deep .mat-calendar-body-selected{background:var(--color-accent-gradient)!important;color:#fff!important;box-shadow:0 4px 10px #23086033!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:2px solid var(--color-primary)!important;color:var(--color-primary)!important}.time_selection{max-height:420px;display:flex;flex-direction:column}.time_selection .row{flex-grow:1;overflow-y:auto;padding-right:.25rem;margin-top:10px}.time-slot{background:#fff;border:1px solid var(--slate-200);font-size:.9rem;font-weight:600;color:var(--slate-800)!important;padding:.75rem .5rem;border-radius:var(--border-radius-md);cursor:pointer;transition:var(--transition-smooth);text-align:center;box-shadow:var(--shadow-sm)}.time-slot:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md);background-color:var(--slate-50)}.time-slot.selected{background:var(--color-accent-gradient);border-color:transparent;color:#fff!important;box-shadow:0 4px 12px #23086033}.form-section{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm)}.form-label{font-size:.85rem;font-weight:600;color:var(--slate-700)!important;margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.required-asterisk{color:var(--color-error);margin-left:2px}.form-control,.form-input,.form-textarea{width:100%;background-color:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-900)!important;font-size:.95rem;font-weight:500;padding:.75rem 1rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);outline:none}.form-control:focus,.form-input:focus,.form-textarea:focus{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #2308601a}.form-textarea{min-height:100px;resize:vertical}.policies-container{background-color:#fff;border:1px solid var(--slate-200);padding:1.75rem;border-radius:var(--border-radius-lg);margin-top:1.5rem;box-shadow:var(--shadow-sm)}.policies-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1.25rem}.policy-item{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1rem 1.25rem;cursor:pointer;transition:var(--transition-smooth);display:flex;justify-content:space-between;align-items:center}.policy-item:hover{background-color:var(--slate-100);border-color:var(--slate-300)}.policy-title{font-size:.95rem;font-weight:600;color:var(--slate-800)!important}.policy-arrow mat-icon{color:var(--slate-500)!important;transition:var(--transition-smooth)}.cancellation_policies{background-color:var(--slate-50);padding:1rem 1.5rem;border-left:3px solid var(--color-primary);border-radius:0 0 var(--border-radius-md) var(--border-radius-md);margin-top:-4px;margin-bottom:1rem;font-size:.9rem;color:var(--slate-600)!important;line-height:1.5}.acceptance-section{display:flex;align-items:center;gap:.75rem;margin-top:1.5rem}.custom-checkbox{width:20px;height:20px;border:2px solid var(--slate-300);border-radius:6px;cursor:pointer;transition:var(--transition-smooth);position:relative;appearance:none;background-color:#fff;outline:none}.custom-checkbox:checked{background:var(--color-accent-gradient);border-color:transparent}.custom-checkbox:checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff!important;font-size:.75rem;font-weight:800}.acceptance-text{font-size:.95rem;color:var(--slate-700)!important;font-weight:500;-webkit-user-select:none;user-select:none;line-height:1.4}.booking-summary-card{background-color:#fff;border:1px solid var(--slate-200);padding:2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);position:relative}.booking-summary-card:after{content:\"\";position:absolute;bottom:-1px;left:0;right:0;height:10px;background-image:radial-gradient(circle,white 4px,transparent 5px);background-size:12px 12px;background-position:0 0;z-index:2}.summary-title{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important;border-bottom:2px dashed var(--slate-200);padding-bottom:1rem;margin-bottom:1.5rem;text-align:center}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:.85rem 0;border-bottom:1px solid var(--slate-100)}.summary-label{font-size:.95rem;color:var(--slate-500)!important;font-weight:500}.summary-value{font-size:.95rem;color:var(--slate-900)!important;font-weight:600;text-align:right}.total-row{margin-top:1rem;padding-top:1.25rem;border-top:2px dashed var(--slate-200);border-bottom:none}.total-row .summary-label{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important}.total-row .summary-value{font-size:1.5rem;font-weight:800;color:var(--color-primary)!important}.booking-confirmation{background:#fff;border:1px solid var(--slate-200);padding:3rem 2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;align-items:center;text-align:center;max-width:500px;margin:0 auto}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:96px;height:96px;display:flex;align-items:center;justify-content:center}.confirmation-title{font-size:1.5rem;font-weight:800;color:var(--slate-900)!important;margin-bottom:.5rem}.confirmation-message{font-size:1rem;color:var(--slate-500)!important;line-height:1.6;margin-bottom:2rem;font-weight:450}.details-card{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1.5rem;width:100%;margin-bottom:2rem;text-align:left}.details-title{font-size:1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.details-row{display:flex;justify-content:space-between;padding:.5rem 0;border-bottom:1px dashed var(--slate-200)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.85rem;color:var(--slate-500)!important;font-weight:500}.detail-value{font-size:.9rem;color:var(--slate-900)!important;font-weight:600}.main_footer{border-top:1px solid var(--slate-200);background-color:#fff;padding:15px;flex-shrink:0;display:flex;justify-content:center;box-shadow:0 -4px 12px #00000005}.footer-buttons{width:100%;max-width:800px;display:flex;align-items:center}.back-footer-btn{font-size:.95rem;font-weight:600;color:var(--slate-600)!important;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);cursor:pointer}.back-footer-btn:hover{color:var(--slate-900)!important;background-color:var(--slate-100)}.continue-btn{background:var(--color-accent-gradient);color:#fff!important;border:none;padding:.75rem 2rem;border-radius:var(--border-radius-md);font-size:.95rem!important;font-weight:600;cursor:pointer;transition:var(--transition-smooth);box-shadow:0 4px 10px #23086033;width:max-content!important}.continue-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.continue-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed!important;box-shadow:none!important}.complete_booking,.pay-now-btn{background:var(--color-accent-gradient)!important;color:#fff!important;border:none;padding:.75rem 2.25rem!important;font-size:.95rem!important;font-weight:600;border-radius:var(--border-radius-md)!important;box-shadow:0 4px 12px #23086040;transition:var(--transition-smooth);cursor:pointer;display:flex;align-items:center;gap:.5rem;width:max-content!important}.complete_booking img,.pay-now-btn img{width:20px;height:20px;filter:brightness(0) invert(1)}.complete_booking:hover:not([disabled]),.pay-now-btn:hover:not([disabled]){transform:translateY(-2px);box-shadow:0 6px 18px #23086059}.complete_booking:disabled,.pay-now-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed;box-shadow:none}.service-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding:0;width:100%}.skeleton-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;height:180px;display:flex;flex-direction:column;justify-content:space-between}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border-radius:4px}@keyframes loading-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:48px;height:48px;border-radius:var(--border-radius-md)}.skeleton-title{height:20px;width:60%;margin-bottom:.5rem}.skeleton-price{height:20px;width:30%}.skeleton-duration{height:12px;width:25%;margin-top:.25rem}.skeleton-description{height:14px;width:85%}.skeleton-badge{height:28px;width:120px;border-radius:20px}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;width:100%}.skeleton-time-slot{height:42px;border-radius:var(--border-radius-md);background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border:1px solid var(--slate-100)}@media screen and (max-width: 475px){.main_header{padding:1rem}.header-title h1{font-size:1.25rem}.back-btn{padding:.5rem .8rem}.back-btn span{display:none}.main_body{padding:15px}.services-grid{grid-template-columns:1fr;gap:1rem}.staff-list{grid-template-columns:1fr!important;gap:.85rem!important}.service-card,.service-card-selected{min-height:auto}.main_container{flex-direction:column;gap:1.5rem}.datepicker-popover{width:100%;left:0}.details_container{gap:1.5rem}.details_container>.d-flex{flex-direction:column;gap:1.5rem}.details_container>.d-flex>div{width:100%!important}.booking-summary-card{padding:1.25rem}.summary-title{font-size:1.15rem}.total-row .summary-label{font-size:1.1rem}.total-row .summary-value{font-size:1.3rem}.main_footer{padding:1rem}.continue-btn{padding:.75rem 1.5rem}}.shipping-info{border-radius:10px;padding:20px;margin-bottom:12px;border:1px solid var(--slate-200);box-shadow:var(--shadow-sm)}.address-info{margin-bottom:0}.address-name{font-weight:700;margin-bottom:8px;color:var(--slate-900)!important}.address-details{color:var(--slate-500)!important;margin-bottom:8px}.mobile-number{font-weight:700;color:var(--slate-900)!important;font-size:15px}.change-address-btn{font-size:.85rem!important;font-weight:700!important;padding:10px;background:#fff;border:1px solid var(--slate-200);border-radius:8px;color:var(--slate-900)!important;cursor:pointer;transition:var(--transition-smooth)}.change-address-btn:hover{border-color:var(--color-primary);color:var(--color-primary)!important}.addLinks{padding:14px;border:1px dashed var(--slate-300);display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:8px;color:var(--slate-500)!important;margin-bottom:12px}.addLinks:hover{border-color:var(--color-primary);color:var(--color-primary)!important}h1{font-size:24px!important;font-weight:600!important}.done-actions{display:flex;gap:12px;width:100%}.done-btn{flex:1;max-width:220px;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);font-size:.95rem;font-weight:600;cursor:pointer;transition:var(--transition-smooth);border:none}.done-btn-primary{background:var(--color-accent-gradient);color:#fff!important;box-shadow:0 4px 10px #23086033}.done-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.done-btn-secondary{background:#fff;color:var(--slate-600)!important;border:1px solid var(--slate-200)}.done-btn-secondary:hover{background-color:var(--slate-100);color:var(--slate-900)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i9.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: LettersOnlyDirective, selector: "[simpoLettersOnly]" }, { kind: "directive", type: NumbersOnlyDirective, selector: "[simpoNumbersOnly]" }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i11.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "component", type: HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }] }); }
|
|
714
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: AppointmentBookingComponent, isStandalone: true, selector: "simpo-appointment-booking", inputs: { data: "data", index: "index", edit: "edit", isAdminBooking: "isAdminBooking", delete: "delete", customClass: "customClass", nextComponentColor: "nextComponentColor", prefillContact: "prefillContact" }, host: { listeners: { "window: resize": "getScreenSize($event)", "document:click": "closeOnOutsideClick()" } }, providers: [MessageService], usesInheritance: true, ngImport: i0, template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\r\n<section class=\"main_section\" [id]=\"data?.id\" simpoHover (hovering)=\"showEditTabs($event)\"\r\n [simpoBackground]=\"backgroundInfo\" [style.--color-accent-gradient]=\"accentColor\">\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\">\r\n <ng-container *ngIf=\"selectedTab === 'modeSelection'\">\r\n <ng-container *ngTemplateOutlet=\"modeSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\"\r\n *ngIf=\"selectedTab!=='statusTemplate' && selectedTab!=='modeSelection'\">\r\n <div class=\"footer-buttons\"\r\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\r\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\r\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"confirmBooking()\" [disabled]=\"isProcessing\"\r\n [ngClass]=\"{'pay-now-btn' : bookingGroup?.totalCollectedAtBooking > 0 || !bookingGroup,'complete_booking' : bookingGroup && !bookingGroup?.totalCollectedAtBooking}\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\r\n {{isProcessing ? 'Please wait...' : 'Confirm Booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<ng-template #modeSelection>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>How would you like this?</h2>\r\n <p>Choose how you'd like to be served</p>\r\n <div class=\"services-grid\">\r\n <div class=\"service-card\" (click)=\"selectMode('STORE_VISIT')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>storefront</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Visit our Store</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">Come to us at one of our locations</div>\r\n </div>\r\n <div class=\"service-card\" (click)=\"selectMode('HOME_VISIT')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>home</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">We come to you</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">A professional visits your address</div>\r\n </div>\r\n <div class=\"service-card\" (click)=\"selectMode('VIDEO_CALL')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>videocam</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Video consultation</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">Connect over a video call</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service(s) you'd like to book<span *ngIf=\"cartServices.length > 0\"> \u2014 {{cartServices.length}} selected</span></p>\r\n <p *ngIf=\"productCartItems.length > 0\" class=\"cart-hint\">{{productCartItems.length}} product(s) already in your cart \u2014 you can continue without picking a service.</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\" *ngIf=\"service?.description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"selectedMode === 'STORE_VISIT' && service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #locationListing>\r\n <div class=\"location_section\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden staff-listing\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <div class=\"staff-header mb-3\">\r\n <h1>Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <div class=\"search-container mb-4\">\r\n <div class=\"search-input-wrapper d-flex align-items-center\">\r\n <mat-icon class=\"search-icon me-2\">search</mat-icon>\r\n <input type=\"text\" class=\"search-input border-0 flex-grow-1\" placeholder=\"Search staff member by name...\" [(ngModel)]=\"staffSearchQuery\">\r\n <mat-icon class=\"clear-icon cursor-pointer ms-2\" *ngIf=\"staffSearchQuery\" (click)=\"staffSearchQuery = ''\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Pure product-only line: one flat staff list, same as the old single-service flow -->\r\n <div class=\"staff-list\" *ngIf=\"cartServices.length === 0\">\r\n <ng-container *ngFor=\"let staff of filteredStaff\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForProductOnlyLine(staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center flex-grow-1\">\r\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,2).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{(staff?.staffName ? staff?.staffName : 'N/A') | titlecase}}</h3>\r\n <p class=\"staff-specialty\">{{(businessName && businessName !== 'N/A') ? businessName : 'Booking Specialist'}}</p>\r\n </div>\r\n </div>\r\n <div class=\"selection-indicator\">\r\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"staff?.selected\">\r\n <mat-icon *ngIf=\"staff?.selected\">check</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Bundled cart: one pool per line that resolution couldn't collapse to a single provider -->\r\n <ng-container *ngIf=\"cartServices.length > 0\">\r\n <div class=\"staff-line-group mb-4\" *ngFor=\"let line of resolvedLines\">\r\n <ng-container *ngIf=\"line.candidateStaffPool?.length\">\r\n <h4 class=\"mb-2\">For {{line.services.length}} service(s): {{ (line.services | slice:0:3).length ? '' : '' }}<span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></h4>\r\n <div class=\"staff-list mb-3\">\r\n <ng-container *ngFor=\"let staff of line.candidateStaffPool\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForLine(line, staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : line.selectedStaffId === staff.id, 'staff-card': line.selectedStaffId !== staff.id }\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center flex-grow-1\">\r\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.name?.slice(0,2)?.toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{(staff?.name ? staff?.name : 'N/A') | titlecase}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"selection-indicator\">\r\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"line.selectedStaffId === staff.id\">\r\n <mat-icon *ngIf=\"line.selectedStaffId === staff.id\">check</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateSelection>\r\n <div class=\"w-60 date_section\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1>Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 main_container\">\r\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\r\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\r\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- One slot-picker per resolved line, side by side when there's more than one (design doc \u00A73b) -->\r\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\" *ngIf=\"resolvedLines.length <= 1\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <ng-container *ngIf=\"!skeletonLoader && resolvedLines[0]\">\r\n <div class=\"col-4\" *ngFor=\"let time of resolvedLines[0].slots\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectSlotForLine(resolvedLines[0], time)\">{{time ? time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Multi-line case: each line gets its own full-width card with a staff header -->\r\n <div class=\"d-flex gap-4 main_container flex-wrap\" *ngIf=\"resolvedLines.length > 1\">\r\n <div class=\"w-100\" *ngFor=\"let line of resolvedLines\">\r\n <div class=\"section-card card rounded-3 p-4\">\r\n <h3 class=\"section-title\">Professional: {{line.staffName || line.selectedStaffName}}</h3>\r\n <p class=\"mb-2\" *ngIf=\"line.services.length\"><span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></p>\r\n <div class=\"row g-2 mb-2 overflow-scroll\">\r\n <ng-container *ngIf=\"!line.slotsLoading\">\r\n <div class=\"col-4\" *ngFor=\"let time of line.slots\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectSlotForLine(line, time)\">{{time ? time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #contactDetails>\r\n <div class=\"w-60 contact_section\">\r\n <div class=\"contact-header mb-2\">\r\n <h1>Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <div class=\"d-flex gap-4\">\r\n <div [ngClass]=\"{'w-50' : selectedMode === 'HOME_VISIT', 'w-100' : selectedMode !== 'HOME_VISIT'}\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\"\r\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\" #emailField=\"ngModel\"\r\n name=\"email\" required>\r\n </div>\r\n\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\r\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Home Visit address. Customer context: same saved-address flow as\r\n checkout/BookAppointmentComponent. Admin context (isAdminBooking): no\r\n logged-in customer account to read a saved address book from, so staff type\r\n the address manually instead. -->\r\n <div class=\"w-50\" *ngIf=\"selectedMode === 'HOME_VISIT'\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <ng-container *ngIf=\"!isAdminBooking; else manualHomeVisitAddress\">\r\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\r\n <div class=\"address-info\">\r\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\r\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\r\n {{defaultAddress?.stateName}}</div>\r\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"change-address-btn w-100\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">\r\n CHANGE OR ADD ADDRESS\r\n </button>\r\n\r\n <div class=\"addLinks\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\r\n <mat-icon>add</mat-icon>\r\n <span class=\"ms-2\">Add an address</span>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #manualHomeVisitAddress>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Receiver Name</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.receiverName\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Receiver Phone</label>\r\n <input type=\"tel\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.receiverPhone\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Address Line 1</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine1\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Address Line 2 (optional)</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine2\">\r\n </div>\r\n <div class=\"d-flex gap-2 mb-3\">\r\n <div class=\"w-50\">\r\n <label class=\"form-label d-flex align-items-center\">City</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.city\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"w-50\">\r\n <label class=\"form-label d-flex align-items-center\">State</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.state\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Pincode</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.zipCode\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"mb-0 mt-3\">\r\n <label class=\"form-label d-flex align-items-center\">Special Instructions</label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"\r\n [(ngModel)]=\"instructions\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\"\r\n *ngIf=\"cartServices[0]?.cancellationPolicy?.length > 0 || cartServices[0]?.reschedulePolicy?.length\">\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span *ngFor=\"let policy of cartServices[0]?.cancellationPolicy\">•\r\n {{policy}}</span>\r\n </div>\r\n\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span *ngFor=\"let policy of cartServices[0]?.reschedulePolicy\">• {{policy}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"acceptance-section\">\r\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n <p class=\"acceptance-text\" style=\"margin-bottom:0px !important\">\r\n I understand and accept the cancellation & rescheduling policies.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #paymentTab>\r\n <div class=\"w-60 payment_section\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1 style=\"font-size:24px;font-weight: 600;\">Booking Summary</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking before confirming</p>\r\n </div>\r\n\r\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\r\n <div *ngFor=\"let line of resolvedLines; let i = index\">\r\n <h2 class=\"summary-title\" *ngIf=\"resolvedLines.length > 1\">Line {{i + 1}}</h2>\r\n <div class=\"summary-row\" *ngFor=\"let s of line.services\">\r\n <div class=\"summary-label\">{{s.name}}</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{servicePrice(s.id)}}</div>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"line.staffName || line.selectedStaffName\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{line.staffName || line.selectedStaffName}}</div>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"selectedMode === 'STORE_VISIT'\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ?? 'N/A'}}</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"productCartItems.length > 0\">\r\n <h2 class=\"summary-title\">Products</h2>\r\n <div class=\"summary-row\" *ngFor=\"let p of productCartItems\">\r\n <div class=\"summary-label\">{{p.itemName}} x{{p.quantity}}</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{(p.sellingPrice ?? p.price ?? 0) * (p.quantity ?? 1)}}</div>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"summary-title\">Payment</h2>\r\n <div class=\"summary-row\" *ngIf=\"homeVisitCharge > 0\">\r\n <div class=\"summary-label\">Home visit charge</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{homeVisitCharge}}</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{reviewTotal}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Video Call link, when already present on the confirmed group (a paid Video Call's\r\n link only appears once payment verification completes, handled elsewhere - see\r\n verify-payment.component.ts, not this screen). -->\r\n <div class=\"video-call-link-card d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus && selectedMode === 'VIDEO_CALL' && bookingGroup?.videoCallLink\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Your Video Call Link</h3>\r\n <a [href]=\"bookingGroup.videoCallLink\" target=\"_blank\">{{bookingGroup.videoCallLink}}</a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n <div class=\"details-row\" *ngFor=\"let line of resolvedLines\">\r\n <span class=\"detail-label\">{{line.services.length ? (line.services[0].name) : 'Products'}}</span>\r\n <span class=\"detail-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Payment</h3>\r\n <div class=\"details-row\" *ngIf=\"bookingGroup?.homeVisitCharge > 0\">\r\n <span class=\"detail-label\">Home visit charge</span>\r\n <span class=\"detail-value\">\u20B9{{bookingGroup.homeVisitCharge}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Total</span>\r\n <span class=\"detail-value\">\u20B9{{bookingTotal}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Paid</span>\r\n <span class=\"detail-value\">\u20B9{{bookingPaid}}</span>\r\n </div>\r\n <div class=\"details-row\" *ngIf=\"bookingDue > 0\">\r\n <span class=\"detail-label\">Due</span>\r\n <span class=\"detail-value\">\u20B9{{bookingDue}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"done-actions d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <ng-container *ngIf=\"!isAdminContext; else adminDoneActions\">\r\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToMyBookings()\">View my bookings</button>\r\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"goToListing()\">Keep shopping</button>\r\n </ng-container>\r\n <ng-template #adminDoneActions>\r\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToAppointmentsList()\">Back to Appointments List</button>\r\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"bookAnother()\">Book Another</button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&display=swap\";mat-icon{font-family:Material Icons!important}:host{--font-sans: \"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;--slate-50: #f8fafc;--slate-100: #f1f5f9;--slate-200: #e2e8f0;--slate-300: #cbd5e1;--slate-400: #94a3b8;--slate-500: #64748b;--slate-600: #475569;--slate-700: #334155;--slate-800: #1e293b;--slate-900: #0f172a;--color-primary: #230860;--color-secondary: #00b6ff;--color-accent-gradient: linear-gradient(135deg, #230860 0%, #00b6ff 100%);--color-success: #10b981;--color-success-bg: #ecfdf5;--color-error: #ef4444;--color-error-bg: #fef2f2;--border-radius-sm: 8px;--border-radius-md: 12px;--border-radius-lg: 16px;--border-radius-xl: 24px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .05), 0 2px 4px -2px rgba(0, 0, 0, .05);--shadow-lg: 0 10px 15px -3px rgba(35, 8, 96, .05), 0 4px 6px -4px rgba(35, 8, 96, .05);--shadow-xl: 0 20px 25px -5px rgba(35, 8, 96, .08), 0 8px 10px -6px rgba(35, 8, 96, .08);--transition-smooth: all .3s cubic-bezier(.4, 0, .2, 1);--transition-bounce: all .4s cubic-bezier(.175, .885, .32, 1.275)}*{box-sizing:border-box;font-family:var(--font-sans)}.main_section{position:relative;height:100vh;background-color:var(--slate-50);display:flex;flex-direction:column;overflow:hidden}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.main_header{padding:15px;background:#fff;border-bottom:1px solid var(--slate-100);flex-shrink:0;box-shadow:0 2px 8px #00000003}.header{display:flex;align-items:center;justify-content:space-between}.back-btn{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.6rem 1.2rem;border-radius:var(--border-radius-md);background:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-700)!important;transition:var(--transition-smooth);font-weight:500;font-size:.9rem;cursor:pointer}.back-btn mat-icon{font-size:18px!important;width:18px!important;height:18px!important;color:var(--slate-700)!important;display:flex;align-items:center;justify-content:center}.back-btn:hover{background:var(--slate-100);transform:translate(-3px);color:var(--slate-900)!important}.header-title{flex-grow:1;text-align:right}.header-title h1{font-size:1.5rem;font-weight:700;margin-bottom:.2rem;color:var(--slate-900)!important;letter-spacing:-.025em}.header-title p{color:var(--slate-500)!important;font-size:.9rem;font-weight:500;margin-bottom:0}.progress-bar{width:100%;height:6px;background-color:var(--slate-100);margin-top:3px;border-radius:10px;overflow:hidden;position:relative}.progress-fill{height:100%;background:var(--color-accent-gradient);border-radius:10px;transition:width .5s cubic-bezier(.4,0,.2,1);position:relative}.progress-fill:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0);animation:shimmer 2s infinite linear}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.main_body{flex-grow:1;overflow-y:auto;padding:10px;display:flex;justify-content:center;background:var(--slate-50)}.w-60{width:100%;max-width:800px}.service_section,.location_section,.staff-listing,.date_section,.contact_section,.payment_section,.booking-confirmation{animation:slideUp .5s cubic-bezier(.16,1,.3,1) forwards}@keyframes slideUp{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}h2{font-size:1.5rem;font-weight:700;color:var(--slate-900)!important;letter-spacing:-.02em;margin-bottom:.3rem}p.subtitle,.service-selection p,.location_section p,.staff-subtitle,.datetime-subtitle,.contact-subtitle,.payment-subtitle{color:var(--slate-500)!important;font-size:13px;margin-bottom:2rem}.services-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding-bottom:2rem}.service-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px}.service-card:hover{border-color:var(--slate-400);transform:translateY(-4px);box-shadow:var(--shadow-lg)}.service-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px;transform:translateY(-2px)}.service-card-selected:before,.location-card-selected:before{content:\"\\2713\";position:absolute;top:-10px;right:-10px;background:var(--color-accent-gradient);color:#fff!important;width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:700;box-shadow:0 4px 8px #2308604d;animation:popIn .3s cubic-bezier(.175,.885,.32,1.275);z-index:10}@keyframes popIn{0%{transform:scale(0)}to{transform:scale(1)}}.service-header{display:flex;align-items:flex-start;gap:1rem;margin-bottom:1rem}.service-icon{width:48px;height:48px;border-radius:var(--border-radius-md);background-color:var(--slate-100);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.service-icon mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:var(--color-primary)!important}.service-card-selected .service-icon{background:var(--slate-900)}.service-card-selected .service-icon mat-icon{color:#fff!important}.service-info{flex-grow:1}.service-title{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;line-height:1.3;margin-bottom:.2rem}.service-price{font-size:1.25rem;font-weight:800;color:var(--slate-900)!important;text-align:right}.service-duration{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;text-align:right;margin-top:.1rem}.service-description{color:var(--slate-600)!important;font-size:.9rem;line-height:1.5;margin-bottom:1.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.home-visit{align-self:flex-start;display:inline-flex;align-items:center;gap:.5rem;font-size:.75rem;font-weight:600;color:var(--slate-700)!important;border:1px solid var(--slate-200);padding:.35rem .75rem;border-radius:20px;background-color:var(--slate-50);transition:var(--transition-smooth)}.home-visit img{width:14px;height:14px}.home-visit:before{content:\"\";display:inline-block;width:6px;height:6px;border-radius:50%;background-color:var(--color-success);box-shadow:0 0 #10b98166;animation:pulseGlow 1.8s infinite}@keyframes pulseGlow{0%{box-shadow:0 0 #10b981b3}70%{box-shadow:0 0 0 6px #10b98100}to{box-shadow:0 0 #10b98100}}.location-list{display:flex;flex-direction:column;gap:1.25rem;padding-bottom:2rem}.location-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm)}.location-card:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md)}.location-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px)}.location-content{display:flex;align-items:center}.location-info{display:flex;align-items:center;gap:1.25rem;width:100%}.location-icon{width:52px;height:52px;background-color:var(--slate-100);border-radius:var(--border-radius-md);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.location-icon img{width:28px;height:28px}.location-card-selected .location-icon{background:var(--slate-900)}.location-details{flex-grow:1}.location-details h3{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.3rem}.location-details p{font-size:.9rem;color:var(--slate-500)!important;font-weight:450;line-height:1.4;margin-bottom:0}.search-container{width:100%;margin-bottom:1.25rem}.search-input-wrapper{width:100%;background-color:var(--slate-100);border:1.5px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;transition:var(--transition-smooth)}.search-input-wrapper:focus-within{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #23086014}.search-input{font-size:.95rem;font-weight:500;color:var(--slate-900)!important;background:transparent;outline:none;width:100%}.search-input::placeholder{color:var(--slate-400)}.search-icon{color:var(--slate-400)!important;font-size:20px!important;width:20px!important;height:20px!important}.clear-icon{color:var(--slate-400)!important;font-size:18px!important;width:18px!important;height:18px!important;transition:var(--transition-smooth)}.clear-icon:hover{color:var(--slate-600)!important}.staff-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1rem;max-height:48vh;overflow-y:auto;padding-right:.5rem;padding-bottom:1rem}.staff-list::-webkit-scrollbar{width:6px}.staff-list::-webkit-scrollbar-track{background:var(--slate-50);border-radius:4px}.staff-list::-webkit-scrollbar-thumb{background:var(--slate-200);border-radius:4px}.staff-list::-webkit-scrollbar-thumb:hover{background:var(--slate-300)}.staff-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);margin-bottom:0!important}.staff-card:hover{border-color:var(--slate-300);transform:translateY(-2px);box-shadow:var(--shadow-md)}.staff-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px);margin-bottom:0!important}.staff-avatar{width:48px;height:48px;background:var(--color-accent-gradient);font-size:.95rem;font-weight:700;color:#fff!important;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 10px #2308601a;letter-spacing:.5px;transition:var(--transition-smooth)}.staff-card-selected .staff-avatar{transform:scale(1.05)}.staff-name{font-size:1.05rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.2rem;letter-spacing:-.015em}.staff-specialty{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;margin-bottom:0;text-transform:uppercase;letter-spacing:.05em}.selection-indicator{display:flex;align-items:center;justify-content:center;margin-left:auto;padding-left:1rem}.checkmark-circle-mini{width:24px;height:24px;border:2px solid var(--slate-300);border-radius:50%;background-color:#fff;transition:var(--transition-bounce);color:#fff!important}.checkmark-circle-mini.selected{background:var(--color-accent-gradient);border-color:transparent;box-shadow:0 3px 8px #23086040}.checkmark-circle-mini mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#fff!important;font-weight:800!important;display:flex;align-items:center;justify-content:center}.main_container{display:flex;gap:2rem;margin-bottom:2rem}.section-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm);height:100%}.section-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:10px!important;letter-spacing:-.01em}.date-picker-container{border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;display:flex;align-items:center;justify-content:space-between;transition:var(--transition-smooth);background-color:var(--slate-50);cursor:pointer}.date-picker-container:hover{border-color:var(--slate-400);background-color:#fff}.date-input{font-size:.95rem;font-weight:600;color:var(--slate-800)!important;background:transparent;border:none;outline:none;cursor:pointer;width:100%}.date-picker-container mat-icon{color:var(--color-primary)!important;font-size:20px!important;width:20px!important;height:20px!important}.datepicker-popover{position:absolute;z-index:1000;margin-top:4px;border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);background:#fff;border:1px solid var(--slate-200);width:320px}::ng-deep .datepicker-calendar{border-radius:var(--border-radius-lg)!important;width:100%!important}::ng-deep .mat-calendar-header{background:var(--color-accent-gradient)!important;color:#fff!important;padding:.5rem!important}::ng-deep .mat-calendar-content{padding:8px!important}::ng-deep .mat-calendar-controls{margin:0!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:1rem!important}::ng-deep .mat-calendar-arrow{fill:#fff!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important}::ng-deep .mat-calendar-body-cell{font-size:13px!important}::ng-deep .mat-calendar-body-cell-content{font-weight:600!important;color:var(--slate-800)!important;border-radius:8px!important}::ng-deep .mat-calendar-body-selected{background:var(--color-accent-gradient)!important;color:#fff!important;box-shadow:0 4px 10px #23086033!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:2px solid var(--color-primary)!important;color:var(--color-primary)!important}.time_selection{max-height:420px;display:flex;flex-direction:column}.time_selection .row{flex-grow:1;overflow-y:auto;padding-right:.25rem;margin-top:10px}.time-slot{background:#fff;border:1px solid var(--slate-200);font-size:.9rem;font-weight:600;color:var(--slate-800)!important;padding:.75rem .5rem;border-radius:var(--border-radius-md);cursor:pointer;transition:var(--transition-smooth);text-align:center;box-shadow:var(--shadow-sm)}.time-slot:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md);background-color:var(--slate-50)}.time-slot.selected{background:var(--color-accent-gradient);border-color:transparent;color:#fff!important;box-shadow:0 4px 12px #23086033}.form-section{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm)}.form-label{font-size:.85rem;font-weight:600;color:var(--slate-700)!important;margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.required-asterisk{color:var(--color-error);margin-left:2px}.form-control,.form-input,.form-textarea{width:100%;background-color:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-900)!important;font-size:.95rem;font-weight:500;padding:.75rem 1rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);outline:none}.form-control:focus,.form-input:focus,.form-textarea:focus{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #2308601a}.form-textarea{min-height:100px;resize:vertical}.policies-container{background-color:#fff;border:1px solid var(--slate-200);padding:1.75rem;border-radius:var(--border-radius-lg);margin-top:1.5rem;box-shadow:var(--shadow-sm)}.policies-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1.25rem}.policy-item{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1rem 1.25rem;cursor:pointer;transition:var(--transition-smooth);display:flex;justify-content:space-between;align-items:center}.policy-item:hover{background-color:var(--slate-100);border-color:var(--slate-300)}.policy-title{font-size:.95rem;font-weight:600;color:var(--slate-800)!important}.policy-arrow mat-icon{color:var(--slate-500)!important;transition:var(--transition-smooth)}.cancellation_policies{background-color:var(--slate-50);padding:1rem 1.5rem;border-left:3px solid var(--color-primary);border-radius:0 0 var(--border-radius-md) var(--border-radius-md);margin-top:-4px;margin-bottom:1rem;font-size:.9rem;color:var(--slate-600)!important;line-height:1.5}.acceptance-section{display:flex;align-items:center;gap:.75rem;margin-top:1.5rem}.custom-checkbox{width:20px;height:20px;border:2px solid var(--slate-300);border-radius:6px;cursor:pointer;transition:var(--transition-smooth);position:relative;appearance:none;background-color:#fff;outline:none}.custom-checkbox:checked{background:var(--color-accent-gradient);border-color:transparent}.custom-checkbox:checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff!important;font-size:.75rem;font-weight:800}.acceptance-text{font-size:.95rem;color:var(--slate-700)!important;font-weight:500;-webkit-user-select:none;user-select:none;line-height:1.4}.booking-summary-card{background-color:#fff;border:1px solid var(--slate-200);padding:2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);position:relative}.booking-summary-card:after{content:\"\";position:absolute;bottom:-1px;left:0;right:0;height:10px;background-image:radial-gradient(circle,white 4px,transparent 5px);background-size:12px 12px;background-position:0 0;z-index:2}.summary-title{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important;border-bottom:2px dashed var(--slate-200);padding-bottom:1rem;margin-bottom:1.5rem;text-align:center}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:.85rem 0;border-bottom:1px solid var(--slate-100)}.summary-label{font-size:.95rem;color:var(--slate-500)!important;font-weight:500}.summary-value{font-size:.95rem;color:var(--slate-900)!important;font-weight:600;text-align:right}.total-row{margin-top:1rem;padding-top:1.25rem;border-top:2px dashed var(--slate-200);border-bottom:none}.total-row .summary-label{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important}.total-row .summary-value{font-size:1.5rem;font-weight:800;color:var(--color-primary)!important}.booking-confirmation{background:#fff;border:1px solid var(--slate-200);padding:3rem 2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;align-items:center;text-align:center;max-width:500px;margin:0 auto}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:96px;height:96px;display:flex;align-items:center;justify-content:center}.confirmation-title{font-size:1.5rem;font-weight:800;color:var(--slate-900)!important;margin-bottom:.5rem}.confirmation-message{font-size:1rem;color:var(--slate-500)!important;line-height:1.6;margin-bottom:2rem;font-weight:450}.details-card{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1.5rem;width:100%;margin-bottom:2rem;text-align:left}.details-title{font-size:1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.details-row{display:flex;justify-content:space-between;padding:.5rem 0;border-bottom:1px dashed var(--slate-200)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.85rem;color:var(--slate-500)!important;font-weight:500}.detail-value{font-size:.9rem;color:var(--slate-900)!important;font-weight:600}.main_footer{border-top:1px solid var(--slate-200);background-color:#fff;padding:15px;flex-shrink:0;display:flex;justify-content:center;box-shadow:0 -4px 12px #00000005}.footer-buttons{width:100%;max-width:800px;display:flex;align-items:center}.back-footer-btn{font-size:.95rem;font-weight:600;color:var(--slate-600)!important;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);cursor:pointer}.back-footer-btn:hover{color:var(--slate-900)!important;background-color:var(--slate-100)}.continue-btn{background:var(--color-accent-gradient);color:#fff!important;border:none;padding:.75rem 2rem;border-radius:var(--border-radius-md);font-size:.95rem!important;font-weight:600;cursor:pointer;transition:var(--transition-smooth);box-shadow:0 4px 10px #23086033;width:max-content!important}.continue-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.continue-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed!important;box-shadow:none!important}.complete_booking,.pay-now-btn{background:var(--color-accent-gradient)!important;color:#fff!important;border:none;padding:.75rem 2.25rem!important;font-size:.95rem!important;font-weight:600;border-radius:var(--border-radius-md)!important;box-shadow:0 4px 12px #23086040;transition:var(--transition-smooth);cursor:pointer;display:flex;align-items:center;gap:.5rem;width:max-content!important}.complete_booking img,.pay-now-btn img{width:20px;height:20px;filter:brightness(0) invert(1)}.complete_booking:hover:not([disabled]),.pay-now-btn:hover:not([disabled]){transform:translateY(-2px);box-shadow:0 6px 18px #23086059}.complete_booking:disabled,.pay-now-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed;box-shadow:none}.service-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding:0;width:100%}.skeleton-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;height:180px;display:flex;flex-direction:column;justify-content:space-between}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border-radius:4px}@keyframes loading-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:48px;height:48px;border-radius:var(--border-radius-md)}.skeleton-title{height:20px;width:60%;margin-bottom:.5rem}.skeleton-price{height:20px;width:30%}.skeleton-duration{height:12px;width:25%;margin-top:.25rem}.skeleton-description{height:14px;width:85%}.skeleton-badge{height:28px;width:120px;border-radius:20px}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;width:100%}.skeleton-time-slot{height:42px;border-radius:var(--border-radius-md);background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border:1px solid var(--slate-100)}@media screen and (max-width: 475px){.main_header{padding:1rem}.header-title h1{font-size:1.25rem}.back-btn{padding:.5rem .8rem}.back-btn span{display:none}.main_body{padding:15px}.services-grid{grid-template-columns:1fr;gap:1rem}.staff-list{grid-template-columns:1fr!important;gap:.85rem!important}.service-card,.service-card-selected{min-height:auto}.main_container{flex-direction:column;gap:1.5rem}.datepicker-popover{width:100%;left:0}.details_container{gap:1.5rem}.details_container>.d-flex{flex-direction:column;gap:1.5rem}.details_container>.d-flex>div{width:100%!important}.booking-summary-card{padding:1.25rem}.summary-title{font-size:1.15rem}.total-row .summary-label{font-size:1.1rem}.total-row .summary-value{font-size:1.3rem}.main_footer{padding:1rem}.continue-btn{padding:.75rem 1.5rem}}.shipping-info{border-radius:10px;padding:20px;margin-bottom:12px;border:1px solid var(--slate-200);box-shadow:var(--shadow-sm)}.address-info{margin-bottom:0}.address-name{font-weight:700;margin-bottom:8px;color:var(--slate-900)!important}.address-details{color:var(--slate-500)!important;margin-bottom:8px}.mobile-number{font-weight:700;color:var(--slate-900)!important;font-size:15px}.change-address-btn{font-size:.85rem!important;font-weight:700!important;padding:10px;background:#fff;border:1px solid var(--slate-200);border-radius:8px;color:var(--slate-900)!important;cursor:pointer;transition:var(--transition-smooth)}.change-address-btn:hover{border-color:var(--color-primary);color:var(--color-primary)!important}.addLinks{padding:14px;border:1px dashed var(--slate-300);display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:8px;color:var(--slate-500)!important;margin-bottom:12px}.addLinks:hover{border-color:var(--color-primary);color:var(--color-primary)!important}h1{font-size:24px!important;font-weight:600!important}.done-actions{display:flex;gap:12px;width:100%}.done-btn{flex:1;max-width:220px;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);font-size:.95rem;font-weight:600;cursor:pointer;transition:var(--transition-smooth);border:none}.done-btn-primary{background:var(--color-accent-gradient);color:#fff!important;box-shadow:0 4px 10px #23086033}.done-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.done-btn-secondary{background:#fff;color:var(--slate-600)!important;border:1px solid var(--slate-200)}.done-btn-secondary:hover{background-color:var(--slate-100);color:var(--slate-900)!important}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i8.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i8.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i8.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i8.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i8.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "pipe", type: i8.SlicePipe, name: "slice" }, { kind: "pipe", type: i8.TitleCasePipe, name: "titlecase" }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "ngmodule", type: MatDatepickerModule }, { kind: "component", type: i9.MatCalendar, selector: "mat-calendar", inputs: ["headerComponent", "startAt", "startView", "selected", "minDate", "maxDate", "dateFilter", "dateClass", "comparisonStart", "comparisonEnd", "startDateAccessibleName", "endDateAccessibleName"], outputs: ["selectedChange", "yearSelected", "monthSelected", "viewChanged", "_userSelection", "_userDragDrop"], exportAs: ["matCalendar"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i10.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i10.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i10.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i10.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i10.PatternValidator, selector: "[pattern][formControlName],[pattern][formControl],[pattern][ngModel]", inputs: ["pattern"] }, { kind: "directive", type: i10.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: MatNativeDateModule }, { kind: "ngmodule", type: MatInputModule }, { kind: "ngmodule", type: MatDialogModule }, { kind: "directive", type: LettersOnlyDirective, selector: "[simpoLettersOnly]" }, { kind: "directive", type: NumbersOnlyDirective, selector: "[simpoNumbersOnly]" }, { kind: "ngmodule", type: ToastModule }, { kind: "component", type: i11.Toast, selector: "p-toast", inputs: ["key", "autoZIndex", "baseZIndex", "life", "style", "styleClass", "position", "preventOpenDuplicates", "preventDuplicates", "showTransformOptions", "hideTransformOptions", "showTransitionOptions", "hideTransitionOptions", "breakpoints"], outputs: ["onClose"] }, { kind: "directive", type: HoverDirective, selector: "[simpoHover]", outputs: ["hovering"] }, { kind: "component", type: HoverElementsComponent, selector: "simpo-hover-elements", inputs: ["data", "index", "editOptions", "isMerged", "isEcommerce"], outputs: ["edit"] }, { kind: "directive", type: BackgroundDirective, selector: "[simpoBackground]", inputs: ["simpoBackground", "scrollValue"] }] }); }
|
|
715
715
|
}
|
|
716
716
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AppointmentBookingComponent, decorators: [{
|
|
717
717
|
type: Component,
|
|
718
|
-
args: [{ selector: 'simpo-appointment-booking', standalone: true, imports: [CdkDragPlaceholder, CommonModule, MatIcon, MatFormFieldModule, MatDatepickerModule, FormsModule, MatNativeDateModule, MatInputModule, MatDialogModule, LettersOnlyDirective, NumbersOnlyDirective, ToastModule, HoverDirective, HoverElementsComponent, BackgroundDirective], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\n<section class=\"main_section\" [id]=\"data?.id\" simpoHover (hovering)=\"showEditTabs($event)\"\n [simpoBackground]=\"backgroundInfo\" [style.--color-accent-gradient]=\"accentColor\">\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\n </div>\n <div class=\"main_header\">\n <div class=\"header d-flex justify-content-between align-items-center\">\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\n (click)=\"goBack()\">\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\n </div>\n <div class=\"header-title\">\n <h1>Book New Appointment</h1>\n <p>{{businessName ?? \"N/A\" }}</p>\n </div>\n </div>\n\n <div class=\"progress-bar\">\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\n </div>\n </div>\n <div class=\"main_body w-100 d-flex justify-content-center\">\n <ng-container *ngIf=\"selectedTab === 'modeSelection'\">\n <ng-container *ngTemplateOutlet=\"modeSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'serviceListing'\">\n <ng-container *ngIf=\"!skeletonLoader\">\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\n </ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\n </ng-container>\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\n </ng-container>\n </div>\n <div class=\"main_footer d-flex justify-content-center align-items-center\"\n *ngIf=\"selectedTab!=='statusTemplate' && selectedTab!=='modeSelection'\">\n <div class=\"footer-buttons\"\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"confirmBooking()\" [disabled]=\"isProcessing\"\n [ngClass]=\"{'pay-now-btn' : bookingGroup?.totalCollectedAtBooking > 0 || !bookingGroup,'complete_booking' : bookingGroup && !bookingGroup?.totalCollectedAtBooking}\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\n {{isProcessing ? 'Please wait...' : 'Confirm Booking'}}\n </button>\n </div>\n </div>\n</section>\n\n<ng-template #modeSelection>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>How would you like this?</h2>\n <p>Choose how you'd like to be served</p>\n <div class=\"services-grid\">\n <div class=\"service-card\" (click)=\"selectMode('STORE_VISIT')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>storefront</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">Visit our Store</div>\n </div>\n </div>\n <div class=\"service-description\">Come to us at one of our locations</div>\n </div>\n <div class=\"service-card\" (click)=\"selectMode('HOME_VISIT')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>home</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">We come to you</div>\n </div>\n </div>\n <div class=\"service-description\">A professional visits your address</div>\n </div>\n <div class=\"service-card\" (click)=\"selectMode('VIDEO_CALL')\">\n <div class=\"service-header\">\n <div class=\"service-icon\"><mat-icon>videocam</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">Video consultation</div>\n </div>\n </div>\n <div class=\"service-description\">Connect over a video call</div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #serviceListing>\n <div class=\"w-60 service_section\">\n <div class=\"service-selection\">\n <h2>Select a Service</h2>\n <p>Choose the service(s) you'd like to book<span *ngIf=\"cartServices.length > 0\"> \u2014 {{cartServices.length}} selected</span></p>\n <p *ngIf=\"productCartItems.length > 0\" class=\"cart-hint\">{{productCartItems.length}} product(s) already in your cart \u2014 you can continue without picking a service.</p>\n\n <div class=\"services-grid\">\n <ng-container *ngFor=\"let service of serviceData\">\n <div class=\"\" (click)=\"selectService(service)\"\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\n <div class=\" service-header\">\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\n <div class=\"service-info\">\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\n </div>\n <div>\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\n service?.priceDetails?.price : 'N/A' }}</div>\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\n </div>\n </div>\n </div>\n <div class=\"service-description\" *ngIf=\"service?.description\">\n {{service?.description ? service?.description : 'N/A'}}\n </div>\n <div class=\"home-visit\" *ngIf=\"selectedMode === 'STORE_VISIT' && service?.homeAppointmentAvailable\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\n Visit Available</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #locationListing>\n <div class=\"location_section\">\n <div class=\"header flex-column align-items-start\">\n <h1>Choose Location</h1>\n <p>Select where you'd like to receive the service</p>\n </div>\n\n <div class=\"location-list\">\n <ng-container *ngFor=\"let location of locationData\">\n <div (click)=\"selectLocation(location)\"\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\n <div class=\"location-content\">\n <div class=\"location-info\">\n <div class=\"location-icon\"><img\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\n </div>\n <div class=\"location-details\">\n <div class=\"d-flex justify-content-between align-items-center\">\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\n </div>\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>\n\n<ng-template #staffListing>\n <div class=\"w-60 overflow-hidden staff-listing\">\n <div class=\"d-flex w-100 h-100\">\n <div class=\"w-100\">\n <div class=\"staff-header mb-3\">\n <h1>Select Staff Member</h1>\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\n </div>\n\n <div class=\"search-container mb-4\">\n <div class=\"search-input-wrapper d-flex align-items-center\">\n <mat-icon class=\"search-icon me-2\">search</mat-icon>\n <input type=\"text\" class=\"search-input border-0 flex-grow-1\" placeholder=\"Search staff member by name...\" [(ngModel)]=\"staffSearchQuery\">\n <mat-icon class=\"clear-icon cursor-pointer ms-2\" *ngIf=\"staffSearchQuery\" (click)=\"staffSearchQuery = ''\">close</mat-icon>\n </div>\n </div>\n\n <!-- Pure product-only line: one flat staff list, same as the old single-service flow -->\n <div class=\"staff-list\" *ngIf=\"cartServices.length === 0\">\n <ng-container *ngFor=\"let staff of filteredStaff\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForProductOnlyLine(staff)\"\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center flex-grow-1\">\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.staffName.slice(0,2).toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{(staff?.staffName ? staff?.staffName : 'N/A') | titlecase}}</h3>\n <p class=\"staff-specialty\">{{(businessName && businessName !== 'N/A') ? businessName : 'Booking Specialist'}}</p>\n </div>\n </div>\n <div class=\"selection-indicator\">\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"staff?.selected\">\n <mat-icon *ngIf=\"staff?.selected\">check</mat-icon>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n\n <!-- Bundled cart: one pool per line that resolution couldn't collapse to a single provider -->\n <ng-container *ngIf=\"cartServices.length > 0\">\n <div class=\"staff-line-group mb-4\" *ngFor=\"let line of resolvedLines\">\n <ng-container *ngIf=\"line.candidateStaffPool?.length\">\n <h4 class=\"mb-2\">For {{line.services.length}} service(s): {{ (line.services | slice:0:3).length ? '' : '' }}<span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></h4>\n <div class=\"staff-list mb-3\">\n <ng-container *ngFor=\"let staff of line.candidateStaffPool\">\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForLine(line, staff)\"\n [ngClass]=\"{ 'staff-card-selected' : line.selectedStaffId === staff.id, 'staff-card': line.selectedStaffId !== staff.id }\">\n <div class=\"d-flex align-items-center justify-content-between w-100\">\n <div class=\"d-flex align-items-center flex-grow-1\">\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\n {{staff?.name?.slice(0,2)?.toUpperCase()}}\n </div>\n <div class=\"staff-details flex-grow-1\">\n <h3 class=\"staff-name\">{{(staff?.name ? staff?.name : 'N/A') | titlecase}}</h3>\n </div>\n </div>\n <div class=\"selection-indicator\">\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"line.selectedStaffId === staff.id\">\n <mat-icon *ngIf=\"line.selectedStaffId === staff.id\">check</mat-icon>\n </div>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #dateSelection>\n <div class=\"w-60 date_section\">\n <div class=\"row justify-content-center h-100\">\n <div class=\"col-12 h-100\">\n <div class=\"datetime-header mb-2\">\n <h1>Select Date & Time</h1>\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\n </div>\n\n <div class=\"d-flex gap-4 main_container\">\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\n <div class=\"section-card card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Select Date</h3>\n\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\n (click)=\"$event.stopPropagation()\">\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\n\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\n </div>\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\n </mat-calendar>\n </div>\n </div>\n </div>\n </div>\n\n <!-- One slot-picker per resolved line, side by side when there's more than one (design doc \u00A73b) -->\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\" *ngIf=\"resolvedLines.length <= 1\">\n <div class=\"section-card card h-100 rounded-3 p-4\">\n <h3 class=\"section-title\">Available Times</h3>\n <div class=\"row g-2 mb-4 overflow-scroll\">\n <ng-container *ngIf=\"!skeletonLoader && resolvedLines[0]\">\n <div class=\"col-4\" *ngFor=\"let time of resolvedLines[0].slots\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectSlotForLine(resolvedLines[0], time)\">{{time ? time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n\n <!-- Multi-line case: each line gets its own full-width card with a staff header -->\n <div class=\"d-flex gap-4 main_container flex-wrap\" *ngIf=\"resolvedLines.length > 1\">\n <div class=\"w-100\" *ngFor=\"let line of resolvedLines\">\n <div class=\"section-card card rounded-3 p-4\">\n <h3 class=\"section-title\">Professional: {{line.staffName || line.selectedStaffName}}</h3>\n <p class=\"mb-2\" *ngIf=\"line.services.length\"><span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></p>\n <div class=\"row g-2 mb-2 overflow-scroll\">\n <ng-container *ngIf=\"!line.slotsLoading\">\n <div class=\"col-4\" *ngFor=\"let time of line.slots\">\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\n (click)=\"selectSlotForLine(line, time)\">{{time ? time?.value : 'N/A'}}</div>\n </div>\n </ng-container>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #contactDetails>\n <div class=\"w-60 contact_section\">\n <div class=\"contact-header mb-2\">\n <h1>Contact Details</h1>\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\n </div>\n\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\n <div class=\"d-flex gap-4\">\n <div [ngClass]=\"{'w-50' : selectedMode === 'HOME_VISIT', 'w-100' : selectedMode !== 'HOME_VISIT'}\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Personal Information</h3>\n\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Full Name\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"text\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\n </div>\n\n <div class=\"mb-4\">\n <label class=\"form-label d-flex align-items-center\">\n Email Address\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"email\" class=\"form-control form-input rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\n (ngModelChange)=\"checkRequiredValues()\"\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\" #emailField=\"ngModel\"\n name=\"email\" required>\n </div>\n\n <div class=\"mb-0\">\n <label class=\"form-label d-flex align-items-center\">\n Phone Number\n <span class=\"required-asterisk\">*</span>\n </label>\n <input type=\"tel\" class=\"form-control rounded-2\"\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\n </div>\n </div>\n </div>\n <!-- Home Visit address. Customer context: same saved-address flow as\n checkout/BookAppointmentComponent. Admin context (isAdminBooking): no\n logged-in customer account to read a saved address book from, so staff type\n the address manually instead. -->\n <div class=\"w-50\" *ngIf=\"selectedMode === 'HOME_VISIT'\">\n <div class=\"form-section card rounded-3 p-4 h-100\">\n <h3 class=\"section-title\">Home Visit Details</h3>\n\n <ng-container *ngIf=\"!isAdminBooking; else manualHomeVisitAddress\">\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\n <div class=\"address-info\">\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\n {{defaultAddress?.stateName}}</div>\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\n </div>\n </div>\n <button type=\"button\" class=\"change-address-btn w-100\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">\n CHANGE OR ADD ADDRESS\n </button>\n\n <div class=\"addLinks\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\n <mat-icon>add</mat-icon>\n <span class=\"ms-2\">Add an address</span>\n </div>\n </ng-container>\n\n <ng-template #manualHomeVisitAddress>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Receiver Name</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.receiverName\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Receiver Phone</label>\n <input type=\"tel\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.receiverPhone\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Address Line 1</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine1\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Address Line 2 (optional)</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine2\">\n </div>\n <div class=\"d-flex gap-2 mb-3\">\n <div class=\"w-50\">\n <label class=\"form-label d-flex align-items-center\">City</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.city\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n <div class=\"w-50\">\n <label class=\"form-label d-flex align-items-center\">State</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.state\">\n </div>\n </div>\n <div class=\"mb-3\">\n <label class=\"form-label d-flex align-items-center\">Pincode</label>\n <input type=\"text\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.zipCode\" (ngModelChange)=\"checkRequiredValues()\">\n </div>\n </ng-template>\n\n <div class=\"mb-0 mt-3\">\n <label class=\"form-label d-flex align-items-center\">Special Instructions</label>\n <textarea class=\"form-control form-textarea rounded-2\"\n placeholder=\"Any special instructions for the professional (optional)\"\n [(ngModel)]=\"instructions\"></textarea>\n </div>\n </div>\n </div>\n </div>\n <div class=\"policies-container\"\n *ngIf=\"cartServices[0]?.cancellationPolicy?.length > 0 || cartServices[0]?.reschedulePolicy?.length\">\n <h2 class=\"policies-title\">Policies & Terms</h2>\n\n <div class=\"policy-items-container d-flex flex-column gap-3\">\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\n <h3 class=\"policy-title\">Cancellation Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showCancellationPolicy\">\n <span *ngFor=\"let policy of cartServices[0]?.cancellationPolicy\">•\n {{policy}}</span>\n </div>\n\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\n (click)=\"showReducingPolicy = !showReducingPolicy\">\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\n </div>\n </div>\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\n *ngIf=\"showReducingPolicy\">\n <span *ngFor=\"let policy of cartServices[0]?.reschedulePolicy\">• {{policy}}</span>\n </div>\n </div>\n\n <div class=\"acceptance-section\">\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\n (ngModelChange)=\"checkRequiredValues()\">\n <p class=\"acceptance-text\" style=\"margin-bottom:0px !important\">\n I understand and accept the cancellation & rescheduling policies.\n </p>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #paymentTab>\n <div class=\"w-60 payment_section\">\n <div class=\"w-100 h-100\">\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\n <div class=\"payment-header mb-3 w-100\">\n <h1 style=\"font-size:24px;font-weight: 600;\">Booking Summary</h1>\n <p class=\"payment-subtitle mb-0\">Review your booking before confirming</p>\n </div>\n\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\n <div *ngFor=\"let line of resolvedLines; let i = index\">\n <h2 class=\"summary-title\" *ngIf=\"resolvedLines.length > 1\">Line {{i + 1}}</h2>\n <div class=\"summary-row\" *ngFor=\"let s of line.services\">\n <div class=\"summary-label\">{{s.name}}</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{servicePrice(s.id)}}</div>\n </div>\n <div class=\"summary-row\" *ngIf=\"line.staffName || line.selectedStaffName\">\n <div class=\"summary-label\">Professional</div>\n <div class=\"summary-value\">{{line.staffName || line.selectedStaffName}}</div>\n </div>\n <div class=\"summary-row\" *ngIf=\"selectedMode === 'STORE_VISIT'\">\n <div class=\"summary-label\">Location</div>\n <div class=\"summary-value\">{{selectedLocation?.storeName ?? 'N/A'}}</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Date & Time</div>\n <div class=\"summary-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</div>\n </div>\n </div>\n\n <div *ngIf=\"productCartItems.length > 0\">\n <h2 class=\"summary-title\">Products</h2>\n <div class=\"summary-row\" *ngFor=\"let p of productCartItems\">\n <div class=\"summary-label\">{{p.itemName}} x{{p.quantity}}</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{(p.sellingPrice ?? p.price ?? 0) * (p.quantity ?? 1)}}</div>\n </div>\n </div>\n\n <h2 class=\"summary-title\">Payment</h2>\n <div class=\"summary-row\" *ngIf=\"homeVisitCharge > 0\">\n <div class=\"summary-label\">Home visit charge</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{homeVisitCharge}}</div>\n </div>\n <div class=\"summary-row\">\n <div class=\"summary-label\">Total</div>\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{reviewTotal}}</div>\n </div>\n </div>\n </div>\n </div>\n </div>\n</ng-template>\n\n<ng-template #statusTemplate>\n <div class=\"booking-confirmation\">\n <div class=\"success-icon\">\n <div class=\"checkmark-circle\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\n </div>\n </div>\n\n <div class=\"confirmation-content\">\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\n <p class=\"confirmation-message\">\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\n try again later'}}\n </p>\n\n <!-- Video Call link, when already present on the confirmed group (a paid Video Call's\n link only appears once payment verification completes, handled elsewhere - see\n verify-payment.component.ts, not this screen). -->\n <div class=\"video-call-link-card d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus && selectedMode === 'VIDEO_CALL' && bookingGroup?.videoCallLink\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Your Video Call Link</h3>\n <a [href]=\"bookingGroup.videoCallLink\" target=\"_blank\">{{bookingGroup.videoCallLink}}</a>\n </div>\n </div>\n\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Appointment Details</h3>\n <div class=\"details-row\" *ngFor=\"let line of resolvedLines\">\n <span class=\"detail-label\">{{line.services.length ? (line.services[0].name) : 'Products'}}</span>\n <span class=\"detail-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <div class=\"details-card\">\n <h3 class=\"details-title\">Payment</h3>\n <div class=\"details-row\" *ngIf=\"bookingGroup?.homeVisitCharge > 0\">\n <span class=\"detail-label\">Home visit charge</span>\n <span class=\"detail-value\">\u20B9{{bookingGroup.homeVisitCharge}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Total</span>\n <span class=\"detail-value\">\u20B9{{bookingTotal}}</span>\n </div>\n <div class=\"details-row\">\n <span class=\"detail-label\">Paid</span>\n <span class=\"detail-value\">\u20B9{{bookingPaid}}</span>\n </div>\n <div class=\"details-row\" *ngIf=\"bookingDue > 0\">\n <span class=\"detail-label\">Due</span>\n <span class=\"detail-value\">\u20B9{{bookingDue}}</span>\n </div>\n </div>\n </div>\n\n <div class=\"done-actions d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus\">\n <ng-container *ngIf=\"!isAdminContext; else adminDoneActions\">\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToMyBookings()\">View my bookings</button>\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"goToListing()\">Keep shopping</button>\n </ng-container>\n <ng-template #adminDoneActions>\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToAppointmentsList()\">Back to Appointments List</button>\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"bookAnother()\">Book Another</button>\n </ng-template>\n </div>\n </div>\n </div>\n</ng-template>\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&display=swap\";mat-icon{font-family:Material Icons!important}:host{--font-sans: \"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;--slate-50: #f8fafc;--slate-100: #f1f5f9;--slate-200: #e2e8f0;--slate-300: #cbd5e1;--slate-400: #94a3b8;--slate-500: #64748b;--slate-600: #475569;--slate-700: #334155;--slate-800: #1e293b;--slate-900: #0f172a;--color-primary: #230860;--color-secondary: #00b6ff;--color-accent-gradient: linear-gradient(135deg, #230860 0%, #00b6ff 100%);--color-success: #10b981;--color-success-bg: #ecfdf5;--color-error: #ef4444;--color-error-bg: #fef2f2;--border-radius-sm: 8px;--border-radius-md: 12px;--border-radius-lg: 16px;--border-radius-xl: 24px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .05), 0 2px 4px -2px rgba(0, 0, 0, .05);--shadow-lg: 0 10px 15px -3px rgba(35, 8, 96, .05), 0 4px 6px -4px rgba(35, 8, 96, .05);--shadow-xl: 0 20px 25px -5px rgba(35, 8, 96, .08), 0 8px 10px -6px rgba(35, 8, 96, .08);--transition-smooth: all .3s cubic-bezier(.4, 0, .2, 1);--transition-bounce: all .4s cubic-bezier(.175, .885, .32, 1.275)}*{box-sizing:border-box;font-family:var(--font-sans)}.main_section{position:relative;height:100vh;background-color:var(--slate-50);display:flex;flex-direction:column;overflow:hidden}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.main_header{padding:15px;background:#fff;border-bottom:1px solid var(--slate-100);flex-shrink:0;box-shadow:0 2px 8px #00000003}.header{display:flex;align-items:center;justify-content:space-between}.back-btn{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.6rem 1.2rem;border-radius:var(--border-radius-md);background:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-700)!important;transition:var(--transition-smooth);font-weight:500;font-size:.9rem;cursor:pointer}.back-btn mat-icon{font-size:18px!important;width:18px!important;height:18px!important;color:var(--slate-700)!important;display:flex;align-items:center;justify-content:center}.back-btn:hover{background:var(--slate-100);transform:translate(-3px);color:var(--slate-900)!important}.header-title{flex-grow:1;text-align:right}.header-title h1{font-size:1.5rem;font-weight:700;margin-bottom:.2rem;color:var(--slate-900)!important;letter-spacing:-.025em}.header-title p{color:var(--slate-500)!important;font-size:.9rem;font-weight:500;margin-bottom:0}.progress-bar{width:100%;height:6px;background-color:var(--slate-100);margin-top:3px;border-radius:10px;overflow:hidden;position:relative}.progress-fill{height:100%;background:var(--color-accent-gradient);border-radius:10px;transition:width .5s cubic-bezier(.4,0,.2,1);position:relative}.progress-fill:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0);animation:shimmer 2s infinite linear}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.main_body{flex-grow:1;overflow-y:auto;padding:10px;display:flex;justify-content:center;background:var(--slate-50)}.w-60{width:100%;max-width:800px}.service_section,.location_section,.staff-listing,.date_section,.contact_section,.payment_section,.booking-confirmation{animation:slideUp .5s cubic-bezier(.16,1,.3,1) forwards}@keyframes slideUp{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}h2{font-size:1.5rem;font-weight:700;color:var(--slate-900)!important;letter-spacing:-.02em;margin-bottom:.3rem}p.subtitle,.service-selection p,.location_section p,.staff-subtitle,.datetime-subtitle,.contact-subtitle,.payment-subtitle{color:var(--slate-500)!important;font-size:13px;margin-bottom:2rem}.services-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding-bottom:2rem}.service-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px}.service-card:hover{border-color:var(--slate-400);transform:translateY(-4px);box-shadow:var(--shadow-lg)}.service-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px;transform:translateY(-2px)}.service-card-selected:before,.location-card-selected:before{content:\"\\2713\";position:absolute;top:-10px;right:-10px;background:var(--color-accent-gradient);color:#fff!important;width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:700;box-shadow:0 4px 8px #2308604d;animation:popIn .3s cubic-bezier(.175,.885,.32,1.275);z-index:10}@keyframes popIn{0%{transform:scale(0)}to{transform:scale(1)}}.service-header{display:flex;align-items:flex-start;gap:1rem;margin-bottom:1rem}.service-icon{width:48px;height:48px;border-radius:var(--border-radius-md);background-color:var(--slate-100);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.service-icon mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:var(--color-primary)!important}.service-card-selected .service-icon{background:var(--slate-900)}.service-card-selected .service-icon mat-icon{color:#fff!important}.service-info{flex-grow:1}.service-title{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;line-height:1.3;margin-bottom:.2rem}.service-price{font-size:1.25rem;font-weight:800;color:var(--slate-900)!important;text-align:right}.service-duration{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;text-align:right;margin-top:.1rem}.service-description{color:var(--slate-600)!important;font-size:.9rem;line-height:1.5;margin-bottom:1.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.home-visit{align-self:flex-start;display:inline-flex;align-items:center;gap:.5rem;font-size:.75rem;font-weight:600;color:var(--slate-700)!important;border:1px solid var(--slate-200);padding:.35rem .75rem;border-radius:20px;background-color:var(--slate-50);transition:var(--transition-smooth)}.home-visit img{width:14px;height:14px}.home-visit:before{content:\"\";display:inline-block;width:6px;height:6px;border-radius:50%;background-color:var(--color-success);box-shadow:0 0 #10b98166;animation:pulseGlow 1.8s infinite}@keyframes pulseGlow{0%{box-shadow:0 0 #10b981b3}70%{box-shadow:0 0 0 6px #10b98100}to{box-shadow:0 0 #10b98100}}.location-list{display:flex;flex-direction:column;gap:1.25rem;padding-bottom:2rem}.location-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm)}.location-card:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md)}.location-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px)}.location-content{display:flex;align-items:center}.location-info{display:flex;align-items:center;gap:1.25rem;width:100%}.location-icon{width:52px;height:52px;background-color:var(--slate-100);border-radius:var(--border-radius-md);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.location-icon img{width:28px;height:28px}.location-card-selected .location-icon{background:var(--slate-900)}.location-details{flex-grow:1}.location-details h3{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.3rem}.location-details p{font-size:.9rem;color:var(--slate-500)!important;font-weight:450;line-height:1.4;margin-bottom:0}.search-container{width:100%;margin-bottom:1.25rem}.search-input-wrapper{width:100%;background-color:var(--slate-100);border:1.5px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;transition:var(--transition-smooth)}.search-input-wrapper:focus-within{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #23086014}.search-input{font-size:.95rem;font-weight:500;color:var(--slate-900)!important;background:transparent;outline:none;width:100%}.search-input::placeholder{color:var(--slate-400)}.search-icon{color:var(--slate-400)!important;font-size:20px!important;width:20px!important;height:20px!important}.clear-icon{color:var(--slate-400)!important;font-size:18px!important;width:18px!important;height:18px!important;transition:var(--transition-smooth)}.clear-icon:hover{color:var(--slate-600)!important}.staff-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1rem;max-height:48vh;overflow-y:auto;padding-right:.5rem;padding-bottom:1rem}.staff-list::-webkit-scrollbar{width:6px}.staff-list::-webkit-scrollbar-track{background:var(--slate-50);border-radius:4px}.staff-list::-webkit-scrollbar-thumb{background:var(--slate-200);border-radius:4px}.staff-list::-webkit-scrollbar-thumb:hover{background:var(--slate-300)}.staff-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);margin-bottom:0!important}.staff-card:hover{border-color:var(--slate-300);transform:translateY(-2px);box-shadow:var(--shadow-md)}.staff-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px);margin-bottom:0!important}.staff-avatar{width:48px;height:48px;background:var(--color-accent-gradient);font-size:.95rem;font-weight:700;color:#fff!important;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 10px #2308601a;letter-spacing:.5px;transition:var(--transition-smooth)}.staff-card-selected .staff-avatar{transform:scale(1.05)}.staff-name{font-size:1.05rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.2rem;letter-spacing:-.015em}.staff-specialty{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;margin-bottom:0;text-transform:uppercase;letter-spacing:.05em}.selection-indicator{display:flex;align-items:center;justify-content:center;margin-left:auto;padding-left:1rem}.checkmark-circle-mini{width:24px;height:24px;border:2px solid var(--slate-300);border-radius:50%;background-color:#fff;transition:var(--transition-bounce);color:#fff!important}.checkmark-circle-mini.selected{background:var(--color-accent-gradient);border-color:transparent;box-shadow:0 3px 8px #23086040}.checkmark-circle-mini mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#fff!important;font-weight:800!important;display:flex;align-items:center;justify-content:center}.main_container{display:flex;gap:2rem;margin-bottom:2rem}.section-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm);height:100%}.section-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:10px!important;letter-spacing:-.01em}.date-picker-container{border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;display:flex;align-items:center;justify-content:space-between;transition:var(--transition-smooth);background-color:var(--slate-50);cursor:pointer}.date-picker-container:hover{border-color:var(--slate-400);background-color:#fff}.date-input{font-size:.95rem;font-weight:600;color:var(--slate-800)!important;background:transparent;border:none;outline:none;cursor:pointer;width:100%}.date-picker-container mat-icon{color:var(--color-primary)!important;font-size:20px!important;width:20px!important;height:20px!important}.datepicker-popover{position:absolute;z-index:1000;margin-top:4px;border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);background:#fff;border:1px solid var(--slate-200);width:320px}::ng-deep .datepicker-calendar{border-radius:var(--border-radius-lg)!important;width:100%!important}::ng-deep .mat-calendar-header{background:var(--color-accent-gradient)!important;color:#fff!important;padding:.5rem!important}::ng-deep .mat-calendar-content{padding:8px!important}::ng-deep .mat-calendar-controls{margin:0!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:1rem!important}::ng-deep .mat-calendar-arrow{fill:#fff!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important}::ng-deep .mat-calendar-body-cell{font-size:13px!important}::ng-deep .mat-calendar-body-cell-content{font-weight:600!important;color:var(--slate-800)!important;border-radius:8px!important}::ng-deep .mat-calendar-body-selected{background:var(--color-accent-gradient)!important;color:#fff!important;box-shadow:0 4px 10px #23086033!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:2px solid var(--color-primary)!important;color:var(--color-primary)!important}.time_selection{max-height:420px;display:flex;flex-direction:column}.time_selection .row{flex-grow:1;overflow-y:auto;padding-right:.25rem;margin-top:10px}.time-slot{background:#fff;border:1px solid var(--slate-200);font-size:.9rem;font-weight:600;color:var(--slate-800)!important;padding:.75rem .5rem;border-radius:var(--border-radius-md);cursor:pointer;transition:var(--transition-smooth);text-align:center;box-shadow:var(--shadow-sm)}.time-slot:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md);background-color:var(--slate-50)}.time-slot.selected{background:var(--color-accent-gradient);border-color:transparent;color:#fff!important;box-shadow:0 4px 12px #23086033}.form-section{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm)}.form-label{font-size:.85rem;font-weight:600;color:var(--slate-700)!important;margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.required-asterisk{color:var(--color-error);margin-left:2px}.form-control,.form-input,.form-textarea{width:100%;background-color:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-900)!important;font-size:.95rem;font-weight:500;padding:.75rem 1rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);outline:none}.form-control:focus,.form-input:focus,.form-textarea:focus{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #2308601a}.form-textarea{min-height:100px;resize:vertical}.policies-container{background-color:#fff;border:1px solid var(--slate-200);padding:1.75rem;border-radius:var(--border-radius-lg);margin-top:1.5rem;box-shadow:var(--shadow-sm)}.policies-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1.25rem}.policy-item{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1rem 1.25rem;cursor:pointer;transition:var(--transition-smooth);display:flex;justify-content:space-between;align-items:center}.policy-item:hover{background-color:var(--slate-100);border-color:var(--slate-300)}.policy-title{font-size:.95rem;font-weight:600;color:var(--slate-800)!important}.policy-arrow mat-icon{color:var(--slate-500)!important;transition:var(--transition-smooth)}.cancellation_policies{background-color:var(--slate-50);padding:1rem 1.5rem;border-left:3px solid var(--color-primary);border-radius:0 0 var(--border-radius-md) var(--border-radius-md);margin-top:-4px;margin-bottom:1rem;font-size:.9rem;color:var(--slate-600)!important;line-height:1.5}.acceptance-section{display:flex;align-items:center;gap:.75rem;margin-top:1.5rem}.custom-checkbox{width:20px;height:20px;border:2px solid var(--slate-300);border-radius:6px;cursor:pointer;transition:var(--transition-smooth);position:relative;appearance:none;background-color:#fff;outline:none}.custom-checkbox:checked{background:var(--color-accent-gradient);border-color:transparent}.custom-checkbox:checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff!important;font-size:.75rem;font-weight:800}.acceptance-text{font-size:.95rem;color:var(--slate-700)!important;font-weight:500;-webkit-user-select:none;user-select:none;line-height:1.4}.booking-summary-card{background-color:#fff;border:1px solid var(--slate-200);padding:2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);position:relative}.booking-summary-card:after{content:\"\";position:absolute;bottom:-1px;left:0;right:0;height:10px;background-image:radial-gradient(circle,white 4px,transparent 5px);background-size:12px 12px;background-position:0 0;z-index:2}.summary-title{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important;border-bottom:2px dashed var(--slate-200);padding-bottom:1rem;margin-bottom:1.5rem;text-align:center}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:.85rem 0;border-bottom:1px solid var(--slate-100)}.summary-label{font-size:.95rem;color:var(--slate-500)!important;font-weight:500}.summary-value{font-size:.95rem;color:var(--slate-900)!important;font-weight:600;text-align:right}.total-row{margin-top:1rem;padding-top:1.25rem;border-top:2px dashed var(--slate-200);border-bottom:none}.total-row .summary-label{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important}.total-row .summary-value{font-size:1.5rem;font-weight:800;color:var(--color-primary)!important}.booking-confirmation{background:#fff;border:1px solid var(--slate-200);padding:3rem 2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;align-items:center;text-align:center;max-width:500px;margin:0 auto}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:96px;height:96px;display:flex;align-items:center;justify-content:center}.confirmation-title{font-size:1.5rem;font-weight:800;color:var(--slate-900)!important;margin-bottom:.5rem}.confirmation-message{font-size:1rem;color:var(--slate-500)!important;line-height:1.6;margin-bottom:2rem;font-weight:450}.details-card{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1.5rem;width:100%;margin-bottom:2rem;text-align:left}.details-title{font-size:1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.details-row{display:flex;justify-content:space-between;padding:.5rem 0;border-bottom:1px dashed var(--slate-200)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.85rem;color:var(--slate-500)!important;font-weight:500}.detail-value{font-size:.9rem;color:var(--slate-900)!important;font-weight:600}.main_footer{border-top:1px solid var(--slate-200);background-color:#fff;padding:15px;flex-shrink:0;display:flex;justify-content:center;box-shadow:0 -4px 12px #00000005}.footer-buttons{width:100%;max-width:800px;display:flex;align-items:center}.back-footer-btn{font-size:.95rem;font-weight:600;color:var(--slate-600)!important;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);cursor:pointer}.back-footer-btn:hover{color:var(--slate-900)!important;background-color:var(--slate-100)}.continue-btn{background:var(--color-accent-gradient);color:#fff!important;border:none;padding:.75rem 2rem;border-radius:var(--border-radius-md);font-size:.95rem!important;font-weight:600;cursor:pointer;transition:var(--transition-smooth);box-shadow:0 4px 10px #23086033;width:max-content!important}.continue-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.continue-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed!important;box-shadow:none!important}.complete_booking,.pay-now-btn{background:var(--color-accent-gradient)!important;color:#fff!important;border:none;padding:.75rem 2.25rem!important;font-size:.95rem!important;font-weight:600;border-radius:var(--border-radius-md)!important;box-shadow:0 4px 12px #23086040;transition:var(--transition-smooth);cursor:pointer;display:flex;align-items:center;gap:.5rem;width:max-content!important}.complete_booking img,.pay-now-btn img{width:20px;height:20px;filter:brightness(0) invert(1)}.complete_booking:hover:not([disabled]),.pay-now-btn:hover:not([disabled]){transform:translateY(-2px);box-shadow:0 6px 18px #23086059}.complete_booking:disabled,.pay-now-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed;box-shadow:none}.service-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding:0;width:100%}.skeleton-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;height:180px;display:flex;flex-direction:column;justify-content:space-between}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border-radius:4px}@keyframes loading-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:48px;height:48px;border-radius:var(--border-radius-md)}.skeleton-title{height:20px;width:60%;margin-bottom:.5rem}.skeleton-price{height:20px;width:30%}.skeleton-duration{height:12px;width:25%;margin-top:.25rem}.skeleton-description{height:14px;width:85%}.skeleton-badge{height:28px;width:120px;border-radius:20px}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;width:100%}.skeleton-time-slot{height:42px;border-radius:var(--border-radius-md);background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border:1px solid var(--slate-100)}@media screen and (max-width: 475px){.main_header{padding:1rem}.header-title h1{font-size:1.25rem}.back-btn{padding:.5rem .8rem}.back-btn span{display:none}.main_body{padding:15px}.services-grid{grid-template-columns:1fr;gap:1rem}.staff-list{grid-template-columns:1fr!important;gap:.85rem!important}.service-card,.service-card-selected{min-height:auto}.main_container{flex-direction:column;gap:1.5rem}.datepicker-popover{width:100%;left:0}.details_container{gap:1.5rem}.details_container>.d-flex{flex-direction:column;gap:1.5rem}.details_container>.d-flex>div{width:100%!important}.booking-summary-card{padding:1.25rem}.summary-title{font-size:1.15rem}.total-row .summary-label{font-size:1.1rem}.total-row .summary-value{font-size:1.3rem}.main_footer{padding:1rem}.continue-btn{padding:.75rem 1.5rem}}.shipping-info{border-radius:10px;padding:20px;margin-bottom:12px;border:1px solid var(--slate-200);box-shadow:var(--shadow-sm)}.address-info{margin-bottom:0}.address-name{font-weight:700;margin-bottom:8px;color:var(--slate-900)!important}.address-details{color:var(--slate-500)!important;margin-bottom:8px}.mobile-number{font-weight:700;color:var(--slate-900)!important;font-size:15px}.change-address-btn{font-size:.85rem!important;font-weight:700!important;padding:10px;background:#fff;border:1px solid var(--slate-200);border-radius:8px;color:var(--slate-900)!important;cursor:pointer;transition:var(--transition-smooth)}.change-address-btn:hover{border-color:var(--color-primary);color:var(--color-primary)!important}.addLinks{padding:14px;border:1px dashed var(--slate-300);display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:8px;color:var(--slate-500)!important;margin-bottom:12px}.addLinks:hover{border-color:var(--color-primary);color:var(--color-primary)!important}h1{font-size:24px!important;font-weight:600!important}.done-actions{display:flex;gap:12px;width:100%}.done-btn{flex:1;max-width:220px;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);font-size:.95rem;font-weight:600;cursor:pointer;transition:var(--transition-smooth);border:none}.done-btn-primary{background:var(--color-accent-gradient);color:#fff!important;box-shadow:0 4px 10px #23086033}.done-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.done-btn-secondary{background:#fff;color:var(--slate-600)!important;border:1px solid var(--slate-200)}.done-btn-secondary:hover{background-color:var(--slate-100);color:var(--slate-900)!important}\n"] }]
|
|
718
|
+
args: [{ selector: 'simpo-appointment-booking', standalone: true, imports: [CdkDragPlaceholder, CommonModule, MatIcon, MatFormFieldModule, MatDatepickerModule, FormsModule, MatNativeDateModule, MatInputModule, MatDialogModule, LettersOnlyDirective, NumbersOnlyDirective, ToastModule, HoverDirective, HoverElementsComponent, BackgroundDirective], providers: [MessageService], template: "<p-toast position=\"bottom-right\" [baseZIndex]=\"10000000000\" [autoZIndex]=\"true\"\r\n [showTransformOptions]=\"screenWidth < 475 ? 'translateY(-100%)' : ''\"></p-toast>\r\n<section class=\"main_section\" [id]=\"data?.id\" simpoHover (hovering)=\"showEditTabs($event)\"\r\n [simpoBackground]=\"backgroundInfo\" [style.--color-accent-gradient]=\"accentColor\">\r\n <div [ngClass]=\"{'hover_effect': edit}\" *ngIf=\"showEditors\">\r\n <simpo-hover-elements [data]=\"data\" [index]=\"index\" [editOptions]=\"edit\"></simpo-hover-elements>\r\n </div>\r\n <div class=\"main_header\">\r\n <div class=\"header d-flex justify-content-between align-items-center\">\r\n <div class=\"back-btn d-flex justify-content-center align-items-center cursor-pointer gap-2 mb-3\"\r\n (click)=\"goBack()\">\r\n <mat-icon>keyboard_backspace</mat-icon><span *ngIf=\"screenWidth > 475\">Back to Home</span>\r\n </div>\r\n <div class=\"header-title\">\r\n <h1>Book New Appointment</h1>\r\n <p>{{businessName ?? \"N/A\" }}</p>\r\n </div>\r\n </div>\r\n\r\n <div class=\"progress-bar\">\r\n <div class=\"progress-fill\" [style.width]=\"barWidth + '%'\"></div>\r\n </div>\r\n </div>\r\n <div class=\"main_body w-100 d-flex justify-content-center\">\r\n <ng-container *ngIf=\"selectedTab === 'modeSelection'\">\r\n <ng-container *ngTemplateOutlet=\"modeSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'serviceListing'\">\r\n <ng-container *ngIf=\"!skeletonLoader\">\r\n <ng-container *ngTemplateOutlet=\"serviceListing\"></ng-container>\r\n </ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'locationListing'\">\r\n <ng-container *ngTemplateOutlet=\"locationListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'staffListing'\">\r\n <ng-container *ngTemplateOutlet=\"staffListing\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab === 'dateSelection'\">\r\n <ng-container *ngTemplateOutlet=\"dateSelection\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='contactDetails'\">\r\n <ng-container *ngTemplateOutlet=\"contactDetails\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='paymentTab'\">\r\n <ng-container *ngTemplateOutlet=\"paymentTab\"></ng-container>\r\n </ng-container>\r\n <ng-container *ngIf=\"selectedTab==='statusTemplate'\">\r\n <ng-container *ngTemplateOutlet=\"statusTemplate\"></ng-container>\r\n </ng-container>\r\n </div>\r\n <div class=\"main_footer d-flex justify-content-center align-items-center\"\r\n *ngIf=\"selectedTab!=='statusTemplate' && selectedTab!=='modeSelection'\">\r\n <div class=\"footer-buttons\"\r\n [ngStyle]=\"{'justify-content': selectedTab != 'serviceListing' ? 'space-between' : 'end'}\">\r\n <span class=\"back-footer-btn cursor-pointer\" (click)=\"previousStep()\"\r\n *ngIf=\"selectedTab != 'serviceListing'\">Back</span>\r\n <button class=\"continue-btn\" [disabled]=\"!activeButton\" (click)=\"nextStep()\"\r\n *ngIf=\"selectedTab!='paymentTab'\">{{!loader ? 'Continue' : 'Loading...'}}</button>\r\n <button class=\"cursor-pointer d-flex justify-content-evenly align-items-center\"\r\n *ngIf=\"selectedTab==='paymentTab'\" (click)=\"confirmBooking()\" [disabled]=\"isProcessing\"\r\n [ngClass]=\"{'pay-now-btn' : bookingGroup?.totalCollectedAtBooking > 0 || !bookingGroup,'complete_booking' : bookingGroup && !bookingGroup?.totalCollectedAtBooking}\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/304012c1753440087996Background.png\">\r\n {{isProcessing ? 'Please wait...' : 'Confirm Booking'}}\r\n </button>\r\n </div>\r\n </div>\r\n</section>\r\n\r\n<ng-template #modeSelection>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>How would you like this?</h2>\r\n <p>Choose how you'd like to be served</p>\r\n <div class=\"services-grid\">\r\n <div class=\"service-card\" (click)=\"selectMode('STORE_VISIT')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>storefront</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Visit our Store</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">Come to us at one of our locations</div>\r\n </div>\r\n <div class=\"service-card\" (click)=\"selectMode('HOME_VISIT')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>home</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">We come to you</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">A professional visits your address</div>\r\n </div>\r\n <div class=\"service-card\" (click)=\"selectMode('VIDEO_CALL')\">\r\n <div class=\"service-header\">\r\n <div class=\"service-icon\"><mat-icon>videocam</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">Video consultation</div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\">Connect over a video call</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #serviceListing>\r\n <div class=\"w-60 service_section\">\r\n <div class=\"service-selection\">\r\n <h2>Select a Service</h2>\r\n <p>Choose the service(s) you'd like to book<span *ngIf=\"cartServices.length > 0\"> \u2014 {{cartServices.length}} selected</span></p>\r\n <p *ngIf=\"productCartItems.length > 0\" class=\"cart-hint\">{{productCartItems.length}} product(s) already in your cart \u2014 you can continue without picking a service.</p>\r\n\r\n <div class=\"services-grid\">\r\n <ng-container *ngFor=\"let service of serviceData\">\r\n <div class=\"\" (click)=\"selectService(service)\"\r\n [ngClass]=\"{ 'service-card-selected' : service?.selected, 'service-card': !service?.selected }\">\r\n <div class=\" service-header\">\r\n <div class=\"service-icon\"><mat-icon>person_outline</mat-icon></div>\r\n <div class=\"service-info\">\r\n <div class=\"service-title\">{{service?.name ? service?.name : 'N/A'}}</div>\r\n </div>\r\n <div>\r\n <div class=\"service-price\">\u20B9{{service?.priceDetails?.price ?\r\n service?.priceDetails?.price : 'N/A' }}</div>\r\n <div class=\"service-duration\">{{service?.duration ? service?.duration : 'N/A'}} min\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"service-description\" *ngIf=\"service?.description\">\r\n {{service?.description ? service?.description : 'N/A'}}\r\n </div>\r\n <div class=\"home-visit\" *ngIf=\"selectedMode === 'STORE_VISIT' && service?.homeAppointmentAvailable\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/982126c1758628863129furniture_16406103.png\">Home\r\n Visit Available</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #locationListing>\r\n <div class=\"location_section\">\r\n <div class=\"header flex-column align-items-start\">\r\n <h1>Choose Location</h1>\r\n <p>Select where you'd like to receive the service</p>\r\n </div>\r\n\r\n <div class=\"location-list\">\r\n <ng-container *ngFor=\"let location of locationData\">\r\n <div (click)=\"selectLocation(location)\"\r\n [ngClass]=\"{ 'location-card-selected' : location?.selected, 'location-card': !location?.selected }\">\r\n <div class=\"location-content\">\r\n <div class=\"location-info\">\r\n <div class=\"location-icon\"><img\r\n src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/427226c1758629157758store_3171510.png\">\r\n </div>\r\n <div class=\"location-details\">\r\n <div class=\"d-flex justify-content-between align-items-center\">\r\n <h3>{{location?.storeName ? location?.storeName : 'N/A'}}</h3>\r\n </div>\r\n <p>{{location?.addressDetails?.addressLine}}, {{location?.addressDetails?.city}},\r\n {{location?.addressDetails?.state}} {{location?.pincode}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #staffListing>\r\n <div class=\"w-60 overflow-hidden staff-listing\">\r\n <div class=\"d-flex w-100 h-100\">\r\n <div class=\"w-100\">\r\n <div class=\"staff-header mb-3\">\r\n <h1>Select Staff Member</h1>\r\n <p class=\"staff-subtitle mb-0\">Choose your preferred professional</p>\r\n </div>\r\n\r\n <div class=\"search-container mb-4\">\r\n <div class=\"search-input-wrapper d-flex align-items-center\">\r\n <mat-icon class=\"search-icon me-2\">search</mat-icon>\r\n <input type=\"text\" class=\"search-input border-0 flex-grow-1\" placeholder=\"Search staff member by name...\" [(ngModel)]=\"staffSearchQuery\">\r\n <mat-icon class=\"clear-icon cursor-pointer ms-2\" *ngIf=\"staffSearchQuery\" (click)=\"staffSearchQuery = ''\">close</mat-icon>\r\n </div>\r\n </div>\r\n\r\n <!-- Pure product-only line: one flat staff list, same as the old single-service flow -->\r\n <div class=\"staff-list\" *ngIf=\"cartServices.length === 0\">\r\n <ng-container *ngFor=\"let staff of filteredStaff\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForProductOnlyLine(staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : staff?.selected, 'staff-card': !staff?.selected }\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center flex-grow-1\">\r\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.staffName.slice(0,2).toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{(staff?.staffName ? staff?.staffName : 'N/A') | titlecase}}</h3>\r\n <p class=\"staff-specialty\">{{(businessName && businessName !== 'N/A') ? businessName : 'Booking Specialist'}}</p>\r\n </div>\r\n </div>\r\n <div class=\"selection-indicator\">\r\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"staff?.selected\">\r\n <mat-icon *ngIf=\"staff?.selected\">check</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n\r\n <!-- Bundled cart: one pool per line that resolution couldn't collapse to a single provider -->\r\n <ng-container *ngIf=\"cartServices.length > 0\">\r\n <div class=\"staff-line-group mb-4\" *ngFor=\"let line of resolvedLines\">\r\n <ng-container *ngIf=\"line.candidateStaffPool?.length\">\r\n <h4 class=\"mb-2\">For {{line.services.length}} service(s): {{ (line.services | slice:0:3).length ? '' : '' }}<span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></h4>\r\n <div class=\"staff-list mb-3\">\r\n <ng-container *ngFor=\"let staff of line.candidateStaffPool\">\r\n <div class=\"card rounded-3 p-3\" (click)=\"selectStaffForLine(line, staff)\"\r\n [ngClass]=\"{ 'staff-card-selected' : line.selectedStaffId === staff.id, 'staff-card': line.selectedStaffId !== staff.id }\">\r\n <div class=\"d-flex align-items-center justify-content-between w-100\">\r\n <div class=\"d-flex align-items-center flex-grow-1\">\r\n <div class=\"staff-avatar rounded-circle d-flex align-items-center justify-content-center me-4\">\r\n {{staff?.name?.slice(0,2)?.toUpperCase()}}\r\n </div>\r\n <div class=\"staff-details flex-grow-1\">\r\n <h3 class=\"staff-name\">{{(staff?.name ? staff?.name : 'N/A') | titlecase}}</h3>\r\n </div>\r\n </div>\r\n <div class=\"selection-indicator\">\r\n <div class=\"checkmark-circle-mini d-flex align-items-center justify-content-center\" [class.selected]=\"line.selectedStaffId === staff.id\">\r\n <mat-icon *ngIf=\"line.selectedStaffId === staff.id\">check</mat-icon>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #dateSelection>\r\n <div class=\"w-60 date_section\">\r\n <div class=\"row justify-content-center h-100\">\r\n <div class=\"col-12 h-100\">\r\n <div class=\"datetime-header mb-2\">\r\n <h1>Select Date & Time</h1>\r\n <p class=\"datetime-subtitle mb-0\">Choose when you'd like your appointment</p>\r\n </div>\r\n\r\n <div class=\"d-flex gap-4 main_container\">\r\n <div [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\">\r\n <div class=\"section-card card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Select Date</h3>\r\n\r\n <div class=\"date-picker-container d-flex align-items-center justify-content-between\"\r\n (click)=\"$event.stopPropagation()\">\r\n <input type=\"text\" class=\"date-input border-0 rounded-2\" placeholder=\"dd-mm-yyyy\"\r\n [value]=\"selectedDateStr\" readonly (click)=\"toggleCalendar($event)\">\r\n\r\n <mat-icon class=\"ms-2\" (click)=\"toggleCalendar($event)\">calendar_today</mat-icon>\r\n </div>\r\n <div class=\"position-relative\" (click)=\"$event.stopPropagation()\">\r\n <div class=\"datepicker-popover\" *ngIf=\"showCalendar\">\r\n <mat-calendar [(selected)]=\"selectedDate\" [dateFilter]=\"dateFilter\"\r\n (selectedChange)=\"onDateSelected($event)\" class=\"datepicker-calendar\">\r\n </mat-calendar>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- One slot-picker per resolved line, side by side when there's more than one (design doc \u00A73b) -->\r\n <div class=\"time_selection\" [ngClass]=\"{'w-50' : screenWidth > 475 , 'w-100':screenWidth < 475}\" *ngIf=\"resolvedLines.length <= 1\">\r\n <div class=\"section-card card h-100 rounded-3 p-4\">\r\n <h3 class=\"section-title\">Available Times</h3>\r\n <div class=\"row g-2 mb-4 overflow-scroll\">\r\n <ng-container *ngIf=\"!skeletonLoader && resolvedLines[0]\">\r\n <div class=\"col-4\" *ngFor=\"let time of resolvedLines[0].slots\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectSlotForLine(resolvedLines[0], time)\">{{time ? time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <!-- Multi-line case: each line gets its own full-width card with a staff header -->\r\n <div class=\"d-flex gap-4 main_container flex-wrap\" *ngIf=\"resolvedLines.length > 1\">\r\n <div class=\"w-100\" *ngFor=\"let line of resolvedLines\">\r\n <div class=\"section-card card rounded-3 p-4\">\r\n <h3 class=\"section-title\">Professional: {{line.staffName || line.selectedStaffName}}</h3>\r\n <p class=\"mb-2\" *ngIf=\"line.services.length\"><span *ngFor=\"let s of line.services; let last = last\">{{s.name}}{{last ? '' : ', '}}</span></p>\r\n <div class=\"row g-2 mb-2 overflow-scroll\">\r\n <ng-container *ngIf=\"!line.slotsLoading\">\r\n <div class=\"col-4\" *ngFor=\"let time of line.slots\">\r\n <div class=\"time-slot rounded-2\" [class.selected]=\"time.selected\"\r\n (click)=\"selectSlotForLine(line, time)\">{{time ? time?.value : 'N/A'}}</div>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #contactDetails>\r\n <div class=\"w-60 contact_section\">\r\n <div class=\"contact-header mb-2\">\r\n <h1>Contact Details</h1>\r\n <p class=\"contact-subtitle mb-0\">Provide your contact information</p>\r\n </div>\r\n\r\n <div class=\"d-flex gap-3 details_container flex-column w-100\">\r\n <div class=\"d-flex gap-4\">\r\n <div [ngClass]=\"{'w-50' : selectedMode === 'HOME_VISIT', 'w-100' : selectedMode !== 'HOME_VISIT'}\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Personal Information</h3>\r\n\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Full Name\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.name\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoLettersOnly>\r\n </div>\r\n\r\n <div class=\"mb-4\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Email Address\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"email\" class=\"form-control form-input rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.email\"\r\n (ngModelChange)=\"checkRequiredValues()\"\r\n pattern=\"^[a-z0-9._%+-]+@[a-z0-9.-]+\\.[a-z]{2,4}$\" #emailField=\"ngModel\"\r\n name=\"email\" required>\r\n </div>\r\n\r\n <div class=\"mb-0\">\r\n <label class=\"form-label d-flex align-items-center\">\r\n Phone Number\r\n <span class=\"required-asterisk\">*</span>\r\n </label>\r\n <input type=\"tel\" class=\"form-control rounded-2\"\r\n [(ngModel)]=\"appointmentPayload.customerDetail.phoneNumber\"\r\n (ngModelChange)=\"checkRequiredValues()\" simpoNumbersOnly\r\n [ngClass]=\"{'mobile_number' : appointmentPayload.customerDetail.phoneNumber.length != 10}\">\r\n </div>\r\n </div>\r\n </div>\r\n <!-- Home Visit address. Customer context: same saved-address flow as\r\n checkout/BookAppointmentComponent. Admin context (isAdminBooking): no\r\n logged-in customer account to read a saved address book from, so staff type\r\n the address manually instead. -->\r\n <div class=\"w-50\" *ngIf=\"selectedMode === 'HOME_VISIT'\">\r\n <div class=\"form-section card rounded-3 p-4 h-100\">\r\n <h3 class=\"section-title\">Home Visit Details</h3>\r\n\r\n <ng-container *ngIf=\"!isAdminBooking; else manualHomeVisitAddress\">\r\n <div class=\"shipping-info\" *ngIf=\"defaultAddress\">\r\n <div class=\"address-info\">\r\n <div class=\"address-name\">{{defaultAddress?.receiverName}} ({{defaultAddress?.addressType}})</div>\r\n <div class=\"address-details\">{{defaultAddress?.addressLine1}}, {{defaultAddress?.cityName}},\r\n {{defaultAddress?.stateName}}</div>\r\n <div class=\"mobile-number\">Mobile: {{defaultAddress?.receiverPhone}}</div>\r\n </div>\r\n </div>\r\n <button type=\"button\" class=\"change-address-btn w-100\" (click)=\"changeAddress()\" *ngIf=\"defaultAddress\">\r\n CHANGE OR ADD ADDRESS\r\n </button>\r\n\r\n <div class=\"addLinks\" *ngIf=\"!defaultAddress\" (click)=\"addAddress()\">\r\n <mat-icon>add</mat-icon>\r\n <span class=\"ms-2\">Add an address</span>\r\n </div>\r\n </ng-container>\r\n\r\n <ng-template #manualHomeVisitAddress>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Receiver Name</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.receiverName\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Receiver Phone</label>\r\n <input type=\"tel\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.receiverPhone\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Address Line 1</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine1\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Address Line 2 (optional)</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.addressLine2\">\r\n </div>\r\n <div class=\"d-flex gap-2 mb-3\">\r\n <div class=\"w-50\">\r\n <label class=\"form-label d-flex align-items-center\">City</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.city\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n <div class=\"w-50\">\r\n <label class=\"form-label d-flex align-items-center\">State</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" [(ngModel)]=\"homeVisitAddress.state\">\r\n </div>\r\n </div>\r\n <div class=\"mb-3\">\r\n <label class=\"form-label d-flex align-items-center\">Pincode</label>\r\n <input type=\"text\" class=\"form-control form-input rounded-2\" simpoNumbersOnly [(ngModel)]=\"homeVisitAddress.zipCode\" (ngModelChange)=\"checkRequiredValues()\">\r\n </div>\r\n </ng-template>\r\n\r\n <div class=\"mb-0 mt-3\">\r\n <label class=\"form-label d-flex align-items-center\">Special Instructions</label>\r\n <textarea class=\"form-control form-textarea rounded-2\"\r\n placeholder=\"Any special instructions for the professional (optional)\"\r\n [(ngModel)]=\"instructions\"></textarea>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"policies-container\"\r\n *ngIf=\"cartServices[0]?.cancellationPolicy?.length > 0 || cartServices[0]?.reschedulePolicy?.length\">\r\n <h2 class=\"policies-title\">Policies & Terms</h2>\r\n\r\n <div class=\"policy-items-container d-flex flex-column gap-3\">\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showCancellationPolicy = !showCancellationPolicy\">\r\n <h3 class=\"policy-title\">Cancellation Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showCancellationPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showCancellationPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showCancellationPolicy\">\r\n <span *ngFor=\"let policy of cartServices[0]?.cancellationPolicy\">•\r\n {{policy}}</span>\r\n </div>\r\n\r\n <div class=\"policy-item d-flex justify-content-between align-items-center\"\r\n (click)=\"showReducingPolicy = !showReducingPolicy\">\r\n <h3 class=\"policy-title\">Rescheduling Policy</h3>\r\n <div class=\"policy-arrow d-flex align-items-center justify-content-center\"><mat-icon\r\n *ngIf=\"!showReducingPolicy\">keyboard_arrow_right</mat-icon>\r\n <mat-icon *ngIf=\"showReducingPolicy\">keyboard_arrow_down</mat-icon>\r\n </div>\r\n </div>\r\n <div class=\"cancellation_policies d-flex flex-column gap-2 fw-500\"\r\n *ngIf=\"showReducingPolicy\">\r\n <span *ngFor=\"let policy of cartServices[0]?.reschedulePolicy\">• {{policy}}</span>\r\n </div>\r\n </div>\r\n\r\n <div class=\"acceptance-section\">\r\n <input type=\"checkbox\" class=\"custom-checkbox\" [(ngModel)]=\"termsAndConditions\"\r\n (ngModelChange)=\"checkRequiredValues()\">\r\n <p class=\"acceptance-text\" style=\"margin-bottom:0px !important\">\r\n I understand and accept the cancellation & rescheduling policies.\r\n </p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #paymentTab>\r\n <div class=\"w-60 payment_section\">\r\n <div class=\"w-100 h-100\">\r\n <div class=\"w-100 d-flex justify-content-center align-items-center flex-column\">\r\n <div class=\"payment-header mb-3 w-100\">\r\n <h1 style=\"font-size:24px;font-weight: 600;\">Booking Summary</h1>\r\n <p class=\"payment-subtitle mb-0\">Review your booking before confirming</p>\r\n </div>\r\n\r\n <div class=\"booking-summary-card\" [ngClass]=\"{'w-100' : screenWidth < 475,'w-50':screenWidth > 475}\">\r\n <div *ngFor=\"let line of resolvedLines; let i = index\">\r\n <h2 class=\"summary-title\" *ngIf=\"resolvedLines.length > 1\">Line {{i + 1}}</h2>\r\n <div class=\"summary-row\" *ngFor=\"let s of line.services\">\r\n <div class=\"summary-label\">{{s.name}}</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{servicePrice(s.id)}}</div>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"line.staffName || line.selectedStaffName\">\r\n <div class=\"summary-label\">Professional</div>\r\n <div class=\"summary-value\">{{line.staffName || line.selectedStaffName}}</div>\r\n </div>\r\n <div class=\"summary-row\" *ngIf=\"selectedMode === 'STORE_VISIT'\">\r\n <div class=\"summary-label\">Location</div>\r\n <div class=\"summary-value\">{{selectedLocation?.storeName ?? 'N/A'}}</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Date & Time</div>\r\n <div class=\"summary-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</div>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"productCartItems.length > 0\">\r\n <h2 class=\"summary-title\">Products</h2>\r\n <div class=\"summary-row\" *ngFor=\"let p of productCartItems\">\r\n <div class=\"summary-label\">{{p.itemName}} x{{p.quantity}}</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{(p.sellingPrice ?? p.price ?? 0) * (p.quantity ?? 1)}}</div>\r\n </div>\r\n </div>\r\n\r\n <h2 class=\"summary-title\">Payment</h2>\r\n <div class=\"summary-row\" *ngIf=\"homeVisitCharge > 0\">\r\n <div class=\"summary-label\">Home visit charge</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{homeVisitCharge}}</div>\r\n </div>\r\n <div class=\"summary-row\">\r\n <div class=\"summary-label\">Total</div>\r\n <div class=\"summary-value\"><span class=\"currency-symbol\">\u20B9</span>{{reviewTotal}}</div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template #statusTemplate>\r\n <div class=\"booking-confirmation\">\r\n <div class=\"success-icon\">\r\n <div class=\"checkmark-circle\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/881293c1758695578518success.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"apiStatus\">\r\n <img src=\"https://d2z9497xp8xb12.cloudfront.net/prod-images/325000c1758695564518fail.gif\"\r\n class=\"w-100 h-100\" *ngIf=\"!apiStatus\">\r\n </div>\r\n </div>\r\n\r\n <div class=\"confirmation-content\">\r\n <h1 class=\"confirmation-title\">{{apiStatus ? 'Booking Confirmed!' : 'Booking Failed'}}</h1>\r\n <p class=\"confirmation-message\">\r\n {{apiStatus ? 'Your appointment has been successfully booked.':'Failed to book you appointment. Please\r\n try again later'}}\r\n </p>\r\n\r\n <!-- Video Call link, when already present on the confirmed group (a paid Video Call's\r\n link only appears once payment verification completes, handled elsewhere - see\r\n verify-payment.component.ts, not this screen). -->\r\n <div class=\"video-call-link-card d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus && selectedMode === 'VIDEO_CALL' && bookingGroup?.videoCallLink\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Your Video Call Link</h3>\r\n <a [href]=\"bookingGroup.videoCallLink\" target=\"_blank\">{{bookingGroup.videoCallLink}}</a>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Appointment Details</h3>\r\n <div class=\"details-row\" *ngFor=\"let line of resolvedLines\">\r\n <span class=\"detail-label\">{{line.services.length ? (line.services[0].name) : 'Products'}}</span>\r\n <span class=\"detail-value\">{{selectedDateStr}} at {{line.selectedSlot?.value ?? 'N/A'}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"d-flex w-100 align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <div class=\"details-card\">\r\n <h3 class=\"details-title\">Payment</h3>\r\n <div class=\"details-row\" *ngIf=\"bookingGroup?.homeVisitCharge > 0\">\r\n <span class=\"detail-label\">Home visit charge</span>\r\n <span class=\"detail-value\">\u20B9{{bookingGroup.homeVisitCharge}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Total</span>\r\n <span class=\"detail-value\">\u20B9{{bookingTotal}}</span>\r\n </div>\r\n <div class=\"details-row\">\r\n <span class=\"detail-label\">Paid</span>\r\n <span class=\"detail-value\">\u20B9{{bookingPaid}}</span>\r\n </div>\r\n <div class=\"details-row\" *ngIf=\"bookingDue > 0\">\r\n <span class=\"detail-label\">Due</span>\r\n <span class=\"detail-value\">\u20B9{{bookingDue}}</span>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div class=\"done-actions d-flex align-items-center justify-content-center\" *ngIf=\"apiStatus\">\r\n <ng-container *ngIf=\"!isAdminContext; else adminDoneActions\">\r\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToMyBookings()\">View my bookings</button>\r\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"goToListing()\">Keep shopping</button>\r\n </ng-container>\r\n <ng-template #adminDoneActions>\r\n <button type=\"button\" class=\"done-btn done-btn-primary\" (click)=\"goToAppointmentsList()\">Back to Appointments List</button>\r\n <button type=\"button\" class=\"done-btn done-btn-secondary\" (click)=\"bookAnother()\">Book Another</button>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["@import\"https://fonts.googleapis.com/css2?family=Outfit:wght@300;400;500;600;700;800&display=swap\";mat-icon{font-family:Material Icons!important}:host{--font-sans: \"Outfit\", -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif;--slate-50: #f8fafc;--slate-100: #f1f5f9;--slate-200: #e2e8f0;--slate-300: #cbd5e1;--slate-400: #94a3b8;--slate-500: #64748b;--slate-600: #475569;--slate-700: #334155;--slate-800: #1e293b;--slate-900: #0f172a;--color-primary: #230860;--color-secondary: #00b6ff;--color-accent-gradient: linear-gradient(135deg, #230860 0%, #00b6ff 100%);--color-success: #10b981;--color-success-bg: #ecfdf5;--color-error: #ef4444;--color-error-bg: #fef2f2;--border-radius-sm: 8px;--border-radius-md: 12px;--border-radius-lg: 16px;--border-radius-xl: 24px;--shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, .05);--shadow-md: 0 4px 6px -1px rgba(0, 0, 0, .05), 0 2px 4px -2px rgba(0, 0, 0, .05);--shadow-lg: 0 10px 15px -3px rgba(35, 8, 96, .05), 0 4px 6px -4px rgba(35, 8, 96, .05);--shadow-xl: 0 20px 25px -5px rgba(35, 8, 96, .08), 0 8px 10px -6px rgba(35, 8, 96, .08);--transition-smooth: all .3s cubic-bezier(.4, 0, .2, 1);--transition-bounce: all .4s cubic-bezier(.175, .885, .32, 1.275)}*{box-sizing:border-box;font-family:var(--font-sans)}.main_section{position:relative;height:100vh;background-color:var(--slate-50);display:flex;flex-direction:column;overflow:hidden}.hover_effect{position:absolute;width:100%;top:0;left:0;height:100%}.main_header{padding:15px;background:#fff;border-bottom:1px solid var(--slate-100);flex-shrink:0;box-shadow:0 2px 8px #00000003}.header{display:flex;align-items:center;justify-content:space-between}.back-btn{display:flex;align-items:center;justify-content:center;gap:.5rem;padding:.6rem 1.2rem;border-radius:var(--border-radius-md);background:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-700)!important;transition:var(--transition-smooth);font-weight:500;font-size:.9rem;cursor:pointer}.back-btn mat-icon{font-size:18px!important;width:18px!important;height:18px!important;color:var(--slate-700)!important;display:flex;align-items:center;justify-content:center}.back-btn:hover{background:var(--slate-100);transform:translate(-3px);color:var(--slate-900)!important}.header-title{flex-grow:1;text-align:right}.header-title h1{font-size:1.5rem;font-weight:700;margin-bottom:.2rem;color:var(--slate-900)!important;letter-spacing:-.025em}.header-title p{color:var(--slate-500)!important;font-size:.9rem;font-weight:500;margin-bottom:0}.progress-bar{width:100%;height:6px;background-color:var(--slate-100);margin-top:3px;border-radius:10px;overflow:hidden;position:relative}.progress-fill{height:100%;background:var(--color-accent-gradient);border-radius:10px;transition:width .5s cubic-bezier(.4,0,.2,1);position:relative}.progress-fill:after{content:\"\";position:absolute;inset:0;background:linear-gradient(90deg,#fff0,#ffffff4d,#fff0);animation:shimmer 2s infinite linear}@keyframes shimmer{0%{transform:translate(-100%)}to{transform:translate(100%)}}.main_body{flex-grow:1;overflow-y:auto;padding:10px;display:flex;justify-content:center;background:var(--slate-50)}.w-60{width:100%;max-width:800px}.service_section,.location_section,.staff-listing,.date_section,.contact_section,.payment_section,.booking-confirmation{animation:slideUp .5s cubic-bezier(.16,1,.3,1) forwards}@keyframes slideUp{0%{opacity:0;transform:translateY(15px)}to{opacity:1;transform:translateY(0)}}h2{font-size:1.5rem;font-weight:700;color:var(--slate-900)!important;letter-spacing:-.02em;margin-bottom:.3rem}p.subtitle,.service-selection p,.location_section p,.staff-subtitle,.datetime-subtitle,.contact-subtitle,.payment-subtitle{color:var(--slate-500)!important;font-size:13px;margin-bottom:2rem}.services-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding-bottom:2rem}.service-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px}.service-card:hover{border-color:var(--slate-400);transform:translateY(-4px);box-shadow:var(--shadow-lg)}.service-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);display:flex;flex-direction:column;justify-content:space-between;height:100%;min-height:180px;transform:translateY(-2px)}.service-card-selected:before,.location-card-selected:before{content:\"\\2713\";position:absolute;top:-10px;right:-10px;background:var(--color-accent-gradient);color:#fff!important;width:24px;height:24px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:.8rem;font-weight:700;box-shadow:0 4px 8px #2308604d;animation:popIn .3s cubic-bezier(.175,.885,.32,1.275);z-index:10}@keyframes popIn{0%{transform:scale(0)}to{transform:scale(1)}}.service-header{display:flex;align-items:flex-start;gap:1rem;margin-bottom:1rem}.service-icon{width:48px;height:48px;border-radius:var(--border-radius-md);background-color:var(--slate-100);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.service-icon mat-icon{font-size:24px!important;width:24px!important;height:24px!important;color:var(--color-primary)!important}.service-card-selected .service-icon{background:var(--slate-900)}.service-card-selected .service-icon mat-icon{color:#fff!important}.service-info{flex-grow:1}.service-title{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;line-height:1.3;margin-bottom:.2rem}.service-price{font-size:1.25rem;font-weight:800;color:var(--slate-900)!important;text-align:right}.service-duration{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;text-align:right;margin-top:.1rem}.service-description{color:var(--slate-600)!important;font-size:.9rem;line-height:1.5;margin-bottom:1.25rem;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}.home-visit{align-self:flex-start;display:inline-flex;align-items:center;gap:.5rem;font-size:.75rem;font-weight:600;color:var(--slate-700)!important;border:1px solid var(--slate-200);padding:.35rem .75rem;border-radius:20px;background-color:var(--slate-50);transition:var(--transition-smooth)}.home-visit img{width:14px;height:14px}.home-visit:before{content:\"\";display:inline-block;width:6px;height:6px;border-radius:50%;background-color:var(--color-success);box-shadow:0 0 #10b98166;animation:pulseGlow 1.8s infinite}@keyframes pulseGlow{0%{box-shadow:0 0 #10b981b3}70%{box-shadow:0 0 0 6px #10b98100}to{box-shadow:0 0 #10b98100}}.location-list{display:flex;flex-direction:column;gap:1.25rem;padding-bottom:2rem}.location-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm)}.location-card:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md)}.location-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:1.5rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px)}.location-content{display:flex;align-items:center}.location-info{display:flex;align-items:center;gap:1.25rem;width:100%}.location-icon{width:52px;height:52px;background-color:var(--slate-100);border-radius:var(--border-radius-md);display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:var(--transition-smooth)}.location-icon img{width:28px;height:28px}.location-card-selected .location-icon{background:var(--slate-900)}.location-details{flex-grow:1}.location-details h3{font-size:1.15rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.3rem}.location-details p{font-size:.9rem;color:var(--slate-500)!important;font-weight:450;line-height:1.4;margin-bottom:0}.search-container{width:100%;margin-bottom:1.25rem}.search-input-wrapper{width:100%;background-color:var(--slate-100);border:1.5px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;transition:var(--transition-smooth)}.search-input-wrapper:focus-within{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #23086014}.search-input{font-size:.95rem;font-weight:500;color:var(--slate-900)!important;background:transparent;outline:none;width:100%}.search-input::placeholder{color:var(--slate-400)}.search-icon{color:var(--slate-400)!important;font-size:20px!important;width:20px!important;height:20px!important}.clear-icon{color:var(--slate-400)!important;font-size:18px!important;width:18px!important;height:18px!important;transition:var(--transition-smooth)}.clear-icon:hover{color:var(--slate-600)!important}.staff-list{display:grid;grid-template-columns:repeat(auto-fill,minmax(230px,1fr));gap:1rem;max-height:48vh;overflow-y:auto;padding-right:.5rem;padding-bottom:1rem}.staff-list::-webkit-scrollbar{width:6px}.staff-list::-webkit-scrollbar-track{background:var(--slate-50);border-radius:4px}.staff-list::-webkit-scrollbar-thumb{background:var(--slate-200);border-radius:4px}.staff-list::-webkit-scrollbar-thumb:hover{background:var(--slate-300)}.staff-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-sm);margin-bottom:0!important}.staff-card:hover{border-color:var(--slate-300);transform:translateY(-2px);box-shadow:var(--shadow-md)}.staff-card-selected{background:#fff;border:2px solid var(--color-primary);border-radius:var(--border-radius-lg);padding:.9rem 1.25rem;cursor:pointer;transition:var(--transition-bounce);position:relative;box-shadow:var(--shadow-xl);transform:translateY(-1px);margin-bottom:0!important}.staff-avatar{width:48px;height:48px;background:var(--color-accent-gradient);font-size:.95rem;font-weight:700;color:#fff!important;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;box-shadow:0 4px 10px #2308601a;letter-spacing:.5px;transition:var(--transition-smooth)}.staff-card-selected .staff-avatar{transform:scale(1.05)}.staff-name{font-size:1.05rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:.2rem;letter-spacing:-.015em}.staff-specialty{font-size:.8rem;color:var(--slate-500)!important;font-weight:600;margin-bottom:0;text-transform:uppercase;letter-spacing:.05em}.selection-indicator{display:flex;align-items:center;justify-content:center;margin-left:auto;padding-left:1rem}.checkmark-circle-mini{width:24px;height:24px;border:2px solid var(--slate-300);border-radius:50%;background-color:#fff;transition:var(--transition-bounce);color:#fff!important}.checkmark-circle-mini.selected{background:var(--color-accent-gradient);border-color:transparent;box-shadow:0 3px 8px #23086040}.checkmark-circle-mini mat-icon{font-size:14px!important;width:14px!important;height:14px!important;color:#fff!important;font-weight:800!important;display:flex;align-items:center;justify-content:center}.main_container{display:flex;gap:2rem;margin-bottom:2rem}.section-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm);height:100%}.section-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:10px!important;letter-spacing:-.01em}.date-picker-container{border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:.6rem 1rem;display:flex;align-items:center;justify-content:space-between;transition:var(--transition-smooth);background-color:var(--slate-50);cursor:pointer}.date-picker-container:hover{border-color:var(--slate-400);background-color:#fff}.date-input{font-size:.95rem;font-weight:600;color:var(--slate-800)!important;background:transparent;border:none;outline:none;cursor:pointer;width:100%}.date-picker-container mat-icon{color:var(--color-primary)!important;font-size:20px!important;width:20px!important;height:20px!important}.datepicker-popover{position:absolute;z-index:1000;margin-top:4px;border-radius:var(--border-radius-lg);overflow:hidden;box-shadow:var(--shadow-xl);background:#fff;border:1px solid var(--slate-200);width:320px}::ng-deep .datepicker-calendar{border-radius:var(--border-radius-lg)!important;width:100%!important}::ng-deep .mat-calendar-header{background:var(--color-accent-gradient)!important;color:#fff!important;padding:.5rem!important}::ng-deep .mat-calendar-content{padding:8px!important}::ng-deep .mat-calendar-controls{margin:0!important}::ng-deep .mat-calendar-period-button{color:#fff!important;font-weight:700!important;font-size:1rem!important}::ng-deep .mat-calendar-arrow{fill:#fff!important}::ng-deep .mat-calendar-previous-button,::ng-deep .mat-calendar-next-button{color:#fff!important}::ng-deep .mat-calendar-body-cell{font-size:13px!important}::ng-deep .mat-calendar-body-cell-content{font-weight:600!important;color:var(--slate-800)!important;border-radius:8px!important}::ng-deep .mat-calendar-body-selected{background:var(--color-accent-gradient)!important;color:#fff!important;box-shadow:0 4px 10px #23086033!important}::ng-deep .mat-calendar-body-today:not(.mat-calendar-body-selected){border:2px solid var(--color-primary)!important;color:var(--color-primary)!important}.time_selection{max-height:420px;display:flex;flex-direction:column}.time_selection .row{flex-grow:1;overflow-y:auto;padding-right:.25rem;margin-top:10px}.time-slot{background:#fff;border:1px solid var(--slate-200);font-size:.9rem;font-weight:600;color:var(--slate-800)!important;padding:.75rem .5rem;border-radius:var(--border-radius-md);cursor:pointer;transition:var(--transition-smooth);text-align:center;box-shadow:var(--shadow-sm)}.time-slot:hover{border-color:var(--slate-400);transform:translateY(-2px);box-shadow:var(--shadow-md);background-color:var(--slate-50)}.time-slot.selected{background:var(--color-accent-gradient);border-color:transparent;color:#fff!important;box-shadow:0 4px 12px #23086033}.form-section{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.75rem;box-shadow:var(--shadow-sm)}.form-label{font-size:.85rem;font-weight:600;color:var(--slate-700)!important;margin-bottom:.5rem;text-transform:uppercase;letter-spacing:.05em}.required-asterisk{color:var(--color-error);margin-left:2px}.form-control,.form-input,.form-textarea{width:100%;background-color:var(--slate-50);border:1px solid var(--slate-200);color:var(--slate-900)!important;font-size:.95rem;font-weight:500;padding:.75rem 1rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);outline:none}.form-control:focus,.form-input:focus,.form-textarea:focus{background-color:#fff;border-color:var(--color-primary);box-shadow:0 0 0 3px #2308601a}.form-textarea{min-height:100px;resize:vertical}.policies-container{background-color:#fff;border:1px solid var(--slate-200);padding:1.75rem;border-radius:var(--border-radius-lg);margin-top:1.5rem;box-shadow:var(--shadow-sm)}.policies-title{font-size:1.1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1.25rem}.policy-item{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1rem 1.25rem;cursor:pointer;transition:var(--transition-smooth);display:flex;justify-content:space-between;align-items:center}.policy-item:hover{background-color:var(--slate-100);border-color:var(--slate-300)}.policy-title{font-size:.95rem;font-weight:600;color:var(--slate-800)!important}.policy-arrow mat-icon{color:var(--slate-500)!important;transition:var(--transition-smooth)}.cancellation_policies{background-color:var(--slate-50);padding:1rem 1.5rem;border-left:3px solid var(--color-primary);border-radius:0 0 var(--border-radius-md) var(--border-radius-md);margin-top:-4px;margin-bottom:1rem;font-size:.9rem;color:var(--slate-600)!important;line-height:1.5}.acceptance-section{display:flex;align-items:center;gap:.75rem;margin-top:1.5rem}.custom-checkbox{width:20px;height:20px;border:2px solid var(--slate-300);border-radius:6px;cursor:pointer;transition:var(--transition-smooth);position:relative;appearance:none;background-color:#fff;outline:none}.custom-checkbox:checked{background:var(--color-accent-gradient);border-color:transparent}.custom-checkbox:checked:after{content:\"\\2713\";position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff!important;font-size:.75rem;font-weight:800}.acceptance-text{font-size:.95rem;color:var(--slate-700)!important;font-weight:500;-webkit-user-select:none;user-select:none;line-height:1.4}.booking-summary-card{background-color:#fff;border:1px solid var(--slate-200);padding:2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);position:relative}.booking-summary-card:after{content:\"\";position:absolute;bottom:-1px;left:0;right:0;height:10px;background-image:radial-gradient(circle,white 4px,transparent 5px);background-size:12px 12px;background-position:0 0;z-index:2}.summary-title{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important;border-bottom:2px dashed var(--slate-200);padding-bottom:1rem;margin-bottom:1.5rem;text-align:center}.summary-row{display:flex;justify-content:space-between;align-items:center;padding:.85rem 0;border-bottom:1px solid var(--slate-100)}.summary-label{font-size:.95rem;color:var(--slate-500)!important;font-weight:500}.summary-value{font-size:.95rem;color:var(--slate-900)!important;font-weight:600;text-align:right}.total-row{margin-top:1rem;padding-top:1.25rem;border-top:2px dashed var(--slate-200);border-bottom:none}.total-row .summary-label{font-size:1.25rem;font-weight:700;color:var(--slate-900)!important}.total-row .summary-value{font-size:1.5rem;font-weight:800;color:var(--color-primary)!important}.booking-confirmation{background:#fff;border:1px solid var(--slate-200);padding:3rem 2rem;border-radius:var(--border-radius-lg);box-shadow:var(--shadow-lg);display:flex;flex-direction:column;align-items:center;text-align:center;max-width:500px;margin:0 auto}.success-icon{margin-bottom:1.5rem}.checkmark-circle{width:96px;height:96px;display:flex;align-items:center;justify-content:center}.confirmation-title{font-size:1.5rem;font-weight:800;color:var(--slate-900)!important;margin-bottom:.5rem}.confirmation-message{font-size:1rem;color:var(--slate-500)!important;line-height:1.6;margin-bottom:2rem;font-weight:450}.details-card{background-color:var(--slate-50);border:1px solid var(--slate-200);border-radius:var(--border-radius-md);padding:1.5rem;width:100%;margin-bottom:2rem;text-align:left}.details-title{font-size:1rem;font-weight:700;color:var(--slate-900)!important;margin-bottom:1rem;text-transform:uppercase;letter-spacing:.05em}.details-row{display:flex;justify-content:space-between;padding:.5rem 0;border-bottom:1px dashed var(--slate-200)}.details-row:last-child{border-bottom:none}.detail-label{font-size:.85rem;color:var(--slate-500)!important;font-weight:500}.detail-value{font-size:.9rem;color:var(--slate-900)!important;font-weight:600}.main_footer{border-top:1px solid var(--slate-200);background-color:#fff;padding:15px;flex-shrink:0;display:flex;justify-content:center;box-shadow:0 -4px 12px #00000005}.footer-buttons{width:100%;max-width:800px;display:flex;align-items:center}.back-footer-btn{font-size:.95rem;font-weight:600;color:var(--slate-600)!important;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);transition:var(--transition-smooth);cursor:pointer}.back-footer-btn:hover{color:var(--slate-900)!important;background-color:var(--slate-100)}.continue-btn{background:var(--color-accent-gradient);color:#fff!important;border:none;padding:.75rem 2rem;border-radius:var(--border-radius-md);font-size:.95rem!important;font-weight:600;cursor:pointer;transition:var(--transition-smooth);box-shadow:0 4px 10px #23086033;width:max-content!important}.continue-btn:hover:not(:disabled){transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.continue-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed!important;box-shadow:none!important}.complete_booking,.pay-now-btn{background:var(--color-accent-gradient)!important;color:#fff!important;border:none;padding:.75rem 2.25rem!important;font-size:.95rem!important;font-weight:600;border-radius:var(--border-radius-md)!important;box-shadow:0 4px 12px #23086040;transition:var(--transition-smooth);cursor:pointer;display:flex;align-items:center;gap:.5rem;width:max-content!important}.complete_booking img,.pay-now-btn img{width:20px;height:20px;filter:brightness(0) invert(1)}.complete_booking:hover:not([disabled]),.pay-now-btn:hover:not([disabled]){transform:translateY(-2px);box-shadow:0 6px 18px #23086059}.complete_booking:disabled,.pay-now-btn:disabled{background:var(--slate-200)!important;color:var(--slate-400)!important;cursor:not-allowed;box-shadow:none}.service-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(360px,1fr));gap:1.5rem;padding:0;width:100%}.skeleton-card{background:#fff;border:1px solid var(--slate-200);border-radius:var(--border-radius-lg);padding:1.5rem;height:180px;display:flex;flex-direction:column;justify-content:space-between}.skeleton{background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border-radius:4px}@keyframes loading-shimmer{0%{background-position:200% 0}to{background-position:-200% 0}}.skeleton-icon{width:48px;height:48px;border-radius:var(--border-radius-md)}.skeleton-title{height:20px;width:60%;margin-bottom:.5rem}.skeleton-price{height:20px;width:30%}.skeleton-duration{height:12px;width:25%;margin-top:.25rem}.skeleton-description{height:14px;width:85%}.skeleton-badge{height:28px;width:120px;border-radius:20px}.time-slot-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:.75rem;width:100%}.skeleton-time-slot{height:42px;border-radius:var(--border-radius-md);background:linear-gradient(90deg,#f1f5f9 25%,#e2e8f0,#f1f5f9 75%);background-size:200% 100%;animation:loading-shimmer 1.5s infinite linear;border:1px solid var(--slate-100)}@media screen and (max-width: 475px){.main_header{padding:1rem}.header-title h1{font-size:1.25rem}.back-btn{padding:.5rem .8rem}.back-btn span{display:none}.main_body{padding:15px}.services-grid{grid-template-columns:1fr;gap:1rem}.staff-list{grid-template-columns:1fr!important;gap:.85rem!important}.service-card,.service-card-selected{min-height:auto}.main_container{flex-direction:column;gap:1.5rem}.datepicker-popover{width:100%;left:0}.details_container{gap:1.5rem}.details_container>.d-flex{flex-direction:column;gap:1.5rem}.details_container>.d-flex>div{width:100%!important}.booking-summary-card{padding:1.25rem}.summary-title{font-size:1.15rem}.total-row .summary-label{font-size:1.1rem}.total-row .summary-value{font-size:1.3rem}.main_footer{padding:1rem}.continue-btn{padding:.75rem 1.5rem}}.shipping-info{border-radius:10px;padding:20px;margin-bottom:12px;border:1px solid var(--slate-200);box-shadow:var(--shadow-sm)}.address-info{margin-bottom:0}.address-name{font-weight:700;margin-bottom:8px;color:var(--slate-900)!important}.address-details{color:var(--slate-500)!important;margin-bottom:8px}.mobile-number{font-weight:700;color:var(--slate-900)!important;font-size:15px}.change-address-btn{font-size:.85rem!important;font-weight:700!important;padding:10px;background:#fff;border:1px solid var(--slate-200);border-radius:8px;color:var(--slate-900)!important;cursor:pointer;transition:var(--transition-smooth)}.change-address-btn:hover{border-color:var(--color-primary);color:var(--color-primary)!important}.addLinks{padding:14px;border:1px dashed var(--slate-300);display:flex;align-items:center;justify-content:center;cursor:pointer;border-radius:8px;color:var(--slate-500)!important;margin-bottom:12px}.addLinks:hover{border-color:var(--color-primary);color:var(--color-primary)!important}h1{font-size:24px!important;font-weight:600!important}.done-actions{display:flex;gap:12px;width:100%}.done-btn{flex:1;max-width:220px;padding:.75rem 1.5rem;border-radius:var(--border-radius-md);font-size:.95rem;font-weight:600;cursor:pointer;transition:var(--transition-smooth);border:none}.done-btn-primary{background:var(--color-accent-gradient);color:#fff!important;box-shadow:0 4px 10px #23086033}.done-btn-primary:hover{transform:translateY(-2px);box-shadow:0 6px 15px #2308604d}.done-btn-secondary{background:#fff;color:var(--slate-600)!important;border:1px solid var(--slate-200)}.done-btn-secondary:hover{background-color:var(--slate-100);color:var(--slate-900)!important}\n"] }]
|
|
719
719
|
}], ctorParameters: () => [{ type: i1.RestService }, { type: i2.EventsService }, { type: i3.Router }, { type: i4.MessageService }, { type: i5.BookingProductCartService }, { type: i6.StorageServiceService }, { type: i7.MatDialog }, { type: i7.MatDialogRef, decorators: [{
|
|
720
720
|
type: Optional
|
|
721
721
|
}] }], propDecorators: { data: [{
|
|
@@ -741,4 +741,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
|
|
|
741
741
|
type: HostListener,
|
|
742
742
|
args: ['document:click']
|
|
743
743
|
}] } });
|
|
744
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZWN0aW9ucy9hcHBvaW50bWVudC1mb3JtL2FwcG9pbnRtZW50LWJvb2tpbmcvYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFhLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUlwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLG9CQUFvQixF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RSxrQkFBa0IsOEJBQUUsbUJBQW1CLDBiQUFFLFdBQVcsMnBDQUFFLG1CQUFtQiw4QkFBRSxjQUFjLDhCQUFFLGVBQWUsK0JBQUUsb0JBQW9CLCtEQUFFLG9CQUFvQiw4REFBRSxXQUFXLHlXQUFFLGNBQWMsZ0ZBQUUsc0JBQXNCLHlKQUFFLG1CQUFtQjs7NEZBSzFRLDJCQUEyQjtrQkFSdkMsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixDQUFDLGFBQzNRLENBQUMsY0FBYyxDQUFDOzswQkFheEIsUUFBUTt5Q0FJRixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQThITixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBSzFDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyBDZGtEcmFnUGxhY2Vob2xkZXIgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL2RyYWctZHJvcFwiO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XG5pbXBvcnQgeyBGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7IE1hdEZvcm1GaWVsZE1vZHVsZSB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkXCI7XG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcbmltcG9ydCB7IE1hdE5hdGl2ZURhdGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jb3JlJztcbmltcG9ydCB7IE1hdERpYWxvZywgTWF0RGlhbG9nTW9kdWxlLCBNYXREaWFsb2dSZWYgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRXZlbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2V2ZW50cy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IEJhbm5lckNvbnRlbnRNb2RlbCwgQmFubmVyU2VjdGlvbk1vZGVsIH0gZnJvbSAnLi4vLi4vYXBwb2ludG1lbnQtZm9ybS5tb2RlbCc7XG5pbXBvcnQgeyBCYWNrZ3JvdW5kTW9kZWwsIEJhbm5lclN0eWxlc01vZGVsIH0gZnJvbSAnLi4vLi4vLi4vLi4vc3R5bGVzL3N0eWxlLm1vZGVsJztcbmltcG9ydCB7IExldHRlcnNPbmx5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlL2xldHRlcnMtb25seS5kaXJlY3RpdmUnO1xuaW1wb3J0IHsgTnVtYmVyc09ubHlEaXJlY3RpdmUgfSBmcm9tICcuLi8uLi8uLi8uLi9kaXJlY3RpdmUvbnVtYmVycy1vbmx5LmRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBUb2FzdE1vZHVsZSB9IGZyb20gXCJwcmltZW5nL3RvYXN0XCI7XG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcbmltcG9ydCB7IEJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UsIEJvb2tpbmdDYXJ0TW9kZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2Jvb2tpbmctcHJvZHVjdC1jYXJ0LnNlcnZpY2UnO1xuaW1wb3J0IHsgU3RvcmFnZVNlcnZpY2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvc3RvcmFnZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFkZHJlc3NDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lY29tbWVyY2Uvc2VjdGlvbnMvYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBZGRyZXNzTGlzdENvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2VsZW1lbnRzL2FkZHJlc3MtbGlzdC9hZGRyZXNzLWxpc3QuY29tcG9uZW50JztcbmltcG9ydCB7IEFkZHJlc3NEZXRhaWxzLCBVc2VyIH0gZnJvbSAnLi4vLi4vLi4vLi4vZWNvbW1lcmNlL3N0eWxlcy91c2VyLm1vZGFsJztcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi8uLi8uLi9CYXNlU2VjdGlvbic7XG5pbXBvcnQgeyBIb3ZlckRpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RpcmVjdGl2ZS9ob3Zlci1lbGVtZW50LWRpcmVjdGl2ZSc7XG5pbXBvcnQgeyBIb3ZlckVsZW1lbnRzQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vY29tcG9uZW50cy9ob3Zlci1lbGVtZW50cy9ob3Zlci1lbGVtZW50cy5jb21wb25lbnQnO1xuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XG5cbnR5cGUgQm9va2luZ01vZGUgPSAnU1RPUkVfVklTSVQnIHwgJ0hPTUVfVklTSVQnIHwgJ1ZJREVPX0NBTEwnO1xuXG5pbnRlcmZhY2UgUmVzb2x2ZWRMaW5lIHtcbiAgc2VydmljZXM6IHsgaWQ6IHN0cmluZywgbmFtZTogc3RyaW5nIH1bXTtcbiAgdG90YWxEdXJhdGlvbk1pbnV0ZXM6IG51bWJlcjtcbiAgc3RhZmZJZD86IHN0cmluZztcbiAgc3RhZmZOYW1lPzogc3RyaW5nO1xuICBjYW5kaWRhdGVTdGFmZlBvb2w/OiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9W107XG4gIHNlbGVjdGVkU3RhZmZJZD86IHN0cmluZztcbiAgc2VsZWN0ZWRTdGFmZk5hbWU/OiBzdHJpbmc7XG4gIHNsb3RzOiBhbnlbXTtcbiAgc2VsZWN0ZWRTbG90PzogYW55O1xuICBzbG90c0xvYWRpbmc/OiBib29sZWFuO1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdzaW1wby1hcHBvaW50bWVudC1ib29raW5nJyxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW0Nka0RyYWdQbGFjZWhvbGRlciwgQ29tbW9uTW9kdWxlLCBNYXRJY29uLCBNYXRGb3JtRmllbGRNb2R1bGUsIE1hdERhdGVwaWNrZXJNb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXROYXRpdmVEYXRlTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0RGlhbG9nTW9kdWxlLCBMZXR0ZXJzT25seURpcmVjdGl2ZSwgTnVtYmVyc09ubHlEaXJlY3RpdmUsIFRvYXN0TW9kdWxlLCBIb3ZlckRpcmVjdGl2ZSwgSG92ZXJFbGVtZW50c0NvbXBvbmVudCwgQmFja2dyb3VuZERpcmVjdGl2ZV0sXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcbiAgdGVtcGxhdGVVcmw6ICcuL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBBcHBvaW50bWVudEJvb2tpbmdDb21wb25lbnQgZXh0ZW5kcyBCYXNlU2VjdGlvbiBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxuICAgIHByaXZhdGUgX2V2ZW50U2VydmljZTogRXZlbnRzU2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxuICAgIHByaXZhdGUgcmVhZG9ubHkgYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZTogQm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHJlYWRvbmx5IHN0b3JhZ2VTZXJ2aWNlOiBTdG9yYWdlU2VydmljZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcbiAgICBAT3B0aW9uYWwoKSBwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ1JlZjogTWF0RGlhbG9nUmVmPEFwcG9pbnRtZW50Qm9va2luZ0NvbXBvbmVudD5cbiAgKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuICBASW5wdXQoKSBkYXRhPzogQmFubmVyU2VjdGlvbk1vZGVsO1xuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcbiAgY29udGVudD86IEJhbm5lckNvbnRlbnRNb2RlbDtcbiAgQElucHV0KCkgZWRpdD86IGJvb2xlYW47XG4gIC8qKiBTZXQgYnkgdGhlIGFkbWluIHBhbmVsJ3MgXCJCb29rIE5ldyBBcHBvaW50bWVudFwiIHRvb2wgLSBhIHN0YWZmIG1lbWJlciBjcmVhdGluZyBhIGJvb2tpbmcgb25cbiAgICogYSBjdXN0b21lcidzIGJlaGFsZiwgbm90IGEgbGl2ZSBjdXN0b21lciBzZWxmLXNlcnZpY2UgZmxvdy4gU2tpcHMgdGhlIGN1c3RvbWVyLWZhY2luZ1xuICAgKiBhdmFpbGFibGVPbmxpbmUvaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlIHNlcnZpY2UgZmlsdGVycywgd2hpY2ggb25seSBtYWtlIHNlbnNlIGZvciB3aGF0IGFcbiAgICogY3VzdG9tZXIgY2FuIHNlbGYtc2VydmUgYm9vayBvbiB0aGUgbGl2ZSB3ZWJzaXRlLiAqL1xuICBASW5wdXQoKSBpc0FkbWluQm9va2luZz86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGRlbGV0ZT86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xuICBASW5wdXQoKSBuZXh0Q29tcG9uZW50Q29sb3I/OiBCYWNrZ3JvdW5kTW9kZWw7XG4gIC8qKiBMZXRzIGEgbGF1bmNoaW5nIGRpYWxvZyAoZS5nLiB0aGUgdmlkZW8tY2FsbCBwcm9kdWN0IHBpY2tlcikgY2Fycnkgb3ZlciBuYW1lL3Bob25lIGFscmVhZHkgY29sbGVjdGVkLCBzbyB0aGUgY3VzdG9tZXIgaXNuJ3QgYXNrZWQgdHdpY2UuICovXG4gIEBJbnB1dCgpIHByZWZpbGxDb250YWN0PzogeyBuYW1lPzogc3RyaW5nLCBwaG9uZU51bWJlcj86IHN0cmluZyB9O1xuICBzdHlsZXM/OiBCYW5uZXJTdHlsZXNNb2RlbDtcblxuICAvKiogRWRpdG9yLWNvbmZpZ3VyYWJsZSBiYWNrZ3JvdW5kIC0gZmFsbHMgYmFjayB0byB1bmRlZmluZWQgKGxldHRpbmcgdGhlIGNvbXBvbmVudCdzIG93biBDU1NcbiAgICogZGVmYXVsdHMgc2hvdyB0aHJvdWdoIHVuY2hhbmdlZCkgZm9yIGV4aXN0aW5nIHBhZ2VzIHNhdmVkIGJlZm9yZSB0aGlzIHNlY3Rpb24gc3VwcG9ydGVkXG4gICAqIGN1c3RvbSBjb2xvcnMuICovXG4gIGdldCBiYWNrZ3JvdW5kSW5mbygpOiBCYWNrZ3JvdW5kTW9kZWwgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiB0aGlzLmRhdGE/LnN0eWxlcz8uYmFja2dyb3VuZDtcbiAgfVxuICAvKiogT3ZlcnJpZGVzIHRoaXMgY29tcG9uZW50J3Mgb3duIC0tY29sb3ItYWNjZW50LWdyYWRpZW50IENTUyB2YXJpYWJsZSAoc2NvcGVkIHRvIGl0cyA6aG9zdCxcbiAgICogc2VlIGFwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LmNzcykgd2hlbiBhIGJ1c2luZXNzIGhhcyBwaWNrZWQgYSBjdXN0b20gYWNjZW50IGNvbG9yIC1cbiAgICogbnVsbCB3aGVuIHVuc2V0LCBzbyB0aGUgW3N0eWxlLi0tY29sb3ItYWNjZW50LWdyYWRpZW50XSBiaW5kaW5nIHJlbW92ZXMgdGhlIGlubGluZSBvdmVycmlkZVxuICAgKiBlbnRpcmVseSBhbmQgdGhlIENTUyBkZWZhdWx0IHNob3dzIHRocm91Z2gsIHJhdGhlciB0aGFuIGZvcmNpbmcgYW4gZW1wdHkgdmFsdWUuICovXG4gIGdldCBhY2NlbnRDb2xvcigpOiBzdHJpbmcgfCBudWxsIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhPy5zdHlsZXM/LmJhY2tncm91bmQ/LmFjY2VudENvbG9yIHx8IG51bGw7XG4gIH1cblxuICBnZXQgaG9tZVZpc2l0Q2hhcmdlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNb2RlID09PSAnSE9NRV9WSVNJVCcgPyAodGhpcy5idXNpbmVzc1NldHRpbmdzPy5ob21lVmlzaXRDaGFyZ2UgPz8gMCkgOiAwO1xuICB9XG4gIC8qKiBQcmljZSBmb3Igb25lIHJlc29sdmVkLWxpbmUgc2VydmljZSwgbG9va2VkIHVwIGZyb20gYGNhcnRTZXJ2aWNlc2AgKHRoZSBzZXJ2aWNlLWxpc3RpbmdcbiAgICogc2VsZWN0aW9uLCB3aGljaCBjYXJyaWVzIGBwcmljZURldGFpbHNgKSBzaW5jZSBgcmVzb2x2ZWRMaW5lc1tdLnNlcnZpY2VzYCBvbmx5IGNhcnJpZXMgaWQrbmFtZVxuICAgKiBiYWNrIGZyb20gdGhlIHNsb3QtcmVzb2x1dGlvbiBBUEkuICovXG4gIHNlcnZpY2VQcmljZShzZXJ2aWNlSWQ6IHN0cmluZyk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuY2FydFNlcnZpY2VzLmZpbmQoKHM6IGFueSkgPT4gcy5zZXJ2aWNlSWQgPT09IHNlcnZpY2VJZCk/LnByaWNlRGV0YWlscz8ucHJpY2UgPz8gMDtcbiAgfVxuICBsaW5lU2VydmljZVRvdGFsKGxpbmU6IFJlc29sdmVkTGluZSk6IG51bWJlciB7XG4gICAgcmV0dXJuIChsaW5lLnNlcnZpY2VzIHx8IFtdKS5yZWR1Y2UoKHN1bTogbnVtYmVyLCBzOiBhbnkpID0+IHN1bSArIHRoaXMuc2VydmljZVByaWNlKHMuaWQpLCAwKTtcbiAgfVxuICBnZXQgc2VydmljZXNTdWJ0b3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnJlc29sdmVkTGluZXMucmVkdWNlKChzdW06IG51bWJlciwgbDogUmVzb2x2ZWRMaW5lKSA9PiBzdW0gKyB0aGlzLmxpbmVTZXJ2aWNlVG90YWwobCksIDApO1xuICB9XG4gIGdldCByZXZpZXdUb3RhbCgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzU3VidG90YWwgKyB0aGlzLmhvbWVWaXNpdENoYXJnZTtcbiAgfVxuICBnZXQgYm9va2luZ1RvdGFsKCk6IG51bWJlciB7XG4gICAgcmV0dXJuICh0aGlzLmJvb2tpbmdHcm91cD8udG90YWxQYXlhYmxlID8/IDApICsgKHRoaXMuYm9va2luZ0dyb3VwPy5ob21lVmlzaXRDaGFyZ2UgPz8gMCk7XG4gIH1cbiAgZ2V0IGJvb2tpbmdQYWlkKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuYm9va2luZ0dyb3VwPy50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA/PyAwO1xuICB9XG4gIGdldCBib29raW5nRHVlKCk6IG51bWJlciB7XG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuYm9va2luZ1RvdGFsIC0gdGhpcy5ib29raW5nUGFpZCk7XG4gIH1cblxuICBsb2FkQnVzaW5lc3NTZXR0aW5ncygpIHtcbiAgICBpZiAoIXRoaXMuYnVzaW5lc3NJZCkgcmV0dXJuO1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QnVzaW5lc3NBcHBvaW50bWVudFNldHRpbmdzKHRoaXMuYnVzaW5lc3NJZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5idXNpbmVzc1NldHRpbmdzID0gcmVzO1xuICAgIH0sICgpID0+IHtcbiAgICAgIC8vIE5vbi1mYXRhbCAtIHRoZSByZXZpZXcgc3RlcCBqdXN0IHdvbid0IHByZXZpZXcgYSBob21lIHZpc2l0IGNoYXJnZSBhbW91bnQuXG4gICAgfSk7XG4gIH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICAvLyBMb2dpbiBpcyByZXF1aXJlZCBiZWZvcmUgZW50ZXJpbmcgdGhlIHdpemFyZCBhdCBhbGwgKG5vdCBtaWQtZmxvdywgbGlrZSBjYXJ0J3NcbiAgICAvLyBjaGVja291dC1jb21taXQgZ2F0ZSkgLSB0aGUgd2l6YXJkJ3Mgc2VsZWN0aW9ucyBsaXZlIG9ubHkgaW4gY29tcG9uZW50IG1lbW9yeSwgc28gYVxuICAgIC8vIHJlZGlyZWN0LWFuZC1iYWNrIHBhcnR3YXkgdGhyb3VnaCB3b3VsZCBzaWxlbnRseSB3aXBlIHdoYXRldmVyIHRoZSBjdXN0b21lciBoYWQgYWxyZWFkeVxuICAgIC8vIHBpY2tlZC4gQ2hlY2tpbmcgaGVyZSwgYmVmb3JlIGFueXRoaW5nIGlzIHBpY2tlZCwgbWVhbnMgdGhlcmUncyBub3RoaW5nIHRvIGxvc2UuIFNraXBwZWRcbiAgICAvLyBpbiBidWlsZGVyIGVkaXQvcHJldmlldyBtb2RlIChgZWRpdGAgaXMgdHJ1ZSB3aGVuIGEgYnVzaW5lc3Mgb3duZXIgaXMgZWRpdGluZyB0aGVpciBzaXRlLFxuICAgIC8vIG5vdCBhIHJlYWwgY3VzdG9tZXIgc2Vzc2lvbikgLSB0aGUgc2FtZSBndWFyZCBwYXR0ZXJuIHVzZWQgZWxzZXdoZXJlIGluIHRoaXMgY29kZWJhc2VcbiAgICAvLyAoZS5nLiBBdXRoZW50aWNhdGlvblJlcXVpcmVkQ29tcG9uZW50J3Mgb3duIHN1Ym1pdCBoYW5kbGVycykuXG4gICAgaWYgKCF0aGlzLmVkaXQgJiYgIXRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XG4gICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10sIHsgcXVlcnlQYXJhbXM6IHsgcmVkaXJlY3RUbzogdGhpcy5yb3V0ZXIudXJsIH0gfSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuZ2V0U2NyZWVuU2l6ZSgpO1xuICAgIC8vIFByZWZpbGwgQ29udGFjdCBEZXRhaWxzIGZyb20gdGhlIGxvZ2dlZC1pbiBjdXN0b21lcidzIG93biBhY2NvdW50IChuYW1lL2VtYWlsL3Bob25lIHN0YXlcbiAgICAvLyBlZGl0YWJsZSwgZS5nLiBmb3IgYm9va2luZyBvbiBiZWhhbGYgb2Ygc29tZW9uZSBlbHNlKSBpbnN0ZWFkIG9mIGFsd2F5cyBzaG93aW5nIGEgYmxhbmtcbiAgICAvLyBmb3JtIC0gbWF0Y2hlcyBCb29rQXBwb2ludG1lbnRDb21wb25lbnQncyBwYXR0ZXJuLiBTa2lwcGVkIGVudGlyZWx5IGZvciBpc0FkbWluQm9va2luZzpcbiAgICAvLyBzdGFmZiBhcmVuJ3QgbG9nZ2VkIGluIGFzIHRoZSBjdXN0b21lciB0aGV5J3JlIGJvb2tpbmcgZm9yLCBzbyB0aGVyZSdzIG5vIGFjY291bnQgaGVyZSB0b1xuICAgIC8vIHJlYWQgLSBsZWF2ZSB0aGUgZm9ybSBibGFuayBmb3IgbWFudWFsIGVudHJ5LCBzYW1lIGFzIGJlZm9yZSB0aGlzIHByZWZpbGwgZXhpc3RlZC5cbiAgICBpZiAoIXRoaXMuaXNBZG1pbkJvb2tpbmcpIHtcbiAgICAgIHRoaXMudXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyO1xuICAgICAgaWYgKHRoaXMudXNlckRldGFpbHM/LmNvbnRhY3QpIHtcbiAgICAgICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZSA9IHRoaXMudXNlckRldGFpbHMuY29udGFjdC5uYW1lID8/ICcnO1xuICAgICAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlciA9IHRoaXMudXNlckRldGFpbHMuY29udGFjdC5tb2JpbGUgPz8gJyc7XG4gICAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsID0gdGhpcy51c2VyRGV0YWlscy5jb250YWN0LmVtYWlsID8/ICcnO1xuICAgICAgfVxuICAgICAgdGhpcy5yZWZyZXNoRGVmYXVsdEFkZHJlc3MoKTtcbiAgICB9XG4gICAgaWYgKHRoaXMucHJlZmlsbENvbnRhY3QpIHtcbiAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWUgPSB0aGlzLnByZWZpbGxDb250YWN0Lm5hbWUgPz8gdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZTtcbiAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLnBob25lTnVtYmVyID0gdGhpcy5wcmVmaWxsQ29udGFjdC5waG9uZU51bWJlciA/PyB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlcjtcbiAgICB9XG4gICAgLy8gUmV1c2VkIGJ5IGdvQmFjaygpIGFuZCBieSB0aGUgZG9uZS1zY3JlZW4ncyBhZG1pbi12cy13ZWJzaXRlIGJ1dHRvbiBicmFuY2ggLSB0aGUgYWRtaW5cbiAgICAvLyBwYW5lbCBsb2FkcyB0aGlzIGNvbXBvbmVudCB2aWEgVmlld0NvbnRhaW5lclJlZiAobm90IGEgcm91dGUpLCBzbyBpdCBjYW4ndCBiZSB0b2xkIGFwYXJ0XG4gICAgLy8gZnJvbSB0aGUgbGl2ZSB3ZWJzaXRlIGJ5IFVSTDsgUkVRVUVTVF9GUk9NIGlzIHRoZSBleGlzdGluZyBmbGFnIHRoZSBhZG1pbiBzaGVsbCBhbHJlYWR5XG4gICAgLy8gc2V0cyBmb3IgdGhpcyBwdXJwb3NlLlxuICAgIHRoaXMuaXNBZG1pbkNvbnRleHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJFUVVFU1RfRlJPTVwiKSA9PT0gJ0VDT01NRVJDRSc7XG4gICAgdGhpcy5yZXNldFdpemFyZCgpO1xuICAgIHRoaXMubG9hZEJ1c2luZXNzU2V0dGluZ3MoKTtcbiAgfVxuXG4gIGlzQWRtaW5Db250ZXh0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gUmVzdG9yZXMgdGhlIHdpemFyZCB0byBpdHMgc3RhcnQgc3RhdGUgLSB1c2VkIGZvciBpbml0aWFsIGxvYWQgKG5nT25Jbml0KSBhbmQgZm9yIFwiQm9va1xuICAvLyBBbm90aGVyXCIgb24gdGhlIGRvbmUgc2NyZWVuLCBzbyBhIHNlY29uZCBib29raW5nIGRvZXNuJ3QgaW5oZXJpdCB0aGUgcHJldmlvdXMgb25lJ3NcbiAgLy8gc2VydmljZXMvc2xvdC9hZGRyZXNzIHNlbGVjdGlvbnMuXG4gIHJlc2V0V2l6YXJkKCkge1xuICAgIHRoaXMuY2FydFNlcnZpY2VzID0gW107XG4gICAgdGhpcy5yZXNvbHZlZExpbmVzID0gW107XG4gICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gbnVsbDtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG51bGw7XG4gICAgdGhpcy5zZWxlY3RlZERhdGVTdHIgPSAnJztcbiAgICB0aGlzLmJvb2tpbmdHcm91cCA9IG51bGw7XG4gICAgdGhpcy5hcGlTdGF0dXMgPSBmYWxzZTtcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9ICcnO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gZmFsc2U7XG4gICAgdGhpcy5hY2Nlc3NlZFRhYnMgPSB7IHNlcnZpY2VMaXN0aW5nOiBmYWxzZSwgbG9jYXRpb25MaXN0aW5nOiBmYWxzZSwgc3RhZmZMaXN0aW5nOiBmYWxzZSB9O1xuXG4gICAgLy8gQSBidXNpbmVzcyBjYW4gcGluIHRoaXMgc2VjdGlvbiB0byBvbmUgbW9kZSB2aWEgc2F2ZWQgY29udGVudCBjb25maWcuIFRoZXJlJ3Mgbm8gZWRpdG9yXG4gICAgLy8gVUkgeWV0IHRvIHNldCB0aGlzIGZpZWxkICh0aGUgc2VjdGlvbiBjb250ZW50LWVkaXRvciBkb2Vzbid0IGhhdmUgYSBtb2RlIHBpY2tlciBidWlsdCkgLVxuICAgIC8vIHJlYWRpbmcgaXQgaGVyZSBqdXN0IGtlZXBzIHRoZSBjb21wb25lbnQgZm9yd2FyZC1jb21wYXRpYmxlIG9uY2Ugb25lIGV4aXN0cy5cbiAgICBjb25zdCBwaW5uZWRNb2RlID0gKHRoaXMuZGF0YT8uY29udGVudCBhcyBhbnkpPy5tb2RlO1xuICAgIGlmIChwaW5uZWRNb2RlID09PSAnU1RPUkVfVklTSVQnIHx8IHBpbm5lZE1vZGUgPT09ICdIT01FX1ZJU0lUJyB8fCBwaW5uZWRNb2RlID09PSAnVklERU9fQ0FMTCcpIHtcbiAgICAgIHRoaXMubW9kZVBpbm5lZCA9IHRydWU7XG4gICAgICB0aGlzLnNlbGVjdE1vZGUocGlubmVkTW9kZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbW9kZVNlbGVjdGlvbic7XG4gICAgICB0aGlzLmJhcldpZHRoID0gJzEwJztcbiAgICB9XG4gIH1cbiAgc2NyZWVuV2lkdGg6IG51bWJlciA9IDA7XG4gIEBIb3N0TGlzdGVuZXIoXCJ3aW5kb3c6IHJlc2l6ZVwiLCBbXCIkZXZlbnRcIl0pXG4gIGdldFNjcmVlblNpemUoKSB7XG4gICAgdGhpcy5zY3JlZW5XaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICB9XG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcbiAgY2xvc2VPbk91dHNpZGVDbGljaygpIHtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICB9XG4gIGFjY2Vzc2VkVGFicyA9IHtcbiAgICBzZXJ2aWNlTGlzdGluZzogZmFsc2UsXG4gICAgbG9jYXRpb25MaXN0aW5nOiBmYWxzZSxcbiAgICBzdGFmZkxpc3Rpbmc6IGZhbHNlXG4gIH1cbiAgc2tlbGV0b25Mb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgYnVzaW5lc3NOYW1lID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzTmFtZScpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzTmFtZScpIDogKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiTmFtZScpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgOiAnJyk7XG4gIGJ1c2luZXNzSWQ6IGFueSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdidXNpbmVzc0lkJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpIDogKGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiSWQnKSA/IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdiSWQnKSA6ICcnKTtcbiAgYWN0aXZlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XG4gIHNlbGVjdGVkVGFiOiBzdHJpbmcgPSAnJztcbiAgYmFyV2lkdGg6IHN0cmluZyA9ICcnO1xuICBzaG93Q2FuY2VsbGF0aW9uUG9saWN5OiBib29sZWFuID0gZmFsc2U7XG4gIHNob3dSZWR1Y2luZ1BvbGljeTogYm9vbGVhbiA9IGZhbHNlO1xuICBidXNpbmVzc1NldHRpbmdzOiBhbnkgPSBudWxsO1xuXG4gIHNlbGVjdGVkTW9kZTogQm9va2luZ01vZGUgPSAnU1RPUkVfVklTSVQnO1xuICBtb2RlUGlubmVkOiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gQ2FydCBvZiBzZXJ2aWNlcyBwaWNrZWQgaW4gc2VydmljZUxpc3RpbmcgLSBjbGlja2luZyBhIGNhcmQgdG9nZ2xlcyBtZW1iZXJzaGlwLiBUaGlzIGlzIGFcbiAgLy8gc3RyYWlnaHRmb3J3YXJkIHN1cGVyc2V0IG9mIHRoZSBvbGQgc2luZ2xlLXNlbGVjdGVkU2VydmljZSBiZWhhdmlvcjogd2l0aCBleGFjdGx5IG9uZVxuICAvLyBzZXJ2aWNlIGNsaWNrZWQgaXQncyB0aGUgZXhhY3Qgc2FtZSAyLWNsaWNrIChzZWxlY3QsIGNvbnRpbnVlKSBmbG93IGFzIGJlZm9yZS5cbiAgY2FydFNlcnZpY2VzOiBhbnlbXSA9IFtdO1xuICByZXNvbHZlZExpbmVzOiBSZXNvbHZlZExpbmVbXSA9IFtdO1xuICByZXNvbHZpbmdDYXJ0OiBib29sZWFuID0gZmFsc2U7XG5cbiAgLy8gUHJvZHVjdHMgYWRkZWQgdG8gdGhlIGNhcnQgYmVmb3JlIGVudGVyaW5nIHRoZSB3aXphcmQgKGUuZy4gXCJUcnkgYXQgSG9tZVwiIG9uIGEgcHJvZHVjdFxuICAvLyBwYWdlKSAtIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBib29raW5nLXByb2R1Y3QtY2FydCBvbmNlIHRoZSBtb2RlIGlzIGtub3duLlxuICBwcm9kdWN0Q2FydEl0ZW1zOiBhbnlbXSA9IFtdO1xuXG4gIHNlbGVjdGVkTG9jYXRpb246IGFueTtcbiAgLy8gVGhlIGxvZ2dlZC1pbiBjdXN0b21lcidzIHJlYWwgYWNjb3VudCAtIHNhbWUgc291cmNlIEFkZHJlc3NDb21wb25lbnQvQWRkcmVzc0xpc3RDb21wb25lbnRcbiAgLy8gdXNlZCBhdCBwcm9kdWN0LXB1cmNoYXNlIGNoZWNrb3V0IGFuZCBpbiBCb29rQXBwb2ludG1lbnRDb21wb25lbnQsIGluc3RlYWQgb2YgYSB0eXBlZC1pblxuICAvLyBhZGRyZXNzIGZvcm0uIE5vdCB1c2VkIGZvciBpc0FkbWluQm9va2luZywgd2hpY2ggaGFzIG5vIGxvZ2dlZC1pbiBjdXN0b21lciBhY2NvdW50IHRvIHJlYWQgLVxuICAvLyBzZWUgaG9tZVZpc2l0QWRkcmVzcyBiZWxvdyBmb3IgdGhhdCBjYXNlLlxuICB1c2VyRGV0YWlsczogVXNlciB8IG51bGwgPSBudWxsO1xuICBkZWZhdWx0QWRkcmVzczogQWRkcmVzc0RldGFpbHMgfCBudWxsID0gbnVsbDtcbiAgLy8gTWFudWFsIGVudHJ5LCB1c2VkIG9ubHkgZm9yIGlzQWRtaW5Cb29raW5nIC0gc3RhZmYgdHlwaW5nIGFuIGFkZHJlc3Mgb24gdGhlIGN1c3RvbWVyJ3NcbiAgLy8gYmVoYWxmLCB3aXRoIG5vIGFjY291bnQvc2F2ZWQtYWRkcmVzcy1ib29rIHRvIHNlbGVjdCBmcm9tLlxuICBob21lVmlzaXRBZGRyZXNzOiBhbnkgPSB7IHJlY2VpdmVyTmFtZTogJycsIHJlY2VpdmVyUGhvbmU6ICcnLCBhZGRyZXNzTGluZTE6ICcnLCBhZGRyZXNzTGluZTI6ICcnLCBjaXR5OiAnJywgc3RhdGU6ICcnLCB6aXBDb2RlOiAnJyB9O1xuICBpbnN0cnVjdGlvbnM6IHN0cmluZyA9ICcnO1xuICBPYmplY3QgPSBPYmplY3Q7XG4gIHNob3dDYWxlbmRhciA9IGZhbHNlO1xuICBzZWxlY3RlZERhdGU6IERhdGUgfCBudWxsID0gbnVsbDtcbiAgc2VsZWN0ZWREYXRlU3RyID0gJyc7XG5cbiAgYm9va2luZ0dyb3VwOiBhbnkgPSBudWxsO1xuXG4gIGRhdGVGaWx0ZXIgPSAoZDogRGF0ZSB8IG51bGwpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCBkYXRlID0gKGQgfHwgbmV3IERhdGUoKSk7XG4gICAgY29uc3QgdG9kYXkgPSBuZXcgRGF0ZSgpO1xuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xuICAgIHJldHVybiBkYXRlLmdldFRpbWUoKSA+PSB0b2RheS5nZXRUaW1lKCk7XG4gIH1cbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ/OiBFdmVudCkge1xuICAgIGlmIChldmVudCkgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSAhdGhpcy5zaG93Q2FsZW5kYXI7XG4gIH1cblxuICBvbkRhdGVTZWxlY3RlZChkYXRlOiBhbnkpIHtcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IGZhbHNlO1xuICAgIHRoaXMuc2VsZWN0ZWREYXRlID0gZGF0ZTtcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZVN0ciA9IHRoaXMuZm9ybWF0RGF0ZShkYXRlKTtcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xuICAgIHRoaXMucmVzb2x2ZUNhcnQoKTtcbiAgfVxuICBwcml2YXRlIGZvcm1hdERhdGUoZDogRGF0ZSk6IHN0cmluZyB7XG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZC5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgY29uc3QgbW0gPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcbiAgICBjb25zdCB5eXl5ID0gZC5nZXRGdWxsWWVhcigpO1xuICAgIHJldHVybiBgJHtkZH0tJHttbX0tJHt5eXl5fWA7XG4gIH1cbiAgcHJpdmF0ZSB0b0lzb0RhdGUoZDogRGF0ZSB8IG51bGwpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRhdGUgPSBkID8/IG5ldyBEYXRlKCk7XG4gICAgY29uc3QgeXl5eSA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcbiAgICBjb25zdCBtbSA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IGRkID0gU3RyaW5nKGRhdGUuZ2V0RGF0ZSgpKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIHJldHVybiBgJHt5eXl5fS0ke21tfS0ke2RkfVQwMDowMDowMC4wMDBaYDtcbiAgfVxuXG4gIHNlbGVjdE1vZGUobW9kZTogQm9va2luZ01vZGUpIHtcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IG1vZGU7XG4gICAgdGhpcy5sb2FkUHJvZHVjdENhcnRGb3JNb2RlKCk7XG4gICAgdGhpcy5nZXRBbGxTZXJ2aWNlcygpO1xuICB9XG5cbiAgYXN5bmMgbG9hZFByb2R1Y3RDYXJ0Rm9yTW9kZSgpIHtcbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcpIHtcbiAgICAgIHRoaXMucHJvZHVjdENhcnRJdGVtcyA9IFtdO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMgPSBhd2FpdCB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UuZ2V0SXRlbXModGhpcy5zZWxlY3RlZE1vZGUgYXMgQm9va2luZ0NhcnRNb2RlKTtcbiAgfVxuXG4gIHNlbGVjdFNlcnZpY2Uoc2VydmljZTogYW55KSB7XG4gICAgY29uc3QgaWR4ID0gdGhpcy5jYXJ0U2VydmljZXMuZmluZEluZGV4KChzOiBhbnkpID0+IHMuc2VydmljZUlkID09PSBzZXJ2aWNlLnNlcnZpY2VJZCk7XG4gICAgaWYgKGlkeCA+PSAwKSB7XG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlcy5zcGxpY2UoaWR4LCAxKTtcbiAgICAgIHNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jYXJ0U2VydmljZXMucHVzaChzZXJ2aWNlKTtcbiAgICAgIHNlcnZpY2Uuc2VsZWN0ZWQgPSB0cnVlO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMuY2FydFNlcnZpY2VzLmxlbmd0aCA+IDAgfHwgdGhpcy5wcm9kdWN0Q2FydEl0ZW1zLmxlbmd0aCA+IDA7XG4gIH1cbiAgc2VsZWN0TG9jYXRpb24obG9jYXRpb246IGFueSkge1xuICAgIGxvY2F0aW9uLnNlbGVjdGVkID0gdHJ1ZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZExvY2F0aW9uICYmIGxvY2F0aW9uLmlkICE9IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbi5pZCkge1xuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uLnNlbGVjdGVkID0gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgfVxuXG4gIG5leHRTdGVwKCkge1xuICAgIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnc2VydmljZUxpc3RpbmcnKSB7XG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zZXJ2aWNlTGlzdGluZyA9IHRydWU7XG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcpIHtcbiAgICAgICAgdGhpcy5nZXRBbGxMb2NhdGlvbnMoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZ29Ub0RhdGVTZWxlY3Rpb24oKTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZycpIHtcbiAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IHRydWU7XG4gICAgICB0aGlzLmdvVG9EYXRlU2VsZWN0aW9uKCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnKSB7XG4gICAgICB0aGlzLmFjY2Vzc2VkVGFicy5zdGFmZkxpc3RpbmcgPSB0cnVlO1xuICAgICAgdGhpcy5mZXRjaEFsbExpbmVTbG90cygpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbicpIHtcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcygpO1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdjb250YWN0RGV0YWlscyc7XG4gICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3J1xuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnY29udGFjdERldGFpbHMnKSB7XG4gICAgICB0aGlzLmNoZWNrUmVxdWlyZWRWYWx1ZXMoKTtcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAncGF5bWVudFRhYic7XG4gICAgICB0aGlzLmJhcldpZHRoID0gJzg1LjU3J1xuICAgIH1cbiAgfVxuICBwcmV2aW91c1N0ZXAoKSB7XG4gICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ21vZGVTZWxlY3Rpb24nKSByZXR1cm47XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZycpIHtcbiAgICAgIGlmICghdGhpcy5tb2RlUGlubmVkKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbW9kZVNlbGVjdGlvbic7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTAnO1xuICAgICAgfVxuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdsb2NhdGlvbkxpc3RpbmcnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3NlcnZpY2VMaXN0aW5nJztcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gbnVsbDtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3N0YWZmTGlzdGluZycpIHtcbiAgICAgIHRoaXMucmVzb2x2ZWRMaW5lcy5mb3JFYWNoKChsOiBSZXNvbHZlZExpbmUpID0+IHsgbC5zZWxlY3RlZFN0YWZmSWQgPSB1bmRlZmluZWQ7IGwuc2VsZWN0ZWRTdGFmZk5hbWUgPSB1bmRlZmluZWQ7IH0pO1xuICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRNb2RlID09PSAnU1RPUkVfVklTSVQnICYmIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2xvY2F0aW9uTGlzdGluZyc7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMjkuMjgnO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbicpIHtcbiAgICAgIGNvbnN0IG5lZWRzU3RhZmZQaWNrID0gdGhpcy5yZXNvbHZlZExpbmVzLnNvbWUoKGw6IFJlc29sdmVkTGluZSkgPT4gISFsLmNhbmRpZGF0ZVN0YWZmUG9vbD8ubGVuZ3RoKTtcbiAgICAgIGlmIChuZWVkc1N0YWZmUGljaykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbG9jYXRpb25MaXN0aW5nJztcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnY29udGFjdERldGFpbHMnKSB7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xuICAgICAgdGhpcy5iYXJXaWR0aCA9ICc1OC41Nyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdwYXltZW50VGFiJykge1xuICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdjb250YWN0RGV0YWlscyc7XG4gICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3JztcbiAgICB9XG4gIH1cbiAgc2VydmljZURhdGE6IGFueVtdID0gW107XG4gIGdldEFsbFNlcnZpY2VzKCkge1xuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlXG4gICAgbGV0IHNlcnZpY2VQYXlsb2FkOiBhbnkgPSB7XG4gICAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIixcbiAgICAgIHBhZ2VObzogMCxcbiAgICAgIHNpemU6IDEwMFxuICAgIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbEFwcG9pbnRtZW50U2VydmljZShzZXJ2aWNlUGF5bG9hZCkuc3Vic2NyaWJlKFxuICAgICAgKHJlczogYW55KSA9PiB7XG4gICAgICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgbGV0IHNlcnZpY2VzID0gKHJlcy5jb250ZW50IHx8IFtdKS5maWx0ZXIoKHNlcnZpY2U6IGFueSkgPT4gc2VydmljZS5hY3RpdmUgPT09IHRydWUpO1xuICAgICAgICAvLyBhdmFpbGFibGVPbmxpbmUvaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlIGNvbnRyb2wgd2hhdCBhIGN1c3RvbWVyIGNhbiBzZWxmLXNlcnZlIGJvb2sgb25cbiAgICAgICAgLy8gdGhlIGxpdmUgd2Vic2l0ZSAtIHRoZXkgZG9uJ3QgYXBwbHkgd2hlbiBhIHN0YWZmIG1lbWJlciBpcyBjcmVhdGluZyBhIGJvb2tpbmcgb24gdGhlXG4gICAgICAgIC8vIGN1c3RvbWVyJ3MgYmVoYWxmIGZyb20gdGhlIGFkbWluIHBhbmVsLlxuICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbkJvb2tpbmcpIHtcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdIT01FX1ZJU0lUJykgc2VydmljZXMgPSBzZXJ2aWNlcy5maWx0ZXIoKHM6IGFueSkgPT4gcy5ob21lQXBwb2ludG1lbnRBdmFpbGFibGUpO1xuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZSA9PT0gJ1ZJREVPX0NBTEwnKSBzZXJ2aWNlcyA9IHNlcnZpY2VzLmZpbHRlcigoczogYW55KSA9PiBzLnZpZGVvQ2FsbEF2YWlsYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc2VydmljZXMuZm9yRWFjaCgoc2VydmljZTogYW55KSA9PiBzZXJ2aWNlLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgICAgICB0aGlzLnNlcnZpY2VEYXRhID0gc2VydmljZXM7XG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2VzID0gW107XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xuICAgICAgICB0aGlzLmJhcldpZHRoID0gJzE0LjI4JztcbiAgICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMDtcbiAgICAgIH0sXG4gICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cbiAgbG9jYXRpb25EYXRhOiBhbnlbXSA9IFtdO1xuICBnZXRBbGxMb2NhdGlvbnMoKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xuICAgIHRoaXMubG9jYXRpb25EYXRhID0gW107XG4gICAgbGV0IHBheWxvYWQgPSB7IGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiIH1cbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFN0b3JlcyhwYXlsb2FkKS5zdWJzY3JpYmUoXG4gICAgICAocmVzOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKHJlcy5kYXRhLmRhdGEubGVuZ3RoID4gMCkge1xuICAgICAgICAgIGxldCBsb2NhdGlvbnMgPSByZXMuZGF0YS5kYXRhLmZpbHRlcigoc3RvcmU6IGFueSkgPT4geyByZXR1cm4gc3RvcmUuc3RhdHVzID09PSAnQUNUSVZFJyB9KTtcbiAgICAgICAgICAvLyBMb2NhdGlvbi1pbnRlcnNlY3Rpb24gY2hlY2sgKGRlc2lnbiBkb2MgwqcyYyk6IG9ubHkgb2ZmZXIgc3RvcmVzIHRoYXQgY2FycnkgZXZlcnlcbiAgICAgICAgICAvLyBzZXJ2aWNlIGN1cnJlbnRseSBpbiB0aGUgY2FydCwgbm90IGp1c3QgdGhlIGZpcnN0IG9uZS5cbiAgICAgICAgICBsb2NhdGlvbnMgPSBsb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjogYW55KSA9PlxuICAgICAgICAgICAgdGhpcy5jYXJ0U2VydmljZXMuZXZlcnkoKHM6IGFueSkgPT4gcy5zdG9yZUlkcz8uaW5jbHVkZXMobG9jYXRpb24uaWQpKVxuICAgICAgICAgICk7XG4gICAgICAgICAgbG9jYXRpb25zLmZvckVhY2goKGw6IGFueSkgPT4gbC5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICAgICAgICB0aGlzLmxvY2F0aW9uRGF0YSA9IGxvY2F0aW9ucztcbiAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbkRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTm8gTG9jYXRpb24nLCBkZXRhaWw6ICdUaGVzZSBzZXJ2aWNlcyBhcmVuXFwndCBhbGwgYXZhaWxhYmxlIGF0IG9uZSBsb2NhdGlvbiAtIHJlbW92ZSBvbmUgYW5kIGJvb2sgaXQgc2VwYXJhdGVseScgfSk7XG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodGhpcy5sb2NhdGlvbkRhdGEubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSB0aGlzLmxvY2F0aW9uRGF0YVswXTtcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc2VkVGFicy5sb2NhdGlvbkxpc3RpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuZ29Ub0RhdGVTZWxlY3Rpb24oKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xuICAgICAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcyOS4yOCc7XG4gICAgICAgICAgICB0aGlzLmFjY2Vzc2VkVGFicy5sb2NhdGlvbkxpc3RpbmcgPSB0cnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTm8gTG9jYXRpb24nLCBkZXRhaWw6ICdObyBMb2NhdGlvbiBhZGRlZCBmb3Igc2VsZWN0ZWQgc2VydmljZScgfSk7XG4gICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIChlcnJvcikgPT4ge1xuICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICBnb1RvRGF0ZVNlbGVjdGlvbigpIHtcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xuICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gZmFsc2U7XG4gICAgdGhpcy5yZXNvbHZlZExpbmVzID0gW107XG4gIH1cblxuICBzdGFmZlNlYXJjaFF1ZXJ5OiBzdHJpbmcgPSAnJztcbiAgZ2V0IGZpbHRlcmVkU3RhZmYoKTogYW55W10ge1xuICAgIGlmICghdGhpcy5zdGFmZlNlYXJjaFF1ZXJ5LnRyaW0oKSkge1xuICAgICAgcmV0dXJuIHRoaXMuc3RhZmZEYXRhO1xuICAgIH1cbiAgICBjb25zdCBxdWVyeSA9IHRoaXMuc3RhZmZTZWFyY2hRdWVyeS50b0xvd2VyQ2FzZSgpLnRyaW0oKTtcbiAgICByZXR1cm4gdGhpcy5zdGFmZkRhdGEuZmlsdGVyKHN0YWZmID0+XG4gICAgICBzdGFmZj8uc3RhZmZOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxuICAgICk7XG4gIH1cbiAgc3RhZmZEYXRhOiBhbnlbXSA9IFtdO1xuXG4gIHJlc29sdmVDYXJ0KCkge1xuICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcbiAgICAgIC8vIFB1cmUgcHJvZHVjdC1vbmx5IGxpbmUgKEhvbWUgVmlzaXQgLyBWaWRlbyBDYWxsIHdpdGggbm8gc2VydmljZXMgYXR0YWNoZWQpIC0gcmVzb2x1dGlvblxuICAgICAgLy8gaXMgYnVpbHQgYXJvdW5kIHNlcnZpY2UgcG9vbHMsIHNvIHRoaXMgbmVlZHMgYW4gZXhwbGljaXQgc3RhZmYgcGljayBpbnN0ZWFkLiBPbmUgbGluZSxcbiAgICAgIC8vIG5vIHNlcnZpY2VzLCBqdXN0IGEgc3RhZmYrdGltZSB0byBjYXJyeSB0aGUgZmxhdCBwcm9kdWN0LXZpZXdpbmcgYWxsb3dhbmNlLlxuICAgICAgdGhpcy5yZXNvbHZlZExpbmVzID0gW3sgc2VydmljZXM6IFtdLCB0b3RhbER1cmF0aW9uTWludXRlczogMCwgc2xvdHM6IFtdIH1dO1xuICAgICAgdGhpcy5nZXRBbGxTdGFmZkZvclByb2R1Y3RPbmx5TGluZSgpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLnJlc29sdmluZ0NhcnQgPSB0cnVlO1xuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCxcbiAgICAgIG1vZGU6IHRoaXMuc2VsZWN0ZWRNb2RlLFxuICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgPyB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkIDogdW5kZWZpbmVkLFxuICAgICAgYm9va2luZ0RhdGU6IHRoaXMudG9Jc29EYXRlKHRoaXMuc2VsZWN0ZWREYXRlKSxcbiAgICAgIHNlcnZpY2VJdGVtczogdGhpcy5jYXJ0U2VydmljZXMubWFwKChzOiBhbnkpID0+ICh7IHNlcnZpY2VJZDogcy5zZXJ2aWNlSWQgfSkpXG4gICAgfTtcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLnJlc29sdmVDYXJ0KHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2aW5nQ2FydCA9IGZhbHNlO1xuICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xuICAgICAgdGhpcy5yZXNvbHZlZExpbmVzID0gKHJlcyB8fCBbXSkubWFwKChsaW5lOiBhbnkpID0+ICh7XG4gICAgICAgIHNlcnZpY2VzOiBsaW5lLnNlcnZpY2VzLFxuICAgICAgICB0b3RhbER1cmF0aW9uTWludXRlczogbGluZS50b3RhbER1cmF0aW9uTWludXRlcyxcbiAgICAgICAgc3RhZmZJZDogbGluZS5zdGFmZklkLFxuICAgICAgICBzdGFmZk5hbWU6IGxpbmUuc3RhZmZOYW1lLFxuICAgICAgICBjYW5kaWRhdGVTdGFmZlBvb2w6IGxpbmUuY2FuZGlkYXRlU3RhZmZQb29sLFxuICAgICAgICBzbG90czogW11cbiAgICAgIH0pKTtcbiAgICAgIGNvbnN0IG5lZWRzU3RhZmZQaWNrID0gdGhpcy5yZXNvbHZlZExpbmVzLnNvbWUoKGw6IFJlc29sdmVkTGluZSkgPT4gISFsLmNhbmRpZGF0ZVN0YWZmUG9vbD8ubGVuZ3RoKTtcbiAgICAgIGlmIChuZWVkc1N0YWZmUGljaykge1xuICAgICAgICB0aGlzLnN0YWZmU2VhcmNoUXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzdGFmZkxpc3RpbmcnO1xuICAgICAgICB0aGlzLmJhcldpZHRoID0gJzQzLjU3JztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuZmV0Y2hBbGxMaW5lU2xvdHMoKTtcbiAgICAgIH1cbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xuICAgICAgdGhpcy5yZXNvbHZpbmdDYXJ0ID0gZmFsc2U7XG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2U7XG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnVW5hYmxlIHRvIGNoZWNrIGF2YWlsYWJpbGl0eScsIGRldGFpbDogZXJyb3IuZXJyb3I/Lm1lc3NhZ2UgPz8gJ1BsZWFzZSB0cnkgYWdhaW4nIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgZ2V0QWxsU3RhZmZGb3JQcm9kdWN0T25seUxpbmUoKSB7XG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNlcnZpY2VJZDogJycsIHN0b3JlSWQ6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQgPz8gJycsIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyAnJyB9O1xuICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0QWxsU3RhZmYocGF5bG9hZCkuc3Vic2NyaWJlKChyZXM6IGFueSkgPT4ge1xuICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcbiAgICAgIHRoaXMuc3RhZmZEYXRhID0gKHJlcyB8fCBbXSkuZmlsdGVyKChzdGFmZjogYW55KSA9PlxuICAgICAgICBzdGFmZi5hY3RpdmUgPT09IHRydWUgJiYgc3RhZmYuYm9va2luZ0FsbG93ZWQgJiZcbiAgICAgICAgKHRoaXMuc2VsZWN0ZWRNb2RlID09PSAnSE9NRV9WSVNJVCcgPyBzdGFmZi5ob21lVmlzaXRDYXBhYmxlIDogc3RhZmYudmlkZW9DYWxsQ2FwYWJsZSkpO1xuICAgICAgdGhpcy5zdGFmZkRhdGEuZm9yRWFjaCgoc3RhZmY6IGFueSkgPT4gc3RhZmYuc2VsZWN0ZWQgPSBmYWxzZSk7XG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XG4gICAgICB0aGlzLmJhcldpZHRoID0gJzQzLjU3JztcbiAgICB9LCAoKSA9PiB7IHRoaXMubG9hZGVyID0gZmFsc2U7IH0pO1xuICB9XG5cbiAgc2VsZWN0U3RhZmZGb3JQcm9kdWN0T25seUxpbmUoc3RhZmY6IGFueSkge1xuICAgIHRoaXMuc3RhZmZEYXRhLmZvckVhY2goKHM6IGFueSkgPT4gcy5zZWxlY3RlZCA9IGZhbHNlKTtcbiAgICBzdGFmZi5zZWxlY3RlZCA9IHRydWU7XG4gICAgdGhpcy5yZXNvbHZlZExpbmVzWzBdLnNlbGVjdGVkU3RhZmZJZCA9IHN0YWZmLnN0YWZmSWQ7XG4gICAgdGhpcy5yZXNvbHZlZExpbmVzWzBdLnNlbGVjdGVkU3RhZmZOYW1lID0gc3RhZmYuc3RhZmZOYW1lO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgfVxuXG4gIHNlbGVjdFN0YWZmRm9yTGluZShsaW5lOiBSZXNvbHZlZExpbmUsIHN0YWZmOiBhbnkpIHtcbiAgICBsaW5lLnNlbGVjdGVkU3RhZmZJZCA9IHN0YWZmLmlkO1xuICAgIGxpbmUuc2VsZWN0ZWRTdGFmZk5hbWUgPSBzdGFmZi5uYW1lO1xuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdGhpcy5yZXNvbHZlZExpbmVzLmV2ZXJ5KChsOiBSZXNvbHZlZExpbmUpID0+ICEhKGwuc3RhZmZJZCB8fCBsLnNlbGVjdGVkU3RhZmZJZCkpO1xuICB9XG5cbiAgZmV0Y2hBbGxMaW5lU2xvdHMoKSB7XG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWU7XG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcbiAgICB0aGlzLmJhcldpZHRoID0gJzU4LjU3JztcbiAgICBsZXQgcGVuZGluZyA9IHRoaXMucmVzb2x2ZWRMaW5lcy5sZW5ndGg7XG4gICAgdGhpcy5yZXNvbHZlZExpbmVzLmZvckVhY2goKGxpbmU6IFJlc29sdmVkTGluZSkgPT4ge1xuICAgICAgY29uc3Qgc3RhZmZJZCA9IGxpbmUuc3RhZmZJZCB8fCBsaW5lLnNlbGVjdGVkU3RhZmZJZDtcbiAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcbiAgICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgPyB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkIDogdW5kZWZpbmVkLFxuICAgICAgICBzZXJ2aWNlSWRzOiBsaW5lLnNlcnZpY2VzLm1hcCgoczogYW55KSA9PiBzLmlkKSxcbiAgICAgICAgYnVzaW5lc3NJZDogdGhpcy5idXNpbmVzc0lkLFxuICAgICAgICBib29raW5nRGF0ZTogdGhpcy50b0lzb0RhdGUodGhpcy5zZWxlY3RlZERhdGUpLFxuICAgICAgICBzdGFmZklkLFxuICAgICAgICBtb2RlOiB0aGlzLnNlbGVjdGVkTW9kZVxuICAgICAgfTtcbiAgICAgIGxpbmUuc2xvdHNMb2FkaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Qm9va2luZ1Nsb3RzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgICAgbGluZS5zbG90cyA9IChyZXMgfHwgW10pLm1hcCgodjogc3RyaW5nKSA9PiAoeyBzZWxlY3RlZDogZmFsc2UsIHZhbHVlOiB2IH0pKTtcbiAgICAgICAgbGluZS5zbG90c0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgcGVuZGluZy0tO1xuICAgICAgICBpZiAocGVuZGluZyA8PSAwKSB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2U7XG4gICAgICB9LCAoKSA9PiB7XG4gICAgICAgIGxpbmUuc2xvdHNMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHBlbmRpbmctLTtcbiAgICAgICAgaWYgKHBlbmRpbmcgPD0gMCkgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBzZWxlY3RTbG90Rm9yTGluZShsaW5lOiBSZXNvbHZlZExpbmUsIHNsb3Q6IGFueSkge1xuICAgIGxpbmUuc2xvdHMuZm9yRWFjaCgoczogYW55KSA9PiBzLnNlbGVjdGVkID0gZmFsc2UpO1xuICAgIHNsb3Quc2VsZWN0ZWQgPSB0cnVlO1xuICAgIGxpbmUuc2VsZWN0ZWRTbG90ID0gc2xvdDtcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMucmVzb2x2ZWRMaW5lcy5ldmVyeSgobDogUmVzb2x2ZWRMaW5lKSA9PiAhIWwuc2VsZWN0ZWRTbG90KTtcbiAgfVxuXG5cbiAgY29udmVydFRvMjRIb3VyKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgW2hvdXJNaW4sIG1vZGlmaWVyUmF3XSA9IHRpbWUuc3BsaXQoJyAnKTtcbiAgICBjb25zdCBtb2RpZmllciA9IG1vZGlmaWVyUmF3LnRvVXBwZXJDYXNlKCk7IC8vIFwiQU1cIiBvciBcIlBNXCJcbiAgICBsZXQgW2hvdXJzLCBtaW51dGVzXSA9IGhvdXJNaW4uc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcblxuICAgIGlmIChtb2RpZmllciA9PT0gJ1BNJyAmJiBob3VycyA8IDEyKSB7XG4gICAgICBob3VycyArPSAxMjtcbiAgICB9XG4gICAgaWYgKG1vZGlmaWVyID09PSAnQU0nICYmIGhvdXJzID09PSAxMikge1xuICAgICAgaG91cnMgPSAwO1xuICAgIH1cblxuICAgIGNvbnN0IGhoID0gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xuICAgIGNvbnN0IG1tID0gbWludXRlcy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XG4gICAgcmV0dXJuIGAke2hofToke21tfSAke21vZGlmaWVyfWA7XG4gIH1cbiAgbG9hZGVyOiBib29sZWFuID0gZmFsc2U7XG4gIGlzUHJvY2Vzc2luZzogYm9vbGVhbiA9IGZhbHNlO1xuICB0ZXJtc0FuZENvbmRpdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgY2hlY2tSZXF1aXJlZFZhbHVlcygpIHtcbiAgICBjb25zdCBpc0VtYWlsVmFsaWQgPSB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5lbWFpbCAmJlxuICAgICAgL15bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kLy50ZXN0KHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsKTtcblxuICAgIGNvbnN0IGFueVBvbGljeSA9IHRoaXMuY2FydFNlcnZpY2VzLnNvbWUoKHM6IGFueSkgPT4gcz8uY2FuY2VsbGF0aW9uUG9saWN5Py5sZW5ndGggPiAwIHx8IHM/LnJlc2NoZWR1bGVQb2xpY3k/Lmxlbmd0aCA+IDApO1xuXG4gICAgY29uc3QgYWRkcmVzc09rID0gdGhpcy5zZWxlY3RlZE1vZGUgIT09ICdIT01FX1ZJU0lUJyB8fCAodGhpcy5pc0FkbWluQm9va2luZ1xuICAgICAgPyAhISh0aGlzLmhvbWVWaXNpdEFkZHJlc3MucmVjZWl2ZXJOYW1lICYmIHRoaXMuaG9tZVZpc2l0QWRkcmVzcy5hZGRyZXNzTGluZTEgJiYgdGhpcy5ob21lVmlzaXRBZGRyZXNzLmNpdHkgJiYgdGhpcy5ob21lVmlzaXRBZGRyZXNzLnppcENvZGUpXG4gICAgICA6ICEhdGhpcy5kZWZhdWx0QWRkcmVzcyk7XG5cbiAgICBpZiAodGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZSAmJlxuICAgICAgaXNFbWFpbFZhbGlkICYmXG4gICAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlci5sZW5ndGggPT09IDEwICYmXG4gICAgICBhZGRyZXNzT2spIHtcbiAgICAgIGlmIChhbnlQb2xpY3kpIHtcbiAgICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnRlcm1zQW5kQ29uZGl0aW9ucyA/IHRydWUgOiBmYWxzZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHJlZnJlc2hEZWZhdWx0QWRkcmVzcygpIHtcbiAgICBjb25zdCBsaXN0ID0gdGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0ID8/IFtdO1xuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5kZWZhdWx0QWRkcmVzcyA9IG51bGw7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGlkeCA9IGxpc3QuZmluZEluZGV4KChhOiBBZGRyZXNzRGV0YWlscykgPT4gYS5kZWZhdWx0ID09PSB0cnVlKTtcbiAgICB0aGlzLmRlZmF1bHRBZGRyZXNzID0gaWR4ICE9PSAtMSA/IGxpc3RbaWR4XSA6IGxpc3RbMF07XG4gICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsdWVzKCk7XG4gIH1cblxuICBjaGFuZ2VBZGRyZXNzKCkge1xuICAgIHRoaXMubWF0RGlhbG9nLm9wZW4oQWRkcmVzc0xpc3RDb21wb25lbnQsIHsgcGFuZWxDbGFzczogJ3NpZGVwYW5lbC1jbGFzcycsIGRhdGE6IHsgYWRkcmVzc0xpc3Q6IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdCA/PyBbXSB9IH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgIHRoaXMudXNlckRldGFpbHMgPSB0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBVc2VyO1xuICAgICAgdGhpcy5yZWZyZXNoRGVmYXVsdEFkZHJlc3MoKTtcbiAgICB9KTtcbiAgfVxuXG4gIGFkZEFkZHJlc3MoKSB7XG4gICAgdGhpcy5tYXREaWFsb2cub3BlbihBZGRyZXNzQ29tcG9uZW50LCB7IHBhbmVsQ2xhc3M6IFsnc2lkZXBhbmVsLWNsYXNzJywgJ2FkZHJlc3MtY2xhc3MnXSwgZGF0YTogeyBhZGRyZXNzTGlzdDogdGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0ID8/IFtdLCBlZGl0SW5kZXg6IC0xIH0gfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy51c2VyRGV0YWlscyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXI7XG4gICAgICB0aGlzLnJlZnJlc2hEZWZhdWx0QWRkcmVzcygpO1xuICAgIH0pO1xuICB9XG5cbiAgYXBwb2ludG1lbnRQYXlsb2FkOiBhbnkgPSB7XG4gICAgY3VzdG9tZXJEZXRhaWw6IHtcbiAgICAgIG5hbWU6ICcnLFxuICAgICAgcGhvbmVOdW1iZXI6ICcnLFxuICAgICAgZW1haWw6ICcnXG4gICAgfVxuICB9XG4gIGFwaVN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xuXG4gIGNvbmZpcm1Cb29raW5nKCkge1xuICAgIC8vIERlZmVuc2l2ZSByZS1jaGVjayAobWlycm9ycyBjYXJ0LmNvbXBvbmVudC50cydzIHByb2NlZWRUb1BheW1lbnQoKSBndWFyZCkgLSB0aGUgZW50cnlcbiAgICAvLyBjaGVjayBpbiBuZ09uSW5pdCgpIHNob3VsZCBtYWtlIHRoaXMgdW5yZWFjaGFibGUgaW4gcHJhY3RpY2UsIGJ1dCBhIGxvbmcgc2xvdC1waWNraW5nXG4gICAgLy8gc2Vzc2lvbiBjb3VsZCBzdGlsbCBsZXQgdGhlIGxvZ2luIHNlc3Npb24gZXhwaXJlIGJlZm9yZSB0aGUgY3VzdG9tZXIgcmVhY2hlcyB0aGlzIHN0ZXAuXG4gICAgaWYgKCF0aGlzLmVkaXQgJiYgIXRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zOiB7IHJlZGlyZWN0VG86IHRoaXMucm91dGVyLnVybCB9IH0pO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IHRydWU7XG4gICAgY29uc3QgbGluZXMgPSB0aGlzLnJlc29sdmVkTGluZXMubWFwKChsOiBSZXNvbHZlZExpbmUpID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSBsLnNlbGVjdGVkU2xvdDtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIHNlcnZpY2VJZHM6IGwuc2VydmljZXMubWFwKChzOiBhbnkpID0+IHMuaWQpLFxuICAgICAgICBzdGFmZklkOiBsLnN0YWZmSWQgfHwgbC5zZWxlY3RlZFN0YWZmSWQsXG4gICAgICAgIHN0YXJ0VGltZTogc2xvdCA/IHRoaXMuY29udmVydFRvMjRIb3VyKHNsb3QudmFsdWUpLnNsaWNlKDAsIDUpIDogdW5kZWZpbmVkXG4gICAgICB9O1xuICAgIH0pO1xuXG4gICAgY29uc3QgaG9sZFBheWxvYWQ6IGFueSA9IHtcbiAgICAgIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCxcbiAgICAgIG1vZGU6IHRoaXMuc2VsZWN0ZWRNb2RlLFxuICAgICAgc3RvcmVJZDogdGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgPyB0aGlzLnNlbGVjdGVkTG9jYXRpb24/LmlkIDogdW5kZWZpbmVkLFxuICAgICAgYm9va2luZ0RhdGU6IHRoaXMudG9Jc29EYXRlKHRoaXMuc2VsZWN0ZWREYXRlKSxcbiAgICAgIGN1c3RvbWVyRGV0YWlsOiB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbCxcbiAgICAgIC8vIE5ldmVyIHRydXN0IGEgc3RyYXkgXCJ1c2VyXCIgY29va2llIGZvciBhbiBhZG1pbi1jcmVhdGVkIGJvb2tpbmcgLSBzdGFmZiBhcmVuJ3QgbG9nZ2VkIGluXG4gICAgICAvLyBhcyB0aGUgY3VzdG9tZXIgdGhleSdyZSBib29raW5nIGZvciwgc28gdGhpcyBtdXN0IHJlc29sdmUgc2VydmVyLXNpZGUgZnJvbSB0aGUgdHlwZWRcbiAgICAgIC8vIHBob25lIG51bWJlciBpbnN0ZWFkIChzZWUgQ3VzdG9tZXJJZGVudGl0eVNlcnZpY2UpLCBub3Qgd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBzaXR0aW5nXG4gICAgICAvLyBpbiB0aGlzIGJyb3dzZXIncyBzdG9yYWdlIChlLmcuIGxlZnRvdmVyIGZyb20gdGVzdGluZyB0aGUgbGl2ZSBzdG9yZWZyb250KS5cbiAgICAgIHVzZXJJZDogdGhpcy5pc0FkbWluQm9va2luZyA/IHVuZGVmaW5lZCA6ICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBhbnkpPy51c2VySWQsXG4gICAgICBsaW5lcyxcbiAgICAgIHByb2R1Y3RMaW5lczogdGhpcy5wcm9kdWN0Q2FydEl0ZW1zLm1hcCgocDogYW55KSA9PiB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UudG9Qcm9kdWN0TGluZShwKSksXG4gICAgICBhZGRyZXNzRGV0YWlsczogdGhpcy5zZWxlY3RlZE1vZGUgIT09ICdIT01FX1ZJU0lUJyA/IHVuZGVmaW5lZCA6XG4gICAgICAgIHRoaXMuaXNBZG1pbkJvb2tpbmcgPyB7IC4uLnRoaXMuaG9tZVZpc2l0QWRkcmVzcywgaW5zdHJ1Y3Rpb25zOiB0aGlzLmluc3RydWN0aW9ucyB9IDpcbiAgICAgICAgdGhpcy5kZWZhdWx0QWRkcmVzcyA/IHtcbiAgICAgICAgICByZWNlaXZlck5hbWU6IHRoaXMuZGVmYXVsdEFkZHJlc3MucmVjZWl2ZXJOYW1lLFxuICAgICAgICAgIHJlY2VpdmVyUGhvbmU6IHRoaXMuZGVmYXVsdEFkZHJlc3MucmVjZWl2ZXJQaG9uZSxcbiAgICAgICAgICBhZGRyZXNzTGluZTE6IHRoaXMuZGVmYXVsdEFkZHJlc3MuYWRkcmVzc0xpbmUxLFxuICAgICAgICAgIGNpdHk6IHRoaXMuZGVmYXVsdEFkZHJlc3MuY2l0eU5hbWUsXG4gICAgICAgICAgc3RhdGU6IHRoaXMuZGVmYXVsdEFkZHJlc3Muc3RhdGVOYW1lLFxuICAgICAgICAgIHppcENvZGU6IHRoaXMuZGVmYXVsdEFkZHJlc3MuemlwQ29kZSxcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHRoaXMuaW5zdHJ1Y3Rpb25zXG4gICAgICAgIH0gOiB1bmRlZmluZWQsXG4gICAgICAvLyBTa2lwcyBvbmxpbmUgZGVwb3NpdCBjb2xsZWN0aW9uIHNlcnZlci1zaWRlIChzZWUgQm9va2luZ0dyb3VwU2VydmljZSNidWlsZEdyb3VwKSAtIGFcbiAgICAgIC8vIHN0YWZmLWNyZWF0ZWQgYm9va2luZyBjYW4ndCBjb21wbGV0ZSBhIENhc2hmcmVlIGNoZWNrb3V0IGlubGluZSB0aGUgd2F5IHRoZSBsaXZlIHNpdGVcbiAgICAgIC8vIGRvZXMsIHNvIGl0IG11c3QgbmV2ZXIgYmUgcm91dGVkIHRocm91Z2ggdGhlIHBheW1lbnQgZ2F0ZXdheTsgYW55IGJhbGFuY2UgaXMgY29sbGVjdGVkXG4gICAgICAvLyBpbiBwZXJzb24gLyByZWNvcmRlZCBsYXRlciB2aWEgdGhlIGludm9pY2UgaW5zdGVhZC5cbiAgICAgIGFkbWluQm9va2luZzogdGhpcy5pc0FkbWluQm9va2luZyB8fCB0aGlzLmlzQWRtaW5Db250ZXh0LFxuICAgIH07XG5cbiAgICBjb25zdCBpc0FkbWluID0gdGhpcy5pc0FkbWluQm9va2luZyB8fCB0aGlzLmlzQWRtaW5Db250ZXh0O1xuICAgIHRoaXMucmVzdFNlcnZpY2UuaG9sZEJvb2tpbmcoaG9sZFBheWxvYWQpLnN1YnNjcmliZSgoZ3JvdXA6IGFueSkgPT4ge1xuICAgICAgdGhpcy5ib29raW5nR3JvdXAgPSBncm91cDtcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZSAhPT0gJ1NUT1JFX1ZJU0lUJyAmJiB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICB0aGlzLmJvb2tpbmdQcm9kdWN0Q2FydFNlcnZpY2UuY2xlYXIodGhpcy5zZWxlY3RlZE1vZGUgYXMgQm9va2luZ0NhcnRNb2RlKTtcbiAgICAgIH1cbiAgICAgIGlmICghaXNBZG1pbiAmJiBncm91cC5zdGF0dXMgPT09ICdIT0xEJyAmJiBncm91cC50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDApIHtcbiAgICAgICAgLy8gTXVzdCBhY3Qgb24gdGhpcyBpbW1lZGlhdGVseSAtIHRoZSBob2xkIGV4cGlyZXMgaW4gMTAgbWludXRlcy5cbiAgICAgICAgdGhpcy5yZXN0U2VydmljZS5nZW5lcmF0ZVBheW1lbnRUb2tlbihncm91cC5ncm91cElkKS5zdWJzY3JpYmUoKG9yZGVyOiBhbnkpID0+IHtcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwb2ludG1lbnRQYXltZW50SWQnLCBvcmRlci5wZ09yZGVySWQpO1xuICAgICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICAgICAgdGhpcy5fZXZlbnRTZXJ2aWNlLmNhc2hGcmVlRXZlbnQuZW1pdCh7IGRhdGE6IHsgb3JkZXJTaWduYXR1cmU6IG9yZGVyLm9yZGVyU2lnbmF0dXJlIH0gfSk7XG4gICAgICAgIH0sIChlcnJvcjogYW55KSA9PiB7XG4gICAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnUGF5bWVudCBGYWlsZWQnLCBkZXRhaWw6IGVycm9yLmVycm9yPy5tZXNzYWdlIH0pO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAoaXNBZG1pbiAmJiBncm91cC5zdGF0dXMgPT09ICdIT0xEJykge1xuICAgICAgICAvLyBVbmV4cGVjdGVkOiB0aGUgYmFja2VuZCBzaG91bGQgaGF2ZSBhdXRvLWNvbmZpcm1lZCB0aGlzIGFkbWluIGJvb2tpbmcgd2l0aCB6ZXJvXG4gICAgICAgIC8vIGRlcG9zaXQuIFN1cmZhY2UgYW4gZXJyb3IgcmF0aGVyIHRoYW4gc2lsZW50bHkgc2hvd2luZyBzdWNjZXNzIGZvciBhIGJvb2tpbmcgdGhhdCdzXG4gICAgICAgIC8vIHN0aWxsIGV4cGlyaW5nIHVuY29uZmlybWVkLlxuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQm9va2luZyBGYWlsZWQnLCBkZXRhaWw6ICdUaGlzIGJvb2tpbmcgcmVxdWlyZXMgYSBkZXBvc2l0IGFuZCBjb3VsZCBub3QgYmUgYXV0by1jb25maXJtZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0LicgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwaVN0YXR1cyA9IHRydWU7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc3RhdHVzVGVtcGxhdGUnO1xuICAgICAgICB0aGlzLmJhcldpZHRoID0gJzEwMCc7XG4gICAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSwgKGVycm9yOiBhbnkpID0+IHtcbiAgICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLmFwaVN0YXR1cyA9IGZhbHNlO1xuICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ0Jvb2tpbmcgRmFpbGVkJywgZGV0YWlsOiBlcnJvci5lcnJvcj8ubWVzc2FnZSB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIGdvQmFjaygpIHtcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSRVFVRVNUX0ZST01cIikgPT09ICdFQ09NTUVSQ0UnKSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJy9hZG1pbi9hcHBvaW50bWVudHMvbGlzdC1hcHBvaW50bWVudHMnXSlcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJyddKVxuICAgIH1cbiAgfVxuXG4gIGdvVG9NeUJvb2tpbmdzKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3Byb2ZpbGUnXSwgeyBxdWVyeVBhcmFtczogeyB0YWI6ICdNeSBCb29raW5ncycgfSB9KTtcbiAgfVxuXG4gIGdvVG9MaXN0aW5nKCkge1xuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJ10pO1xuICB9XG5cbiAgZ29Ub0FwcG9pbnRtZW50c0xpc3QoKSB7XG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvYWRtaW4vYXBwb2ludG1lbnRzL2xpc3QtYXBwb2ludG1lbnRzJ10pO1xuICB9XG5cbiAgYm9va0Fub3RoZXIoKSB7XG4gICAgdGhpcy5yZXNldFdpemFyZCgpO1xuICB9XG59XG4iLCI8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiXG4gICAgW3Nob3dUcmFuc2Zvcm1PcHRpb25zXT1cInNjcmVlbldpZHRoIDwgNDc1ID8gJ3RyYW5zbGF0ZVkoLTEwMCUpJyA6ICcnXCI+PC9wLXRvYXN0PlxuPHNlY3Rpb24gY2xhc3M9XCJtYWluX3NlY3Rpb25cIiBbaWRdPVwiZGF0YT8uaWRcIiBzaW1wb0hvdmVyIChob3ZlcmluZyk9XCJzaG93RWRpdFRhYnMoJGV2ZW50KVwiXG4gICAgW3NpbXBvQmFja2dyb3VuZF09XCJiYWNrZ3JvdW5kSW5mb1wiIFtzdHlsZS4tLWNvbG9yLWFjY2VudC1ncmFkaWVudF09XCJhY2NlbnRDb2xvclwiPlxuICAgIDxkaXYgW25nQ2xhc3NdPVwieydob3Zlcl9lZmZlY3QnOiBlZGl0fVwiICpuZ0lmPVwic2hvd0VkaXRvcnNcIj5cbiAgICAgICAgPHNpbXBvLWhvdmVyLWVsZW1lbnRzIFtkYXRhXT1cImRhdGFcIiBbaW5kZXhdPVwiaW5kZXhcIiBbZWRpdE9wdGlvbnNdPVwiZWRpdFwiPjwvc2ltcG8taG92ZXItZWxlbWVudHM+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1haW5faGVhZGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhY2stYnRuIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBnYXAtMiBtYi0zXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiZ29CYWNrKClcIj5cbiAgICAgICAgICAgICAgICA8bWF0LWljb24+a2V5Ym9hcmRfYmFja3NwYWNlPC9tYXQtaWNvbj48c3BhbiAqbmdJZj1cInNjcmVlbldpZHRoID4gNDc1XCI+QmFjayB0byBIb21lPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLXRpdGxlXCI+XG4gICAgICAgICAgICAgICAgPGgxPkJvb2sgTmV3IEFwcG9pbnRtZW50PC9oMT5cbiAgICAgICAgICAgICAgICA8cD57e2J1c2luZXNzTmFtZSA/PyBcIk4vQVwiIH19PC9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1iYXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9ncmVzcy1maWxsXCIgW3N0eWxlLndpZHRoXT1cImJhcldpZHRoICsgJyUnXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYWluX2JvZHkgdy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnbW9kZVNlbGVjdGlvbidcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJtb2RlU2VsZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZydcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhc2tlbGV0b25Mb2FkZXJcIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwic2VydmljZUxpc3RpbmdcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnbG9jYXRpb25MaXN0aW5nJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvY2F0aW9uTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnc3RhZmZMaXN0aW5nJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YWZmTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbidcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlU2VsZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0nY29udGFjdERldGFpbHMnXCI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFjdERldGFpbHNcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdwYXltZW50VGFiJ1wiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBheW1lbnRUYWJcIj48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYj09PSdzdGF0dXNUZW1wbGF0ZSdcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9mb290ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiE9PSdzdGF0dXNUZW1wbGF0ZScgJiYgc2VsZWN0ZWRUYWIhPT0nbW9kZVNlbGVjdGlvbidcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImZvb3Rlci1idXR0b25zXCJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnanVzdGlmeS1jb250ZW50Jzogc2VsZWN0ZWRUYWIgIT0gJ3NlcnZpY2VMaXN0aW5nJyA/ICdzcGFjZS1iZXR3ZWVuJyA6ICdlbmQnfVwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJiYWNrLWZvb3Rlci1idG4gY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicHJldmlvdXNTdGVwKClcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0ZWRUYWIgIT0gJ3NlcnZpY2VMaXN0aW5nJ1wiPkJhY2s8L3NwYW4+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgW2Rpc2FibGVkXT1cIiFhY3RpdmVCdXR0b25cIiAoY2xpY2spPVwibmV4dFN0ZXAoKVwiXG4gICAgICAgICAgICAgICAgKm5nSWY9XCJzZWxlY3RlZFRhYiE9J3BheW1lbnRUYWInXCI+e3shbG9hZGVyID8gJ0NvbnRpbnVlJyA6ICdMb2FkaW5nLi4uJ319PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1ldmVubHkgYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3BheW1lbnRUYWInXCIgKGNsaWNrKT1cImNvbmZpcm1Cb29raW5nKClcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCJcbiAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7J3BheS1ub3ctYnRuJyA6IGJvb2tpbmdHcm91cD8udG90YWxDb2xsZWN0ZWRBdEJvb2tpbmcgPiAwIHx8ICFib29raW5nR3JvdXAsJ2NvbXBsZXRlX2Jvb2tpbmcnIDogYm9va2luZ0dyb3VwICYmICFib29raW5nR3JvdXA/LnRvdGFsQ29sbGVjdGVkQXRCb29raW5nfVwiPlxuICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy8zMDQwMTJjMTc1MzQ0MDA4Nzk5NkJhY2tncm91bmQucG5nXCI+XG4gICAgICAgICAgICAgICAge3tpc1Byb2Nlc3NpbmcgPyAnUGxlYXNlIHdhaXQuLi4nIDogJ0NvbmZpcm0gQm9va2luZyd9fVxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9zZWN0aW9uPlxuXG48bmctdGVtcGxhdGUgI21vZGVTZWxlY3Rpb24+XG4gICAgPGRpdiBjbGFzcz1cInctNjAgc2VydmljZV9zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXNlbGVjdGlvblwiPlxuICAgICAgICAgICAgPGgyPkhvdyB3b3VsZCB5b3UgbGlrZSB0aGlzPzwvaDI+XG4gICAgICAgICAgICA8cD5DaG9vc2UgaG93IHlvdSdkIGxpa2UgdG8gYmUgc2VydmVkPC9wPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2VzLWdyaWRcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkXCIgKGNsaWNrKT1cInNlbGVjdE1vZGUoJ1NUT1JFX1ZJU0lUJylcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pY29uXCI+PG1hdC1pY29uPnN0b3JlZnJvbnQ8L21hdC1pY29uPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+VmlzaXQgb3VyIFN0b3JlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWRlc2NyaXB0aW9uXCI+Q29tZSB0byB1cyBhdCBvbmUgb2Ygb3VyIGxvY2F0aW9uczwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhcmRcIiAoY2xpY2spPVwic2VsZWN0TW9kZSgnSE9NRV9WSVNJVCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj5ob21lPC9tYXQtaWNvbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPldlIGNvbWUgdG8geW91PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWRlc2NyaXB0aW9uXCI+QSBwcm9mZXNzaW9uYWwgdmlzaXRzIHlvdXIgYWRkcmVzczwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhcmRcIiAoY2xpY2spPVwic2VsZWN0TW9kZSgnVklERU9fQ0FMTCcpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWhlYWRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj52aWRlb2NhbTwvbWF0LWljb24+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj5WaWRlbyBjb25zdWx0YXRpb248L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5Db25uZWN0IG92ZXIgYSB2aWRlbyBjYWxsPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3NlcnZpY2VMaXN0aW5nPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIHNlcnZpY2Vfc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1zZWxlY3Rpb25cIj5cbiAgICAgICAgICAgIDxoMj5TZWxlY3QgYSBTZXJ2aWNlPC9oMj5cbiAgICAgICAgICAgIDxwPkNob29zZSB0aGUgc2VydmljZShzKSB5b3UnZCBsaWtlIHRvIGJvb2s8c3BhbiAqbmdJZj1cImNhcnRTZXJ2aWNlcy5sZW5ndGggPiAwXCI+IOKAlCB7e2NhcnRTZXJ2aWNlcy5sZW5ndGh9fSBzZWxlY3RlZDwvc3Bhbj48L3A+XG4gICAgICAgICAgICA8cCAqbmdJZj1cInByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMFwiIGNsYXNzPVwiY2FydC1oaW50XCI+e3twcm9kdWN0Q2FydEl0ZW1zLmxlbmd0aH19IHByb2R1Y3QocykgYWxyZWFkeSBpbiB5b3VyIGNhcnQg4oCUIHlvdSBjYW4gY29udGludWUgd2l0aG91dCBwaWNraW5nIGEgc2VydmljZS48L3A+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlcy1ncmlkXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgc2VydmljZSBvZiBzZXJ2aWNlRGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiXCIgKGNsaWNrKT1cInNlbGVjdFNlcnZpY2Uoc2VydmljZSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VydmljZS1jYXJkLXNlbGVjdGVkJyA6IHNlcnZpY2U/LnNlbGVjdGVkLCAnc2VydmljZS1jYXJkJzogIXNlcnZpY2U/LnNlbGVjdGVkIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCIgc2VydmljZS1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pY29uXCI+PG1hdC1pY29uPnBlcnNvbl9vdXRsaW5lPC9tYXQtaWNvbj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+e3tzZXJ2aWNlPy5uYW1lID8gc2VydmljZT8ubmFtZSA6ICdOL0EnfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1wcmljZVwiPuKCuXt7c2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlPy5wcmljZURldGFpbHM/LnByaWNlIDogJ04vQScgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZHVyYXRpb25cIj57e3NlcnZpY2U/LmR1cmF0aW9uID8gc2VydmljZT8uZHVyYXRpb24gOiAnTi9BJ319IG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIiAqbmdJZj1cInNlcnZpY2U/LmRlc2NyaXB0aW9uXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3tzZXJ2aWNlPy5kZXNjcmlwdGlvbiA/IHNlcnZpY2U/LmRlc2NyaXB0aW9uIDogJ04vQSd9fVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaG9tZS12aXNpdFwiICpuZ0lmPVwic2VsZWN0ZWRNb2RlID09PSAnU1RPUkVfVklTSVQnICYmIHNlcnZpY2U/LmhvbWVBcHBvaW50bWVudEF2YWlsYWJsZVwiPjxpbWdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy85ODIxMjZjMTc1ODYyODg2MzEyOWZ1cm5pdHVyZV8xNjQwNjEwMy5wbmdcIj5Ib21lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXQgQXZhaWxhYmxlPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsb2NhdGlvbkxpc3Rpbmc+XG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uX3NlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImhlYWRlciBmbGV4LWNvbHVtbiBhbGlnbi1pdGVtcy1zdGFydFwiPlxuICAgICAgICAgICAgPGgxPkNob29zZSBMb2NhdGlvbjwvaDE+XG4gICAgICAgICAgICA8cD5TZWxlY3Qgd2hlcmUgeW91J2QgbGlrZSB0byByZWNlaXZlIHRoZSBzZXJ2aWNlPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tbGlzdFwiPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbG9jYXRpb24gb2YgbG9jYXRpb25EYXRhXCI+XG4gICAgICAgICAgICAgICAgPGRpdiAoY2xpY2spPVwic2VsZWN0TG9jYXRpb24obG9jYXRpb24pXCJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbG9jYXRpb24tY2FyZC1zZWxlY3RlZCcgOiBsb2NhdGlvbj8uc2VsZWN0ZWQsICdsb2NhdGlvbi1jYXJkJzogIWxvY2F0aW9uPy5zZWxlY3RlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24taW5mb1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uXCI+PGltZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjPVwiaHR0cHM6Ly9kMno5NDk3eHA4eGIxMi5jbG91ZGZyb250Lm5ldC9wcm9kLWltYWdlcy80MjcyMjZjMTc1ODYyOTE1Nzc1OHN0b3JlXzMxNzE1MTAucG5nXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMz57e2xvY2F0aW9uPy5zdG9yZU5hbWUgPyBsb2NhdGlvbj8uc3RvcmVOYW1lIDogJ04vQSd9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD57e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uYWRkcmVzc0xpbmV9fSwge3tsb2NhdGlvbj8uYWRkcmVzc0RldGFpbHM/LmNpdHl9fSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7bG9jYXRpb24/LmFkZHJlc3NEZXRhaWxzPy5zdGF0ZX19IHt7bG9jYXRpb24/LnBpbmNvZGV9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3RhZmZMaXN0aW5nPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIG92ZXJmbG93LWhpZGRlbiBzdGFmZi1saXN0aW5nXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgaC0xMDBcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1oZWFkZXIgbWItM1wiPlxuICAgICAgICAgICAgICAgICAgICA8aDE+U2VsZWN0IFN0YWZmIE1lbWJlcjwvaDE+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3VidGl0bGUgbWItMFwiPkNob29zZSB5b3VyIHByZWZlcnJlZCBwcm9mZXNzaW9uYWw8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lciBtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtd3JhcHBlciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJzZWFyY2gtaWNvbiBtZS0yXCI+c2VhcmNoPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2VhcmNoLWlucHV0IGJvcmRlci0wIGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RhZmYgbWVtYmVyIGJ5IG5hbWUuLi5cIiBbKG5nTW9kZWwpXT1cInN0YWZmU2VhcmNoUXVlcnlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImNsZWFyLWljb24gY3Vyc29yLXBvaW50ZXIgbXMtMlwiICpuZ0lmPVwic3RhZmZTZWFyY2hRdWVyeVwiIChjbGljayk9XCJzdGFmZlNlYXJjaFF1ZXJ5ID0gJydcIj5jbG9zZTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBQdXJlIHByb2R1Y3Qtb25seSBsaW5lOiBvbmUgZmxhdCBzdGFmZiBsaXN0LCBzYW1lIGFzIHRoZSBvbGQgc2luZ2xlLXNlcnZpY2UgZmxvdyAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtbGlzdFwiICpuZ0lmPVwiY2FydFNlcnZpY2VzLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzdGFmZiBvZiBmaWx0ZXJlZFN0YWZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCByb3VuZGVkLTMgcC0zXCIgKGNsaWNrKT1cInNlbGVjdFN0YWZmRm9yUHJvZHVjdE9ubHlMaW5lKHN0YWZmKVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc3RhZmYtY2FyZC1zZWxlY3RlZCcgOiBzdGFmZj8uc2VsZWN0ZWQsICdzdGFmZi1jYXJkJzogIXN0YWZmPy5zZWxlY3RlZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1hdmF0YXIgcm91bmRlZC1jaXJjbGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1lLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0YWZmPy5zdGFmZk5hbWUuc2xpY2UoMCwyKS50b1VwcGVyQ2FzZSgpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWRldGFpbHMgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzdGFmZi1uYW1lXCI+e3soc3RhZmY/LnN0YWZmTmFtZSA/IHN0YWZmPy5zdGFmZk5hbWUgOiAnTi9BJykgfCB0aXRsZWNhc2V9fTwvaDM+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdGFmZi1zcGVjaWFsdHlcIj57eyhidXNpbmVzc05hbWUgJiYgYnVzaW5lc3NOYW1lICE9PSAnTi9BJykgPyBidXNpbmVzc05hbWUgOiAnQm9va2luZyBTcGVjaWFsaXN0J319PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VsZWN0aW9uLWluZGljYXRvclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGUtbWluaSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RhZmY/LnNlbGVjdGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic3RhZmY/LnNlbGVjdGVkXCI+Y2hlY2s8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPCEtLSBCdW5kbGVkIGNhcnQ6IG9uZSBwb29sIHBlciBsaW5lIHRoYXQgcmVzb2x1dGlvbiBjb3VsZG4ndCBjb2xsYXBzZSB0byBhIHNpbmdsZSBwcm92aWRlciAtLT5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiY2FydFNlcnZpY2VzLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWxpbmUtZ3JvdXAgbWItNFwiICpuZ0Zvcj1cImxldCBsaW5lIG9mIHJlc29sdmVkTGluZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW5lLmNhbmRpZGF0ZVN0YWZmUG9vbD8ubGVuZ3RoXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg0IGNsYXNzPVwibWItMlwiPkZvciB7e2xpbmUuc2VydmljZXMubGVuZ3RofX0gc2VydmljZShzKToge3sgKGxpbmUuc2VydmljZXMgfCBzbGljZTowOjMpLmxlbmd0aCA/ICcnIDogJycgfX08c3BhbiAqbmdGb3I9XCJsZXQgcyBvZiBsaW5lLnNlcnZpY2VzOyBsZXQgbGFzdCA9IGxhc3RcIj57e3MubmFtZX19e3tsYXN0ID8gJycgOiAnLCAnfX08L3NwYW4+PC9oND5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtbGlzdCBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YWZmIG9mIGxpbmUuY2FuZGlkYXRlU3RhZmZQb29sXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCByb3VuZGVkLTMgcC0zXCIgKGNsaWNrKT1cInNlbGVjdFN0YWZmRm9yTGluZShsaW5lLCBzdGFmZilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ3N0YWZmLWNhcmQtc2VsZWN0ZWQnIDogbGluZS5zZWxlY3RlZFN0YWZmSWQgPT09IHN0YWZmLmlkLCAnc3RhZmYtY2FyZCc6IGxpbmUuc2VsZWN0ZWRTdGFmZklkICE9PSBzdGFmZi5pZCB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1hdmF0YXIgcm91bmRlZC1jaXJjbGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1lLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0YWZmPy5uYW1lPy5zbGljZSgwLDIpPy50b1VwcGVyQ2FzZSgpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWRldGFpbHMgZmxleC1ncm93LTFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzdGFmZi1uYW1lXCI+e3soc3RhZmY/Lm5hbWUgPyBzdGFmZj8ubmFtZSA6ICdOL0EnKSB8IHRpdGxlY2FzZX19PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGlvbi1pbmRpY2F0b3JcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja21hcmstY2lyY2xlLW1pbmkgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgW2NsYXNzLnNlbGVjdGVkXT1cImxpbmUuc2VsZWN0ZWRTdGFmZklkID09PSBzdGFmZi5pZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cImxpbmUuc2VsZWN0ZWRTdGFmZklkID09PSBzdGFmZi5pZFwiPmNoZWNrPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjZGF0ZVNlbGVjdGlvbj5cbiAgICA8ZGl2IGNsYXNzPVwidy02MCBkYXRlX3NlY3Rpb25cIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGgtMTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTEyIGgtMTAwXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGV0aW1lLWhlYWRlciBtYi0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMT5TZWxlY3QgRGF0ZSAmIFRpbWU8L2gxPlxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImRhdGV0aW1lLXN1YnRpdGxlIG1iLTBcIj5DaG9vc2Ugd2hlbiB5b3UnZCBsaWtlIHlvdXIgYXBwb2ludG1lbnQ8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IG1haW5fY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNjcmVlbldpZHRoID4gNDc1ICwgJ3ctMTAwJzpzY3JlZW5XaWR0aCA8IDQ3NX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQgY2FyZCByb3VuZGVkLTMgcC00IGgtMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlNlbGVjdCBEYXRlPC9oMz5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkYXRlLXBpY2tlci1jb250YWluZXIgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJkYXRlLWlucHV0IGJvcmRlci0wIHJvdW5kZWQtMlwiIHBsYWNlaG9sZGVyPVwiZGQtbW0teXl5eVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdmFsdWVdPVwic2VsZWN0ZWREYXRlU3RyXCIgcmVhZG9ubHkgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtcy0yXCIgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5jYWxlbmRhcl90b2RheTwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCIgKGNsaWNrKT1cIiRldmVudC5zdG9wUHJvcGFnYXRpb24oKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1wb3BvdmVyXCIgKm5nSWY9XCJzaG93Q2FsZW5kYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtY2FsZW5kYXIgWyhzZWxlY3RlZCldPVwic2VsZWN0ZWREYXRlXCIgW2RhdGVGaWx0ZXJdPVwiZGF0ZUZpbHRlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGVjdGVkQ2hhbmdlKT1cIm9uRGF0ZVNlbGVjdGVkKCRldmVudClcIiBjbGFzcz1cImRhdGVwaWNrZXItY2FsZW5kYXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhbGVuZGFyPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8IS0tIE9uZSBzbG90LXBpY2tlciBwZXIgcmVzb2x2ZWQgbGluZSwgc2lkZSBieSBzaWRlIHdoZW4gdGhlcmUncyBtb3JlIHRoYW4gb25lIChkZXNpZ24gZG9jIMKnM2IpIC0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZV9zZWxlY3Rpb25cIiBbbmdDbGFzc109XCJ7J3ctNTAnIDogc2NyZWVuV2lkdGggPiA0NzUgLCAndy0xMDAnOnNjcmVlbldpZHRoIDwgNDc1fVwiICpuZ0lmPVwicmVzb2x2ZWRMaW5lcy5sZW5ndGggPD0gMVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIGgtMTAwIHJvdW5kZWQtMyBwLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+QXZhaWxhYmxlIFRpbWVzPC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGctMiBtYi00IG92ZXJmbG93LXNjcm9sbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIXNrZWxldG9uTG9hZGVyICYmIHJlc29sdmVkTGluZXNbMF1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIHJlc29sdmVkTGluZXNbMF0uc2xvdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zbG90IHJvdW5kZWQtMlwiIFtjbGFzcy5zZWxlY3RlZF09XCJ0aW1lLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNsb3RGb3JMaW5lKHJlc29sdmVkTGluZXNbMF0sIHRpbWUpXCI+e3t0aW1lID8gdGltZT8udmFsdWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8IS0tIE11bHRpLWxpbmUgY2FzZTogZWFjaCBsaW5lIGdldHMgaXRzIG93biBmdWxsLXdpZHRoIGNhcmQgd2l0aCBhIHN0YWZmIGhlYWRlciAtLT5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00IG1haW5fY29udGFpbmVyIGZsZXgtd3JhcFwiICpuZ0lmPVwicmVzb2x2ZWRMaW5lcy5sZW5ndGggPiAxXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0Zvcj1cImxldCBsaW5lIG9mIHJlc29sdmVkTGluZXNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQgY2FyZCByb3VuZGVkLTMgcC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlByb2Zlc3Npb25hbDoge3tsaW5lLnN0YWZmTmFtZSB8fCBsaW5lLnNlbGVjdGVkU3RhZmZOYW1lfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiICpuZ0lmPVwibGluZS5zZXJ2aWNlcy5sZW5ndGhcIj48c3BhbiAqbmdGb3I9XCJsZXQgcyBvZiBsaW5lLnNlcnZpY2VzOyBsZXQgbGFzdCA9IGxhc3RcIj57e3MubmFtZX19e3tsYXN0ID8gJycgOiAnLCAnfX08L3NwYW4+PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0yIG1iLTIgb3ZlcmZsb3ctc2Nyb2xsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhbGluZS5zbG90c0xvYWRpbmdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIGxpbmUuc2xvdHNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGltZS1zbG90IHJvdW5kZWQtMlwiIFtjbGFzcy5zZWxlY3RlZF09XCJ0aW1lLnNlbGVjdGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdFNsb3RGb3JMaW5lKGxpbmUsIHRpbWUpXCI+e3t0aW1lID8gdGltZT8udmFsdWUgOiAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI2NvbnRhY3REZXRhaWxzPlxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIGNvbnRhY3Rfc2VjdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1oZWFkZXIgbWItMlwiPlxuICAgICAgICAgICAgPGgxPkNvbnRhY3QgRGV0YWlsczwvaDE+XG4gICAgICAgICAgICA8cCBjbGFzcz1cImNvbnRhY3Qtc3VidGl0bGUgbWItMFwiPlByb3ZpZGUgeW91ciBjb250YWN0IGluZm9ybWF0aW9uPC9wPlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGRldGFpbHNfY29udGFpbmVyIGZsZXgtY29sdW1uIHctMTAwXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC00XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBbbmdDbGFzc109XCJ7J3ctNTAnIDogc2VsZWN0ZWRNb2RlID09PSAnSE9NRV9WSVNJVCcsICd3LTEwMCcgOiBzZWxlY3RlZE1vZGUgIT09ICdIT01FX1ZJU0lUJ31cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5QZXJzb25hbCBJbmZvcm1hdGlvbjwvaDM+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGwgTmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiIHNpbXBvTGV0dGVyc09ubHk+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWwgQWRkcmVzc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kXCIgI2VtYWlsRmllbGQ9XCJuZ01vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT1cImVtYWlsXCIgcmVxdWlyZWQ+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUgTnVtYmVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCAgcm91bmRlZC0yXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIiBzaW1wb051bWJlcnNPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iaWxlX251bWJlcicgOiBhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIubGVuZ3RoICE9IDEwfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwhLS0gSG9tZSBWaXNpdCBhZGRyZXNzLiBDdXN0b21lciBjb250ZXh0OiBzYW1lIHNhdmVkLWFkZHJlc3MgZmxvdyBhc1xuICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXQvQm9va0FwcG9pbnRtZW50Q29tcG9uZW50LiBBZG1pbiBjb250ZXh0IChpc0FkbWluQm9va2luZyk6IG5vXG4gICAgICAgICAgICAgICAgICAgICBsb2dnZWQtaW4gY3VzdG9tZXIgYWNjb3VudCB0byByZWFkIGEgc2F2ZWQgYWRkcmVzcyBib29rIGZyb20sIHNvIHN0YWZmIHR5cGVcbiAgICAgICAgICAgICAgICAgICAgIHRoZSBhZGRyZXNzIG1hbnVhbGx5IGluc3RlYWQuIC0tPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCIgKm5nSWY9XCJzZWxlY3RlZE1vZGUgPT09ICdIT01FX1ZJU0lUJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGNhcmQgcm91bmRlZC0zIHAtNCBoLTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPkhvbWUgVmlzaXQgRGV0YWlsczwvaDM+XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBZG1pbkJvb2tpbmc7IGVsc2UgbWFudWFsSG9tZVZpc2l0QWRkcmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzaGlwcGluZy1pbmZvXCIgKm5nSWY9XCJkZWZhdWx0QWRkcmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1uYW1lXCI+e3tkZWZhdWx0QWRkcmVzcz8ucmVjZWl2ZXJOYW1lfX0gKHt7ZGVmYXVsdEFkZHJlc3M/LmFkZHJlc3NUeXBlfX0pPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1kZXRhaWxzXCI+e3tkZWZhdWx0QWRkcmVzcz8uYWRkcmVzc0xpbmUxfX0sIHt7ZGVmYXVsdEFkZHJlc3M/LmNpdHlOYW1lfX0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tkZWZhdWx0QWRkcmVzcz8uc3RhdGVOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtbnVtYmVyXCI+TW9iaWxlOiB7e2RlZmF1bHRBZGRyZXNzPy5yZWNlaXZlclBob25lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjaGFuZ2UtYWRkcmVzcy1idG4gdy0xMDBcIiAoY2xpY2spPVwiY2hhbmdlQWRkcmVzcygpXCIgKm5nSWY9XCJkZWZhdWx0QWRkcmVzc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEFOR0UgT1IgQUREIEFERFJFU1NcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRMaW5rc1wiICpuZ0lmPVwiIWRlZmF1bHRBZGRyZXNzXCIgKGNsaWNrKT1cImFkZEFkZHJlc3MoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24+YWRkPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+QWRkIGFuIGFkZHJlc3M8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNtYW51YWxIb21lVmlzaXRBZGRyZXNzPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlJlY2VpdmVyIE5hbWU8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiIFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5yZWNlaXZlck5hbWVcIiAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5SZWNlaXZlciBQaG9uZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGVsXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dCByb3VuZGVkLTJcIiBzaW1wb051bWJlcnNPbmx5IFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5yZWNlaXZlclBob25lXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+QWRkcmVzcyBMaW5lIDE8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiIFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5hZGRyZXNzTGluZTFcIiAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5BZGRyZXNzIExpbmUgMiAob3B0aW9uYWwpPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dCByb3VuZGVkLTJcIiBbKG5nTW9kZWwpXT1cImhvbWVWaXNpdEFkZHJlc3MuYWRkcmVzc0xpbmUyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBtYi0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5DaXR5PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCIgWyhuZ01vZGVsKV09XCJob21lVmlzaXRBZGRyZXNzLmNpdHlcIiAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTUwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5TdGF0ZTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiIFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5zdGF0ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5QaW5jb2RlPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dCByb3VuZGVkLTJcIiBzaW1wb051bWJlcnNPbmx5IFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy56aXBDb2RlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMCBtdC0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+U3BlY2lhbCBJbnN0cnVjdGlvbnM8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXRleHRhcmVhIHJvdW5kZWQtMlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiQW55IHNwZWNpYWwgaW5zdHJ1Y3Rpb25zIGZvciB0aGUgcHJvZmVzc2lvbmFsIChvcHRpb25hbClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImluc3RydWN0aW9uc1wiPjwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY2llcy1jb250YWluZXJcIlxuICAgICAgICAgICAgICAgICpuZ0lmPVwiY2FydFNlcnZpY2VzWzBdPy5jYW5jZWxsYXRpb25Qb2xpY3k/Lmxlbmd0aCA+IDAgfHwgY2FydFNlcnZpY2VzWzBdPy5yZXNjaGVkdWxlUG9saWN5Py5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwb2xpY2llcy10aXRsZVwiPlBvbGljaWVzICYgVGVybXM8L2gyPlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtcy1jb250YWluZXIgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzaG93Q2FuY2VsbGF0aW9uUG9saWN5ID0gIXNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInBvbGljeS10aXRsZVwiPkNhbmNlbGxhdGlvbiBQb2xpY3k8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1hcnJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X3JpZ2h0PC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzaG93Q2FuY2VsbGF0aW9uUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYW5jZWxsYXRpb25fcG9saWNpZXMgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIGZ3LTUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwb2xpY3kgb2YgY2FydFNlcnZpY2VzWzBdPy5jYW5jZWxsYXRpb25Qb2xpY3lcIj4mIzgyMjY7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3twb2xpY3l9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1pdGVtIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZWR1Y2luZ1BvbGljeSA9ICFzaG93UmVkdWNpbmdQb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInBvbGljeS10aXRsZVwiPlJlc2NoZWR1bGluZyBQb2xpY3k8L2gzPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1hcnJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bWF0LWljb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd1JlZHVjaW5nUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxtYXQtaWNvbiAqbmdJZj1cInNob3dSZWR1Y2luZ1BvbGljeVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsbGF0aW9uX3BvbGljaWVzIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBmdy01MDBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJzaG93UmVkdWNpbmdQb2xpY3lcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwb2xpY3kgb2YgY2FydFNlcnZpY2VzWzBdPy5yZXNjaGVkdWxlUG9saWN5XCI+JiM4MjI2OyB7e3BvbGljeX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhY2NlcHRhbmNlLXNlY3Rpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY3VzdG9tLWNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJ0ZXJtc0FuZENvbmRpdGlvbnNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYWNjZXB0YW5jZS10ZXh0XCIgc3R5bGU9XCJtYXJnaW4tYm90dG9tOjBweCAhaW1wb3J0YW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBJIHVuZGVyc3RhbmQgYW5kIGFjY2VwdCB0aGUgY2FuY2VsbGF0aW9uICYgcmVzY2hlZHVsaW5nIHBvbGljaWVzLlxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG48bmctdGVtcGxhdGUgI3BheW1lbnRUYWI+XG4gICAgPGRpdiBjbGFzcz1cInctNjAgcGF5bWVudF9zZWN0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwYXltZW50LWhlYWRlciBtYi0zIHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMSBzdHlsZT1cImZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OiA2MDA7XCI+Qm9va2luZyBTdW1tYXJ5PC9oMT5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJwYXltZW50LXN1YnRpdGxlIG1iLTBcIj5SZXZpZXcgeW91ciBib29raW5nIGJlZm9yZSBjb25maXJtaW5nPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2tpbmctc3VtbWFyeS1jYXJkXCIgW25nQ2xhc3NdPVwieyd3LTEwMCcgOiBzY3JlZW5XaWR0aCA8IDQ3NSwndy01MCc6c2NyZWVuV2lkdGggPiA0NzV9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGxpbmUgb2YgcmVzb2x2ZWRMaW5lczsgbGV0IGkgPSBpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiICpuZ0lmPVwicmVzb2x2ZWRMaW5lcy5sZW5ndGggPiAxXCI+TGluZSB7e2kgKyAxfX08L2gyPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nRm9yPVwibGV0IHMgb2YgbGluZS5zZXJ2aWNlc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+e3tzLm5hbWV9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+PHNwYW4gY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2xcIj7igrk8L3NwYW4+e3tzZXJ2aWNlUHJpY2Uocy5pZCl9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdJZj1cImxpbmUuc3RhZmZOYW1lIHx8IGxpbmUuc2VsZWN0ZWRTdGFmZk5hbWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlByb2Zlc3Npb25hbDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3tsaW5lLnN0YWZmTmFtZSB8fCBsaW5lLnNlbGVjdGVkU3RhZmZOYW1lfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJzZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkxvY2F0aW9uPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e3NlbGVjdGVkTG9jYXRpb24/LnN0b3JlTmFtZSA/PyAnTi9BJ319PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+RGF0ZSAmIFRpbWU8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWREYXRlU3RyfX0gYXQge3tsaW5lLnNlbGVjdGVkU2xvdD8udmFsdWUgPz8gJ04vQSd9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJwcm9kdWN0Q2FydEl0ZW1zLmxlbmd0aCA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxoMiBjbGFzcz1cInN1bW1hcnktdGl0bGVcIj5Qcm9kdWN0czwvaDI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdGb3I9XCJsZXQgcCBvZiBwcm9kdWN0Q2FydEl0ZW1zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktbGFiZWxcIj57e3AuaXRlbU5hbWV9fSB4e3twLnF1YW50aXR5fX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPjxzcGFuIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sXCI+4oK5PC9zcGFuPnt7KHAuc2VsbGluZ1ByaWNlID8/IHAucHJpY2UgPz8gMCkgKiAocC5xdWFudGl0eSA/PyAxKX19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiPlBheW1lbnQ8L2gyPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdJZj1cImhvbWVWaXNpdENoYXJnZSA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+SG9tZSB2aXNpdCBjaGFyZ2U8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+PHNwYW4gY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2xcIj7igrk8L3NwYW4+e3tob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPjxzcGFuIGNsYXNzPVwiY3VycmVuY3ktc3ltYm9sXCI+4oK5PC9zcGFuPnt7cmV2aWV3VG90YWx9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjc3RhdHVzVGVtcGxhdGU+XG4gICAgPGRpdiBjbGFzcz1cImJvb2tpbmctY29uZmlybWF0aW9uXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJzdWNjZXNzLWljb25cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja21hcmstY2lyY2xlXCI+XG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzg4MTI5M2MxNzU4Njk1NTc4NTE4c3VjY2Vzcy5naWZcIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInctMTAwIGgtMTAwXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzI1MDAwYzE3NTg2OTU1NjQ1MThmYWlsLmdpZlwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidy0xMDAgaC0xMDBcIiAqbmdJZj1cIiFhcGlTdGF0dXNcIj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29uZmlybWF0aW9uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxoMSBjbGFzcz1cImNvbmZpcm1hdGlvbi10aXRsZVwiPnt7YXBpU3RhdHVzID8gJ0Jvb2tpbmcgQ29uZmlybWVkIScgOiAnQm9va2luZyBGYWlsZWQnfX08L2gxPlxuICAgICAgICAgICAgPHAgY2xhc3M9XCJjb25maXJtYXRpb24tbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgIHt7YXBpU3RhdHVzID8gJ1lvdXIgYXBwb2ludG1lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJvb2tlZC4nOidGYWlsZWQgdG8gYm9vayB5b3UgYXBwb2ludG1lbnQuIFBsZWFzZVxuICAgICAgICAgICAgICAgIHRyeSBhZ2FpbiBsYXRlcid9fVxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8IS0tIFZpZGVvIENhbGwgbGluaywgd2hlbiBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGNvbmZpcm1lZCBncm91cCAoYSBwYWlkIFZpZGVvIENhbGwnc1xuICAgICAgICAgICAgICAgICBsaW5rIG9ubHkgYXBwZWFycyBvbmNlIHBheW1lbnQgdmVyaWZpY2F0aW9uIGNvbXBsZXRlcywgaGFuZGxlZCBlbHNld2hlcmUgLSBzZWVcbiAgICAgICAgICAgICAgICAgdmVyaWZ5LXBheW1lbnQuY29tcG9uZW50LnRzLCBub3QgdGhpcyBzY3JlZW4pLiAtLT5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1jYWxsLWxpbmstY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1cyAmJiBzZWxlY3RlZE1vZGUgPT09ICdWSURFT19DQUxMJyAmJiBib29raW5nR3JvdXA/LnZpZGVvQ2FsbExpbmtcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtdGl0bGVcIj5Zb3VyIFZpZGVvIENhbGwgTGluazwvaDM+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cImJvb2tpbmdHcm91cC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tib29raW5nR3JvdXAudmlkZW9DYWxsTGlua319PC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggdy0xMDAgYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNhcmRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy10aXRsZVwiPkFwcG9pbnRtZW50IERldGFpbHM8L2gzPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1yb3dcIiAqbmdGb3I9XCJsZXQgbGluZSBvZiByZXNvbHZlZExpbmVzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPnt7bGluZS5zZXJ2aWNlcy5sZW5ndGggPyAobGluZS5zZXJ2aWNlc1swXS5uYW1lKSA6ICdQcm9kdWN0cyd9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3tzZWxlY3RlZERhdGVTdHJ9fSBhdCB7e2xpbmUuc2VsZWN0ZWRTbG90Py52YWx1ZSA/PyAnTi9BJ319PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCIgKm5nSWY9XCJhcGlTdGF0dXNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jYXJkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cImRldGFpbHMtdGl0bGVcIj5QYXltZW50PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtcm93XCIgKm5nSWY9XCJib29raW5nR3JvdXA/LmhvbWVWaXNpdENoYXJnZSA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+SG9tZSB2aXNpdCBjaGFyZ2U8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPuKCuXt7Ym9va2luZ0dyb3VwLmhvbWVWaXNpdENoYXJnZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlRvdGFsPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj7igrl7e2Jvb2tpbmdUb3RhbH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC1sYWJlbFwiPlBhaWQ8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPuKCuXt7Ym9va2luZ1BhaWR9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiICpuZ0lmPVwiYm9va2luZ0R1ZSA+IDBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RHVlPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtdmFsdWVcIj7igrl7e2Jvb2tpbmdEdWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvbmUtYWN0aW9ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1c1wiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBZG1pbkNvbnRleHQ7IGVsc2UgYWRtaW5Eb25lQWN0aW9uc1wiPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRvbmUtYnRuIGRvbmUtYnRuLXByaW1hcnlcIiAoY2xpY2spPVwiZ29Ub015Qm9va2luZ3MoKVwiPlZpZXcgbXkgYm9va2luZ3M8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkb25lLWJ0biBkb25lLWJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZ29Ub0xpc3RpbmcoKVwiPktlZXAgc2hvcHBpbmc8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FkbWluRG9uZUFjdGlvbnM+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZG9uZS1idG4gZG9uZS1idG4tcHJpbWFyeVwiIChjbGljayk9XCJnb1RvQXBwb2ludG1lbnRzTGlzdCgpXCI+QmFjayB0byBBcHBvaW50bWVudHMgTGlzdDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImRvbmUtYnRuIGRvbmUtYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJib29rQW5vdGhlcigpXCI+Qm9vayBBbm90aGVyPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|
|
744
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaW1wby11aS9zcmMvbGliL3NlY3Rpb25zL2FwcG9pbnRtZW50LWZvcm0vYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2ltcG8tdWkvc3JjL2xpYi9zZWN0aW9ucy9hcHBvaW50bWVudC1mb3JtL2FwcG9pbnRtZW50LWJvb2tpbmcvYXBwb2ludG1lbnQtYm9va2luZy9hcHBvaW50bWVudC1ib29raW5nLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBVSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDakYsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzVELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDN0QsT0FBTyxFQUFhLGVBQWUsRUFBZ0IsTUFBTSwwQkFBMEIsQ0FBQztBQUlwRixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFHekQsT0FBTyxFQUFFLG9CQUFvQixF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RSxrQkFBa0IsOEJBQUUsbUJBQW1CLDBiQUFFLFdBQVcsMnBDQUFFLG1CQUFtQiw4QkFBRSxjQUFjLDhCQUFFLGVBQWUsK0JBQUUsb0JBQW9CLCtEQUFFLG9CQUFvQiw4REFBRSxXQUFXLHlXQUFFLGNBQWMsZ0ZBQUUsc0JBQXNCLHlKQUFFLG1CQUFtQjs7NEZBSzFRLDJCQUEyQjtrQkFSdkMsU0FBUzsrQkFDRSwyQkFBMkIsY0FDekIsSUFBSSxXQUNQLENBQUMsa0JBQWtCLEVBQUUsWUFBWSxFQUFFLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxtQkFBbUIsRUFBRSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsY0FBYyxFQUFFLGVBQWUsRUFBRSxvQkFBb0IsRUFBRSxvQkFBb0IsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFFLHNCQUFzQixFQUFFLG1CQUFtQixDQUFDLGFBQzNRLENBQUMsY0FBYyxDQUFDOzswQkFheEIsUUFBUTt5Q0FJRixJQUFJO3NCQUFaLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUVHLElBQUk7c0JBQVosS0FBSztnQkFLRyxjQUFjO3NCQUF0QixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQThITixhQUFhO3NCQURaLFlBQVk7dUJBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBSzFDLG1CQUFtQjtzQkFEbEIsWUFBWTt1QkFBQyxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uSW5pdCwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ2RrRHJhZ1BsYWNlaG9sZGVyIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9kcmFnLWRyb3BcIjtcclxuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gXCJAYW5ndWxhci9tYXRlcmlhbC9pY29uXCI7XHJcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5pbXBvcnQgeyBNYXRGb3JtRmllbGRNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZFwiO1xyXG5pbXBvcnQgeyBNYXREYXRlcGlja2VyTW9kdWxlIH0gZnJvbSBcIkBhbmd1bGFyL21hdGVyaWFsL2RhdGVwaWNrZXJcIjtcclxuaW1wb3J0IHsgTWF0TmF0aXZlRGF0ZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NvcmUnO1xyXG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ01vZHVsZSwgTWF0RGlhbG9nUmVmIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcclxuaW1wb3J0IHsgUmVzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi8uLi9zZXJ2aWNlcy9yZXN0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFdmVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvZXZlbnRzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcclxuaW1wb3J0IHsgQmFubmVyQ29udGVudE1vZGVsLCBCYW5uZXJTZWN0aW9uTW9kZWwgfSBmcm9tICcuLi8uLi9hcHBvaW50bWVudC1mb3JtLm1vZGVsJztcclxuaW1wb3J0IHsgQmFja2dyb3VuZE1vZGVsLCBCYW5uZXJTdHlsZXNNb2RlbCB9IGZyb20gJy4uLy4uLy4uLy4uL3N0eWxlcy9zdHlsZS5tb2RlbCc7XHJcbmltcG9ydCB7IExldHRlcnNPbmx5RGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlL2xldHRlcnMtb25seS5kaXJlY3RpdmUnO1xyXG5pbXBvcnQgeyBOdW1iZXJzT25seURpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RpcmVjdGl2ZS9udW1iZXJzLW9ubHkuZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgVG9hc3RNb2R1bGUgfSBmcm9tIFwicHJpbWVuZy90b2FzdFwiO1xyXG5pbXBvcnQgeyBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZSwgQm9va2luZ0NhcnRNb2RlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvYm9va2luZy1wcm9kdWN0LWNhcnQuc2VydmljZSc7XHJcbmltcG9ydCB7IFN0b3JhZ2VTZXJ2aWNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3N0b3JhZ2Uuc2VydmljZSc7XHJcbmltcG9ydCB7IEFkZHJlc3NDb21wb25lbnQgfSBmcm9tICcuLi8uLi8uLi8uLi9lY29tbWVyY2Uvc2VjdGlvbnMvYWRkcmVzcy9hZGRyZXNzLmNvbXBvbmVudCc7XHJcbmltcG9ydCB7IEFkZHJlc3NMaXN0Q29tcG9uZW50IH0gZnJvbSAnLi4vLi4vLi4vLi4vZWxlbWVudHMvYWRkcmVzcy1saXN0L2FkZHJlc3MtbGlzdC5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBBZGRyZXNzRGV0YWlscywgVXNlciB9IGZyb20gJy4uLy4uLy4uLy4uL2Vjb21tZXJjZS9zdHlsZXMvdXNlci5tb2RhbCc7XHJcbmltcG9ydCBCYXNlU2VjdGlvbiBmcm9tICcuLi8uLi8uLi9CYXNlU2VjdGlvbic7XHJcbmltcG9ydCB7IEhvdmVyRGlyZWN0aXZlIH0gZnJvbSAnLi4vLi4vLi4vLi4vZGlyZWN0aXZlL2hvdmVyLWVsZW1lbnQtZGlyZWN0aXZlJztcclxuaW1wb3J0IHsgSG92ZXJFbGVtZW50c0NvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uLy4uL2NvbXBvbmVudHMvaG92ZXItZWxlbWVudHMvaG92ZXItZWxlbWVudHMuY29tcG9uZW50JztcclxuaW1wb3J0IHsgQmFja2dyb3VuZERpcmVjdGl2ZSB9IGZyb20gJy4uLy4uLy4uLy4uL2RpcmVjdGl2ZS9iYWNrZ3JvdW5kLWRpcmVjdGl2ZSc7XHJcblxyXG50eXBlIEJvb2tpbmdNb2RlID0gJ1NUT1JFX1ZJU0lUJyB8ICdIT01FX1ZJU0lUJyB8ICdWSURFT19DQUxMJztcclxuXHJcbmludGVyZmFjZSBSZXNvbHZlZExpbmUge1xyXG4gIHNlcnZpY2VzOiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9W107XHJcbiAgdG90YWxEdXJhdGlvbk1pbnV0ZXM6IG51bWJlcjtcclxuICBzdGFmZklkPzogc3RyaW5nO1xyXG4gIHN0YWZmTmFtZT86IHN0cmluZztcclxuICBjYW5kaWRhdGVTdGFmZlBvb2w/OiB7IGlkOiBzdHJpbmcsIG5hbWU6IHN0cmluZyB9W107XHJcbiAgc2VsZWN0ZWRTdGFmZklkPzogc3RyaW5nO1xyXG4gIHNlbGVjdGVkU3RhZmZOYW1lPzogc3RyaW5nO1xyXG4gIHNsb3RzOiBhbnlbXTtcclxuICBzZWxlY3RlZFNsb3Q/OiBhbnk7XHJcbiAgc2xvdHNMb2FkaW5nPzogYm9vbGVhbjtcclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdzaW1wby1hcHBvaW50bWVudC1ib29raW5nJyxcclxuICBzdGFuZGFsb25lOiB0cnVlLFxyXG4gIGltcG9ydHM6IFtDZGtEcmFnUGxhY2Vob2xkZXIsIENvbW1vbk1vZHVsZSwgTWF0SWNvbiwgTWF0Rm9ybUZpZWxkTW9kdWxlLCBNYXREYXRlcGlja2VyTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0TmF0aXZlRGF0ZU1vZHVsZSwgTWF0SW5wdXRNb2R1bGUsIE1hdERpYWxvZ01vZHVsZSwgTGV0dGVyc09ubHlEaXJlY3RpdmUsIE51bWJlcnNPbmx5RGlyZWN0aXZlLCBUb2FzdE1vZHVsZSwgSG92ZXJEaXJlY3RpdmUsIEhvdmVyRWxlbWVudHNDb21wb25lbnQsIEJhY2tncm91bmREaXJlY3RpdmVdLFxyXG4gIHByb3ZpZGVyczogW01lc3NhZ2VTZXJ2aWNlXSxcclxuICB0ZW1wbGF0ZVVybDogJy4vYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmw6ICcuL2FwcG9pbnRtZW50LWJvb2tpbmcuY29tcG9uZW50LmNzcydcclxufSlcclxuZXhwb3J0IGNsYXNzIEFwcG9pbnRtZW50Qm9va2luZ0NvbXBvbmVudCBleHRlbmRzIEJhc2VTZWN0aW9uIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBjb25zdHJ1Y3RvcihcclxuICAgIHByaXZhdGUgcmVzdFNlcnZpY2U6IFJlc3RTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBfZXZlbnRTZXJ2aWNlOiBFdmVudHNTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXI6IFJvdXRlcixcclxuICAgIHByaXZhdGUgcmVhZG9ubHkgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBib29raW5nUHJvZHVjdENhcnRTZXJ2aWNlOiBCb29raW5nUHJvZHVjdENhcnRTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBzdG9yYWdlU2VydmljZTogU3RvcmFnZVNlcnZpY2VTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSByZWFkb25seSBtYXREaWFsb2c6IE1hdERpYWxvZyxcclxuICAgIEBPcHRpb25hbCgpIHByaXZhdGUgcmVhZG9ubHkgZGlhbG9nUmVmOiBNYXREaWFsb2dSZWY8QXBwb2ludG1lbnRCb29raW5nQ29tcG9uZW50PlxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcbiAgQElucHV0KCkgZGF0YT86IEJhbm5lclNlY3Rpb25Nb2RlbDtcclxuICBASW5wdXQoKSBpbmRleD86IG51bWJlcjtcclxuICBjb250ZW50PzogQmFubmVyQ29udGVudE1vZGVsO1xyXG4gIEBJbnB1dCgpIGVkaXQ/OiBib29sZWFuO1xyXG4gIC8qKiBTZXQgYnkgdGhlIGFkbWluIHBhbmVsJ3MgXCJCb29rIE5ldyBBcHBvaW50bWVudFwiIHRvb2wgLSBhIHN0YWZmIG1lbWJlciBjcmVhdGluZyBhIGJvb2tpbmcgb25cclxuICAgKiBhIGN1c3RvbWVyJ3MgYmVoYWxmLCBub3QgYSBsaXZlIGN1c3RvbWVyIHNlbGYtc2VydmljZSBmbG93LiBTa2lwcyB0aGUgY3VzdG9tZXItZmFjaW5nXHJcbiAgICogYXZhaWxhYmxlT25saW5lL2hvbWVBcHBvaW50bWVudEF2YWlsYWJsZSBzZXJ2aWNlIGZpbHRlcnMsIHdoaWNoIG9ubHkgbWFrZSBzZW5zZSBmb3Igd2hhdCBhXHJcbiAgICogY3VzdG9tZXIgY2FuIHNlbGYtc2VydmUgYm9vayBvbiB0aGUgbGl2ZSB3ZWJzaXRlLiAqL1xyXG4gIEBJbnB1dCgpIGlzQWRtaW5Cb29raW5nPzogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkZWxldGU/OiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGN1c3RvbUNsYXNzPzogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIG5leHRDb21wb25lbnRDb2xvcj86IEJhY2tncm91bmRNb2RlbDtcclxuICAvKiogTGV0cyBhIGxhdW5jaGluZyBkaWFsb2cgKGUuZy4gdGhlIHZpZGVvLWNhbGwgcHJvZHVjdCBwaWNrZXIpIGNhcnJ5IG92ZXIgbmFtZS9waG9uZSBhbHJlYWR5IGNvbGxlY3RlZCwgc28gdGhlIGN1c3RvbWVyIGlzbid0IGFza2VkIHR3aWNlLiAqL1xyXG4gIEBJbnB1dCgpIHByZWZpbGxDb250YWN0PzogeyBuYW1lPzogc3RyaW5nLCBwaG9uZU51bWJlcj86IHN0cmluZyB9O1xyXG4gIHN0eWxlcz86IEJhbm5lclN0eWxlc01vZGVsO1xyXG5cclxuICAvKiogRWRpdG9yLWNvbmZpZ3VyYWJsZSBiYWNrZ3JvdW5kIC0gZmFsbHMgYmFjayB0byB1bmRlZmluZWQgKGxldHRpbmcgdGhlIGNvbXBvbmVudCdzIG93biBDU1NcclxuICAgKiBkZWZhdWx0cyBzaG93IHRocm91Z2ggdW5jaGFuZ2VkKSBmb3IgZXhpc3RpbmcgcGFnZXMgc2F2ZWQgYmVmb3JlIHRoaXMgc2VjdGlvbiBzdXBwb3J0ZWRcclxuICAgKiBjdXN0b20gY29sb3JzLiAqL1xyXG4gIGdldCBiYWNrZ3JvdW5kSW5mbygpOiBCYWNrZ3JvdW5kTW9kZWwgfCB1bmRlZmluZWQge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kO1xyXG4gIH1cclxuICAvKiogT3ZlcnJpZGVzIHRoaXMgY29tcG9uZW50J3Mgb3duIC0tY29sb3ItYWNjZW50LWdyYWRpZW50IENTUyB2YXJpYWJsZSAoc2NvcGVkIHRvIGl0cyA6aG9zdCxcclxuICAgKiBzZWUgYXBwb2ludG1lbnQtYm9va2luZy5jb21wb25lbnQuY3NzKSB3aGVuIGEgYnVzaW5lc3MgaGFzIHBpY2tlZCBhIGN1c3RvbSBhY2NlbnQgY29sb3IgLVxyXG4gICAqIG51bGwgd2hlbiB1bnNldCwgc28gdGhlIFtzdHlsZS4tLWNvbG9yLWFjY2VudC1ncmFkaWVudF0gYmluZGluZyByZW1vdmVzIHRoZSBpbmxpbmUgb3ZlcnJpZGVcclxuICAgKiBlbnRpcmVseSBhbmQgdGhlIENTUyBkZWZhdWx0IHNob3dzIHRocm91Z2gsIHJhdGhlciB0aGFuIGZvcmNpbmcgYW4gZW1wdHkgdmFsdWUuICovXHJcbiAgZ2V0IGFjY2VudENvbG9yKCk6IHN0cmluZyB8IG51bGwge1xyXG4gICAgcmV0dXJuIHRoaXMuZGF0YT8uc3R5bGVzPy5iYWNrZ3JvdW5kPy5hY2NlbnRDb2xvciB8fCBudWxsO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhvbWVWaXNpdENoYXJnZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuc2VsZWN0ZWRNb2RlID09PSAnSE9NRV9WSVNJVCcgPyAodGhpcy5idXNpbmVzc1NldHRpbmdzPy5ob21lVmlzaXRDaGFyZ2UgPz8gMCkgOiAwO1xyXG4gIH1cclxuICAvKiogUHJpY2UgZm9yIG9uZSByZXNvbHZlZC1saW5lIHNlcnZpY2UsIGxvb2tlZCB1cCBmcm9tIGBjYXJ0U2VydmljZXNgICh0aGUgc2VydmljZS1saXN0aW5nXHJcbiAgICogc2VsZWN0aW9uLCB3aGljaCBjYXJyaWVzIGBwcmljZURldGFpbHNgKSBzaW5jZSBgcmVzb2x2ZWRMaW5lc1tdLnNlcnZpY2VzYCBvbmx5IGNhcnJpZXMgaWQrbmFtZVxyXG4gICAqIGJhY2sgZnJvbSB0aGUgc2xvdC1yZXNvbHV0aW9uIEFQSS4gKi9cclxuICBzZXJ2aWNlUHJpY2Uoc2VydmljZUlkOiBzdHJpbmcpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuY2FydFNlcnZpY2VzLmZpbmQoKHM6IGFueSkgPT4gcy5zZXJ2aWNlSWQgPT09IHNlcnZpY2VJZCk/LnByaWNlRGV0YWlscz8ucHJpY2UgPz8gMDtcclxuICB9XHJcbiAgbGluZVNlcnZpY2VUb3RhbChsaW5lOiBSZXNvbHZlZExpbmUpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIChsaW5lLnNlcnZpY2VzIHx8IFtdKS5yZWR1Y2UoKHN1bTogbnVtYmVyLCBzOiBhbnkpID0+IHN1bSArIHRoaXMuc2VydmljZVByaWNlKHMuaWQpLCAwKTtcclxuICB9XHJcbiAgZ2V0IHNlcnZpY2VzU3VidG90YWwoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnJlc29sdmVkTGluZXMucmVkdWNlKChzdW06IG51bWJlciwgbDogUmVzb2x2ZWRMaW5lKSA9PiBzdW0gKyB0aGlzLmxpbmVTZXJ2aWNlVG90YWwobCksIDApO1xyXG4gIH1cclxuICBnZXQgcmV2aWV3VG90YWwoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLnNlcnZpY2VzU3VidG90YWwgKyB0aGlzLmhvbWVWaXNpdENoYXJnZTtcclxuICB9XHJcbiAgZ2V0IGJvb2tpbmdUb3RhbCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuICh0aGlzLmJvb2tpbmdHcm91cD8udG90YWxQYXlhYmxlID8/IDApICsgKHRoaXMuYm9va2luZ0dyb3VwPy5ob21lVmlzaXRDaGFyZ2UgPz8gMCk7XHJcbiAgfVxyXG4gIGdldCBib29raW5nUGFpZCgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIHRoaXMuYm9va2luZ0dyb3VwPy50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA/PyAwO1xyXG4gIH1cclxuICBnZXQgYm9va2luZ0R1ZSgpOiBudW1iZXIge1xyXG4gICAgcmV0dXJuIE1hdGgubWF4KDAsIHRoaXMuYm9va2luZ1RvdGFsIC0gdGhpcy5ib29raW5nUGFpZCk7XHJcbiAgfVxyXG5cclxuICBsb2FkQnVzaW5lc3NTZXR0aW5ncygpIHtcclxuICAgIGlmICghdGhpcy5idXNpbmVzc0lkKSByZXR1cm47XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEJ1c2luZXNzQXBwb2ludG1lbnRTZXR0aW5ncyh0aGlzLmJ1c2luZXNzSWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgdGhpcy5idXNpbmVzc1NldHRpbmdzID0gcmVzO1xyXG4gICAgfSwgKCkgPT4ge1xyXG4gICAgICAvLyBOb24tZmF0YWwgLSB0aGUgcmV2aWV3IHN0ZXAganVzdCB3b24ndCBwcmV2aWV3IGEgaG9tZSB2aXNpdCBjaGFyZ2UgYW1vdW50LlxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIC8vIExvZ2luIGlzIHJlcXVpcmVkIGJlZm9yZSBlbnRlcmluZyB0aGUgd2l6YXJkIGF0IGFsbCAobm90IG1pZC1mbG93LCBsaWtlIGNhcnQnc1xyXG4gICAgLy8gY2hlY2tvdXQtY29tbWl0IGdhdGUpIC0gdGhlIHdpemFyZCdzIHNlbGVjdGlvbnMgbGl2ZSBvbmx5IGluIGNvbXBvbmVudCBtZW1vcnksIHNvIGFcclxuICAgIC8vIHJlZGlyZWN0LWFuZC1iYWNrIHBhcnR3YXkgdGhyb3VnaCB3b3VsZCBzaWxlbnRseSB3aXBlIHdoYXRldmVyIHRoZSBjdXN0b21lciBoYWQgYWxyZWFkeVxyXG4gICAgLy8gcGlja2VkLiBDaGVja2luZyBoZXJlLCBiZWZvcmUgYW55dGhpbmcgaXMgcGlja2VkLCBtZWFucyB0aGVyZSdzIG5vdGhpbmcgdG8gbG9zZS4gU2tpcHBlZFxyXG4gICAgLy8gaW4gYnVpbGRlciBlZGl0L3ByZXZpZXcgbW9kZSAoYGVkaXRgIGlzIHRydWUgd2hlbiBhIGJ1c2luZXNzIG93bmVyIGlzIGVkaXRpbmcgdGhlaXIgc2l0ZSxcclxuICAgIC8vIG5vdCBhIHJlYWwgY3VzdG9tZXIgc2Vzc2lvbikgLSB0aGUgc2FtZSBndWFyZCBwYXR0ZXJuIHVzZWQgZWxzZXdoZXJlIGluIHRoaXMgY29kZWJhc2VcclxuICAgIC8vIChlLmcuIEF1dGhlbnRpY2F0aW9uUmVxdWlyZWRDb21wb25lbnQncyBvd24gc3VibWl0IGhhbmRsZXJzKS5cclxuICAgIGlmICghdGhpcy5lZGl0ICYmICF0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSkge1xyXG4gICAgICB0aGlzLmRpYWxvZ1JlZj8uY2xvc2UoKTtcclxuICAgICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycvbG9naW4nXSwgeyBxdWVyeVBhcmFtczogeyByZWRpcmVjdFRvOiB0aGlzLnJvdXRlci51cmwgfSB9KTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5nZXRTY3JlZW5TaXplKCk7XHJcbiAgICAvLyBQcmVmaWxsIENvbnRhY3QgRGV0YWlscyBmcm9tIHRoZSBsb2dnZWQtaW4gY3VzdG9tZXIncyBvd24gYWNjb3VudCAobmFtZS9lbWFpbC9waG9uZSBzdGF5XHJcbiAgICAvLyBlZGl0YWJsZSwgZS5nLiBmb3IgYm9va2luZyBvbiBiZWhhbGYgb2Ygc29tZW9uZSBlbHNlKSBpbnN0ZWFkIG9mIGFsd2F5cyBzaG93aW5nIGEgYmxhbmtcclxuICAgIC8vIGZvcm0gLSBtYXRjaGVzIEJvb2tBcHBvaW50bWVudENvbXBvbmVudCdzIHBhdHRlcm4uIFNraXBwZWQgZW50aXJlbHkgZm9yIGlzQWRtaW5Cb29raW5nOlxyXG4gICAgLy8gc3RhZmYgYXJlbid0IGxvZ2dlZCBpbiBhcyB0aGUgY3VzdG9tZXIgdGhleSdyZSBib29raW5nIGZvciwgc28gdGhlcmUncyBubyBhY2NvdW50IGhlcmUgdG9cclxuICAgIC8vIHJlYWQgLSBsZWF2ZSB0aGUgZm9ybSBibGFuayBmb3IgbWFudWFsIGVudHJ5LCBzYW1lIGFzIGJlZm9yZSB0aGlzIHByZWZpbGwgZXhpc3RlZC5cclxuICAgIGlmICghdGhpcy5pc0FkbWluQm9va2luZykge1xyXG4gICAgICB0aGlzLnVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcjtcclxuICAgICAgaWYgKHRoaXMudXNlckRldGFpbHM/LmNvbnRhY3QpIHtcclxuICAgICAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5uYW1lID0gdGhpcy51c2VyRGV0YWlscy5jb250YWN0Lm5hbWUgPz8gJyc7XHJcbiAgICAgICAgdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIgPSB0aGlzLnVzZXJEZXRhaWxzLmNvbnRhY3QubW9iaWxlID8/ICcnO1xyXG4gICAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsID0gdGhpcy51c2VyRGV0YWlscy5jb250YWN0LmVtYWlsID8/ICcnO1xyXG4gICAgICB9XHJcbiAgICAgIHRoaXMucmVmcmVzaERlZmF1bHRBZGRyZXNzKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5wcmVmaWxsQ29udGFjdCkge1xyXG4gICAgICB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5uYW1lID0gdGhpcy5wcmVmaWxsQ29udGFjdC5uYW1lID8/IHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWU7XHJcbiAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLnBob25lTnVtYmVyID0gdGhpcy5wcmVmaWxsQ29udGFjdC5waG9uZU51bWJlciA/PyB0aGlzLmFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlcjtcclxuICAgIH1cclxuICAgIC8vIFJldXNlZCBieSBnb0JhY2soKSBhbmQgYnkgdGhlIGRvbmUtc2NyZWVuJ3MgYWRtaW4tdnMtd2Vic2l0ZSBidXR0b24gYnJhbmNoIC0gdGhlIGFkbWluXHJcbiAgICAvLyBwYW5lbCBsb2FkcyB0aGlzIGNvbXBvbmVudCB2aWEgVmlld0NvbnRhaW5lclJlZiAobm90IGEgcm91dGUpLCBzbyBpdCBjYW4ndCBiZSB0b2xkIGFwYXJ0XHJcbiAgICAvLyBmcm9tIHRoZSBsaXZlIHdlYnNpdGUgYnkgVVJMOyBSRVFVRVNUX0ZST00gaXMgdGhlIGV4aXN0aW5nIGZsYWcgdGhlIGFkbWluIHNoZWxsIGFscmVhZHlcclxuICAgIC8vIHNldHMgZm9yIHRoaXMgcHVycG9zZS5cclxuICAgIHRoaXMuaXNBZG1pbkNvbnRleHQgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShcIlJFUVVFU1RfRlJPTVwiKSA9PT0gJ0VDT01NRVJDRSc7XHJcbiAgICB0aGlzLnJlc2V0V2l6YXJkKCk7XHJcbiAgICB0aGlzLmxvYWRCdXNpbmVzc1NldHRpbmdzKCk7XHJcbiAgfVxyXG5cclxuICBpc0FkbWluQ29udGV4dDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBSZXN0b3JlcyB0aGUgd2l6YXJkIHRvIGl0cyBzdGFydCBzdGF0ZSAtIHVzZWQgZm9yIGluaXRpYWwgbG9hZCAobmdPbkluaXQpIGFuZCBmb3IgXCJCb29rXHJcbiAgLy8gQW5vdGhlclwiIG9uIHRoZSBkb25lIHNjcmVlbiwgc28gYSBzZWNvbmQgYm9va2luZyBkb2Vzbid0IGluaGVyaXQgdGhlIHByZXZpb3VzIG9uZSdzXHJcbiAgLy8gc2VydmljZXMvc2xvdC9hZGRyZXNzIHNlbGVjdGlvbnMuXHJcbiAgcmVzZXRXaXphcmQoKSB7XHJcbiAgICB0aGlzLmNhcnRTZXJ2aWNlcyA9IFtdO1xyXG4gICAgdGhpcy5yZXNvbHZlZExpbmVzID0gW107XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBudWxsO1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGVTdHIgPSAnJztcclxuICAgIHRoaXMuYm9va2luZ0dyb3VwID0gbnVsbDtcclxuICAgIHRoaXMuYXBpU3RhdHVzID0gZmFsc2U7XHJcbiAgICB0aGlzLmluc3RydWN0aW9ucyA9ICcnO1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcclxuICAgIHRoaXMuYWNjZXNzZWRUYWJzID0geyBzZXJ2aWNlTGlzdGluZzogZmFsc2UsIGxvY2F0aW9uTGlzdGluZzogZmFsc2UsIHN0YWZmTGlzdGluZzogZmFsc2UgfTtcclxuXHJcbiAgICAvLyBBIGJ1c2luZXNzIGNhbiBwaW4gdGhpcyBzZWN0aW9uIHRvIG9uZSBtb2RlIHZpYSBzYXZlZCBjb250ZW50IGNvbmZpZy4gVGhlcmUncyBubyBlZGl0b3JcclxuICAgIC8vIFVJIHlldCB0byBzZXQgdGhpcyBmaWVsZCAodGhlIHNlY3Rpb24gY29udGVudC1lZGl0b3IgZG9lc24ndCBoYXZlIGEgbW9kZSBwaWNrZXIgYnVpbHQpIC1cclxuICAgIC8vIHJlYWRpbmcgaXQgaGVyZSBqdXN0IGtlZXBzIHRoZSBjb21wb25lbnQgZm9yd2FyZC1jb21wYXRpYmxlIG9uY2Ugb25lIGV4aXN0cy5cclxuICAgIGNvbnN0IHBpbm5lZE1vZGUgPSAodGhpcy5kYXRhPy5jb250ZW50IGFzIGFueSk/Lm1vZGU7XHJcbiAgICBpZiAocGlubmVkTW9kZSA9PT0gJ1NUT1JFX1ZJU0lUJyB8fCBwaW5uZWRNb2RlID09PSAnSE9NRV9WSVNJVCcgfHwgcGlubmVkTW9kZSA9PT0gJ1ZJREVPX0NBTEwnKSB7XHJcbiAgICAgIHRoaXMubW9kZVBpbm5lZCA9IHRydWU7XHJcbiAgICAgIHRoaXMuc2VsZWN0TW9kZShwaW5uZWRNb2RlKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbW9kZVNlbGVjdGlvbic7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTAnO1xyXG4gICAgfVxyXG4gIH1cclxuICBzY3JlZW5XaWR0aDogbnVtYmVyID0gMDtcclxuICBASG9zdExpc3RlbmVyKFwid2luZG93OiByZXNpemVcIiwgW1wiJGV2ZW50XCJdKVxyXG4gIGdldFNjcmVlblNpemUoKSB7XHJcbiAgICB0aGlzLnNjcmVlbldpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XHJcbiAgfVxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJylcclxuICBjbG9zZU9uT3V0c2lkZUNsaWNrKCkge1xyXG4gICAgdGhpcy5zaG93Q2FsZW5kYXIgPSBmYWxzZTtcclxuICB9XHJcbiAgYWNjZXNzZWRUYWJzID0ge1xyXG4gICAgc2VydmljZUxpc3Rpbmc6IGZhbHNlLFxyXG4gICAgbG9jYXRpb25MaXN0aW5nOiBmYWxzZSxcclxuICAgIHN0YWZmTGlzdGluZzogZmFsc2VcclxuICB9XHJcbiAgc2tlbGV0b25Mb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBidXNpbmVzc05hbWUgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NOYW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NOYW1lJykgOiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2JOYW1lJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYk5hbWUnKSA6ICcnKTtcclxuICBidXNpbmVzc0lkOiBhbnkgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYnVzaW5lc3NJZCcpID8gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2J1c2luZXNzSWQnKSA6IChsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgPyBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnYklkJykgOiAnJyk7XHJcbiAgYWN0aXZlQnV0dG9uOiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2VsZWN0ZWRUYWI6IHN0cmluZyA9ICcnO1xyXG4gIGJhcldpZHRoOiBzdHJpbmcgPSAnJztcclxuICBzaG93Q2FuY2VsbGF0aW9uUG9saWN5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgc2hvd1JlZHVjaW5nUG9saWN5OiBib29sZWFuID0gZmFsc2U7XHJcbiAgYnVzaW5lc3NTZXR0aW5nczogYW55ID0gbnVsbDtcclxuXHJcbiAgc2VsZWN0ZWRNb2RlOiBCb29raW5nTW9kZSA9ICdTVE9SRV9WSVNJVCc7XHJcbiAgbW9kZVBpbm5lZDogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBDYXJ0IG9mIHNlcnZpY2VzIHBpY2tlZCBpbiBzZXJ2aWNlTGlzdGluZyAtIGNsaWNraW5nIGEgY2FyZCB0b2dnbGVzIG1lbWJlcnNoaXAuIFRoaXMgaXMgYVxyXG4gIC8vIHN0cmFpZ2h0Zm9yd2FyZCBzdXBlcnNldCBvZiB0aGUgb2xkIHNpbmdsZS1zZWxlY3RlZFNlcnZpY2UgYmVoYXZpb3I6IHdpdGggZXhhY3RseSBvbmVcclxuICAvLyBzZXJ2aWNlIGNsaWNrZWQgaXQncyB0aGUgZXhhY3Qgc2FtZSAyLWNsaWNrIChzZWxlY3QsIGNvbnRpbnVlKSBmbG93IGFzIGJlZm9yZS5cclxuICBjYXJ0U2VydmljZXM6IGFueVtdID0gW107XHJcbiAgcmVzb2x2ZWRMaW5lczogUmVzb2x2ZWRMaW5lW10gPSBbXTtcclxuICByZXNvbHZpbmdDYXJ0OiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gIC8vIFByb2R1Y3RzIGFkZGVkIHRvIHRoZSBjYXJ0IGJlZm9yZSBlbnRlcmluZyB0aGUgd2l6YXJkIChlLmcuIFwiVHJ5IGF0IEhvbWVcIiBvbiBhIHByb2R1Y3RcclxuICAvLyBwYWdlKSAtIGxvYWRlZCBmcm9tIHRoZSBsb2NhbCBib29raW5nLXByb2R1Y3QtY2FydCBvbmNlIHRoZSBtb2RlIGlzIGtub3duLlxyXG4gIHByb2R1Y3RDYXJ0SXRlbXM6IGFueVtdID0gW107XHJcblxyXG4gIHNlbGVjdGVkTG9jYXRpb246IGFueTtcclxuICAvLyBUaGUgbG9nZ2VkLWluIGN1c3RvbWVyJ3MgcmVhbCBhY2NvdW50IC0gc2FtZSBzb3VyY2UgQWRkcmVzc0NvbXBvbmVudC9BZGRyZXNzTGlzdENvbXBvbmVudFxyXG4gIC8vIHVzZWQgYXQgcHJvZHVjdC1wdXJjaGFzZSBjaGVja291dCBhbmQgaW4gQm9va0FwcG9pbnRtZW50Q29tcG9uZW50LCBpbnN0ZWFkIG9mIGEgdHlwZWQtaW5cclxuICAvLyBhZGRyZXNzIGZvcm0uIE5vdCB1c2VkIGZvciBpc0FkbWluQm9va2luZywgd2hpY2ggaGFzIG5vIGxvZ2dlZC1pbiBjdXN0b21lciBhY2NvdW50IHRvIHJlYWQgLVxyXG4gIC8vIHNlZSBob21lVmlzaXRBZGRyZXNzIGJlbG93IGZvciB0aGF0IGNhc2UuXHJcbiAgdXNlckRldGFpbHM6IFVzZXIgfCBudWxsID0gbnVsbDtcclxuICBkZWZhdWx0QWRkcmVzczogQWRkcmVzc0RldGFpbHMgfCBudWxsID0gbnVsbDtcclxuICAvLyBNYW51YWwgZW50cnksIHVzZWQgb25seSBmb3IgaXNBZG1pbkJvb2tpbmcgLSBzdGFmZiB0eXBpbmcgYW4gYWRkcmVzcyBvbiB0aGUgY3VzdG9tZXInc1xyXG4gIC8vIGJlaGFsZiwgd2l0aCBubyBhY2NvdW50L3NhdmVkLWFkZHJlc3MtYm9vayB0byBzZWxlY3QgZnJvbS5cclxuICBob21lVmlzaXRBZGRyZXNzOiBhbnkgPSB7IHJlY2VpdmVyTmFtZTogJycsIHJlY2VpdmVyUGhvbmU6ICcnLCBhZGRyZXNzTGluZTE6ICcnLCBhZGRyZXNzTGluZTI6ICcnLCBjaXR5OiAnJywgc3RhdGU6ICcnLCB6aXBDb2RlOiAnJyB9O1xyXG4gIGluc3RydWN0aW9uczogc3RyaW5nID0gJyc7XHJcbiAgT2JqZWN0ID0gT2JqZWN0O1xyXG4gIHNob3dDYWxlbmRhciA9IGZhbHNlO1xyXG4gIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IG51bGwgPSBudWxsO1xyXG4gIHNlbGVjdGVkRGF0ZVN0ciA9ICcnO1xyXG5cclxuICBib29raW5nR3JvdXA6IGFueSA9IG51bGw7XHJcblxyXG4gIGRhdGVGaWx0ZXIgPSAoZDogRGF0ZSB8IG51bGwpOiBib29sZWFuID0+IHtcclxuICAgIGNvbnN0IGRhdGUgPSAoZCB8fCBuZXcgRGF0ZSgpKTtcclxuICAgIGNvbnN0IHRvZGF5ID0gbmV3IERhdGUoKTtcclxuICAgIHRvZGF5LnNldEhvdXJzKDAsIDAsIDAsIDApO1xyXG4gICAgcmV0dXJuIGRhdGUuZ2V0VGltZSgpID49IHRvZGF5LmdldFRpbWUoKTtcclxuICB9XHJcbiAgdG9nZ2xlQ2FsZW5kYXIoZXZlbnQ/OiBFdmVudCkge1xyXG4gICAgaWYgKGV2ZW50KSBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIHRoaXMuc2hvd0NhbGVuZGFyID0gIXRoaXMuc2hvd0NhbGVuZGFyO1xyXG4gIH1cclxuXHJcbiAgb25EYXRlU2VsZWN0ZWQoZGF0ZTogYW55KSB7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IGZhbHNlO1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGUgPSBkYXRlO1xyXG4gICAgdGhpcy5zZWxlY3RlZERhdGVTdHIgPSB0aGlzLmZvcm1hdERhdGUoZGF0ZSk7XHJcbiAgICB0aGlzLnNob3dDYWxlbmRhciA9IGZhbHNlO1xyXG4gICAgdGhpcy5yZXNvbHZlQ2FydCgpO1xyXG4gIH1cclxuICBwcml2YXRlIGZvcm1hdERhdGUoZDogRGF0ZSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBkZCA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IG1tID0gU3RyaW5nKGQuZ2V0TW9udGgoKSArIDEpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICBjb25zdCB5eXl5ID0gZC5nZXRGdWxsWWVhcigpO1xyXG4gICAgcmV0dXJuIGAke2RkfS0ke21tfS0ke3l5eXl9YDtcclxuICB9XHJcbiAgcHJpdmF0ZSB0b0lzb0RhdGUoZDogRGF0ZSB8IG51bGwpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGF0ZSA9IGQgPz8gbmV3IERhdGUoKTtcclxuICAgIGNvbnN0IHl5eXkgPSBkYXRlLmdldEZ1bGxZZWFyKCk7XHJcbiAgICBjb25zdCBtbSA9IFN0cmluZyhkYXRlLmdldE1vbnRoKCkgKyAxKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgZGQgPSBTdHJpbmcoZGF0ZS5nZXREYXRlKCkpLnBhZFN0YXJ0KDIsICcwJyk7XHJcbiAgICByZXR1cm4gYCR7eXl5eX0tJHttbX0tJHtkZH1UMDA6MDA6MDAuMDAwWmA7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RNb2RlKG1vZGU6IEJvb2tpbmdNb2RlKSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9kZSA9IG1vZGU7XHJcbiAgICB0aGlzLmxvYWRQcm9kdWN0Q2FydEZvck1vZGUoKTtcclxuICAgIHRoaXMuZ2V0QWxsU2VydmljZXMoKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGxvYWRQcm9kdWN0Q2FydEZvck1vZGUoKSB7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcpIHtcclxuICAgICAgdGhpcy5wcm9kdWN0Q2FydEl0ZW1zID0gW107XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMucHJvZHVjdENhcnRJdGVtcyA9IGF3YWl0IHRoaXMuYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZS5nZXRJdGVtcyh0aGlzLnNlbGVjdGVkTW9kZSBhcyBCb29raW5nQ2FydE1vZGUpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U2VydmljZShzZXJ2aWNlOiBhbnkpIHtcclxuICAgIGNvbnN0IGlkeCA9IHRoaXMuY2FydFNlcnZpY2VzLmZpbmRJbmRleCgoczogYW55KSA9PiBzLnNlcnZpY2VJZCA9PT0gc2VydmljZS5zZXJ2aWNlSWQpO1xyXG4gICAgaWYgKGlkeCA+PSAwKSB7XHJcbiAgICAgIHRoaXMuY2FydFNlcnZpY2VzLnNwbGljZShpZHgsIDEpO1xyXG4gICAgICBzZXJ2aWNlLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNhcnRTZXJ2aWNlcy5wdXNoKHNlcnZpY2UpO1xyXG4gICAgICBzZXJ2aWNlLnNlbGVjdGVkID0gdHJ1ZTtcclxuICAgIH1cclxuICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdGhpcy5jYXJ0U2VydmljZXMubGVuZ3RoID4gMCB8fCB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMDtcclxuICB9XHJcbiAgc2VsZWN0TG9jYXRpb24obG9jYXRpb246IGFueSkge1xyXG4gICAgbG9jYXRpb24uc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRMb2NhdGlvbiAmJiBsb2NhdGlvbi5pZCAhPSB0aGlzLnNlbGVjdGVkTG9jYXRpb24uaWQpIHtcclxuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uLnNlbGVjdGVkID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkTG9jYXRpb24gPSBsb2NhdGlvbjtcclxuICB9XHJcblxyXG4gIG5leHRTdGVwKCkge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY2Nlc3NlZFRhYnMuc2VydmljZUxpc3RpbmcgPSB0cnVlO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcpIHtcclxuICAgICAgICB0aGlzLmdldEFsbExvY2F0aW9ucygpO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZ29Ub0RhdGVTZWxlY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5nb1RvRGF0ZVNlbGVjdGlvbigpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3N0YWZmTGlzdGluZycpIHtcclxuICAgICAgdGhpcy5hY2Nlc3NlZFRhYnMuc3RhZmZMaXN0aW5nID0gdHJ1ZTtcclxuICAgICAgdGhpcy5mZXRjaEFsbExpbmVTbG90cygpO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ2RhdGVTZWxlY3Rpb24nKSB7XHJcbiAgICAgIHRoaXMuY2hlY2tSZXF1aXJlZFZhbHVlcygpO1xyXG4gICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2NvbnRhY3REZXRhaWxzJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICc3MC41NydcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdjb250YWN0RGV0YWlscycpIHtcclxuICAgICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsdWVzKCk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAncGF5bWVudFRhYic7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnODUuNTcnXHJcbiAgICB9XHJcbiAgfVxyXG4gIHByZXZpb3VzU3RlcCgpIHtcclxuICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ21vZGVTZWxlY3Rpb24nKSByZXR1cm47XHJcbiAgICBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3NlcnZpY2VMaXN0aW5nJykge1xyXG4gICAgICBpZiAoIXRoaXMubW9kZVBpbm5lZCkge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnbW9kZVNlbGVjdGlvbic7XHJcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxMCc7XHJcbiAgICAgIH1cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0cnVlO1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdsb2NhdGlvbkxpc3RpbmcnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICB0aGlzLmJhcldpZHRoID0gJzE0LjI4JztcclxuICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gbnVsbDtcclxuICAgIH1cclxuICAgIGVsc2UgaWYgKHRoaXMuc2VsZWN0ZWRUYWIgPT09ICdzdGFmZkxpc3RpbmcnKSB7XHJcbiAgICAgIHRoaXMucmVzb2x2ZWRMaW5lcy5mb3JFYWNoKChsOiBSZXNvbHZlZExpbmUpID0+IHsgbC5zZWxlY3RlZFN0YWZmSWQgPSB1bmRlZmluZWQ7IGwuc2VsZWN0ZWRTdGFmZk5hbWUgPSB1bmRlZmluZWQ7IH0pO1xyXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMjkuMjgnO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnZGF0ZVNlbGVjdGlvbicpIHtcclxuICAgICAgY29uc3QgbmVlZHNTdGFmZlBpY2sgPSB0aGlzLnJlc29sdmVkTGluZXMuc29tZSgobDogUmVzb2x2ZWRMaW5lKSA9PiAhIWwuY2FuZGlkYXRlU3RhZmZQb29sPy5sZW5ndGgpO1xyXG4gICAgICBpZiAobmVlZHNTdGFmZlBpY2spIHtcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XHJcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XHJcbiAgICAgIH1cclxuICAgICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nKSB7XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMjkuMjgnO1xyXG4gICAgICB9XHJcbiAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc2VydmljZUxpc3RpbmcnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTQuMjgnO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBlbHNlIGlmICh0aGlzLnNlbGVjdGVkVGFiID09PSAnY29udGFjdERldGFpbHMnKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnZGF0ZVNlbGVjdGlvbic7XHJcbiAgICAgIHRoaXMuYmFyV2lkdGggPSAnNTguNTcnO1xyXG4gICAgfVxyXG4gICAgZWxzZSBpZiAodGhpcy5zZWxlY3RlZFRhYiA9PT0gJ3BheW1lbnRUYWInKSB7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnY29udGFjdERldGFpbHMnO1xyXG4gICAgICB0aGlzLmJhcldpZHRoID0gJzcwLjU3JztcclxuICAgIH1cclxuICB9XHJcbiAgc2VydmljZURhdGE6IGFueVtdID0gW107XHJcbiAgZ2V0QWxsU2VydmljZXMoKSB7XHJcbiAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gdHJ1ZVxyXG4gICAgbGV0IHNlcnZpY2VQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyBcIlwiLFxyXG4gICAgICBwYWdlTm86IDAsXHJcbiAgICAgIHNpemU6IDEwMFxyXG4gICAgfVxyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxBcHBvaW50bWVudFNlcnZpY2Uoc2VydmljZVBheWxvYWQpLnN1YnNjcmliZShcclxuICAgICAgKHJlczogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIGxldCBzZXJ2aWNlcyA9IChyZXMuY29udGVudCB8fCBbXSkuZmlsdGVyKChzZXJ2aWNlOiBhbnkpID0+IHNlcnZpY2UuYWN0aXZlID09PSB0cnVlKTtcclxuICAgICAgICAvLyBhdmFpbGFibGVPbmxpbmUvaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlIGNvbnRyb2wgd2hhdCBhIGN1c3RvbWVyIGNhbiBzZWxmLXNlcnZlIGJvb2sgb25cclxuICAgICAgICAvLyB0aGUgbGl2ZSB3ZWJzaXRlIC0gdGhleSBkb24ndCBhcHBseSB3aGVuIGEgc3RhZmYgbWVtYmVyIGlzIGNyZWF0aW5nIGEgYm9va2luZyBvbiB0aGVcclxuICAgICAgICAvLyBjdXN0b21lcidzIGJlaGFsZiBmcm9tIHRoZSBhZG1pbiBwYW5lbC5cclxuICAgICAgICBpZiAoIXRoaXMuaXNBZG1pbkJvb2tpbmcpIHtcclxuICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZSA9PT0gJ0hPTUVfVklTSVQnKSBzZXJ2aWNlcyA9IHNlcnZpY2VzLmZpbHRlcigoczogYW55KSA9PiBzLmhvbWVBcHBvaW50bWVudEF2YWlsYWJsZSk7XHJcbiAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZE1vZGUgPT09ICdWSURFT19DQUxMJykgc2VydmljZXMgPSBzZXJ2aWNlcy5maWx0ZXIoKHM6IGFueSkgPT4gcy52aWRlb0NhbGxBdmFpbGFibGUpO1xyXG4gICAgICAgIH1cclxuICAgICAgICBzZXJ2aWNlcy5mb3JFYWNoKChzZXJ2aWNlOiBhbnkpID0+IHNlcnZpY2Uuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgICAgdGhpcy5zZXJ2aWNlRGF0YSA9IHNlcnZpY2VzO1xyXG4gICAgICAgIHRoaXMuY2FydFNlcnZpY2VzID0gW107XHJcbiAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdzZXJ2aWNlTGlzdGluZyc7XHJcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICcxNC4yOCc7XHJcbiAgICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMDtcclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICApO1xyXG4gIH1cclxuICBsb2NhdGlvbkRhdGE6IGFueVtdID0gW107XHJcbiAgZ2V0QWxsTG9jYXRpb25zKCkge1xyXG4gICAgdGhpcy5sb2FkZXIgPSB0cnVlO1xyXG4gICAgdGhpcy5sb2NhdGlvbkRhdGEgPSBbXTtcclxuICAgIGxldCBwYXlsb2FkID0geyBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQgPz8gXCJcIiB9XHJcbiAgICB0aGlzLnJlc3RTZXJ2aWNlLmdldEFsbFN0b3JlcyhwYXlsb2FkKS5zdWJzY3JpYmUoXHJcbiAgICAgIChyZXM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXMuZGF0YS5kYXRhLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgIGxldCBsb2NhdGlvbnMgPSByZXMuZGF0YS5kYXRhLmZpbHRlcigoc3RvcmU6IGFueSkgPT4geyByZXR1cm4gc3RvcmUuc3RhdHVzID09PSAnQUNUSVZFJyB9KTtcclxuICAgICAgICAgIC8vIExvY2F0aW9uLWludGVyc2VjdGlvbiBjaGVjayAoZGVzaWduIGRvYyDCpzJjKTogb25seSBvZmZlciBzdG9yZXMgdGhhdCBjYXJyeSBldmVyeVxyXG4gICAgICAgICAgLy8gc2VydmljZSBjdXJyZW50bHkgaW4gdGhlIGNhcnQsIG5vdCBqdXN0IHRoZSBmaXJzdCBvbmUuXHJcbiAgICAgICAgICBsb2NhdGlvbnMgPSBsb2NhdGlvbnMuZmlsdGVyKChsb2NhdGlvbjogYW55KSA9PlxyXG4gICAgICAgICAgICB0aGlzLmNhcnRTZXJ2aWNlcy5ldmVyeSgoczogYW55KSA9PiBzLnN0b3JlSWRzPy5pbmNsdWRlcyhsb2NhdGlvbi5pZCkpXHJcbiAgICAgICAgICApO1xyXG4gICAgICAgICAgbG9jYXRpb25zLmZvckVhY2goKGw6IGFueSkgPT4gbC5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgICAgICAgIHRoaXMubG9jYXRpb25EYXRhID0gbG9jYXRpb25zO1xyXG4gICAgICAgICAgaWYgKHRoaXMubG9jYXRpb25EYXRhLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTm8gTG9jYXRpb24nLCBkZXRhaWw6ICdUaGVzZSBzZXJ2aWNlcyBhcmVuXFwndCBhbGwgYXZhaWxhYmxlIGF0IG9uZSBsb2NhdGlvbiAtIHJlbW92ZSBvbmUgYW5kIGJvb2sgaXQgc2VwYXJhdGVseScgfSk7XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIGlmICh0aGlzLmxvY2F0aW9uRGF0YS5sZW5ndGggPT09IDEpIHtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZExvY2F0aW9uID0gdGhpcy5sb2NhdGlvbkRhdGFbMF07XHJcbiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgICAgICAgIHRoaXMuYWNjZXNzZWRUYWJzLmxvY2F0aW9uTGlzdGluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICB0aGlzLmdvVG9EYXRlU2VsZWN0aW9uKCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdsb2NhdGlvbkxpc3RpbmcnO1xyXG4gICAgICAgICAgICB0aGlzLmJhcldpZHRoID0gJzI5LjI4JztcclxuICAgICAgICAgICAgdGhpcy5hY2Nlc3NlZFRhYnMubG9jYXRpb25MaXN0aW5nID0gdHJ1ZTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnTm8gTG9jYXRpb24nLCBkZXRhaWw6ICdObyBMb2NhdGlvbiBhZGRlZCBmb3Igc2VsZWN0ZWQgc2VydmljZScgfSk7XHJcbiAgICAgICAgICB0aGlzLmxvYWRlciA9IGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgKGVycm9yKSA9PiB7XHJcbiAgICAgICAgdGhpcy5sb2FkZXIgPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIGdvVG9EYXRlU2VsZWN0aW9uKCkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRhYiA9ICdkYXRlU2VsZWN0aW9uJztcclxuICAgIHRoaXMuYmFyV2lkdGggPSAnNDMuNTcnO1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcclxuICAgIHRoaXMucmVzb2x2ZWRMaW5lcyA9IFtdO1xyXG4gIH1cclxuXHJcbiAgc3RhZmZTZWFyY2hRdWVyeTogc3RyaW5nID0gJyc7XHJcbiAgZ2V0IGZpbHRlcmVkU3RhZmYoKTogYW55W10ge1xyXG4gICAgaWYgKCF0aGlzLnN0YWZmU2VhcmNoUXVlcnkudHJpbSgpKSB7XHJcbiAgICAgIHJldHVybiB0aGlzLnN0YWZmRGF0YTtcclxuICAgIH1cclxuICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5zdGFmZlNlYXJjaFF1ZXJ5LnRvTG93ZXJDYXNlKCkudHJpbSgpO1xyXG4gICAgcmV0dXJuIHRoaXMuc3RhZmZEYXRhLmZpbHRlcihzdGFmZiA9PlxyXG4gICAgICBzdGFmZj8uc3RhZmZOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHF1ZXJ5KVxyXG4gICAgKTtcclxuICB9XHJcbiAgc3RhZmZEYXRhOiBhbnlbXSA9IFtdO1xyXG5cclxuICByZXNvbHZlQ2FydCgpIHtcclxuICAgIGlmICh0aGlzLmNhcnRTZXJ2aWNlcy5sZW5ndGggPT09IDApIHtcclxuICAgICAgLy8gUHVyZSBwcm9kdWN0LW9ubHkgbGluZSAoSG9tZSBWaXNpdCAvIFZpZGVvIENhbGwgd2l0aCBubyBzZXJ2aWNlcyBhdHRhY2hlZCkgLSByZXNvbHV0aW9uXHJcbiAgICAgIC8vIGlzIGJ1aWx0IGFyb3VuZCBzZXJ2aWNlIHBvb2xzLCBzbyB0aGlzIG5lZWRzIGFuIGV4cGxpY2l0IHN0YWZmIHBpY2sgaW5zdGVhZC4gT25lIGxpbmUsXHJcbiAgICAgIC8vIG5vIHNlcnZpY2VzLCBqdXN0IGEgc3RhZmYrdGltZSB0byBjYXJyeSB0aGUgZmxhdCBwcm9kdWN0LXZpZXdpbmcgYWxsb3dhbmNlLlxyXG4gICAgICB0aGlzLnJlc29sdmVkTGluZXMgPSBbeyBzZXJ2aWNlczogW10sIHRvdGFsRHVyYXRpb25NaW51dGVzOiAwLCBzbG90czogW10gfV07XHJcbiAgICAgIHRoaXMuZ2V0QWxsU3RhZmZGb3JQcm9kdWN0T25seUxpbmUoKTtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgdGhpcy5yZXNvbHZpbmdDYXJ0ID0gdHJ1ZTtcclxuICAgIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSB0cnVlO1xyXG4gICAgY29uc3QgcGF5bG9hZDogYW55ID0ge1xyXG4gICAgICBidXNpbmVzc0lkOiB0aGlzLmJ1c2luZXNzSWQsXHJcbiAgICAgIG1vZGU6IHRoaXMuc2VsZWN0ZWRNb2RlLFxyXG4gICAgICBzdG9yZUlkOiB0aGlzLnNlbGVjdGVkTW9kZSA9PT0gJ1NUT1JFX1ZJU0lUJyA/IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQgOiB1bmRlZmluZWQsXHJcbiAgICAgIGJvb2tpbmdEYXRlOiB0aGlzLnRvSXNvRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSksXHJcbiAgICAgIHNlcnZpY2VJdGVtczogdGhpcy5jYXJ0U2VydmljZXMubWFwKChzOiBhbnkpID0+ICh7IHNlcnZpY2VJZDogcy5zZXJ2aWNlSWQgfSkpXHJcbiAgICB9O1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5yZXNvbHZlQ2FydChwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMucmVzb2x2aW5nQ2FydCA9IGZhbHNlO1xyXG4gICAgICB0aGlzLnNrZWxldG9uTG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMucmVzb2x2ZWRMaW5lcyA9IChyZXMgfHwgW10pLm1hcCgobGluZTogYW55KSA9PiAoe1xyXG4gICAgICAgIHNlcnZpY2VzOiBsaW5lLnNlcnZpY2VzLFxyXG4gICAgICAgIHRvdGFsRHVyYXRpb25NaW51dGVzOiBsaW5lLnRvdGFsRHVyYXRpb25NaW51dGVzLFxyXG4gICAgICAgIHN0YWZmSWQ6IGxpbmUuc3RhZmZJZCxcclxuICAgICAgICBzdGFmZk5hbWU6IGxpbmUuc3RhZmZOYW1lLFxyXG4gICAgICAgIGNhbmRpZGF0ZVN0YWZmUG9vbDogbGluZS5jYW5kaWRhdGVTdGFmZlBvb2wsXHJcbiAgICAgICAgc2xvdHM6IFtdXHJcbiAgICAgIH0pKTtcclxuICAgICAgY29uc3QgbmVlZHNTdGFmZlBpY2sgPSB0aGlzLnJlc29sdmVkTGluZXMuc29tZSgobDogUmVzb2x2ZWRMaW5lKSA9PiAhIWwuY2FuZGlkYXRlU3RhZmZQb29sPy5sZW5ndGgpO1xyXG4gICAgICBpZiAobmVlZHNTdGFmZlBpY2spIHtcclxuICAgICAgICB0aGlzLnN0YWZmU2VhcmNoUXVlcnkgPSAnJztcclxuICAgICAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ3N0YWZmTGlzdGluZyc7XHJcbiAgICAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5mZXRjaEFsbExpbmVTbG90cygpO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLnJlc29sdmluZ0NhcnQgPSBmYWxzZTtcclxuICAgICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnVW5hYmxlIHRvIGNoZWNrIGF2YWlsYWJpbGl0eScsIGRldGFpbDogZXJyb3IuZXJyb3I/Lm1lc3NhZ2UgPz8gJ1BsZWFzZSB0cnkgYWdhaW4nIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRBbGxTdGFmZkZvclByb2R1Y3RPbmx5TGluZSgpIHtcclxuICAgIHRoaXMubG9hZGVyID0gdHJ1ZTtcclxuICAgIGNvbnN0IHBheWxvYWQgPSB7IHNlcnZpY2VJZDogJycsIHN0b3JlSWQ6IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQgPz8gJycsIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCA/PyAnJyB9O1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5nZXRBbGxTdGFmZihwYXlsb2FkKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMubG9hZGVyID0gZmFsc2U7XHJcbiAgICAgIHRoaXMuc3RhZmZEYXRhID0gKHJlcyB8fCBbXSkuZmlsdGVyKChzdGFmZjogYW55KSA9PlxyXG4gICAgICAgIHN0YWZmLmFjdGl2ZSA9PT0gdHJ1ZSAmJiBzdGFmZi5ib29raW5nQWxsb3dlZCAmJlxyXG4gICAgICAgICh0aGlzLnNlbGVjdGVkTW9kZSA9PT0gJ0hPTUVfVklTSVQnID8gc3RhZmYuaG9tZVZpc2l0Q2FwYWJsZSA6IHN0YWZmLnZpZGVvQ2FsbENhcGFibGUpKTtcclxuICAgICAgdGhpcy5zdGFmZkRhdGEuZm9yRWFjaCgoc3RhZmY6IGFueSkgPT4gc3RhZmYuc2VsZWN0ZWQgPSBmYWxzZSk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc3RhZmZMaXN0aW5nJztcclxuICAgICAgdGhpcy5iYXJXaWR0aCA9ICc0My41Nyc7XHJcbiAgICB9LCAoKSA9PiB7IHRoaXMubG9hZGVyID0gZmFsc2U7IH0pO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0U3RhZmZGb3JQcm9kdWN0T25seUxpbmUoc3RhZmY6IGFueSkge1xyXG4gICAgdGhpcy5zdGFmZkRhdGEuZm9yRWFjaCgoczogYW55KSA9PiBzLnNlbGVjdGVkID0gZmFsc2UpO1xyXG4gICAgc3RhZmYuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgdGhpcy5yZXNvbHZlZExpbmVzWzBdLnNlbGVjdGVkU3RhZmZJZCA9IHN0YWZmLnN0YWZmSWQ7XHJcbiAgICB0aGlzLnJlc29sdmVkTGluZXNbMF0uc2VsZWN0ZWRTdGFmZk5hbWUgPSBzdGFmZi5zdGFmZk5hbWU7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzZWxlY3RTdGFmZkZvckxpbmUobGluZTogUmVzb2x2ZWRMaW5lLCBzdGFmZjogYW55KSB7XHJcbiAgICBsaW5lLnNlbGVjdGVkU3RhZmZJZCA9IHN0YWZmLmlkO1xyXG4gICAgbGluZS5zZWxlY3RlZFN0YWZmTmFtZSA9IHN0YWZmLm5hbWU7XHJcbiAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMucmVzb2x2ZWRMaW5lcy5ldmVyeSgobDogUmVzb2x2ZWRMaW5lKSA9PiAhIShsLnN0YWZmSWQgfHwgbC5zZWxlY3RlZFN0YWZmSWQpKTtcclxuICB9XHJcblxyXG4gIGZldGNoQWxsTGluZVNsb3RzKCkge1xyXG4gICAgdGhpcy5za2VsZXRvbkxvYWRlciA9IHRydWU7XHJcbiAgICB0aGlzLnNlbGVjdGVkVGFiID0gJ2RhdGVTZWxlY3Rpb24nO1xyXG4gICAgdGhpcy5iYXJXaWR0aCA9ICc1OC41Nyc7XHJcbiAgICBsZXQgcGVuZGluZyA9IHRoaXMucmVzb2x2ZWRMaW5lcy5sZW5ndGg7XHJcbiAgICB0aGlzLnJlc29sdmVkTGluZXMuZm9yRWFjaCgobGluZTogUmVzb2x2ZWRMaW5lKSA9PiB7XHJcbiAgICAgIGNvbnN0IHN0YWZmSWQgPSBsaW5lLnN0YWZmSWQgfHwgbGluZS5zZWxlY3RlZFN0YWZmSWQ7XHJcbiAgICAgIGNvbnN0IHBheWxvYWQ6IGFueSA9IHtcclxuICAgICAgICBzdG9yZUlkOiB0aGlzLnNlbGVjdGVkTW9kZSA9PT0gJ1NUT1JFX1ZJU0lUJyA/IHRoaXMuc2VsZWN0ZWRMb2NhdGlvbj8uaWQgOiB1bmRlZmluZWQsXHJcbiAgICAgICAgc2VydmljZUlkczogbGluZS5zZXJ2aWNlcy5tYXAoKHM6IGFueSkgPT4gcy5pZCksXHJcbiAgICAgICAgYnVzaW5lc3NJZDogdGhpcy5idXNpbmVzc0lkLFxyXG4gICAgICAgIGJvb2tpbmdEYXRlOiB0aGlzLnRvSXNvRGF0ZSh0aGlzLnNlbGVjdGVkRGF0ZSksXHJcbiAgICAgICAgc3RhZmZJZCxcclxuICAgICAgICBtb2RlOiB0aGlzLnNlbGVjdGVkTW9kZVxyXG4gICAgICB9O1xyXG4gICAgICBsaW5lLnNsb3RzTG9hZGluZyA9IHRydWU7XHJcbiAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2V0Qm9va2luZ1Nsb3RzKHBheWxvYWQpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcclxuICAgICAgICBsaW5lLnNsb3RzID0gKHJlcyB8fCBbXSkubWFwKCh2OiBzdHJpbmcpID0+ICh7IHNlbGVjdGVkOiBmYWxzZSwgdmFsdWU6IHYgfSkpO1xyXG4gICAgICAgIGxpbmUuc2xvdHNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcGVuZGluZy0tO1xyXG4gICAgICAgIGlmIChwZW5kaW5nIDw9IDApIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZTtcclxuICAgICAgfSwgKCkgPT4ge1xyXG4gICAgICAgIGxpbmUuc2xvdHNMb2FkaW5nID0gZmFsc2U7XHJcbiAgICAgICAgcGVuZGluZy0tO1xyXG4gICAgICAgIGlmIChwZW5kaW5nIDw9IDApIHRoaXMuc2tlbGV0b25Mb2FkZXIgPSBmYWxzZTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdFNsb3RGb3JMaW5lKGxpbmU6IFJlc29sdmVkTGluZSwgc2xvdDogYW55KSB7XHJcbiAgICBsaW5lLnNsb3RzLmZvckVhY2goKHM6IGFueSkgPT4gcy5zZWxlY3RlZCA9IGZhbHNlKTtcclxuICAgIHNsb3Quc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgbGluZS5zZWxlY3RlZFNsb3QgPSBzbG90O1xyXG4gICAgdGhpcy5hY3RpdmVCdXR0b24gPSB0aGlzLnJlc29sdmVkTGluZXMuZXZlcnkoKGw6IFJlc29sdmVkTGluZSkgPT4gISFsLnNlbGVjdGVkU2xvdCk7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29udmVydFRvMjRIb3VyKHRpbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBbaG91ck1pbiwgbW9kaWZpZXJSYXddID0gdGltZS5zcGxpdCgnICcpO1xyXG4gICAgY29uc3QgbW9kaWZpZXIgPSBtb2RpZmllclJhdy50b1VwcGVyQ2FzZSgpOyAvLyBcIkFNXCIgb3IgXCJQTVwiXHJcbiAgICBsZXQgW2hvdXJzLCBtaW51dGVzXSA9IGhvdXJNaW4uc3BsaXQoJzonKS5tYXAoTnVtYmVyKTtcclxuXHJcbiAgICBpZiAobW9kaWZpZXIgPT09ICdQTScgJiYgaG91cnMgPCAxMikge1xyXG4gICAgICBob3VycyArPSAxMjtcclxuICAgIH1cclxuICAgIGlmIChtb2RpZmllciA9PT0gJ0FNJyAmJiBob3VycyA9PT0gMTIpIHtcclxuICAgICAgaG91cnMgPSAwO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGhoID0gaG91cnMudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgbW0gPSBtaW51dGVzLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIHJldHVybiBgJHtoaH06JHttbX0gJHttb2RpZmllcn1gO1xyXG4gIH1cclxuICBsb2FkZXI6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1Byb2Nlc3Npbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICB0ZXJtc0FuZENvbmRpdGlvbnM6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBjaGVja1JlcXVpcmVkVmFsdWVzKCkge1xyXG4gICAgY29uc3QgaXNFbWFpbFZhbGlkID0gdGhpcy5hcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwuZW1haWwgJiZcclxuICAgICAgL15bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kLy50ZXN0KHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLmVtYWlsKTtcclxuXHJcbiAgICBjb25zdCBhbnlQb2xpY3kgPSB0aGlzLmNhcnRTZXJ2aWNlcy5zb21lKChzOiBhbnkpID0+IHM/LmNhbmNlbGxhdGlvblBvbGljeT8ubGVuZ3RoID4gMCB8fCBzPy5yZXNjaGVkdWxlUG9saWN5Py5sZW5ndGggPiAwKTtcclxuXHJcbiAgICBjb25zdCBhZGRyZXNzT2sgPSB0aGlzLnNlbGVjdGVkTW9kZSAhPT0gJ0hPTUVfVklTSVQnIHx8ICh0aGlzLmlzQWRtaW5Cb29raW5nXHJcbiAgICAgID8gISEodGhpcy5ob21lVmlzaXRBZGRyZXNzLnJlY2VpdmVyTmFtZSAmJiB0aGlzLmhvbWVWaXNpdEFkZHJlc3MuYWRkcmVzc0xpbmUxICYmIHRoaXMuaG9tZVZpc2l0QWRkcmVzcy5jaXR5ICYmIHRoaXMuaG9tZVZpc2l0QWRkcmVzcy56aXBDb2RlKVxyXG4gICAgICA6ICEhdGhpcy5kZWZhdWx0QWRkcmVzcyk7XHJcblxyXG4gICAgaWYgKHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLm5hbWUgJiZcclxuICAgICAgaXNFbWFpbFZhbGlkICYmXHJcbiAgICAgIHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLnBob25lTnVtYmVyLmxlbmd0aCA9PT0gMTAgJiZcclxuICAgICAgYWRkcmVzc09rKSB7XHJcbiAgICAgIGlmIChhbnlQb2xpY3kpIHtcclxuICAgICAgICB0aGlzLmFjdGl2ZUJ1dHRvbiA9IHRoaXMudGVybXNBbmRDb25kaXRpb25zID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMuYWN0aXZlQnV0dG9uID0gdHJ1ZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5hY3RpdmVCdXR0b24gPSBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgcmVmcmVzaERlZmF1bHRBZGRyZXNzKCkge1xyXG4gICAgY29uc3QgbGlzdCA9IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdCA/PyBbXTtcclxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICB0aGlzLmRlZmF1bHRBZGRyZXNzID0gbnVsbDtcclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG4gICAgY29uc3QgaWR4ID0gbGlzdC5maW5kSW5kZXgoKGE6IEFkZHJlc3NEZXRhaWxzKSA9PiBhLmRlZmF1bHQgPT09IHRydWUpO1xyXG4gICAgdGhpcy5kZWZhdWx0QWRkcmVzcyA9IGlkeCAhPT0gLTEgPyBsaXN0W2lkeF0gOiBsaXN0WzBdO1xyXG4gICAgdGhpcy5jaGVja1JlcXVpcmVkVmFsdWVzKCk7XHJcbiAgfVxyXG5cclxuICBjaGFuZ2VBZGRyZXNzKCkge1xyXG4gICAgdGhpcy5tYXREaWFsb2cub3BlbihBZGRyZXNzTGlzdENvbXBvbmVudCwgeyBwYW5lbENsYXNzOiAnc2lkZXBhbmVsLWNsYXNzJywgZGF0YTogeyBhZGRyZXNzTGlzdDogdGhpcy51c2VyRGV0YWlscz8uYWRkcmVzc0RldGFpbHNMaXN0ID8/IFtdIH0gfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICB0aGlzLnVzZXJEZXRhaWxzID0gdGhpcy5zdG9yYWdlU2VydmljZS5nZXRVc2VyKCkgYXMgVXNlcjtcclxuICAgICAgdGhpcy5yZWZyZXNoRGVmYXVsdEFkZHJlc3MoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkQWRkcmVzcygpIHtcclxuICAgIHRoaXMubWF0RGlhbG9nLm9wZW4oQWRkcmVzc0NvbXBvbmVudCwgeyBwYW5lbENsYXNzOiBbJ3NpZGVwYW5lbC1jbGFzcycsICdhZGRyZXNzLWNsYXNzJ10sIGRhdGE6IHsgYWRkcmVzc0xpc3Q6IHRoaXMudXNlckRldGFpbHM/LmFkZHJlc3NEZXRhaWxzTGlzdCA/PyBbXSwgZWRpdEluZGV4OiAtMSB9IH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgpID0+IHtcclxuICAgICAgdGhpcy51c2VyRGV0YWlscyA9IHRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpIGFzIFVzZXI7XHJcbiAgICAgIHRoaXMucmVmcmVzaERlZmF1bHRBZGRyZXNzKCk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGFwcG9pbnRtZW50UGF5bG9hZDogYW55ID0ge1xyXG4gICAgY3VzdG9tZXJEZXRhaWw6IHtcclxuICAgICAgbmFtZTogJycsXHJcbiAgICAgIHBob25lTnVtYmVyOiAnJyxcclxuICAgICAgZW1haWw6ICcnXHJcbiAgICB9XHJcbiAgfVxyXG4gIGFwaVN0YXR1czogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICBjb25maXJtQm9va2luZygpIHtcclxuICAgIC8vIERlZmVuc2l2ZSByZS1jaGVjayAobWlycm9ycyBjYXJ0LmNvbXBvbmVudC50cydzIHByb2NlZWRUb1BheW1lbnQoKSBndWFyZCkgLSB0aGUgZW50cnlcclxuICAgIC8vIGNoZWNrIGluIG5nT25Jbml0KCkgc2hvdWxkIG1ha2UgdGhpcyB1bnJlYWNoYWJsZSBpbiBwcmFjdGljZSwgYnV0IGEgbG9uZyBzbG90LXBpY2tpbmdcclxuICAgIC8vIHNlc3Npb24gY291bGQgc3RpbGwgbGV0IHRoZSBsb2dpbiBzZXNzaW9uIGV4cGlyZSBiZWZvcmUgdGhlIGN1c3RvbWVyIHJlYWNoZXMgdGhpcyBzdGVwLlxyXG4gICAgaWYgKCF0aGlzLmVkaXQgJiYgIXRoaXMuc3RvcmFnZVNlcnZpY2UuZ2V0VXNlcigpKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2xvZ2luJ10sIHsgcXVlcnlQYXJhbXM6IHsgcmVkaXJlY3RUbzogdGhpcy5yb3V0ZXIudXJsIH0gfSk7XHJcbiAgICAgIHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMuaXNQcm9jZXNzaW5nID0gdHJ1ZTtcclxuICAgIGNvbnN0IGxpbmVzID0gdGhpcy5yZXNvbHZlZExpbmVzLm1hcCgobDogUmVzb2x2ZWRMaW5lKSA9PiB7XHJcbiAgICAgIGNvbnN0IHNsb3QgPSBsLnNlbGVjdGVkU2xvdDtcclxuICAgICAgcmV0dXJuIHtcclxuICAgICAgICBzZXJ2aWNlSWRzOiBsLnNlcnZpY2VzLm1hcCgoczogYW55KSA9PiBzLmlkKSxcclxuICAgICAgICBzdGFmZklkOiBsLnN0YWZmSWQgfHwgbC5zZWxlY3RlZFN0YWZmSWQsXHJcbiAgICAgICAgc3RhcnRUaW1lOiBzbG90ID8gdGhpcy5jb252ZXJ0VG8yNEhvdXIoc2xvdC52YWx1ZSkuc2xpY2UoMCwgNSkgOiB1bmRlZmluZWRcclxuICAgICAgfTtcclxuICAgIH0pO1xyXG5cclxuICAgIGNvbnN0IGhvbGRQYXlsb2FkOiBhbnkgPSB7XHJcbiAgICAgIGJ1c2luZXNzSWQ6IHRoaXMuYnVzaW5lc3NJZCxcclxuICAgICAgbW9kZTogdGhpcy5zZWxlY3RlZE1vZGUsXHJcbiAgICAgIHN0b3JlSWQ6IHRoaXMuc2VsZWN0ZWRNb2RlID09PSAnU1RPUkVfVklTSVQnID8gdGhpcy5zZWxlY3RlZExvY2F0aW9uPy5pZCA6IHVuZGVmaW5lZCxcclxuICAgICAgYm9va2luZ0RhdGU6IHRoaXMudG9Jc29EYXRlKHRoaXMuc2VsZWN0ZWREYXRlKSxcclxuICAgICAgY3VzdG9tZXJEZXRhaWw6IHRoaXMuYXBwb2ludG1lbnRQYXlsb2FkLmN1c3RvbWVyRGV0YWlsLFxyXG4gICAgICAvLyBOZXZlciB0cnVzdCBhIHN0cmF5IFwidXNlclwiIGNvb2tpZSBmb3IgYW4gYWRtaW4tY3JlYXRlZCBib29raW5nIC0gc3RhZmYgYXJlbid0IGxvZ2dlZCBpblxyXG4gICAgICAvLyBhcyB0aGUgY3VzdG9tZXIgdGhleSdyZSBib29raW5nIGZvciwgc28gdGhpcyBtdXN0IHJlc29sdmUgc2VydmVyLXNpZGUgZnJvbSB0aGUgdHlwZWRcclxuICAgICAgLy8gcGhvbmUgbnVtYmVyIGluc3RlYWQgKHNlZSBDdXN0b21lcklkZW50aXR5U2VydmljZSksIG5vdCB3aGF0ZXZlciBoYXBwZW5zIHRvIGJlIHNpdHRpbmdcclxuICAgICAgLy8gaW4gdGhpcyBicm93c2VyJ3Mgc3RvcmFnZSAoZS5nLiBsZWZ0b3ZlciBmcm9tIHRlc3RpbmcgdGhlIGxpdmUgc3RvcmVmcm9udCkuXHJcbiAgICAgIHVzZXJJZDogdGhpcy5pc0FkbWluQm9va2luZyA/IHVuZGVmaW5lZCA6ICh0aGlzLnN0b3JhZ2VTZXJ2aWNlLmdldFVzZXIoKSBhcyBhbnkpPy51c2VySWQsXHJcbiAgICAgIGxpbmVzLFxyXG4gICAgICBwcm9kdWN0TGluZXM6IHRoaXMucHJvZHVjdENhcnRJdGVtcy5tYXAoKHA6IGFueSkgPT4gdGhpcy5ib29raW5nUHJvZHVjdENhcnRTZXJ2aWNlLnRvUHJvZHVjdExpbmUocCkpLFxyXG4gICAgICBhZGRyZXNzRGV0YWlsczogdGhpcy5zZWxlY3RlZE1vZGUgIT09ICdIT01FX1ZJU0lUJyA/IHVuZGVmaW5lZCA6XHJcbiAgICAgICAgdGhpcy5pc0FkbWluQm9va2luZyA/IHsgLi4udGhpcy5ob21lVmlzaXRBZGRyZXNzLCBpbnN0cnVjdGlvbnM6IHRoaXMuaW5zdHJ1Y3Rpb25zIH0gOlxyXG4gICAgICAgIHRoaXMuZGVmYXVsdEFkZHJlc3MgPyB7XHJcbiAgICAgICAgICByZWNlaXZlck5hbWU6IHRoaXMuZGVmYXVsdEFkZHJlc3MucmVjZWl2ZXJOYW1lLFxyXG4gICAgICAgICAgcmVjZWl2ZXJQaG9uZTogdGhpcy5kZWZhdWx0QWRkcmVzcy5yZWNlaXZlclBob25lLFxyXG4gICAgICAgICAgYWRkcmVzc0xpbmUxOiB0aGlzLmRlZmF1bHRBZGRyZXNzLmFkZHJlc3NMaW5lMSxcclxuICAgICAgICAgIGNpdHk6IHRoaXMuZGVmYXVsdEFkZHJlc3MuY2l0eU5hbWUsXHJcbiAgICAgICAgICBzdGF0ZTogdGhpcy5kZWZhdWx0QWRkcmVzcy5zdGF0ZU5hbWUsXHJcbiAgICAgICAgICB6aXBDb2RlOiB0aGlzLmRlZmF1bHRBZGRyZXNzLnppcENvZGUsXHJcbiAgICAgICAgICBpbnN0cnVjdGlvbnM6IHRoaXMuaW5zdHJ1Y3Rpb25zXHJcbiAgICAgICAgfSA6IHVuZGVmaW5lZCxcclxuICAgICAgLy8gU2tpcHMgb25saW5lIGRlcG9zaXQgY29sbGVjdGlvbiBzZXJ2ZXItc2lkZSAoc2VlIEJvb2tpbmdHcm91cFNlcnZpY2UjYnVpbGRHcm91cCkgLSBhXHJcbiAgICAgIC8vIHN0YWZmLWNyZWF0ZWQgYm9va2luZyBjYW4ndCBjb21wbGV0ZSBhIENhc2hmcmVlIGNoZWNrb3V0IGlubGluZSB0aGUgd2F5IHRoZSBsaXZlIHNpdGVcclxuICAgICAgLy8gZG9lcywgc28gaXQgbXVzdCBuZXZlciBiZSByb3V0ZWQgdGhyb3VnaCB0aGUgcGF5bWVudCBnYXRld2F5OyBhbnkgYmFsYW5jZSBpcyBjb2xsZWN0ZWRcclxuICAgICAgLy8gaW4gcGVyc29uIC8gcmVjb3JkZWQgbGF0ZXIgdmlhIHRoZSBpbnZvaWNlIGluc3RlYWQuXHJcbiAgICAgIGFkbWluQm9va2luZzogdGhpcy5pc0FkbWluQm9va2luZyB8fCB0aGlzLmlzQWRtaW5Db250ZXh0LFxyXG4gICAgfTtcclxuXHJcbiAgICBjb25zdCBpc0FkbWluID0gdGhpcy5pc0FkbWluQm9va2luZyB8fCB0aGlzLmlzQWRtaW5Db250ZXh0O1xyXG4gICAgdGhpcy5yZXN0U2VydmljZS5ob2xkQm9va2luZyhob2xkUGF5bG9hZCkuc3Vic2NyaWJlKChncm91cDogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuYm9va2luZ0dyb3VwID0gZ3JvdXA7XHJcbiAgICAgIGlmICh0aGlzLnNlbGVjdGVkTW9kZSAhPT0gJ1NUT1JFX1ZJU0lUJyAmJiB0aGlzLnByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuYm9va2luZ1Byb2R1Y3RDYXJ0U2VydmljZS5jbGVhcih0aGlzLnNlbGVjdGVkTW9kZSBhcyBCb29raW5nQ2FydE1vZGUpO1xyXG4gICAgICB9XHJcbiAgICAgIGlmICghaXNBZG1pbiAmJiBncm91cC5zdGF0dXMgPT09ICdIT0xEJyAmJiBncm91cC50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDApIHtcclxuICAgICAgICAvLyBNdXN0IGFjdCBvbiB0aGlzIGltbWVkaWF0ZWx5IC0gdGhlIGhvbGQgZXhwaXJlcyBpbiAxMCBtaW51dGVzLlxyXG4gICAgICAgIHRoaXMucmVzdFNlcnZpY2UuZ2VuZXJhdGVQYXltZW50VG9rZW4oZ3JvdXAuZ3JvdXBJZCkuc3Vic2NyaWJlKChvcmRlcjogYW55KSA9PiB7XHJcbiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbSgnYXBwb2ludG1lbnRQYXltZW50SWQnLCBvcmRlci5wZ09yZGVySWQpO1xyXG4gICAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuX2V2ZW50U2VydmljZS5jYXNoRnJlZUV2ZW50LmVtaXQoeyBkYXRhOiB7IG9yZGVyU2lnbmF0dXJlOiBvcmRlci5vcmRlclNpZ25hdHVyZSB9IH0pO1xyXG4gICAgICAgIH0sIChlcnJvcjogYW55KSA9PiB7XHJcbiAgICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy5tZXNzYWdlU2VydmljZS5hZGQoeyBzZXZlcml0eTogJ2Vycm9yJywgc3VtbWFyeTogJ1BheW1lbnQgRmFpbGVkJywgZGV0YWlsOiBlcnJvci5lcnJvcj8ubWVzc2FnZSB9KTtcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIGlmIChpc0FkbWluICYmIGdyb3VwLnN0YXR1cyA9PT0gJ0hPTEQnKSB7XHJcbiAgICAgICAgLy8gVW5leHBlY3RlZDogdGhlIGJhY2tlbmQgc2hvdWxkIGhhdmUgYXV0by1jb25maXJtZWQgdGhpcyBhZG1pbiBib29raW5nIHdpdGggemVyb1xyXG4gICAgICAgIC8vIGRlcG9zaXQuIFN1cmZhY2UgYW4gZXJyb3IgcmF0aGVyIHRoYW4gc2lsZW50bHkgc2hvd2luZyBzdWNjZXNzIGZvciBhIGJvb2tpbmcgdGhhdCdzXHJcbiAgICAgICAgLy8gc3RpbGwgZXhwaXJpbmcgdW5jb25maXJtZWQuXHJcbiAgICAgICAgdGhpcy5pc1Byb2Nlc3NpbmcgPSBmYWxzZTtcclxuICAgICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQm9va2luZyBGYWlsZWQnLCBkZXRhaWw6ICdUaGlzIGJvb2tpbmcgcmVxdWlyZXMgYSBkZXBvc2l0IGFuZCBjb3VsZCBub3QgYmUgYXV0by1jb25maXJtZWQuIFBsZWFzZSB0cnkgYWdhaW4gb3IgY29udGFjdCBzdXBwb3J0LicgfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5hcGlTdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgIHRoaXMuc2VsZWN0ZWRUYWIgPSAnc3RhdHVzVGVtcGxhdGUnO1xyXG4gICAgICAgIHRoaXMuYmFyV2lkdGggPSAnMTAwJztcclxuICAgICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICB9XHJcbiAgICB9LCAoZXJyb3I6IGFueSkgPT4ge1xyXG4gICAgICB0aGlzLmlzUHJvY2Vzc2luZyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLmFwaVN0YXR1cyA9IGZhbHNlO1xyXG4gICAgICB0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7IHNldmVyaXR5OiAnZXJyb3InLCBzdW1tYXJ5OiAnQm9va2luZyBGYWlsZWQnLCBkZXRhaWw6IGVycm9yLmVycm9yPy5tZXNzYWdlIH0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnb0JhY2soKSB7XHJcbiAgICBpZiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oXCJSRVFVRVNUX0ZST01cIikgPT09ICdFQ09NTUVSQ0UnKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2FwcG9pbnRtZW50cy9saXN0LWFwcG9pbnRtZW50cyddKVxyXG4gICAgfVxyXG4gICAgZWxzZSB7XHJcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnJ10pXHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnb1RvTXlCb29raW5ncygpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL3Byb2ZpbGUnXSwgeyBxdWVyeVBhcmFtczogeyB0YWI6ICdNeSBCb29raW5ncycgfSB9KTtcclxuICB9XHJcblxyXG4gIGdvVG9MaXN0aW5nKCkge1xyXG4gICAgdGhpcy5yb3V0ZXIubmF2aWdhdGUoWycnXSk7XHJcbiAgfVxyXG5cclxuICBnb1RvQXBwb2ludG1lbnRzTGlzdCgpIHtcclxuICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnL2FkbWluL2FwcG9pbnRtZW50cy9saXN0LWFwcG9pbnRtZW50cyddKTtcclxuICB9XHJcblxyXG4gIGJvb2tBbm90aGVyKCkge1xyXG4gICAgdGhpcy5yZXNldFdpemFyZCgpO1xyXG4gIH1cclxufVxyXG4iLCI8cC10b2FzdCBwb3NpdGlvbj1cImJvdHRvbS1yaWdodFwiIFtiYXNlWkluZGV4XT1cIjEwMDAwMDAwMDAwXCIgW2F1dG9aSW5kZXhdPVwidHJ1ZVwiXHJcbiAgICBbc2hvd1RyYW5zZm9ybU9wdGlvbnNdPVwic2NyZWVuV2lkdGggPCA0NzUgPyAndHJhbnNsYXRlWSgtMTAwJSknIDogJydcIj48L3AtdG9hc3Q+XHJcbjxzZWN0aW9uIGNsYXNzPVwibWFpbl9zZWN0aW9uXCIgW2lkXT1cImRhdGE/LmlkXCIgc2ltcG9Ib3ZlciAoaG92ZXJpbmcpPVwic2hvd0VkaXRUYWJzKCRldmVudClcIlxyXG4gICAgW3NpbXBvQmFja2dyb3VuZF09XCJiYWNrZ3JvdW5kSW5mb1wiIFtzdHlsZS4tLWNvbG9yLWFjY2VudC1ncmFkaWVudF09XCJhY2NlbnRDb2xvclwiPlxyXG4gICAgPGRpdiBbbmdDbGFzc109XCJ7J2hvdmVyX2VmZmVjdCc6IGVkaXR9XCIgKm5nSWY9XCJzaG93RWRpdG9yc1wiPlxyXG4gICAgICAgIDxzaW1wby1ob3Zlci1lbGVtZW50cyBbZGF0YV09XCJkYXRhXCIgW2luZGV4XT1cImluZGV4XCIgW2VkaXRPcHRpb25zXT1cImVkaXRcIj48L3NpbXBvLWhvdmVyLWVsZW1lbnRzPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9oZWFkZXJcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJhY2stYnRuIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlciBjdXJzb3ItcG9pbnRlciBnYXAtMiBtYi0zXCJcclxuICAgICAgICAgICAgICAgIChjbGljayk9XCJnb0JhY2soKVwiPlxyXG4gICAgICAgICAgICAgICAgPG1hdC1pY29uPmtleWJvYXJkX2JhY2tzcGFjZTwvbWF0LWljb24+PHNwYW4gKm5nSWY9XCJzY3JlZW5XaWR0aCA+IDQ3NVwiPkJhY2sgdG8gSG9tZTwvc3Bhbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJoZWFkZXItdGl0bGVcIj5cclxuICAgICAgICAgICAgICAgIDxoMT5Cb29rIE5ldyBBcHBvaW50bWVudDwvaDE+XHJcbiAgICAgICAgICAgICAgICA8cD57e2J1c2luZXNzTmFtZSA/PyBcIk4vQVwiIH19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2dyZXNzLWJhclwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZ3Jlc3MtZmlsbFwiIFtzdHlsZS53aWR0aF09XCJiYXJXaWR0aCArICclJ1wiPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9ib2R5IHctMTAwIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiID09PSAnbW9kZVNlbGVjdGlvbidcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm1vZGVTZWxlY3Rpb25cIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWIgPT09ICdzZXJ2aWNlTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInNlcnZpY2VMaXN0aW5nXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2xvY2F0aW9uTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImxvY2F0aW9uTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ3N0YWZmTGlzdGluZydcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInN0YWZmTGlzdGluZ1wiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzZWxlY3RlZFRhYiA9PT0gJ2RhdGVTZWxlY3Rpb24nXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJkYXRlU2VsZWN0aW9uXCI+PC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNlbGVjdGVkVGFiPT09J2NvbnRhY3REZXRhaWxzJ1wiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwiY29udGFjdERldGFpbHNcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0ncGF5bWVudFRhYidcIj5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cInBheW1lbnRUYWJcIj48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2VsZWN0ZWRUYWI9PT0nc3RhdHVzVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJzdGF0dXNUZW1wbGF0ZVwiPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWFpbl9mb290ZXIgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiIT09J3N0YXR1c1RlbXBsYXRlJyAmJiBzZWxlY3RlZFRhYiE9PSdtb2RlU2VsZWN0aW9uJ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmb290ZXItYnV0dG9uc1wiXHJcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInsnanVzdGlmeS1jb250ZW50Jzogc2VsZWN0ZWRUYWIgIT0gJ3NlcnZpY2VMaXN0aW5nJyA/ICdzcGFjZS1iZXR3ZWVuJyA6ICdlbmQnfVwiPlxyXG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cImJhY2stZm9vdGVyLWJ0biBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJwcmV2aW91c1N0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiICE9ICdzZXJ2aWNlTGlzdGluZydcIj5CYWNrPC9zcGFuPlxyXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiY29udGludWUtYnRuXCIgW2Rpc2FibGVkXT1cIiFhY3RpdmVCdXR0b25cIiAoY2xpY2spPVwibmV4dFN0ZXAoKVwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiIT0ncGF5bWVudFRhYidcIj57eyFsb2FkZXIgPyAnQ29udGludWUnIDogJ0xvYWRpbmcuLi4nfX08L2J1dHRvbj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImN1cnNvci1wb2ludGVyIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZXZlbmx5IGFsaWduLWl0ZW1zLWNlbnRlclwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cInNlbGVjdGVkVGFiPT09J3BheW1lbnRUYWInXCIgKGNsaWNrKT1cImNvbmZpcm1Cb29raW5nKClcIiBbZGlzYWJsZWRdPVwiaXNQcm9jZXNzaW5nXCJcclxuICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsncGF5LW5vdy1idG4nIDogYm9va2luZ0dyb3VwPy50b3RhbENvbGxlY3RlZEF0Qm9va2luZyA+IDAgfHwgIWJvb2tpbmdHcm91cCwnY29tcGxldGVfYm9va2luZycgOiBib29raW5nR3JvdXAgJiYgIWJvb2tpbmdHcm91cD8udG90YWxDb2xsZWN0ZWRBdEJvb2tpbmd9XCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzA0MDEyYzE3NTM0NDAwODc5OTZCYWNrZ3JvdW5kLnBuZ1wiPlxyXG4gICAgICAgICAgICAgICAge3tpc1Byb2Nlc3NpbmcgPyAnUGxlYXNlIHdhaXQuLi4nIDogJ0NvbmZpcm0gQm9va2luZyd9fVxyXG4gICAgICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L3NlY3Rpb24+XHJcblxyXG48bmctdGVtcGxhdGUgI21vZGVTZWxlY3Rpb24+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy02MCBzZXJ2aWNlX3NlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1zZWxlY3Rpb25cIj5cclxuICAgICAgICAgICAgPGgyPkhvdyB3b3VsZCB5b3UgbGlrZSB0aGlzPzwvaDI+XHJcbiAgICAgICAgICAgIDxwPkNob29zZSBob3cgeW91J2QgbGlrZSB0byBiZSBzZXJ2ZWQ8L3A+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlcy1ncmlkXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1jYXJkXCIgKGNsaWNrKT1cInNlbGVjdE1vZGUoJ1NUT1JFX1ZJU0lUJylcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1oZWFkZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj5zdG9yZWZyb250PC9tYXQtaWNvbj48L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj5WaXNpdCBvdXIgU3RvcmU8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5Db21lIHRvIHVzIGF0IG9uZSBvZiBvdXIgbG9jYXRpb25zPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhcmRcIiAoY2xpY2spPVwic2VsZWN0TW9kZSgnSE9NRV9WSVNJVCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj48bWF0LWljb24+aG9tZTwvbWF0LWljb24+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXRpdGxlXCI+V2UgY29tZSB0byB5b3U8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZGVzY3JpcHRpb25cIj5BIHByb2Zlc3Npb25hbCB2aXNpdHMgeW91ciBhZGRyZXNzPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWNhcmRcIiAoY2xpY2spPVwic2VsZWN0TW9kZSgnVklERU9fQ0FMTCcpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaGVhZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLWljb25cIj48bWF0LWljb24+dmlkZW9jYW08L21hdC1pY29uPjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS10aXRsZVwiPlZpZGVvIGNvbnN1bHRhdGlvbjwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiPkNvbm5lY3Qgb3ZlciBhIHZpZGVvIGNhbGw8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNzZXJ2aWNlTGlzdGluZz5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIHNlcnZpY2Vfc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXNlbGVjdGlvblwiPlxyXG4gICAgICAgICAgICA8aDI+U2VsZWN0IGEgU2VydmljZTwvaDI+XHJcbiAgICAgICAgICAgIDxwPkNob29zZSB0aGUgc2VydmljZShzKSB5b3UnZCBsaWtlIHRvIGJvb2s8c3BhbiAqbmdJZj1cImNhcnRTZXJ2aWNlcy5sZW5ndGggPiAwXCI+IOKAlCB7e2NhcnRTZXJ2aWNlcy5sZW5ndGh9fSBzZWxlY3RlZDwvc3Bhbj48L3A+XHJcbiAgICAgICAgICAgIDxwICpuZ0lmPVwicHJvZHVjdENhcnRJdGVtcy5sZW5ndGggPiAwXCIgY2xhc3M9XCJjYXJ0LWhpbnRcIj57e3Byb2R1Y3RDYXJ0SXRlbXMubGVuZ3RofX0gcHJvZHVjdChzKSBhbHJlYWR5IGluIHlvdXIgY2FydCDigJQgeW91IGNhbiBjb250aW51ZSB3aXRob3V0IHBpY2tpbmcgYSBzZXJ2aWNlLjwvcD5cclxuXHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlcy1ncmlkXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBzZXJ2aWNlIG9mIHNlcnZpY2VEYXRhXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIlwiIChjbGljayk9XCJzZWxlY3RTZXJ2aWNlKHNlcnZpY2UpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc2VydmljZS1jYXJkLXNlbGVjdGVkJyA6IHNlcnZpY2U/LnNlbGVjdGVkLCAnc2VydmljZS1jYXJkJzogIXNlcnZpY2U/LnNlbGVjdGVkIH1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIiBzZXJ2aWNlLWhlYWRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtaWNvblwiPjxtYXQtaWNvbj5wZXJzb25fb3V0bGluZTwvbWF0LWljb24+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1pbmZvXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtdGl0bGVcIj57e3NlcnZpY2U/Lm5hbWUgPyBzZXJ2aWNlPy5uYW1lIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZXJ2aWNlLXByaWNlXCI+4oK5e3tzZXJ2aWNlPy5wcmljZURldGFpbHM/LnByaWNlID9cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZT8ucHJpY2VEZXRhaWxzPy5wcmljZSA6ICdOL0EnIH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlcnZpY2UtZHVyYXRpb25cIj57e3NlcnZpY2U/LmR1cmF0aW9uID8gc2VydmljZT8uZHVyYXRpb24gOiAnTi9BJ319IG1pblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VydmljZS1kZXNjcmlwdGlvblwiICpuZ0lmPVwic2VydmljZT8uZGVzY3JpcHRpb25cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c2VydmljZT8uZGVzY3JpcHRpb24gPyBzZXJ2aWNlPy5kZXNjcmlwdGlvbiA6ICdOL0EnfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJob21lLXZpc2l0XCIgKm5nSWY9XCJzZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCcgJiYgc2VydmljZT8uaG9tZUFwcG9pbnRtZW50QXZhaWxhYmxlXCI+PGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvOTgyMTI2YzE3NTg2Mjg4NjMxMjlmdXJuaXR1cmVfMTY0MDYxMDMucG5nXCI+SG9tZVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXQgQXZhaWxhYmxlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjbG9jYXRpb25MaXN0aW5nPlxyXG4gICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uX3NlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyIGZsZXgtY29sdW1uIGFsaWduLWl0ZW1zLXN0YXJ0XCI+XHJcbiAgICAgICAgICAgIDxoMT5DaG9vc2UgTG9jYXRpb248L2gxPlxyXG4gICAgICAgICAgICA8cD5TZWxlY3Qgd2hlcmUgeW91J2QgbGlrZSB0byByZWNlaXZlIHRoZSBzZXJ2aWNlPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibG9jYXRpb24tbGlzdFwiPlxyXG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsb2NhdGlvbiBvZiBsb2NhdGlvbkRhdGFcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgKGNsaWNrKT1cInNlbGVjdExvY2F0aW9uKGxvY2F0aW9uKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnbG9jYXRpb24tY2FyZC1zZWxlY3RlZCcgOiBsb2NhdGlvbj8uc2VsZWN0ZWQsICdsb2NhdGlvbi1jYXJkJzogIWxvY2F0aW9uPy5zZWxlY3RlZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWNvbnRlbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWluZm9cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsb2NhdGlvbi1pY29uXCI+PGltZ1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCJodHRwczovL2Qyejk0OTd4cDh4YjEyLmNsb3VkZnJvbnQubmV0L3Byb2QtaW1hZ2VzLzQyNzIyNmMxNzU4NjI5MTU3NzU4c3RvcmVfMzE3MTUxMC5wbmdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvY2F0aW9uLWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDM+e3tsb2NhdGlvbj8uc3RvcmVOYW1lID8gbG9jYXRpb24/LnN0b3JlTmFtZSA6ICdOL0EnfX08L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7bG9jYXRpb24/LmFkZHJlc3NEZXRhaWxzPy5hZGRyZXNzTGluZX19LCB7e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uY2l0eX19LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2xvY2F0aW9uPy5hZGRyZXNzRGV0YWlscz8uc3RhdGV9fSB7e2xvY2F0aW9uPy5waW5jb2RlfX08L3A+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc3RhZmZMaXN0aW5nPlxyXG4gICAgPGRpdiBjbGFzcz1cInctNjAgb3ZlcmZsb3ctaGlkZGVuIHN0YWZmLWxpc3RpbmdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IHctMTAwIGgtMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWhlYWRlciBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxPlNlbGVjdCBTdGFmZiBNZW1iZXI8L2gxPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3VidGl0bGUgbWItMFwiPkNob29zZSB5b3VyIHByZWZlcnJlZCBwcm9mZXNzaW9uYWw8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWNvbnRhaW5lciBtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlYXJjaC1pbnB1dC13cmFwcGVyIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwic2VhcmNoLWljb24gbWUtMlwiPnNlYXJjaDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwic2VhcmNoLWlucHV0IGJvcmRlci0wIGZsZXgtZ3Jvdy0xXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2ggc3RhZmYgbWVtYmVyIGJ5IG5hbWUuLi5cIiBbKG5nTW9kZWwpXT1cInN0YWZmU2VhcmNoUXVlcnlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwiY2xlYXItaWNvbiBjdXJzb3ItcG9pbnRlciBtcy0yXCIgKm5nSWY9XCJzdGFmZlNlYXJjaFF1ZXJ5XCIgKGNsaWNrKT1cInN0YWZmU2VhcmNoUXVlcnkgPSAnJ1wiPmNsb3NlPC9tYXQtaWNvbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gUHVyZSBwcm9kdWN0LW9ubHkgbGluZTogb25lIGZsYXQgc3RhZmYgbGlzdCwgc2FtZSBhcyB0aGUgb2xkIHNpbmdsZS1zZXJ2aWNlIGZsb3cgLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtbGlzdFwiICpuZ0lmPVwiY2FydFNlcnZpY2VzLmxlbmd0aCA9PT0gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YWZmIG9mIGZpbHRlcmVkU3RhZmZcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcm91bmRlZC0zIHAtM1wiIChjbGljayk9XCJzZWxlY3RTdGFmZkZvclByb2R1Y3RPbmx5TGluZShzdGFmZilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwieyAnc3RhZmYtY2FyZC1zZWxlY3RlZCcgOiBzdGFmZj8uc2VsZWN0ZWQsICdzdGFmZi1jYXJkJzogIXN0YWZmPy5zZWxlY3RlZCB9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1hdmF0YXIgcm91bmRlZC1jaXJjbGUgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIG1lLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7c3RhZmY/LnN0YWZmTmFtZS5zbGljZSgwLDIpLnRvVXBwZXJDYXNlKCl9fVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWRldGFpbHMgZmxleC1ncm93LTFcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInN0YWZmLW5hbWVcIj57eyhzdGFmZj8uc3RhZmZOYW1lID8gc3RhZmY/LnN0YWZmTmFtZSA6ICdOL0EnKSB8IHRpdGxlY2FzZX19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwic3RhZmYtc3BlY2lhbHR5XCI+e3soYnVzaW5lc3NOYW1lICYmIGJ1c2luZXNzTmFtZSAhPT0gJ04vQScpID8gYnVzaW5lc3NOYW1lIDogJ0Jvb2tpbmcgU3BlY2lhbGlzdCd9fTwvcD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGlvbi1pbmRpY2F0b3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGUtbWluaSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwic3RhZmY/LnNlbGVjdGVkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJzdGFmZj8uc2VsZWN0ZWRcIj5jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBCdW5kbGVkIGNhcnQ6IG9uZSBwb29sIHBlciBsaW5lIHRoYXQgcmVzb2x1dGlvbiBjb3VsZG4ndCBjb2xsYXBzZSB0byBhIHNpbmdsZSBwcm92aWRlciAtLT5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJjYXJ0U2VydmljZXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1saW5lLWdyb3VwIG1iLTRcIiAqbmdGb3I9XCJsZXQgbGluZSBvZiByZXNvbHZlZExpbmVzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJsaW5lLmNhbmRpZGF0ZVN0YWZmUG9vbD8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDQgY2xhc3M9XCJtYi0yXCI+Rm9yIHt7bGluZS5zZXJ2aWNlcy5sZW5ndGh9fSBzZXJ2aWNlKHMpOiB7eyAobGluZS5zZXJ2aWNlcyB8IHNsaWNlOjA6MykubGVuZ3RoID8gJycgOiAnJyB9fTxzcGFuICpuZ0Zvcj1cImxldCBzIG9mIGxpbmUuc2VydmljZXM7IGxldCBsYXN0ID0gbGFzdFwiPnt7cy5uYW1lfX17e2xhc3QgPyAnJyA6ICcsICd9fTwvc3Bhbj48L2g0PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN0YWZmLWxpc3QgbWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHN0YWZmIG9mIGxpbmUuY2FuZGlkYXRlU3RhZmZQb29sXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkIHJvdW5kZWQtMyBwLTNcIiAoY2xpY2spPVwic2VsZWN0U3RhZmZGb3JMaW5lKGxpbmUsIHN0YWZmKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7ICdzdGFmZi1jYXJkLXNlbGVjdGVkJyA6IGxpbmUuc2VsZWN0ZWRTdGFmZklkID09PSBzdGFmZi5pZCwgJ3N0YWZmLWNhcmQnOiBsaW5lLnNlbGVjdGVkU3RhZmZJZCAhPT0gc3RhZmYuaWQgfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3RhZmYtYXZhdGFyIHJvdW5kZWQtY2lyY2xlIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlciBtZS00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e3N0YWZmPy5uYW1lPy5zbGljZSgwLDIpPy50b1VwcGVyQ2FzZSgpfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdGFmZi1kZXRhaWxzIGZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzdGFmZi1uYW1lXCI+e3soc3RhZmY/Lm5hbWUgPyBzdGFmZj8ubmFtZSA6ICdOL0EnKSB8IHRpdGxlY2FzZX19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlbGVjdGlvbi1pbmRpY2F0b3JcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrbWFyay1jaXJjbGUtbWluaSBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBbY2xhc3Muc2VsZWN0ZWRdPVwibGluZS5zZWxlY3RlZFN0YWZmSWQgPT09IHN0YWZmLmlkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gKm5nSWY9XCJsaW5lLnNlbGVjdGVkU3RhZmZJZCA9PT0gc3RhZmYuaWRcIj5jaGVjazwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcblxyXG48bmctdGVtcGxhdGUgI2RhdGVTZWxlY3Rpb24+XHJcbiAgICA8ZGl2IGNsYXNzPVwidy02MCBkYXRlX3NlY3Rpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1jZW50ZXIgaC0xMDBcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGV0aW1lLWhlYWRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgxPlNlbGVjdCBEYXRlICYgVGltZTwvaDE+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJkYXRldGltZS1zdWJ0aXRsZSBtYi0wXCI+Q2hvb3NlIHdoZW4geW91J2QgbGlrZSB5b3VyIGFwcG9pbnRtZW50PC9wPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtYWluX2NvbnRhaW5lclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNjcmVlbldpZHRoID4gNDc1ICwgJ3ctMTAwJzpzY3JlZW5XaWR0aCA8IDQ3NX1cIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5TZWxlY3QgRGF0ZTwvaDM+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGUtcGlja2VyLWNvbnRhaW5lciBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJkYXRlLWlucHV0IGJvcmRlci0wIHJvdW5kZWQtMlwiIHBsYWNlaG9sZGVyPVwiZGQtbW0teXl5eVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJzZWxlY3RlZERhdGVTdHJcIiByZWFkb25seSAoY2xpY2spPVwidG9nZ2xlQ2FsZW5kYXIoJGV2ZW50KVwiPlxyXG5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJtcy0yXCIgKGNsaWNrKT1cInRvZ2dsZUNhbGVuZGFyKCRldmVudClcIj5jYWxlbmRhcl90b2RheTwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiIChjbGljayk9XCIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZXBpY2tlci1wb3BvdmVyXCIgKm5nSWY9XCJzaG93Q2FsZW5kYXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1jYWxlbmRhciBbKHNlbGVjdGVkKV09XCJzZWxlY3RlZERhdGVcIiBbZGF0ZUZpbHRlcl09XCJkYXRlRmlsdGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxlY3RlZENoYW5nZSk9XCJvbkRhdGVTZWxlY3RlZCgkZXZlbnQpXCIgY2xhc3M9XCJkYXRlcGlja2VyLWNhbGVuZGFyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbWF0LWNhbGVuZGFyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgICAgICA8IS0tIE9uZSBzbG90LXBpY2tlciBwZXIgcmVzb2x2ZWQgbGluZSwgc2lkZSBieSBzaWRlIHdoZW4gdGhlcmUncyBtb3JlIHRoYW4gb25lIChkZXNpZ24gZG9jIMKnM2IpIC0tPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lX3NlbGVjdGlvblwiIFtuZ0NsYXNzXT1cInsndy01MCcgOiBzY3JlZW5XaWR0aCA+IDQ3NSAsICd3LTEwMCc6c2NyZWVuV2lkdGggPCA0NzV9XCIgKm5nSWY9XCJyZXNvbHZlZExpbmVzLmxlbmd0aCA8PSAxXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWN0aW9uLWNhcmQgY2FyZCBoLTEwMCByb3VuZGVkLTMgcC00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+QXZhaWxhYmxlIFRpbWVzPC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZy0yIG1iLTQgb3ZlcmZsb3ctc2Nyb2xsXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFza2VsZXRvbkxvYWRlciAmJiByZXNvbHZlZExpbmVzWzBdXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIHJlc29sdmVkTGluZXNbMF0uc2xvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNsb3Qgcm91bmRlZC0yXCIgW2NsYXNzLnNlbGVjdGVkXT1cInRpbWUuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTbG90Rm9yTGluZShyZXNvbHZlZExpbmVzWzBdLCB0aW1lKVwiPnt7dGltZSA/IHRpbWU/LnZhbHVlIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gTXVsdGktbGluZSBjYXNlOiBlYWNoIGxpbmUgZ2V0cyBpdHMgb3duIGZ1bGwtd2lkdGggY2FyZCB3aXRoIGEgc3RhZmYgaGVhZGVyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtNCBtYWluX2NvbnRhaW5lciBmbGV4LXdyYXBcIiAqbmdJZj1cInJlc29sdmVkTGluZXMubGVuZ3RoID4gMVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiICpuZ0Zvcj1cImxldCBsaW5lIG9mIHJlc29sdmVkTGluZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNlY3Rpb24tY2FyZCBjYXJkIHJvdW5kZWQtMyBwLTRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoMyBjbGFzcz1cInNlY3Rpb24tdGl0bGVcIj5Qcm9mZXNzaW9uYWw6IHt7bGluZS5zdGFmZk5hbWUgfHwgbGluZS5zZWxlY3RlZFN0YWZmTmFtZX19PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwibWItMlwiICpuZ0lmPVwibGluZS5zZXJ2aWNlcy5sZW5ndGhcIj48c3BhbiAqbmdGb3I9XCJsZXQgcyBvZiBsaW5lLnNlcnZpY2VzOyBsZXQgbGFzdCA9IGxhc3RcIj57e3MubmFtZX19e3tsYXN0ID8gJycgOiAnLCAnfX08L3NwYW4+PC9wPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBnLTIgbWItMiBvdmVyZmxvdy1zY3JvbGxcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWxpbmUuc2xvdHNMb2FkaW5nXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtNFwiICpuZ0Zvcj1cImxldCB0aW1lIG9mIGxpbmUuc2xvdHNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lLXNsb3Qgcm91bmRlZC0yXCIgW2NsYXNzLnNlbGVjdGVkXT1cInRpbWUuc2VsZWN0ZWRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3RTbG90Rm9yTGluZShsaW5lLCB0aW1lKVwiPnt7dGltZSA/IHRpbWU/LnZhbHVlIDogJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlICNjb250YWN0RGV0YWlscz5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIGNvbnRhY3Rfc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWhlYWRlciBtYi0yXCI+XHJcbiAgICAgICAgICAgIDxoMT5Db250YWN0IERldGFpbHM8L2gxPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImNvbnRhY3Qtc3VidGl0bGUgbWItMFwiPlByb3ZpZGUgeW91ciBjb250YWN0IGluZm9ybWF0aW9uPC9wPlxyXG4gICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGdhcC0zIGRldGFpbHNfY29udGFpbmVyIGZsZXgtY29sdW1uIHctMTAwXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZ2FwLTRcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgW25nQ2xhc3NdPVwieyd3LTUwJyA6IHNlbGVjdGVkTW9kZSA9PT0gJ0hPTUVfVklTSVQnLCAndy0xMDAnIDogc2VsZWN0ZWRNb2RlICE9PSAnSE9NRV9WSVNJVCd9XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tc2VjdGlvbiBjYXJkIHJvdW5kZWQtMyBwLTQgaC0xMDBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwic2VjdGlvbi10aXRsZVwiPlBlcnNvbmFsIEluZm9ybWF0aW9uPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi00XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsIE5hbWVcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkLWFzdGVyaXNrXCI+Kjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwubmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCIgc2ltcG9MZXR0ZXJzT25seT5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItNFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW1haWwgQWRkcmVzc1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWQtYXN0ZXJpc2tcIj4qPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwuZW1haWxcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybj1cIl5bYS16MC05Ll8lKy1dK0BbYS16MC05Li1dK1xcLlthLXpdezIsNH0kXCIgI2VtYWlsRmllbGQ9XCJuZ01vZGVsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwiZW1haWxcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGhvbmUgTnVtYmVyXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZC1hc3Rlcmlza1wiPio8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZWxcIiBjbGFzcz1cImZvcm0tY29udHJvbCAgcm91bmRlZC0yXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImFwcG9pbnRtZW50UGF5bG9hZC5jdXN0b21lckRldGFpbC5waG9uZU51bWJlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCIgc2ltcG9OdW1iZXJzT25seVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsnbW9iaWxlX251bWJlcicgOiBhcHBvaW50bWVudFBheWxvYWQuY3VzdG9tZXJEZXRhaWwucGhvbmVOdW1iZXIubGVuZ3RoICE9IDEwfVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPCEtLSBIb21lIFZpc2l0IGFkZHJlc3MuIEN1c3RvbWVyIGNvbnRleHQ6IHNhbWUgc2F2ZWQtYWRkcmVzcyBmbG93IGFzXHJcbiAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0L0Jvb2tBcHBvaW50bWVudENvbXBvbmVudC4gQWRtaW4gY29udGV4dCAoaXNBZG1pbkJvb2tpbmcpOiBub1xyXG4gICAgICAgICAgICAgICAgICAgICBsb2dnZWQtaW4gY3VzdG9tZXIgYWNjb3VudCB0byByZWFkIGEgc2F2ZWQgYWRkcmVzcyBib29rIGZyb20sIHNvIHN0YWZmIHR5cGVcclxuICAgICAgICAgICAgICAgICAgICAgdGhlIGFkZHJlc3MgbWFudWFsbHkgaW5zdGVhZC4gLS0+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiICpuZ0lmPVwic2VsZWN0ZWRNb2RlID09PSAnSE9NRV9WSVNJVCdcIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1zZWN0aW9uIGNhcmQgcm91bmRlZC0zIHAtNCBoLTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJzZWN0aW9uLXRpdGxlXCI+SG9tZSBWaXNpdCBEZXRhaWxzPC9oMz5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNBZG1pbkJvb2tpbmc7IGVsc2UgbWFudWFsSG9tZVZpc2l0QWRkcmVzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNoaXBwaW5nLWluZm9cIiAqbmdJZj1cImRlZmF1bHRBZGRyZXNzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZHJlc3MtaW5mb1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWRkcmVzcy1uYW1lXCI+e3tkZWZhdWx0QWRkcmVzcz8ucmVjZWl2ZXJOYW1lfX0gKHt7ZGVmYXVsdEFkZHJlc3M/LmFkZHJlc3NUeXBlfX0pPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhZGRyZXNzLWRldGFpbHNcIj57e2RlZmF1bHRBZGRyZXNzPy5hZGRyZXNzTGluZTF9fSwge3tkZWZhdWx0QWRkcmVzcz8uY2l0eU5hbWV9fSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7ZGVmYXVsdEFkZHJlc3M/LnN0YXRlTmFtZX19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2JpbGUtbnVtYmVyXCI+TW9iaWxlOiB7e2RlZmF1bHRBZGRyZXNzPy5yZWNlaXZlclBob25lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJjaGFuZ2UtYWRkcmVzcy1idG4gdy0xMDBcIiAoY2xpY2spPVwiY2hhbmdlQWRkcmVzcygpXCIgKm5nSWY9XCJkZWZhdWx0QWRkcmVzc1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIQU5HRSBPUiBBREQgQUREUkVTU1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFkZExpbmtzXCIgKm5nSWY9XCIhZGVmYXVsdEFkZHJlc3NcIiAoY2xpY2spPVwiYWRkQWRkcmVzcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmFkZDwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtcy0yXCI+QWRkIGFuIGFkZHJlc3M8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI21hbnVhbEhvbWVWaXNpdEFkZHJlc3M+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlJlY2VpdmVyIE5hbWU8L2xhYmVsPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCIgWyhuZ01vZGVsKV09XCJob21lVmlzaXRBZGRyZXNzLnJlY2VpdmVyTmFtZVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlJlY2VpdmVyIFBob25lPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRlbFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCIgc2ltcG9OdW1iZXJzT25seSBbKG5nTW9kZWwpXT1cImhvbWVWaXNpdEFkZHJlc3MucmVjZWl2ZXJQaG9uZVwiIChuZ01vZGVsQ2hhbmdlKT1cImNoZWNrUmVxdWlyZWRWYWx1ZXMoKVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPkFkZHJlc3MgTGluZSAxPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiIFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5hZGRyZXNzTGluZTFcIiAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5BZGRyZXNzIExpbmUgMiAob3B0aW9uYWwpPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWlucHV0IHJvdW5kZWQtMlwiIFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy5hZGRyZXNzTGluZTJcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBnYXAtMiBtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctNTBcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+Q2l0eTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCIgWyhuZ01vZGVsKV09XCJob21lVmlzaXRBZGRyZXNzLmNpdHlcIiAobmdNb2RlbENoYW5nZSk9XCJjaGVja1JlcXVpcmVkVmFsdWVzKClcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy01MFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsIGQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXJcIj5TdGF0ZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwiZm9ybS1jb250cm9sIGZvcm0taW5wdXQgcm91bmRlZC0yXCIgWyhuZ01vZGVsKV09XCJob21lVmlzaXRBZGRyZXNzLnN0YXRlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+UGluY29kZTwvbGFiZWw+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZm9ybS1pbnB1dCByb3VuZGVkLTJcIiBzaW1wb051bWJlcnNPbmx5IFsobmdNb2RlbCldPVwiaG9tZVZpc2l0QWRkcmVzcy56aXBDb2RlXCIgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0wIG10LTNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWwgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlNwZWNpYWwgSW5zdHJ1Y3Rpb25zPC9sYWJlbD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLXRleHRhcmVhIHJvdW5kZWQtMlwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJBbnkgc3BlY2lhbCBpbnN0cnVjdGlvbnMgZm9yIHRoZSBwcm9mZXNzaW9uYWwgKG9wdGlvbmFsKVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJpbnN0cnVjdGlvbnNcIj48L3RleHRhcmVhPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljaWVzLWNvbnRhaW5lclwiXHJcbiAgICAgICAgICAgICAgICAqbmdJZj1cImNhcnRTZXJ2aWNlc1swXT8uY2FuY2VsbGF0aW9uUG9saWN5Py5sZW5ndGggPiAwIHx8IGNhcnRTZXJ2aWNlc1swXT8ucmVzY2hlZHVsZVBvbGljeT8ubGVuZ3RoXCI+XHJcbiAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJwb2xpY2llcy10aXRsZVwiPlBvbGljaWVzICYgVGVybXM8L2gyPlxyXG5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbXMtY29udGFpbmVyIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtM1wiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dDYW5jZWxsYXRpb25Qb2xpY3kgPSAhc2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJwb2xpY3ktdGl0bGVcIj5DYW5jZWxsYXRpb24gUG9saWN5PC9oMz5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvbGljeS1hcnJvdyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIj48bWF0LWljb25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFzaG93Q2FuY2VsbGF0aW9uUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd0NhbmNlbGxhdGlvblBvbGljeVwiPmtleWJvYXJkX2Fycm93X2Rvd248L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FuY2VsbGF0aW9uX3BvbGljaWVzIGQtZmxleCBmbGV4LWNvbHVtbiBnYXAtMiBmdy01MDBcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAqbmdJZj1cInNob3dDYW5jZWxsYXRpb25Qb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nRm9yPVwibGV0IHBvbGljeSBvZiBjYXJ0U2VydmljZXNbMF0/LmNhbmNlbGxhdGlvblBvbGljeVwiPiYjODIyNjtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7cG9saWN5fX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktaXRlbSBkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gYWxpZ24taXRlbXMtY2VudGVyXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNob3dSZWR1Y2luZ1BvbGljeSA9ICFzaG93UmVkdWNpbmdQb2xpY3lcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwicG9saWN5LXRpdGxlXCI+UmVzY2hlZHVsaW5nIFBvbGljeTwvaDM+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwb2xpY3ktYXJyb3cgZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+PG1hdC1pY29uXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhc2hvd1JlZHVjaW5nUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfcmlnaHQ8L21hdC1pY29uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uICpuZ0lmPVwic2hvd1JlZHVjaW5nUG9saWN5XCI+a2V5Ym9hcmRfYXJyb3dfZG93bjwvbWF0LWljb24+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYW5jZWxsYXRpb25fcG9saWNpZXMgZC1mbGV4IGZsZXgtY29sdW1uIGdhcC0yIGZ3LTUwMFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICpuZ0lmPVwic2hvd1JlZHVjaW5nUG9saWN5XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0Zvcj1cImxldCBwb2xpY3kgb2YgY2FydFNlcnZpY2VzWzBdPy5yZXNjaGVkdWxlUG9saWN5XCI+JiM4MjI2OyB7e3BvbGljeX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFjY2VwdGFuY2Utc2VjdGlvblwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImN1c3RvbS1jaGVja2JveFwiIFsobmdNb2RlbCldPVwidGVybXNBbmRDb25kaXRpb25zXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiY2hlY2tSZXF1aXJlZFZhbHVlcygpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhY2NlcHRhbmNlLXRleHRcIiBzdHlsZT1cIm1hcmdpbi1ib3R0b206MHB4ICFpbXBvcnRhbnRcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgSSB1bmRlcnN0YW5kIGFuZCBhY2NlcHQgdGhlIGNhbmNlbGxhdGlvbiAmIHJlc2NoZWR1bGluZyBwb2xpY2llcy5cclxuICAgICAgICAgICAgICAgICAgICA8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjcGF5bWVudFRhYj5cclxuICAgIDxkaXYgY2xhc3M9XCJ3LTYwIHBheW1lbnRfc2VjdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidy0xMDAgZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyIGZsZXgtY29sdW1uXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicGF5bWVudC1oZWFkZXIgbWItMyB3LTEwMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxoMSBzdHlsZT1cImZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OiA2MDA7XCI+Qm9va2luZyBTdW1tYXJ5PC9oMT5cclxuICAgICAgICAgICAgICAgICAgICA8cCBjbGFzcz1cInBheW1lbnQtc3VidGl0bGUgbWItMFwiPlJldmlldyB5b3VyIGJvb2tpbmcgYmVmb3JlIGNvbmZpcm1pbmc8L3A+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9va2luZy1zdW1tYXJ5LWNhcmRcIiBbbmdDbGFzc109XCJ7J3ctMTAwJyA6IHNjcmVlbldpZHRoIDwgNDc1LCd3LTUwJzpzY3JlZW5XaWR0aCA+IDQ3NX1cIj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2ICpuZ0Zvcj1cImxldCBsaW5lIG9mIHJlc29sdmVkTGluZXM7IGxldCBpID0gaW5kZXhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiICpuZ0lmPVwicmVzb2x2ZWRMaW5lcy5sZW5ndGggPiAxXCI+TGluZSB7e2kgKyAxfX08L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdGb3I9XCJsZXQgcyBvZiBsaW5lLnNlcnZpY2VzXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPnt7cy5uYW1lfX08L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+PHNwYW4gY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2xcIj7igrk8L3NwYW4+e3tzZXJ2aWNlUHJpY2Uocy5pZCl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJsaW5lLnN0YWZmTmFtZSB8fCBsaW5lLnNlbGVjdGVkU3RhZmZOYW1lXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlByb2Zlc3Npb25hbDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj57e2xpbmUuc3RhZmZOYW1lIHx8IGxpbmUuc2VsZWN0ZWRTdGFmZk5hbWV9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCIgKm5nSWY9XCJzZWxlY3RlZE1vZGUgPT09ICdTVE9SRV9WSVNJVCdcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LWxhYmVsXCI+TG9jYXRpb248L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+e3tzZWxlY3RlZExvY2F0aW9uPy5zdG9yZU5hbWUgPz8gJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkRhdGUgJiBUaW1lPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS12YWx1ZVwiPnt7c2VsZWN0ZWREYXRlU3RyfX0gYXQge3tsaW5lLnNlbGVjdGVkU2xvdD8udmFsdWUgPz8gJ04vQSd9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdJZj1cInByb2R1Y3RDYXJ0SXRlbXMubGVuZ3RoID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8aDIgY2xhc3M9XCJzdW1tYXJ5LXRpdGxlXCI+UHJvZHVjdHM8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1yb3dcIiAqbmdGb3I9XCJsZXQgcCBvZiBwcm9kdWN0Q2FydEl0ZW1zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPnt7cC5pdGVtTmFtZX19IHh7e3AucXVhbnRpdHl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInN1bW1hcnktdmFsdWVcIj48c3BhbiBjbGFzcz1cImN1cnJlbmN5LXN5bWJvbFwiPuKCuTwvc3Bhbj57eyhwLnNlbGxpbmdQcmljZSA/PyBwLnByaWNlID8/IDApICogKHAucXVhbnRpdHkgPz8gMSl9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgICAgICAgICAgICAgPGgyIGNsYXNzPVwic3VtbWFyeS10aXRsZVwiPlBheW1lbnQ8L2gyPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiICpuZ0lmPVwiaG9tZVZpc2l0Q2hhcmdlID4gMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPkhvbWUgdmlzaXQgY2hhcmdlPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+PHNwYW4gY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2xcIj7igrk8L3NwYW4+e3tob21lVmlzaXRDaGFyZ2V9fTwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXJvd1wiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3VtbWFyeS1sYWJlbFwiPlRvdGFsPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdW1tYXJ5LXZhbHVlXCI+PHNwYW4gY2xhc3M9XCJjdXJyZW5jeS1zeW1ib2xcIj7igrk8L3NwYW4+e3tyZXZpZXdUb3RhbH19PC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuXHJcbjxuZy10ZW1wbGF0ZSAjc3RhdHVzVGVtcGxhdGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYm9va2luZy1jb25maXJtYXRpb25cIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwic3VjY2Vzcy1pY29uXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja21hcmstY2lyY2xlXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvODgxMjkzYzE3NTg2OTU1Nzg1MThzdWNjZXNzLmdpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiICpuZ0lmPVwiYXBpU3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8aW1nIHNyYz1cImh0dHBzOi8vZDJ6OTQ5N3hwOHhiMTIuY2xvdWRmcm9udC5uZXQvcHJvZC1pbWFnZXMvMzI1MDAwYzE3NTg2OTU1NjQ1MThmYWlsLmdpZlwiXHJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ3LTEwMCBoLTEwMFwiICpuZ0lmPVwiIWFwaVN0YXR1c1wiPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuXHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbmZpcm1hdGlvbi1jb250ZW50XCI+XHJcbiAgICAgICAgICAgIDxoMSBjbGFzcz1cImNvbmZpcm1hdGlvbi10aXRsZVwiPnt7YXBpU3RhdHVzID8gJ0Jvb2tpbmcgQ29uZmlybWVkIScgOiAnQm9va2luZyBGYWlsZWQnfX08L2gxPlxyXG4gICAgICAgICAgICA8cCBjbGFzcz1cImNvbmZpcm1hdGlvbi1tZXNzYWdlXCI+XHJcbiAgICAgICAgICAgICAgICB7e2FwaVN0YXR1cyA/ICdZb3VyIGFwcG9pbnRtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBib29rZWQuJzonRmFpbGVkIHRvIGJvb2sgeW91IGFwcG9pbnRtZW50LiBQbGVhc2VcclxuICAgICAgICAgICAgICAgIHRyeSBhZ2FpbiBsYXRlcid9fVxyXG4gICAgICAgICAgICA8L3A+XHJcblxyXG4gICAgICAgICAgICA8IS0tIFZpZGVvIENhbGwgbGluaywgd2hlbiBhbHJlYWR5IHByZXNlbnQgb24gdGhlIGNvbmZpcm1lZCBncm91cCAoYSBwYWlkIFZpZGVvIENhbGwnc1xyXG4gICAgICAgICAgICAgICAgIGxpbmsgb25seSBhcHBlYXJzIG9uY2UgcGF5bWVudCB2ZXJpZmljYXRpb24gY29tcGxldGVzLCBoYW5kbGVkIGVsc2V3aGVyZSAtIHNlZVxyXG4gICAgICAgICAgICAgICAgIHZlcmlmeS1wYXltZW50LmNvbXBvbmVudC50cywgbm90IHRoaXMgc2NyZWVuKS4gLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ2aWRlby1jYWxsLWxpbmstY2FyZCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1cyAmJiBzZWxlY3RlZE1vZGUgPT09ICdWSURFT19DQUxMJyAmJiBib29raW5nR3JvdXA/LnZpZGVvQ2FsbExpbmtcIj5cclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLWNhcmRcIj5cclxuICAgICAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJkZXRhaWxzLXRpdGxlXCI+WW91ciBWaWRlbyBDYWxsIExpbms8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxhIFtocmVmXT1cImJvb2tpbmdHcm91cC52aWRlb0NhbGxMaW5rXCIgdGFyZ2V0PVwiX2JsYW5rXCI+e3tib29raW5nR3JvdXAudmlkZW9DYWxsTGlua319PC9hPlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwiYXBpU3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy10aXRsZVwiPkFwcG9pbnRtZW50IERldGFpbHM8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiICpuZ0Zvcj1cImxldCBsaW5lIG9mIHJlc29sdmVkTGluZXNcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj57e2xpbmUuc2VydmljZXMubGVuZ3RoID8gKGxpbmUuc2VydmljZXNbMF0ubmFtZSkgOiAnUHJvZHVjdHMnfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+e3tzZWxlY3RlZERhdGVTdHJ9fSBhdCB7e2xpbmUuc2VsZWN0ZWRTbG90Py52YWx1ZSA/PyAnTi9BJ319PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCB3LTEwMCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiICpuZ0lmPVwiYXBpU3RhdHVzXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1jYXJkXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwiZGV0YWlscy10aXRsZVwiPlBheW1lbnQ8L2gzPlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkZXRhaWxzLXJvd1wiICpuZ0lmPVwiYm9va2luZ0dyb3VwPy5ob21lVmlzaXRDaGFyZ2UgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+SG9tZSB2aXNpdCBjaGFyZ2U8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+4oK5e3tib29raW5nR3JvdXAuaG9tZVZpc2l0Q2hhcmdlfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRldGFpbHMtcm93XCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+VG90YWw8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLXZhbHVlXCI+4oK5e3tib29raW5nVG90YWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1yb3dcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkZXRhaWwtbGFiZWxcIj5QYWlkPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPuKCuXt7Ym9va2luZ1BhaWR9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGV0YWlscy1yb3dcIiAqbmdJZj1cImJvb2tpbmdEdWUgPiAwXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGV0YWlsLWxhYmVsXCI+RHVlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRldGFpbC12YWx1ZVwiPuKCuXt7Ym9va2luZ0R1ZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvbmUtYWN0aW9ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiAqbmdJZj1cImFwaVN0YXR1c1wiPlxyXG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0FkbWluQ29udGV4dDsgZWxzZSBhZG1pbkRvbmVBY3Rpb25zXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkb25lLWJ0biBkb25lLWJ0bi1wcmltYXJ5XCIgKGNsaWNrKT1cImdvVG9NeUJvb2tpbmdzKClcIj5WaWV3IG15IGJvb2tpbmdzPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJkb25lLWJ0biBkb25lLWJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwiZ29Ub0xpc3RpbmcoKVwiPktlZXAgc2hvcHBpbmc8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNhZG1pbkRvbmVBY3Rpb25zPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZG9uZS1idG4gZG9uZS1idG4tcHJpbWFyeVwiIChjbGljayk9XCJnb1RvQXBwb2ludG1lbnRzTGlzdCgpXCI+QmFjayB0byBBcHBvaW50bWVudHMgTGlzdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiZG9uZS1idG4gZG9uZS1idG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cImJvb2tBbm90aGVyKClcIj5Cb29rIEFub3RoZXI8L2J1dHRvbj5cclxuICAgICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvbmctdGVtcGxhdGU+XHJcbiJdfQ==
|