ng-easycommerce-v18 0.0.1 → 0.0.2
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 -27
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/ct.json +273 -273
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/en.json +0 -0
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/es.json +387 -387
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/fr.json +0 -0
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/gl.json +273 -273
- package/{projects/ng-easycommerce/src/lib/assets → assets}/ec-i18n/pr.json +273 -273
- package/{projects/ng-easycommerce/src/lib/assets → assets}/recaptcha/recaptcha-site-keys.json +3 -3
- package/{projects/ng-easycommerce/src/lib/assets → assets}/recaptcha/recaptcha-sites-prod.json +38 -38
- package/{projects/ng-easycommerce/src/lib/assets → assets}/recaptcha/recaptcha-sites.json +52 -52
- package/esm2022/lib/api/connection.service.mjs +75 -0
- package/esm2022/lib/api/index.mjs +2 -0
- package/esm2022/lib/classes/checkout/index.mjs +2 -0
- package/esm2022/lib/classes/checkout/steps.mjs +29 -0
- package/esm2022/lib/classes/filters/attributes-filter.mjs +73 -0
- package/esm2022/lib/classes/filters/category-filter.mjs +59 -0
- package/esm2022/lib/classes/filters/dynamics-filter.mjs +58 -0
- package/esm2022/lib/classes/filters/filter-factory.mjs +21 -0
- package/esm2022/lib/classes/filters/filter.mjs +83 -0
- package/esm2022/lib/classes/filters/index.mjs +7 -0
- package/esm2022/lib/classes/filters/sort-filter.mjs +88 -0
- package/esm2022/lib/classes/index.mjs +4 -0
- package/esm2022/lib/classes/user.mjs +59 -0
- package/esm2022/lib/constants/api.constants.service.mjs +71 -0
- package/esm2022/lib/constants/core.constants.service.mjs +196 -0
- package/esm2022/lib/constants/index.mjs +3 -0
- package/esm2022/lib/ec-components/abstractions-components/block-ec.component.mjs +110 -0
- package/esm2022/lib/ec-components/abstractions-components/index.mjs +3 -0
- package/esm2022/lib/ec-components/abstractions-components/menu-ec.component.mjs +97 -0
- package/esm2022/lib/ec-components/account-ec/account-ec.component.mjs +22 -0
- package/esm2022/lib/ec-components/account-ec/index.mjs +4 -0
- package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +16 -0
- package/esm2022/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.mjs +150 -0
- package/esm2022/lib/ec-components/auth-ec/auth-ec.component.mjs +12 -0
- package/esm2022/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.mjs +30 -0
- package/esm2022/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.mjs +54 -0
- package/esm2022/lib/ec-components/auth-ec/index.mjs +7 -0
- package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +91 -0
- package/esm2022/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.mjs +105 -0
- package/esm2022/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.mjs +153 -0
- package/esm2022/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.mjs +104 -0
- package/esm2022/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.mjs +87 -0
- package/esm2022/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.mjs +87 -0
- package/esm2022/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.mjs +37 -0
- package/esm2022/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.mjs +78 -0
- package/esm2022/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.mjs +109 -0
- package/esm2022/lib/ec-components/blocks-ec/blocks-ec.component.mjs +99 -0
- package/esm2022/lib/ec-components/blocks-ec/index.mjs +5 -0
- package/esm2022/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.mjs +27 -0
- package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +21 -0
- package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +47 -0
- package/esm2022/lib/ec-components/cart-ec/index.mjs +3 -0
- package/esm2022/lib/ec-components/checkout-ec/checkout-ec.component.mjs +60 -0
- package/esm2022/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.mjs +271 -0
- package/esm2022/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.mjs +51 -0
- package/esm2022/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.mjs +45 -0
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.mjs +92 -0
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.mjs +30 -0
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/index.mjs +4 -0
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.mjs +119 -0
- package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.mjs +32 -0
- package/esm2022/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.mjs +96 -0
- package/esm2022/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.mjs +35 -0
- package/esm2022/lib/ec-components/checkout-ec/success-ec/success-ec.component.mjs +55 -0
- package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +72 -0
- package/esm2022/lib/ec-components/coupon-ec/coupon-ec.component.mjs +29 -0
- package/esm2022/lib/ec-components/filters-ec/filters-ec.component.mjs +38 -0
- package/esm2022/lib/ec-components/filters-sort-ec/filters-sort-ec.component.mjs +36 -0
- package/esm2022/lib/ec-components/footer-ec/footer-ec.component.mjs +17 -0
- package/esm2022/lib/ec-components/header-ec/header-ec.component.mjs +18 -0
- package/esm2022/lib/ec-components/home-ec/home-ec.component.mjs +14 -0
- package/esm2022/lib/ec-components/index.mjs +19 -0
- package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +74 -0
- package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +51 -0
- package/esm2022/lib/ec-components/variants-ec/variants-ec.component.mjs +18 -0
- package/esm2022/lib/ec-components/widgets-ec/index.mjs +5 -0
- package/esm2022/lib/ec-components/widgets-ec/loading/index.mjs +4 -0
- package/esm2022/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.mjs +11 -0
- package/esm2022/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.mjs +16 -0
- package/esm2022/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.mjs +12 -0
- package/esm2022/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.mjs +178 -0
- package/esm2022/lib/ec-components/widgets-ec/price-ec/price-ec.component.mjs +27 -0
- package/esm2022/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.mjs +71 -0
- package/esm2022/lib/ec-guards/auth.guard.mjs +18 -0
- package/esm2022/lib/ec-guards/index.mjs +2 -0
- package/esm2022/lib/ec-pipe/ec-currency-symbol.pipe.mjs +98 -0
- package/esm2022/lib/ec-pipe/index.mjs +2 -0
- package/esm2022/lib/ec-services/addressing.service.mjs +185 -0
- package/esm2022/lib/ec-services/analytics/analytics.service.mjs +80 -0
- package/esm2022/lib/ec-services/analytics/doppler.service.mjs +47 -0
- package/esm2022/lib/ec-services/analytics/facebook-pixel.service.mjs +212 -0
- package/esm2022/lib/ec-services/analytics/google-analytics.service.mjs +283 -0
- package/esm2022/lib/ec-services/analytics/gtm.service.mjs +414 -0
- package/esm2022/lib/ec-services/analytics/index.mjs +7 -0
- package/esm2022/lib/ec-services/analytics/metricool-pixel.service.mjs +55 -0
- package/esm2022/lib/ec-services/auth.service.mjs +440 -0
- package/esm2022/lib/ec-services/auth.storage.service.mjs +54 -0
- package/esm2022/lib/ec-services/blocks-repository.service.mjs +64 -0
- package/esm2022/lib/ec-services/blocks.service.mjs +52 -0
- package/esm2022/lib/ec-services/cart.service.mjs +465 -0
- package/esm2022/lib/ec-services/channel.service.mjs +83 -0
- package/esm2022/lib/ec-services/checkout.service.mjs +180 -0
- package/esm2022/lib/ec-services/currency.service.mjs +177 -0
- package/esm2022/lib/ec-services/filters.service.mjs +134 -0
- package/esm2022/lib/ec-services/form.service.mjs +81 -0
- package/esm2022/lib/ec-services/index.mjs +27 -0
- package/esm2022/lib/ec-services/local-storage.service.mjs +58 -0
- package/esm2022/lib/ec-services/ngx-local-storage.service.mjs +66 -0
- package/esm2022/lib/ec-services/options.service.mjs +273 -0
- package/esm2022/lib/ec-services/order-utility.service.mjs +61 -0
- package/esm2022/lib/ec-services/orders.service.mjs +48 -0
- package/esm2022/lib/ec-services/pagination.service.mjs +163 -0
- package/esm2022/lib/ec-services/parameters.service.mjs +65 -0
- package/esm2022/lib/ec-services/payment.service.mjs +54 -0
- package/esm2022/lib/ec-services/product-detail.service.mjs +285 -0
- package/esm2022/lib/ec-services/products.service.mjs +148 -0
- package/esm2022/lib/ec-services/re-captcha.service.mjs +114 -0
- package/esm2022/lib/ec-services/shipment.service.mjs +158 -0
- package/esm2022/lib/ec-services/stores.service.mjs +27 -0
- package/esm2022/lib/ec-services/test.service.mjs +16 -0
- package/esm2022/lib/ec-services/toast.service.mjs +81 -0
- package/esm2022/lib/interceptors/auth.interceptor.mjs +35 -0
- package/esm2022/lib/interceptors/index.mjs +2 -0
- package/esm2022/lib/interfaces/analytics/event-key.mjs +2 -0
- package/esm2022/lib/interfaces/analytics/facebook-pixel-data.mjs +2 -0
- package/esm2022/lib/interfaces/analytics/gtm-config.mjs +2 -0
- package/esm2022/lib/interfaces/analytics/index.mjs +4 -0
- package/esm2022/lib/interfaces/blocks.mjs +2 -0
- package/esm2022/lib/interfaces/checkout.mjs +2 -0
- package/esm2022/lib/interfaces/connection.mjs +2 -0
- package/esm2022/lib/interfaces/coupon.mjs +2 -0
- package/esm2022/lib/interfaces/currency.mjs +2 -0
- package/esm2022/lib/interfaces/deserializable.mjs +2 -0
- package/esm2022/lib/interfaces/environment.mjs +2 -0
- package/esm2022/lib/interfaces/filter.mjs +2 -0
- package/esm2022/lib/interfaces/index.mjs +19 -0
- package/esm2022/lib/interfaces/options.mjs +2 -0
- package/esm2022/lib/interfaces/pagination.mjs +2 -0
- package/esm2022/lib/interfaces/parameter.mjs +2 -0
- package/esm2022/lib/interfaces/product.mjs +2 -0
- package/esm2022/lib/interfaces/step.mjs +2 -0
- package/esm2022/lib/interfaces/storage.mjs +2 -0
- package/esm2022/lib/interfaces/store.mjs +2 -0
- package/esm2022/lib/interfaces/types/index.mjs +2 -0
- package/esm2022/lib/interfaces/types/user.type.mjs +2 -0
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/providers/provideEnvironment.mjs +20 -0
- package/esm2022/lib/stores/currency.store.mjs +10 -0
- package/esm2022/lib/stores/index.mjs +2 -0
- package/esm2022/ng-easycommerce-v18.mjs +5 -0
- package/esm2022/public-api.mjs +20 -0
- package/fesm2022/ng-easycommerce-v18.mjs +8190 -0
- package/fesm2022/ng-easycommerce-v18.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/api/connection.service.d.ts +52 -0
- package/lib/api/index.d.ts +1 -0
- package/lib/classes/checkout/index.d.ts +1 -0
- package/lib/classes/checkout/steps.d.ts +15 -0
- package/lib/classes/filters/attributes-filter.d.ts +14 -0
- package/lib/classes/filters/category-filter.d.ts +14 -0
- package/lib/classes/filters/dynamics-filter.d.ts +13 -0
- package/lib/classes/filters/filter-factory.d.ts +5 -0
- package/lib/classes/filters/filter.d.ts +19 -0
- package/lib/classes/filters/index.d.ts +6 -0
- package/lib/classes/filters/sort-filter.d.ts +14 -0
- package/{projects/ng-easycommerce/src/lib/classes/index.ts → lib/classes/index.d.ts} +3 -3
- package/lib/classes/user.d.ts +50 -0
- package/lib/constants/api.constants.service.d.ts +54 -0
- package/lib/constants/core.constants.service.d.ts +109 -0
- package/lib/constants/index.d.ts +2 -0
- package/lib/ec-components/abstractions-components/block-ec.component.d.ts +62 -0
- package/lib/ec-components/abstractions-components/index.d.ts +2 -0
- package/lib/ec-components/abstractions-components/menu-ec.component.d.ts +67 -0
- package/lib/ec-components/account-ec/account-ec.component.d.ts +10 -0
- package/lib/ec-components/account-ec/index.d.ts +3 -0
- package/lib/ec-components/account-ec/order-ec/order-ec.component.d.ts +8 -0
- package/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.d.ts +55 -0
- package/lib/ec-components/auth-ec/auth-ec.component.d.ts +5 -0
- package/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.d.ts +11 -0
- package/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.d.ts +27 -0
- package/{projects/ng-easycommerce/src/lib/ec-components/auth-ec/index.ts → lib/ec-components/auth-ec/index.d.ts} +6 -6
- package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +42 -0
- package/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.d.ts +39 -0
- package/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.d.ts +62 -0
- package/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.d.ts +46 -0
- package/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.d.ts +54 -0
- package/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.d.ts +21 -0
- package/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.d.ts +25 -0
- package/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.d.ts +17 -0
- package/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.d.ts +51 -0
- package/lib/ec-components/blocks-ec/blocks-ec.component.d.ts +59 -0
- package/{projects/ng-easycommerce/src/lib/ec-components/blocks-ec/index.ts → lib/ec-components/blocks-ec/index.d.ts} +4 -4
- package/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.d.ts +11 -0
- package/lib/ec-components/cart-ec/cart-ec.component.d.ts +12 -0
- package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +17 -0
- package/lib/ec-components/cart-ec/index.d.ts +2 -0
- package/lib/ec-components/checkout-ec/checkout-ec.component.d.ts +20 -0
- package/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.d.ts +83 -0
- package/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.d.ts +14 -0
- package/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.d.ts +11 -0
- package/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.d.ts +37 -0
- package/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.d.ts +11 -0
- package/{projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/index.ts → lib/ec-components/checkout-ec/payment-ec/payment-methods/index.d.ts} +3 -3
- package/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.d.ts +30 -0
- package/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.d.ts +11 -0
- package/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.d.ts +30 -0
- package/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.d.ts +11 -0
- package/lib/ec-components/checkout-ec/success-ec/success-ec.component.d.ts +30 -0
- package/lib/ec-components/collection-ec/collection-ec.component.d.ts +37 -0
- package/lib/ec-components/coupon-ec/coupon-ec.component.d.ts +12 -0
- package/lib/ec-components/filters-ec/filters-ec.component.d.ts +14 -0
- package/lib/ec-components/filters-sort-ec/filters-sort-ec.component.d.ts +14 -0
- package/lib/ec-components/footer-ec/footer-ec.component.d.ts +10 -0
- package/lib/ec-components/header-ec/header-ec.component.d.ts +12 -0
- package/lib/ec-components/home-ec/home-ec.component.d.ts +8 -0
- package/{projects/ng-easycommerce/src/lib/ec-components/index.ts → lib/ec-components/index.d.ts} +18 -17
- package/lib/ec-components/product-detail-ec/product-detail-ec.component.d.ts +35 -0
- package/lib/ec-components/product-ec/product-ec.component.d.ts +31 -0
- package/lib/ec-components/variants-ec/variants-ec.component.d.ts +8 -0
- package/{projects/ng-easycommerce/src/lib/ec-components/widgets-ec/index.ts → lib/ec-components/widgets-ec/index.d.ts} +4 -4
- package/{projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/index.ts → lib/ec-components/widgets-ec/loading/index.d.ts} +3 -3
- package/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.d.ts +5 -0
- package/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.d.ts +6 -0
- package/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.d.ts +5 -0
- package/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.d.ts +70 -0
- package/lib/ec-components/widgets-ec/price-ec/price-ec.component.d.ts +16 -0
- package/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.d.ts +26 -0
- package/lib/ec-guards/auth.guard.d.ts +8 -0
- package/lib/ec-guards/index.d.ts +1 -0
- package/lib/ec-pipe/ec-currency-symbol.pipe.d.ts +54 -0
- package/lib/ec-pipe/index.d.ts +1 -0
- package/lib/ec-services/addressing.service.d.ts +233 -0
- package/lib/ec-services/analytics/analytics.service.d.ts +50 -0
- package/lib/ec-services/analytics/doppler.service.d.ts +26 -0
- package/lib/ec-services/analytics/facebook-pixel.service.d.ts +102 -0
- package/lib/ec-services/analytics/google-analytics.service.d.ts +118 -0
- package/lib/ec-services/analytics/gtm.service.d.ts +153 -0
- package/{projects/ng-easycommerce/src/lib/ec-services/analytics/index.ts → lib/ec-services/analytics/index.d.ts} +6 -6
- package/lib/ec-services/analytics/metricool-pixel.service.d.ts +26 -0
- package/lib/ec-services/auth.service.d.ts +229 -0
- package/lib/ec-services/auth.storage.service.d.ts +24 -0
- package/lib/ec-services/blocks-repository.service.d.ts +40 -0
- package/lib/ec-services/blocks.service.d.ts +38 -0
- package/lib/ec-services/cart.service.d.ts +211 -0
- package/lib/ec-services/channel.service.d.ts +59 -0
- package/lib/ec-services/checkout.service.d.ts +49 -0
- package/lib/ec-services/currency.service.d.ts +108 -0
- package/lib/ec-services/filters.service.d.ts +56 -0
- package/lib/ec-services/form.service.d.ts +50 -0
- package/{projects/ng-easycommerce/src/lib/ec-services/index.ts → lib/ec-services/index.d.ts} +26 -24
- package/lib/ec-services/local-storage.service.d.ts +40 -0
- package/lib/ec-services/ngx-local-storage.service.d.ts +42 -0
- package/lib/ec-services/options.service.d.ts +121 -0
- package/lib/ec-services/order-utility.service.d.ts +15 -0
- package/lib/ec-services/orders.service.d.ts +14 -0
- package/lib/ec-services/pagination.service.d.ts +89 -0
- package/lib/ec-services/parameters.service.d.ts +41 -0
- package/lib/ec-services/payment.service.d.ts +22 -0
- package/lib/ec-services/product-detail.service.d.ts +97 -0
- package/lib/ec-services/products.service.d.ts +48 -0
- package/lib/ec-services/re-captcha.service.d.ts +65 -0
- package/lib/ec-services/shipment.service.d.ts +49 -0
- package/lib/ec-services/stores.service.d.ts +12 -0
- package/lib/ec-services/test.service.d.ts +6 -0
- package/lib/ec-services/toast.service.d.ts +59 -0
- package/lib/interceptors/auth.interceptor.d.ts +2 -0
- package/lib/interceptors/index.d.ts +1 -0
- package/lib/interfaces/analytics/event-key.d.ts +1 -0
- package/lib/interfaces/analytics/facebook-pixel-data.d.ts +5 -0
- package/{projects/ng-easycommerce/src/lib/interfaces/analytics/gtm-config.ts → lib/interfaces/analytics/gtm-config.d.ts} +6 -6
- package/{projects/ng-easycommerce/src/lib/interfaces/analytics/index.ts → lib/interfaces/analytics/index.d.ts} +3 -3
- package/lib/interfaces/blocks.d.ts +41 -0
- package/{projects/ng-easycommerce/src/lib/interfaces/checkout.ts → lib/interfaces/checkout.d.ts} +12 -14
- package/{projects/ng-easycommerce/src/lib/interfaces/connection.ts → lib/interfaces/connection.d.ts} +7 -8
- package/lib/interfaces/coupon.d.ts +5 -0
- package/lib/interfaces/currency.d.ts +9 -0
- package/{projects/ng-easycommerce/src/lib/interfaces/deserializable.ts → lib/interfaces/deserializable.d.ts} +3 -3
- package/{projects/ng-easycommerce/src/lib/interfaces/environment.ts → lib/interfaces/environment.d.ts} +6 -6
- package/{projects/ng-easycommerce/src/lib/interfaces/filter.ts → lib/interfaces/filter.d.ts} +38 -59
- package/{projects/ng-easycommerce/src/lib/interfaces/index.ts → lib/interfaces/index.d.ts} +16 -18
- package/lib/interfaces/options.d.ts +26 -0
- package/lib/interfaces/pagination.d.ts +24 -0
- package/lib/interfaces/parameter.d.ts +14 -0
- package/{projects/ng-easycommerce/src/lib/interfaces/product.ts → lib/interfaces/product.d.ts} +73 -81
- package/lib/interfaces/step.d.ts +15 -0
- package/lib/interfaces/storage.d.ts +7 -0
- package/{projects/ng-easycommerce/src/lib/interfaces/store.ts → lib/interfaces/store.d.ts} +17 -17
- package/lib/interfaces/types/index.d.ts +1 -0
- package/lib/interfaces/types/user.type.d.ts +5 -0
- package/lib/providers/index.d.ts +1 -0
- package/lib/providers/provideEnvironment.d.ts +13 -0
- package/lib/stores/currency.store.d.ts +7 -0
- package/lib/stores/index.d.ts +1 -0
- package/package.json +29 -58
- package/{projects/ng-easycommerce/src/public-api.ts → public-api.d.ts} +8 -24
- package/.editorconfig +0 -16
- package/angular.json +0 -48
- package/projects/ng-easycommerce/README.md +0 -24
- package/projects/ng-easycommerce/ng-package.json +0 -7
- package/projects/ng-easycommerce/package.json +0 -12
- package/projects/ng-easycommerce/src/lib/api/connection.service.ts +0 -79
- package/projects/ng-easycommerce/src/lib/api/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/classes/checkout/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/classes/checkout/steps.ts +0 -37
- package/projects/ng-easycommerce/src/lib/classes/filters/attributes-filter.ts +0 -74
- package/projects/ng-easycommerce/src/lib/classes/filters/category-filter.ts +0 -57
- package/projects/ng-easycommerce/src/lib/classes/filters/dynamics-filter.ts +0 -57
- package/projects/ng-easycommerce/src/lib/classes/filters/filter-factory.ts +0 -23
- package/projects/ng-easycommerce/src/lib/classes/filters/filter.ts +0 -89
- package/projects/ng-easycommerce/src/lib/classes/filters/index.ts +0 -6
- package/projects/ng-easycommerce/src/lib/classes/filters/sort-filter.ts +0 -93
- package/projects/ng-easycommerce/src/lib/classes/user.ts +0 -68
- package/projects/ng-easycommerce/src/lib/constants/api.constants.service.ts +0 -69
- package/projects/ng-easycommerce/src/lib/constants/core.constants.service.ts +0 -210
- package/projects/ng-easycommerce/src/lib/constants/index.ts +0 -2
- package/projects/ng-easycommerce/src/lib/ec-components/abstractions-components/block-ec.component.ts +0 -107
- package/projects/ng-easycommerce/src/lib/ec-components/abstractions-components/index.ts +0 -2
- package/projects/ng-easycommerce/src/lib/ec-components/abstractions-components/menu-ec.component.ts +0 -102
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/auth-ec.component.html +0 -10
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/auth-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/auth-ec.component.ts +0 -13
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.html +0 -19
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/confirm-account-ec/confirm-account-ec.component.ts +0 -34
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.html +0 -31
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/forgot-password-ec/forgot-password-ec.component.ts +0 -55
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.html +0 -30
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.ts +0 -92
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.html +0 -55
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-form-ec/register-form-ec.component.ts +0 -102
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.html +0 -233
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/auth-ec/register-wholesaler-form-ec/register-wholesaler-form-ec.component.ts +0 -149
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.html +0 -113
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.scss +0 -12
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-box-ec/block-banner-box-ec.component.ts +0 -100
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.html +0 -111
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-banner-full-ec/block-banner-full-ec.component.ts +0 -77
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.html +0 -62
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-form-contact-ec/block-form-contact-ec.component.ts +0 -89
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-html-ec/block-html-ec.component.ts +0 -33
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-newsletter-ec/block-newsletter-ec.component.ts +0 -81
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.html +0 -40
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/block-products-ec/block-products-ec.component.ts +0 -97
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/blocks-ec.component.html +0 -41
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/blocks-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/blocks-ec/blocks-ec.component.ts +0 -86
- package/projects/ng-easycommerce/src/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.html +0 -20
- package/projects/ng-easycommerce/src/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/breadcrumb-ec/breadcrumb-ec.component.ts +0 -30
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-ec.component.ts +0 -24
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.ts +0 -51
- package/projects/ng-easycommerce/src/lib/ec-components/cart-ec/index.ts +0 -2
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/checkout-ec.component.html +0 -56
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/checkout-ec.component.scss +0 -38
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/checkout-ec.component.ts +0 -67
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.html +0 -836
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.ts +0 -302
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.html +0 -32
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/dataform-ec/input-ec/input-ec.component.ts +0 -52
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.html +0 -12
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/detail-checkout-block-ec/detail-checkout-block-ec.component.ts +0 -48
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.html +0 -195
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.ts +0 -103
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.html +0 -28
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/bank-transfer-ec/bank-transfer-ec.component.ts +0 -26
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.html +0 -33
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.ts +0 -116
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.html +0 -13
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/payment-ec/payment-methods/offline-ec/offline-ec.component.ts +0 -26
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.html +0 -111
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/shipment-ec/shipment-ec.component.ts +0 -111
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.html +0 -33
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/step-container-ec/step-container-ec.component.ts +0 -39
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/success-ec/success-ec.component.html +0 -59
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/success-ec/success-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/checkout-ec/success-ec/success-ec.component.ts +0 -65
- package/projects/ng-easycommerce/src/lib/ec-components/collection-ec/collection-ec.component.html +0 -16
- package/projects/ng-easycommerce/src/lib/ec-components/collection-ec/collection-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/collection-ec/collection-ec.component.ts +0 -83
- package/projects/ng-easycommerce/src/lib/ec-components/coupon-ec/coupon-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/coupon-ec/coupon-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/coupon-ec/coupon-ec.component.ts +0 -32
- package/projects/ng-easycommerce/src/lib/ec-components/filters-ec/filters-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/filters-ec/filters-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/filters-ec/filters-ec.component.ts +0 -45
- package/projects/ng-easycommerce/src/lib/ec-components/filters-sort-ec/filters-sort-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/filters-sort-ec/filters-sort-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/filters-sort-ec/filters-sort-ec.component.ts +0 -49
- package/projects/ng-easycommerce/src/lib/ec-components/footer-ec/footer-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/footer-ec/footer-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/footer-ec/footer-ec.component.spec.ts +0 -23
- package/projects/ng-easycommerce/src/lib/ec-components/footer-ec/footer-ec.component.ts +0 -18
- package/projects/ng-easycommerce/src/lib/ec-components/header-ec/header-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/header-ec/header-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/header-ec/header-ec.component.spec.ts +0 -23
- package/projects/ng-easycommerce/src/lib/ec-components/header-ec/header-ec.component.ts +0 -22
- package/projects/ng-easycommerce/src/lib/ec-components/home-ec/home-ec.component.html +0 -1
- package/projects/ng-easycommerce/src/lib/ec-components/home-ec/home-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/home-ec/home-ec.component.spec.ts +0 -23
- package/projects/ng-easycommerce/src/lib/ec-components/home-ec/home-ec.component.ts +0 -16
- package/projects/ng-easycommerce/src/lib/ec-components/product-detail-ec/product-detail-ec.component.html +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/product-detail-ec/product-detail-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/product-detail-ec/product-detail-ec.component.ts +0 -82
- package/projects/ng-easycommerce/src/lib/ec-components/product-ec/product-ec.component.html +0 -31
- package/projects/ng-easycommerce/src/lib/ec-components/product-ec/product-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/product-ec/product-ec.component.ts +0 -46
- package/projects/ng-easycommerce/src/lib/ec-components/variants-ec/variants-ec.component.html +0 -65
- package/projects/ng-easycommerce/src/lib/ec-components/variants-ec/variants-ec.component.scss +0 -8
- package/projects/ng-easycommerce/src/lib/ec-components/variants-ec/variants-ec.component.ts +0 -20
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.html +0 -7
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-full-ec/loading-full-ec.component.ts +0 -13
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.html +0 -5
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-inline-ec/loading-inline-ec.component.ts +0 -13
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.html +0 -3
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/loading/loading-section-ec/loading-section-ec.component.ts +0 -13
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.html +0 -11
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/magnizoom-ec/magnizoom-ec.component.ts +0 -177
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/price-ec/price-ec.component.html +0 -47
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/price-ec/price-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/price-ec/price-ec.component.ts +0 -22
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.html +0 -6
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.scss +0 -0
- package/projects/ng-easycommerce/src/lib/ec-components/widgets-ec/re-captcha-ec/re-captcha-ec.component.ts +0 -70
- package/projects/ng-easycommerce/src/lib/ec-guards/auth.guard.ts +0 -19
- package/projects/ng-easycommerce/src/lib/ec-guards/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/ec-pipe/ec-currency-symbol.pipe.ts +0 -99
- package/projects/ng-easycommerce/src/lib/ec-pipe/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/ec-services/addressing.service.ts +0 -199
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/analytics.service.ts +0 -76
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/doppler.service.ts +0 -38
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/facebook-pixel.service.ts +0 -214
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/google-analytics.service.ts +0 -284
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/gtm.service.ts +0 -413
- package/projects/ng-easycommerce/src/lib/ec-services/analytics/metricool-pixel.service.ts +0 -46
- package/projects/ng-easycommerce/src/lib/ec-services/auth.service.ts +0 -438
- package/projects/ng-easycommerce/src/lib/ec-services/auth.storage.service.ts +0 -54
- package/projects/ng-easycommerce/src/lib/ec-services/blocks-repository.service.ts +0 -67
- package/projects/ng-easycommerce/src/lib/ec-services/blocks.service.ts +0 -48
- package/projects/ng-easycommerce/src/lib/ec-services/cart.service.ts +0 -492
- package/projects/ng-easycommerce/src/lib/ec-services/channel.service.ts +0 -81
- package/projects/ng-easycommerce/src/lib/ec-services/checkout.service.ts +0 -196
- package/projects/ng-easycommerce/src/lib/ec-services/currency.service.ts +0 -179
- package/projects/ng-easycommerce/src/lib/ec-services/filters.service.ts +0 -133
- package/projects/ng-easycommerce/src/lib/ec-services/form.service.ts +0 -82
- package/projects/ng-easycommerce/src/lib/ec-services/local-storage.service.ts +0 -54
- package/projects/ng-easycommerce/src/lib/ec-services/ngx-local-storage.service.ts +0 -66
- package/projects/ng-easycommerce/src/lib/ec-services/options.service.ts +0 -274
- package/projects/ng-easycommerce/src/lib/ec-services/order-utility.service.ts +0 -52
- package/projects/ng-easycommerce/src/lib/ec-services/pagination.service.ts +0 -172
- package/projects/ng-easycommerce/src/lib/ec-services/parameters.service.ts +0 -67
- package/projects/ng-easycommerce/src/lib/ec-services/payment.service.ts +0 -63
- package/projects/ng-easycommerce/src/lib/ec-services/product-detail.service.ts +0 -288
- package/projects/ng-easycommerce/src/lib/ec-services/products.service.ts +0 -162
- package/projects/ng-easycommerce/src/lib/ec-services/re-captcha.service.ts +0 -126
- package/projects/ng-easycommerce/src/lib/ec-services/shipment.service.ts +0 -174
- package/projects/ng-easycommerce/src/lib/ec-services/stores.service.ts +0 -27
- package/projects/ng-easycommerce/src/lib/ec-services/toast.service.ts +0 -84
- package/projects/ng-easycommerce/src/lib/interceptors/auth.interceptor.ts +0 -43
- package/projects/ng-easycommerce/src/lib/interceptors/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/interfaces/analytics/event-key.ts +0 -14
- package/projects/ng-easycommerce/src/lib/interfaces/analytics/facebook-pixel-data.ts +0 -5
- package/projects/ng-easycommerce/src/lib/interfaces/blocks.ts +0 -56
- package/projects/ng-easycommerce/src/lib/interfaces/coupon.ts +0 -5
- package/projects/ng-easycommerce/src/lib/interfaces/currency.ts +0 -10
- package/projects/ng-easycommerce/src/lib/interfaces/options.ts +0 -28
- package/projects/ng-easycommerce/src/lib/interfaces/pagination.ts +0 -27
- package/projects/ng-easycommerce/src/lib/interfaces/parameter.ts +0 -15
- package/projects/ng-easycommerce/src/lib/interfaces/step.ts +0 -19
- package/projects/ng-easycommerce/src/lib/interfaces/storage.ts +0 -7
- package/projects/ng-easycommerce/src/lib/interfaces/types/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/interfaces/types/user.type.ts +0 -5
- package/projects/ng-easycommerce/src/lib/providers/index.ts +0 -1
- package/projects/ng-easycommerce/src/lib/providers/provideEnvironment.ts +0 -24
- package/projects/ng-easycommerce/src/lib/stores/currency.store.ts +0 -20
- package/projects/ng-easycommerce/src/lib/stores/index.ts +0 -1
- package/projects/ng-easycommerce/tsconfig.lib.json +0 -15
- package/projects/ng-easycommerce/tsconfig.lib.prod.json +0 -11
- package/projects/ng-easycommerce/tsconfig.spec.json +0 -15
- package/tsconfig.doc.json +0 -4
- package/tsconfig.json +0 -37
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { Component, inject } from '@angular/core';
|
|
2
|
+
import { FormBuilder, FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
|
|
3
|
+
import { RouterLink } from '@angular/router';
|
|
4
|
+
import { LoginFormEcComponent } from '../../auth-ec';
|
|
5
|
+
import { TranslateModule } from '@ngx-translate/core';
|
|
6
|
+
import { AddressingService, AuthService, CartService, ChannelService, CheckoutService, FormService, ParametersService, ToastService } from '../../../ec-services';
|
|
7
|
+
import { AsyncPipe, JsonPipe, TitleCasePipe } from '@angular/common';
|
|
8
|
+
import { ApiConstantsService } from '../../../constants';
|
|
9
|
+
import { LoadingFullEcComponent } from '../../widgets-ec';
|
|
10
|
+
import { BehaviorSubject, filter, firstValueFrom } from 'rxjs';
|
|
11
|
+
import { BlocksEcComponent } from "../../blocks-ec/blocks-ec.component";
|
|
12
|
+
import * as i0 from "@angular/core";
|
|
13
|
+
import * as i1 from "@angular/forms";
|
|
14
|
+
import * as i2 from "@ngx-translate/core";
|
|
15
|
+
export class DataformEcComponent {
|
|
16
|
+
_channelService = inject(ChannelService);
|
|
17
|
+
_authService = inject(AuthService);
|
|
18
|
+
_paramsService = inject(ParametersService);
|
|
19
|
+
_apiConsts = inject(ApiConstantsService);
|
|
20
|
+
_addressingService = inject(AddressingService);
|
|
21
|
+
_cartService = inject(CartService);
|
|
22
|
+
_toastService = inject(ToastService);
|
|
23
|
+
_formService = inject(FormService);
|
|
24
|
+
_checkoutService = inject(CheckoutService);
|
|
25
|
+
_formBuilder = inject(FormBuilder);
|
|
26
|
+
modeSelectAddress = this._addressingService.modeSelectAddress;
|
|
27
|
+
cartItems = [];
|
|
28
|
+
channel$ = this._channelService.channel$;
|
|
29
|
+
countries$ = this._formService.getCountriesData();
|
|
30
|
+
provinces$ = this._formService.provinces$;
|
|
31
|
+
documentTypes$ = this._formService.documentTypes$;
|
|
32
|
+
isLastStep$ = this._checkoutService.isLastStep$;
|
|
33
|
+
loadingStep$ = this._checkoutService.loadingStep$;
|
|
34
|
+
selectAddress = false;
|
|
35
|
+
params;
|
|
36
|
+
addressBook = [];
|
|
37
|
+
addressBookSelected = { id: 0, notes: "" };
|
|
38
|
+
form_ready = false;
|
|
39
|
+
loading = false;
|
|
40
|
+
allready_data = false;
|
|
41
|
+
require_login = false;
|
|
42
|
+
checkoutForm;
|
|
43
|
+
checkoutFormFacturacion;
|
|
44
|
+
getTypeForm = this._addressingService.getTypeForm;
|
|
45
|
+
isLastOne = false;
|
|
46
|
+
loadingStep = false;
|
|
47
|
+
postalCodePattern = '^[0-9][0-9]*$';
|
|
48
|
+
countriesFacturacionSubject = new BehaviorSubject([]);
|
|
49
|
+
provincesFacturacionSubject = new BehaviorSubject([]);
|
|
50
|
+
documentTypesFacturacionSubject = new BehaviorSubject([]);
|
|
51
|
+
countriesFacturacion$ = this.countriesFacturacionSubject.asObservable();
|
|
52
|
+
provincesFacturacion$ = this.provincesFacturacionSubject.asObservable();
|
|
53
|
+
documentTypesFacturacion$ = this.documentTypesFacturacionSubject.asObservable();
|
|
54
|
+
viewDataFacturacion = true;
|
|
55
|
+
validado = false;
|
|
56
|
+
constructor() {
|
|
57
|
+
this.checkoutForm = this._formBuilder.group({
|
|
58
|
+
...this._addressingService.getTypeForm()?.configForm.formAddres,
|
|
59
|
+
postcode: ['', [Validators.required, Validators.pattern(this.postalCodePattern)]]
|
|
60
|
+
});
|
|
61
|
+
this.checkoutForm.statusChanges
|
|
62
|
+
.pipe(filter(() => { this.onFormChange(); return this.checkoutForm.valid; }))
|
|
63
|
+
.subscribe(() => this.onFormValid());
|
|
64
|
+
this.checkoutFormFacturacion = this._formBuilder.group({
|
|
65
|
+
...this._addressingService.getTypeForm()?.configForm.formBilling,
|
|
66
|
+
postcode: ['', [Validators.required, Validators.pattern(this.postalCodePattern)]] // Se agrega para que sólo acepte códigos postales mayores que cero
|
|
67
|
+
});
|
|
68
|
+
this.checkoutFormFacturacion.statusChanges
|
|
69
|
+
.pipe(filter(() => { this.onFormChange(); return this.checkoutFormFacturacion.valid; }))
|
|
70
|
+
.subscribe(() => this.onFormValid());
|
|
71
|
+
this.isLastStep$.subscribe(res => this.isLastOne = res);
|
|
72
|
+
this.loadingStep$.subscribe(res => this.loadingStep = res);
|
|
73
|
+
}
|
|
74
|
+
ngOnInit() {
|
|
75
|
+
this._paramsService.getParameters().subscribe(params => this.params = params);
|
|
76
|
+
this._cartService.cartItems$.subscribe(items => this.cartItems = items);
|
|
77
|
+
this._authService.isAuthenticated() && this.checkoutForm.controls['email'].setValue(this._authService.getUserProfileAsUser()?.email); //--> esto es momentaneo hasta que empiece a trabajar con Seller y Customer.
|
|
78
|
+
this._authService.isAuthenticated() && this.checkoutForm.get('email')?.disable({ onlySelf: true });
|
|
79
|
+
(this._addressingService.modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' || this._addressingService.modeSelectAddress == 'ONLY_ADDRESS_SELECTION')
|
|
80
|
+
&& firstValueFrom(this._addressingService.getAddressBook()).then(res => {
|
|
81
|
+
this.addressBook = res && res || null;
|
|
82
|
+
this.addressBook == null && this.setMode('carga');
|
|
83
|
+
}).catch(err => console.error(err.error.message));
|
|
84
|
+
}
|
|
85
|
+
isAuthenticated() {
|
|
86
|
+
return this._authService.isAuthenticated();
|
|
87
|
+
}
|
|
88
|
+
getMode() {
|
|
89
|
+
switch (this.modeSelectAddress) {
|
|
90
|
+
case 'ONLY_LOAD_ADDRESS':
|
|
91
|
+
return true;
|
|
92
|
+
case 'ONLY_ADDRESS_SELECTION':
|
|
93
|
+
if (this._authService.isAuthenticated()) {
|
|
94
|
+
return false;
|
|
95
|
+
}
|
|
96
|
+
return true;
|
|
97
|
+
case 'LOAD_ADDRESS_AND_SELECTION':
|
|
98
|
+
if (this._authService.isAuthenticated()) {
|
|
99
|
+
return this.selectAddress;
|
|
100
|
+
}
|
|
101
|
+
return true;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
setMode(mode) {
|
|
105
|
+
this.selectAddress = mode == "carga";
|
|
106
|
+
}
|
|
107
|
+
getParamByChannelAndLanguage(nameParam) {
|
|
108
|
+
return this._paramsService.hasParams(this.params, nameParam + this._apiConsts.CHANNEL + '_' + this._apiConsts.LOCALE.split('_')[0]);
|
|
109
|
+
}
|
|
110
|
+
setSelectAddress(addressSelect) {
|
|
111
|
+
this.addressBook.map((address) => address.selected = address.id === addressSelect.id);
|
|
112
|
+
this.addressBookSelected.id = this.addressBook.find((address) => address.selected).id || 0;
|
|
113
|
+
}
|
|
114
|
+
onSelectAddress(items) {
|
|
115
|
+
this.loading = true;
|
|
116
|
+
let addressSelected = this.addressBook.find((address) => address.selected);
|
|
117
|
+
if (addressSelected) {
|
|
118
|
+
try {
|
|
119
|
+
if (!this.addressBookSelected.id) {
|
|
120
|
+
this.addressBookSelected.id = addressSelected.id || 0;
|
|
121
|
+
}
|
|
122
|
+
const request = {
|
|
123
|
+
selected: this.addressBookSelected,
|
|
124
|
+
shippingAddress: addressSelected
|
|
125
|
+
};
|
|
126
|
+
this._addressingService.setHeadquarter(request).then(res => {
|
|
127
|
+
if (this._cartService.channelConfig.applyOrderLot) {
|
|
128
|
+
items.forEach((item) => {
|
|
129
|
+
if (!item.lot[0]) {
|
|
130
|
+
this._cartService.addToLot(item.product, 0, item.variant_id, 0, item.item_id, item.quantity, item.product.price, item.quantity, item.discount, item.product.price * item.quantity, 'new', '', '', 0, res.shippingAddress.city + ' - ' + res.shippingAddress.street, 'newlot');
|
|
131
|
+
}
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
this.form_ready = true;
|
|
135
|
+
this.allready_data = true;
|
|
136
|
+
this.next();
|
|
137
|
+
}).catch(err => this._toastService.show('operation-error'));
|
|
138
|
+
}
|
|
139
|
+
catch (e) {
|
|
140
|
+
this._toastService.show('operation-error');
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
this.showError('invalid-form');
|
|
145
|
+
}
|
|
146
|
+
this.loading = false;
|
|
147
|
+
}
|
|
148
|
+
onInputChange = () => this.form_ready = false;
|
|
149
|
+
getCountry(code) { return this._addressingService.countriesList.find((countries) => countries.code.toLocaleLowerCase().includes(code.toLocaleLowerCase()))?.name || ""; }
|
|
150
|
+
getProvince(code) { return this._addressingService.provinceList.find((ct) => ct.code == code)?.name || ""; }
|
|
151
|
+
getDocumentType(code) { return this._addressingService.documentTypes.find((dt) => dt.code == code)?.name || ""; }
|
|
152
|
+
getLabelNotesParam() { return this._paramsService.hasParams(this.params, 'label_notes_' + this._apiConsts.CHANNEL + '_' + this._apiConsts.LOCALE.split('_')[0]); }
|
|
153
|
+
verifyValidate($event) {
|
|
154
|
+
if (this.checkoutForm.valid) {
|
|
155
|
+
// Aca debo resolver el formulario y una vez este todo ok debo avisar al observable de
|
|
156
|
+
// los steps.
|
|
157
|
+
this.emitResult();
|
|
158
|
+
}
|
|
159
|
+
else
|
|
160
|
+
this.showError('invalid-form');
|
|
161
|
+
}
|
|
162
|
+
showError = (error_message) => { this._toastService.show(error_message); return true; };
|
|
163
|
+
emitResult = async () => {
|
|
164
|
+
this.loading = true;
|
|
165
|
+
let data = { shippingAddress: { ...this.checkoutForm.getRawValue(), phoneNumber: this.checkoutForm.value.phoneNumber.toString() }, notes: (this.checkoutForm.getRawValue()).notes };
|
|
166
|
+
if (!this.viewDataFacturacion && this.checkoutFormFacturacion.valid)
|
|
167
|
+
data = { ...data, notes: data.notes, billingAddress: this.checkoutFormFacturacion.getRawValue() };
|
|
168
|
+
try {
|
|
169
|
+
let result = await this._addressingService.setAddress(data);
|
|
170
|
+
if (result === false) {
|
|
171
|
+
this.require_login = true;
|
|
172
|
+
this._toastService.show('El email ya está registrado, inicie sesión.');
|
|
173
|
+
}
|
|
174
|
+
else if (result !== false && result !== undefined) {
|
|
175
|
+
//Ojo que lo edito, no hizo una compra nueva, atenti a esto.
|
|
176
|
+
this.form_ready = true;
|
|
177
|
+
this.allready_data = true;
|
|
178
|
+
this.next();
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
this._toastService.show('operation-error');
|
|
183
|
+
}
|
|
184
|
+
this.loading = false;
|
|
185
|
+
};
|
|
186
|
+
onFormChange() {
|
|
187
|
+
if (this.checkoutForm.valid) {
|
|
188
|
+
if (!this.viewDataFacturacion && this.checkoutFormFacturacion.valid) {
|
|
189
|
+
this.validado = true;
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
if (this.viewDataFacturacion && this.checkoutForm.valid) {
|
|
193
|
+
this.validado = true;
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
this.validado = false;
|
|
198
|
+
}
|
|
199
|
+
onFormValid = () => {
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Captura el evento de cuando cambia un pais en el `<select>`
|
|
203
|
+
* @param event
|
|
204
|
+
*/
|
|
205
|
+
onCountrySelected = (event, billing = false) => {
|
|
206
|
+
const { value } = event.target;
|
|
207
|
+
//$('#selectOpPais').attr('disabled', true);
|
|
208
|
+
const form = billing ? this.checkoutFormFacturacion : this.checkoutForm;
|
|
209
|
+
form.controls['countryCode'].setValue(value);
|
|
210
|
+
form.controls['provinceCode'].setValue('null');
|
|
211
|
+
//value != '' && this.provincesSubject.next(this.countriesSubject.value.find(country => country.code == value).provinces);
|
|
212
|
+
if (value != '' || value != 'null') {
|
|
213
|
+
this._formService.onCountrySelected(value);
|
|
214
|
+
}
|
|
215
|
+
};
|
|
216
|
+
/**
|
|
217
|
+
* Captura el evento de cuando cambia una provincia/estado en el `<select>`
|
|
218
|
+
* @param event
|
|
219
|
+
* @param provinces lista de provincias para obtener el nombre de la seleccionada.
|
|
220
|
+
*/
|
|
221
|
+
onProvincesSelected(event, provinces, billing = false) {
|
|
222
|
+
const { value } = event.target;
|
|
223
|
+
const form = billing ? this.checkoutFormFacturacion : this.checkoutForm;
|
|
224
|
+
return form.controls['provinceCode'].setValue(value == 'null' ? null : value);
|
|
225
|
+
/* return form.controls['provinceName'].setValue(provinces.find((province: any) => province.code == value).name); */
|
|
226
|
+
}
|
|
227
|
+
onDocumentTypesSelected(event, billing = false) {
|
|
228
|
+
const { value } = event.target;
|
|
229
|
+
const form = billing ? this.checkoutFormFacturacion : this.checkoutForm;
|
|
230
|
+
return form.controls['documentType'].setValue(value == '' ? '' : value);
|
|
231
|
+
}
|
|
232
|
+
showFormFacturacion = () => {
|
|
233
|
+
this.viewDataFacturacion = !this.viewDataFacturacion;
|
|
234
|
+
if (!this.viewDataFacturacion) {
|
|
235
|
+
this.countriesFacturacion$.subscribe(res => {
|
|
236
|
+
if (res && res.length > 0) {
|
|
237
|
+
this.checkoutFormFacturacion.controls['countryCode'].setValue(res[0].code);
|
|
238
|
+
// Provincia
|
|
239
|
+
this.checkoutFormFacturacion.controls['provinceCode'].setValue(res[0]?.provinces[0].code);
|
|
240
|
+
this.provincesFacturacionSubject.next(res[0]?.provinces);
|
|
241
|
+
// Documento
|
|
242
|
+
this.checkoutFormFacturacion.controls['documentType'].setValue(res[0]?.documentTypes[0].code);
|
|
243
|
+
this.documentTypesFacturacionSubject.next(res[0]?.documentTypes);
|
|
244
|
+
}
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
this.onFormChange();
|
|
248
|
+
return this.viewDataFacturacion;
|
|
249
|
+
};
|
|
250
|
+
next() {
|
|
251
|
+
this._checkoutService.next();
|
|
252
|
+
}
|
|
253
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: DataformEcComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
254
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.0", type: DataformEcComponent, isStandalone: true, selector: "app-dataform-ec", ngImport: i0, template: "@if(channel$ | async; as channelConfig){\n @if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\n @if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\n <!--Selector de modos-->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n }\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(getMode()){\n @if(!require_login){\n <div>\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n }\n <!--Formulario-->\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['lastName'].touched &&\n checkoutForm.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutForm.controls['countryCode'].touched &&\n checkoutForm.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\n formControlName='provinceCode'>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutForm.controls['provinceCode'].touched &&\n checkoutForm.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['postcode'].touched &&\n checkoutForm.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\n formControlName='documentType'>\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutForm.controls['documentType'].touched &&\n checkoutForm.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['documentNumber'].touched &&\n checkoutForm.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(getTypeForm().viewForms.notes.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n @if(getTypeForm().viewForms.terms.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(getTypeForm().viewForms.terms.required){\n <span class=\"required\">*</span>\n }\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\n data-bs-target=\"#terminos-y-condiciones\">\n {{ 'whats-this' | translate }}\n </button>\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n }\n </div>\n }\n </div>\n @if(!viewDataFacturacion){\n <!--Formulario de Facturaci\u00F3n-->\n <div class=\"card\">\n <div class=\"card-header text-center\">\n <h2>{{ 'billing-data' | translate }}</h2>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"checkoutFormFacturacion\">\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event, true)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['city'].touched &&\n checkoutFormFacturacion.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event, true)\"\n formControlName='documentType'>\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(getTypeForm().viewForms.notes.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n }\n </div>\n </form>\n </div>\n </div>\n }\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button type=\"submit\" class=\"btn btn-primary text-white\" [disabled]=\"checkoutForm.invalid\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n\n </form>\n </div>\n } @else {\n <div id=\"loginCheckout\">\n @if(require_login){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n }\n </div>\n }\n } @else {\n @if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n }\n\n @if(this.addressBook){\n @if(this.addressBook?.length){\n <div class=\"container\">\n <div class=\"row\">\n @for(item of addressBook; track $index; let i = $index){\n <div class=\"col-sm-6 col-12 my-3\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n <div class=\"w-100\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"form-label\">{{'notes'|translate}}</label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n }\n\n </div>\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\" [disabled]=\"loadingStep\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n \n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n </div>\n } @else {\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n }\n\n }\n\n }\n @else {\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n }\n}\n@if(getTypeForm().viewForms.terms.enabled){\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\n </div>\n </div>\n </div>\n</div>\n}", styles: [""], dependencies: [{ kind: "directive", type: RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1.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: i1.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.CheckboxRequiredValidator, selector: "input[type=checkbox][required][formControlName],input[type=checkbox][required][formControl],input[type=checkbox][required][ngModel]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: LoginFormEcComponent, selector: "app-login-form-ec", inputs: ["redirect", "redirectTo"], outputs: ["ready"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i2.TranslatePipe, name: "translate" }, { kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: TitleCasePipe, name: "titlecase" }, { kind: "component", type: LoadingFullEcComponent, selector: "app-loading-full-ec" }, { kind: "component", type: BlocksEcComponent, selector: "app-blocks-ec", inputs: ["templates", "show_loading", "section", "blockFilters"] }] });
|
|
255
|
+
}
|
|
256
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.0", ngImport: i0, type: DataformEcComponent, decorators: [{
|
|
257
|
+
type: Component,
|
|
258
|
+
args: [{ selector: 'app-dataform-ec', standalone: true, imports: [
|
|
259
|
+
RouterLink,
|
|
260
|
+
ReactiveFormsModule,
|
|
261
|
+
FormsModule,
|
|
262
|
+
LoginFormEcComponent,
|
|
263
|
+
TranslateModule,
|
|
264
|
+
AsyncPipe,
|
|
265
|
+
TitleCasePipe,
|
|
266
|
+
LoadingFullEcComponent,
|
|
267
|
+
JsonPipe,
|
|
268
|
+
BlocksEcComponent
|
|
269
|
+
], template: "@if(channel$ | async; as channelConfig){\n @if(channelConfig.channelType != 'b2b' || (channelConfig.channelType == 'b2b' && isAuthenticated())){\n @if( modeSelectAddress == 'LOAD_ADDRESS_AND_SELECTION' && isAuthenticated() && this.addressBook != null){\n <!--Selector de modos-->\n <div class=\"container card p-4 mb-3\">\n <div class=\"row justify-content-center\">\n <div class=\"col-12 col-md-10 col-lg-8 text-center\">\n <div class=\"btn-group btn-group-toggle\" data-bs-toggle=\"buttons\">\n <label [class]=\"'btn btn-outline-secondary ' + (!getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option1\" autocomplete=\"off\" checked\n (change)=\"setMode('seleccion')\"> {{'select-address' | translate | titlecase}}\n </label>\n @if(!getParamByChannelAndLanguage('btn_new_address_')){\n <label [class]=\"'btn btn-outline-secondary ' + (getMode() ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ 'new-address' | translate | titlecase}}\n </label>\n }\n @if(getParamByChannelAndLanguage('btn_new_address_'); as param){\n <label [class]=\"'btn btn-outline-secondary ' + (selectAddress ? 'active' : '')\">\n <input type=\"radio\" name=\"options\" id=\"option2\" autocomplete=\"off\" (change)=\"setMode('carga')\">\n {{ param.value}}\n </label>\n }\n </div>\n </div>\n </div>\n </div>\n }\n\n @if(getMode()){\n @if(!require_login){\n <div>\n @if(modeSelectAddress == 'ONLY_LOAD_ADDRESS'){\n <div class=\"checkout-title my-2\">\n <h3>{{'billing-details'|translate}}</h3>\n </div>\n }\n <!--Formulario-->\n <form [formGroup]=\"checkoutForm\" (submit)=\"verifyValidate($event)\"> <!-- //this.cartService.items -->\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutForm.controls['firstName'].touched &&\n checkoutForm.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['lastName'].touched &&\n checkoutForm.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['lastName'].touched && checkoutForm.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['phoneNumber'].touched &&\n checkoutForm.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutForm.controls['email'].touched && checkoutForm.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutForm.controls['countryCode'].touched &&\n checkoutForm.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\" (change)=\"onProvincesSelected($event, provinces)\"\n formControlName='provinceCode'>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutForm.controls['provinceCode'].touched &&\n checkoutForm.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\" formControlName='city'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['city'].touched && checkoutForm.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['street'].touched && checkoutForm.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutForm.controls['postcode'].touched &&\n checkoutForm.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutForm.controls['postcode'].touched && checkoutForm.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event)\"\n formControlName='documentType'>\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutForm.controls['documentType'].touched &&\n checkoutForm.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutForm.controls['documentNumber'].touched &&\n checkoutForm.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(getTypeForm().viewForms.notes.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\" formControlName='notes'\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 7-->\n <div class=\"form-group col-12 col-md-12\">\n <label for=\"formFact\"><b>{{ 'same-billing-address' | translate }}</b> <input type=\"checkbox\"\n class=\"ms-2\" [checked]=\"viewDataFacturacion\" (change)=\"showFormFacturacion()\"\n id=\"formFact\"></label>\n </div>\n </div>\n <div class=\"row mt-df\">\n <div class=\"col-12\">\n <p>\n <label class=\"required text-underline text-danger\">* {{ 'required-fields' | translate }}</label>\n </p>\n </div>\n </div>\n <div class=\"row mt-df\">\n @if(getTypeForm().viewForms.terms.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(getTypeForm().viewForms.terms.required){\n <span class=\"required\">*</span>\n }\n <label class=\"\" for=\"\"> {{ 'accept-terms' | translate }} <input class=\"ms-2\" name=\"terms\"\n formControlName='terms' type=\"checkbox\" required (change)=\"onInputChange()\" /> </label><br />\n <button type=\"button\" class=\"btn btn-primary\" data-bs-toggle=\"modal\"\n data-bs-target=\"#terminos-y-condiciones\">\n {{ 'whats-this' | translate }}\n </button>\n @if(checkoutForm.controls['terms'].touched && !checkoutForm.controls['terms'].value){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{ 'must-accept-terms' | translate }}</span>\n </div>\n }\n </div>\n }\n </div>\n @if(!viewDataFacturacion){\n <!--Formulario de Facturaci\u00F3n-->\n <div class=\"card\">\n <div class=\"card-header text-center\">\n <h2>{{ 'billing-data' | translate }}</h2>\n </div>\n <div class=\"card-body\">\n <form [formGroup]=\"checkoutFormFacturacion\">\n <div class=\"row mt-2\"><!--Fila 1-->\n\n @if(getTypeForm().viewForms.firstName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <!--Si es required-->\n <label class=\"form-label\">{{'first-name'|translate}}\n @if(getTypeForm().viewForms.firstName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <!--Input-->\n <input class=\"form-control\" type=\"text\" name=\"firstName\" formControlName=\"firstName\"\n value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'first-name-help1'|translate}}</span>\n </div>\n }\n <!--Error info-->\n @if(checkoutFormFacturacion.controls['firstName'].touched &&\n checkoutFormFacturacion.controls['firstName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'first-name-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.lastName.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'last-name'|translate}}\n @if(getTypeForm().viewForms.lastName.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input class=\"form-control\" type=\"text\" name=\"lastName\" formControlName=\"lastName\" value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['lastName'].touched &&\n checkoutFormFacturacion.controls['lastName'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'last-name-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 2-->\n @if(getTypeForm().viewForms.phoneNumber.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'phone'|translate}}\n @if(getTypeForm().viewForms.phoneNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"phoneNumber\"\n formControlName='phoneNumber' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['phoneNumber'].touched &&\n checkoutFormFacturacion.controls['phoneNumber'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'phone-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n @if(getTypeForm().viewForms.email.enabled){\n <div class=\"form-group col-12 col-md-6\">\n <label class=\"form-label\">{{'email-address'|translate}}\n @if(getTypeForm().viewForms.email.required){\n <span class=\"required\">*</span>\n }</label>\n <input class=\"form-control\" type=\"email\" name=\"email\" formControlName='email' value=\"\"\n placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help1'|translate}}\n </span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['email'].touched &&\n checkoutFormFacturacion.controls['email'].errors?.['email']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'email-address-help2'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-2\"><!--Fila 3-->\n @if(getTypeForm().viewForms.countryCode.enabled){\n @if(countries$ | async; as countries){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'country'|translate}}\n @if(getTypeForm().viewForms.countryCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"countryCode\" formControlName='countryCode'\n (change)=\"onCountrySelected($event, true)\">\n @for(country of countries; track $index){\n <option [value]=\"country.code\">{{ country.name }}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['countryCode'].touched &&\n checkoutFormFacturacion.controls['countryCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'country-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.provinceCode.enabled){\n @if(provinces$ | async; as provinces){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'state'|translate}}\n @if(getTypeForm().viewForms.provinceCode.required){\n <span class=\"required\">*</span>\n }</label>\n <select class=\"form-select\" name=\"provinceCode\"\n (change)=\"onProvincesSelected($event, provinces, true)\" formControlName='provinceCode'>\n @for(province of provinces; track $index){\n <option [value]=\"province.code\">{{ province.name }}\n </option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['provinceCode'].touched &&\n checkoutFormFacturacion.controls['provinceCode'].errors?.['required']){\n <div class=\"text text-danger\">\n {{'state-help'|translate}}\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.city.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"form-label\">{{'town-city'|translate}}\n @if(getTypeForm().viewForms.city.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"city\"\n formControlName='city' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['city'].touched &&\n checkoutFormFacturacion.controls['city'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'town-city-help'|translate}}</span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 4-->\n @if(getTypeForm().viewForms.street.enabled){\n <div class=\"form-group col-12 col-md-8\">\n <label class=\"field-label\">{{'address'|translate}}\n @if(getTypeForm().viewForms.street.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"street\"\n formControlName='street' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help1'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['street'].touched &&\n checkoutFormFacturacion.controls['street'].errors?.['maxlength']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'address-help2'|translate}}</span>\n </div>\n }\n </div>\n }\n\n <!-- form direcci\u00F3n -->\n @if(getTypeForm().viewForms.postcode.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'postal-code'|translate}}\n @if(getTypeForm().viewForms.postcode.required){\n <span class=\"required\">*</span>\n }</label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"postcode\"\n formControlName='postcode' value=\"\" placeholder=\"\" autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">{{'postal-code-help'|translate}}</span>\n </div>\n }\n @if(checkoutFormFacturacion.controls['postcode'].touched &&\n checkoutFormFacturacion.controls['postcode'].errors?.['pattern']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\"> {{'postal-code-pattern-error' | translate}} </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 5-->\n @if(getTypeForm().viewForms.documentType.enabled){\n @if(documentTypes$ | async; as documentTypes){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-type'|translate}}\n @if(getTypeForm().viewForms.documentType.required){\n <span class=\"required\">*</span>\n }</label>\n <select name=\"documentType\" class=\"form-select\" (change)=\"onDocumentTypesSelected($event, true)\"\n formControlName='documentType'>\n <!-- <option [value]=\"''\" selected>{{'document-type'|translate}}</option>\n --> @for(item of documentTypes; track $index){\n <option [value]=\"item.code\">{{item.name}}</option>\n }\n </select>\n @if(checkoutFormFacturacion.controls['documentType'].touched &&\n checkoutFormFacturacion.controls['documentType'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'type-document-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n }\n @if(getTypeForm().viewForms.documentNumber.enabled){\n <div class=\"form-group col-12 col-md-4\">\n <label class=\"field-label\">{{'document-number'|translate}}\n @if(getTypeForm().viewForms.documentNumber.required){\n <span class=\"required\">*</span>\n }\n </label>\n <input (change)=\"onInputChange()\" class=\"form-control\" [type]=\"'text'\" name=\"documentNumber\"\n formControlName='documentNumber' min=\"1\" max=\"99999999999\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n @if(checkoutFormFacturacion.controls['documentNumber'].touched &&\n checkoutFormFacturacion.controls['documentNumber'].errors?.['required']){\n <div class=\"text-danger-container\">\n <span class=\"text-danger\">\n {{'document-number-help'|translate}}\n </span>\n </div>\n }\n </div>\n }\n </div>\n <div class=\"row mt-df\"><!--Fila 6-->\n @if(getTypeForm().viewForms.notes.enabled){\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"field-label\">{{'notes'|translate}}\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"field-label\" [innerHTML]=\"labelnotes.value\">\n @if(getTypeForm().viewForms.notes.required){\n <span class=\"required\">*</span>\n }\n </label>\n }\n\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n formControlName='notes' value=\"\" placeholder=\"\" autocomplete=\"off\">\n </div>\n }\n </div>\n </form>\n </div>\n </div>\n }\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button type=\"submit\" class=\"btn btn-primary text-white\" [disabled]=\"checkoutForm.invalid\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n\n </form>\n </div>\n } @else {\n <div id=\"loginCheckout\">\n @if(require_login){\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <div class=\"col-12\">\n <app-login-form-ec (ready)=\"verifyValidate($event)\" [redirect]=\"false\" [title]=\"'need-login'\">\n </app-login-form-ec>\n </div>\n </div>\n }\n </div>\n }\n } @else {\n @if(modeSelectAddress == 'ONLY_ADDRESS_SELECTION'){\n <div class=\"checkout-title my-2\">\n <h3>{{'address-selection'|translate}}</h3>\n </div>\n }\n\n @if(this.addressBook){\n @if(this.addressBook?.length){\n <div class=\"container\">\n <div class=\"row\">\n @for(item of addressBook; track $index; let i = $index){\n <div class=\"col-sm-6 col-12 my-3\">\n <div class=\"card p-3\">\n <input class=\"ms-1 mt-3 form-check-input input-size-lg\" type=\"radio\" [name]=\"'n-'+i\" [id]=\"i\"\n [checked]=\"item.selected\" (click)=\"setSelectAddress(item)\" (change)=\"onInputChange()\">\n <div class=\"ms-5\">\n <h4 class=\"card-title\">\n <strong>{{'address'|translate}}</strong><br>\n <span class=\"text-uppercase h3\">{{item.street}}</span>\n </h4>\n <div class=\"row\">\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'country'|translate}}</strong> {{getCountry(item.countryCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'state'|translate}}</strong> {{getProvince(item.provinceCode)}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'town-city'|translate}}</strong> {{item.city}}\n </h5>\n <h5 class=\"card-subtitle mb-2 text-muted col-auto\">\n <strong>{{'postal-code'|translate}}</strong> {{item.postcode}}\n </h5>\n </div>\n <div class=\"row px-3\">\n <div class=\"card p-2 bg-light w-100\">\n <div class=\"card-body\">\n <h5 class=\"card-title\">{{'address-contact'|translate}}</h5>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'first-name'|translate}}</strong>\n {{item.addressContact.firstName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'last-name'|translate}}</strong>\n {{item.addressContact.lastName}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-type'|translate}}</strong>\n {{getDocumentType(item.addressContact.documentType)}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'document-number'|translate}}</strong>\n {{item.addressContact.documentNumber}}\n </h6>\n <h6 class=\"card-subtitle mb-2 text-muted\">\n <strong>{{'email-address'|translate}}</strong>\n {{item.addressContact.email}}\n </h6>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n }\n\n </div>\n\n <div class=\"w-100\">\n <div class=\"row mt-df\">\n <div class=\"form-group col-12 col-md-12\">\n @if(!getLabelNotesParam()){\n <label class=\"form-label\">{{'notes'|translate}}</label>\n }\n @if(getLabelNotesParam(); as labelnotes){\n <label class=\"form-label\" [innerHTML]=\"labelnotes.value\"></label>\n <input (change)=\"onInputChange()\" class=\"form-control\" type=\"text\" name=\"notes\"\n [(ngModel)]=\"this.addressBookSelected.notes\" #ctrl=\"ngModel\" value=\"\" placeholder=\"\"\n autocomplete=\"off\">\n }\n\n </div>\n </div>\n </div>\n <div class=\"row d-flex flex-row\">\n <div class=\"col-12 d-flex justify-content-end\">\n <button (click)=\"onSelectAddress(cartItems)\" class=\"btn btn-primary text-white\" [disabled]=\"loadingStep\">{{(isLastOne\n ? 'finish-checkout' : (allready_data ? 'update' :\n 'ready-form')) | translate}}\n <!-- {{(allready_data ? 'update' : (isLastOne ? 'finish-checkout' : 'ready-form')) | translate}} -->\n </button>\n \n </div>\n </div>\n @if(loading){\n <div class=\"d-flex flex-column jusitfy-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n }\n </div>\n } @else {\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <div class=\"d-flex flex-column justify-content-center align-items-center\">\n <app-loading-full-ec></app-loading-full-ec>\n </div>\n </div>\n </div>\n </div>\n }\n } @else {\n <div class=\"container\">\n <div class=\"row\">\n <div class=\"col-12 text-center my-2\">\n <h4> {{'address-book-not-result' | translate }} </h4>\n </div>\n </div>\n </div>\n }\n\n }\n\n }\n @else {\n <div class=\"container\">\n <p>Por favor <a [routerLink]=\"['/auth/login']\"> Inicie Sesi\u00F3n</a></p>\n </div>\n }\n}\n@if(getTypeForm().viewForms.terms.enabled){\n<div class=\"modal fade\" id=\"terminos-y-condiciones\" tabindex=\"-1\" aria-labelledby=\"modalLabel\" aria-hidden=\"true\">\n <div class=\"modal-dialog modal-xl modal-dialog-scrollable\">\n <div class=\"modal-content\">\n <div class=\"modal-header\">\n <h5 class=\"modal-title\" id=\"modalLabel\">T\u00E9rminos y condiciones</h5>\n <button type=\"button\" class=\"btn-close\" data-bs-dismiss=\"modal\" aria-label=\"Close\"></button>\n </div>\n <div class=\"modal-body\">\n <app-blocks-ec [section]=\"'terminos-y-condiciones'\" />\n </div>\n </div>\n </div>\n</div>\n}" }]
|
|
270
|
+
}], ctorParameters: () => [] });
|
|
271
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YWZvcm0tZWMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctZWFzeWNvbW1lcmNlLXYxOC9zcmMvbGliL2VjLWNvbXBvbmVudHMvY2hlY2tvdXQtZWMvZGF0YWZvcm0tZWMvZGF0YWZvcm0tZWMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFDMUQsT0FBTyxFQUFFLFdBQVcsRUFBYSxXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEcsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLGlCQUFpQixFQUFvQixXQUFXLEVBQUUsV0FBVyxFQUFFLGNBQWMsRUFBRSxlQUFlLEVBQUUsV0FBVyxFQUFFLGlCQUFpQixFQUFFLFlBQVksRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ3BMLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzFELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFB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QyxDQUFDLENBQUE7UUFDTixDQUFDO1FBQ0QsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1FBQ25CLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFBO0lBQ25DLENBQUMsQ0FBQTtJQUVELElBQUk7UUFDTixJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUE7SUFDN0IsQ0FBQzt1R0EzUVcsbUJBQW1COzJGQUFuQixtQkFBbUIsMkVDaENoQywycXFEQW0wQkMsMEREanpCRyxVQUFVLG1PQUNWLG1CQUFtQixvdURBQ25CLFdBQVcsdVBBQ1gsb0JBQW9CLHFIQUNwQixlQUFlLHVGQUNmLFNBQVMseUNBQ1QsYUFBYSxrREFDYixzQkFBc0IsZ0VBRXRCLGlCQUFpQjs7MkZBS1IsbUJBQW1CO2tCQWxCL0IsU0FBUzsrQkFDSSxpQkFBaUIsY0FDZixJQUFJLFdBQ1A7d0JBQ1QsVUFBVTt3QkFDVixtQkFBbUI7d0JBQ25CLFdBQVc7d0JBQ1gsb0JBQW9CO3dCQUNwQixlQUFlO3dCQUNmLFNBQVM7d0JBQ1QsYUFBYTt3QkFDYixzQkFBc0I7d0JBQ3RCLFFBQVE7d0JBQ1IsaUJBQWlCO3FCQUNwQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgaW5qZWN0LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgUm91dGVyTGluayB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBMb2dpbkZvcm1FY0NvbXBvbmVudCB9IGZyb20gJy4uLy4uL2F1dGgtZWMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBZGRyZXNzaW5nU2VydmljZSwgQW5hbHl0aWNzU2VydmljZSwgQXV0aFNlcnZpY2UsIENhcnRTZXJ2aWNlLCBDaGFubmVsU2VydmljZSwgQ2hlY2tvdXRTZXJ2aWNlLCBGb3JtU2VydmljZSwgUGFyYW1ldGVyc1NlcnZpY2UsIFRvYXN0U2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2VjLXNlcnZpY2VzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgSnNvblBpcGUsIFRpdGxlQ2FzZVBpcGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQXBpQ29uc3RhbnRzU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvbnN0YW50cyc7XG5pbXBvcnQgeyBMb2FkaW5nRnVsbEVjQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vd2lkZ2V0cy1lYyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGZpbHRlciwgZmlyc3RWYWx1ZUZyb20gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IENvbm5lY3Rpb25TZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vYXBpJztcbmltcG9ydCB7IElucHV0RWNDb21wb25lbnQgfSBmcm9tICcuL2lucHV0LWVjL2lucHV0LWVjLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBCbG9ja3NFY0NvbXBvbmVudCB9IGZyb20gXCIuLi8uLi9ibG9ja3MtZWMvYmxvY2tzLWVjLmNvbXBvbmVudFwiO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1kYXRhZm9ybS1lYycsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgICBpbXBvcnRzOiBbXG4gICAgUm91dGVyTGluayxcbiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLFxuICAgIEZvcm1zTW9kdWxlLFxuICAgIExvZ2luRm9ybUVjQ29tcG9uZW50LFxuICAgIFRyYW5zbGF0ZU1vZHVsZSxcbiAgICBBc3luY1BpcGUsXG4gICAgVGl0bGVDYXNlUGlwZSxcbiAgICBMb2FkaW5nRnVsbEVjQ29tcG9uZW50LFxuICAgIEpzb25QaXBlLFxuICAgIEJsb2Nrc0VjQ29tcG9uZW50XG5dLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9kYXRhZm9ybS1lYy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmw6ICcuL2RhdGFmb3JtLWVjLmNvbXBvbmVudC5zY3NzJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRhZm9ybUVjQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICAgIHByaXZhdGUgX2NoYW5uZWxTZXJ2aWNlOiBDaGFubmVsU2VydmljZSA9IGluamVjdChDaGFubmVsU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfYXV0aFNlcnZpY2U6IEF1dGhTZXJ2aWNlID0gaW5qZWN0KEF1dGhTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9wYXJhbXNTZXJ2aWNlOiBQYXJhbWV0ZXJzU2VydmljZSA9IGluamVjdChQYXJhbWV0ZXJzU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfYXBpQ29uc3RzOiBBcGlDb25zdGFudHNTZXJ2aWNlID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpO1xuICAgIHByaXZhdGUgX2FkZHJlc3NpbmdTZXJ2aWNlOiBBZGRyZXNzaW5nU2VydmljZSA9IGluamVjdChBZGRyZXNzaW5nU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY2FydFNlcnZpY2U6IENhcnRTZXJ2aWNlID0gaW5qZWN0KENhcnRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF90b2FzdFNlcnZpY2U6IFRvYXN0U2VydmljZSA9IGluamVjdChUb2FzdFNlcnZpY2UpO1xuICAgIHByaXZhdGUgX2Zvcm1TZXJ2aWNlOiBGb3JtU2VydmljZSA9IGluamVjdChGb3JtU2VydmljZSk7XG4gICAgcHJpdmF0ZSBfY2hlY2tvdXRTZXJ2aWNlOiBDaGVja291dFNlcnZpY2UgPSBpbmplY3QoQ2hlY2tvdXRTZXJ2aWNlKTtcbiAgICBwcml2YXRlIF9mb3JtQnVpbGRlcjogRm9ybUJ1aWxkZXIgPSBpbmplY3QoRm9ybUJ1aWxkZXIpO1xuXG4gICAgcHVibGljIG1vZGVTZWxlY3RBZGRyZXNzID0gdGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3M7XG4gICAgcHVibGljIGNhcnRJdGVtczogYW55ID0gW11cblxuICAgIHB1YmxpYyBjaGFubmVsJCA9IHRoaXMuX2NoYW5uZWxTZXJ2aWNlLmNoYW5uZWwkO1xuICAgIHB1YmxpYyBjb3VudHJpZXMkID0gdGhpcy5fZm9ybVNlcnZpY2UuZ2V0Q291bnRyaWVzRGF0YSgpO1xuICAgIHB1YmxpYyBwcm92aW5jZXMkID0gdGhpcy5fZm9ybVNlcnZpY2UucHJvdmluY2VzJDtcbiAgICBwdWJsaWMgZG9jdW1lbnRUeXBlcyQgPSB0aGlzLl9mb3JtU2VydmljZS5kb2N1bWVudFR5cGVzJDtcbiAgICBwdWJsaWMgaXNMYXN0U3RlcCQgPSB0aGlzLl9jaGVja291dFNlcnZpY2UuaXNMYXN0U3RlcCQ7XG4gICAgcHVibGljIGxvYWRpbmdTdGVwJCA9IHRoaXMuX2NoZWNrb3V0U2VydmljZS5sb2FkaW5nU3RlcCQ7XG4gICAgXG4gICAgcHVibGljIHNlbGVjdEFkZHJlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcGFyYW1zOiBhbnk7XG4gICAgcHVibGljIGFkZHJlc3NCb29rOiBhbnkgPSBbXTtcbiAgICBwdWJsaWMgYWRkcmVzc0Jvb2tTZWxlY3RlZCA9IHsgaWQ6IDAsIG5vdGVzOiBcIlwiIH1cbiAgICBwdWJsaWMgZm9ybV9yZWFkeTogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBsb2FkaW5nOiBib29sZWFuID0gZmFsc2U7XG4gICAgcHVibGljIGFsbHJlYWR5X2RhdGE6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgcmVxdWlyZV9sb2dpbjogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHB1YmxpYyBjaGVja291dEZvcm06IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb246IEZvcm1Hcm91cDtcbiAgICBwdWJsaWMgZ2V0VHlwZUZvcm06IGFueSA9IHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmdldFR5cGVGb3JtO1xuICAgIHB1YmxpYyBpc0xhc3RPbmU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICBwdWJsaWMgbG9hZGluZ1N0ZXA6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgcG9zdGFsQ29kZVBhdHRlcm4gPSAnXlswLTldWzAtOV0qJCc7XG5cbiAgICBwcm90ZWN0ZWQgY291bnRyaWVzRmFjdHVyYWNpb25TdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdDxhbnlbXT4oW10pO1xuICAgIHByb3RlY3RlZCBwcm92aW5jZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG4gICAgcHJvdGVjdGVkIGRvY3VtZW50VHlwZXNGYWN0dXJhY2lvblN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGFueVtdPihbXSk7XG5cbiAgICBwdWJsaWMgY291bnRyaWVzRmFjdHVyYWNpb24kID0gdGhpcy5jb3VudHJpZXNGYWN0dXJhY2lvblN1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG4gICAgcHVibGljIHByb3ZpbmNlc0ZhY3R1cmFjaW9uJCA9IHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuICAgIHB1YmxpYyBkb2N1bWVudFR5cGVzRmFjdHVyYWNpb24kID0gdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xuXG4gICAgcHVibGljIHZpZXdEYXRhRmFjdHVyYWNpb246IGJvb2xlYW4gPSB0cnVlO1xuICAgIHB1YmxpYyB2YWxpZGFkbyA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtID0gdGhpcy5fZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKT8uY29uZmlnRm9ybS5mb3JtQWRkcmVzLFxuICAgICAgICAgICAgcG9zdGNvZGU6IFsnJywgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBvc3RhbENvZGVQYXR0ZXJuKV1dXG4gICAgICAgIH0pXG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtLnN0YXR1c0NoYW5nZXNcbiAgICAgICAgICAgIC5waXBlKFxuICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB7IHRoaXMub25Gb3JtQ2hhbmdlKCk7IHJldHVybiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCB9KSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5vbkZvcm1WYWxpZCgpKTtcblxuICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uID0gdGhpcy5fZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICAgICAgLi4udGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UuZ2V0VHlwZUZvcm0oKT8uY29uZmlnRm9ybS5mb3JtQmlsbGluZyxcbiAgICAgICAgICAgIHBvc3Rjb2RlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLnBhdHRlcm4odGhpcy5wb3N0YWxDb2RlUGF0dGVybildXSAvLyBTZSBhZ3JlZ2EgcGFyYSBxdWUgc8OzbG8gYWNlcHRlIGPDs2RpZ29zIHBvc3RhbGVzIG1heW9yZXMgcXVlIGNlcm9cbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uc3RhdHVzQ2hhbmdlc1xuICAgICAgICAgICAgLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHsgdGhpcy5vbkZvcm1DaGFuZ2UoKTsgcmV0dXJuIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQgfSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMub25Gb3JtVmFsaWQoKSk7XG4gICAgICAgIHRoaXMuaXNMYXN0U3RlcCQuc3Vic2NyaWJlKCByZXMgPT4gdGhpcy5pc0xhc3RPbmUgPSByZXMpO1xuICAgICAgICB0aGlzLmxvYWRpbmdTdGVwJC5zdWJzY3JpYmUoIHJlcyA9PiB0aGlzLmxvYWRpbmdTdGVwID0gcmVzKTtcbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcGFyYW1zU2VydmljZS5nZXRQYXJhbWV0ZXJzKCkuc3Vic2NyaWJlKHBhcmFtcyA9PiB0aGlzLnBhcmFtcyA9IHBhcmFtcyk7XG4gICAgICAgIHRoaXMuX2NhcnRTZXJ2aWNlLmNhcnRJdGVtcyQuc3Vic2NyaWJlKGl0ZW1zID0+IHRoaXMuY2FydEl0ZW1zID0gaXRlbXMpO1xuXG4gICAgICAgIHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnNldFZhbHVlKHRoaXMuX2F1dGhTZXJ2aWNlLmdldFVzZXJQcm9maWxlQXNVc2VyKCk/LmVtYWlsKTsgLy8tLT4gZXN0byBlcyBtb21lbnRhbmVvIGhhc3RhIHF1ZSBlbXBpZWNlIGEgdHJhYmFqYXIgY29uIFNlbGxlciB5IEN1c3RvbWVyLiAgXG4gICAgICAgIHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpICYmIHRoaXMuY2hlY2tvdXRGb3JtLmdldCgnZW1haWwnKT8uZGlzYWJsZSh7IG9ubHlTZWxmOiB0cnVlIH0pO1xuICAgICAgICAodGhpcy5fYWRkcmVzc2luZ1NlcnZpY2UubW9kZVNlbGVjdEFkZHJlc3MgPT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyB8fCB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5tb2RlU2VsZWN0QWRkcmVzcyA9PSAnT05MWV9BRERSRVNTX1NFTEVDVElPTicpXG4gICAgICAgICAgICAmJiBmaXJzdFZhbHVlRnJvbSh0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5nZXRBZGRyZXNzQm9vaygpKS50aGVuKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hZGRyZXNzQm9vayA9IHJlcyAmJiByZXMgfHwgbnVsbFxuICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2sgPT0gbnVsbCAmJiB0aGlzLnNldE1vZGUoJ2NhcmdhJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IGNvbnNvbGUuZXJyb3IoZXJyLmVycm9yLm1lc3NhZ2UpKVxuXG4gICAgfVxuXG4gICAgaXNBdXRoZW50aWNhdGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fYXV0aFNlcnZpY2UuaXNBdXRoZW50aWNhdGVkKClcbiAgICB9XG5cbiAgICBnZXRNb2RlKCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMubW9kZVNlbGVjdEFkZHJlc3MpIHtcbiAgICAgICAgICAgIGNhc2UgJ09OTFlfTE9BRF9BRERSRVNTJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnT05MWV9BRERSRVNTX1NFTEVDVElPTic6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2F1dGhTZXJ2aWNlLmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICAgICAgY2FzZSAnTE9BRF9BRERSRVNTX0FORF9TRUxFQ1RJT04nOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRoU2VydmljZS5pc0F1dGhlbnRpY2F0ZWQoKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RBZGRyZXNzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRNb2RlKG1vZGU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdEFkZHJlc3MgPSBtb2RlID09IFwiY2FyZ2FcIlxuICAgIH1cblxuICAgIGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UobmFtZVBhcmFtOiBzdHJpbmcpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtc1NlcnZpY2UuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCBuYW1lUGFyYW0gKyB0aGlzLl9hcGlDb25zdHMuQ0hBTk5FTCArICdfJyArIHRoaXMuX2FwaUNvbnN0cy5MT0NBTEUuc3BsaXQoJ18nKVswXSlcbiAgICB9XG5cbiAgICBzZXRTZWxlY3RBZGRyZXNzKGFkZHJlc3NTZWxlY3Q6IGFueSkge1xuICAgICAgICB0aGlzLmFkZHJlc3NCb29rLm1hcCgoYWRkcmVzczogYW55KSA9PiBhZGRyZXNzLnNlbGVjdGVkID0gYWRkcmVzcy5pZCA9PT0gYWRkcmVzc1NlbGVjdC5pZClcbiAgICAgICAgdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkID0gdGhpcy5hZGRyZXNzQm9vay5maW5kKChhZGRyZXNzOiBhbnkpID0+IGFkZHJlc3Muc2VsZWN0ZWQpLmlkIHx8IDBcbiAgICB9XG4gICAgb25TZWxlY3RBZGRyZXNzKGl0ZW1zOmFueSl7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBhZGRyZXNzU2VsZWN0ZWQgPSB0aGlzLmFkZHJlc3NCb29rLmZpbmQoKGFkZHJlc3M6YW55KSA9PiBhZGRyZXNzLnNlbGVjdGVkKVxuICAgICAgICBpZiAoYWRkcmVzc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkcmVzc0Jvb2tTZWxlY3RlZC5pZCA9IGFkZHJlc3NTZWxlY3RlZC5pZCB8fCAwXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLmFkZHJlc3NCb29rU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIHNoaXBwaW5nQWRkcmVzczogYWRkcmVzc1NlbGVjdGVkXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLnNldEhlYWRxdWFydGVyKHJlcXVlc3QpLnRoZW4oXG4gICAgICAgICAgICAgICAgICAgIHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLl9jYXJ0U2VydmljZS5jaGFubmVsQ29uZmlnLmFwcGx5T3JkZXJMb3Qpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLmZvckVhY2goKGl0ZW06YW55KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFpdGVtLmxvdFswXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYXJ0U2VydmljZS5hZGRUb0xvdChpdGVtLnByb2R1Y3QsMCxpdGVtLnZhcmlhbnRfaWQsMCxpdGVtLml0ZW1faWQsaXRlbS5xdWFudGl0eSxpdGVtLnByb2R1Y3QucHJpY2UsaXRlbS5xdWFudGl0eSxpdGVtLmRpc2NvdW50LGl0ZW0ucHJvZHVjdC5wcmljZSppdGVtLnF1YW50aXR5LCduZXcnLCcnLCcnLDAscmVzLnNoaXBwaW5nQWRkcmVzcy5jaXR5ICsgJyAtICcgKyByZXMuc2hpcHBpbmdBZGRyZXNzLnN0cmVldCwgJ25ld2xvdCcpOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtX3JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWxscmVhZHlfZGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5leHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICkuY2F0Y2goZXJyID0+IHRoaXMuX3RvYXN0U2VydmljZS5zaG93KCdvcGVyYXRpb24tZXJyb3InKSk7XG5cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgdGhpcy5fdG9hc3RTZXJ2aWNlLnNob3coJ29wZXJhdGlvbi1lcnJvcicpIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Vycm9yKCdpbnZhbGlkLWZvcm0nKVxuICAgICAgICB9XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uSW5wdXRDaGFuZ2UgPSAoKSA9PiB0aGlzLmZvcm1fcmVhZHkgPSBmYWxzZTtcblxuICAgIGdldENvdW50cnkoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5jb3VudHJpZXNMaXN0LmZpbmQoKGNvdW50cmllczogYW55KSA9PiBjb3VudHJpZXMuY29kZS50b0xvY2FsZUxvd2VyQ2FzZSgpLmluY2x1ZGVzKGNvZGUudG9Mb2NhbGVMb3dlckNhc2UoKSkpPy5uYW1lIHx8IFwiXCIgfVxuXG4gICAgZ2V0UHJvdmluY2UoY29kZTogYW55KSB7IHJldHVybiB0aGlzLl9hZGRyZXNzaW5nU2VydmljZS5wcm92aW5jZUxpc3QuZmluZCgoY3Q6IGFueSkgPT4gY3QuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiIH1cblxuICAgIGdldERvY3VtZW50VHlwZShjb2RlOiBhbnkpIHsgcmV0dXJuIHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLmRvY3VtZW50VHlwZXMuZmluZCgoZHQ6IGFueSkgPT4gZHQuY29kZSA9PSBjb2RlKT8ubmFtZSB8fCBcIlwiIH1cblxuICAgIGdldExhYmVsTm90ZXNQYXJhbSgpIHsgcmV0dXJuIHRoaXMuX3BhcmFtc1NlcnZpY2UuaGFzUGFyYW1zKHRoaXMucGFyYW1zLCAnbGFiZWxfbm90ZXNfJyArIHRoaXMuX2FwaUNvbnN0cy5DSEFOTkVMICsgJ18nICsgdGhpcy5fYXBpQ29uc3RzLkxPQ0FMRS5zcGxpdCgnXycpWzBdKSB9XG5cbiAgICB2ZXJpZnlWYWxpZGF0ZSgkZXZlbnQ6YW55KSB7ICAgICAgICBcbiAgICAgICAgaWYgKHRoaXMuY2hlY2tvdXRGb3JtLnZhbGlkKSB7XG4gICAgICAgICAgICAvLyBBY2EgZGVibyByZXNvbHZlciBlbCBmb3JtdWxhcmlvIHkgdW5hIHZleiBlc3RlIHRvZG8gb2sgZGVibyBhdmlzYXIgYWwgb2JzZXJ2YWJsZSBkZVxuICAgICAgICAgICAgLy8gbG9zIHN0ZXBzLlxuICAgICAgICAgICAgdGhpcy5lbWl0UmVzdWx0KCk7XG4gICAgICAgIH0gZWxzZVxuICAgICAgICAgICAgdGhpcy5zaG93RXJyb3IoJ2ludmFsaWQtZm9ybScpO1xuICAgIH1cbiAgICBzaG93RXJyb3IgPSAoZXJyb3JfbWVzc2FnZTogYW55KSA9PiB7IHRoaXMuX3RvYXN0U2VydmljZS5zaG93KGVycm9yX21lc3NhZ2UpOyByZXR1cm4gdHJ1ZTsgfVxuXG4gICAgcHJvdGVjdGVkIGVtaXRSZXN1bHQgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgIGxldCBkYXRhOiBhbnkgPSB7IHNoaXBwaW5nQWRkcmVzczogeyAuLi50aGlzLmNoZWNrb3V0Rm9ybS5nZXRSYXdWYWx1ZSgpLCBwaG9uZU51bWJlcjogdGhpcy5jaGVja291dEZvcm0udmFsdWUucGhvbmVOdW1iZXIudG9TdHJpbmcoKSB9LCBub3RlczogKHRoaXMuY2hlY2tvdXRGb3JtLmdldFJhd1ZhbHVlKCkpLm5vdGVzIH07XG4gICAgICAgICBpZiAoIXRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLnZhbGlkKSBkYXRhID0geyAuLi5kYXRhLCBub3RlczogZGF0YS5ub3RlcywgYmlsbGluZ0FkZHJlc3M6IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uZ2V0UmF3VmFsdWUoKSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGF3YWl0IHRoaXMuX2FkZHJlc3NpbmdTZXJ2aWNlLnNldEFkZHJlc3MoZGF0YSk7XG5cbiAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1aXJlX2xvZ2luID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnRWwgZW1haWwgeWEgZXN0w6EgcmVnaXN0cmFkbywgaW5pY2llIHNlc2nDs24uJylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHJlc3VsdCAhPT0gZmFsc2UgJiYgcmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAvL09qbyBxdWUgbG8gZWRpdG8sIG5vIGhpem8gdW5hIGNvbXByYSBudWV2YSwgYXRlbnRpIGEgZXN0by5cbiAgICAgICAgICAgICAgICB0aGlzLmZvcm1fcmVhZHkgPSB0cnVlXG4gICAgICAgICAgICAgICAgdGhpcy5hbGxyZWFkeV9kYXRhID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHRoaXMubmV4dCgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBjYXRjaCAoZSkgeyB0aGlzLl90b2FzdFNlcnZpY2Uuc2hvdygnb3BlcmF0aW9uLWVycm9yJykgfVxuICAgICAgICB0aGlzLmxvYWRpbmcgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb25Gb3JtQ2hhbmdlKCkge1xuICAgICAgICBpZiAodGhpcy5jaGVja291dEZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uICYmIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24udmFsaWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZhbGlkYWRvID0gdHJ1ZVxuICAgICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiAmJiB0aGlzLmNoZWNrb3V0Rm9ybS52YWxpZCkge1xuICAgICAgICAgICAgICAgIHRoaXMudmFsaWRhZG8gPSB0cnVlXG4gICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy52YWxpZGFkbyA9IGZhbHNlXG4gICAgfVxuXG4gICAgb25Gb3JtVmFsaWQgPSAoKSA9PiB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQ2FwdHVyYSBlbCBldmVudG8gZGUgY3VhbmRvIGNhbWJpYSB1biBwYWlzIGVuIGVsIGA8c2VsZWN0PmBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICovXG4gICAgb25Db3VudHJ5U2VsZWN0ZWQgPSAoZXZlbnQ6IGFueSwgYmlsbGluZzpib29sZWFuID0gZmFsc2UpID0+IHtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICAvLyQoJyNzZWxlY3RPcFBhaXMnKS5hdHRyKCdkaXNhYmxlZCcsIHRydWUpO1xuICAgICAgICBjb25zdCBmb3JtID0gYmlsbGluZyA/IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gOiB0aGlzLmNoZWNrb3V0Rm9ybTtcbiAgICAgICAgZm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZSh2YWx1ZSk7XG4gICAgICAgIGZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKCdudWxsJyk7XG4gICAgICAgIC8vdmFsdWUgIT0gJycgJiYgdGhpcy5wcm92aW5jZXNTdWJqZWN0Lm5leHQodGhpcy5jb3VudHJpZXNTdWJqZWN0LnZhbHVlLmZpbmQoY291bnRyeSA9PiBjb3VudHJ5LmNvZGUgPT0gdmFsdWUpLnByb3ZpbmNlcyk7XG4gICAgICAgIGlmICh2YWx1ZSAhPSAnJyB8fCB2YWx1ZSAhPSAnbnVsbCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2Zvcm1TZXJ2aWNlLm9uQ291bnRyeVNlbGVjdGVkKHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBDYXB0dXJhIGVsIGV2ZW50byBkZSBjdWFuZG8gY2FtYmlhIHVuYSBwcm92aW5jaWEvZXN0YWRvIGVuIGVsIGA8c2VsZWN0PmBcbiAgICAgKiBAcGFyYW0gZXZlbnQgXG4gICAgICogQHBhcmFtIHByb3ZpbmNlcyBsaXN0YSBkZSBwcm92aW5jaWFzIHBhcmEgb2J0ZW5lciBlbCBub21icmUgZGUgbGEgc2VsZWNjaW9uYWRhLlxuICAgICAqL1xuICAgIG9uUHJvdmluY2VzU2VsZWN0ZWQoZXZlbnQ6IGFueSwgcHJvdmluY2VzOiBhbnksIGJpbGxpbmc6Ym9vbGVhbiA9IGZhbHNlKXtcbiAgICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZXZlbnQudGFyZ2V0O1xuICAgICAgICBjb25zdCBmb3JtID0gYmlsbGluZyA/IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gOiB0aGlzLmNoZWNrb3V0Rm9ybTtcbiAgICAgICAgcmV0dXJuIGZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKHZhbHVlID09ICdudWxsJyA/IG51bGwgOiB2YWx1ZSk7XG4gICAgICAgIC8qIHJldHVybiBmb3JtLmNvbnRyb2xzWydwcm92aW5jZU5hbWUnXS5zZXRWYWx1ZShwcm92aW5jZXMuZmluZCgocHJvdmluY2U6IGFueSkgPT4gcHJvdmluY2UuY29kZSA9PSB2YWx1ZSkubmFtZSk7ICovXG4gICAgfVxuICAgIG9uRG9jdW1lbnRUeXBlc1NlbGVjdGVkKGV2ZW50OiBhbnksIGJpbGxpbmc6Ym9vbGVhbiA9IGZhbHNlKSB7XG4gICAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGV2ZW50LnRhcmdldFxuICAgICAgICBjb25zdCBmb3JtID0gYmlsbGluZyA/IHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24gOiB0aGlzLmNoZWNrb3V0Rm9ybTtcbiAgICAgICAgcmV0dXJuIGZvcm0uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnNldFZhbHVlKHZhbHVlID09ICcnID8gJycgOiB2YWx1ZSk7XG4gICAgfVxuICAgIHNob3dGb3JtRmFjdHVyYWNpb24gPSAoKSA9PiB7XG4gICAgICAgIHRoaXMudmlld0RhdGFGYWN0dXJhY2lvbiA9ICF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb25cbiAgICAgICAgaWYgKCF0aGlzLnZpZXdEYXRhRmFjdHVyYWNpb24pIHtcbiAgICAgICAgICAgIHRoaXMuY291bnRyaWVzRmFjdHVyYWNpb24kLnN1YnNjcmliZShyZXMgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXMgJiYgcmVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5zZXRWYWx1ZShyZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgLy8gUHJvdmluY2lhXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnNldFZhbHVlKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzWzBdPy5wcm92aW5jZXNbMF0uY29kZVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJvdmluY2VzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5wcm92aW5jZXMpXG4gICAgICAgICAgICAgICAgICAgIC8vIERvY3VtZW50b1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydkb2N1bWVudFR5cGUnXS5zZXRWYWx1ZShyZXNbMF0/LmRvY3VtZW50VHlwZXNbMF0uY29kZSlcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb2N1bWVudFR5cGVzRmFjdHVyYWNpb25TdWJqZWN0Lm5leHQocmVzWzBdPy5kb2N1bWVudFR5cGVzKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vbkZvcm1DaGFuZ2UoKVxuICAgICAgICByZXR1cm4gdGhpcy52aWV3RGF0YUZhY3R1cmFjaW9uXG4gICAgfVxuXG4gICAgbmV4dCgpe1xuXHRcdHRoaXMuX2NoZWNrb3V0U2VydmljZS5uZXh0KClcblx0fVxuICAgIFxufVxuIiwiQGlmKGNoYW5uZWwkIHwgYXN5bmM7IGFzIGNoYW5uZWxDb25maWcpe1xuICAgIEBpZihjaGFubmVsQ29uZmlnLmNoYW5uZWxUeXBlICE9ICdiMmInIHx8IChjaGFubmVsQ29uZmlnLmNoYW5uZWxUeXBlID09ICdiMmInICYmIGlzQXV0aGVudGljYXRlZCgpKSl7XG4gICAgICAgIEBpZiggbW9kZVNlbGVjdEFkZHJlc3MgPT0gJ0xPQURfQUREUkVTU19BTkRfU0VMRUNUSU9OJyAmJiBpc0F1dGhlbnRpY2F0ZWQoKSAmJiB0aGlzLmFkZHJlc3NCb29rICE9IG51bGwpe1xuICAgICAgICAgICAgPCEtLVNlbGVjdG9yIGRlIG1vZG9zLS0+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyIGNhcmQgcC00IG1iLTNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBjb2wtbWQtMTAgY29sLWxnLTggdGV4dC1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidG4tZ3JvdXAgYnRuLWdyb3VwLXRvZ2dsZVwiIGRhdGEtYnMtdG9nZ2xlPVwiYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiJ2J0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgJyArICghZ2V0TW9kZSgpID8gJ2FjdGl2ZScgOiAnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJvcHRpb25zXCIgaWQ9XCJvcHRpb24xXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJzZXRNb2RlKCdzZWxlY2Npb24nKVwiPiB7eydzZWxlY3QtYWRkcmVzcycgfCB0cmFuc2xhdGUgfCB0aXRsZWNhc2V9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKCFnZXRQYXJhbUJ5Q2hhbm5lbEFuZExhbmd1YWdlKCdidG5fbmV3X2FkZHJlc3NfJykpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiJ2J0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgJyArIChnZXRNb2RlKCkgPyAnYWN0aXZlJyA6ICcnKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cInJhZGlvXCIgbmFtZT1cIm9wdGlvbnNcIiBpZD1cIm9wdGlvbjJcIiBhdXRvY29tcGxldGU9XCJvZmZcIiAoY2hhbmdlKT1cInNldE1vZGUoJ2NhcmdhJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgJ25ldy1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB8IHRpdGxlY2FzZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFBhcmFtQnlDaGFubmVsQW5kTGFuZ3VhZ2UoJ2J0bl9uZXdfYWRkcmVzc18nKTsgYXMgcGFyYW0pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBbY2xhc3NdPVwiJ2J0biBidG4tb3V0bGluZS1zZWNvbmRhcnkgJyArIChzZWxlY3RBZGRyZXNzID8gJ2FjdGl2ZScgOiAnJylcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJyYWRpb1wiIG5hbWU9XCJvcHRpb25zXCIgaWQ9XCJvcHRpb24yXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgKGNoYW5nZSk9XCJzZXRNb2RlKCdjYXJnYScpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IHBhcmFtLnZhbHVlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICB9XG5cbiAgICAgICAgQGlmKGdldE1vZGUoKSl7XG4gICAgICAgICAgICBAaWYoIXJlcXVpcmVfbG9naW4pe1xuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICBAaWYobW9kZVNlbGVjdEFkZHJlc3MgPT0gJ09OTFlfTE9BRF9BRERSRVNTJyl7XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja291dC10aXRsZSAgbXktMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGgzPnt7J2JpbGxpbmctZGV0YWlscyd8dHJhbnNsYXRlfX08L2gzPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPCEtLUZvcm11bGFyaW8tLT5cbiAgICAgICAgICAgICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNoZWNrb3V0Rm9ybVwiIChzdWJtaXQpPVwidmVyaWZ5VmFsaWRhdGUoJGV2ZW50KVwiPiA8IS0tIC8vdGhpcy5jYXJ0U2VydmljZS5pdGVtcyAtLT5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+PCEtLUZpbGEgMS0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNpIGVzIHJlcXVpcmVkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2ZpcnN0LW5hbWUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5maXJzdE5hbWUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUlucHV0LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiZmlyc3ROYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCIgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ2ZpcnN0TmFtZSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydmaXJzdC1uYW1lLWhlbHAxJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUVycm9yIGluZm8tLT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2ZpcnN0LW5hbWUtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5sYXN0TmFtZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydsYXN0LW5hbWUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5sYXN0TmFtZS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJsYXN0TmFtZVwiIGZvcm1Db250cm9sTmFtZT1cImxhc3ROYW1lXCIgdmFsdWU9XCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2xhc3ROYW1lJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbGFzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snbGFzdC1uYW1lLWhlbHAxJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbGFzdE5hbWUnXS50b3VjaGVkICYmIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snbGFzdE5hbWUnXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydsYXN0LW5hbWUtaGVscDInfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+PCEtLUZpbGEgMi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3Bob25lJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucGhvbmVOdW1iZXIucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwaG9uZU51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncGhvbmVOdW1iZXInIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwaG9uZU51bWJlciddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sncGhvbmUtaGVscDEnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncGhvbmVOdW1iZXInXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sncGhvbmUtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5lbWFpbC5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydlbWFpbC1hZGRyZXNzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZW1haWwucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cImVtYWlsXCIgbmFtZT1cImVtYWlsXCIgZm9ybUNvbnRyb2xOYW1lPSdlbWFpbCcgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ2VtYWlsJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZW1haWwtYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydlbWFpbCddLmVycm9ycz8uWydlbWFpbCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J2VtYWlsLWFkZHJlc3MtaGVscDInfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPjwhLS1GaWxhIDMtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jb3VudHJ5Q29kZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjb3VudHJpZXMkIHwgYXN5bmM7IGFzIGNvdW50cmllcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snY291bnRyeSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNvdW50cnlDb2RlLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzZWxlY3QgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIG5hbWU9XCJjb3VudHJ5Q29kZVwiIGZvcm1Db250cm9sTmFtZT0nY291bnRyeUNvZGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Db3VudHJ5U2VsZWN0ZWQoJGV2ZW50KVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAZm9yKGNvdW50cnkgb2YgY291bnRyaWVzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJjb3VudHJ5LmNvZGVcIj57eyBjb3VudHJ5Lm5hbWUgfX08L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2NvdW50cnlDb2RlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snY291bnRyeUNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snY291bnRyeS1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnByb3ZpbmNlQ29kZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihwcm92aW5jZXMkIHwgYXN5bmM7IGFzIHByb3ZpbmNlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snc3RhdGUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgbmFtZT1cInByb3ZpbmNlQ29kZVwiIChjaGFuZ2UpPVwib25Qcm92aW5jZXNTZWxlY3RlZCgkZXZlbnQsIHByb3ZpbmNlcylcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Byb3ZpbmNlQ29kZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocHJvdmluY2Ugb2YgcHJvdmluY2VzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJwcm92aW5jZS5jb2RlXCI+e3sgcHJvdmluY2UubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm0uY29udHJvbHNbJ3Byb3ZpbmNlQ29kZSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dCB0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydzdGF0ZS1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNpdHkuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3sndG93bi1jaXR5J3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuY2l0eS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImNpdHlcIiBmb3JtQ29udHJvbE5hbWU9J2NpdHknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydjaXR5J10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ2NpdHknXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3sndG93bi1jaXR5LWhlbHAnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDQtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5zdHJlZXQuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLThcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2FkZHJlc3MnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5zdHJlZXQucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJzdHJlZXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3N0cmVldCcgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3N0cmVldCddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snYWRkcmVzcy1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3N0cmVldCddLnRvdWNoZWQgJiYgY2hlY2tvdXRGb3JtLmNvbnRyb2xzWydzdHJlZXQnXS5lcnJvcnM/LlsnbWF4bGVuZ3RoJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2FkZHJlc3MtaGVscDInfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIGZvcm0gZGlyZWNjacOzbiAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wb3N0Y29kZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3sncG9zdGFsLWNvZGUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wb3N0Y29kZS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cInBvc3Rjb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdwb3N0Y29kZScgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1sncG9zdGNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3sncG9zdGFsLWNvZGUtaGVscCd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udG91Y2hlZCAmJiBjaGVja291dEZvcm0uY29udHJvbHNbJ3Bvc3Rjb2RlJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+IHt7J3Bvc3RhbC1jb2RlLXBhdHRlcm4tZXJyb3InIHwgdHJhbnNsYXRlfX0gPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDUtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZG9jdW1lbnRUeXBlcyQgfCBhc3luYzsgYXMgZG9jdW1lbnRUeXBlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LXR5cGUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5kb2N1bWVudFR5cGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwiZG9jdW1lbnRUeXBlXCIgY2xhc3M9XCJmb3JtLXNlbGVjdFwiIChjaGFuZ2UpPVwib25Eb2N1bWVudFR5cGVzU2VsZWN0ZWQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0nZG9jdW1lbnRUeXBlJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiJydcIiBzZWxlY3RlZD57eydkb2N1bWVudC10eXBlJ3x0cmFuc2xhdGV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgIC0tPiBAZm9yKGl0ZW0gb2YgZG9jdW1lbnRUeXBlczsgdHJhY2sgJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG9wdGlvbiBbdmFsdWVdPVwiaXRlbS5jb2RlXCI+e3tpdGVtLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sndHlwZS1kb2N1bWVudC1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmRvY3VtZW50TnVtYmVyLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3R5cGVdPVwiJ3RleHQnXCIgbmFtZT1cImRvY3VtZW50TnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudE51bWJlcicgbWluPVwiMVwiIG1heD1cIjk5OTk5OTk5OTk5XCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm0uY29udHJvbHNbJ2RvY3VtZW50TnVtYmVyJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybS5jb250cm9sc1snZG9jdW1lbnROdW1iZXInXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydkb2N1bWVudC1udW1iZXItaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC1kZlwiPjwhLS1GaWxhIDYtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3Rlcy5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoIWdldExhYmVsTm90ZXNQYXJhbSgpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J25vdGVzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXMucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRMYWJlbE5vdGVzUGFyYW0oKTsgYXMgbGFiZWxub3Rlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIiBbaW5uZXJIVE1MXT1cImxhYmVsbm90ZXMudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwibm90ZXNcIiBmb3JtQ29udHJvbE5hbWU9J25vdGVzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA3LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvcm1GYWN0XCI+PGI+e3sgJ3NhbWUtYmlsbGluZy1hZGRyZXNzJyB8IHRyYW5zbGF0ZSB9fTwvYj4gPGlucHV0IHR5cGU9XCJjaGVja2JveFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIm1zLTJcIiBbY2hlY2tlZF09XCJ2aWV3RGF0YUZhY3R1cmFjaW9uXCIgKGNoYW5nZSk9XCJzaG93Rm9ybUZhY3R1cmFjaW9uKClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJmb3JtRmFjdFwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwicmVxdWlyZWQgdGV4dC11bmRlcmxpbmUgdGV4dC1kYW5nZXJcIj4qIHt7ICdyZXF1aXJlZC1maWVsZHMnIHwgdHJhbnNsYXRlIH19PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy50ZXJtcy5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtMTJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMudGVybXMucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJcIiBmb3I9XCJcIj4ge3sgJ2FjY2VwdC10ZXJtcycgfCB0cmFuc2xhdGUgfX0gPGlucHV0IGNsYXNzPVwibXMtMlwiIG5hbWU9XCJ0ZXJtc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9J3Rlcm1zJyB0eXBlPVwiY2hlY2tib3hcIiByZXF1aXJlZCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIC8+IDwvbGFiZWw+PGJyIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBkYXRhLWJzLXRvZ2dsZT1cIm1vZGFsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1icy10YXJnZXQ9XCIjdGVybWlub3MteS1jb25kaWNpb25lc1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnd2hhdHMtdGhpcycgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtLmNvbnRyb2xzWyd0ZXJtcyddLnRvdWNoZWQgJiYgIWNoZWNrb3V0Rm9ybS5jb250cm9sc1sndGVybXMnXS52YWx1ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3sgJ211c3QtYWNjZXB0LXRlcm1zJyB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZighdmlld0RhdGFGYWN0dXJhY2lvbil7XG4gICAgICAgICAgICAgICAgICAgIDwhLS1Gb3JtdWxhcmlvIGRlIEZhY3R1cmFjacOzbi0tPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtaGVhZGVyIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgyPnt7ICdiaWxsaW5nLWRhdGEnIHwgdHJhbnNsYXRlIH19PC9oMj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiY2hlY2tvdXRGb3JtRmFjdHVyYWNpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+PCEtLUZpbGEgMS0tPlxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZmlyc3ROYW1lLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVNpIGVzIHJlcXVpcmVkLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2ZpcnN0LW5hbWUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5maXJzdE5hbWUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLUlucHV0LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwiZmlyc3ROYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwiZmlyc3ROYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZmlyc3ROYW1lJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydmaXJzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snZmlyc3QtbmFtZS1oZWxwMSd8dHJhbnNsYXRlfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1FcnJvciBpbmZvLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydmaXJzdE5hbWUnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2ZpcnN0TmFtZSddLmVycm9ycz8uWydwYXR0ZXJuJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZmlyc3QtbmFtZS1oZWxwMid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmxhc3ROYW1lLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2xhc3QtbmFtZSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmxhc3ROYW1lLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cImxhc3ROYW1lXCIgZm9ybUNvbnRyb2xOYW1lPVwibGFzdE5hbWVcIiB2YWx1ZT1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydsYXN0TmFtZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbGFzdE5hbWUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+e3snbGFzdC1uYW1lLWhlbHAxJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydsYXN0TmFtZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snbGFzdE5hbWUnXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydsYXN0LW5hbWUtaGVscDInfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+PCEtLUZpbGEgMi0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnBob25lTnVtYmVyLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3Bob25lJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucGhvbmVOdW1iZXIucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwaG9uZU51bWJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncGhvbmVOdW1iZXInIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwaG9uZU51bWJlciddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7J3Bob25lLWhlbHAxJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncGhvbmVOdW1iZXInXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bob25lTnVtYmVyJ10uZXJyb3JzPy5bJ3BhdHRlcm4nXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydwaG9uZS1oZWxwMid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmVtYWlsLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J2VtYWlsLWFkZHJlc3MnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5lbWFpbC5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwiZW1haWxcIiBuYW1lPVwiZW1haWxcIiBmb3JtQ29udHJvbE5hbWU9J2VtYWlsJyB2YWx1ZT1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydlbWFpbCddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZW1haWwnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZGFuZ2VyLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtZGFuZ2VyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eydlbWFpbC1hZGRyZXNzLWhlbHAxJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZW1haWwnXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2VtYWlsJ10uZXJyb3JzPy5bJ2VtYWlsJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZW1haWwtYWRkcmVzcy1oZWxwMid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+PCEtLUZpbGEgMy0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNvdW50cnlDb2RlLmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNvdW50cmllcyQgfCBhc3luYzsgYXMgY291bnRyaWVzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZvcm0tbGFiZWxcIj57eydjb3VudHJ5J3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuY291bnRyeUNvZGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgbmFtZT1cImNvdW50cnlDb2RlXCIgZm9ybUNvbnRyb2xOYW1lPSdjb3VudHJ5Q29kZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYW5nZSk9XCJvbkNvdW50cnlTZWxlY3RlZCgkZXZlbnQsIHRydWUpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IoY291bnRyeSBvZiBjb3VudHJpZXM7IHRyYWNrICRpbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvcHRpb24gW3ZhbHVlXT1cImNvdW50cnkuY29kZVwiPnt7IGNvdW50cnkubmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjb3VudHJ5Q29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snY291bnRyeUNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snY291bnRyeS1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnByb3ZpbmNlQ29kZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihwcm92aW5jZXMkIHwgYXN5bmM7IGFzIHByb3ZpbmNlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmb3JtLWxhYmVsXCI+e3snc3RhdGUnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5wcm92aW5jZUNvZGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tc2VsZWN0XCIgbmFtZT1cInByb3ZpbmNlQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25Qcm92aW5jZXNTZWxlY3RlZCgkZXZlbnQsIHByb3ZpbmNlcywgdHJ1ZSlcIiBmb3JtQ29udHJvbE5hbWU9J3Byb3ZpbmNlQ29kZSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBmb3IocHJvdmluY2Ugb2YgcHJvdmluY2VzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJwcm92aW5jZS5jb2RlXCI+e3sgcHJvdmluY2UubmFtZSB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncHJvdmluY2VDb2RlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwcm92aW5jZUNvZGUnXS5lcnJvcnM/LlsncmVxdWlyZWQnXSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQgdGV4dC1kYW5nZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snc3RhdGUtaGVscCd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5jaXR5LmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC00XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J3Rvd24tY2l0eSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmNpdHkucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJjaXR5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdjaXR5JyB2YWx1ZT1cIlwiIHBsYWNlaG9sZGVyPVwiXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjaXR5J10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydjaXR5J10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J3Rvd24tY2l0eS1oZWxwJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA0LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuc3RyZWV0LmVuYWJsZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZ3JvdXAgY29sLTEyIGNvbC1tZC04XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydhZGRyZXNzJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuc3RyZWV0LnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgdHlwZT1cInRleHRcIiBuYW1lPVwic3RyZWV0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdzdHJlZXQnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snc3RyZWV0J10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPnt7J2FkZHJlc3MtaGVscDEnfHRyYW5zbGF0ZX19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3N0cmVldCddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snc3RyZWV0J10uZXJyb3JzPy5bJ21heGxlbmd0aCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydhZGRyZXNzLWhlbHAyJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSBmb3JtIGRpcmVjY2nDs24gLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucG9zdGNvZGUuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J3Bvc3RhbC1jb2RlJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMucG9zdGNvZGUucmVxdWlyZWQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlcXVpcmVkXCI+Kjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJwb3N0Y29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT0ncG9zdGNvZGUnIHZhbHVlPVwiXCIgcGxhY2Vob2xkZXI9XCJcIiBhdXRvY29tcGxldGU9XCJvZmZcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ3Bvc3Rjb2RlJ10udG91Y2hlZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLmVycm9ycz8uWydyZXF1aXJlZCddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj57eydwb3N0YWwtY29kZS1oZWxwJ3x0cmFuc2xhdGV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGNoZWNrb3V0Rm9ybUZhY3R1cmFjaW9uLmNvbnRyb2xzWydwb3N0Y29kZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1sncG9zdGNvZGUnXS5lcnJvcnM/LlsncGF0dGVybiddKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1kYW5nZXItY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1kYW5nZXJcIj4ge3sncG9zdGFsLWNvZGUtcGF0dGVybi1lcnJvcicgfCB0cmFuc2xhdGV9fSA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+PCEtLUZpbGEgNS0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmRvY3VtZW50VHlwZS5lbmFibGVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihkb2N1bWVudFR5cGVzJCB8IGFzeW5jOyBhcyBkb2N1bWVudFR5cGVzKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWdyb3VwIGNvbC0xMiBjb2wtbWQtNFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCI+e3snZG9jdW1lbnQtdHlwZSd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmRvY3VtZW50VHlwZS5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9PC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2VsZWN0IG5hbWU9XCJkb2N1bWVudFR5cGVcIiBjbGFzcz1cImZvcm0tc2VsZWN0XCIgKGNoYW5nZSk9XCJvbkRvY3VtZW50VHlwZXNTZWxlY3RlZCgkZXZlbnQsIHRydWUpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudFR5cGUnPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8IS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCInJ1wiIHNlbGVjdGVkPnt7J2RvY3VtZW50LXR5cGUnfHRyYW5zbGF0ZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+IEBmb3IoaXRlbSBvZiBkb2N1bWVudFR5cGVzOyB0cmFjayAkaW5kZXgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8b3B0aW9uIFt2YWx1ZV09XCJpdGVtLmNvZGVcIj57e2l0ZW0ubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50VHlwZSddLnRvdWNoZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnRUeXBlJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sndHlwZS1kb2N1bWVudC1oZWxwJ3x0cmFuc2xhdGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMuZG9jdW1lbnROdW1iZXIuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJmaWVsZC1sYWJlbFwiPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLmRvY3VtZW50TnVtYmVyLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgW3R5cGVdPVwiJ3RleHQnXCIgbmFtZT1cImRvY3VtZW50TnVtYmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdkb2N1bWVudE51bWJlcicgbWluPVwiMVwiIG1heD1cIjk5OTk5OTk5OTk5XCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihjaGVja291dEZvcm1GYWN0dXJhY2lvbi5jb250cm9sc1snZG9jdW1lbnROdW1iZXInXS50b3VjaGVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRGb3JtRmFjdHVyYWNpb24uY29udHJvbHNbJ2RvY3VtZW50TnVtYmVyJ10uZXJyb3JzPy5bJ3JlcXVpcmVkJ10pe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWRhbmdlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWRhbmdlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3snZG9jdW1lbnQtbnVtYmVyLWhlbHAnfHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtZGZcIj48IS0tRmlsYSA2LS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0VHlwZUZvcm0oKS52aWV3Rm9ybXMubm90ZXMuZW5hYmxlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKCFnZXRMYWJlbE5vdGVzUGFyYW0oKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZmllbGQtbGFiZWxcIj57eydub3Rlcyd8dHJhbnNsYXRlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLm5vdGVzLnJlcXVpcmVkKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJyZXF1aXJlZFwiPio8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAaWYoZ2V0TGFiZWxOb3Rlc1BhcmFtKCk7IGFzIGxhYmVsbm90ZXMpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImZpZWxkLWxhYmVsXCIgW2lubmVySFRNTF09XCJsYWJlbG5vdGVzLnZhbHVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRUeXBlRm9ybSgpLnZpZXdGb3Jtcy5ub3Rlcy5yZXF1aXJlZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwicmVxdWlyZWRcIj4qPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgKGNoYW5nZSk9XCJvbklucHV0Q2hhbmdlKClcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIHR5cGU9XCJ0ZXh0XCIgbmFtZT1cIm5vdGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPSdub3RlcycgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IGQtZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IHRleHQtd2hpdGVcIiBbZGlzYWJsZWRdPVwiY2hlY2tvdXRGb3JtLmludmFsaWRcIj57eyhpc0xhc3RPbmVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnZmluaXNoLWNoZWNrb3V0JyA6IChhbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0ge3soYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDogKGlzTGFzdE9uZSA/ICdmaW5pc2gtY2hlY2tvdXQnIDogJ3JlYWR5LWZvcm0nKSkgfCB0cmFuc2xhdGV9fSAgLS0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIEBpZihsb2FkaW5nKXtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWZ1bGwtZWM+PC9hcHAtbG9hZGluZy1mdWxsLWVjPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgaWQ9XCJsb2dpbkNoZWNrb3V0XCI+XG4gICAgICAgICAgICAgICAgQGlmKHJlcXVpcmVfbG9naW4pe1xuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggZmxleC1jb2x1bW4ganVzdGlmeS1jb250ZW50LWNlbnRlciBhbGlnbi1pdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2dpbi1mb3JtLWVjIChyZWFkeSk9XCJ2ZXJpZnlWYWxpZGF0ZSgkZXZlbnQpXCIgW3JlZGlyZWN0XT1cImZhbHNlXCIgW3RpdGxlXT1cIiduZWVkLWxvZ2luJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hcHAtbG9naW4tZm9ybS1lYz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICBAaWYobW9kZVNlbGVjdEFkZHJlc3MgPT0gJ09OTFlfQUREUkVTU19TRUxFQ1RJT04nKXtcbiAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrb3V0LXRpdGxlIG15LTJcIj5cbiAgICAgICAgICAgIDxoMz57eydhZGRyZXNzLXNlbGVjdGlvbid8dHJhbnNsYXRlfX08L2gzPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuXG4gICAgICAgIEBpZih0aGlzLmFkZHJlc3NCb29rKXtcbiAgICAgICAgICAgIEBpZih0aGlzLmFkZHJlc3NCb29rPy5sZW5ndGgpe1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgQGZvcihpdGVtIG9mIGFkZHJlc3NCb29rOyB0cmFjayAkaW5kZXg7IGxldCBpID0gJGluZGV4KXtcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS02IGNvbC0xMiBteS0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBwLTNcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJtcy0xIG10LTMgZm9ybS1jaGVjay1pbnB1dCBpbnB1dC1zaXplLWxnXCIgdHlwZT1cInJhZGlvXCIgW25hbWVdPVwiJ24tJytpXCIgW2lkXT1cImlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2hlY2tlZF09XCJpdGVtLnNlbGVjdGVkXCIgKGNsaWNrKT1cInNldFNlbGVjdEFkZHJlc3MoaXRlbSlcIiAoY2hhbmdlKT1cIm9uSW5wdXRDaGFuZ2UoKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtcy01XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNCBjbGFzcz1cImNhcmQtdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snYWRkcmVzcyd8dHJhbnNsYXRlfX08L3N0cm9uZz48YnI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdXBwZXJjYXNlIGgzXCI+e3tpdGVtLnN0cmVldH19PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g0PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snY291bnRyeSd8dHJhbnNsYXRlfX08L3N0cm9uZz4ge3tnZXRDb3VudHJ5KGl0ZW0uY291bnRyeUNvZGUpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snc3RhdGUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+IHt7Z2V0UHJvdmluY2UoaXRlbS5wcm92aW5jZUNvZGUpfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXN1YnRpdGxlIG1iLTIgdGV4dC1tdXRlZCBjb2wtYXV0b1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3sndG93bi1jaXR5J3x0cmFuc2xhdGV9fTwvc3Ryb25nPiB7e2l0ZW0uY2l0eX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g1PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWQgY29sLWF1dG9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J3Bvc3RhbC1jb2RlJ3x0cmFuc2xhdGV9fTwvc3Ryb25nPiB7e2l0ZW0ucG9zdGNvZGV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgcHgtM1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQgcC0yIGJnLWxpZ2h0IHctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJjYXJkLXRpdGxlXCI+e3snYWRkcmVzcy1jb250YWN0J3x0cmFuc2xhdGV9fTwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2ZpcnN0LW5hbWUnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uYWRkcmVzc0NvbnRhY3QuZmlyc3ROYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snbGFzdC1uYW1lJ3x0cmFuc2xhdGV9fTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLmFkZHJlc3NDb250YWN0Lmxhc3ROYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9oNj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg2IGNsYXNzPVwiY2FyZC1zdWJ0aXRsZSBtYi0yIHRleHQtbXV0ZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+e3snZG9jdW1lbnQtdHlwZSd8dHJhbnNsYXRlfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Z2V0RG9jdW1lbnRUeXBlKGl0ZW0uYWRkcmVzc0NvbnRhY3QuZG9jdW1lbnRUeXBlKX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2RvY3VtZW50LW51bWJlcid8dHJhbnNsYXRlfX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5hZGRyZXNzQ29udGFjdC5kb2N1bWVudE51bWJlcn19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvaDY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxoNiBjbGFzcz1cImNhcmQtc3VidGl0bGUgbWItMiB0ZXh0LW11dGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPnt7J2VtYWlsLWFkZHJlc3MnfHRyYW5zbGF0ZX19PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2l0ZW0uYWRkcmVzc0NvbnRhY3QuZW1haWx9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2g2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LWRmXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1ncm91cCBjb2wtMTIgY29sLW1kLTEyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQGlmKCFnZXRMYWJlbE5vdGVzUGFyYW0oKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiPnt7J25vdGVzJ3x0cmFuc2xhdGV9fTwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBpZihnZXRMYWJlbE5vdGVzUGFyYW0oKTsgYXMgbGFiZWxub3Rlcyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiZm9ybS1sYWJlbFwiIFtpbm5lckhUTUxdPVwibGFiZWxub3Rlcy52YWx1ZVwiPjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IChjaGFuZ2UpPVwib25JbnB1dENoYW5nZSgpXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiB0eXBlPVwidGV4dFwiIG5hbWU9XCJub3Rlc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidGhpcy5hZGRyZXNzQm9va1NlbGVjdGVkLm5vdGVzXCIgI2N0cmw9XCJuZ01vZGVsXCIgdmFsdWU9XCJcIiBwbGFjZWhvbGRlcj1cIlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgZC1mbGV4IGZsZXgtcm93XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1lbmRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uU2VsZWN0QWRkcmVzcyhjYXJ0SXRlbXMpXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgdGV4dC13aGl0ZVwiIFtkaXNhYmxlZF09XCJsb2FkaW5nU3RlcFwiPnt7KGlzTGFzdE9uZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2ZpbmlzaC1jaGVja291dCcgOiAoYWxscmVhZHlfZGF0YSA/ICd1cGRhdGUnIDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLSB7eyhhbGxyZWFkeV9kYXRhID8gJ3VwZGF0ZScgOiAoaXNMYXN0T25lID8gJ2ZpbmlzaC1jaGVja291dCcgOiAncmVhZHktZm9ybScpKSB8IHRyYW5zbGF0ZX19ICAtLT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIEBpZihsb2FkaW5nKXtcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c2l0ZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhcHAtbG9hZGluZy1mdWxsLWVjPjwvYXBwLWxvYWRpbmctZnVsbC1lYz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH0gQGVsc2Uge1xuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiB0ZXh0LWNlbnRlciBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGZsZXgtY29sdW1uIGp1c3RpZnktY29udGVudC1jZW50ZXIgYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGFwcC1sb2FkaW5nLWZ1bGwtZWM+PC9hcHAtbG9hZGluZy1mdWxsLWVjPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gQGVsc2Uge1xuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFpbmVyXCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0xMiB0ZXh0LWNlbnRlciBteS0yXCI+XG4gICAgICAgICAgICAgICAgICAgIDxoND4ge3snYWRkcmVzcy1ib29rLW5vdC1yZXN1bHQnIHwgdHJhbnNsYXRlIH19IDwvaDQ+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICB9XG4gICAgQGVsc2Uge1xuICAgIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIj5cbiAgICAgICAgPHA+UG9yIGZhdm9yIDxhIFtyb3V0ZXJMaW5rXT1cIlsnL2F1dGgvbG9naW4nXVwiPiBJbmljaWUgU2VzacOzbjwvYT48L3A+XG4gICAgPC9kaXY+XG4gICAgfVxufVxuQGlmKGdldFR5cGVGb3JtKCkudmlld0Zvcm1zLnRlcm1zLmVuYWJsZWQpe1xuPGRpdiBjbGFzcz1cIm1vZGFsIGZhZGVcIiBpZD1cInRlcm1pbm9zLXktY29uZGljaW9uZXNcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbGxlZGJ5PVwibW9kYWxMYWJlbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1kaWFsb2cgbW9kYWwteGwgbW9kYWwtZGlhbG9nLXNjcm9sbGFibGVcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm1vZGFsLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICAgICAgICAgICAgICA8aDUgY2xhc3M9XCJtb2RhbC10aXRsZVwiIGlkPVwibW9kYWxMYWJlbFwiPlTDqXJtaW5vcyB5IGNvbmRpY2lvbmVzPC9oNT5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0bi1jbG9zZVwiIGRhdGEtYnMtZGlzbWlzcz1cIm1vZGFsXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCI+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgICAgICAgICAgICAgPGFwcC1ibG9ja3MtZWMgW3NlY3Rpb25dPVwiJ3Rlcm1pbm9zLXktY29uZGljaW9uZXMnXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxufSJdfQ==
|