ng-easycommerce-v18 0.6.41 → 0.6.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/README.md +31 -0
  2. package/assets/ec-i18n/ct.json +38 -1
  3. package/assets/ec-i18n/en.json +38 -1
  4. package/assets/ec-i18n/es.json +10 -1
  5. package/assets/ec-i18n/fr.json +38 -1
  6. package/assets/ec-i18n/gl.json +38 -1
  7. package/assets/ec-i18n/pr.json +38 -1
  8. package/esm2022/lib/constants/core.constants.service.mjs +7 -9
  9. package/esm2022/lib/ec-components/account-ec/address-book-ec/address-book-ec.component.mjs +32 -4
  10. package/esm2022/lib/ec-components/account-ec/order-ec/order-ec.component.mjs +105 -21
  11. package/esm2022/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.mjs +36 -6
  12. package/esm2022/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.mjs +54 -29
  13. package/esm2022/lib/ec-components/cart-ec/cart-ec.component.mjs +12 -3
  14. package/esm2022/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.mjs +50 -11
  15. package/esm2022/lib/ec-components/checkout-ec/checkout-ec.component.mjs +90 -39
  16. package/esm2022/lib/ec-components/checkout-ec/dataform-ec/dataform-ec.component.mjs +23 -5
  17. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-ec.component.mjs +3 -1
  18. package/esm2022/lib/ec-components/checkout-ec/payment-ec/payment-methods/mp-redirect-ec/mp-redirect-ec.component.mjs +3 -1
  19. package/esm2022/lib/ec-components/collection-ec/collection-ec.component.mjs +30 -6
  20. package/esm2022/lib/ec-components/product-detail-ec/product-detail-ec.component.mjs +67 -41
  21. package/esm2022/lib/ec-components/product-ec/product-ec.component.mjs +73 -24
  22. package/esm2022/lib/ec-components/sidebar-ec/sidebar-ec.component.mjs +7 -3
  23. package/esm2022/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.mjs +31 -2
  24. package/esm2022/lib/ec-components/user-portal-ec/user-documents-ec/user-documents-ec.component.mjs +87 -25
  25. package/esm2022/lib/ec-components/user-portal-ec/user-portal-ec.component.mjs +23 -10
  26. package/esm2022/lib/ec-components/user-portal-ec/user-profile-ec/user-profile-ec.component.mjs +30 -4
  27. package/esm2022/lib/ec-components/user-portal-ec/user-security-ec/user-security-ec.component.mjs +18 -3
  28. package/esm2022/lib/ec-components/wishlist-ec/wishlist-ec.component.mjs +89 -7
  29. package/esm2022/lib/ec-components/wishlist-ec/wishlist-item-ec/wishlist-item-ec.component.mjs +11 -4
  30. package/esm2022/lib/ec-components/wishlist-modal-ec/wishlist-modal-ec.component.mjs +3 -3
  31. package/esm2022/lib/ec-guards/access-policy.guard.mjs +22 -0
  32. package/esm2022/lib/ec-guards/guest-only.guard.mjs +22 -0
  33. package/esm2022/lib/ec-guards/index.mjs +3 -1
  34. package/esm2022/lib/ec-services/access-policy-navigation.service.mjs +57 -0
  35. package/esm2022/lib/ec-services/access-policy.service.mjs +74 -0
  36. package/esm2022/lib/ec-services/address-book.service.mjs +27 -3
  37. package/esm2022/lib/ec-services/addressing.service.mjs +10 -1
  38. package/esm2022/lib/ec-services/auth.service.mjs +2 -6
  39. package/esm2022/lib/ec-services/capabilities.service.mjs +28 -0
  40. package/esm2022/lib/ec-services/cart.service.mjs +237 -64
  41. package/esm2022/lib/ec-services/checkout.service.mjs +83 -47
  42. package/esm2022/lib/ec-services/commerce-access.service.mjs +38 -0
  43. package/esm2022/lib/ec-services/file-security-validator.service.mjs +8 -1
  44. package/esm2022/lib/ec-services/index.mjs +5 -1
  45. package/esm2022/lib/ec-services/order-documents-visibility.service.mjs +6 -4
  46. package/esm2022/lib/ec-services/orders.service.mjs +73 -5
  47. package/esm2022/lib/ec-services/payment.service.mjs +19 -4
  48. package/esm2022/lib/ec-services/product-detail.service.mjs +27 -10
  49. package/esm2022/lib/ec-services/profile.service.mjs +23 -5
  50. package/esm2022/lib/ec-services/quantity-rules.service.mjs +82 -21
  51. package/esm2022/lib/ec-services/shipment.service.mjs +81 -33
  52. package/esm2022/lib/ec-services/wishlist.service.mjs +95 -18
  53. package/esm2022/lib/interceptors/auth.interceptor.mjs +23 -29
  54. package/esm2022/lib/interfaces/access-policy.mjs +2 -0
  55. package/esm2022/lib/interfaces/capabilities.mjs +2 -0
  56. package/esm2022/lib/interfaces/cart-session-state.mjs +2 -0
  57. package/esm2022/lib/interfaces/channel.mjs +2 -0
  58. package/esm2022/lib/interfaces/checkout.mjs +1 -1
  59. package/esm2022/lib/interfaces/index.mjs +5 -1
  60. package/esm2022/lib/interfaces/product.mjs +1 -1
  61. package/esm2022/lib/providers/access-policy-internal.mjs +7 -0
  62. package/esm2022/lib/providers/checkout-access-denied.mjs +34 -0
  63. package/esm2022/lib/providers/index.mjs +4 -1
  64. package/esm2022/lib/providers/provideAccessPolicy.mjs +44 -0
  65. package/esm2022/lib/providers/provideCapabilities.mjs +25 -0
  66. package/esm2022/lib/utils/index.mjs +4 -1
  67. package/esm2022/lib/utils/price-presentation.service.mjs +352 -0
  68. package/esm2022/lib/utils/product-image-resolver.mjs +18 -0
  69. package/esm2022/lib/utils/product-variant-resolver.mjs +57 -0
  70. package/fesm2022/ng-easycommerce-v18.mjs +2393 -508
  71. package/fesm2022/ng-easycommerce-v18.mjs.map +1 -1
  72. package/lib/constants/core.constants.service.d.ts +1 -2
  73. package/lib/ec-components/account-ec/address-book-ec/address-book-ec.component.d.ts +3 -0
  74. package/lib/ec-components/account-ec/order-ec/order-ec.component.d.ts +10 -0
  75. package/lib/ec-components/account-ec/orders-list-ec/orders-list-ec.component.d.ts +4 -0
  76. package/lib/ec-components/auth-ec/login-form-ec/login-form-ec.component.d.ts +11 -5
  77. package/lib/ec-components/cart-ec/cart-ec.component.d.ts +3 -0
  78. package/lib/ec-components/cart-ec/cart-item-ec/cart-item-ec.component.d.ts +12 -1
  79. package/lib/ec-components/checkout-ec/checkout-ec.component.d.ts +16 -1
  80. package/lib/ec-components/collection-ec/collection-ec.component.d.ts +4 -0
  81. package/lib/ec-components/product-detail-ec/product-detail-ec.component.d.ts +13 -0
  82. package/lib/ec-components/product-ec/product-ec.component.d.ts +12 -1
  83. package/lib/ec-components/sidebar-ec/sidebar-ec.component.d.ts +2 -0
  84. package/lib/ec-components/user-portal-ec/user-addresses-ec/user-addresses-ec.component.d.ts +1 -0
  85. package/lib/ec-components/user-portal-ec/user-documents-ec/user-documents-ec.component.d.ts +9 -1
  86. package/lib/ec-components/user-portal-ec/user-portal-ec.component.d.ts +1 -0
  87. package/lib/ec-components/user-portal-ec/user-profile-ec/user-profile-ec.component.d.ts +2 -0
  88. package/lib/ec-components/user-portal-ec/user-security-ec/user-security-ec.component.d.ts +2 -0
  89. package/lib/ec-components/wishlist-ec/wishlist-ec.component.d.ts +19 -0
  90. package/lib/ec-components/wishlist-ec/wishlist-item-ec/wishlist-item-ec.component.d.ts +3 -0
  91. package/lib/ec-guards/access-policy.guard.d.ts +6 -0
  92. package/lib/ec-guards/guest-only.guard.d.ts +6 -0
  93. package/lib/ec-guards/index.d.ts +2 -0
  94. package/lib/ec-services/access-policy-navigation.service.d.ts +23 -0
  95. package/lib/ec-services/access-policy.service.d.ts +39 -0
  96. package/lib/ec-services/address-book.service.d.ts +4 -0
  97. package/lib/ec-services/analytics/google-analytics.service.d.ts +1 -1
  98. package/lib/ec-services/analytics/gtm.service.d.ts +1 -1
  99. package/lib/ec-services/capabilities.service.d.ts +16 -0
  100. package/lib/ec-services/cart.service.d.ts +18 -5
  101. package/lib/ec-services/checkout.service.d.ts +11 -5
  102. package/lib/ec-services/commerce-access.service.d.ts +20 -0
  103. package/lib/ec-services/file-security-validator.service.d.ts +1 -1
  104. package/lib/ec-services/index.d.ts +4 -0
  105. package/lib/ec-services/order-documents-visibility.service.d.ts +2 -1
  106. package/lib/ec-services/orders.service.d.ts +8 -0
  107. package/lib/ec-services/payment.service.d.ts +1 -1
  108. package/lib/ec-services/product-detail.service.d.ts +1 -0
  109. package/lib/ec-services/profile.service.d.ts +3 -0
  110. package/lib/ec-services/quantity-rules.service.d.ts +14 -6
  111. package/lib/ec-services/shipment.service.d.ts +4 -1
  112. package/lib/ec-services/wishlist.service.d.ts +5 -0
  113. package/lib/interfaces/access-policy.d.ts +22 -0
  114. package/lib/interfaces/capabilities.d.ts +11 -0
  115. package/lib/interfaces/cart-session-state.d.ts +1 -0
  116. package/lib/interfaces/channel.d.ts +8 -0
  117. package/lib/interfaces/checkout.d.ts +14 -1
  118. package/lib/interfaces/index.d.ts +4 -0
  119. package/lib/interfaces/product.d.ts +52 -1
  120. package/lib/providers/access-policy-internal.d.ts +4 -0
  121. package/lib/providers/checkout-access-denied.d.ts +17 -0
  122. package/lib/providers/index.d.ts +3 -0
  123. package/lib/providers/provideAccessPolicy.d.ts +14 -0
  124. package/lib/providers/provideCapabilities.d.ts +9 -0
  125. package/lib/utils/index.d.ts +3 -0
  126. package/lib/utils/price-presentation.service.d.ts +84 -0
  127. package/lib/utils/product-image-resolver.d.ts +7 -0
  128. package/lib/utils/product-variant-resolver.d.ts +7 -0
  129. package/package.json +1 -1
package/README.md CHANGED
@@ -1,3 +1,34 @@
1
+ # Version 0.6.42
2
+ - Capabilities locales: se agrega `provideEasyCommerceCapabilities(...)` para configurar de forma declarativa `documents`, `bulkAdd` y `cartPreprint` desde el bootstrap del frontend.
3
+ - Compatibilidad: `CapabilitiesService` utiliza defaults deshabilitados y mantiene sincronizados los setters/getters legacy de documentos, agregado masivo y preimpresión de carrito.
4
+ - SSR: la configuración de capabilities es sincrónica, determinista y no depende de APIs del navegador.
5
+ - Wishlist: `WishlistEcComponent`, `WishlistItemEcComponent` y `WishlistModalEcComponent` consumen variables CSS semánticas con fallback al theme genérico del frontend.
6
+ - Wishlist: el agregado masivo al carrito informa los productos sin stock y permite continuar sólo con los productos disponibles.
7
+ - Portal de usuario: la ausencia o invalidez de `section` restablece la sección activa a `profile`.
8
+ - Precios y promociones: se centraliza la presentación de precios de productos, variantes, líneas de carrito y resúmenes mediante contratos normalizados, preservando compatibilidad legacy y sin recalcular importes en los templates.
9
+ - Precios sin impuesto: se aceptan contratos de pricing con `hasTax=false` aunque `rate` e `includedInPrice` estén omitidos, preservando `current`, `previous` y el fallback legacy.
10
+ - Precios y promociones: se corrige la presentación visual de `previous`/`current` y el descuento sólo se muestra cuando `previous` es mayor que el precio actual.
11
+ - Variantes y precios: se centraliza la resolución de la variante concreta y se preserva la semántica de rango, precio exacto y `previous` para productos simples, únicos y multivariantes.
12
+ - Productos: se agrega `resolveProductImages(...)` para resolver imágenes de variante con fallback seguro a `picturesdefault`, sin mutar el payload.
13
+ - Product Detail: se mantiene la restauración de variantes mediante `?variant=<variant.code>` y `ProductDetailService.setOption()`, preservando enlaces legacy sin query param.
14
+ - Carrito y sidebar: el fallback de precios legacy, la mutación de precios y la presentación de subtotales, descuentos, impuestos, cupones, shipping y totales utilizan la variante real del item, sin depender ambiguamente de `variants[0]` ni recalcular importes en los templates.
15
+ - Checkout y pedidos: se preservan los contratos históricos y la presentación de precios persistidos, incluyendo compatibilidad con respuestas legacy.
16
+ - Auth: una restauración de sesión fallida ejecuta la misma limpieza completa que un logout, notificando el estado deslogueado a los servicios dependientes.
17
+ - Documentos de usuario y pedido: se diferencian los estados de carga, error y lista vacía, con feedback traducible para fallos de listado, upload y eliminación.
18
+ - Documentos: se bloquean uploads concurrentes, se rechazan archivos vacíos, se agregan confirmaciones traducibles para eliminar documentos de usuario y se codifican los nombres en las URLs de descarga.
19
+ - Documentos: se mejora la accesibilidad y la presentación responsive mediante estilos neutros y variables CSS semánticas tematizables por cada frontend.
20
+ - Cantidades: `QuantityRulesService`, Product, Product Detail, Cart Item y CartService centralizan y consumen las reglas de mínimo, múltiplo absoluto, máximo y stock de la variante efectiva, incluyendo normalización, incremento/decremento, compatibilidad legacy y validación segura cuando no existe una variante válida.
21
+ - Créditos: la validación de saldo utiliza la variante resuelta y falla de forma segura cuando un producto multivariante no tiene identidad válida.
22
+ - Agregado masivo: `CollectionEcComponent` utiliza la variante indicada por `productToCartItem` y aplica el stock, la cantidad y las reglas de la variante seleccionada.
23
+ - Access Policy: se agregan `EasyCommerceAccessPolicy`, guards configurables por dimensión, navegación segura con `returnUrl` y compatibilidad legacy para frontends que no configuran la policy.
24
+ - Carrito anónimo: `CommerceAccessService` centraliza el acceso a las operaciones de carrito y permite mantenimiento seguro de carritos guest preexistentes sin acoplar `CartService` a la policy.
25
+ - Checkout guest: se agrega compatibilidad explícita para `allowGuestCheckout`, enforcement en `CheckoutEcComponent` y `CheckoutAccessDeniedHandler` configurable mediante provider o factory con DI.
26
+ - Ciclo de sesión: `CartSessionState` y generaciones internas protegen la sincronización del carrito, descartan respuestas stale y hacen que Checkout espere el carrito final de la sesión actual.
27
+ - Checkout: se invalidan contextos ante cambios de sesión y se protegen respuestas de addressing, shipping y payment para evitar publicar estados, costos, preferencias o URLs de contextos anteriores.
28
+ - Auth: las requests concurrentes comparten el refresh token en curso y finalizan de forma determinista cuando el refresh falla, evitando esperas indefinidas y loops de retry.
29
+ - Estado privado: Account, Profile, Orders, Address Book, Documents, Security y Wishlist limpian estado al perder la sesión y descartan respuestas async de usuarios anteriores.
30
+ - Tests: se amplía la cobertura de capabilities, pricing, variantes, cantidades, créditos, agregado masivo, Wishlist, portal, documentos y regresiones de carrito.
31
+
1
32
  # Version 0.6.41
2
33
  - Checkout y carrito: se soportan descuentos y recargos por método de pago desde `totals.paymentMethodAdjustment`, preservando el signo y separándolos de las promociones normales.
3
34
  - Métodos de pago: se muestra el preview de ajustes porcentuales y fijos, incluyendo el signo explícito para recargos.
@@ -457,5 +457,42 @@
457
457
  "user-portal.addresses.cancel": "Cancel\u00b7lar",
458
458
  "user-portal.addresses.save": "Desar",
459
459
  "user-portal.addresses.success-saved": "Adreça desada correctament.",
460
- "user-portal.addresses.error-save": "No s'ha pogut desar l'adreça."
460
+ "user-portal.addresses.error-save": "No s'ha pogut desar l'adreça.",
461
+ "user-portal.documents.empty": "No tens documents pujats.",
462
+ "user-portal.documents.upload-title": "Pujar document",
463
+ "user-portal.documents.file": "Fitxer",
464
+ "user-portal.documents.type": "Tipus de document",
465
+ "user-portal.documents.type-none": "Sense especificar",
466
+ "user-portal.documents.type-dni": "DNI",
467
+ "user-portal.documents.type-nif": "NIF",
468
+ "user-portal.documents.type-contract": "Contracte",
469
+ "user-portal.documents.type-other": "Altre",
470
+ "user-portal.documents.upload": "Pujar",
471
+ "user-portal.documents.download": "Descarregar",
472
+ "user-portal.documents.delete": "Eliminar",
473
+ "user-portal.documents.upload-success": "Document pujat correctament.",
474
+ "user-portal.documents.upload-error": "No s'ha pogut pujar el document.",
475
+ "user-portal.documents.delete-success": "Document eliminat correctament.",
476
+ "user-portal.documents.allowed-formats": "Formats permesos",
477
+ "user-portal.documents.loading": "Carregant documents",
478
+ "user-portal.documents.load-error": "No s'han pogut carregar els documents.",
479
+ "user-portal.documents.delete-error": "No s'ha pogut eliminar el document.",
480
+ "user-portal.documents.delete-confirm": "Vols eliminar aquest document?",
481
+ "order.documents.title": "Documents de la comanda",
482
+ "order.documents.empty": "No hi ha documents adjunts a aquesta comanda.",
483
+ "order.documents.file": "Fitxer",
484
+ "order.documents.type": "Tipus",
485
+ "order.documents.type-order-note": "Nota de comanda",
486
+ "order.documents.type-payment-receipt": "Comprovant de pagament",
487
+ "order.documents.type-other": "Altre",
488
+ "order.documents.upload": "Adjuntar",
489
+ "order.documents.loading": "Carregant documents de la comanda",
490
+ "order.documents.load-error": "No s'han pogut carregar els documents de la comanda.",
491
+ "order.documents.upload-error": "No s'ha pogut adjuntar el document.",
492
+ "order.documents.download": "Descarregar document",
493
+ "upload.error.size": "El fitxer supera la mida màxima permesa (10 MB).",
494
+ "upload.error.mime-mismatch": "El tipus declarat del fitxer no coincideix amb el seu contingut real.",
495
+ "upload.error.malicious-name": "El nom del fitxer conté caràcters no permesos.",
496
+ "upload.error.forged-file": "El format del fitxer no està permès. Només s'accepten PDF, PNG i JPEG.",
497
+ "upload.error.empty": "El fitxer està buit."
461
498
  }
@@ -593,5 +593,42 @@
593
593
  "user-portal.addresses.save": "Save",
594
594
  "user-portal.addresses.success-added": "Address added successfully.",
595
595
  "user-portal.addresses.error-required": "Street and city are required.",
596
- "user-portal.addresses.error-save": "Could not save the address."
596
+ "user-portal.addresses.error-save": "Could not save the address.",
597
+ "user-portal.documents.empty": "You have no uploaded documents.",
598
+ "user-portal.documents.upload-title": "Upload document",
599
+ "user-portal.documents.file": "File",
600
+ "user-portal.documents.type": "Document type",
601
+ "user-portal.documents.type-none": "Not specified",
602
+ "user-portal.documents.type-dni": "DNI",
603
+ "user-portal.documents.type-nif": "NIF",
604
+ "user-portal.documents.type-contract": "Contract",
605
+ "user-portal.documents.type-other": "Other",
606
+ "user-portal.documents.upload": "Upload",
607
+ "user-portal.documents.download": "Download",
608
+ "user-portal.documents.delete": "Delete",
609
+ "user-portal.documents.upload-success": "Document uploaded successfully.",
610
+ "user-portal.documents.upload-error": "The document could not be uploaded.",
611
+ "user-portal.documents.delete-success": "Document deleted successfully.",
612
+ "user-portal.documents.allowed-formats": "Allowed formats",
613
+ "user-portal.documents.loading": "Loading documents",
614
+ "user-portal.documents.load-error": "The documents could not be loaded.",
615
+ "user-portal.documents.delete-error": "The document could not be deleted.",
616
+ "user-portal.documents.delete-confirm": "Do you want to delete this document?",
617
+ "order.documents.title": "Order documents",
618
+ "order.documents.empty": "There are no documents attached to this order.",
619
+ "order.documents.file": "File",
620
+ "order.documents.type": "Type",
621
+ "order.documents.type-order-note": "Order note",
622
+ "order.documents.type-payment-receipt": "Payment receipt",
623
+ "order.documents.type-other": "Other",
624
+ "order.documents.upload": "Attach",
625
+ "order.documents.loading": "Loading order documents",
626
+ "order.documents.load-error": "The order documents could not be loaded.",
627
+ "order.documents.upload-error": "The document could not be attached.",
628
+ "order.documents.download": "Download document",
629
+ "upload.error.size": "The file exceeds the maximum allowed size (10 MB).",
630
+ "upload.error.mime-mismatch": "The declared file type does not match its actual content.",
631
+ "upload.error.malicious-name": "The file name contains invalid characters.",
632
+ "upload.error.forged-file": "The file format is not allowed. Only PDF, PNG and JPEG are accepted.",
633
+ "upload.error.empty": "The file is empty."
597
634
  }
@@ -669,5 +669,14 @@
669
669
  "upload.error.size": "El archivo supera el tamaño máximo permitido (10 MB).",
670
670
  "upload.error.mime-mismatch": "El tipo declarado del archivo no coincide con su contenido real.",
671
671
  "upload.error.malicious-name": "El nombre del archivo contiene caracteres no permitidos.",
672
- "upload.error.forged-file": "El formato del archivo no está permitido. Solo se aceptan PDF, PNG y JPEG."
672
+ "upload.error.forged-file": "El formato del archivo no está permitido. Solo se aceptan PDF, PNG y JPEG.",
673
+ "upload.error.empty": "El archivo está vacío.",
674
+ "user-portal.documents.loading": "Cargando documentos",
675
+ "user-portal.documents.load-error": "No se pudieron cargar los documentos.",
676
+ "user-portal.documents.delete-error": "No se pudo eliminar el documento.",
677
+ "user-portal.documents.delete-confirm": "¿Querés eliminar este documento?",
678
+ "order.documents.loading": "Cargando documentos del pedido",
679
+ "order.documents.load-error": "No se pudieron cargar los documentos del pedido.",
680
+ "order.documents.upload-error": "No se pudo adjuntar el documento.",
681
+ "order.documents.download": "Descargar documento"
673
682
  }
@@ -449,5 +449,42 @@
449
449
  "user-portal.addresses.cancel": "Annuler",
450
450
  "user-portal.addresses.save": "Enregistrer",
451
451
  "user-portal.addresses.success-saved": "Adresse enregistrée.",
452
- "user-portal.addresses.error-save": "Impossible d'enregistrer l'adresse."
452
+ "user-portal.addresses.error-save": "Impossible d'enregistrer l'adresse.",
453
+ "user-portal.documents.empty": "Vous n'avez aucun document envoyé.",
454
+ "user-portal.documents.upload-title": "Envoyer un document",
455
+ "user-portal.documents.file": "Fichier",
456
+ "user-portal.documents.type": "Type de document",
457
+ "user-portal.documents.type-none": "Non spécifié",
458
+ "user-portal.documents.type-dni": "DNI",
459
+ "user-portal.documents.type-nif": "NIF",
460
+ "user-portal.documents.type-contract": "Contrat",
461
+ "user-portal.documents.type-other": "Autre",
462
+ "user-portal.documents.upload": "Envoyer",
463
+ "user-portal.documents.download": "Télécharger",
464
+ "user-portal.documents.delete": "Supprimer",
465
+ "user-portal.documents.upload-success": "Document envoyé avec succès.",
466
+ "user-portal.documents.upload-error": "Impossible d'envoyer le document.",
467
+ "user-portal.documents.delete-success": "Document supprimé avec succès.",
468
+ "user-portal.documents.allowed-formats": "Formats autorisés",
469
+ "user-portal.documents.loading": "Chargement des documents",
470
+ "user-portal.documents.load-error": "Impossible de charger les documents.",
471
+ "user-portal.documents.delete-error": "Impossible de supprimer le document.",
472
+ "user-portal.documents.delete-confirm": "Voulez-vous supprimer ce document ?",
473
+ "order.documents.title": "Documents de la commande",
474
+ "order.documents.empty": "Aucun document n'est joint à cette commande.",
475
+ "order.documents.file": "Fichier",
476
+ "order.documents.type": "Type",
477
+ "order.documents.type-order-note": "Note de commande",
478
+ "order.documents.type-payment-receipt": "Justificatif de paiement",
479
+ "order.documents.type-other": "Autre",
480
+ "order.documents.upload": "Joindre",
481
+ "order.documents.loading": "Chargement des documents de la commande",
482
+ "order.documents.load-error": "Impossible de charger les documents de la commande.",
483
+ "order.documents.upload-error": "Impossible de joindre le document.",
484
+ "order.documents.download": "Télécharger le document",
485
+ "upload.error.size": "Le fichier dépasse la taille maximale autorisée (10 Mo).",
486
+ "upload.error.mime-mismatch": "Le type déclaré du fichier ne correspond pas à son contenu réel.",
487
+ "upload.error.malicious-name": "Le nom du fichier contient des caractères interdits.",
488
+ "upload.error.forged-file": "Le format du fichier n'est pas autorisé. Seuls les PDF, PNG et JPEG sont acceptés.",
489
+ "upload.error.empty": "Le fichier est vide."
453
490
  }
@@ -457,5 +457,42 @@
457
457
  "user-portal.addresses.cancel": "Cancelar",
458
458
  "user-portal.addresses.save": "Gardar",
459
459
  "user-portal.addresses.success-saved": "Enderezo gardado correctamente.",
460
- "user-portal.addresses.error-save": "Non se puido gardar o enderezo."
460
+ "user-portal.addresses.error-save": "Non se puido gardar o enderezo.",
461
+ "user-portal.documents.empty": "Non tes documentos subidos.",
462
+ "user-portal.documents.upload-title": "Subir documento",
463
+ "user-portal.documents.file": "Ficheiro",
464
+ "user-portal.documents.type": "Tipo de documento",
465
+ "user-portal.documents.type-none": "Sen especificar",
466
+ "user-portal.documents.type-dni": "DNI",
467
+ "user-portal.documents.type-nif": "NIF",
468
+ "user-portal.documents.type-contract": "Contrato",
469
+ "user-portal.documents.type-other": "Outro",
470
+ "user-portal.documents.upload": "Subir",
471
+ "user-portal.documents.download": "Descargar",
472
+ "user-portal.documents.delete": "Eliminar",
473
+ "user-portal.documents.upload-success": "Documento subido correctamente.",
474
+ "user-portal.documents.upload-error": "Non se puido subir o documento.",
475
+ "user-portal.documents.delete-success": "Documento eliminado correctamente.",
476
+ "user-portal.documents.allowed-formats": "Formatos permitidos",
477
+ "user-portal.documents.loading": "Cargando documentos",
478
+ "user-portal.documents.load-error": "Non se puideron cargar os documentos.",
479
+ "user-portal.documents.delete-error": "Non se puido eliminar o documento.",
480
+ "user-portal.documents.delete-confirm": "Queres eliminar este documento?",
481
+ "order.documents.title": "Documentos do pedido",
482
+ "order.documents.empty": "Non hai documentos adxuntos a este pedido.",
483
+ "order.documents.file": "Ficheiro",
484
+ "order.documents.type": "Tipo",
485
+ "order.documents.type-order-note": "Nota do pedido",
486
+ "order.documents.type-payment-receipt": "Xustificante de pagamento",
487
+ "order.documents.type-other": "Outro",
488
+ "order.documents.upload": "Adxuntar",
489
+ "order.documents.loading": "Cargando documentos do pedido",
490
+ "order.documents.load-error": "Non se puideron cargar os documentos do pedido.",
491
+ "order.documents.upload-error": "Non se puido adxuntar o documento.",
492
+ "order.documents.download": "Descargar documento",
493
+ "upload.error.size": "O ficheiro supera o tamaño máximo permitido (10 MB).",
494
+ "upload.error.mime-mismatch": "O tipo declarado do ficheiro non coincide co seu contido real.",
495
+ "upload.error.malicious-name": "O nome do ficheiro contén caracteres non permitidos.",
496
+ "upload.error.forged-file": "O formato do ficheiro non está permitido. Só se aceptan PDF, PNG e JPEG.",
497
+ "upload.error.empty": "O ficheiro está baleiro."
461
498
  }
@@ -457,5 +457,42 @@
457
457
  "user-portal.addresses.cancel": "Cancelar",
458
458
  "user-portal.addresses.save": "Salvar",
459
459
  "user-portal.addresses.success-saved": "Endereço salvo com sucesso.",
460
- "user-portal.addresses.error-save": "Não foi possível salvar o endereço."
460
+ "user-portal.addresses.error-save": "Não foi possível salvar o endereço.",
461
+ "user-portal.documents.empty": "Você não tem documentos enviados.",
462
+ "user-portal.documents.upload-title": "Enviar documento",
463
+ "user-portal.documents.file": "Arquivo",
464
+ "user-portal.documents.type": "Tipo de documento",
465
+ "user-portal.documents.type-none": "Não especificado",
466
+ "user-portal.documents.type-dni": "DNI",
467
+ "user-portal.documents.type-nif": "NIF",
468
+ "user-portal.documents.type-contract": "Contrato",
469
+ "user-portal.documents.type-other": "Outro",
470
+ "user-portal.documents.upload": "Enviar",
471
+ "user-portal.documents.download": "Baixar",
472
+ "user-portal.documents.delete": "Excluir",
473
+ "user-portal.documents.upload-success": "Documento enviado com sucesso.",
474
+ "user-portal.documents.upload-error": "Não foi possível enviar o documento.",
475
+ "user-portal.documents.delete-success": "Documento excluído com sucesso.",
476
+ "user-portal.documents.allowed-formats": "Formatos permitidos",
477
+ "user-portal.documents.loading": "Carregando documentos",
478
+ "user-portal.documents.load-error": "Não foi possível carregar os documentos.",
479
+ "user-portal.documents.delete-error": "Não foi possível excluir o documento.",
480
+ "user-portal.documents.delete-confirm": "Deseja excluir este documento?",
481
+ "order.documents.title": "Documentos do pedido",
482
+ "order.documents.empty": "Não há documentos anexados a este pedido.",
483
+ "order.documents.file": "Arquivo",
484
+ "order.documents.type": "Tipo",
485
+ "order.documents.type-order-note": "Nota do pedido",
486
+ "order.documents.type-payment-receipt": "Comprovante de pagamento",
487
+ "order.documents.type-other": "Outro",
488
+ "order.documents.upload": "Anexar",
489
+ "order.documents.loading": "Carregando documentos do pedido",
490
+ "order.documents.load-error": "Não foi possível carregar os documentos do pedido.",
491
+ "order.documents.upload-error": "Não foi possível anexar o documento.",
492
+ "order.documents.download": "Baixar documento",
493
+ "upload.error.size": "O arquivo excede o tamanho máximo permitido (10 MB).",
494
+ "upload.error.mime-mismatch": "O tipo declarado do arquivo não corresponde ao seu conteúdo real.",
495
+ "upload.error.malicious-name": "O nome do arquivo contém caracteres não permitidos.",
496
+ "upload.error.forged-file": "O formato do arquivo não é permitido. Somente PDF, PNG e JPEG são aceitos.",
497
+ "upload.error.empty": "O arquivo está vazio."
461
498
  }
@@ -4,6 +4,7 @@ import { isPlatformBrowser, DOCUMENT } from '@angular/common';
4
4
  import { ENVIRONMENT_TOKEN } from '../providers';
5
5
  import { BehaviorSubject } from 'rxjs';
6
6
  import { WishlistVisibilityService } from '../ec-services/wishlist-visibility.service';
7
+ import { CapabilitiesService } from '../ec-services/capabilities.service';
7
8
  import * as i0 from "@angular/core";
8
9
  /**
9
10
  * Servicio que provee las constantes necesarias que se utilizan por toda la aplicación.
@@ -27,6 +28,7 @@ export class CoreConstantsService {
27
28
  */
28
29
  _document = inject(DOCUMENT);
29
30
  _wishlistVisibility = inject(WishlistVisibilityService);
31
+ _capabilities = inject(CapabilitiesService);
30
32
  /**
31
33
  * Contiene los datos provisto por el frontend en el archivo environment.ts
32
34
  */
@@ -336,18 +338,14 @@ export class CoreConstantsService {
336
338
  productsWithUniqueVariant = false;
337
339
  setProductWithUniqueVariant(value) { this.productsWithUniqueVariant = value; }
338
340
  getProductWithUniqueVariant() { return this.productsWithUniqueVariant; }
339
- // Habilita el flujo de agregado masivo en collection/product.
340
- bulkAddEnabled = false;
341
341
  // Habilita rutas de producto por slug de forma opt-in por frontend/canal.
342
342
  useProductSlugRoute = false;
343
- // Habilita la preimpresión de carrito/presupuesto de forma opt-in por frontend.
344
- cartPreprintEnabled = false;
345
- setBulkAddEnabled(value) { this.bulkAddEnabled = value; }
346
- getBulkAddEnabled() { return this.bulkAddEnabled; }
343
+ setBulkAddEnabled(value) { this._capabilities.setBulkAdd(value); }
344
+ getBulkAddEnabled() { return this._capabilities.bulkAdd(); }
347
345
  setUseProductSlugRoute(value) { this.useProductSlugRoute = !!value; }
348
346
  getUseProductSlugRoute() { return this.useProductSlugRoute; }
349
- setCartPreprintEnabled(value) { this.cartPreprintEnabled = !!value; }
350
- getCartPreprintEnabled() { return this.cartPreprintEnabled; }
347
+ setCartPreprintEnabled(value) { this._capabilities.setCartPreprint(value); }
348
+ getCartPreprintEnabled() { return this._capabilities.cartPreprint(); }
351
349
  /**
352
350
  * @description esta variable se utiliza para configurar los parametros cuando se desea mostrar
353
351
  * variantes el listado de productos.
@@ -411,4 +409,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
411
409
  providedIn: 'root'
412
410
  }]
413
411
  }], ctorParameters: () => [] });
414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdGFudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9jb25zdGFudHMvY29yZS5jb25zdGFudHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDOztBQUN2Rjs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUV6QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFtQixRQUFRLENBQUMsQ0FBQztJQUN2RSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9EOztPQUVHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ2xEOztPQUVHO0lBQ08sVUFBVSxHQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQzs7T0FFRztJQUNLLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDaEU7O09BRUc7SUFDSyxXQUFXLEdBQWdCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFB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amVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuL2FwaS5jb25zdGFudHMuc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3VycmVuY3lDb25maWcsIGN1cnJlbmN5VHlwZSwgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCwgRW52aXJvbm1lbnQsIENoZWNrb3V0Vmlld1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVOVklST05NRU5UX1RPS0VOIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3dpc2hsaXN0LXZpc2liaWxpdHkuc2VydmljZSc7XG4vKipcbiAqIFNlcnZpY2lvIHF1ZSBwcm92ZWUgbGFzIGNvbnN0YW50ZXMgbmVjZXNhcmlhcyBxdWUgc2UgdXRpbGl6YW4gcG9yIHRvZGEgbGEgYXBsaWNhY2nDs24uXG4gKiBAZXhwb3J0XG4gKiBAY2xhc3MgQ29yZUNvbnN0YW50c1NlcnZpY2VcbiAqL1xuQEluamVjdGFibGUoe1xuXHRwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQ29yZUNvbnN0YW50c1NlcnZpY2Uge1xuXG5cdHB1YmxpYyBzZWFyY2hWYWx1ZTogc3RyaW5nID0gJyc7XG5cdHByaXZhdGUgY2hlY2tvdXRWaWV3U3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hlY2tvdXRWaWV3VHlwZT4oJ2xlZ2FjeScpO1xuXHRwdWJsaWMgY2hlY2tvdXRWaWV3JCA9IHRoaXMuY2hlY2tvdXRWaWV3U3ViamVjdC5hc09ic2VydmFibGUoKTtcblx0LyoqXG5cdCAqIFNlcnZpY2lvIHF1ZSBjb250aWVuZSBsYXMgY29uc3RhbnRlcyB1c2FkYXMgcGFyYSBsYSBBUElcblx0ICovXG5cdHByaXZhdGUgYXBpQ29uc3RhbnRzID0gaW5qZWN0KEFwaUNvbnN0YW50c1NlcnZpY2UpXG5cdC8qKlxuXHQgKiBQcm92ZWUgZWwgSUQgZGUgbGEgcGxhdGFmb3JtYSBlbiBkb25kZSBzZSBlc3RhIGVqZWN1dGFuZG8gZWwgY29kaWdvLCBlc3RvIHNpcnZlIHBhcmEgcG9kZXIgZGlmZXJlbmNpYXIgc2kgZXMgZGUgdW4gc2Vydmlkb3IgbyB1biBuYXZlZ2Fkb3Igd2ViLlxuXHQgKi9cblx0cHJvdGVjdGVkIHBsYXRmb3JtSWQ6IGFueSA9IGluamVjdChQTEFURk9STV9JRClcblx0LyoqXG5cdCAqIERvY3VtZW50IHRva2VuIHBhcmEgYWNjZXNvIFNTUi1jb21wYXRpYmxlIGFsIGRvY3VtZW50b1xuXHQgKi9cblx0cHJpdmF0ZSBfZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xuXHRwcml2YXRlIF93aXNobGlzdFZpc2liaWxpdHkgPSBpbmplY3QoV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSk7XG5cdC8qKlxuXHQgKiBDb250aWVuZSBsb3MgZGF0b3MgcHJvdmlzdG8gcG9yIGVsIGZyb250ZW5kIGVuIGVsIGFyY2hpdm8gZW52aXJvbm1lbnQudHNcblx0ICovXG5cdHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gaW5qZWN0KEVOVklST05NRU5UX1RPS0VOKVxuXHQvKipcblx0ICogR3VhcmRhIGxhIHZhcmlhYmxlIHdpbmRvdyBkZWwgd2ViIGJyb3dzZXIuXG5cdCAqL1xuXHRwcml2YXRlIHdpbmRvdz86V2luZG93O1xuXG5cdC8qKlxuXHQgKiBUaXBvIGRlIHJ1dGEgYWN0dWFsIChlajogJ2NhdGVnb3JpZXMnLCAnYXR0cmlidXRlcycsIGV0YykuXG5cdCAqIExvIHVzYW1vcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSBzZXBhIHF1w6kgZmlsdHJvIGVzcGVyYXIuXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVudFJvdXRlVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFxuXHQvKipcblx0ICogR2V0dGVyIHNlZ3VybyBwYXJhIGRvY3VtZW50IHF1ZSB2ZXJpZmljYSBsYSBwbGF0YWZvcm1hXG5cdCAqL1xuXHRwcml2YXRlIGdldCBkb2N1bWVudCgpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgPyB0aGlzLl9kb2N1bWVudCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aGlzLndpbmRvdyA9IHdpbmRvdztcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhdGggdXNhZG8gZW4gbGFzIGNvbGVjY2lvbmVzIGRlIHByb2R1Y3Rvcy5cblx0ICovXG5cdHB1YmxpYyBQUk9EVUNUX0xJU1RfUk9VVEU6IHN0cmluZyA9ICdjb2xsZWN0aW9uLyc7XG5cdC8qKlxuXHQgKiBQYXRoIHVzYWRvIHBhcmEgYWNjZWRlciBhIGxhcyBzZWNjaW9uZXMuXG5cdCAqL1xuXHRwdWJsaWMgU0VDVElPTlNfUk9VVEU6IHN0cmluZyA9ICdzZWN0aW9ucy8nO1xuXHQvKipcblx0ICogUGF0aCBxdWUgYWxvamEgbGEgY2FycGV0YSBkZSBsb3MgYXNzZXRzLlxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IEFTU0VUU19VUkw6IHN0cmluZyA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkb25kZSBzZSBndWFyZGEgbGFzIGltYWdlbmVzLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBtZWRpYVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZG9uZGUgc2UgZ3VhcmRhIGxhcyBpbWFnZW5lcy5cblx0ICogQHBhcmFtIHBvc3RNZWRpYSBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS9pbWFnZS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZGVsIHNpdGlvLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyB1cmwgPSAoKSA9PiB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIHJlbW92ZSBsYXN0IHNsYXNoXHRcblxuXHQvKipcblx0ICogVVJMIGRlbCBzaXRpbyBmcm9udGVuZCAtIENvbXBhdGlibGUgY29uIEFuZ3VsYXIgU1NSXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IEZST05URU5EX1VSTCgpOiBzdHJpbmcge1xuXHRcdC8vIFZlcmlmaWNhciBzaSBlc3RhbW9zIGVuIGVsIG5hdmVnYWRvclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG5cdFx0XHQvLyBQcmltZXJvIGludGVudGEgbGVlciBkZSB3aW5kb3cuX19lbnYgKGNvbmZpZ3VyYWRvIHBvciBEb2NrZXIvQ0kpXG5cdFx0XHRjb25zdCB3aW5kb3dFbnYgPSAodGhpcy53aW5kb3cgYXMgYW55KT8uX19lbnY7XG5cdFx0XHRpZiAod2luZG93RW52Py5mcm9udGVuZFVybCkge1xuXHRcdFx0XHQvLyBMb2cgcGFyYSBkZWJ1Z2dpbmcgZW4gZGVzYXJyb2xsb1xuXHRcdFx0XHRpZiAoIXdpbmRvd0Vudi5mcm9udGVuZFVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ1tGUk9OVEVORF9VUkxdIEludmFsaWQgZnJvbnRlbmRVcmwgZm9ybWF0OicsIHdpbmRvd0Vudi5mcm9udGVuZFVybCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHdpbmRvd0Vudi5mcm9udGVuZFVybDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gU2kgbm8gaGF5IGNvbmZpZ3VyYWNpw7NuIGVzcGVjw61maWNhLCBjb25zdHJ1aXIgZGVzZGUgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRpZiAodGhpcy53aW5kb3c/LmxvY2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3RoaXMud2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0XHRcdC8vIFZlcmlmaWNhciBxdWUgbm8gc2VhIGxvY2FsaG9zdCBvIDEyNy4wLjAuMSBlbiBwcm9kdWNjacOzblxuXHRcdFx0XHRpZiAodXJsLmluY2x1ZGVzKCcxMjcuMC4wLjEnKSB8fCB1cmwuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBVc2luZyBsb2NhbGhvc3QgVVJMIGluIHByb2R1Y3Rpb24sIGNvbnNpZGVyIHNldHRpbmcgd2luZG93Ll9fZW52LmZyb250ZW5kVXJsJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gUGFyYSBTU1IsIGludGVudGFyIGNvbnN0cnVpciBkZXNkZSBlbCBkb2N1bWVudCBzaSBlc3TDoSBkaXNwb25pYmxlXG5cdFx0aWYgKHRoaXMuZG9jdW1lbnQ/LmxvY2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYCR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbH0vLyR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEludGVudGFyIG9idGVuZXIgZGVzZGUgZW52aXJvbm1lbnRcblx0XHRpZiAodGhpcy5lbnZpcm9ubWVudC5mcm9udGVuZFVybCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuZnJvbnRlbmRVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIMOabHRpbW8gZmFsbGJhY2sgLSB1c2FyIGxhIFVSTCBkZWwgQVBJIHNpIGVzdMOhIGNvbmZpZ3VyYWRhIHkgZXMgYWJzb2x1dGFcblx0XHRjb25zdCBhcGlVcmwgPSB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMO1xuXHRcdGlmIChhcGlVcmwgJiYgKGFwaVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXBpVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGFwaVVybCk7XG5cdFx0XHRcdHJldHVybiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fWA7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignW0ZST05URU5EX1VSTF0gQ291bGQgbm90IHBhcnNlIEFQSSBVUkwgYXMgZmFsbGJhY2s6JywgYXBpVXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gRmFsbGJhY2sgZmluYWwgLSByZXRvcm5hciBVUkwgdmFjw61hXG5cdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBObyB2YWxpZCBmcm9udGVuZCBVUkwgZm91bmQsIHRoaXMgbWF5IGNhdXNlIGlzc3VlcyB3aXRoIG1ldGEgdGFncycpO1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBjb21wbGV0YSBkZWwgZnJvbnRlbmQgY29uIHVuYSBydXRhIG9wY2lvbmFsXG5cdCAqIEBwYXJhbSBwYXRoIC0gUnV0YSBvcGNpb25hbCBwYXJhIGFncmVnYXIgYSBsYSBVUkwgYmFzZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgY29tcGxldGEgZGVsIGZyb250ZW5kXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RnJvbnRlbmRVcmwgPSAocGF0aD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdFx0Y29uc3QgYmFzZVVybCA9IHRoaXMuRlJPTlRFTkRfVVJMO1xuXHRcdGlmICghcGF0aCkge1xuXHRcdFx0cmV0dXJuIGJhc2VVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEFzZWd1cmFyIHF1ZSBsYSBydXRhIGNvbWllbmNlIGNvbiAnLycgeSBubyB0ZW5nYSBkb2JsZSBzbGFzaFxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWA7XG5cdFx0Y29uc3QgY2xlYW5CYXNlVXJsID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkJhc2VVcmx9JHtjbGVhblBhdGh9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBhYnNvbHV0YSBkZSB1bmEgaW1hZ2VuIHBhcmEgbWV0YSB0YWdzIChjb21wYXRpYmxlIGNvbiBTU1IpXG5cdCAqIEBwYXJhbSBwb3N0TWVkaWEgLSBSdXRhIGRlIGxhIGltYWdlblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgYWJzb2x1dGEgZGUgbGEgaW1hZ2VuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QWJzb2x1dGVJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRcdC8vIFNpIGxhIFVSTCB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYSB0YWwgY29tbyBlc3TDoVxuXHRcdGlmIChwb3N0TWVkaWEgJiYgKHBvc3RNZWRpYS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcG9zdE1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHRyZXR1cm4gcG9zdE1lZGlhO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVpciBsYSBVUkwgZGUgbGEgaW1hZ2VuIHVzYW5kbyBsYSBVUkwgZGVsIEFQSVxuXHRcdGNvbnN0IGltYWdlVXJsID0gdGhpcy5tZWRpYUltYWdlVXJsKHBvc3RNZWRpYSk7XG5cdFx0XG5cdFx0Ly8gU2kgbGEgVVJMIGRlIGxhIGltYWdlbiB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYVxuXHRcdGlmIChpbWFnZVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgaW1hZ2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBlcyB1bmEgVVJMIHJlbGF0aXZhLCBjb252ZXJ0aXJsYSBhIGFic29sdXRhIHVzYW5kbyBsYSBVUkwgYmFzZSBkZWwgQVBJXG5cdFx0Y29uc3QgYXBpQmFzZVVybCA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdFx0aWYgKGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0Ly8gQVBJX1VSTCB5YSBlcyBhYnNvbHV0YVxuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBBUElfVVJMIGVzIHJlbGF0aXZhLCB1c2FyIGxhIFVSTCBkZWwgZnJvbnRlbmQgY29tbyBiYXNlXG5cdFx0Y29uc3QgZnJvbnRlbmRVcmwgPSB0aGlzLkZST05URU5EX1VSTDtcblx0XHRpZiAoIWZyb250ZW5kVXJsKSB7XG5cdFx0XHRyZXR1cm4gaW1hZ2VVcmw7IC8vIEZhbGxiYWNrIHNpIG5vIHBvZGVtb3MgZGV0ZXJtaW5hciBsYSBVUkwgZGVsIGZyb250ZW5kXG5cdFx0fVxuXHRcdFxuXHRcdC8vIENvbnN0cnVpciBVUkwgYWJzb2x1dGFcblx0XHRjb25zdCBjbGVhbkFwaVVybCA9IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnLycpID8gYXBpQmFzZVVybC5zdWJzdHJpbmcoMSkgOiBhcGlCYXNlVXJsO1xuXHRcdGNvbnN0IGNsZWFuRnJvbnRlbmRVcmwgPSBmcm9udGVuZFVybC5lbmRzV2l0aCgnLycpID8gZnJvbnRlbmRVcmwuc2xpY2UoMCwgLTEpIDogZnJvbnRlbmRVcmw7XG5cdFx0Y29uc3QgY2xlYW5JbWFnZVVybCA9IGltYWdlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGltYWdlVXJsLnN1YnN0cmluZygxKSA6IGltYWdlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkZyb250ZW5kVXJsfS8ke2NsZWFuQXBpVXJsfSR7Y2xlYW5JbWFnZVVybH1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN0cnV5ZSBtZXRhIGluZm9ybWFjacOzbiBwYXJhIHVuYSB3aXNobGlzdCBjb21wYXJ0aWRhLlxuXHQgKiBTZSB1c2EgcGFyYSBPcGVuR3JhcGgvVHdpdHRlciBjYXJkcyBlbiBTU1IgeSBicm93c2VyLlxuXHQgKi9cblx0cHVibGljIGdldFNoYXJlZFdpc2hsaXN0TWV0YSA9IChcblx0XHR3aXNobGlzdDogYW55LFxuXHRcdHRva2VuOiBzdHJpbmcsXG5cdFx0ZmFsbGJhY2tJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWcvZmF2L2Zhdmljb24uaWNvJ1xuXHQpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHVybDogc3RyaW5nOyBpbWFnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHR3aXR0ZXJDYXJkOiBzdHJpbmcgfSA9PiB7XG5cdFx0Y29uc3QgbGlzdE5hbWUgPSAod2lzaGxpc3Q/Lm5hbWUgfHwgJ1NoYXJlZCB3aXNobGlzdCcpLnRvU3RyaW5nKCkudHJpbSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheSh3aXNobGlzdD8uaXRlbXMpID8gd2lzaGxpc3QuaXRlbXMgOiBbXTtcblx0XHRjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG5cdFx0Y29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG5cdFx0Y29uc3QgZmlyc3RQcm9kdWN0TmFtZSA9IGZpcnN0SXRlbT8ucHJvZHVjdF9uYW1lID8gZmlyc3RJdGVtLnByb2R1Y3RfbmFtZS50b1N0cmluZygpLnRyaW0oKSA6ICcnO1xuXHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gaXRlbUNvdW50XG5cdFx0XHQ/IGAke2xpc3ROYW1lfSAoJHtpdGVtQ291bnR9KSR7Zmlyc3RQcm9kdWN0TmFtZSA/IGAgLSAke2ZpcnN0UHJvZHVjdE5hbWV9YCA6ICcnfWBcblx0XHRcdDogYCR7bGlzdE5hbWV9IC0gc2hhcmVkIHdpc2hsaXN0YDtcblxuXHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoYC93aXNobGlzdC9zaGFyZWQvJHt0b2tlbn1gKTtcblx0XHRjb25zdCBpbWFnZSA9IGZpcnN0SXRlbT8ucGljdHVyZV9kZWZhdWx0XG5cdFx0XHQ/IHRoaXMuZ2V0QWJzb2x1dGVJbWFnZVVybChmaXJzdEl0ZW0ucGljdHVyZV9kZWZhdWx0KVxuXHRcdFx0OiB0aGlzLmdldEZyb250ZW5kVXJsKGZhbGxiYWNrSW1hZ2VQYXRoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogbGlzdE5hbWUsXG5cdFx0XHRkZXNjcmlwdGlvbixcblx0XHRcdHVybCxcblx0XHRcdGltYWdlLFxuXHRcdFx0dHlwZTogJ3dlYnNpdGUnLFxuXHRcdFx0dHdpdHRlckNhcmQ6ICdzdW1tYXJ5X2xhcmdlX2ltYWdlJ1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogTWV0YSBpbmZvcm1hY2nDs24gZmFsbGJhY2sgcGFyYSB3aXNobGlzdCBjb21wYXJ0aWRhIGN1YW5kbyBubyBleGlzdGUgbyBubyBjYXJnYS5cblx0ICovXG5cdHB1YmxpYyBnZXRTaGFyZWRXaXNobGlzdEZhbGxiYWNrTWV0YSA9ICgpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9ID0+ICh7XG5cdFx0dGl0bGU6ICdTaGFyZWQgd2lzaGxpc3QnLFxuXHRcdGRlc2NyaXB0aW9uOiAnVmlldyB0aGlzIHNoYXJlZCB3aXNobGlzdC4nLFxuXHRcdHR5cGU6ICd3ZWJzaXRlJ1xuXHR9KVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkZSBsYXMgaW1hZ2VuZXMgZGUgbG9zIGJhbm5lcnNcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLkFTU0VUU19VUkwgKyAodGhpcy5BU1NFVFNfVVJMID09IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkwgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xuXHRcblx0bWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcblx0XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGB0cnVlYCBzaSBsYSB2aXN0YSBlcyBtb2JpbGUsIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIG1vYmlsZVNjcmVlbiA9ICgpOiBib29sZWFuID0+IHRoaXMud2luZG93ICYmIHRoaXMud2luZG93Py5pbm5lcldpZHRoIDwgNzUwIHx8IGZhbHNlO1xuXHQvKipcblx0ICogQ29udGllbmUgbG9zIHZhbG9yZXMgcGFyYSBsYSBtb25lZGEgYWN0dWFsXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xuXHRcdGNvZGU6ICdBUkcnLFxuXHRcdHN5bWJvbDogJyQnLFxuXHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2Vcblx0ICovXG5cdHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0VVUicsXG5cdFx0XHRzeW1ib2w6ICfigqwnLFxuXHRcdFx0cG9zaXRpb246ICdSaWdodCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2VcblxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0FSRycsXG5cdFx0XHRzeW1ib2w6ICckJyxcblx0XHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2Vcblx0XHR9LFxuXHRcdHtcblx0XHRcdGNvZGU6ICdBUlMnLFxuXHRcdFx0c3ltYm9sOiAnJCcsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnVVNEJyxcblx0XHRcdHN5bWJvbDogJyQnLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BZRycsXG5cdFx0XHRzeW1ib2w6ICdHcy4nLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BFTicsXG5cdFx0XHRzeW1ib2w6ICdTLycsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnU0VLJyxcblx0XHRcdHN5bWJvbDogJ1NFSycsXG5cdFx0XHRwb3NpdGlvbjogJ1JpZ2h0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiB0cnVlXG5cdFx0fSxcblx0XVxuXHQvKipcblx0ICogQ2FtYmlhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIGxhIG1vbmVkYS5cblx0ICogQHBhcmFtIGN1cnJlbmN5VHlwZUNvbmZpZyBBcnJlZ2xvIGNvbiBsYXMgZGlzdGludGFzIG1vbmVkYXMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3lUeXBlQ29uZmlnKGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSkge1xuXHRcdHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cblx0ICogU2kgZWwgdGlwbyBlcyBDVVNUT00gc2UgdG9tYW4gbG9zIHZhbG9yZXMgZGVsIHNlZ3VuZG8gcGFyYW1ldHJvIGRvbmRlIHNlIHB1ZWRlIGRlZmluaXIgbGEgc2ltYm9sb2fDrWEgeSBwb3Nlc2nDs24gcXVlIHNlIHF1aWVyYS5cblx0ICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcblx0ICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxuXHQgKiBAcmV0dXJucyBzZSByZXRvcm5hIGxhIGNvbmZpZ3VyYWNpw7NuIHF1ZSBzZSBzZXRlbyBhIGxhIHByb3BpZWRhZCBjdXJyZW5jeSBkZWwgc2VydmljaW8uXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3koY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpOiBDdXJyZW5jeUNvbmZpZyB7XG5cdFx0dGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoKGN0OiBDdXJyZW5jeUNvbmZpZykgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcblx0XHRjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXG5cdFx0cmV0dXJuIHRoaXMuY3VycmVuY3k7XG5cdH07XG5cblxuXHRwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyhjaGFubmVsQ29uZmlnOiBhbnkpIHtcblx0XHR0aGlzLl93aXNobGlzdFZpc2liaWxpdHkuc2V0U2hvd1dpc2hsaXN0KFxuXHRcdFx0dHlwZW9mIGNoYW5uZWxDb25maWc/Lndpc2hsaXN0RW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHRcdD8gY2hhbm5lbENvbmZpZy53aXNobGlzdEVuYWJsZWRcblx0XHRcdFx0OiB0eXBlb2YgY2hhbm5lbENvbmZpZz8uc2hvd1dpc2hsaXN0ID09PSAnYm9vbGVhbidcblx0XHRcdFx0XHQ/IGNoYW5uZWxDb25maWcuc2hvd1dpc2hsaXN0XG5cdFx0XHRcdFx0OiBmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldENoYW5uZWwoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCAoY2hhbm5lbENvbmZpZy5sb2NhbGVzICYmIGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldExvY2FsZShjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXHRcdFx0dGhpcy5zZXRDdXJyZW5jeShjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXG5cdFx0aWYgKGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3ICE9IG51bGwpIHtcblx0XHRcdHRoaXMuc2V0Q2hlY2tvdXRWaWV3KGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3IGFzIENoZWNrb3V0Vmlld1R5cGUpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgY2hhbm5lbENvbmZpZy51c2VQcm9kdWN0U2x1Z1JvdXRlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHRoaXMuc2V0VXNlUHJvZHVjdFNsdWdSb3V0ZShjaGFubmVsQ29uZmlnLnVzZVByb2R1Y3RTbHVnUm91dGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGFubmVsQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cblx0KiBTZSB1c2FuIGxvcyBjb2RpZ28gZGUgbG9zIGZpbHRyb3MgcGFyYSBpbmRpY2FyIGN1YWxlcyBzZSBkZWJlbiBtb3N0cmFyLlxuXHQqL1xuXHRwcml2YXRlIHNvcnRGaWx0ZXJzOiBzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZmlsdGVyc0NvZGUgYXJyZWdsbyBkZSBzdHJpbmdzIGNvbiBsb3MgY29kaWdvcyBkZSBsb3MgZmlsdHJvcy5cblx0ICogU2kgc2UgbGUgcGFzYSBlbCBwYXJhbWV0cm8gKiphbGwqKiBlc3RlIG1vc3RyYXJhIHRvZG9zLlxuXHQgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcblx0ICogQHJldHVybnNcblx0ICovXG5cdHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcblxuXHRnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XG5cblx0Ly8gQUJPVVQgUFJPRFVDVFMgXG5cdHByaXZhdGUgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xuXHRzZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gdmFsdWU7IH1cblx0Z2V0UHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH1cblxuXHQvLyBIYWJpbGl0YSBlbCBmbHVqbyBkZSBhZ3JlZ2FkbyBtYXNpdm8gZW4gY29sbGVjdGlvbi9wcm9kdWN0LlxuXHRwcml2YXRlIGJ1bGtBZGRFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cdC8vIEhhYmlsaXRhIHJ1dGFzIGRlIHByb2R1Y3RvIHBvciBzbHVnIGRlIGZvcm1hIG9wdC1pbiBwb3IgZnJvbnRlbmQvY2FuYWwuXG5cdHByaXZhdGUgdXNlUHJvZHVjdFNsdWdSb3V0ZTogYm9vbGVhbiA9IGZhbHNlO1xuXHQvLyBIYWJpbGl0YSBsYSBwcmVpbXByZXNpw7NuIGRlIGNhcnJpdG8vcHJlc3VwdWVzdG8gZGUgZm9ybWEgb3B0LWluIHBvciBmcm9udGVuZC5cblx0cHJpdmF0ZSBjYXJ0UHJlcHJpbnRFbmFibGVkOiBib29sZWFuID0gZmFsc2U7XG5cdHNldEJ1bGtBZGRFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuYnVsa0FkZEVuYWJsZWQgPSB2YWx1ZTsgfVxuXHRnZXRCdWxrQWRkRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuYnVsa0FkZEVuYWJsZWQgfVxuXG5cdHNldFVzZVByb2R1Y3RTbHVnUm91dGUodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy51c2VQcm9kdWN0U2x1Z1JvdXRlID0gISF2YWx1ZTsgfVxuXHRnZXRVc2VQcm9kdWN0U2x1Z1JvdXRlKCkgeyByZXR1cm4gdGhpcy51c2VQcm9kdWN0U2x1Z1JvdXRlOyB9XG5cblx0c2V0Q2FydFByZXByaW50RW5hYmxlZCh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLmNhcnRQcmVwcmludEVuYWJsZWQgPSAhIXZhbHVlOyB9XG5cdGdldENhcnRQcmVwcmludEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLmNhcnRQcmVwcmludEVuYWJsZWQ7IH1cblxuXHQvKipcblx0KiBAZGVzY3JpcHRpb24gZXN0YSB2YXJpYWJsZSBzZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgcGFyYW1ldHJvcyBjdWFuZG8gc2UgZGVzZWEgbW9zdHJhclxuXHQqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cblx0KiBAcGFyYW0ge3N0cmluZ310eXBlIHRpcG8gZGUgb3B0aW9uc1xuXHQqIEBwYXJhbSB7c3RyaW5nfWNvZGUgY29kaWdvIGRlIG9wdGlvbnNcblx0KiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcblx0KiBAcGFyYW0ge2Jvb2xlYW59Y2hlY2tJZlN0b2NrIGB0cnVlYCBzZSByZWFsaXphIHVuIGNoZXF1ZW8gZGUgc2kgbGEgdmFyaWFudGUgdGllbmUgc3RvY2sgcGFyYSBtb3N0cmFybGFcblx0KiBAZXhhbXBsZSAgYGBgamF2YXNjcmlwdFxuXHQqIHtcblx0ICAgdHlwZTogJ2NvbG9yJyxcblx0ICAgY29kZTogJ2NvbG9yJyxcblx0ICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXG5cdCAgIGNoZWNrSWZTdG9jazp0cnVlXG5cdCAgIH0gYGBgXG5cdCovXG5cdHByaXZhdGUgcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHtcblx0XHR0eXBlOiAnY29sb3InLFxuXHRcdGNvZGU6ICdjb2xvcicsXG5cdFx0ZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSxcblx0XHRjaGVja0lmU3RvY2s6IHRydWVcblx0fVxuXG5cdHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcblx0XHR0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG5cdFx0XHQuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXG5cdFx0XHQuLi52YWx1ZVxuXHRcdH1cblx0fVxuXG5cdGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcblx0XG5cdHB1YmxpYyBnZXRDaGFubmVsKCl7XG5cdFx0cmV0dXJuIHRoaXMuYXBpQ29uc3RhbnRzLkNIQU5ORUw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybV9zZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRzZXRDdXJyZW50Um91dGVUeXBlKHR5cGU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmN1cnJlbnRSb3V0ZVR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0Q3VycmVudFJvdXRlVHlwZSgpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50Um91dGVUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGllbmUgbGEgdmlzdGEgZGUgY2hlY2tvdXQgY29uZmlndXJhZGEgKGxlZ2FjeSBvIHNpbmdsZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hlY2tvdXRWaWV3KCk6IENoZWNrb3V0Vmlld1R5cGUge1xuXHRcdHJldHVybiB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2FtYmlhIGxhIHZpc3RhIGRlIGNoZWNrb3V0IChzaW4gcGVyc2lzdGVuY2lhIGVuIHN0b3JhZ2UpLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRDaGVja291dFZpZXcodmlldzogQ2hlY2tvdXRWaWV3VHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNoZWNrb3V0Vmlldyh2aWV3KTtcblx0XHR0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QubmV4dChub3JtYWxpemVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm9ybWFsaXplQ2hlY2tvdXRWaWV3KHZpZXc6IHN0cmluZyB8IENoZWNrb3V0Vmlld1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkKTogQ2hlY2tvdXRWaWV3VHlwZSB7XG5cdFx0cmV0dXJuIHZpZXcgPT09ICdzaW5nbGUnID8gJ3NpbmdsZScgOiAnbGVnYWN5Jztcblx0fVxufVxuIl19
412
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29yZS5jb25zdGFudHMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLWVhc3ljb21tZXJjZS12MTgvc3JjL2xpYi9jb25zdGFudHMvY29yZS5jb25zdGFudHMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDaEUsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRTlELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUNqRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLDRDQUE0QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDOztBQUMxRTs7OztHQUlHO0FBSUgsTUFBTSxPQUFPLG9CQUFvQjtJQUV6QixXQUFXLEdBQVcsRUFBRSxDQUFDO0lBQ3hCLG1CQUFtQixHQUFHLElBQUksZUFBZSxDQUFtQixRQUFRLENBQUMsQ0FBQztJQUN2RSxhQUFhLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFlBQVksRUFBRSxDQUFDO0lBQy9EOztPQUVHO0lBQ0ssWUFBWSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQ2xEOztPQUVHO0lBQ08sVUFBVSxHQUFRLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUMvQzs7T0FFRztJQUNLLFNBQVMsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDN0IsbUJBQW1CLEdBQUcsTUFBTSxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDeEQsYUFBYSxHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3BEOztPQUVHO0lBQ0ssV0FBVyxHQUFnQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtJQUM1RDs7T0FFRztJQUNLLE1BQU0sQ0FBUztJQUV2Qjs7O09BR0c7SUFDSSxnQkFBZ0IsR0FBa0IsSUFBSSxDQUFDO0lBRTlDOztPQUVHO0lBQ0gsSUFBWSxRQUFRO1FBQ25CLE9BQU8saUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDeEUsQ0FBQztJQUVEO1FBQ0MsSUFBSSxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksT0FBTyxNQUFNLEtBQUssV0FBVyxFQUFFLENBQUM7WUFDekUsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDdEIsQ0FBQztJQUNGLENBQUM7SUFDRDs7T0FFRztJQUNJLGtCQUFrQixHQUFXLGFBQWEsQ0FBQztJQUNsRDs7T0FFRztJQUNJLGNBQWMsR0FBVyxXQUFXLENBQUM7SUFDNUM7O09BRUc7SUFDYSxVQUFVLEdBQVcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7SUFDL0Q7Ozs7T0FJRztJQUNJLFFBQVEsR0FBRyxDQUFDLFNBQWtCLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hLOzs7O09BSUc7SUFDSSxhQUFhLEdBQUcsQ0FBQyxTQUFrQixFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUMzSzs7OztPQUlHO0lBQ0ksR0FBRyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxxQkFBcUI7SUFFdEY7O09BRUc7SUFDSCxJQUFXLFlBQVk7UUFDdEIsdUNBQXVDO1FBQ3ZDLElBQUksaUJBQWlCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDeEMsbUVBQW1FO1lBQ25FLE1BQU0sU0FBUyxHQUFJLElBQUksQ0FBQyxNQUFjLEVBQUUsS0FBSyxDQUFDO1lBQzlDLElBQUksU0FBUyxFQUFFLFdBQVcsRUFBRSxDQUFDO2dCQUM1QixtQ0FBbUM7Z0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO29CQUMvQyxPQUFPLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxFQUFFLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQztnQkFDbkYsQ0FBQztnQkFDRCxPQUFPLFNBQVMsQ0FBQyxXQUFXLENBQUM7WUFDOUIsQ0FBQztZQUVELHNFQUFzRTtZQUN0RSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLENBQUM7Z0JBQzNCLE1BQU0sR0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUM3RSwyREFBMkQ7Z0JBQzNELElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7b0JBQzVELE9BQU8sQ0FBQyxJQUFJLENBQUMsNkZBQTZGLENBQUMsQ0FBQztnQkFDN0csQ0FBQztnQkFDRCxPQUFPLEdBQUcsQ0FBQztZQUNaLENBQUM7UUFDRixDQUFDO1FBRUQsb0VBQW9FO1FBQ3BFLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRSxRQUFRLEVBQUUsQ0FBQztZQUM3QixPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQzdFLENBQUM7UUFFRCxxQ0FBcUM7UUFDckMsSUFBSSxJQUFJLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ2xDLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUM7UUFDckMsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQztRQUN6QyxJQUFJLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksTUFBTSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDL0UsSUFBSSxDQUFDO2dCQUNKLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO2dCQUM1QixPQUFPLEdBQUcsR0FBRyxDQUFDLFFBQVEsS0FBSyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdkMsQ0FBQztZQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7Z0JBQ1osT0FBTyxDQUFDLElBQUksQ0FBQyxxREFBcUQsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUM3RSxDQUFDO1FBQ0YsQ0FBQztRQUVELHNDQUFzQztRQUN0QyxPQUFPLENBQUMsSUFBSSxDQUFDLGtGQUFrRixDQUFDLENBQUM7UUFDakcsT0FBTyxFQUFFLENBQUM7SUFDWCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLGNBQWMsR0FBRyxDQUFDLElBQWEsRUFBVSxFQUFFO1FBQ2pELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7UUFDbEMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ1gsT0FBTyxPQUFPLENBQUM7UUFDaEIsQ0FBQztRQUVELCtEQUErRDtRQUMvRCxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDM0QsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDO1FBRTVFLE9BQU8sR0FBRyxZQUFZLEdBQUcsU0FBUyxFQUFFLENBQUM7SUFDdEMsQ0FBQyxDQUFBO0lBRUQ7Ozs7T0FJRztJQUNJLG1CQUFtQixHQUFHLENBQUMsU0FBa0IsRUFBVSxFQUFFO1FBQzNELHFEQUFxRDtRQUNyRCxJQUFJLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDeEYsT0FBTyxTQUFTLENBQUM7UUFDbEIsQ0FBQztRQUVELHNEQUFzRDtRQUN0RCxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBRS9DLG9EQUFvRDtRQUNwRCxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksUUFBUSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDO1lBQ3ZFLE9BQU8sUUFBUSxDQUFDO1FBQ2pCLENBQUM7UUFFRCw0RUFBNEU7UUFDNUUsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUM7UUFDN0MsSUFBSSxVQUFVLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxJQUFJLFVBQVUsQ0FBQyxVQUFVLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUMzRSx5QkFBeUI7WUFDekIsT0FBTyxRQUFRLENBQUM7UUFDakIsQ0FBQztRQUVELDZEQUE2RDtRQUM3RCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDO1FBQ3RDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUNsQixPQUFPLFFBQVEsQ0FBQyxDQUFDLHdEQUF3RDtRQUMxRSxDQUFDO1FBRUQseUJBQXlCO1FBQ3pCLE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQztRQUN0RixNQUFNLGdCQUFnQixHQUFHLFdBQVcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQztRQUM1RixNQUFNLGFBQWEsR0FBRyxRQUFRLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7UUFFbEYsT0FBTyxHQUFHLGdCQUFnQixJQUFJLFdBQVcsR0FBRyxhQUFhLEVBQUUsQ0FBQztJQUM3RCxDQUFDLENBQUE7SUFFRDs7O09BR0c7SUFDSSxxQkFBcUIsR0FBRyxDQUM5QixRQUFhLEVBQ2IsS0FBYSxFQUNiLGlCQUFpQixHQUFHLDZCQUE2QixFQUN1RCxFQUFFO1FBQzFHLE1BQU0sUUFBUSxHQUFHLENBQUMsUUFBUSxFQUFFLElBQUksSUFBSSxpQkFBaUIsQ0FBQyxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3pFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDbkUsTUFBTSxTQUFTLEdBQUcsS0FBSyxDQUFDLE1BQU0sQ0FBQztRQUMvQixNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDM0IsTUFBTSxnQkFBZ0IsR0FBRyxTQUFTLEVBQUUsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDakcsTUFBTSxXQUFXLEdBQUcsU0FBUztZQUM1QixDQUFDLENBQUMsR0FBRyxRQUFRLEtBQUssU0FBUyxJQUFJLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxNQUFNLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUNqRixDQUFDLENBQUMsR0FBRyxRQUFRLG9CQUFvQixDQUFDO1FBRW5DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsb0JBQW9CLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDN0QsTUFBTSxLQUFLLEdBQUcsU0FBUyxFQUFFLGVBQWU7WUFDdkMsQ0FBQyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDO1lBQ3JELENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFMUMsT0FBTztZQUNOLEtBQUssRUFBRSxRQUFRO1lBQ2YsV0FBVztZQUNYLEdBQUc7WUFDSCxLQUFLO1lBQ0wsSUFBSSxFQUFFLFNBQVM7WUFDZixXQUFXLEVBQUUscUJBQXFCO1NBQ2xDLENBQUM7SUFDSCxDQUFDLENBQUE7SUFFRDs7T0FFRztJQUNJLDZCQUE2QixHQUFHLEdBQXlELEVBQUUsQ0FBQyxDQUFDO1FBQ25HLEtBQUssRUFBRSxpQkFBaUI7UUFDeEIsV0FBVyxFQUFFLDRCQUE0QjtRQUN6QyxJQUFJLEVBQUUsU0FBUztLQUNmLENBQUMsQ0FBQTtJQUVGOzs7T0FHRztJQUNJLGNBQWMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUM7SUFFakksYUFBYSxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxVQUFVLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUV4SDs7O09BR0c7SUFDSSxZQUFZLEdBQUcsR0FBWSxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsR0FBRyxHQUFHLElBQUksS0FBSyxDQUFDO0lBQzNGOztPQUVHO0lBQ0ksUUFBUSxHQUFtQjtRQUNqQyxJQUFJLEVBQUUsS0FBSztRQUNYLE1BQU0sRUFBRSxHQUFHO1FBQ1gsUUFBUSxFQUFFLE1BQU07UUFDaEIsY0FBYyxFQUFFLEtBQUs7S0FDckIsQ0FBQztJQUVGOztPQUVHO0lBQ0ksa0JBQWtCLEdBQXFCO1FBQzdDO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsR0FBRztZQUNYLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSxLQUFLO1NBRXJCO1FBQ0Q7WUFDQyxJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxHQUFHO1lBQ1gsUUFBUSxFQUFFLE1BQU07WUFDaEIsY0FBYyxFQUFFLEtBQUs7U0FDckI7UUFDRDtZQUNDLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLEdBQUc7WUFDWCxRQUFRLEVBQUUsTUFBTTtZQUNoQixjQUFjLEVBQUUsS0FBSztTQUNyQjtRQUNEO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsR0FBRztZQUNYLFFBQVEsRUFBRSxNQUFNO1lBQ2hCLGNBQWMsRUFBRSxLQUFLO1NBQ3JCO1FBQ0Q7WUFDQyxJQUFJLEVBQUUsS0FBSztZQUNYLE1BQU0sRUFBRSxLQUFLO1lBQ2IsUUFBUSxFQUFFLE1BQU07WUFDaEIsY0FBYyxFQUFFLEtBQUs7U0FDckI7UUFDRDtZQUNDLElBQUksRUFBRSxLQUFLO1lBQ1gsTUFBTSxFQUFFLElBQUk7WUFDWixRQUFRLEVBQUUsTUFBTTtZQUNoQixjQUFjLEVBQUUsS0FBSztTQUNyQjtRQUNEO1lBQ0MsSUFBSSxFQUFFLEtBQUs7WUFDWCxNQUFNLEVBQUUsS0FBSztZQUNiLFFBQVEsRUFBRSxPQUFPO1lBQ2pCLGNBQWMsRUFBRSxJQUFJO1NBQ3BCO0tBQ0QsQ0FBQTtJQUNEOzs7T0FHRztJQUNJLHFCQUFxQixDQUFDLGtCQUFvQztRQUNoRSxJQUFJLENBQUMsa0JBQWtCLEdBQUcsa0JBQWtCLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNJLFdBQVcsQ0FBQyxnQkFBOEIsRUFBRSxVQUEyQjtRQUM3RSxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxFQUFrQixFQUFFLEVBQUUsQ0FBQyxFQUFFLENBQUMsSUFBSSxJQUFJLGdCQUFnQixDQUFDLFdBQVcsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUNoSSxVQUFVLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsUUFBUSxFQUFFLEdBQUcsVUFBVSxFQUFFLENBQUMsQ0FBQTtRQUNuRSxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7SUFDdEIsQ0FBQztJQUFBLENBQUM7SUFHSyxtQkFBbUIsQ0FBQyxhQUFrQjtRQUM1QyxJQUFJLENBQUMsbUJBQW1CLENBQUMsZUFBZSxDQUN2QyxPQUFPLGFBQWEsRUFBRSxlQUFlLEtBQUssU0FBUztZQUNsRCxDQUFDLENBQUMsYUFBYSxDQUFDLGVBQWU7WUFDL0IsQ0FBQyxDQUFDLE9BQU8sYUFBYSxFQUFFLFlBQVksS0FBSyxTQUFTO2dCQUNqRCxDQUFDLENBQUMsYUFBYSxDQUFDLFlBQVk7Z0JBQzVCLENBQUMsQ0FBQyxLQUFLLENBQ1QsQ0FBQztRQUVGLElBQUksYUFBYSxDQUFDLE9BQU8sSUFBSSxhQUFhLENBQUMsSUFBSTtZQUM5QyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUUxRSxJQUFJLGFBQWEsQ0FBQyxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxJQUFJLGFBQWEsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDO1lBQ2hGLElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLElBQUksYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUVoRixJQUFJLGFBQWEsQ0FBQyxRQUFRLElBQUksYUFBYSxDQUFDLFlBQVk7WUFDdkQsSUFBSSxDQUFDLFdBQVcsQ0FBQyxhQUFhLENBQUMsUUFBUSxJQUFJLGFBQWEsQ0FBQyxZQUFZLENBQUMsQ0FBQTtRQUV2RSxJQUFJLGFBQWEsQ0FBQyxZQUFZLElBQUksSUFBSSxFQUFFLENBQUM7WUFDeEMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsWUFBZ0MsQ0FBQyxDQUFDO1FBQ3RFLENBQUM7UUFFRCxJQUFJLE9BQU8sYUFBYSxDQUFDLG1CQUFtQixLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVELElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxhQUFhLENBQUMsbUJBQW1CLENBQUMsQ0FBQztRQUNoRSxDQUFDO1FBRUQsT0FBTyxhQUFhLENBQUM7SUFDdEIsQ0FBQztJQUVEOzs7TUFHRTtJQUNNLFdBQVcsR0FBYSxDQUFDLE9BQU8sRUFBRSxZQUFZLEVBQUUsUUFBUSxDQUFDLENBQUE7SUFFakU7Ozs7OztPQU1HO0lBQ0gsY0FBYyxHQUFHLENBQUMsY0FBd0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFFckYsY0FBYyxHQUFHLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7SUFFeEMsa0JBQWtCO0lBQ1YseUJBQXlCLEdBQVksS0FBSyxDQUFDO0lBQ25ELDJCQUEyQixDQUFDLEtBQWMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RiwyQkFBMkIsS0FBSyxPQUFPLElBQUksQ0FBQyx5QkFBeUIsQ0FBQSxDQUFDLENBQUM7SUFFdkUsMEVBQTBFO0lBQ2xFLG1CQUFtQixHQUFZLEtBQUssQ0FBQztJQUM3QyxpQkFBaUIsQ0FBQyxLQUFjLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQzNFLGlCQUFpQixLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQSxDQUFDLENBQUM7SUFFM0Qsc0JBQXNCLENBQUMsS0FBYyxJQUFJLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUM5RSxzQkFBc0IsS0FBSyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFFN0Qsc0JBQXNCLENBQUMsS0FBYyxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNyRixzQkFBc0IsS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXRFOzs7Ozs7Ozs7Ozs7OztNQWNFO0lBQ00sK0JBQStCLEdBQW9DO1FBQzFFLElBQUksRUFBRSxPQUFPO1FBQ2IsSUFBSSxFQUFFLE9BQU87UUFDYixrQkFBa0IsRUFBRSxLQUFLO1FBQ3pCLFlBQVksRUFBRSxJQUFJO0tBQ2xCLENBQUE7SUFFRCxrQ0FBa0MsR0FBRyxDQUFDLEtBQXNDLEVBQUUsRUFBRTtRQUMvRSxJQUFJLENBQUMsK0JBQStCLEdBQUc7WUFDdEMsR0FBRyxJQUFJLENBQUMsK0JBQStCO1lBQ3ZDLEdBQUcsS0FBSztTQUNSLENBQUE7SUFDRixDQUFDLENBQUE7SUFFRCxrQ0FBa0MsR0FBRyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUE7SUFFeEUsVUFBVTtRQUNoQixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDO0lBQ2xDLENBQUM7SUFFTSxXQUFXLEdBQVksS0FBSyxDQUFDO0lBRXBDLG1CQUFtQixDQUFDLElBQW1CO1FBQ3RDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUM7SUFDOUIsQ0FBQztJQUVELG1CQUFtQjtRQUNsQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxlQUFlO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDSyxlQUFlLENBQUMsSUFBc0I7UUFDN0MsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3BELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVPLHFCQUFxQixDQUFDLElBQWtEO1FBQy9FLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUM7SUFDaEQsQ0FBQzt3R0EvYlcsb0JBQW9COzRHQUFwQixvQkFBb0IsY0FGcEIsTUFBTTs7NEZBRU4sb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNYLFVBQVUsRUFBRSxNQUFNO2lCQUNsQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgUExBVEZPUk1fSUQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFwaUNvbnN0YW50c1NlcnZpY2UgfSBmcm9tICcuL2FwaS5jb25zdGFudHMuc2VydmljZSc7XG5pbXBvcnQgeyBpc1BsYXRmb3JtQnJvd3NlciwgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ3VycmVuY3lDb25maWcsIGN1cnJlbmN5VHlwZSwgUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCwgRW52aXJvbm1lbnQsIENoZWNrb3V0Vmlld1R5cGUgfSBmcm9tICcuLi9pbnRlcmZhY2VzJztcbmltcG9ydCB7IEVOVklST05NRU5UX1RPS0VOIH0gZnJvbSAnLi4vcHJvdmlkZXJzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgV2lzaGxpc3RWaXNpYmlsaXR5U2VydmljZSB9IGZyb20gJy4uL2VjLXNlcnZpY2VzL3dpc2hsaXN0LXZpc2liaWxpdHkuc2VydmljZSc7XG5pbXBvcnQgeyBDYXBhYmlsaXRpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vZWMtc2VydmljZXMvY2FwYWJpbGl0aWVzLnNlcnZpY2UnO1xuLyoqXG4gKiBTZXJ2aWNpbyBxdWUgcHJvdmVlIGxhcyBjb25zdGFudGVzIG5lY2VzYXJpYXMgcXVlIHNlIHV0aWxpemFuIHBvciB0b2RhIGxhIGFwbGljYWNpw7NuLlxuICogQGV4cG9ydFxuICogQGNsYXNzIENvcmVDb25zdGFudHNTZXJ2aWNlXG4gKi9cbkBJbmplY3RhYmxlKHtcblx0cHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIENvcmVDb25zdGFudHNTZXJ2aWNlIHtcblxuXHRwdWJsaWMgc2VhcmNoVmFsdWU6IHN0cmluZyA9ICcnO1xuXHRwcml2YXRlIGNoZWNrb3V0Vmlld1N1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PENoZWNrb3V0Vmlld1R5cGU+KCdsZWdhY3knKTtcblx0cHVibGljIGNoZWNrb3V0VmlldyQgPSB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QuYXNPYnNlcnZhYmxlKCk7XG5cdC8qKlxuXHQgKiBTZXJ2aWNpbyBxdWUgY29udGllbmUgbGFzIGNvbnN0YW50ZXMgdXNhZGFzIHBhcmEgbGEgQVBJXG5cdCAqL1xuXHRwcml2YXRlIGFwaUNvbnN0YW50cyA9IGluamVjdChBcGlDb25zdGFudHNTZXJ2aWNlKVxuXHQvKipcblx0ICogUHJvdmVlIGVsIElEIGRlIGxhIHBsYXRhZm9ybWEgZW4gZG9uZGUgc2UgZXN0YSBlamVjdXRhbmRvIGVsIGNvZGlnbywgZXN0byBzaXJ2ZSBwYXJhIHBvZGVyIGRpZmVyZW5jaWFyIHNpIGVzIGRlIHVuIHNlcnZpZG9yIG8gdW4gbmF2ZWdhZG9yIHdlYi5cblx0ICovXG5cdHByb3RlY3RlZCBwbGF0Zm9ybUlkOiBhbnkgPSBpbmplY3QoUExBVEZPUk1fSUQpXG5cdC8qKlxuXHQgKiBEb2N1bWVudCB0b2tlbiBwYXJhIGFjY2VzbyBTU1ItY29tcGF0aWJsZSBhbCBkb2N1bWVudG9cblx0ICovXG5cdHByaXZhdGUgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UKTtcblx0cHJpdmF0ZSBfd2lzaGxpc3RWaXNpYmlsaXR5ID0gaW5qZWN0KFdpc2hsaXN0VmlzaWJpbGl0eVNlcnZpY2UpO1xuXHRwcml2YXRlIF9jYXBhYmlsaXRpZXMgPSBpbmplY3QoQ2FwYWJpbGl0aWVzU2VydmljZSk7XG5cdC8qKlxuXHQgKiBDb250aWVuZSBsb3MgZGF0b3MgcHJvdmlzdG8gcG9yIGVsIGZyb250ZW5kIGVuIGVsIGFyY2hpdm8gZW52aXJvbm1lbnQudHNcblx0ICovXG5cdHByaXZhdGUgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50ID0gaW5qZWN0KEVOVklST05NRU5UX1RPS0VOKVxuXHQvKipcblx0ICogR3VhcmRhIGxhIHZhcmlhYmxlIHdpbmRvdyBkZWwgd2ViIGJyb3dzZXIuXG5cdCAqL1xuXHRwcml2YXRlIHdpbmRvdz86V2luZG93O1xuXG5cdC8qKlxuXHQgKiBUaXBvIGRlIHJ1dGEgYWN0dWFsIChlajogJ2NhdGVnb3JpZXMnLCAnYXR0cmlidXRlcycsIGV0YykuXG5cdCAqIExvIHVzYW1vcyBwYXJhIHF1ZSBQYWdpbmF0aW9uU2VydmljZSBzZXBhIHF1w6kgZmlsdHJvIGVzcGVyYXIuXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVudFJvdXRlVHlwZTogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFxuXHQvKipcblx0ICogR2V0dGVyIHNlZ3VybyBwYXJhIGRvY3VtZW50IHF1ZSB2ZXJpZmljYSBsYSBwbGF0YWZvcm1hXG5cdCAqL1xuXHRwcml2YXRlIGdldCBkb2N1bWVudCgpOiBEb2N1bWVudCB8IHVuZGVmaW5lZCB7XG5cdFx0cmV0dXJuIGlzUGxhdGZvcm1Ccm93c2VyKHRoaXMucGxhdGZvcm1JZCkgPyB0aGlzLl9kb2N1bWVudCA6IHVuZGVmaW5lZDtcblx0fVxuXG5cdGNvbnN0cnVjdG9yKCkge1xuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpICYmIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7XG5cdFx0XHR0aGlzLndpbmRvdyA9IHdpbmRvdztcblx0XHR9XG5cdH1cblx0LyoqXG5cdCAqIFBhdGggdXNhZG8gZW4gbGFzIGNvbGVjY2lvbmVzIGRlIHByb2R1Y3Rvcy5cblx0ICovXG5cdHB1YmxpYyBQUk9EVUNUX0xJU1RfUk9VVEU6IHN0cmluZyA9ICdjb2xsZWN0aW9uLyc7XG5cdC8qKlxuXHQgKiBQYXRoIHVzYWRvIHBhcmEgYWNjZWRlciBhIGxhcyBzZWNjaW9uZXMuXG5cdCAqL1xuXHRwdWJsaWMgU0VDVElPTlNfUk9VVEU6IHN0cmluZyA9ICdzZWN0aW9ucy8nO1xuXHQvKipcblx0ICogUGF0aCBxdWUgYWxvamEgbGEgY2FycGV0YSBkZSBsb3MgYXNzZXRzLlxuXHQgKi9cblx0cHVibGljIHJlYWRvbmx5IEFTU0VUU19VUkw6IHN0cmluZyA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkb25kZSBzZSBndWFyZGEgbGFzIGltYWdlbmVzLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyBtZWRpYVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZG9uZGUgc2UgZ3VhcmRhIGxhcyBpbWFnZW5lcy5cblx0ICogQHBhcmFtIHBvc3RNZWRpYSBcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS9pbWFnZS8nIDogJycpICsgKHBvc3RNZWRpYSA/IHBvc3RNZWRpYSA6IFwiaW1hZ2UvXCIpO1xuXHQvKipcblx0ICogUmV0b3JuYSBsYSB1cmwgZGVsIHNpdGlvLlxuXHQgKiBAcGFyYW0gcG9zdE1lZGlhIFxuXHQgKiBAcmV0dXJucyBcblx0ICovXG5cdHB1YmxpYyB1cmwgPSAoKSA9PiB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMLnJlcGxhY2UoL1xcLyQvLCAnJyk7IC8vIHJlbW92ZSBsYXN0IHNsYXNoXHRcblxuXHQvKipcblx0ICogVVJMIGRlbCBzaXRpbyBmcm9udGVuZCAtIENvbXBhdGlibGUgY29uIEFuZ3VsYXIgU1NSXG5cdCAqL1xuXHRwdWJsaWMgZ2V0IEZST05URU5EX1VSTCgpOiBzdHJpbmcge1xuXHRcdC8vIFZlcmlmaWNhciBzaSBlc3RhbW9zIGVuIGVsIG5hdmVnYWRvclxuXHRcdGlmIChpc1BsYXRmb3JtQnJvd3Nlcih0aGlzLnBsYXRmb3JtSWQpKSB7XG5cdFx0XHQvLyBQcmltZXJvIGludGVudGEgbGVlciBkZSB3aW5kb3cuX19lbnYgKGNvbmZpZ3VyYWRvIHBvciBEb2NrZXIvQ0kpXG5cdFx0XHRjb25zdCB3aW5kb3dFbnYgPSAodGhpcy53aW5kb3cgYXMgYW55KT8uX19lbnY7XG5cdFx0XHRpZiAod2luZG93RW52Py5mcm9udGVuZFVybCkge1xuXHRcdFx0XHQvLyBMb2cgcGFyYSBkZWJ1Z2dpbmcgZW4gZGVzYXJyb2xsb1xuXHRcdFx0XHRpZiAoIXdpbmRvd0Vudi5mcm9udGVuZFVybC5zdGFydHNXaXRoKCdodHRwJykpIHtcblx0XHRcdFx0XHRjb25zb2xlLndhcm4oJ1tGUk9OVEVORF9VUkxdIEludmFsaWQgZnJvbnRlbmRVcmwgZm9ybWF0OicsIHdpbmRvd0Vudi5mcm9udGVuZFVybCk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHdpbmRvd0Vudi5mcm9udGVuZFVybDtcblx0XHRcdH1cblx0XHRcdFxuXHRcdFx0Ly8gU2kgbm8gaGF5IGNvbmZpZ3VyYWNpw7NuIGVzcGVjw61maWNhLCBjb25zdHJ1aXIgZGVzZGUgd2luZG93LmxvY2F0aW9uXG5cdFx0XHRpZiAodGhpcy53aW5kb3c/LmxvY2F0aW9uKSB7XG5cdFx0XHRcdGNvbnN0IHVybCA9IGAke3RoaXMud2luZG93LmxvY2F0aW9uLnByb3RvY29sfS8vJHt0aGlzLndpbmRvdy5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0XHRcdC8vIFZlcmlmaWNhciBxdWUgbm8gc2VhIGxvY2FsaG9zdCBvIDEyNy4wLjAuMSBlbiBwcm9kdWNjacOzblxuXHRcdFx0XHRpZiAodXJsLmluY2x1ZGVzKCcxMjcuMC4wLjEnKSB8fCB1cmwuaW5jbHVkZXMoJ2xvY2FsaG9zdCcpKSB7XG5cdFx0XHRcdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBVc2luZyBsb2NhbGhvc3QgVVJMIGluIHByb2R1Y3Rpb24sIGNvbnNpZGVyIHNldHRpbmcgd2luZG93Ll9fZW52LmZyb250ZW5kVXJsJyk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHVybDtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gUGFyYSBTU1IsIGludGVudGFyIGNvbnN0cnVpciBkZXNkZSBlbCBkb2N1bWVudCBzaSBlc3TDoSBkaXNwb25pYmxlXG5cdFx0aWYgKHRoaXMuZG9jdW1lbnQ/LmxvY2F0aW9uKSB7XG5cdFx0XHRyZXR1cm4gYCR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5wcm90b2NvbH0vLyR7dGhpcy5kb2N1bWVudC5sb2NhdGlvbi5ob3N0fWA7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEludGVudGFyIG9idGVuZXIgZGVzZGUgZW52aXJvbm1lbnRcblx0XHRpZiAodGhpcy5lbnZpcm9ubWVudC5mcm9udGVuZFVybCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuZW52aXJvbm1lbnQuZnJvbnRlbmRVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIMOabHRpbW8gZmFsbGJhY2sgLSB1c2FyIGxhIFVSTCBkZWwgQVBJIHNpIGVzdMOhIGNvbmZpZ3VyYWRhIHkgZXMgYWJzb2x1dGFcblx0XHRjb25zdCBhcGlVcmwgPSB0aGlzLmFwaUNvbnN0YW50cy5BUElfVVJMO1xuXHRcdGlmIChhcGlVcmwgJiYgKGFwaVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgYXBpVXJsLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRjb25zdCB1cmwgPSBuZXcgVVJMKGFwaVVybCk7XG5cdFx0XHRcdHJldHVybiBgJHt1cmwucHJvdG9jb2x9Ly8ke3VybC5ob3N0fWA7XG5cdFx0XHR9IGNhdGNoIChlKSB7XG5cdFx0XHRcdGNvbnNvbGUud2FybignW0ZST05URU5EX1VSTF0gQ291bGQgbm90IHBhcnNlIEFQSSBVUkwgYXMgZmFsbGJhY2s6JywgYXBpVXJsKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0Ly8gRmFsbGJhY2sgZmluYWwgLSByZXRvcm5hciBVUkwgdmFjw61hXG5cdFx0Y29uc29sZS53YXJuKCdbRlJPTlRFTkRfVVJMXSBObyB2YWxpZCBmcm9udGVuZCBVUkwgZm91bmQsIHRoaXMgbWF5IGNhdXNlIGlzc3VlcyB3aXRoIG1ldGEgdGFncycpO1xuXHRcdHJldHVybiAnJztcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBjb21wbGV0YSBkZWwgZnJvbnRlbmQgY29uIHVuYSBydXRhIG9wY2lvbmFsXG5cdCAqIEBwYXJhbSBwYXRoIC0gUnV0YSBvcGNpb25hbCBwYXJhIGFncmVnYXIgYSBsYSBVUkwgYmFzZVxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgY29tcGxldGEgZGVsIGZyb250ZW5kXG5cdCAqL1xuXHRwdWJsaWMgZ2V0RnJvbnRlbmRVcmwgPSAocGF0aD86IHN0cmluZyk6IHN0cmluZyA9PiB7XG5cdFx0Y29uc3QgYmFzZVVybCA9IHRoaXMuRlJPTlRFTkRfVVJMO1xuXHRcdGlmICghcGF0aCkge1xuXHRcdFx0cmV0dXJuIGJhc2VVcmw7XG5cdFx0fVxuXHRcdFxuXHRcdC8vIEFzZWd1cmFyIHF1ZSBsYSBydXRhIGNvbWllbmNlIGNvbiAnLycgeSBubyB0ZW5nYSBkb2JsZSBzbGFzaFxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aCA6IGAvJHtwYXRofWA7XG5cdFx0Y29uc3QgY2xlYW5CYXNlVXJsID0gYmFzZVVybC5lbmRzV2l0aCgnLycpID8gYmFzZVVybC5zbGljZSgwLCAtMSkgOiBiYXNlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkJhc2VVcmx9JHtjbGVhblBhdGh9YDtcblx0fVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIFVSTCBhYnNvbHV0YSBkZSB1bmEgaW1hZ2VuIHBhcmEgbWV0YSB0YWdzIChjb21wYXRpYmxlIGNvbiBTU1IpXG5cdCAqIEBwYXJhbSBwb3N0TWVkaWEgLSBSdXRhIGRlIGxhIGltYWdlblxuXHQgKiBAcmV0dXJucyB7c3RyaW5nfSBVUkwgYWJzb2x1dGEgZGUgbGEgaW1hZ2VuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0QWJzb2x1dGVJbWFnZVVybCA9IChwb3N0TWVkaWE/OiBzdHJpbmcpOiBzdHJpbmcgPT4ge1xuXHRcdC8vIFNpIGxhIFVSTCB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYSB0YWwgY29tbyBlc3TDoVxuXHRcdGlmIChwb3N0TWVkaWEgJiYgKHBvc3RNZWRpYS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgcG9zdE1lZGlhLnN0YXJ0c1dpdGgoJ2h0dHBzOi8vJykpKSB7XG5cdFx0XHRyZXR1cm4gcG9zdE1lZGlhO1xuXHRcdH1cblxuXHRcdC8vIENvbnN0cnVpciBsYSBVUkwgZGUgbGEgaW1hZ2VuIHVzYW5kbyBsYSBVUkwgZGVsIEFQSVxuXHRcdGNvbnN0IGltYWdlVXJsID0gdGhpcy5tZWRpYUltYWdlVXJsKHBvc3RNZWRpYSk7XG5cdFx0XG5cdFx0Ly8gU2kgbGEgVVJMIGRlIGxhIGltYWdlbiB5YSBlcyBhYnNvbHV0YSwgZGV2b2x2ZXJsYVxuXHRcdGlmIChpbWFnZVVybC5zdGFydHNXaXRoKCdodHRwOi8vJykgfHwgaW1hZ2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBlcyB1bmEgVVJMIHJlbGF0aXZhLCBjb252ZXJ0aXJsYSBhIGFic29sdXRhIHVzYW5kbyBsYSBVUkwgYmFzZSBkZWwgQVBJXG5cdFx0Y29uc3QgYXBpQmFzZVVybCA9IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkw7XG5cdFx0aWYgKGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cDovLycpIHx8IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkge1xuXHRcdFx0Ly8gQVBJX1VSTCB5YSBlcyBhYnNvbHV0YVxuXHRcdFx0cmV0dXJuIGltYWdlVXJsO1xuXHRcdH1cblx0XHRcblx0XHQvLyBTaSBBUElfVVJMIGVzIHJlbGF0aXZhLCB1c2FyIGxhIFVSTCBkZWwgZnJvbnRlbmQgY29tbyBiYXNlXG5cdFx0Y29uc3QgZnJvbnRlbmRVcmwgPSB0aGlzLkZST05URU5EX1VSTDtcblx0XHRpZiAoIWZyb250ZW5kVXJsKSB7XG5cdFx0XHRyZXR1cm4gaW1hZ2VVcmw7IC8vIEZhbGxiYWNrIHNpIG5vIHBvZGVtb3MgZGV0ZXJtaW5hciBsYSBVUkwgZGVsIGZyb250ZW5kXG5cdFx0fVxuXHRcdFxuXHRcdC8vIENvbnN0cnVpciBVUkwgYWJzb2x1dGFcblx0XHRjb25zdCBjbGVhbkFwaVVybCA9IGFwaUJhc2VVcmwuc3RhcnRzV2l0aCgnLycpID8gYXBpQmFzZVVybC5zdWJzdHJpbmcoMSkgOiBhcGlCYXNlVXJsO1xuXHRcdGNvbnN0IGNsZWFuRnJvbnRlbmRVcmwgPSBmcm9udGVuZFVybC5lbmRzV2l0aCgnLycpID8gZnJvbnRlbmRVcmwuc2xpY2UoMCwgLTEpIDogZnJvbnRlbmRVcmw7XG5cdFx0Y29uc3QgY2xlYW5JbWFnZVVybCA9IGltYWdlVXJsLnN0YXJ0c1dpdGgoJy8nKSA/IGltYWdlVXJsLnN1YnN0cmluZygxKSA6IGltYWdlVXJsO1xuXHRcdFxuXHRcdHJldHVybiBgJHtjbGVhbkZyb250ZW5kVXJsfS8ke2NsZWFuQXBpVXJsfSR7Y2xlYW5JbWFnZVVybH1gO1xuXHR9XG5cblx0LyoqXG5cdCAqIENvbnN0cnV5ZSBtZXRhIGluZm9ybWFjacOzbiBwYXJhIHVuYSB3aXNobGlzdCBjb21wYXJ0aWRhLlxuXHQgKiBTZSB1c2EgcGFyYSBPcGVuR3JhcGgvVHdpdHRlciBjYXJkcyBlbiBTU1IgeSBicm93c2VyLlxuXHQgKi9cblx0cHVibGljIGdldFNoYXJlZFdpc2hsaXN0TWV0YSA9IChcblx0XHR3aXNobGlzdDogYW55LFxuXHRcdHRva2VuOiBzdHJpbmcsXG5cdFx0ZmFsbGJhY2tJbWFnZVBhdGggPSAnL2Fzc2V0cy9pbWcvZmF2L2Zhdmljb24uaWNvJ1xuXHQpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHVybDogc3RyaW5nOyBpbWFnZTogc3RyaW5nOyB0eXBlOiBzdHJpbmc7IHR3aXR0ZXJDYXJkOiBzdHJpbmcgfSA9PiB7XG5cdFx0Y29uc3QgbGlzdE5hbWUgPSAod2lzaGxpc3Q/Lm5hbWUgfHwgJ1NoYXJlZCB3aXNobGlzdCcpLnRvU3RyaW5nKCkudHJpbSgpO1xuXHRcdGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheSh3aXNobGlzdD8uaXRlbXMpID8gd2lzaGxpc3QuaXRlbXMgOiBbXTtcblx0XHRjb25zdCBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG5cdFx0Y29uc3QgZmlyc3RJdGVtID0gaXRlbXNbMF07XG5cdFx0Y29uc3QgZmlyc3RQcm9kdWN0TmFtZSA9IGZpcnN0SXRlbT8ucHJvZHVjdF9uYW1lID8gZmlyc3RJdGVtLnByb2R1Y3RfbmFtZS50b1N0cmluZygpLnRyaW0oKSA6ICcnO1xuXHRcdGNvbnN0IGRlc2NyaXB0aW9uID0gaXRlbUNvdW50XG5cdFx0XHQ/IGAke2xpc3ROYW1lfSAoJHtpdGVtQ291bnR9KSR7Zmlyc3RQcm9kdWN0TmFtZSA/IGAgLSAke2ZpcnN0UHJvZHVjdE5hbWV9YCA6ICcnfWBcblx0XHRcdDogYCR7bGlzdE5hbWV9IC0gc2hhcmVkIHdpc2hsaXN0YDtcblxuXHRcdGNvbnN0IHVybCA9IHRoaXMuZ2V0RnJvbnRlbmRVcmwoYC93aXNobGlzdC9zaGFyZWQvJHt0b2tlbn1gKTtcblx0XHRjb25zdCBpbWFnZSA9IGZpcnN0SXRlbT8ucGljdHVyZV9kZWZhdWx0XG5cdFx0XHQ/IHRoaXMuZ2V0QWJzb2x1dGVJbWFnZVVybChmaXJzdEl0ZW0ucGljdHVyZV9kZWZhdWx0KVxuXHRcdFx0OiB0aGlzLmdldEZyb250ZW5kVXJsKGZhbGxiYWNrSW1hZ2VQYXRoKTtcblxuXHRcdHJldHVybiB7XG5cdFx0XHR0aXRsZTogbGlzdE5hbWUsXG5cdFx0XHRkZXNjcmlwdGlvbixcblx0XHRcdHVybCxcblx0XHRcdGltYWdlLFxuXHRcdFx0dHlwZTogJ3dlYnNpdGUnLFxuXHRcdFx0dHdpdHRlckNhcmQ6ICdzdW1tYXJ5X2xhcmdlX2ltYWdlJ1xuXHRcdH07XG5cdH1cblxuXHQvKipcblx0ICogTWV0YSBpbmZvcm1hY2nDs24gZmFsbGJhY2sgcGFyYSB3aXNobGlzdCBjb21wYXJ0aWRhIGN1YW5kbyBubyBleGlzdGUgbyBubyBjYXJnYS5cblx0ICovXG5cdHB1YmxpYyBnZXRTaGFyZWRXaXNobGlzdEZhbGxiYWNrTWV0YSA9ICgpOiB7IHRpdGxlOiBzdHJpbmc7IGRlc2NyaXB0aW9uOiBzdHJpbmc7IHR5cGU6IHN0cmluZyB9ID0+ICh7XG5cdFx0dGl0bGU6ICdTaGFyZWQgd2lzaGxpc3QnLFxuXHRcdGRlc2NyaXB0aW9uOiAnVmlldyB0aGlzIHNoYXJlZCB3aXNobGlzdC4nLFxuXHRcdHR5cGU6ICd3ZWJzaXRlJ1xuXHR9KVxuXG5cdC8qKlxuXHQgKiBSZXRvcm5hIGxhIHVybCBkZSBsYXMgaW1hZ2VuZXMgZGUgbG9zIGJhbm5lcnNcblx0ICogQHJldHVybnMgXG5cdCAqL1xuXHRwdWJsaWMgbWVkaWFCYW5uZXJVcmwgPSAoKSA9PiB0aGlzLkFTU0VUU19VUkwgKyAodGhpcy5BU1NFVFNfVVJMID09IHRoaXMuYXBpQ29uc3RhbnRzLkFQSV9VUkwgPyAnbWVkaWEvJyA6ICcnKSArIFwiYmFubmVyLWltYWdlL1wiO1xuXHRcblx0bWVkaWFTdG9yZVVybCA9ICgpID0+IHRoaXMuQVNTRVRTX1VSTCArICh0aGlzLkFTU0VUU19VUkwgPT0gdGhpcy5hcGlDb25zdGFudHMuQVBJX1VSTCA/ICdtZWRpYS8nIDogJycpICsgXCJzdG9yZS1pbWFnZS9cIjtcblx0XG5cdC8qKlxuXHQgKiBSZXRvcm5hIGB0cnVlYCBzaSBsYSB2aXN0YSBlcyBtb2JpbGUsIGBmYWxzZWAgY2FzbyBjb250cmFyaW8uXG5cdCAqIEByZXR1cm5zIHtib29sZWFufVxuXHQgKi9cblx0cHVibGljIG1vYmlsZVNjcmVlbiA9ICgpOiBib29sZWFuID0+IHRoaXMud2luZG93ICYmIHRoaXMud2luZG93Py5pbm5lcldpZHRoIDwgNzUwIHx8IGZhbHNlO1xuXHQvKipcblx0ICogQ29udGllbmUgbG9zIHZhbG9yZXMgcGFyYSBsYSBtb25lZGEgYWN0dWFsXG5cdCAqL1xuXHRwdWJsaWMgY3VycmVuY3k6IEN1cnJlbmN5Q29uZmlnID0ge1xuXHRcdGNvZGU6ICdBUkcnLFxuXHRcdHN5bWJvbDogJyQnLFxuXHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEFycmVnbG8gZGUgdmFsb3JlcyB1c2Fkb3MgcGFyYSBlbCBwaXBlIGN1cnJlbmN5UHJpY2Vcblx0ICovXG5cdHB1YmxpYyBjdXJyZW5jeVR5cGVDb25maWc6IEN1cnJlbmN5Q29uZmlnW10gPSBbXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0VVUicsXG5cdFx0XHRzeW1ib2w6ICfigqwnLFxuXHRcdFx0cG9zaXRpb246ICdSaWdodCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2VcblxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ0FSRycsXG5cdFx0XHRzeW1ib2w6ICckJyxcblx0XHRcdHBvc2l0aW9uOiAnTGVmdCcsXG5cdFx0XHR3aXRob3V0RGVjaW1hbDogZmFsc2Vcblx0XHR9LFxuXHRcdHtcblx0XHRcdGNvZGU6ICdBUlMnLFxuXHRcdFx0c3ltYm9sOiAnJCcsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnVVNEJyxcblx0XHRcdHN5bWJvbDogJyQnLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BZRycsXG5cdFx0XHRzeW1ib2w6ICdHcy4nLFxuXHRcdFx0cG9zaXRpb246ICdMZWZ0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiBmYWxzZVxuXHRcdH0sXG5cdFx0e1xuXHRcdFx0Y29kZTogJ1BFTicsXG5cdFx0XHRzeW1ib2w6ICdTLycsXG5cdFx0XHRwb3NpdGlvbjogJ0xlZnQnLFxuXHRcdFx0d2l0aG91dERlY2ltYWw6IGZhbHNlXG5cdFx0fSxcblx0XHR7XG5cdFx0XHRjb2RlOiAnU0VLJyxcblx0XHRcdHN5bWJvbDogJ1NFSycsXG5cdFx0XHRwb3NpdGlvbjogJ1JpZ2h0Jyxcblx0XHRcdHdpdGhvdXREZWNpbWFsOiB0cnVlXG5cdFx0fSxcblx0XVxuXHQvKipcblx0ICogQ2FtYmlhIGxhIGNvbmZpZ3VyYWNpw7NuIGRlIGxhIG1vbmVkYS5cblx0ICogQHBhcmFtIGN1cnJlbmN5VHlwZUNvbmZpZyBBcnJlZ2xvIGNvbiBsYXMgZGlzdGludGFzIG1vbmVkYXMuXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3lUeXBlQ29uZmlnKGN1cnJlbmN5VHlwZUNvbmZpZzogQ3VycmVuY3lDb25maWdbXSkge1xuXHRcdHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnID0gY3VycmVuY3lUeXBlQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIEBwYXJhbSBjdXJyZW5jeVR5cGVGaW5kIERlZmluaXIgZWwgY29kZSBkZWwgdGlwbyBkZSBtb25lZGEgcXVlIHNlIHF1aWVyYSB1dGlsaXphci5cblx0ICogU2kgZWwgdGlwbyBlcyBDVVNUT00gc2UgdG9tYW4gbG9zIHZhbG9yZXMgZGVsIHNlZ3VuZG8gcGFyYW1ldHJvIGRvbmRlIHNlIHB1ZWRlIGRlZmluaXIgbGEgc2ltYm9sb2fDrWEgeSBwb3Nlc2nDs24gcXVlIHNlIHF1aWVyYS5cblx0ICogQHBhcmFtIGN1c3RvbVR5cGUgRm9ybWF0byBkZWwgcGFyw6FtZXRybyBlamVtcGxvIHsgY29kZTogJ0FSRycsIHN5bWJvbDogJyQnLCBwb3NpdGlvbjogJ0wnICwgd2l0aG91dERlY2ltYWxzOiBmYWxzZSB9ICxcblx0ICogdG9kYXMgbGFzIGtleSBzb24gb3BjaW9uYWxlcyB5IHBvciBkZWZlY3RvIHNlIHRvbWFuIGxvcyB2YWxvcmVzIGRlbCBlamVtcGxvLlxuXHQgKiBAcmV0dXJucyBzZSByZXRvcm5hIGxhIGNvbmZpZ3VyYWNpw7NuIHF1ZSBzZSBzZXRlbyBhIGxhIHByb3BpZWRhZCBjdXJyZW5jeSBkZWwgc2VydmljaW8uXG5cdCAqL1xuXHRwdWJsaWMgc2V0Q3VycmVuY3koY3VycmVuY3lUeXBlRmluZDogY3VycmVuY3lUeXBlLCBjdXN0b21UeXBlPzogQ3VycmVuY3lDb25maWcpOiBDdXJyZW5jeUNvbmZpZyB7XG5cdFx0dGhpcy5jdXJyZW5jeSA9IHRoaXMuY3VycmVuY3lUeXBlQ29uZmlnLmZpbmQoKGN0OiBDdXJyZW5jeUNvbmZpZykgPT4gY3QuY29kZSA9PSBjdXJyZW5jeVR5cGVGaW5kLnRvVXBwZXJDYXNlKCkpIHx8IHRoaXMuY3VycmVuY3lcblx0XHRjdXN0b21UeXBlICYmICh0aGlzLmN1cnJlbmN5ID0geyAuLi50aGlzLmN1cnJlbmN5LCAuLi5jdXN0b21UeXBlIH0pXG5cdFx0cmV0dXJuIHRoaXMuY3VycmVuY3k7XG5cdH07XG5cblxuXHRwdWJsaWMgbW9kaWZ5Q2hhbm5lbENvbmZpZyhjaGFubmVsQ29uZmlnOiBhbnkpIHtcblx0XHR0aGlzLl93aXNobGlzdFZpc2liaWxpdHkuc2V0U2hvd1dpc2hsaXN0KFxuXHRcdFx0dHlwZW9mIGNoYW5uZWxDb25maWc/Lndpc2hsaXN0RW5hYmxlZCA9PT0gJ2Jvb2xlYW4nXG5cdFx0XHRcdD8gY2hhbm5lbENvbmZpZy53aXNobGlzdEVuYWJsZWRcblx0XHRcdFx0OiB0eXBlb2YgY2hhbm5lbENvbmZpZz8uc2hvd1dpc2hsaXN0ID09PSAnYm9vbGVhbidcblx0XHRcdFx0XHQ/IGNoYW5uZWxDb25maWcuc2hvd1dpc2hsaXN0XG5cdFx0XHRcdFx0OiBmYWxzZVxuXHRcdCk7XG5cblx0XHRpZiAoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldENoYW5uZWwoY2hhbm5lbENvbmZpZy5jaGFubmVsIHx8IGNoYW5uZWxDb25maWcuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCAoY2hhbm5lbENvbmZpZy5sb2NhbGVzICYmIGNoYW5uZWxDb25maWcubG9jYWxlcy5jb2RlKSlcblx0XHRcdHRoaXMuYXBpQ29uc3RhbnRzLnNldExvY2FsZShjaGFubmVsQ29uZmlnLmxvY2FsZSB8fCBjaGFubmVsQ29uZmlnLmxvY2FsZXMuY29kZSlcblxuXHRcdGlmIChjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXHRcdFx0dGhpcy5zZXRDdXJyZW5jeShjaGFubmVsQ29uZmlnLmN1cnJlbmN5IHx8IGNoYW5uZWxDb25maWcuYmFzZUN1cnJlbmN5KVxuXG5cdFx0aWYgKGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3ICE9IG51bGwpIHtcblx0XHRcdHRoaXMuc2V0Q2hlY2tvdXRWaWV3KGNoYW5uZWxDb25maWcuY2hlY2tvdXRWaWV3IGFzIENoZWNrb3V0Vmlld1R5cGUpO1xuXHRcdH1cblxuXHRcdGlmICh0eXBlb2YgY2hhbm5lbENvbmZpZy51c2VQcm9kdWN0U2x1Z1JvdXRlID09PSAnYm9vbGVhbicpIHtcblx0XHRcdHRoaXMuc2V0VXNlUHJvZHVjdFNsdWdSb3V0ZShjaGFubmVsQ29uZmlnLnVzZVByb2R1Y3RTbHVnUm91dGUpO1xuXHRcdH1cblxuXHRcdHJldHVybiBjaGFubmVsQ29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCogQGRlc2NyaXB0aW9uIHNlIHV0aWxpemEgcGFyYSBjb25maWd1cmFyIHF1ZSBmaWx0cm9zIGRlbCB0aXBvIGBTb3J0RmlsdGVyYCBzZSBxdWllcmUgbW9zdHJhciBlbiBsYSB2aXN0YS5cblx0KiBTZSB1c2FuIGxvcyBjb2RpZ28gZGUgbG9zIGZpbHRyb3MgcGFyYSBpbmRpY2FyIGN1YWxlcyBzZSBkZWJlbiBtb3N0cmFyLlxuXHQqL1xuXHRwcml2YXRlIHNvcnRGaWx0ZXJzOiBzdHJpbmdbXSA9IFsncHJpY2UnLCAnb3JkZXItYWxwaCcsICdyZWNlbnQnXVxuXG5cdC8qKlxuXHQgKlxuXHQgKiBAcGFyYW0gZmlsdGVyc0NvZGUgYXJyZWdsbyBkZSBzdHJpbmdzIGNvbiBsb3MgY29kaWdvcyBkZSBsb3MgZmlsdHJvcy5cblx0ICogU2kgc2UgbGUgcGFzYSBlbCBwYXJhbWV0cm8gKiphbGwqKiBlc3RlIG1vc3RyYXJhIHRvZG9zLlxuXHQgKiBAZXhhbXBsZSBwcmljZSB8IG9yZGVyLWFscGggfCByZWNlbnQgfCB1cGRhdGUgfCBhbGxcblx0ICogQHJldHVybnNcblx0ICovXG5cdHNldFNvcnRGaWx0ZXJzID0gKGZpbHRlcnNDb2RlOiBzdHJpbmdbXSA9IFsnYWxsJ10pID0+IHRoaXMuc29ydEZpbHRlcnMgPSBmaWx0ZXJzQ29kZTtcblxuXHRnZXRTb3J0RmlsdGVycyA9ICgpID0+IHRoaXMuc29ydEZpbHRlcnM7XG5cblx0Ly8gQUJPVVQgUFJPRFVDVFMgXG5cdHByaXZhdGUgcHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogYm9vbGVhbiA9IGZhbHNlO1xuXHRzZXRQcm9kdWN0V2l0aFVuaXF1ZVZhcmlhbnQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50ID0gdmFsdWU7IH1cblx0Z2V0UHJvZHVjdFdpdGhVbmlxdWVWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5wcm9kdWN0c1dpdGhVbmlxdWVWYXJpYW50IH1cblxuXHQvLyBIYWJpbGl0YSBydXRhcyBkZSBwcm9kdWN0byBwb3Igc2x1ZyBkZSBmb3JtYSBvcHQtaW4gcG9yIGZyb250ZW5kL2NhbmFsLlxuXHRwcml2YXRlIHVzZVByb2R1Y3RTbHVnUm91dGU6IGJvb2xlYW4gPSBmYWxzZTtcblx0c2V0QnVsa0FkZEVuYWJsZWQodmFsdWU6IGJvb2xlYW4pIHsgdGhpcy5fY2FwYWJpbGl0aWVzLnNldEJ1bGtBZGQodmFsdWUpOyB9XG5cdGdldEJ1bGtBZGRFbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fY2FwYWJpbGl0aWVzLmJ1bGtBZGQoKSB9XG5cblx0c2V0VXNlUHJvZHVjdFNsdWdSb3V0ZSh2YWx1ZTogYm9vbGVhbikgeyB0aGlzLnVzZVByb2R1Y3RTbHVnUm91dGUgPSAhIXZhbHVlOyB9XG5cdGdldFVzZVByb2R1Y3RTbHVnUm91dGUoKSB7IHJldHVybiB0aGlzLnVzZVByb2R1Y3RTbHVnUm91dGU7IH1cblxuXHRzZXRDYXJ0UHJlcHJpbnRFbmFibGVkKHZhbHVlOiBib29sZWFuKSB7IHRoaXMuX2NhcGFiaWxpdGllcy5zZXRDYXJ0UHJlcHJpbnQodmFsdWUpOyB9XG5cdGdldENhcnRQcmVwcmludEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl9jYXBhYmlsaXRpZXMuY2FydFByZXByaW50KCk7IH1cblxuXHQvKipcblx0KiBAZGVzY3JpcHRpb24gZXN0YSB2YXJpYWJsZSBzZSB1dGlsaXphIHBhcmEgY29uZmlndXJhciBsb3MgcGFyYW1ldHJvcyBjdWFuZG8gc2UgZGVzZWEgbW9zdHJhclxuXHQqIHZhcmlhbnRlcyBlbCBsaXN0YWRvIGRlIHByb2R1Y3Rvcy5cblx0KiBAcGFyYW0ge3N0cmluZ310eXBlIHRpcG8gZGUgb3B0aW9uc1xuXHQqIEBwYXJhbSB7c3RyaW5nfWNvZGUgY29kaWdvIGRlIG9wdGlvbnNcblx0KiBAcGFyYW0ge2Jvb2xlYW59ZGVmYXVsdEZpcnN0T3B0aW9uIGB0cnVlYCB0b21hIGVsIHByaW1lciBvcHRpb24gZGVsIHByb2R1Y3RvIGVuIGdlbmVyYWxcblx0KiBAcGFyYW0ge2Jvb2xlYW59Y2hlY2tJZlN0b2NrIGB0cnVlYCBzZSByZWFsaXphIHVuIGNoZXF1ZW8gZGUgc2kgbGEgdmFyaWFudGUgdGllbmUgc3RvY2sgcGFyYSBtb3N0cmFybGFcblx0KiBAZXhhbXBsZSAgYGBgamF2YXNjcmlwdFxuXHQqIHtcblx0ICAgdHlwZTogJ2NvbG9yJyxcblx0ICAgY29kZTogJ2NvbG9yJyxcblx0ICAgZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSAsXG5cdCAgIGNoZWNrSWZTdG9jazp0cnVlXG5cdCAgIH0gYGBgXG5cdCovXG5cdHByaXZhdGUgcGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudDogUGFyYW1zUHJvZHVjdHNXaXRoVW5pcXVlVmFyaWFudCA9IHtcblx0XHR0eXBlOiAnY29sb3InLFxuXHRcdGNvZGU6ICdjb2xvcicsXG5cdFx0ZGVmYXVsdEZpcnN0T3B0aW9uOiBmYWxzZSxcblx0XHRjaGVja0lmU3RvY2s6IHRydWVcblx0fVxuXG5cdHNldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAodmFsdWU6IFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQpID0+IHtcblx0XHR0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSB7XG5cdFx0XHQuLi50aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQsXG5cdFx0XHQuLi52YWx1ZVxuXHRcdH1cblx0fVxuXG5cdGdldFBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnQgPSAoKSA9PiB0aGlzLnBhcmFtc1Byb2R1Y3RzV2l0aFVuaXF1ZVZhcmlhbnRcblx0XG5cdHB1YmxpYyBnZXRDaGFubmVsKCl7XG5cdFx0cmV0dXJuIHRoaXMuYXBpQ29uc3RhbnRzLkNIQU5ORUw7XG5cdH1cblxuXHRwdWJsaWMgZm9ybV9zZW5kZXI6IGJvb2xlYW4gPSBmYWxzZTtcblxuXHRzZXRDdXJyZW50Um91dGVUeXBlKHR5cGU6IHN0cmluZyB8IG51bGwpIHtcblx0XHR0aGlzLmN1cnJlbnRSb3V0ZVR5cGUgPSB0eXBlO1xuXHR9XG5cblx0Z2V0Q3VycmVudFJvdXRlVHlwZSgpOiBzdHJpbmcgfCBudWxsIHtcblx0XHRyZXR1cm4gdGhpcy5jdXJyZW50Um91dGVUeXBlO1xuXHR9XG5cblx0LyoqXG5cdCAqIE9idGllbmUgbGEgdmlzdGEgZGUgY2hlY2tvdXQgY29uZmlndXJhZGEgKGxlZ2FjeSBvIHNpbmdsZSkuXG5cdCAqL1xuXHRwdWJsaWMgZ2V0Q2hlY2tvdXRWaWV3KCk6IENoZWNrb3V0Vmlld1R5cGUge1xuXHRcdHJldHVybiB0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QudmFsdWU7XG5cdH1cblxuXHQvKipcblx0ICogQ2FtYmlhIGxhIHZpc3RhIGRlIGNoZWNrb3V0IChzaW4gcGVyc2lzdGVuY2lhIGVuIHN0b3JhZ2UpLlxuXHQgKi9cblx0cHJpdmF0ZSBzZXRDaGVja291dFZpZXcodmlldzogQ2hlY2tvdXRWaWV3VHlwZSk6IHZvaWQge1xuXHRcdGNvbnN0IG5vcm1hbGl6ZWQgPSB0aGlzLm5vcm1hbGl6ZUNoZWNrb3V0Vmlldyh2aWV3KTtcblx0XHR0aGlzLmNoZWNrb3V0Vmlld1N1YmplY3QubmV4dChub3JtYWxpemVkKTtcblx0fVxuXG5cdHByaXZhdGUgbm9ybWFsaXplQ2hlY2tvdXRWaWV3KHZpZXc6IHN0cmluZyB8IENoZWNrb3V0Vmlld1R5cGUgfCBudWxsIHwgdW5kZWZpbmVkKTogQ2hlY2tvdXRWaWV3VHlwZSB7XG5cdFx0cmV0dXJuIHZpZXcgPT09ICdzaW5nbGUnID8gJ3NpbmdsZScgOiAnbGVnYWN5Jztcblx0fVxufVxuIl19