@rededor/site-front-end-lib 0.0.72 → 0.0.74

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 (147) hide show
  1. package/README.md +83 -83
  2. package/esm2022/lib/components/algolia/algolia.component.mjs +154 -0
  3. package/esm2022/lib/components/banner/content-banner/content-banner.component.mjs +31 -0
  4. package/esm2022/lib/components/breadcrumbs/breadcrumbs.component.mjs +119 -0
  5. package/esm2022/lib/components/cards/card-unidade-planos-convenios/card-unidade-planos-convenios.component.mjs +60 -0
  6. package/esm2022/lib/components/cards/expandable-card/expandable-card.component.mjs +65 -0
  7. package/esm2022/lib/components/cta-wrapper/cta-wrapper.component.mjs +69 -0
  8. package/esm2022/lib/components/error/error-service/error.service.mjs +17 -0
  9. package/esm2022/lib/components/error/error.component.mjs +152 -0
  10. package/esm2022/lib/components/filter-letter-and-terms/filter-letter-and-terms.component.mjs +30 -0
  11. package/esm2022/lib/components/filters/filter-planos-convenios/filter-planos-convenios.component.mjs +122 -0
  12. package/esm2022/lib/components/footer/components/footer-disclaimer/footer-disclaimer.component.mjs +33 -0
  13. package/esm2022/lib/components/footer/components/footer-menu/footer-menu.component.mjs +28 -0
  14. package/esm2022/lib/components/footer/components/footer-menu-item/footer-menu-item.component.mjs +39 -0
  15. package/esm2022/lib/components/footer/components/footer-social-medias/footer-social-medias.component.mjs +33 -0
  16. package/esm2022/lib/components/footer/footer.component.mjs +50 -0
  17. package/esm2022/lib/components/footer/helpers/footerTheme.func.mjs +70 -0
  18. package/esm2022/lib/components/footer/models/FooterTheme.model.mjs +2 -0
  19. package/esm2022/lib/components/header/components/header-action-menu/header-action-menu.component.mjs +28 -0
  20. package/esm2022/lib/components/header/components/header-aux-menu/header-aux-menu.component.mjs +12 -0
  21. package/esm2022/lib/components/header/components/header-aux-menu-container/header-aux-menu-container.component.mjs +17 -0
  22. package/esm2022/lib/components/header/components/header-aux-menu-item/header-aux-menu-item.component.mjs +47 -0
  23. package/esm2022/lib/components/header/components/header-aux-menu-item-dropdown/header-aux-menu-item-dropdown.component.mjs +23 -0
  24. package/esm2022/lib/components/header/components/header-logo/header-logo.component.mjs +32 -0
  25. package/esm2022/lib/components/header/components/header-main-menu/header-main-menu.component.mjs +11 -0
  26. package/esm2022/lib/components/header/components/header-main-menu-item/header-main-menu-item.component.mjs +72 -0
  27. package/esm2022/lib/components/header/components/header-main-menu-item-dropdown/header-main-menu-item-dropdown.component.mjs +88 -0
  28. package/esm2022/lib/components/header/components/header-side-menu/header-side-menu.component.mjs +21 -0
  29. package/esm2022/lib/components/header/components/header-side-menu-item/header-side-menu-item.component.mjs +52 -0
  30. package/esm2022/lib/components/header/header.component.mjs +87 -0
  31. package/esm2022/lib/components/header/helpers/headerTheme.func.mjs +134 -0
  32. package/esm2022/lib/components/header/models/HeaderTheme.model.mjs +2 -0
  33. package/esm2022/lib/components/header/services/header.service.mjs +43 -0
  34. package/esm2022/lib/components/image/image.component.mjs +61 -0
  35. package/esm2022/lib/components/index.mjs +42 -0
  36. package/esm2022/lib/components/load-screen/load-screen.component.mjs +23 -0
  37. package/esm2022/lib/components/overlay/overlay.component.mjs +19 -0
  38. package/esm2022/lib/components/page-header/page-header.component.mjs +41 -0
  39. package/esm2022/lib/components/page-template-sidebar/page-template-sidebar.component.mjs +33 -0
  40. package/esm2022/lib/components/search/search.component.mjs +145 -0
  41. package/esm2022/lib/components/section-navigation/section-navigation.component.mjs +146 -0
  42. package/esm2022/lib/components/side-ctas/components/side-ctas-bottom/side-ctas-bottom.component.mjs +41 -0
  43. package/esm2022/lib/components/side-ctas/components/side-ctas-right-bottom/side-ctas-right-bottom.component.mjs +40 -0
  44. package/esm2022/lib/components/side-ctas/components/side-ctas-right-middle/side-ctas-right-middle.component.mjs +40 -0
  45. package/esm2022/lib/components/side-ctas/components/side-ctas-right-top/side-ctas-right-top.component.mjs +11 -0
  46. package/esm2022/lib/components/side-ctas/models/SideCta.model.mjs +2 -0
  47. package/esm2022/lib/components/side-ctas/side-ctas.component.mjs +23 -0
  48. package/esm2022/lib/components/whatsapp/whatsapp.component.mjs +54 -0
  49. package/esm2022/lib/directives/index.mjs +4 -0
  50. package/esm2022/lib/directives/rdsite-click-outside/rdsite-click-outside.directive.mjs +29 -0
  51. package/esm2022/lib/directives/rdsite-link/rdsite-link.directive.mjs +175 -0
  52. package/esm2022/lib/directives/rdsite-phone-modal/rdsite-phone-modal.directive.mjs +52 -0
  53. package/esm2022/lib/enums/EnumDoencaTaxonomy.enum.mjs +11 -0
  54. package/esm2022/lib/enums/EnumError.enum.mjs +6 -0
  55. package/esm2022/lib/enums/EnumThemes.enum.mjs +8 -0
  56. package/esm2022/lib/enums/Estados.enum.mjs +31 -0
  57. package/esm2022/lib/enums/IconCuraDefaultType.enum.mjs +121 -0
  58. package/esm2022/lib/enums/ImageMimeType.enum.mjs +7 -0
  59. package/esm2022/lib/enums/RdsiteModalComponentStyle.enum.mjs +13 -0
  60. package/esm2022/lib/enums/RdsiteModalDrawerComponentStyle.enum.mjs +7 -0
  61. package/esm2022/lib/enums/UnidadeCoverageType.enum.mjs +7 -0
  62. package/esm2022/lib/enums/index.mjs +10 -0
  63. package/esm2022/lib/helpers/check-safari-agent.func.mjs +7 -0
  64. package/esm2022/lib/helpers/formatPhone.func.mjs +29 -0
  65. package/esm2022/lib/helpers/getSiteUrl.func.mjs +11 -0
  66. package/esm2022/lib/helpers/index.mjs +8 -0
  67. package/esm2022/lib/helpers/mediaQueries.mjs +11 -0
  68. package/esm2022/lib/helpers/removeDuplicateObjectsFromArray.func.mjs +5 -0
  69. package/esm2022/lib/helpers/removeDuplicateValuesFromArray.func.mjs +5 -0
  70. package/esm2022/lib/helpers/removeHtmlTags.func.mjs +6 -0
  71. package/esm2022/lib/helpers/toQueryParams.func.mjs +8 -0
  72. package/esm2022/lib/json/unidades.json +10179 -0
  73. package/esm2022/lib/json/unidadesOnco.json +4936 -0
  74. package/esm2022/lib/models/algolia-search-api.model.mjs +2 -0
  75. package/esm2022/lib/models/algolia.model.mjs +2 -0
  76. package/esm2022/lib/models/breadcrumbs/breadcrumbs-items.model.mjs +2 -0
  77. package/esm2022/lib/models/breadcrumbs/breadcrumbs-json-item.model.mjs +2 -0
  78. package/esm2022/lib/models/centro-estudos-backend.model.mjs +2 -0
  79. package/esm2022/lib/models/content-banner.model.mjs +2 -0
  80. package/esm2022/lib/models/cta-wrapper.model.mjs +2 -0
  81. package/esm2022/lib/models/doenca-backend.model.mjs +2 -0
  82. package/esm2022/lib/models/doenca-taxonomy.model.mjs +2 -0
  83. package/esm2022/lib/models/especialidade-backend.model.mjs +2 -0
  84. package/esm2022/lib/models/exame-backend.model.mjs +2 -0
  85. package/esm2022/lib/models/filters/filter-planos-convenios.model.mjs +2 -0
  86. package/esm2022/lib/models/images/rdsite-image.model.mjs +2 -0
  87. package/esm2022/lib/models/medico-cv.model.mjs +2 -0
  88. package/esm2022/lib/models/menu-de-unidade.model.mjs +2 -0
  89. package/esm2022/lib/models/menu-item.model.mjs +2 -0
  90. package/esm2022/lib/models/privacy-tools/privacy-tools.model.mjs +2 -0
  91. package/esm2022/lib/models/rdsl-cobertura.model.mjs +2 -0
  92. package/esm2022/lib/models/rdsl-convenio.model.mjs +2 -0
  93. package/esm2022/lib/models/rdsl-especialidade.model.mjs +2 -0
  94. package/esm2022/lib/models/rdsl-planos.model.mjs +2 -0
  95. package/esm2022/lib/models/rdsl-post-category.model.mjs +2 -0
  96. package/esm2022/lib/models/rdsl-unidade.model.mjs +2 -0
  97. package/esm2022/lib/models/section-navigation.model.mjs +2 -0
  98. package/esm2022/lib/models/seo/seo-data.model.mjs +2 -0
  99. package/esm2022/lib/models/seo/seo-unidade.model.mjs +2 -0
  100. package/esm2022/lib/models/social-meta-properties.model.mjs +2 -0
  101. package/esm2022/lib/models/wordpress/WpResponse.model.mjs +2 -0
  102. package/esm2022/lib/models/wordpress/category/wpCategory.model.mjs +2 -0
  103. package/esm2022/lib/models/wordpress/general/content.model.mjs +2 -0
  104. package/esm2022/lib/models/wordpress/general/excerpt.model.mjs +2 -0
  105. package/esm2022/lib/models/wordpress/general/featuredMedia.model.mjs +2 -0
  106. package/esm2022/lib/models/wordpress/general/guid.model.mjs +2 -0
  107. package/esm2022/lib/models/wordpress/general/index.mjs +11 -0
  108. package/esm2022/lib/models/wordpress/general/links.model.mjs +2 -0
  109. package/esm2022/lib/models/wordpress/general/meta.model.mjs +2 -0
  110. package/esm2022/lib/models/wordpress/general/title.model.mjs +2 -0
  111. package/esm2022/lib/models/wordpress/general/yoastData.model.mjs +2 -0
  112. package/esm2022/lib/models/wordpress/general/yoastHeadJson.model.mjs +2 -0
  113. package/esm2022/lib/models/wordpress/general/yoastMeta.model.mjs +2 -0
  114. package/esm2022/lib/models/wordpress/page/page.model.mjs +2 -0
  115. package/esm2022/lib/models/wordpress/post/post.model.mjs +2 -0
  116. package/esm2022/lib/models/wordpress/unidade/wp-unidade-onco.model.mjs +2 -0
  117. package/esm2022/lib/models/wordpress/unidade/wp-unidade-site-detalhe.model.mjs +2 -0
  118. package/esm2022/lib/models/wordpress/unidade/wp-unidade-site.model.mjs +2 -0
  119. package/esm2022/lib/pipes/index.mjs +2 -0
  120. package/esm2022/lib/pipes/phone/phone.pipe.mjs +18 -0
  121. package/esm2022/lib/services/algolia/algolia.service.mjs +37 -0
  122. package/esm2022/lib/services/algolia-search-api/algolia-search-api.service.mjs +71 -0
  123. package/esm2022/lib/services/cura/cura.service.mjs +111 -0
  124. package/esm2022/lib/services/http-client/http-client.service.mjs +55 -0
  125. package/esm2022/lib/services/index.mjs +17 -0
  126. package/esm2022/lib/services/log/log.service.mjs +46 -0
  127. package/esm2022/lib/services/modal/modal.service.mjs +56 -0
  128. package/esm2022/lib/services/modal-drawer/modal-drawer.service.mjs +42 -0
  129. package/esm2022/lib/services/ngu-carousel/ngu-carousel.service.mjs +81 -0
  130. package/esm2022/lib/services/phone/phone.service.mjs +28 -0
  131. package/esm2022/lib/services/privacy-tools/privacy-tools.service.mjs +92 -0
  132. package/esm2022/lib/services/scroll-service/scroll-service.service.mjs +41 -0
  133. package/esm2022/lib/services/seo/seo.service.mjs +483 -0
  134. package/esm2022/lib/services/server-response/server-response.service.mjs +85 -0
  135. package/esm2022/lib/services/site-back-end/site-back-end.service.mjs +151 -0
  136. package/esm2022/lib/services/ssr-loading/ssr-loading.service.mjs +48 -0
  137. package/esm2022/lib/services/transfer-state/transfer-state.service.mjs +60 -0
  138. package/esm2022/lib/tokens/CuraApi.mjs +3 -0
  139. package/esm2022/lib/tokens/LibConfig.mjs +4 -0
  140. package/esm2022/lib/tokens/express.tokens.mjs +4 -0
  141. package/esm2022/public-api.mjs +20 -0
  142. package/esm2022/rededor-site-front-end-lib.mjs +5 -0
  143. package/fesm2022/rededor-site-front-end-lib.mjs +84 -77
  144. package/fesm2022/rededor-site-front-end-lib.mjs.map +1 -1
  145. package/lib/services/site-back-end/site-back-end.service.d.ts +1 -0
  146. package/package.json +1 -1
  147. package/styles/_breakpoints.scss +5 -5
@@ -0,0 +1,41 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as i0 from "@angular/core";
4
+ export class ScrollService {
5
+ constructor() {
6
+ this.document = inject(DOCUMENT);
7
+ }
8
+ scrollToElement(elementId, offset = 0, smooth = true) {
9
+ const element = this.document.getElementById(elementId);
10
+ if (!element) {
11
+ console.warn(`Elemento com id "${elementId}" não encontrado`);
12
+ return false;
13
+ }
14
+ try {
15
+ const titleElement = element.querySelector('h1, h2, h3, h4, h5, h6') || element;
16
+ const titleRect = titleElement.getBoundingClientRect();
17
+ const titlePosition = titleRect.top + window.scrollY;
18
+ const stickyHeaderHeight = this.document.querySelector('nav')?.getBoundingClientRect().height || 0;
19
+ const extraMargin = 16;
20
+ const offsetPosition = titlePosition - offset - stickyHeaderHeight - extraMargin;
21
+ window.scrollTo({
22
+ top: offsetPosition,
23
+ behavior: smooth ? 'smooth' : 'auto',
24
+ });
25
+ return true;
26
+ }
27
+ catch (error) {
28
+ console.error('Erro ao fazer scroll para o elemento:', error);
29
+ return false;
30
+ }
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ScrollService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
33
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ScrollService, providedIn: 'root' }); }
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ScrollService, decorators: [{
36
+ type: Injectable,
37
+ args: [{
38
+ providedIn: 'root',
39
+ }]
40
+ }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXNlcnZpY2Uuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3NpdGUtZnJvbnQtZW5kLWxpYi9zcmMvbGliL3NlcnZpY2VzL3Njcm9sbC1zZXJ2aWNlL3Njcm9sbC1zZXJ2aWNlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOztBQUszQyxNQUFNLE9BQU8sYUFBYTtJQUgxQjtRQUlVLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0ErQnJDO0lBN0JDLGVBQWUsQ0FBQyxTQUFpQixFQUFFLE1BQU0sR0FBRyxDQUFDLEVBQUUsTUFBTSxHQUFHLElBQUk7UUFDMUQsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFeEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2IsT0FBTyxDQUFDLElBQUksQ0FBQyxvQkFBb0IsU0FBUyxrQkFBa0IsQ0FBQyxDQUFDO1lBQzlELE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsd0JBQXdCLENBQUMsSUFBSSxPQUFPLENBQUM7WUFDaEYsTUFBTSxTQUFTLEdBQUcsWUFBWSxDQUFDLHFCQUFxQixFQUFFLENBQUM7WUFDdkQsTUFBTSxhQUFhLEdBQUcsU0FBUyxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDO1lBRXJELE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUscUJBQXFCLEVBQUUsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDO1lBQ25HLE1BQU0sV0FBVyxHQUFHLEVBQUUsQ0FBQztZQUV2QixNQUFNLGNBQWMsR0FBRyxhQUFhLEdBQUcsTUFBTSxHQUFHLGtCQUFrQixHQUFHLFdBQVcsQ0FBQztZQUVqRixNQUFNLENBQUMsUUFBUSxDQUFDO2dCQUNkLEdBQUcsRUFBRSxjQUFjO2dCQUNuQixRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLE1BQU07YUFDckMsQ0FBQyxDQUFDO1lBRUgsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sQ0FBQyxLQUFLLENBQUMsdUNBQXVDLEVBQUUsS0FBSyxDQUFDLENBQUM7WUFDOUQsT0FBTyxLQUFLLENBQUM7UUFDZixDQUFDO0lBQ0gsQ0FBQzsrR0EvQlUsYUFBYTttSEFBYixhQUFhLGNBRlosTUFBTTs7NEZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290JyxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNjcm9sbFNlcnZpY2Uge1xyXG4gIHByaXZhdGUgZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpO1xyXG5cclxuICBzY3JvbGxUb0VsZW1lbnQoZWxlbWVudElkOiBzdHJpbmcsIG9mZnNldCA9IDAsIHNtb290aCA9IHRydWUpOiBib29sZWFuIHtcclxuICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsZW1lbnRJZCk7XHJcblxyXG4gICAgaWYgKCFlbGVtZW50KSB7XHJcbiAgICAgIGNvbnNvbGUud2FybihgRWxlbWVudG8gY29tIGlkIFwiJHtlbGVtZW50SWR9XCIgbsOjbyBlbmNvbnRyYWRvYCk7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICB0cnkge1xyXG4gICAgICBjb25zdCB0aXRsZUVsZW1lbnQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxLCBoMiwgaDMsIGg0LCBoNSwgaDYnKSB8fCBlbGVtZW50O1xyXG4gICAgICBjb25zdCB0aXRsZVJlY3QgPSB0aXRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XHJcbiAgICAgIGNvbnN0IHRpdGxlUG9zaXRpb24gPSB0aXRsZVJlY3QudG9wICsgd2luZG93LnNjcm9sbFk7XHJcblxyXG4gICAgICBjb25zdCBzdGlja3lIZWFkZXJIZWlnaHQgPSB0aGlzLmRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ25hdicpPy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQgfHwgMDtcclxuICAgICAgY29uc3QgZXh0cmFNYXJnaW4gPSAxNjtcclxuXHJcbiAgICAgIGNvbnN0IG9mZnNldFBvc2l0aW9uID0gdGl0bGVQb3NpdGlvbiAtIG9mZnNldCAtIHN0aWNreUhlYWRlckhlaWdodCAtIGV4dHJhTWFyZ2luO1xyXG5cclxuICAgICAgd2luZG93LnNjcm9sbFRvKHtcclxuICAgICAgICB0b3A6IG9mZnNldFBvc2l0aW9uLFxyXG4gICAgICAgIGJlaGF2aW9yOiBzbW9vdGggPyAnc21vb3RoJyA6ICdhdXRvJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICByZXR1cm4gdHJ1ZTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm8gYW8gZmF6ZXIgc2Nyb2xsIHBhcmEgbyBlbGVtZW50bzonLCBlcnJvcik7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIl19
@@ -0,0 +1,483 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { DOCUMENT } from '@angular/common';
3
+ import * as he from 'he';
4
+ import { getSiteUrl, removeHtmlTags } from '../../helpers';
5
+ import { LIB_CONFIG } from '../../tokens/LibConfig';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "@angular/platform-browser";
8
+ import * as i2 from "@angular/common";
9
+ export class SeoService {
10
+ constructor(title, meta, location, libConfig, document) {
11
+ this.title = title;
12
+ this.meta = meta;
13
+ this.location = location;
14
+ this.libConfig = libConfig;
15
+ this.document = document;
16
+ this.separator = ' - ';
17
+ this.defaultTitle = 'Rede D’Or';
18
+ this.sameAs = [
19
+ 'https://www.facebook.com/rededor/',
20
+ 'https://www.instagram.com/rededor_oficial/',
21
+ 'https://www.linkedin.com/company/rededor-saoluiz',
22
+ 'https://twitter.com/rededor',
23
+ ];
24
+ this.twitterUser = '@rededor';
25
+ this.jsonTagId = 'seoJSON';
26
+ this.breadcrumbsJsonTagId = 'breadcrumbsJSON';
27
+ this.unidade = null;
28
+ this.unidadeName = '';
29
+ this.unidadePath = '';
30
+ this.unidadeSlug = '';
31
+ }
32
+ setFullSeo(data) {
33
+ this.setTitle(data.title.text, !!data.title.sub);
34
+ this.setDescription(data.description);
35
+ this.setCanonicalHref(data.canonical);
36
+ this.setPageJson();
37
+ this.setSocialTags(data.socialTags);
38
+ }
39
+ /**
40
+ * Define tag description da página
41
+ * @param content conteúdo da descrição <string>
42
+ */
43
+ setDescription(content) {
44
+ const descTag = this.meta.getTag("name='description'");
45
+ if (content) {
46
+ content = he.decode(content);
47
+ content = removeHtmlTags(content);
48
+ }
49
+ else {
50
+ content = '';
51
+ }
52
+ this.activeDescription = content;
53
+ const tagContent = { name: 'description', content };
54
+ if (descTag) {
55
+ this.meta.updateTag(tagContent);
56
+ }
57
+ else {
58
+ this.meta.addTag(tagContent);
59
+ }
60
+ return this;
61
+ }
62
+ /**
63
+ * Define meta tags para a página
64
+ * @param tag nome da tag meta
65
+ * @param content conteúdo da tag meta
66
+ * @param type tipo de tag meta
67
+ */
68
+ setMetaTag(tag, content, type = 'name') {
69
+ const metatag = this.meta.getTag(`${type}='${tag}'`);
70
+ content = he.decode(content);
71
+ content = removeHtmlTags(content);
72
+ const tagContent = {
73
+ [type]: tag,
74
+ content,
75
+ };
76
+ if (!metatag) {
77
+ this.meta.addTag(tagContent);
78
+ }
79
+ else {
80
+ this.meta.updateTag(tagContent);
81
+ }
82
+ return this;
83
+ }
84
+ /**
85
+ * Remove meta tags da página
86
+ * @param tag nome da tag meta
87
+ * @param content conteúdo da tag meta
88
+ * @param attr atributo da tag meta
89
+ * @param type tipo de tag meta
90
+ */
91
+ removeTag(tag, content, attr, type = 'name') {
92
+ const metatag = this.meta.getTag(`${type}='${tag}'`);
93
+ if (metatag) {
94
+ this.meta.removeTag(`${attr}=${content}`);
95
+ }
96
+ return this;
97
+ }
98
+ /**
99
+ * Define meta tags para Facebook
100
+ * @param title título para o facebook
101
+ * @param description descrição para o facebook
102
+ * @param url url para definição do facebook
103
+ * @param img imagem para definição no facebook
104
+ */
105
+ setMetaFacebook(title, description, url, img = null) {
106
+ this.setMetaTag('og:url', url, 'property');
107
+ this.setMetaTag('og:title', title, 'property');
108
+ this.setMetaTag('og:description', description, 'property');
109
+ this.setMetaTag('og:type', 'website', 'property');
110
+ this.setMetaTag('og:image', img ?? '', 'property');
111
+ }
112
+ /**
113
+ * Define meta tags para Twitter
114
+ * @param title título para o twitter
115
+ * @param description descrição para o twitter
116
+ * @param url url para o twitter
117
+ * @param img imagem para definição no twitter
118
+ */
119
+ setMetaTwitter(title, description, url, img = null) {
120
+ this.setMetaTag('twitter:site', url, 'name');
121
+ this.setMetaTag('twitter:title', title, 'name');
122
+ this.setMetaTag('twitter:description', description, 'name');
123
+ this.setMetaTag('twitter:image', img ?? '', 'name');
124
+ }
125
+ /**
126
+ * Define tags de redes sociais (Twitter e Open Graph)
127
+ * @param properties
128
+ */
129
+ setSocialTags(properties) {
130
+ const pagePath = this.location.path();
131
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
132
+ let defaultProperties = {
133
+ twitterCard: 'summary',
134
+ twitterSite: this.twitterUser,
135
+ type: 'website',
136
+ title: this.getTitle(),
137
+ description: this.activeDescription || '',
138
+ url: `${siteurl}${pagePath}`,
139
+ image: this.libConfig?.logoPath ? `${siteurl}${this.libConfig.logoPath}` : 'https://www.rededorsaoluiz.com.br/assets/imgs/logo-rededor-blue.png',
140
+ };
141
+ if (properties) {
142
+ defaultProperties = { ...defaultProperties, ...properties };
143
+ }
144
+ this.setMetaTag('twitter:card', defaultProperties.twitterCard || '', 'name')
145
+ .setMetaTag('twitter:site', defaultProperties.twitterSite || '', 'name')
146
+ .setMetaTag('og:type', defaultProperties.type || '', 'property')
147
+ .setMetaTag('og:title', defaultProperties.title || '', 'property')
148
+ .setMetaTag('og:description', defaultProperties.description || '', 'property')
149
+ .setMetaTag('og:url', defaultProperties.url || '', 'property')
150
+ .setMetaTag('og:image', defaultProperties.image || '', 'property');
151
+ return this;
152
+ }
153
+ /**
154
+ * Define título da página
155
+ * @param title título da página <string>
156
+ * @param sub Se é subsite acrescenta unidade <boolean>
157
+ */
158
+ setTitle(title, sub = false) {
159
+ if (title && title !== '') {
160
+ title = he.decode(title);
161
+ title = removeHtmlTags(title);
162
+ if (sub) {
163
+ title = he.decode(`${title}${this.separator}${this.unidadeName}`);
164
+ }
165
+ this.title.setTitle(title);
166
+ }
167
+ return this;
168
+ }
169
+ /** Obtem título atual da página */
170
+ getTitle() {
171
+ return this.title.getTitle();
172
+ }
173
+ set404Title(component = 'Default Component') {
174
+ if (component && component !== '') {
175
+ component = he.decode(component);
176
+ component = removeHtmlTags(component);
177
+ if (this.unidadeName) {
178
+ component = he.decode(`${component}${this.separator}${this.unidadeName}`);
179
+ }
180
+ }
181
+ const title = `Erro 404 - ${component} - ${this.libConfig?.siteName} - ${this.location.path()}`;
182
+ this.title.setTitle(title);
183
+ return this;
184
+ }
185
+ set500Title(component = 'Default Component') {
186
+ if (component && component !== '') {
187
+ component = he.decode(component);
188
+ component = removeHtmlTags(component);
189
+ if (this.unidadeName) {
190
+ component = he.decode(`${component}${this.separator}${this.unidadeName}`);
191
+ }
192
+ }
193
+ const title = `Erro 500 - ${component} - ${this.libConfig?.siteName} - ${this.location.path()}`;
194
+ this.title.setTitle(title);
195
+ return this;
196
+ }
197
+ /** Cria tag script para JSON de breadcrumbs */
198
+ createBreadcrumbsJSONTag() {
199
+ const tag = this.document.createElement('script');
200
+ tag.id = this.breadcrumbsJsonTagId;
201
+ tag.type = 'application/ld+json';
202
+ this.document.head.appendChild(tag);
203
+ this.breadcrumbsJsonTag = tag;
204
+ return tag;
205
+ }
206
+ /** Retorna tag para script json de breadcrumbs ou cria se não houver. */
207
+ getBreadcrumbsJSONTag() {
208
+ const elements = this.document.head.children;
209
+ let i;
210
+ for (i = 0; i < elements.length; i++) {
211
+ const elem = elements[i];
212
+ if (elem && elem.id === this.breadcrumbsJsonTagId) {
213
+ return elem;
214
+ }
215
+ }
216
+ return this.createBreadcrumbsJSONTag();
217
+ }
218
+ /** Define o JSON de breadcrumbs da página */
219
+ setBreadcrumbsJson(items) {
220
+ this.breadcrumbsJsonTag = this.getBreadcrumbsJSONTag();
221
+ const json = {
222
+ '@context': 'http://schema.org',
223
+ '@type': 'BreadcrumbList',
224
+ itemListElement: this.getJsonBreadcrumbItems(items),
225
+ };
226
+ this.breadcrumbsJsonTag.innerHTML = JSON.stringify(json);
227
+ return this;
228
+ }
229
+ /** Converte itens do breadcrumb em itens do JSON */
230
+ getJsonBreadcrumbItems(items) {
231
+ const jsonItems = [
232
+ {
233
+ '@type': 'ListItem',
234
+ position: 1,
235
+ item: { '@id': this.getBreadcrumbItemUrl(['/']), name: he.encode('Página Inicial') },
236
+ },
237
+ ];
238
+ items.forEach((item, i) => {
239
+ const jsonItem = {
240
+ '@type': 'ListItem',
241
+ position: i + 2,
242
+ item: { '@id': this.getBreadcrumbItemUrl(item?.url || []), name: he.encode(item.label) },
243
+ };
244
+ jsonItems.push(jsonItem);
245
+ });
246
+ return jsonItems;
247
+ }
248
+ /**
249
+ * Monta a url do item de breadcrumb proveniente do array de urls
250
+ * ou do caminho da própria página, conforme caso do último item.
251
+ */
252
+ getBreadcrumbItemUrl(url) {
253
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
254
+ if (!url || url.length <= 0) {
255
+ const pagePath = this.location.path();
256
+ return `${siteurl}${pagePath}`;
257
+ }
258
+ url = url.filter((u) => u !== this.unidadePath);
259
+ const unidadePath = this.getUnidadePath();
260
+ const fullPath = `${unidadePath}/${url.join('/').replace(/^\/?/, '')}`;
261
+ return `${siteurl}${fullPath}`.replace(/\/$/, '');
262
+ }
263
+ /** Cria tag script para o JSON de SEO */
264
+ createJSONTag() {
265
+ const tag = this.document.createElement('script');
266
+ tag.id = this.jsonTagId;
267
+ tag.type = 'application/ld+json';
268
+ this.document.head.appendChild(tag);
269
+ this.jsonTag = tag;
270
+ return tag;
271
+ }
272
+ /** Retorna tag para script json de breadcrumbs ou cria se não houver. */
273
+ getJSONTag() {
274
+ const elements = this.document.head.children;
275
+ let i;
276
+ for (i = 0; i < elements.length; i++) {
277
+ const elem = elements[i];
278
+ if (elem && elem.id === this.jsonTagId) {
279
+ return elem;
280
+ }
281
+ }
282
+ return this.createJSONTag();
283
+ }
284
+ /** Define JSON para SEO somente quando no servidor */
285
+ setPageJson() {
286
+ this.jsonTag = this.getJSONTag();
287
+ const graph = [this.getOrgJson(), this.getWebsiteJson(), this.getWebpageJson()];
288
+ const json = { '@context': 'http://schema.org', '@graph': graph };
289
+ this.jsonTag.innerHTML = JSON.stringify(json);
290
+ return this;
291
+ }
292
+ /** Obtem JSON da Organização */
293
+ getOrgJson() {
294
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
295
+ return {
296
+ '@type': 'Organization',
297
+ '@id': `${siteurl}#organization`,
298
+ name: this.defaultTitle,
299
+ keywords: this.libConfig?.keywords,
300
+ url: `${siteurl}`,
301
+ sameAs: this.sameAs,
302
+ };
303
+ }
304
+ /** Obtem JSON do Website (portal, unidades, etc) */
305
+ getWebsiteJson() {
306
+ const unidadePath = this.getUnidadePath();
307
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
308
+ return {
309
+ '@type': 'WebSite',
310
+ '@id': `${siteurl}${unidadePath}#website`,
311
+ url: `${siteurl}${unidadePath}`,
312
+ name: this.unidadeName,
313
+ keywords: this.libConfig?.keywords,
314
+ };
315
+ }
316
+ /** Obtem Json da página */
317
+ getWebpageJson() {
318
+ const unidadePath = this.getUnidadePath();
319
+ const siteURL = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
320
+ const pagePath = `${siteURL}${this.location.path()}`;
321
+ const desc = this.activeDescription ? this.activeDescription : '';
322
+ return {
323
+ '@type': 'WebPage',
324
+ '@id': `${pagePath}#webpage`,
325
+ url: pagePath,
326
+ inLanguage: 'pt-BR',
327
+ name: this.getTitle(),
328
+ isPartOf: { '@id': `${siteURL}${unidadePath}#website` },
329
+ about: { '@id': `${siteURL}#organization` },
330
+ description: desc,
331
+ };
332
+ }
333
+ getUnidadePath() {
334
+ let unidadePath = '';
335
+ if (this.unidade && this.unidadePath) {
336
+ unidadePath = this.unidade?.path === '/' ? '' : this.unidadePath?.substring(0, this.unidadePath?.length - 1);
337
+ }
338
+ return unidadePath;
339
+ }
340
+ /**
341
+ * Obtém a URL canônica da página.
342
+ * @returns A URL canônica da página.
343
+ */
344
+ getCanonicalHref() {
345
+ if (!this.canonicalTag) {
346
+ this.canonicalTag = this.getCanonicalTag();
347
+ }
348
+ return this.canonicalTag.href;
349
+ }
350
+ /** Cria tag para links canonicals no head */
351
+ createCanonicalTag() {
352
+ const tag = this.document.createElement('link');
353
+ tag.setAttribute('rel', 'canonical');
354
+ this.document.head.appendChild(tag);
355
+ tag.setAttribute('href', this.document.URL);
356
+ this.canonicalTag = tag;
357
+ return tag;
358
+ }
359
+ /** Retorna tag para link canonical existe ou cria se não houver. */
360
+ getCanonicalTag() {
361
+ const elements = this.document.head.children;
362
+ let i;
363
+ for (i = 0; i < elements.length; i++) {
364
+ const elem = elements[i];
365
+ if (elem && elem.tagName === 'LINK' && elem.rel === 'canonical') {
366
+ return elem;
367
+ }
368
+ }
369
+ return this.createCanonicalTag();
370
+ }
371
+ /**
372
+ * Define link canonical da página
373
+ * @param url url canonical
374
+ */
375
+ setCanonicalHref(url) {
376
+ if (!this.canonicalTag) {
377
+ this.canonicalTag = this.getCanonicalTag();
378
+ }
379
+ let path = this.document.location.pathname;
380
+ if (this.libConfig?.siteSufix && path.includes(this.libConfig?.siteSufix)) {
381
+ path = path.replace(this.libConfig?.siteSufix, '');
382
+ }
383
+ if (!path.startsWith('/')) {
384
+ path = `/${path}`;
385
+ }
386
+ const canonicalUrl = url && this.isCustomCanonical(url) ? url : `${getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix)}${path}`;
387
+ this.canonicalTag.setAttribute('href', canonicalUrl);
388
+ return this;
389
+ }
390
+ /**
391
+ * Verifica se a URL fornecida é um link canonical personalizado
392
+ * @param url URL fornecida
393
+ */
394
+ isCustomCanonical(url) {
395
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
396
+ return url.startsWith(siteurl);
397
+ }
398
+ /**
399
+ * Obtém uma url válida na aplicação proveniente de uma URL gerada
400
+ * pelo plugin Yoast para canonical automático.
401
+ * Ex.: https://wp.rededorsaoluiz.com.br/brasil/especialidades/cardiologia/
402
+ * @param urlFromWpApi URL canonica gerada pelo Yoast Plugin.
403
+ */
404
+ toLocalCanonical(urlFromWpApi) {
405
+ const apiUrl = this.libConfig?.wpUrl ?? '';
406
+ const siteurl = getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix);
407
+ const unidadeSlug = this.unidadeSlug;
408
+ let converted = urlFromWpApi.replace(apiUrl, siteurl);
409
+ if (unidadeSlug !== '/' && converted.includes(`/${unidadeSlug}/`)) {
410
+ converted = converted.replace(`/${unidadeSlug}/`, `${this.unidadePath}`);
411
+ }
412
+ return converted;
413
+ }
414
+ getPostContent(post) {
415
+ const content = post.acf['rdsl_post_content'] ? post.acf.rdsl_post_content.find((content) => content.acf_fc_layout === 'text_html') : null;
416
+ return content?.content || post.content.rendered || '';
417
+ }
418
+ addArticleScript(post, scriptName) {
419
+ const postContent = this.getPostContent(post);
420
+ const postHeaderImage = post.acf['rdsl_post_header_img']
421
+ ? {
422
+ url: post.acf['rdsl_post_header_img'].url,
423
+ width: post.acf['rdsl_post_header_img'].width,
424
+ height: post.acf['rdsl_post_header_img'].height,
425
+ }
426
+ : null;
427
+ const structuredData = {
428
+ '@context': 'https://schema.org',
429
+ '@type': 'Article',
430
+ mainEntityOfPage: `${getSiteUrl(this.libConfig?.siteUrl, this.libConfig?.siteSufix)}${this.location.path()}`,
431
+ headline: post.title?.rendered,
432
+ datePublished: post.date_gmt,
433
+ publisher: {
434
+ '@type': 'Organization',
435
+ name: 'Rede D’Or',
436
+ },
437
+ description: post.title?.rendered,
438
+ articleBody: removeHtmlTags(he.decode(postContent)),
439
+ dateModified: post.modified_gmt,
440
+ image: {
441
+ '@type': 'ImageObject',
442
+ url: postHeaderImage?.url || post.featured_media_path || '',
443
+ height: postHeaderImage?.height || '',
444
+ width: postHeaderImage?.width || '',
445
+ },
446
+ author: {
447
+ '@type': 'Organization',
448
+ name: 'Rede D’Or',
449
+ },
450
+ wordcount: postContent.split(' ').length,
451
+ };
452
+ const script = this.document.createElement('script');
453
+ script.type = 'application/ld+json';
454
+ script.id = scriptName;
455
+ script.innerHTML = JSON.stringify(structuredData);
456
+ this.document.head.appendChild(script);
457
+ }
458
+ removeArticleScript(scriptName) {
459
+ const script = this.document.getElementById(scriptName);
460
+ script?.remove();
461
+ }
462
+ setUnidade({ unidade = null, unidadeName = '', unidadePath = '', unidadeSlug = '' }) {
463
+ this.unidade = unidade;
464
+ this.unidadeName = unidadeName;
465
+ this.unidadePath = unidadePath;
466
+ this.unidadeSlug = unidadeSlug;
467
+ }
468
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeoService, deps: [{ token: i1.Title }, { token: i1.Meta }, { token: i2.Location }, { token: LIB_CONFIG }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
469
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeoService, providedIn: 'root' }); }
470
+ }
471
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SeoService, decorators: [{
472
+ type: Injectable,
473
+ args: [{
474
+ providedIn: 'root',
475
+ }]
476
+ }], ctorParameters: () => [{ type: i1.Title }, { type: i1.Meta }, { type: i2.Location }, { type: undefined, decorators: [{
477
+ type: Inject,
478
+ args: [LIB_CONFIG]
479
+ }] }, { type: Document, decorators: [{
480
+ type: Inject,
481
+ args: [DOCUMENT]
482
+ }] }] });
483
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VvLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaXRlLWZyb250LWVuZC1saWIvc3JjL2xpYi9zZXJ2aWNlcy9zZW8vc2VvLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFFBQVEsRUFBWSxNQUFNLGlCQUFpQixDQUFDO0FBRXJELE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBUXpCLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQWEsTUFBTSx3QkFBd0IsQ0FBQzs7OztBQUsvRCxNQUFNLE9BQU8sVUFBVTtJQXVCckIsWUFDVSxLQUFZLEVBQ1osSUFBVSxFQUNWLFFBQWtCLEVBQ0UsU0FBb0IsRUFDdEIsUUFBa0I7UUFKcEMsVUFBSyxHQUFMLEtBQUssQ0FBTztRQUNaLFNBQUksR0FBSixJQUFJLENBQU07UUFDVixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBQ0UsY0FBUyxHQUFULFNBQVMsQ0FBVztRQUN0QixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBM0J2QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ2xCLGlCQUFZLEdBQUcsV0FBVyxDQUFDO1FBRTNCLFdBQU0sR0FBRztZQUNkLG1DQUFtQztZQUNuQyw0Q0FBNEM7WUFDNUMsa0RBQWtEO1lBQ2xELDZCQUE2QjtTQUM5QixDQUFDO1FBQ0ssZ0JBQVcsR0FBRyxVQUFVLENBQUM7UUFJeEIsY0FBUyxHQUFHLFNBQVMsQ0FBQztRQUV0Qix5QkFBb0IsR0FBRyxpQkFBaUIsQ0FBQztRQUUxQyxZQUFPLEdBQVEsSUFBSSxDQUFDO1FBQ3BCLGdCQUFXLEdBQVcsRUFBRSxDQUFDO1FBQ3pCLGdCQUFXLEdBQVcsRUFBRSxDQUFD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QVcsR0FBRyxFQUFFLEVBQUUsV0FBVyxHQUFHLEVBQUUsRUFBRSxXQUFXLEdBQUcsRUFBRSxFQUFjO1FBQ3BHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7K0dBemZVLFVBQVUsbUZBMkJYLFVBQVUsYUFDVixRQUFRO21IQTVCUCxVQUFVLGNBRlQsTUFBTTs7NEZBRVAsVUFBVTtrQkFIdEIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7OzBCQTRCSSxNQUFNOzJCQUFDLFVBQVU7OzBCQUNqQixNQUFNOzJCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTWV0YSwgVGl0bGUgfSBmcm9tICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJztcclxuaW1wb3J0IHsgRE9DVU1FTlQsIExvY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuXHJcbmltcG9ydCAqIGFzIGhlIGZyb20gJ2hlJztcclxuXHJcbmltcG9ydCB7IFNvY2lhbE1ldGFQcm9wZXJ0aWVzIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3NvY2lhbC1tZXRhLXByb3BlcnRpZXMubW9kZWwnO1xyXG5pbXBvcnQgeyBCcmVhZGNydW1ic0l0ZW1zIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2JyZWFkY3J1bWJzL2JyZWFkY3J1bWJzLWl0ZW1zLm1vZGVsJztcclxuaW1wb3J0IHsgQnJlYWRjcnVtYnNKc29uSXRlbSB9IGZyb20gJy4uLy4uL21vZGVscy9icmVhZGNydW1icy9icmVhZGNydW1icy1qc29uLWl0ZW0ubW9kZWwnO1xyXG5pbXBvcnQgeyBTZW9EYXRhIH0gZnJvbSAnLi4vLi4vbW9kZWxzL3Nlby9zZW8tZGF0YS5tb2RlbCc7XHJcbmltcG9ydCB7IFNlb1VuaWRhZGUgfSBmcm9tICcuLi8uLi9tb2RlbHMvc2VvL3Nlby11bmlkYWRlLm1vZGVsJztcclxuaW1wb3J0IHsgV3BQb3N0IH0gZnJvbSAnLi4vLi4vbW9kZWxzL3dvcmRwcmVzcy9wb3N0L3Bvc3QubW9kZWwnO1xyXG5pbXBvcnQgeyBnZXRTaXRlVXJsLCByZW1vdmVIdG1sVGFncyB9IGZyb20gJy4uLy4uL2hlbHBlcnMnO1xyXG5pbXBvcnQgeyBMSUJfQ09ORklHLCBMaWJDb25maWcgfSBmcm9tICcuLi8uLi90b2tlbnMvTGliQ29uZmlnJztcclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCcsXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBTZW9TZXJ2aWNlIHtcclxuICBwdWJsaWMgc2VwYXJhdG9yID0gJyAtICc7XHJcbiAgcHVibGljIGRlZmF1bHRUaXRsZSA9ICdSZWRlIETigJlPcic7XHJcbiAgcHVibGljIGFjdGl2ZURlc2NyaXB0aW9uITogc3RyaW5nO1xyXG4gIHB1YmxpYyBzYW1lQXMgPSBbXHJcbiAgICAnaHR0cHM6Ly93d3cuZmFjZWJvb2suY29tL3JlZGVkb3IvJyxcclxuICAgICdodHRwczovL3d3dy5pbnN0YWdyYW0uY29tL3JlZGVkb3Jfb2ZpY2lhbC8nLFxyXG4gICAgJ2h0dHBzOi8vd3d3LmxpbmtlZGluLmNvbS9jb21wYW55L3JlZGVkb3Itc2FvbHVpeicsXHJcbiAgICAnaHR0cHM6Ly90d2l0dGVyLmNvbS9yZWRlZG9yJyxcclxuICBdO1xyXG4gIHB1YmxpYyB0d2l0dGVyVXNlciA9ICdAcmVkZWRvcic7XHJcblxyXG4gIHByaXZhdGUgY2Fub25pY2FsVGFnITogSFRNTExpbmtFbGVtZW50O1xyXG4gIHByaXZhdGUganNvblRhZyE6IEhUTUxTY3JpcHRFbGVtZW50O1xyXG4gIHByaXZhdGUganNvblRhZ0lkID0gJ3Nlb0pTT04nO1xyXG4gIHByaXZhdGUgYnJlYWRjcnVtYnNKc29uVGFnITogSFRNTFNjcmlwdEVsZW1lbnQ7XHJcbiAgcHJpdmF0ZSBicmVhZGNydW1ic0pzb25UYWdJZCA9ICdicmVhZGNydW1ic0pTT04nO1xyXG5cclxuICBwdWJsaWMgdW5pZGFkZTogYW55ID0gbnVsbDtcclxuICBwdWJsaWMgdW5pZGFkZU5hbWU6IHN0cmluZyA9ICcnO1xyXG4gIHB1YmxpYyB1bmlkYWRlUGF0aDogc3RyaW5nID0gJyc7XHJcbiAgcHVibGljIHVuaWRhZGVTbHVnOiBzdHJpbmcgPSAnJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIHRpdGxlOiBUaXRsZSxcclxuICAgIHByaXZhdGUgbWV0YTogTWV0YSxcclxuICAgIHByaXZhdGUgbG9jYXRpb246IExvY2F0aW9uLFxyXG4gICAgQEluamVjdChMSUJfQ09ORklHKSBwcml2YXRlIGxpYkNvbmZpZzogTGliQ29uZmlnLFxyXG4gICAgQEluamVjdChET0NVTUVOVCkgcHJpdmF0ZSBkb2N1bWVudDogRG9jdW1lbnQsXHJcbiAgKSB7fVxyXG5cclxuICBwdWJsaWMgc2V0RnVsbFNlbyhkYXRhOiBTZW9EYXRhKSB7XHJcbiAgICB0aGlzLnNldFRpdGxlKGRhdGEudGl0bGUudGV4dCwgISFkYXRhLnRpdGxlLnN1Yik7XHJcbiAgICB0aGlzLnNldERlc2NyaXB0aW9uKGRhdGEuZGVzY3JpcHRpb24pO1xyXG4gICAgdGhpcy5zZXRDYW5vbmljYWxIcmVmKGRhdGEuY2Fub25pY2FsKTtcclxuICAgIHRoaXMuc2V0UGFnZUpzb24oKTtcclxuICAgIHRoaXMuc2V0U29jaWFsVGFncyhkYXRhLnNvY2lhbFRhZ3MpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHRhZyBkZXNjcmlwdGlvbiBkYSBww6FnaW5hXHJcbiAgICogQHBhcmFtIGNvbnRlbnQgY29udGXDumRvIGRhIGRlc2NyacOnw6NvIDxzdHJpbmc+XHJcbiAgICovXHJcbiAgcHVibGljIHNldERlc2NyaXB0aW9uKGNvbnRlbnQ6IHN0cmluZyk6IFNlb1NlcnZpY2Uge1xyXG4gICAgY29uc3QgZGVzY1RhZyA9IHRoaXMubWV0YS5nZXRUYWcoXCJuYW1lPSdkZXNjcmlwdGlvbidcIik7XHJcbiAgICBpZiAoY29udGVudCkge1xyXG4gICAgICBjb250ZW50ID0gaGUuZGVjb2RlKGNvbnRlbnQpO1xyXG4gICAgICBjb250ZW50ID0gcmVtb3ZlSHRtbFRhZ3MoY29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBjb250ZW50ID0gJyc7XHJcbiAgICB9XHJcbiAgICB0aGlzLmFjdGl2ZURlc2NyaXB0aW9uID0gY29udGVudDtcclxuICAgIGNvbnN0IHRhZ0NvbnRlbnQgPSB7IG5hbWU6ICdkZXNjcmlwdGlvbicsIGNvbnRlbnQgfTtcclxuICAgIGlmIChkZXNjVGFnKSB7XHJcbiAgICAgIHRoaXMubWV0YS51cGRhdGVUYWcodGFnQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1ldGEuYWRkVGFnKHRhZ0NvbnRlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgbWV0YSB0YWdzIHBhcmEgYSBww6FnaW5hXHJcbiAgICogQHBhcmFtIHRhZyBub21lIGRhIHRhZyBtZXRhXHJcbiAgICogQHBhcmFtIGNvbnRlbnQgY29udGXDumRvIGRhIHRhZyBtZXRhXHJcbiAgICogQHBhcmFtIHR5cGUgdGlwbyBkZSB0YWcgbWV0YVxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRNZXRhVGFnKHRhZzogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIHR5cGUgPSAnbmFtZScpIHtcclxuICAgIGNvbnN0IG1ldGF0YWcgPSB0aGlzLm1ldGEuZ2V0VGFnKGAke3R5cGV9PScke3RhZ30nYCk7XHJcbiAgICBjb250ZW50ID0gaGUuZGVjb2RlKGNvbnRlbnQpO1xyXG4gICAgY29udGVudCA9IHJlbW92ZUh0bWxUYWdzKGNvbnRlbnQpO1xyXG4gICAgY29uc3QgdGFnQ29udGVudCA9IHtcclxuICAgICAgW3R5cGVdOiB0YWcsXHJcbiAgICAgIGNvbnRlbnQsXHJcbiAgICB9O1xyXG4gICAgaWYgKCFtZXRhdGFnKSB7XHJcbiAgICAgIHRoaXMubWV0YS5hZGRUYWcodGFnQ29udGVudCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLm1ldGEudXBkYXRlVGFnKHRhZ0NvbnRlbnQpO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmUgbWV0YSB0YWdzIGRhIHDDoWdpbmFcclxuICAgKiBAcGFyYW0gdGFnIG5vbWUgZGEgdGFnIG1ldGFcclxuICAgKiBAcGFyYW0gY29udGVudCBjb250ZcO6ZG8gZGEgdGFnIG1ldGFcclxuICAgKiBAcGFyYW0gYXR0ciBhdHJpYnV0byBkYSB0YWcgbWV0YVxyXG4gICAqIEBwYXJhbSB0eXBlIHRpcG8gZGUgdGFnIG1ldGFcclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlVGFnKHRhZzogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcsIGF0dHI6IHN0cmluZywgdHlwZSA9ICduYW1lJykge1xyXG4gICAgY29uc3QgbWV0YXRhZyA9IHRoaXMubWV0YS5nZXRUYWcoYCR7dHlwZX09JyR7dGFnfSdgKTtcclxuICAgIGlmIChtZXRhdGFnKSB7XHJcbiAgICAgIHRoaXMubWV0YS5yZW1vdmVUYWcoYCR7YXR0cn09JHtjb250ZW50fWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBEZWZpbmUgbWV0YSB0YWdzIHBhcmEgRmFjZWJvb2tcclxuICAgKiBAcGFyYW0gdGl0bGUgdMOtdHVsbyBwYXJhIG8gZmFjZWJvb2tcclxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gZGVzY3Jpw6fDo28gcGFyYSBvIGZhY2Vib29rXHJcbiAgICogQHBhcmFtIHVybCB1cmwgcGFyYSBkZWZpbmnDp8OjbyBkbyBmYWNlYm9va1xyXG4gICAqIEBwYXJhbSBpbWcgaW1hZ2VtIHBhcmEgZGVmaW5pw6fDo28gbm8gZmFjZWJvb2tcclxuICAgKi9cclxuICBwdWJsaWMgc2V0TWV0YUZhY2Vib29rKHRpdGxlOiBzdHJpbmcsIGRlc2NyaXB0aW9uOiBzdHJpbmcsIHVybDogc3RyaW5nLCBpbWc6IHN0cmluZyB8IG51bGwgPSBudWxsKSB7XHJcbiAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnVybCcsIHVybCwgJ3Byb3BlcnR5Jyk7XHJcbiAgICB0aGlzLnNldE1ldGFUYWcoJ29nOnRpdGxlJywgdGl0bGUsICdwcm9wZXJ0eScpO1xyXG4gICAgdGhpcy5zZXRNZXRhVGFnKCdvZzpkZXNjcmlwdGlvbicsIGRlc2NyaXB0aW9uLCAncHJvcGVydHknKTtcclxuICAgIHRoaXMuc2V0TWV0YVRhZygnb2c6dHlwZScsICd3ZWJzaXRlJywgJ3Byb3BlcnR5Jyk7XHJcbiAgICB0aGlzLnNldE1ldGFUYWcoJ29nOmltYWdlJywgaW1nID8/ICcnLCAncHJvcGVydHknKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIERlZmluZSBtZXRhIHRhZ3MgcGFyYSBUd2l0dGVyXHJcbiAgICogQHBhcmFtIHRpdGxlIHTDrXR1bG8gcGFyYSBvIHR3aXR0ZXJcclxuICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gZGVzY3Jpw6fDo28gcGFyYSBvIHR3aXR0ZXJcclxuICAgKiBAcGFyYW0gdXJsIHVybCBwYXJhIG8gdHdpdHRlclxyXG4gICAqIEBwYXJhbSBpbWcgaW1hZ2VtIHBhcmEgZGVmaW5pw6fDo28gbm8gdHdpdHRlclxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRNZXRhVHdpdHRlcih0aXRsZTogc3RyaW5nLCBkZXNjcmlwdGlvbjogc3RyaW5nLCB1cmw6IHN0cmluZywgaW1nOiBzdHJpbmcgfCBudWxsID0gbnVsbCkge1xyXG4gICAgdGhpcy5zZXRNZXRhVGFnKCd0d2l0dGVyOnNpdGUnLCB1cmwsICduYW1lJyk7XHJcbiAgICB0aGlzLnNldE1ldGFUYWcoJ3R3aXR0ZXI6dGl0bGUnLCB0aXRsZSwgJ25hbWUnKTtcclxuICAgIHRoaXMuc2V0TWV0YVRhZygndHdpdHRlcjpkZXNjcmlwdGlvbicsIGRlc2NyaXB0aW9uLCAnbmFtZScpO1xyXG4gICAgdGhpcy5zZXRNZXRhVGFnKCd0d2l0dGVyOmltYWdlJywgaW1nID8/ICcnLCAnbmFtZScpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHRhZ3MgZGUgcmVkZXMgc29jaWFpcyAoVHdpdHRlciBlIE9wZW4gR3JhcGgpXHJcbiAgICogQHBhcmFtIHByb3BlcnRpZXNcclxuICAgKi9cclxuICBzZXRTb2NpYWxUYWdzKHByb3BlcnRpZXM/OiBTb2NpYWxNZXRhUHJvcGVydGllcykge1xyXG4gICAgY29uc3QgcGFnZVBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcclxuICAgIGNvbnN0IHNpdGV1cmwgPSBnZXRTaXRlVXJsKHRoaXMubGliQ29uZmlnPy5zaXRlVXJsLCB0aGlzLmxpYkNvbmZpZz8uc2l0ZVN1Zml4KTtcclxuICAgIGxldCBkZWZhdWx0UHJvcGVydGllczogU29jaWFsTWV0YVByb3BlcnRpZXMgPSB7XHJcbiAgICAgIHR3aXR0ZXJDYXJkOiAnc3VtbWFyeScsXHJcbiAgICAgIHR3aXR0ZXJTaXRlOiB0aGlzLnR3aXR0ZXJVc2VyLFxyXG4gICAgICB0eXBlOiAnd2Vic2l0ZScsXHJcbiAgICAgIHRpdGxlOiB0aGlzLmdldFRpdGxlKCksXHJcbiAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmFjdGl2ZURlc2NyaXB0aW9uIHx8ICcnLFxyXG4gICAgICB1cmw6IGAke3NpdGV1cmx9JHtwYWdlUGF0aH1gLFxyXG4gICAgICBpbWFnZTogdGhpcy5saWJDb25maWc/LmxvZ29QYXRoID8gYCR7c2l0ZXVybH0ke3RoaXMubGliQ29uZmlnLmxvZ29QYXRofWAgOiAnaHR0cHM6Ly93d3cucmVkZWRvcnNhb2x1aXouY29tLmJyL2Fzc2V0cy9pbWdzL2xvZ28tcmVkZWRvci1ibHVlLnBuZycsXHJcbiAgICB9O1xyXG4gICAgaWYgKHByb3BlcnRpZXMpIHtcclxuICAgICAgZGVmYXVsdFByb3BlcnRpZXMgPSB7IC4uLmRlZmF1bHRQcm9wZXJ0aWVzLCAuLi5wcm9wZXJ0aWVzIH07XHJcbiAgICB9XHJcbiAgICB0aGlzLnNldE1ldGFUYWcoJ3R3aXR0ZXI6Y2FyZCcsIGRlZmF1bHRQcm9wZXJ0aWVzLnR3aXR0ZXJDYXJkIHx8ICcnLCAnbmFtZScpXHJcbiAgICAgIC5zZXRNZXRhVGFnKCd0d2l0dGVyOnNpdGUnLCBkZWZhdWx0UHJvcGVydGllcy50d2l0dGVyU2l0ZSB8fCAnJywgJ25hbWUnKVxyXG4gICAgICAuc2V0TWV0YVRhZygnb2c6dHlwZScsIGRlZmF1bHRQcm9wZXJ0aWVzLnR5cGUgfHwgJycsICdwcm9wZXJ0eScpXHJcbiAgICAgIC5zZXRNZXRhVGFnKCdvZzp0aXRsZScsIGRlZmF1bHRQcm9wZXJ0aWVzLnRpdGxlIHx8ICcnLCAncHJvcGVydHknKVxyXG4gICAgICAuc2V0TWV0YVRhZygnb2c6ZGVzY3JpcHRpb24nLCBkZWZhdWx0UHJvcGVydGllcy5kZXNjcmlwdGlvbiB8fCAnJywgJ3Byb3BlcnR5JylcclxuICAgICAgLnNldE1ldGFUYWcoJ29nOnVybCcsIGRlZmF1bHRQcm9wZXJ0aWVzLnVybCB8fCAnJywgJ3Byb3BlcnR5JylcclxuICAgICAgLnNldE1ldGFUYWcoJ29nOmltYWdlJywgZGVmYXVsdFByb3BlcnRpZXMuaW1hZ2UgfHwgJycsICdwcm9wZXJ0eScpO1xyXG5cclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIHTDrXR1bG8gZGEgcMOhZ2luYVxyXG4gICAqIEBwYXJhbSB0aXRsZSB0w610dWxvIGRhIHDDoWdpbmEgPHN0cmluZz5cclxuICAgKiBAcGFyYW0gc3ViIFNlIMOpIHN1YnNpdGUgYWNyZXNjZW50YSB1bmlkYWRlIDxib29sZWFuPlxyXG4gICAqL1xyXG4gIHB1YmxpYyBzZXRUaXRsZSh0aXRsZTogc3RyaW5nLCBzdWIgPSBmYWxzZSkge1xyXG4gICAgaWYgKHRpdGxlICYmIHRpdGxlICE9PSAnJykge1xyXG4gICAgICB0aXRsZSA9IGhlLmRlY29kZSh0aXRsZSk7XHJcbiAgICAgIHRpdGxlID0gcmVtb3ZlSHRtbFRhZ3ModGl0bGUpO1xyXG4gICAgICBpZiAoc3ViKSB7XHJcbiAgICAgICAgdGl0bGUgPSBoZS5kZWNvZGUoYCR7dGl0bGV9JHt0aGlzLnNlcGFyYXRvcn0ke3RoaXMudW5pZGFkZU5hbWV9YCk7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBPYnRlbSB0w610dWxvIGF0dWFsIGRhIHDDoWdpbmEgKi9cclxuICBwdWJsaWMgZ2V0VGl0bGUoKTogc3RyaW5nIHtcclxuICAgIHJldHVybiB0aGlzLnRpdGxlLmdldFRpdGxlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0NDA0VGl0bGUoY29tcG9uZW50OiBzdHJpbmcgPSAnRGVmYXVsdCBDb21wb25lbnQnKSB7XHJcbiAgICBpZiAoY29tcG9uZW50ICYmIGNvbXBvbmVudCAhPT0gJycpIHtcclxuICAgICAgY29tcG9uZW50ID0gaGUuZGVjb2RlKGNvbXBvbmVudCk7XHJcbiAgICAgIGNvbXBvbmVudCA9IHJlbW92ZUh0bWxUYWdzKGNvbXBvbmVudCk7XHJcbiAgICAgIGlmICh0aGlzLnVuaWRhZGVOYW1lKSB7XHJcbiAgICAgICAgY29tcG9uZW50ID0gaGUuZGVjb2RlKGAke2NvbXBvbmVudH0ke3RoaXMuc2VwYXJhdG9yfSR7dGhpcy51bmlkYWRlTmFtZX1gKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY29uc3QgdGl0bGUgPSBgRXJybyA0MDQgLSAke2NvbXBvbmVudH0gLSAke3RoaXMubGliQ29uZmlnPy5zaXRlTmFtZX0gLSAke3RoaXMubG9jYXRpb24ucGF0aCgpfWA7XHJcbiAgICB0aGlzLnRpdGxlLnNldFRpdGxlKHRpdGxlKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldDUwMFRpdGxlKGNvbXBvbmVudDogc3RyaW5nID0gJ0RlZmF1bHQgQ29tcG9uZW50Jykge1xyXG4gICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQgIT09ICcnKSB7XHJcbiAgICAgIGNvbXBvbmVudCA9IGhlLmRlY29kZShjb21wb25lbnQpO1xyXG4gICAgICBjb21wb25lbnQgPSByZW1vdmVIdG1sVGFncyhjb21wb25lbnQpO1xyXG4gICAgICBpZiAodGhpcy51bmlkYWRlTmFtZSkge1xyXG4gICAgICAgIGNvbXBvbmVudCA9IGhlLmRlY29kZShgJHtjb21wb25lbnR9JHt0aGlzLnNlcGFyYXRvcn0ke3RoaXMudW5pZGFkZU5hbWV9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIGNvbnN0IHRpdGxlID0gYEVycm8gNTAwIC0gJHtjb21wb25lbnR9IC0gJHt0aGlzLmxpYkNvbmZpZz8uc2l0ZU5hbWV9IC0gJHt0aGlzLmxvY2F0aW9uLnBhdGgoKX1gO1xyXG4gICAgdGhpcy50aXRsZS5zZXRUaXRsZSh0aXRsZSk7XHJcbiAgICByZXR1cm4gdGhpcztcclxuICB9XHJcblxyXG4gIC8qKiBDcmlhIHRhZyBzY3JpcHQgcGFyYSBKU09OIGRlIGJyZWFkY3J1bWJzICovXHJcbiAgcHJpdmF0ZSBjcmVhdGVCcmVhZGNydW1ic0pTT05UYWcoKTogSFRNTFNjcmlwdEVsZW1lbnQge1xyXG4gICAgY29uc3QgdGFnOiBIVE1MU2NyaXB0RWxlbWVudCA9IHRoaXMuZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7XHJcbiAgICB0YWcuaWQgPSB0aGlzLmJyZWFkY3J1bWJzSnNvblRhZ0lkO1xyXG4gICAgdGFnLnR5cGUgPSAnYXBwbGljYXRpb24vbGQranNvbic7XHJcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGFnKTtcclxuICAgIHRoaXMuYnJlYWRjcnVtYnNKc29uVGFnID0gdGFnO1xyXG4gICAgcmV0dXJuIHRhZztcclxuICB9XHJcblxyXG4gIC8qKiBSZXRvcm5hIHRhZyBwYXJhIHNjcmlwdCBqc29uIGRlIGJyZWFkY3J1bWJzIG91IGNyaWEgc2UgbsOjbyBob3V2ZXIuICovXHJcbiAgcHJpdmF0ZSBnZXRCcmVhZGNydW1ic0pTT05UYWcoKTogSFRNTFNjcmlwdEVsZW1lbnQge1xyXG4gICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLmRvY3VtZW50LmhlYWQuY2hpbGRyZW47XHJcbiAgICBsZXQgaTogbnVtYmVyO1xyXG4gICAgZm9yIChpID0gMDsgaSA8IGVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IGVsZW0gPSBlbGVtZW50c1tpXSBhcyBIVE1MU2NyaXB0RWxlbWVudDtcclxuICAgICAgaWYgKGVsZW0gJiYgZWxlbS5pZCA9PT0gdGhpcy5icmVhZGNydW1ic0pzb25UYWdJZCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVCcmVhZGNydW1ic0pTT05UYWcoKTtcclxuICB9XHJcblxyXG4gIC8qKiBEZWZpbmUgbyBKU09OIGRlIGJyZWFkY3J1bWJzIGRhIHDDoWdpbmEgKi9cclxuICBwdWJsaWMgc2V0QnJlYWRjcnVtYnNKc29uKGl0ZW1zOiBCcmVhZGNydW1ic0l0ZW1zW10pIHtcclxuICAgIHRoaXMuYnJlYWRjcnVtYnNKc29uVGFnID0gdGhpcy5nZXRCcmVhZGNydW1ic0pTT05UYWcoKTtcclxuICAgIGNvbnN0IGpzb24gPSB7XHJcbiAgICAgICdAY29udGV4dCc6ICdodHRwOi8vc2NoZW1hLm9yZycsXHJcbiAgICAgICdAdHlwZSc6ICdCcmVhZGNydW1iTGlzdCcsXHJcbiAgICAgIGl0ZW1MaXN0RWxlbWVudDogdGhpcy5nZXRKc29uQnJlYWRjcnVtYkl0ZW1zKGl0ZW1zKSxcclxuICAgIH07XHJcbiAgICB0aGlzLmJyZWFkY3J1bWJzSnNvblRhZy5pbm5lckhUTUwgPSBKU09OLnN0cmluZ2lmeShqc29uKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIENvbnZlcnRlIGl0ZW5zIGRvIGJyZWFkY3J1bWIgZW0gaXRlbnMgZG8gSlNPTiAqL1xyXG4gIHByaXZhdGUgZ2V0SnNvbkJyZWFkY3J1bWJJdGVtcyhpdGVtczogQnJlYWRjcnVtYnNJdGVtc1tdKTogQnJlYWRjcnVtYnNKc29uSXRlbVtdIHtcclxuICAgIGNvbnN0IGpzb25JdGVtcyA9IFtcclxuICAgICAge1xyXG4gICAgICAgICdAdHlwZSc6ICdMaXN0SXRlbScsXHJcbiAgICAgICAgcG9zaXRpb246IDEsXHJcbiAgICAgICAgaXRlbTogeyAnQGlkJzogdGhpcy5nZXRCcmVhZGNydW1iSXRlbVVybChbJy8nXSksIG5hbWU6IGhlLmVuY29kZSgnUMOhZ2luYSBJbmljaWFsJykgfSxcclxuICAgICAgfSBhcyBCcmVhZGNydW1ic0pzb25JdGVtLFxyXG4gICAgXTtcclxuICAgIGl0ZW1zLmZvckVhY2goKGl0ZW0sIGkpID0+IHtcclxuICAgICAgY29uc3QganNvbkl0ZW06IEJyZWFkY3J1bWJzSnNvbkl0ZW0gPSB7XHJcbiAgICAgICAgJ0B0eXBlJzogJ0xpc3RJdGVtJyxcclxuICAgICAgICBwb3NpdGlvbjogaSArIDIsXHJcbiAgICAgICAgaXRlbTogeyAnQGlkJzogdGhpcy5nZXRCcmVhZGNydW1iSXRlbVVybChpdGVtPy51cmwgfHwgW10pLCBuYW1lOiBoZS5lbmNvZGUoaXRlbS5sYWJlbCkgfSxcclxuICAgICAgfTtcclxuICAgICAganNvbkl0ZW1zLnB1c2goanNvbkl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4ganNvbkl0ZW1zO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogTW9udGEgYSB1cmwgZG8gaXRlbSBkZSBicmVhZGNydW1iIHByb3ZlbmllbnRlIGRvIGFycmF5IGRlIHVybHNcclxuICAgKiBvdSBkbyBjYW1pbmhvIGRhIHByw7NwcmlhIHDDoWdpbmEsIGNvbmZvcm1lIGNhc28gZG8gw7psdGltbyBpdGVtLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgZ2V0QnJlYWRjcnVtYkl0ZW1VcmwodXJsOiBzdHJpbmdbXSk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBzaXRldXJsID0gZ2V0U2l0ZVVybCh0aGlzLmxpYkNvbmZpZz8uc2l0ZVVybCwgdGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCk7XHJcbiAgICBpZiAoIXVybCB8fCB1cmwubGVuZ3RoIDw9IDApIHtcclxuICAgICAgY29uc3QgcGFnZVBhdGggPSB0aGlzLmxvY2F0aW9uLnBhdGgoKTtcclxuICAgICAgcmV0dXJuIGAke3NpdGV1cmx9JHtwYWdlUGF0aH1gO1xyXG4gICAgfVxyXG4gICAgdXJsID0gdXJsLmZpbHRlcigodSkgPT4gdSAhPT0gdGhpcy51bmlkYWRlUGF0aCk7XHJcbiAgICBjb25zdCB1bmlkYWRlUGF0aCA9IHRoaXMuZ2V0VW5pZGFkZVBhdGgoKTtcclxuICAgIGNvbnN0IGZ1bGxQYXRoID0gYCR7dW5pZGFkZVBhdGh9LyR7dXJsLmpvaW4oJy8nKS5yZXBsYWNlKC9eXFwvPy8sICcnKX1gO1xyXG4gICAgcmV0dXJuIGAke3NpdGV1cmx9JHtmdWxsUGF0aH1gLnJlcGxhY2UoL1xcLyQvLCAnJyk7XHJcbiAgfVxyXG5cclxuICAvKiogQ3JpYSB0YWcgc2NyaXB0IHBhcmEgbyBKU09OIGRlIFNFTyAqL1xyXG4gIHByaXZhdGUgY3JlYXRlSlNPTlRhZygpOiBIVE1MU2NyaXB0RWxlbWVudCB7XHJcbiAgICBjb25zdCB0YWc6IEhUTUxTY3JpcHRFbGVtZW50ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuICAgIHRhZy5pZCA9IHRoaXMuanNvblRhZ0lkO1xyXG4gICAgdGFnLnR5cGUgPSAnYXBwbGljYXRpb24vbGQranNvbic7XHJcbiAgICB0aGlzLmRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGFnKTtcclxuICAgIHRoaXMuanNvblRhZyA9IHRhZztcclxuICAgIHJldHVybiB0YWc7XHJcbiAgfVxyXG5cclxuICAvKiogUmV0b3JuYSB0YWcgcGFyYSBzY3JpcHQganNvbiBkZSBicmVhZGNydW1icyBvdSBjcmlhIHNlIG7Do28gaG91dmVyLiAqL1xyXG4gIHByaXZhdGUgZ2V0SlNPTlRhZygpOiBIVE1MU2NyaXB0RWxlbWVudCB7XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZG9jdW1lbnQuaGVhZC5jaGlsZHJlbjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnRzW2ldIGFzIEhUTUxTY3JpcHRFbGVtZW50O1xyXG4gICAgICBpZiAoZWxlbSAmJiBlbGVtLmlkID09PSB0aGlzLmpzb25UYWdJZCkge1xyXG4gICAgICAgIHJldHVybiBlbGVtO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVKU09OVGFnKCk7XHJcbiAgfVxyXG5cclxuICAvKiogRGVmaW5lIEpTT04gcGFyYSBTRU8gc29tZW50ZSBxdWFuZG8gbm8gc2Vydmlkb3IgKi9cclxuICBwdWJsaWMgc2V0UGFnZUpzb24oKSB7XHJcbiAgICB0aGlzLmpzb25UYWcgPSB0aGlzLmdldEpTT05UYWcoKTtcclxuICAgIGNvbnN0IGdyYXBoID0gW3RoaXMuZ2V0T3JnSnNvbigpLCB0aGlzLmdldFdlYnNpdGVKc29uKCksIHRoaXMuZ2V0V2VicGFnZUpzb24oKV07XHJcbiAgICBjb25zdCBqc29uID0geyAnQGNvbnRleHQnOiAnaHR0cDovL3NjaGVtYS5vcmcnLCAnQGdyYXBoJzogZ3JhcGggfTtcclxuICAgIHRoaXMuanNvblRhZy5pbm5lckhUTUwgPSBKU09OLnN0cmluZ2lmeShqc29uKTtcclxuICAgIHJldHVybiB0aGlzO1xyXG4gIH1cclxuXHJcbiAgLyoqIE9idGVtIEpTT04gZGEgT3JnYW5pemHDp8OjbyAqL1xyXG4gIHByaXZhdGUgZ2V0T3JnSnNvbigpIHtcclxuICAgIGNvbnN0IHNpdGV1cmwgPSBnZXRTaXRlVXJsKHRoaXMubGliQ29uZmlnPy5zaXRlVXJsLCB0aGlzLmxpYkNvbmZpZz8uc2l0ZVN1Zml4KTtcclxuICAgIHJldHVybiB7XHJcbiAgICAgICdAdHlwZSc6ICdPcmdhbml6YXRpb24nLFxyXG4gICAgICAnQGlkJzogYCR7c2l0ZXVybH0jb3JnYW5pemF0aW9uYCxcclxuICAgICAgbmFtZTogdGhpcy5kZWZhdWx0VGl0bGUsXHJcbiAgICAgIGtleXdvcmRzOiB0aGlzLmxpYkNvbmZpZz8ua2V5d29yZHMsXHJcbiAgICAgIHVybDogYCR7c2l0ZXVybH1gLFxyXG4gICAgICBzYW1lQXM6IHRoaXMuc2FtZUFzLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBPYnRlbSBKU09OIGRvIFdlYnNpdGUgKHBvcnRhbCwgdW5pZGFkZXMsIGV0YykgKi9cclxuICBwcml2YXRlIGdldFdlYnNpdGVKc29uKCkge1xyXG4gICAgY29uc3QgdW5pZGFkZVBhdGggPSB0aGlzLmdldFVuaWRhZGVQYXRoKCk7XHJcbiAgICBjb25zdCBzaXRldXJsID0gZ2V0U2l0ZVVybCh0aGlzLmxpYkNvbmZpZz8uc2l0ZVVybCwgdGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCk7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnQHR5cGUnOiAnV2ViU2l0ZScsXHJcbiAgICAgICdAaWQnOiBgJHtzaXRldXJsfSR7dW5pZGFkZVBhdGh9I3dlYnNpdGVgLFxyXG4gICAgICB1cmw6IGAke3NpdGV1cmx9JHt1bmlkYWRlUGF0aH1gLFxyXG4gICAgICBuYW1lOiB0aGlzLnVuaWRhZGVOYW1lLFxyXG4gICAgICBrZXl3b3JkczogdGhpcy5saWJDb25maWc/LmtleXdvcmRzLFxyXG4gICAgfTtcclxuICB9XHJcblxyXG4gIC8qKiBPYnRlbSBKc29uIGRhIHDDoWdpbmEgKi9cclxuICBwcml2YXRlIGdldFdlYnBhZ2VKc29uKCkge1xyXG4gICAgY29uc3QgdW5pZGFkZVBhdGggPSB0aGlzLmdldFVuaWRhZGVQYXRoKCk7XHJcbiAgICBjb25zdCBzaXRlVVJMID0gZ2V0U2l0ZVVybCh0aGlzLmxpYkNvbmZpZz8uc2l0ZVVybCwgdGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCk7XHJcbiAgICBjb25zdCBwYWdlUGF0aCA9IGAke3NpdGVVUkx9JHt0aGlzLmxvY2F0aW9uLnBhdGgoKX1gO1xyXG4gICAgY29uc3QgZGVzYyA9IHRoaXMuYWN0aXZlRGVzY3JpcHRpb24gPyB0aGlzLmFjdGl2ZURlc2NyaXB0aW9uIDogJyc7XHJcbiAgICByZXR1cm4ge1xyXG4gICAgICAnQHR5cGUnOiAnV2ViUGFnZScsXHJcbiAgICAgICdAaWQnOiBgJHtwYWdlUGF0aH0jd2VicGFnZWAsXHJcbiAgICAgIHVybDogcGFnZVBhdGgsXHJcbiAgICAgIGluTGFuZ3VhZ2U6ICdwdC1CUicsXHJcbiAgICAgIG5hbWU6IHRoaXMuZ2V0VGl0bGUoKSxcclxuICAgICAgaXNQYXJ0T2Y6IHsgJ0BpZCc6IGAke3NpdGVVUkx9JHt1bmlkYWRlUGF0aH0jd2Vic2l0ZWAgfSxcclxuICAgICAgYWJvdXQ6IHsgJ0BpZCc6IGAke3NpdGVVUkx9I29yZ2FuaXphdGlvbmAgfSxcclxuICAgICAgZGVzY3JpcHRpb246IGRlc2MsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRVbmlkYWRlUGF0aCgpIHtcclxuICAgIGxldCB1bmlkYWRlUGF0aCA9ICcnO1xyXG4gICAgaWYgKHRoaXMudW5pZGFkZSAmJiB0aGlzLnVuaWRhZGVQYXRoKSB7XHJcbiAgICAgIHVuaWRhZGVQYXRoID0gdGhpcy51bmlkYWRlPy5wYXRoID09PSAnLycgPyAnJyA6IHRoaXMudW5pZGFkZVBhdGg/LnN1YnN0cmluZygwLCB0aGlzLnVuaWRhZGVQYXRoPy5sZW5ndGggLSAxKTtcclxuICAgIH1cclxuICAgIHJldHVybiB1bmlkYWRlUGF0aDtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIE9idMOpbSBhIFVSTCBjYW7DtG5pY2EgZGEgcMOhZ2luYS5cclxuICAgKiBAcmV0dXJucyBBIFVSTCBjYW7DtG5pY2EgZGEgcMOhZ2luYS5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0Q2Fub25pY2FsSHJlZigpOiBzdHJpbmcge1xyXG4gICAgaWYgKCF0aGlzLmNhbm9uaWNhbFRhZykge1xyXG4gICAgICB0aGlzLmNhbm9uaWNhbFRhZyA9IHRoaXMuZ2V0Q2Fub25pY2FsVGFnKCk7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdGhpcy5jYW5vbmljYWxUYWcuaHJlZjtcclxuICB9XHJcblxyXG4gIC8qKiBDcmlhIHRhZyBwYXJhIGxpbmtzIGNhbm9uaWNhbHMgbm8gaGVhZCAqL1xyXG4gIHByaXZhdGUgY3JlYXRlQ2Fub25pY2FsVGFnKCk6IEhUTUxMaW5rRWxlbWVudCB7XHJcbiAgICBjb25zdCB0YWcgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTtcclxuICAgIHRhZy5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdjYW5vbmljYWwnKTtcclxuICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0YWcpO1xyXG4gICAgdGFnLnNldEF0dHJpYnV0ZSgnaHJlZicsIHRoaXMuZG9jdW1lbnQuVVJMKTtcclxuICAgIHRoaXMuY2Fub25pY2FsVGFnID0gdGFnO1xyXG4gICAgcmV0dXJuIHRhZztcclxuICB9XHJcblxyXG4gIC8qKiBSZXRvcm5hIHRhZyBwYXJhIGxpbmsgY2Fub25pY2FsIGV4aXN0ZSBvdSBjcmlhIHNlIG7Do28gaG91dmVyLiAqL1xyXG4gIHByaXZhdGUgZ2V0Q2Fub25pY2FsVGFnKCk6IEhUTUxMaW5rRWxlbWVudCB7XHJcbiAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuZG9jdW1lbnQuaGVhZC5jaGlsZHJlbjtcclxuICAgIGxldCBpOiBudW1iZXI7XHJcbiAgICBmb3IgKGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgY29uc3QgZWxlbSA9IGVsZW1lbnRzW2ldIGFzIEhUTUxMaW5rRWxlbWVudDtcclxuICAgICAgaWYgKGVsZW0gJiYgZWxlbS50YWdOYW1lID09PSAnTElOSycgJiYgZWxlbS5yZWwgPT09ICdjYW5vbmljYWwnKSB7XHJcbiAgICAgICAgcmV0dXJuIGVsZW07XHJcbiAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiB0aGlzLmNyZWF0ZUNhbm9uaWNhbFRhZygpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogRGVmaW5lIGxpbmsgY2Fub25pY2FsIGRhIHDDoWdpbmFcclxuICAgKiBAcGFyYW0gdXJsIHVybCBjYW5vbmljYWxcclxuICAgKi9cclxuICBwdWJsaWMgc2V0Q2Fub25pY2FsSHJlZih1cmw/OiBzdHJpbmcpIHtcclxuICAgIGlmICghdGhpcy5jYW5vbmljYWxUYWcpIHtcclxuICAgICAgdGhpcy5jYW5vbmljYWxUYWcgPSB0aGlzLmdldENhbm9uaWNhbFRhZygpO1xyXG4gICAgfVxyXG5cclxuICAgIGxldCBwYXRoID0gdGhpcy5kb2N1bWVudC5sb2NhdGlvbi5wYXRobmFtZTtcclxuXHJcbiAgICBpZiAodGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCAmJiBwYXRoLmluY2x1ZGVzKHRoaXMubGliQ29uZmlnPy5zaXRlU3VmaXgpKSB7XHJcbiAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UodGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCEsICcnKTtcclxuICAgIH1cclxuXHJcbiAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7XHJcbiAgICAgIHBhdGggPSBgLyR7cGF0aH1gO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNhbm9uaWNhbFVybCA9IHVybCAmJiB0aGlzLmlzQ3VzdG9tQ2Fub25pY2FsKHVybCkgPyB1cmwgOiBgJHtnZXRTaXRlVXJsKHRoaXMubGliQ29uZmlnPy5zaXRlVXJsLCB0aGlzLmxpYkNvbmZpZz8uc2l0ZVN1Zml4KX0ke3BhdGh9YDtcclxuXHJcbiAgICB0aGlzLmNhbm9uaWNhbFRhZy5zZXRBdHRyaWJ1dGUoJ2hyZWYnLCBjYW5vbmljYWxVcmwpO1xyXG4gICAgcmV0dXJuIHRoaXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBWZXJpZmljYSBzZSBhIFVSTCBmb3JuZWNpZGEgw6kgdW0gbGluayBjYW5vbmljYWwgcGVyc29uYWxpemFkb1xyXG4gICAqIEBwYXJhbSB1cmwgVVJMIGZvcm5lY2lkYVxyXG4gICAqL1xyXG4gIHB1YmxpYyBpc0N1c3RvbUNhbm9uaWNhbCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG4gICAgY29uc3Qgc2l0ZXVybCA9IGdldFNpdGVVcmwodGhpcy5saWJDb25maWc/LnNpdGVVcmwsIHRoaXMubGliQ29uZmlnPy5zaXRlU3VmaXgpO1xyXG4gICAgcmV0dXJuIHVybC5zdGFydHNXaXRoKHNpdGV1cmwpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogT2J0w6ltIHVtYSB1cmwgdsOhbGlkYSBuYSBhcGxpY2HDp8OjbyBwcm92ZW5pZW50ZSBkZSB1bWEgVVJMIGdlcmFkYVxyXG4gICAqIHBlbG8gcGx1Z2luIFlvYXN0IHBhcmEgY2Fub25pY2FsIGF1dG9tw6F0aWNvLlxyXG4gICAqIEV4LjogaHR0cHM6Ly93cC5yZWRlZG9yc2FvbHVpei5jb20uYnIvYnJhc2lsL2VzcGVjaWFsaWRhZGVzL2NhcmRpb2xvZ2lhL1xyXG4gICAqIEBwYXJhbSB1cmxGcm9tV3BBcGkgVVJMIGNhbm9uaWNhIGdlcmFkYSBwZWxvIFlvYXN0IFBsdWdpbi5cclxuICAgKi9cclxuICB0b0xvY2FsQ2Fub25pY2FsKHVybEZyb21XcEFwaTogc3RyaW5nKTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGFwaVVybCA9IHRoaXMubGliQ29uZmlnPy53cFVybCA/PyAnJztcclxuICAgIGNvbnN0IHNpdGV1cmwgPSBnZXRTaXRlVXJsKHRoaXMubGliQ29uZmlnPy5zaXRlVXJsLCB0aGlzLmxpYkNvbmZpZz8uc2l0ZVN1Zml4KTtcclxuICAgIGNvbnN0IHVuaWRhZGVTbHVnID0gdGhpcy51bmlkYWRlU2x1ZztcclxuICAgIGxldCBjb252ZXJ0ZWQgPSB1cmxGcm9tV3BBcGkucmVwbGFjZShhcGlVcmwsIHNpdGV1cmwpO1xyXG4gICAgaWYgKHVuaWRhZGVTbHVnICE9PSAnLycgJiYgY29udmVydGVkLmluY2x1ZGVzKGAvJHt1bmlkYWRlU2x1Z30vYCkpIHtcclxuICAgICAgY29udmVydGVkID0gY29udmVydGVkLnJlcGxhY2UoYC8ke3VuaWRhZGVTbHVnfS9gLCBgJHt0aGlzLnVuaWRhZGVQYXRofWApO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGNvbnZlcnRlZDtcclxuICB9XHJcblxyXG4gIGdldFBvc3RDb250ZW50KHBvc3Q6IFdwUG9zdCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBjb250ZW50ID0gcG9zdC5hY2ZbJ3Jkc2xfcG9zdF9jb250ZW50J10gPyBwb3N0LmFjZi5yZHNsX3Bvc3RfY29udGVudC5maW5kKChjb250ZW50OiBhbnkpID0+IGNvbnRlbnQuYWNmX2ZjX2xheW91dCA9PT0gJ3RleHRfaHRtbCcpIDogbnVsbDtcclxuICAgIHJldHVybiBjb250ZW50Py5jb250ZW50IHx8IHBvc3QuY29udGVudC5yZW5kZXJlZCB8fCAnJztcclxuICB9XHJcblxyXG4gIGFkZEFydGljbGVTY3JpcHQocG9zdDogV3BQb3N0LCBzY3JpcHROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHBvc3RDb250ZW50ID0gdGhpcy5nZXRQb3N0Q29udGVudChwb3N0KTtcclxuICAgIGNvbnN0IHBvc3RIZWFkZXJJbWFnZSA9IHBvc3QuYWNmWydyZHNsX3Bvc3RfaGVhZGVyX2ltZyddXHJcbiAgICAgID8ge1xyXG4gICAgICAgICAgdXJsOiBwb3N0LmFjZlsncmRzbF9wb3N0X2hlYWRlcl9pbWcnXS51cmwsXHJcbiAgICAgICAgICB3aWR0aDogcG9zdC5hY2ZbJ3Jkc2xfcG9zdF9oZWFkZXJfaW1nJ10ud2lkdGgsXHJcbiAgICAgICAgICBoZWlnaHQ6IHBvc3QuYWNmWydyZHNsX3Bvc3RfaGVhZGVyX2ltZyddLmhlaWdodCxcclxuICAgICAgICB9XHJcbiAgICAgIDogbnVsbDtcclxuXHJcbiAgICBjb25zdCBzdHJ1Y3R1cmVkRGF0YSA9IHtcclxuICAgICAgJ0Bjb250ZXh0JzogJ2h0dHBzOi8vc2NoZW1hLm9yZycsXHJcbiAgICAgICdAdHlwZSc6ICdBcnRpY2xlJyxcclxuICAgICAgbWFpbkVudGl0eU9mUGFnZTogYCR7Z2V0U2l0ZVVybCh0aGlzLmxpYkNvbmZpZz8uc2l0ZVVybCwgdGhpcy5saWJDb25maWc/LnNpdGVTdWZpeCl9JHt0aGlzLmxvY2F0aW9uLnBhdGgoKX1gLFxyXG4gICAgICBoZWFkbGluZTogcG9zdC50aXRsZT8ucmVuZGVyZWQsXHJcbiAgICAgIGRhdGVQdWJsaXNoZWQ6IHBvc3QuZGF0ZV9nbXQsXHJcbiAgICAgIHB1Ymxpc2hlcjoge1xyXG4gICAgICAgICdAdHlwZSc6ICdPcmdhbml6YXRpb24nLFxyXG4gICAgICAgIG5hbWU6ICdSZWRlIETigJlPcicsXHJcbiAgICAgIH0sXHJcbiAgICAgIGRlc2NyaXB0aW9uOiBwb3N0LnRpdGxlPy5yZW5kZXJlZCxcclxuICAgICAgYXJ0aWNsZUJvZHk6IHJlbW92ZUh0bWxUYWdzKGhlLmRlY29kZShwb3N0Q29udGVudCkpLFxyXG4gICAgICBkYXRlTW9kaWZpZWQ6IHBvc3QubW9kaWZpZWRfZ210LFxyXG4gICAgICBpbWFnZToge1xyXG4gICAgICAgICdAdHlwZSc6ICdJbWFnZU9iamVjdCcsXHJcbiAgICAgICAgdXJsOiBwb3N0SGVhZGVySW1hZ2U/LnVybCB8fCBwb3N0LmZlYXR1cmVkX21lZGlhX3BhdGggfHwgJycsXHJcbiAgICAgICAgaGVpZ2h0OiBwb3N0SGVhZGVySW1hZ2U/LmhlaWdodCB8fCAnJyxcclxuICAgICAgICB3aWR0aDogcG9zdEhlYWRlckltYWdlPy53aWR0aCB8fCAnJyxcclxuICAgICAgfSxcclxuICAgICAgYXV0aG9yOiB7XHJcbiAgICAgICAgJ0B0eXBlJzogJ09yZ2FuaXphdGlvbicsXHJcbiAgICAgICAgbmFtZTogJ1JlZGUgROKAmU9yJyxcclxuICAgICAgfSxcclxuICAgICAgd29yZGNvdW50OiBwb3N0Q29udGVudC5zcGxpdCgnICcpLmxlbmd0aCxcclxuICAgIH07XHJcblxyXG4gICAgY29uc3Qgc2NyaXB0ID0gdGhpcy5kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtcclxuXHJcbiAgICBzY3JpcHQudHlwZSA9ICdhcHBsaWNhdGlvbi9sZCtqc29uJztcclxuICAgIHNjcmlwdC5pZCA9IHNjcmlwdE5hbWU7XHJcbiAgICBzY3JpcHQuaW5uZXJIVE1MID0gSlNPTi5zdHJpbmdpZnkoc3RydWN0dXJlZERhdGEpO1xyXG5cclxuICAgIHRoaXMuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZChzY3JpcHQpO1xyXG4gIH1cclxuXHJcbiAgcmVtb3ZlQXJ0aWNsZVNjcmlwdChzY3JpcHROYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHNjcmlwdCA9IHRoaXMuZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc2NyaXB0TmFtZSk7XHJcbiAgICBzY3JpcHQ/LnJlbW92ZSgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldFVuaWRhZGUoeyB1bmlkYWRlID0gbnVsbCwgdW5pZGFkZU5hbWUgPSAnJywgdW5pZGFkZVBhdGggPSAnJywgdW5pZGFkZVNsdWcgPSAnJyB9OiBTZW9VbmlkYWRlKSB7XHJcbiAgICB0aGlzLnVuaWRhZGUgPSB1bmlkYWRlO1xyXG4gICAgdGhpcy51bmlkYWRlTmFtZSA9IHVuaWRhZGVOYW1lO1xyXG4gICAgdGhpcy51bmlkYWRlUGF0aCA9IHVuaWRhZGVQYXRoO1xyXG4gICAgdGhpcy51bmlkYWRlU2x1ZyA9IHVuaWRhZGVTbHVnO1xyXG4gIH1cclxufVxyXG4iXX0=