@retalia/sidebar-navigation 14.3.0 → 16.2.12

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 (48) hide show
  1. package/{esm2020 → esm2022}/lib/data/support-routes.mjs +54 -54
  2. package/{esm2020 → esm2022}/lib/data/test-data.mjs +620 -620
  3. package/{esm2020 → esm2022}/lib/models/cookie-names.mjs +13 -13
  4. package/{esm2020 → esm2022}/lib/models/environment.mjs +1 -1
  5. package/{esm2020 → esm2022}/lib/models/http-response.mjs +1 -1
  6. package/{esm2020 → esm2022}/lib/models/module.mjs +1 -1
  7. package/esm2022/lib/navigation-lib.component.mjs +28 -0
  8. package/{esm2020 → esm2022}/lib/navigation-lib.module.mjs +47 -47
  9. package/{esm2020 → esm2022}/lib/navigation-lib.service.mjs +14 -14
  10. package/{esm2020 → esm2022}/lib/services/auth.service.mjs +43 -43
  11. package/{esm2020 → esm2022}/lib/services/cookie.service.mjs +34 -34
  12. package/{esm2020 → esm2022}/lib/services/http.service.mjs +18 -18
  13. package/{esm2020 → esm2022}/lib/services/module.service.mjs +133 -133
  14. package/{esm2020 → esm2022}/lib/services/sub-item.service.mjs +47 -47
  15. package/{esm2020 → esm2022}/lib/sidebar/shop-modal/shop-modal.component.mjs +40 -40
  16. package/{esm2020 → esm2022}/lib/sidebar/sidebar.component.mjs +182 -182
  17. package/esm2022/lib/sidebar/sub-item/sub-item.component.mjs +52 -0
  18. package/{esm2020 → esm2022}/lib/topbar/topbar.component.mjs +68 -68
  19. package/{esm2020 → esm2022}/public-api.mjs +11 -11
  20. package/{esm2020 → esm2022}/retalia-sidebar-navigation.mjs +4 -4
  21. package/fesm2022/retalia-sidebar-navigation.mjs +1355 -0
  22. package/{fesm2020 → fesm2022}/retalia-sidebar-navigation.mjs.map +1 -1
  23. package/index.d.ts +5 -5
  24. package/lib/data/support-routes.d.ts +2 -2
  25. package/lib/data/test-data.d.ts +2 -2
  26. package/lib/models/cookie-names.d.ts +12 -12
  27. package/lib/models/environment.d.ts +4 -4
  28. package/lib/models/http-response.d.ts +3 -3
  29. package/lib/models/module.d.ts +32 -32
  30. package/lib/navigation-lib.component.d.ts +12 -12
  31. package/lib/navigation-lib.module.d.ts +14 -14
  32. package/lib/navigation-lib.service.d.ts +6 -6
  33. package/lib/services/auth.service.d.ts +12 -12
  34. package/lib/services/cookie.service.d.ts +12 -12
  35. package/lib/services/http.service.d.ts +2 -2
  36. package/lib/services/module.service.d.ts +20 -20
  37. package/lib/services/sub-item.service.d.ts +12 -12
  38. package/lib/sidebar/shop-modal/shop-modal.component.d.ts +17 -17
  39. package/lib/sidebar/sidebar.component.d.ts +47 -47
  40. package/lib/sidebar/sub-item/sub-item.component.d.ts +16 -16
  41. package/lib/topbar/topbar.component.d.ts +20 -20
  42. package/package.json +9 -15
  43. package/public-api.d.ts +8 -8
  44. package/esm2020/lib/navigation-lib.component.mjs +0 -28
  45. package/esm2020/lib/sidebar/sub-item/sub-item.component.mjs +0 -52
  46. package/fesm2015/retalia-sidebar-navigation.mjs +0 -1364
  47. package/fesm2015/retalia-sidebar-navigation.mjs.map +0 -1
  48. package/fesm2020/retalia-sidebar-navigation.mjs +0 -1355
@@ -1,182 +1,182 @@
1
- import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
- import { supportRoutes } from '../data/support-routes';
3
- import { CookieNames } from '../models/cookie-names';
4
- import * as i0 from "@angular/core";
5
- import * as i1 from "../services/module.service";
6
- import * as i2 from "../services/sub-item.service";
7
- import * as i3 from "../services/cookie.service";
8
- import * as i4 from "ngx-smart-modal";
9
- import * as i5 from "@angular/common";
10
- import * as i6 from "./sub-item/sub-item.component";
11
- import * as i7 from "./shop-modal/shop-modal.component";
12
- export class SidebarComponent {
13
- constructor(moduleService, subItemService, cookieService, ngxSmartModalService) {
14
- this.moduleService = moduleService;
15
- this.subItemService = subItemService;
16
- this.cookieService = cookieService;
17
- this.ngxSmartModalService = ngxSmartModalService;
18
- this.selectedRoute = new EventEmitter();
19
- this.moduleSearchValue = '';
20
- this.modules = [];
21
- this.modulesCopy = [];
22
- this.supportRoutes = supportRoutes;
23
- this.availableShops = [];
24
- this.availableShopsCopy = [];
25
- this.moduleSearchPlaceholder = 'Search Modules ...';
26
- this.isSidebarOpen = this.getSidebarState();
27
- this.hideStatus = true;
28
- this.panelButtonStates = {
29
- isModuleOpen: false,
30
- isSupportOpen: false,
31
- };
32
- this.subItemService.subItemClickEvent.subscribe((item) => {
33
- this.subItemClicked(item);
34
- });
35
- }
36
- ngOnChanges(changes) {
37
- if (changes.environment && changes.environment.currentValue.apiRequestUrl) {
38
- this.getModules(true);
39
- }
40
- }
41
- // SIDEBAR
42
- toggleSidebar(e, option) {
43
- e.stopPropagation();
44
- // Allows us to expand the panel items in future without needing to change the toggle logic
45
- for (let item in Object(this.panelButtonStates)) {
46
- item === option
47
- ? (this.panelButtonStates[item] = !this.panelButtonStates[item])
48
- : (this.panelButtonStates[item] = false);
49
- }
50
- this.isSidebarOpen = this.panelButtonStates[option];
51
- this.setSidebarState();
52
- }
53
- setSidebarState() {
54
- this.cookieService.setCookie(CookieNames.isSidebarOpen, this.isSidebarOpen);
55
- }
56
- getSidebarState() {
57
- let isSidebarOpen = this.cookieService.getCookie(CookieNames.isSidebarOpen) == 'true';
58
- if (typeof isSidebarOpen === 'undefined') {
59
- return true;
60
- }
61
- return isSidebarOpen;
62
- }
63
- goToPortal() {
64
- window.location.href = this.environment.portalUrl;
65
- }
66
- handleModuleSearch(e) {
67
- if (this.modulesCopy.length < 1) {
68
- this.modulesCopy = [...this.modules];
69
- }
70
- this.moduleSearchValue = e && e.target ? e.target.value : '';
71
- const searchString = this.moduleSearchValue.toLowerCase();
72
- const moduleCopy = JSON.parse(JSON.stringify(this.modulesCopy));
73
- this.modules = this.filterModules(moduleCopy, searchString);
74
- }
75
- filterModules(moduleItems, searchTerm) {
76
- const matches = [];
77
- if (!Array.isArray(this.modules))
78
- return matches;
79
- moduleItems.forEach((i) => {
80
- if (i.name.toLowerCase().includes(searchTerm)) {
81
- i.visible = true;
82
- matches.push(i);
83
- }
84
- else {
85
- const childResults = this.filterModules(i.children, searchTerm);
86
- if (childResults.length) {
87
- matches.push(Object.assign({}, i, { children: childResults }));
88
- }
89
- }
90
- });
91
- return matches;
92
- }
93
- subItemClicked(item) {
94
- this.selectedModule = this.modules.find((m) => m.authorizationId ===
95
- (item.authorizationId || item.moduleAuthorizationId));
96
- if (this.selectedItem)
97
- this.selectedItem.active = false;
98
- this.selectedItem = item;
99
- this.selectedItem.active = true;
100
- if (this.selectedItem.relationName === 'Documentation') {
101
- window.open(this.selectedItem.url, '_blank', 'noopener noreferrer');
102
- }
103
- else if ((this.selectedModule && !this.selectedModule.entityAccess) ||
104
- !this.selectedModule.entityAccess.length) {
105
- this.routeToUrl();
106
- }
107
- else if (this.selectedModule &&
108
- this.selectedModule.entityAccess.length === 1) {
109
- const soleShop = this.selectedModule.entityAccess[0];
110
- this.subItemService.saveItemInfo(this.selectedModule, soleShop);
111
- this.routeToUrl();
112
- }
113
- else {
114
- this.mapShopModal();
115
- this.ngxSmartModalService.getModal('shopModal').open();
116
- }
117
- }
118
- selectedShop(selectedShop) {
119
- this.subItemService.saveItemInfo(this.selectedModule, selectedShop.id);
120
- this.routeToUrl();
121
- }
122
- mapShopModal() {
123
- if (this.availableShopsCopy.length < 1) {
124
- this.availableShopsCopy = [...this.availableShops];
125
- }
126
- this.availableShops = this.availableShopsCopy.filter((shop) => this.selectedModule.entityAccess.includes(shop.id));
127
- }
128
- goToStatusPage() {
129
- window.open('https://status.retalia.cloud', '_blank', 'noopener noreferrer');
130
- }
131
- routeToUrl() {
132
- let currentModule = this.moduleService.getCurrentModule(this.selectedItem);
133
- if (currentModule &&
134
- this.selectedItem &&
135
- (currentModule.authorizationId === this.selectedItem.authorizationId ||
136
- currentModule.authorizationId === this.selectedItem.moduleAuthorizationId)) {
137
- let currentItem = JSON.parse(JSON.stringify(this.selectedItem));
138
- const pathArray = this.selectedItem.url.split('/');
139
- pathArray.splice(0, 2);
140
- currentItem.url = pathArray.join('/');
141
- this.selectedRoute.emit(currentItem);
142
- }
143
- else {
144
- const itemUrl = this.selectedItem.url;
145
- window.location.href = itemUrl;
146
- }
147
- }
148
- getModules(isFirstCall) {
149
- let apiUrl = this.environment.apiRequestUrl;
150
- if (apiUrl.endsWith("/"))
151
- apiUrl = apiUrl.slice(0, -1);
152
- this.moduleService.getUserModules(apiUrl, '').then((moduleObject) => {
153
- if (!moduleObject || !moduleObject.modulesDetails) {
154
- if (isFirstCall) {
155
- // If the UI relies on an interceptor to refire failed API calls, the initial module call will fail
156
- setTimeout(() => this.getModules(false), 1000);
157
- }
158
- else {
159
- console.log(`No modules were found using: ${apiUrl}`);
160
- }
161
- return;
162
- }
163
- this.availableShops = moduleObject.shops;
164
- this.modules = this.moduleService.mapModuleItems(moduleObject.modulesDetails);
165
- this.selectedItem = this.moduleService.findNestedUrlMatch(this.modules, window.location.pathname);
166
- this.panelButtonStates.isModuleOpen = this.isSidebarOpen;
167
- });
168
- }
169
- }
170
- SidebarComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SidebarComponent, deps: [{ token: i1.ModuleService }, { token: i2.SubItemService }, { token: i3.CookieService }, { token: i4.NgxSmartModalService }], target: i0.ɵɵFactoryTarget.Component });
171
- SidebarComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: SidebarComponent, selector: "sidebar", inputs: { environment: "environment", moduleSearchValue: "moduleSearchValue" }, outputs: { selectedRoute: "selectedRoute" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"sidebar-panel\">\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isModuleOpen')\" data-testid=\"nav-menu\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isModuleOpen\" height=\"14\" width=\"21\" viewBox=\"0 0 18 12\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path d=\"M0 12H18V10H0V12ZM0 7H18V5H0V7ZM0 0V2H18V0H0Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isModuleOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isSupportOpen')\" data-testid=\"nav-support\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isSupportOpen\" width=\"18\" height=\"21\" viewBox=\"0 0 18 21\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 0H2C0.89 0 0 0.9 0 2V16C0 17.1 0.89 18 2 18H6L9 21L12 18H16C17.1 18 18 17.1 18 16V2C18 0.9 17.1 0 16 0ZM10 16H8V14H10V16ZM12.07 8.25L11.17 9.17C10.45 9.9 10 10.5 10 12H8V11.5C8 10.4 8.45 9.4 9.17 8.67L10.41 7.41C10.78 7.05 11 6.55 11 6C11 4.9 10.1 4 9 4C7.9 4 7 4.9 7 6H5C5 3.79 6.79 2 9 2C11.21 2 13 3.79 13 6C13 6.88 12.64 7.68 12.07 8.25Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isSupportOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n\r\n\r\n <div class=\"status-button\" (mouseover)=\"hideStatus = false\" (mouseleave)=\"hideStatus = true\"\r\n (click)=\"goToStatusPage()\" data-testid=\"sidebar-status\">\r\n <svg class=\"panel-icon\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"#FFFFFF\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M20.625 6.5H1.375C0.615613 6.5 0 5.82842 0 5V2C0 1.17158 0.615613 0.5 1.375 0.5H20.625C21.3844 0.5 22 1.17158 22 2V5C22 5.82842 21.3844 6.5 20.625 6.5ZM18.5625 2.375C17.9929 2.375 17.5312 2.87867 17.5312 3.5C17.5312 4.12133 17.9929 4.625 18.5625 4.625C19.1321 4.625 19.5938 4.12133 19.5938 3.5C19.5938 2.87867 19.1321 2.375 18.5625 2.375ZM15.8125 2.375C15.2429 2.375 14.7812 2.87867 14.7812 3.5C14.7812 4.12133 15.2429 4.625 15.8125 4.625C16.3821 4.625 16.8438 4.12133 16.8438 3.5C16.8438 2.87867 16.3821 2.375 15.8125 2.375ZM20.625 14H1.375C0.615613 14 0 13.3284 0 12.5V9.5C0 8.67158 0.615613 8 1.375 8H20.625C21.3844 8 22 8.67158 22 9.5V12.5C22 13.3284 21.3844 14 20.625 14ZM18.5625 9.875C17.9929 9.875 17.5312 10.3787 17.5312 11C17.5312 11.6213 17.9929 12.125 18.5625 12.125C19.1321 12.125 19.5938 11.6213 19.5938 11C19.5938 10.3787 19.1321 9.875 18.5625 9.875ZM15.8125 9.875C15.2429 9.875 14.7812 10.3787 14.7812 11C14.7812 11.6213 15.2429 12.125 15.8125 12.125C16.3821 12.125 16.8438 11.6213 16.8438 11C16.8438 10.3787 16.3821 9.875 15.8125 9.875ZM20.625 21.5H1.375C0.615613 21.5 0 20.8284 0 20V17C0 16.1716 0.615613 15.5 1.375 15.5H20.625C21.3844 15.5 22 16.1716 22 17V20C22 20.8284 21.3844 21.5 20.625 21.5ZM18.5625 17.375C17.9929 17.375 17.5312 17.8787 17.5312 18.5C17.5312 19.1213 17.9929 19.625 18.5625 19.625C19.1321 19.625 19.5938 19.1213 19.5938 18.5C19.5938 17.8787 19.1321 17.375 18.5625 17.375ZM15.8125 17.375C15.2429 17.375 14.7812 17.8787 14.7812 18.5C14.7812 19.1213 15.2429 19.625 15.8125 19.625C16.3821 19.625 16.8438 19.1213 16.8438 18.5C16.8438 17.8787 16.3821 17.375 15.8125 17.375Z\" />\r\n </svg>\r\n <iframe id=\"status-frame\" [ngClass]=\"{'isOpen': !hideStatus, 'isClosed': hideStatus }\"\r\n src=\"//status.retalia.cloud/embed-status/light-sm\" name=\"statusPage\" width=\"230\" height=\"61\" frameBorder=\"0\"\r\n scrolling=\"no\">\r\n </iframe>\r\n </div>\r\n</div>\r\n\r\n<div id=\"sidebar-container\" [class.open-sidebar]=\"isSidebarOpen\">\r\n <div id=\"sticky-header\">\r\n <img class=\"logo-full\" height=\"40px\" src=\"https://imagineshared.blob.core.windows.net/portal/retalia_files/logos/sidebar_logo.png\" (click)=\"goToPortal()\"\r\n data-testid=\"nav-logo\" />\r\n <div class=\"module-divider\"></div>\r\n <div class=\"moduleSearchbar\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <input class=\"moduleSearchInput\" type=\"search\" autocomplete=\"off\" id=\"search\" [value]=\"moduleSearchValue\"\r\n required=\"false\" [placeholder]=\"moduleSearchPlaceholder\" (keyup)=\"handleModuleSearch($event)\"\r\n (click)=\"handleModuleSearch($event)\" />\r\n </div>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <sub-item [items]=\"modules\"></sub-item>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isSupportOpen\">\r\n <sub-item [items]=\"supportRoutes\"></sub-item>\r\n </div>\r\n</div>\r\n\r\n<shop-modal [availableShops]=\"availableShops\" (selectedShop)=\"selectedShop($event)\"></shop-modal>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;1,300;1,400;1,600&display=swap\";body.dialog-open{overflow:hidden}.nsm-dialog-btn-close{border:0;background:none;position:absolute;top:8px;right:8px;font-size:1.2em;cursor:pointer}.overlay{position:fixed;inset:0;overflow-x:hidden;overflow-y:auto;transition:background-color .5s;background-color:transparent;z-index:999}.overlay.nsm-overlay-open{background-color:#00000080}.overlay.transparent{background-color:transparent}.nsm-dialog{position:relative;opacity:1;visibility:visible;min-height:200px;width:100%;max-width:520px;margin:0 auto;pointer-events:none;outline:none}.nsm-dialog.nsm-dialog-close{opacity:0}.nsm-dialog.nsm-centered{display:flex;align-items:center;min-height:calc(100% - 3.5rem)}.nsm-content{position:relative;display:flex;flex-direction:column;pointer-events:auto;background-clip:padding-box;background-color:#fff;border-radius:2px;padding:1rem;margin:1.75rem;box-shadow:0 7px 8px -4px #0003,0 13px 19px 2px #00000024,0 5px 24px 4px #0000001f;outline:0;transform:translateZ(0)}.nsm-body{position:relative;flex:1 1 auto}.nsm-dialog[class*=nsm-dialog-animation-]{transition:transform .5s ease-in-out,opacity .5s}.nsm-dialog-animation-ltr{transform:translate3d(-50%,0,0)}.nsm-dialog-animation-ltr.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-ltr.nsm-dialog-close{transform:translate3d(-50%,0,0)}.nsm-dialog-animation-rtl{transform:translate3d(50%,0,0)}.nsm-dialog-animation-rtl.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-rtl.nsm-dialog-close{transform:translate3d(50%,0,0)}.nsm-dialog-animation-ttb{transform:translate3d(0,-50%,0)}.nsm-dialog-animation-ttb.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-ttb.nsm-dialog-close{transform:translate3d(0,-50%,0)}.nsm-dialog-animation-btt{transform:translate3d(0,50%,0)}.nsm-dialog-animation-btt.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-btt.nsm-dialog-close{transform:translate3d(0,50%,0)}.imagine-body{background-color:#fafbfc}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Bold.ttf) format(\"truetype\");font-weight:700;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Italic.ttf) format(\"truetype\");font-weight:400;font-style:italic}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-SemiBold.ttf) format(\"truetype\");font-weight:600;font-style:normal}#sidebar-panel{z-index:1;position:fixed;float:left;width:60px;height:100vh;color:#000;text-align:center;transition:.2s linear;background-color:#fff;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-panel{height:100%}}.panel-item{cursor:pointer;position:relative;height:40px;margin:10px;transition:.2s linear;border-radius:50%}.panel-item:hover{background-color:#919295}.panel-item:hover .panel-icon{fill:#fff}.panel-item:active,.panel-item:focus{background:rgba(84,84,84,.2)}.panel-item:active .panel-icon,.panel-item:focus .panel-icon{fill:#545454}.panel-item .panel-icon{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#sidebar-container{position:sticky;top:0;height:100vh;overflow:hidden;font-size:12px;font-family:Poppins,sans-serif;width:0px;background:#f2f2f2;padding-left:60px;transition:.3s;transition-timing-function:cubic-bezier(.11,.95,.91,.93);-ms-overflow-style:none;scrollbar-width:none;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-container{top:auto;position:relative;border-right:0px}}.open-sidebar{width:260px!important}@media (max-width: 37.5em){.open-sidebar{width:160px!important}}@media print{#container{display:none}}.module-divider{width:240px;margin:10px;border-top:.2px solid rgba(128,128,128,.2);background-clip:padding-box}@media (max-width: 37.5em){.module-divider{width:240px!important}}div#menu{display:flex;flex-flow:column;background-color:transparent;z-index:10;direction:ltr;float:left;width:258px;height:85%;overflow-y:overlay;overflow-x:hidden;transition:.2s linear}@media (max-width: 37.5em){div#menu{width:160px!important}}.moduleSearchbar{z-index:20;position:inherit;cursor:pointer;width:240px;height:28px;border-radius:4px;margin:10px;background:#e2e2e2}@media (max-width: 37.5em){.moduleSearchbar{width:140px!important;height:40px}}.moduleSearchbar .moduleSearchInput{direction:ltr;width:inherit;height:inherit;padding-left:10px;color:#545454;background-color:transparent;border-style:none;outline:none;-webkit-appearance:none}.moduleSearchbar input:invalid{box-shadow:none}.moduleSearchbar ::placeholder{color:#919295;font-size:11px;opacity:1}#sticky-header{margin-top:10px;width:100%;text-align:center;position:sticky;transition:1s ease}#sticky-header .logo-full{cursor:pointer;padding:5px 21px 0}.status-button{cursor:pointer;position:inherit;bottom:0;margin-left:8px;margin-bottom:15px;width:40px;height:32px;padding-top:8px;border-radius:50%;transition:.2s linear}.status-button .panel-icon{fill:#0c1830}.status-button:hover{background-color:#545454}.status-button:hover .panel-icon{fill:#fff}#status-frame{position:inherit;bottom:-8px;padding-left:25px;transition:.2s linear}.isOpen{opacity:1;visibility:visible}.isClosed{opacity:0;visibility:hidden}::-webkit-scrollbar{width:5px;background:transparent}::-webkit-scrollbar-thumb{background-color:#5454544d;border-radius:10px;-webkit-transition:.2s linear;transition:.2s linear}::-webkit-scrollbar-thumb:hover{background-color:#545454e6}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.SubItemComponent, selector: "sub-item", inputs: ["items"] }, { kind: "component", type: i7.ShopModalComponent, selector: "shop-modal", inputs: ["availableShops", "shopSearchValue"], outputs: ["selectedShop"] }] });
172
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: SidebarComponent, decorators: [{
173
- type: Component,
174
- args: [{ selector: 'sidebar', template: "<div id=\"sidebar-panel\">\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isModuleOpen')\" data-testid=\"nav-menu\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isModuleOpen\" height=\"14\" width=\"21\" viewBox=\"0 0 18 12\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path d=\"M0 12H18V10H0V12ZM0 7H18V5H0V7ZM0 0V2H18V0H0Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isModuleOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isSupportOpen')\" data-testid=\"nav-support\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isSupportOpen\" width=\"18\" height=\"21\" viewBox=\"0 0 18 21\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 0H2C0.89 0 0 0.9 0 2V16C0 17.1 0.89 18 2 18H6L9 21L12 18H16C17.1 18 18 17.1 18 16V2C18 0.9 17.1 0 16 0ZM10 16H8V14H10V16ZM12.07 8.25L11.17 9.17C10.45 9.9 10 10.5 10 12H8V11.5C8 10.4 8.45 9.4 9.17 8.67L10.41 7.41C10.78 7.05 11 6.55 11 6C11 4.9 10.1 4 9 4C7.9 4 7 4.9 7 6H5C5 3.79 6.79 2 9 2C11.21 2 13 3.79 13 6C13 6.88 12.64 7.68 12.07 8.25Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isSupportOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n\r\n\r\n <div class=\"status-button\" (mouseover)=\"hideStatus = false\" (mouseleave)=\"hideStatus = true\"\r\n (click)=\"goToStatusPage()\" data-testid=\"sidebar-status\">\r\n <svg class=\"panel-icon\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"#FFFFFF\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M20.625 6.5H1.375C0.615613 6.5 0 5.82842 0 5V2C0 1.17158 0.615613 0.5 1.375 0.5H20.625C21.3844 0.5 22 1.17158 22 2V5C22 5.82842 21.3844 6.5 20.625 6.5ZM18.5625 2.375C17.9929 2.375 17.5312 2.87867 17.5312 3.5C17.5312 4.12133 17.9929 4.625 18.5625 4.625C19.1321 4.625 19.5938 4.12133 19.5938 3.5C19.5938 2.87867 19.1321 2.375 18.5625 2.375ZM15.8125 2.375C15.2429 2.375 14.7812 2.87867 14.7812 3.5C14.7812 4.12133 15.2429 4.625 15.8125 4.625C16.3821 4.625 16.8438 4.12133 16.8438 3.5C16.8438 2.87867 16.3821 2.375 15.8125 2.375ZM20.625 14H1.375C0.615613 14 0 13.3284 0 12.5V9.5C0 8.67158 0.615613 8 1.375 8H20.625C21.3844 8 22 8.67158 22 9.5V12.5C22 13.3284 21.3844 14 20.625 14ZM18.5625 9.875C17.9929 9.875 17.5312 10.3787 17.5312 11C17.5312 11.6213 17.9929 12.125 18.5625 12.125C19.1321 12.125 19.5938 11.6213 19.5938 11C19.5938 10.3787 19.1321 9.875 18.5625 9.875ZM15.8125 9.875C15.2429 9.875 14.7812 10.3787 14.7812 11C14.7812 11.6213 15.2429 12.125 15.8125 12.125C16.3821 12.125 16.8438 11.6213 16.8438 11C16.8438 10.3787 16.3821 9.875 15.8125 9.875ZM20.625 21.5H1.375C0.615613 21.5 0 20.8284 0 20V17C0 16.1716 0.615613 15.5 1.375 15.5H20.625C21.3844 15.5 22 16.1716 22 17V20C22 20.8284 21.3844 21.5 20.625 21.5ZM18.5625 17.375C17.9929 17.375 17.5312 17.8787 17.5312 18.5C17.5312 19.1213 17.9929 19.625 18.5625 19.625C19.1321 19.625 19.5938 19.1213 19.5938 18.5C19.5938 17.8787 19.1321 17.375 18.5625 17.375ZM15.8125 17.375C15.2429 17.375 14.7812 17.8787 14.7812 18.5C14.7812 19.1213 15.2429 19.625 15.8125 19.625C16.3821 19.625 16.8438 19.1213 16.8438 18.5C16.8438 17.8787 16.3821 17.375 15.8125 17.375Z\" />\r\n </svg>\r\n <iframe id=\"status-frame\" [ngClass]=\"{'isOpen': !hideStatus, 'isClosed': hideStatus }\"\r\n src=\"//status.retalia.cloud/embed-status/light-sm\" name=\"statusPage\" width=\"230\" height=\"61\" frameBorder=\"0\"\r\n scrolling=\"no\">\r\n </iframe>\r\n </div>\r\n</div>\r\n\r\n<div id=\"sidebar-container\" [class.open-sidebar]=\"isSidebarOpen\">\r\n <div id=\"sticky-header\">\r\n <img class=\"logo-full\" height=\"40px\" src=\"https://imagineshared.blob.core.windows.net/portal/retalia_files/logos/sidebar_logo.png\" (click)=\"goToPortal()\"\r\n data-testid=\"nav-logo\" />\r\n <div class=\"module-divider\"></div>\r\n <div class=\"moduleSearchbar\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <input class=\"moduleSearchInput\" type=\"search\" autocomplete=\"off\" id=\"search\" [value]=\"moduleSearchValue\"\r\n required=\"false\" [placeholder]=\"moduleSearchPlaceholder\" (keyup)=\"handleModuleSearch($event)\"\r\n (click)=\"handleModuleSearch($event)\" />\r\n </div>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <sub-item [items]=\"modules\"></sub-item>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isSupportOpen\">\r\n <sub-item [items]=\"supportRoutes\"></sub-item>\r\n </div>\r\n</div>\r\n\r\n<shop-modal [availableShops]=\"availableShops\" (selectedShop)=\"selectedShop($event)\"></shop-modal>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;1,300;1,400;1,600&display=swap\";body.dialog-open{overflow:hidden}.nsm-dialog-btn-close{border:0;background:none;position:absolute;top:8px;right:8px;font-size:1.2em;cursor:pointer}.overlay{position:fixed;inset:0;overflow-x:hidden;overflow-y:auto;transition:background-color .5s;background-color:transparent;z-index:999}.overlay.nsm-overlay-open{background-color:#00000080}.overlay.transparent{background-color:transparent}.nsm-dialog{position:relative;opacity:1;visibility:visible;min-height:200px;width:100%;max-width:520px;margin:0 auto;pointer-events:none;outline:none}.nsm-dialog.nsm-dialog-close{opacity:0}.nsm-dialog.nsm-centered{display:flex;align-items:center;min-height:calc(100% - 3.5rem)}.nsm-content{position:relative;display:flex;flex-direction:column;pointer-events:auto;background-clip:padding-box;background-color:#fff;border-radius:2px;padding:1rem;margin:1.75rem;box-shadow:0 7px 8px -4px #0003,0 13px 19px 2px #00000024,0 5px 24px 4px #0000001f;outline:0;transform:translateZ(0)}.nsm-body{position:relative;flex:1 1 auto}.nsm-dialog[class*=nsm-dialog-animation-]{transition:transform .5s ease-in-out,opacity .5s}.nsm-dialog-animation-ltr{transform:translate3d(-50%,0,0)}.nsm-dialog-animation-ltr.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-ltr.nsm-dialog-close{transform:translate3d(-50%,0,0)}.nsm-dialog-animation-rtl{transform:translate3d(50%,0,0)}.nsm-dialog-animation-rtl.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-rtl.nsm-dialog-close{transform:translate3d(50%,0,0)}.nsm-dialog-animation-ttb{transform:translate3d(0,-50%,0)}.nsm-dialog-animation-ttb.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-ttb.nsm-dialog-close{transform:translate3d(0,-50%,0)}.nsm-dialog-animation-btt{transform:translate3d(0,50%,0)}.nsm-dialog-animation-btt.nsm-dialog-open{transform:translateZ(0)}.nsm-dialog-animation-btt.nsm-dialog-close{transform:translate3d(0,50%,0)}.imagine-body{background-color:#fafbfc}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Bold.ttf) format(\"truetype\");font-weight:700;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Italic.ttf) format(\"truetype\");font-weight:400;font-style:italic}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-SemiBold.ttf) format(\"truetype\");font-weight:600;font-style:normal}#sidebar-panel{z-index:1;position:fixed;float:left;width:60px;height:100vh;color:#000;text-align:center;transition:.2s linear;background-color:#fff;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-panel{height:100%}}.panel-item{cursor:pointer;position:relative;height:40px;margin:10px;transition:.2s linear;border-radius:50%}.panel-item:hover{background-color:#919295}.panel-item:hover .panel-icon{fill:#fff}.panel-item:active,.panel-item:focus{background:rgba(84,84,84,.2)}.panel-item:active .panel-icon,.panel-item:focus .panel-icon{fill:#545454}.panel-item .panel-icon{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#sidebar-container{position:sticky;top:0;height:100vh;overflow:hidden;font-size:12px;font-family:Poppins,sans-serif;width:0px;background:#f2f2f2;padding-left:60px;transition:.3s;transition-timing-function:cubic-bezier(.11,.95,.91,.93);-ms-overflow-style:none;scrollbar-width:none;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-container{top:auto;position:relative;border-right:0px}}.open-sidebar{width:260px!important}@media (max-width: 37.5em){.open-sidebar{width:160px!important}}@media print{#container{display:none}}.module-divider{width:240px;margin:10px;border-top:.2px solid rgba(128,128,128,.2);background-clip:padding-box}@media (max-width: 37.5em){.module-divider{width:240px!important}}div#menu{display:flex;flex-flow:column;background-color:transparent;z-index:10;direction:ltr;float:left;width:258px;height:85%;overflow-y:overlay;overflow-x:hidden;transition:.2s linear}@media (max-width: 37.5em){div#menu{width:160px!important}}.moduleSearchbar{z-index:20;position:inherit;cursor:pointer;width:240px;height:28px;border-radius:4px;margin:10px;background:#e2e2e2}@media (max-width: 37.5em){.moduleSearchbar{width:140px!important;height:40px}}.moduleSearchbar .moduleSearchInput{direction:ltr;width:inherit;height:inherit;padding-left:10px;color:#545454;background-color:transparent;border-style:none;outline:none;-webkit-appearance:none}.moduleSearchbar input:invalid{box-shadow:none}.moduleSearchbar ::placeholder{color:#919295;font-size:11px;opacity:1}#sticky-header{margin-top:10px;width:100%;text-align:center;position:sticky;transition:1s ease}#sticky-header .logo-full{cursor:pointer;padding:5px 21px 0}.status-button{cursor:pointer;position:inherit;bottom:0;margin-left:8px;margin-bottom:15px;width:40px;height:32px;padding-top:8px;border-radius:50%;transition:.2s linear}.status-button .panel-icon{fill:#0c1830}.status-button:hover{background-color:#545454}.status-button:hover .panel-icon{fill:#fff}#status-frame{position:inherit;bottom:-8px;padding-left:25px;transition:.2s linear}.isOpen{opacity:1;visibility:visible}.isClosed{opacity:0;visibility:hidden}::-webkit-scrollbar{width:5px;background:transparent}::-webkit-scrollbar-thumb{background-color:#5454544d;border-radius:10px;-webkit-transition:.2s linear;transition:.2s linear}::-webkit-scrollbar-thumb:hover{background-color:#545454e6}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}\n"] }]
175
- }], ctorParameters: function () { return [{ type: i1.ModuleService }, { type: i2.SubItemService }, { type: i3.CookieService }, { type: i4.NgxSmartModalService }]; }, propDecorators: { selectedRoute: [{
176
- type: Output
177
- }], environment: [{
178
- type: Input
179
- }], moduleSearchValue: [{
180
- type: Input
181
- }] } });
182
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWRlYmFyLW5hdmlnYXRpb24vc3JjL2xpYi9zaWRlYmFyL3NpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lkZWJhci1uYXZpZ2F0aW9uL3NyYy9saWIvc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBUXJELE1BQU0sT0FBTyxnQkFBZ0I7SUFtQjNCLFlBQ1UsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsYUFBNEIsRUFDN0Isb0JBQTBDO1FBSHpDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM3Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBdEJ6QyxrQkFBYSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWhFLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUNyQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBaUIsYUFBYSxDQUFDO1FBRzVDLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUNoQyw0QkFBdUIsR0FBRyxvQkFBb0IsQ0FBQztRQUMvQyxrQkFBYSxHQUFZLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoRCxl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TCxDQUFDOzs2R0F0TVUsZ0JBQWdCO2lHQUFoQixnQkFBZ0IsaU1DdEI3Qiw2NktBMkRpRzsyRkRyQ3BGLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxTQUFTO2dNQUtULGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNb2R1bGVJdGVtLCBTaG9wLCBTaWRlYmFyRW50cnkgfSBmcm9tICcuLi9tb2RlbHMvbW9kdWxlJztcclxuaW1wb3J0IHsgU3ViSXRlbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdWItaXRlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmd4U21hcnRNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtc21hcnQtbW9kYWwnO1xyXG5pbXBvcnQgeyBNb2R1bGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kdWxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL21vZGVscy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IHN1cHBvcnRSb3V0ZXMgfSBmcm9tICcuLi9kYXRhL3N1cHBvcnQtcm91dGVzJztcclxuaW1wb3J0IHsgQ29va2llTmFtZXMgfSBmcm9tICcuLi9tb2RlbHMvY29va2llLW5hbWVzJztcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Nvb2tpZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2lkZWJhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NpZGViYXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpZGViYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFJvdXRlOiBFdmVudEVtaXR0ZXI8U2lkZWJhckVudHJ5PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XHJcbiAgQElucHV0KCkgbW9kdWxlU2VhcmNoVmFsdWU6IGFueSA9ICcnO1xyXG4gIG1vZHVsZXM6IE1vZHVsZUl0ZW1bXSA9IFtdO1xyXG4gIG1vZHVsZXNDb3B5OiBNb2R1bGVJdGVtW10gPSBbXTtcclxuICBzdXBwb3J0Um91dGVzOiBNb2R1bGVJdGVtW10gPSBzdXBwb3J0Um91dGVzO1xyXG4gIHNlbGVjdGVkTW9kdWxlOiBNb2R1bGVJdGVtO1xyXG4gIHNlbGVjdGVkSXRlbTtcclxuICBhdmFpbGFibGVTaG9wczogU2hvcFtdID0gW107XHJcbiAgYXZhaWxhYmxlU2hvcHNDb3B5OiBTaG9wW10gPSBbXTtcclxuICBtb2R1bGVTZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2ggTW9kdWxlcyAuLi4nO1xyXG4gIGlzU2lkZWJhck9wZW46IGJvb2xlYW4gPSB0aGlzLmdldFNpZGViYXJTdGF0ZSgpO1xyXG4gIGhpZGVTdGF0dXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHBhbmVsQnV0dG9uU3RhdGVzID0ge1xyXG4gICAgaXNNb2R1bGVPcGVuOiBmYWxzZSxcclxuICAgIGlzU3VwcG9ydE9wZW46IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBtb2R1bGVTZXJ2aWNlOiBNb2R1bGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdWJJdGVtU2VydmljZTogU3ViSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgbmd4U21hcnRNb2RhbFNlcnZpY2U6IE5neFNtYXJ0TW9kYWxTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnN1Ykl0ZW1TZXJ2aWNlLnN1Ykl0ZW1DbGlja0V2ZW50LnN1YnNjcmliZSgoaXRlbSkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ykl0ZW1DbGlja2VkKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5lbnZpcm9ubWVudCAmJiBjaGFuZ2VzLmVudmlyb25tZW50LmN1cnJlbnRWYWx1ZS5hcGlSZXF1ZXN0VXJsKSB7XHJcbiAgICAgIHRoaXMuZ2V0TW9kdWxlcyh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNJREVCQVJcclxuICBwdWJsaWMgdG9nZ2xlU2lkZWJhcihlOiBFdmVudCwgb3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAvLyBBbGxvd3MgdXMgdG8gZXhwYW5kIHRoZSBwYW5lbCBpdGVtcyBpbiBmdXR1cmUgd2l0aG91dCBuZWVkaW5nIHRvIGNoYW5nZSB0aGUgdG9nZ2xlIGxvZ2ljXHJcbiAgICBmb3IgKGxldCBpdGVtIGluIE9iamVjdCh0aGlzLnBhbmVsQnV0dG9uU3RhdGVzKSkge1xyXG4gICAgICBpdGVtID09PSBvcHRpb25cclxuICAgICAgICA/ICh0aGlzLnBhbmVsQnV0dG9uU3RhdGVzW2l0ZW1dID0gIXRoaXMucGFuZWxCdXR0b25TdGF0ZXNbaXRlbV0pXHJcbiAgICAgICAgOiAodGhpcy5wYW5lbEJ1dHRvblN0YXRlc1tpdGVtXSA9IGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTaWRlYmFyT3BlbiA9IHRoaXMucGFuZWxCdXR0b25TdGF0ZXNbb3B0aW9uXTtcclxuICAgIHRoaXMuc2V0U2lkZWJhclN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2lkZWJhclN0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldENvb2tpZShDb29raWVOYW1lcy5pc1NpZGViYXJPcGVuLCB0aGlzLmlzU2lkZWJhck9wZW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNpZGViYXJTdGF0ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1NpZGViYXJPcGVuOiBib29sZWFuID1cclxuICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLmdldENvb2tpZShDb29raWVOYW1lcy5pc1NpZGViYXJPcGVuKSA9PSAndHJ1ZSc7XHJcbiAgICBpZiAodHlwZW9mIGlzU2lkZWJhck9wZW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzU2lkZWJhck9wZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1BvcnRhbCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5lbnZpcm9ubWVudC5wb3J0YWxVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlTW9kdWxlU2VhcmNoKGUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZHVsZXNDb3B5Lmxlbmd0aCA8IDEpIHtcclxuICAgICAgdGhpcy5tb2R1bGVzQ29weSA9IFsuLi50aGlzLm1vZHVsZXNdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubW9kdWxlU2VhcmNoVmFsdWUgPSBlICYmIGUudGFyZ2V0ID8gZS50YXJnZXQudmFsdWUgOiAnJztcclxuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHRoaXMubW9kdWxlU2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBtb2R1bGVDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1vZHVsZXNDb3B5KSk7XHJcbiAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLmZpbHRlck1vZHVsZXMobW9kdWxlQ29weSwgc2VhcmNoU3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJNb2R1bGVzKFxyXG4gICAgbW9kdWxlSXRlbXM6IE1vZHVsZUl0ZW1bXSB8IFNpZGViYXJFbnRyeVtdLFxyXG4gICAgc2VhcmNoVGVybTogc3RyaW5nXHJcbiAgKTogYW55W10ge1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMubW9kdWxlcykpIHJldHVybiBtYXRjaGVzO1xyXG5cclxuICAgIG1vZHVsZUl0ZW1zLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKGkubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XHJcbiAgICAgICAgaS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBtYXRjaGVzLnB1c2goaSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRSZXN1bHRzOiBTaWRlYmFyRW50cnlbXSA9IHRoaXMuZmlsdGVyTW9kdWxlcyhcclxuICAgICAgICAgIGkuY2hpbGRyZW4sXHJcbiAgICAgICAgICBzZWFyY2hUZXJtXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY2hpbGRSZXN1bHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbWF0Y2hlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGksIHsgY2hpbGRyZW46IGNoaWxkUmVzdWx0cyB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF0Y2hlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdWJJdGVtQ2xpY2tlZChpdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9kdWxlID0gdGhpcy5tb2R1bGVzLmZpbmQoXHJcbiAgICAgIChtKSA9PlxyXG4gICAgICAgIG0uYXV0aG9yaXphdGlvbklkID09PVxyXG4gICAgICAgIChpdGVtLmF1dGhvcml6YXRpb25JZCB8fCBpdGVtLm1vZHVsZUF1dGhvcml6YXRpb25JZClcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB0aGlzLnNlbGVjdGVkSXRlbS5hY3RpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtLnJlbGF0aW9uTmFtZSA9PT0gJ0RvY3VtZW50YXRpb24nKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuc2VsZWN0ZWRJdGVtLnVybCwgJ19ibGFuaycsICdub29wZW5lciBub3JlZmVycmVyJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAodGhpcy5zZWxlY3RlZE1vZHVsZSAmJiAhdGhpcy5zZWxlY3RlZE1vZHVsZS5lbnRpdHlBY2Nlc3MpIHx8XHJcbiAgICAgICF0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzcy5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLnJvdXRlVG9VcmwoKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb2R1bGUgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZE1vZHVsZS5lbnRpdHlBY2Nlc3MubGVuZ3RoID09PSAxXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc29sZVNob3AgPSB0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzc1swXTtcclxuICAgICAgdGhpcy5zdWJJdGVtU2VydmljZS5zYXZlSXRlbUluZm8odGhpcy5zZWxlY3RlZE1vZHVsZSwgc29sZVNob3ApO1xyXG4gICAgICB0aGlzLnJvdXRlVG9VcmwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWFwU2hvcE1vZGFsKCk7XHJcbiAgICAgIHRoaXMubmd4U21hcnRNb2RhbFNlcnZpY2UuZ2V0TW9kYWwoJ3Nob3BNb2RhbCcpLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZFNob3Aoc2VsZWN0ZWRTaG9wOiBTaG9wKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1Ykl0ZW1TZXJ2aWNlLnNhdmVJdGVtSW5mbyh0aGlzLnNlbGVjdGVkTW9kdWxlLCBzZWxlY3RlZFNob3AuaWQpO1xyXG4gICAgdGhpcy5yb3V0ZVRvVXJsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbWFwU2hvcE1vZGFsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlU2hvcHNDb3B5Lmxlbmd0aCA8IDEpIHtcclxuICAgICAgdGhpcy5hdmFpbGFibGVTaG9wc0NvcHkgPSBbLi4udGhpcy5hdmFpbGFibGVTaG9wc107XHJcbiAgICB9XHJcbiAgICB0aGlzLmF2YWlsYWJsZVNob3BzID0gdGhpcy5hdmFpbGFibGVTaG9wc0NvcHkuZmlsdGVyKChzaG9wKSA9PlxyXG4gICAgICB0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzcy5pbmNsdWRlcyhzaG9wLmlkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb1RvU3RhdHVzUGFnZSgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAnaHR0cHM6Ly9zdGF0dXMucmV0YWxpYS5jbG91ZCcsXHJcbiAgICAgICdfYmxhbmsnLFxyXG4gICAgICAnbm9vcGVuZXIgbm9yZWZlcnJlcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm91dGVUb1VybCgpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50TW9kdWxlID0gdGhpcy5tb2R1bGVTZXJ2aWNlLmdldEN1cnJlbnRNb2R1bGUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgaWYgKFxyXG4gICAgICBjdXJyZW50TW9kdWxlICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtICYmXHJcbiAgICAgIChjdXJyZW50TW9kdWxlLmF1dGhvcml6YXRpb25JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0uYXV0aG9yaXphdGlvbklkIHx8XHJcbiAgICAgICBjdXJyZW50TW9kdWxlLmF1dGhvcml6YXRpb25JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0ubW9kdWxlQXV0aG9yaXphdGlvbklkKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBjdXJyZW50SXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEl0ZW0pKTtcclxuICAgICAgY29uc3QgcGF0aEFycmF5ID0gdGhpcy5zZWxlY3RlZEl0ZW0udXJsLnNwbGl0KCcvJyk7XHJcbiAgICAgIHBhdGhBcnJheS5zcGxpY2UoMCwgMik7XHJcbiAgICAgIGN1cnJlbnRJdGVtLnVybCA9IHBhdGhBcnJheS5qb2luKCcvJyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZS5lbWl0KGN1cnJlbnRJdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1VcmwgPSB0aGlzLnNlbGVjdGVkSXRlbS51cmw7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaXRlbVVybDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TW9kdWxlcyhpc0ZpcnN0Q2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGFwaVVybCA9IHRoaXMuZW52aXJvbm1lbnQuYXBpUmVxdWVzdFVybDtcclxuICAgIGlmIChhcGlVcmwuZW5kc1dpdGgoXCIvXCIpKVxyXG4gICAgIGFwaVVybCA9IGFwaVVybC5zbGljZSgwLCAtMSk7XHJcblxyXG4gICAgdGhpcy5tb2R1bGVTZXJ2aWNlLmdldFVzZXJNb2R1bGVzKGFwaVVybCwgJycpLnRoZW4oKG1vZHVsZU9iamVjdCkgPT4ge1xyXG4gICAgICBpZiAoIW1vZHVsZU9iamVjdCB8fCAhbW9kdWxlT2JqZWN0Lm1vZHVsZXNEZXRhaWxzKSB7XHJcbiAgICAgICAgaWYgKGlzRmlyc3RDYWxsKSB7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgVUkgcmVsaWVzIG9uIGFuIGludGVyY2VwdG9yIHRvIHJlZmlyZSBmYWlsZWQgQVBJIGNhbGxzLCB0aGUgaW5pdGlhbCBtb2R1bGUgY2FsbCB3aWxsIGZhaWxcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5nZXRNb2R1bGVzKGZhbHNlKSwgMTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBObyBtb2R1bGVzIHdlcmUgZm91bmQgdXNpbmc6ICR7YXBpVXJsfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXZhaWxhYmxlU2hvcHMgPSBtb2R1bGVPYmplY3Quc2hvcHM7XHJcbiAgICAgIHRoaXMubW9kdWxlcyA9IHRoaXMubW9kdWxlU2VydmljZS5tYXBNb2R1bGVJdGVtcyhcclxuICAgICAgICBtb2R1bGVPYmplY3QubW9kdWxlc0RldGFpbHNcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLm1vZHVsZVNlcnZpY2UuZmluZE5lc3RlZFVybE1hdGNoKHRoaXMubW9kdWxlcyx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xyXG4gICAgICB0aGlzLnBhbmVsQnV0dG9uU3RhdGVzLmlzTW9kdWxlT3BlbiA9IHRoaXMuaXNTaWRlYmFyT3BlbjtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwic2lkZWJhci1wYW5lbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWl0ZW1cIiAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigkZXZlbnQsICdpc01vZHVsZU9wZW4nKVwiIGRhdGEtdGVzdGlkPVwibmF2LW1lbnVcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwiIXBhbmVsQnV0dG9uU3RhdGVzLmlzTW9kdWxlT3BlblwiIGhlaWdodD1cIjE0XCIgd2lkdGg9XCIyMVwiIHZpZXdCb3g9XCIwIDAgMTggMTJcIlxyXG4gICAgICAgICAgICBmaWxsPVwiIzNlM2UzZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pbllNaW4gbWVldFwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMTJIMThWMTBIMFYxMlpNMCA3SDE4VjVIMFY3Wk0wIDBWMkgxOFYwSDBaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNNb2R1bGVPcGVuXCIgaGVpZ2h0PVwiMTNcIiB3aWR0aD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxNFwiXHJcbiAgICAgICAgICAgIGZpbGw9XCIjM2UzZTNlXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWluWU1pbiBtZWV0XCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE0IDEuNDFMMTIuNTkgMEw3IDUuNTlMMS40MSAwTDAgMS40MUw1LjU5IDdMMCAxMi41OUwxLjQxIDE0TDcgOC40MUwxMi41OSAxNEwxNCAxMi41OUw4LjQxIDdMMTQgMS40MVpcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaXRlbVwiIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKCRldmVudCwgJ2lzU3VwcG9ydE9wZW4nKVwiIGRhdGEtdGVzdGlkPVwibmF2LXN1cHBvcnRcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwiIXBhbmVsQnV0dG9uU3RhdGVzLmlzU3VwcG9ydE9wZW5cIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE4IDIxXCJcclxuICAgICAgICAgICAgZmlsbD1cIiMzZTNlM2VcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE2IDBIMkMwLjg5IDAgMCAwLjkgMCAyVjE2QzAgMTcuMSAwLjg5IDE4IDIgMThINkw5IDIxTDEyIDE4SDE2QzE3LjEgMTggMTggMTcuMSAxOCAxNlYyQzE4IDAuOSAxNy4xIDAgMTYgMFpNMTAgMTZIOFYxNEgxMFYxNlpNMTIuMDcgOC4yNUwxMS4xNyA5LjE3QzEwLjQ1IDkuOSAxMCAxMC41IDEwIDEySDhWMTEuNUM4IDEwLjQgOC40NSA5LjQgOS4xNyA4LjY3TDEwLjQxIDcuNDFDMTAuNzggNy4wNSAxMSA2LjU1IDExIDZDMTEgNC45IDEwLjEgNCA5IDRDNy45IDQgNyA0LjkgNyA2SDVDNSAzLjc5IDYuNzkgMiA5IDJDMTEuMjEgMiAxMyAzLjc5IDEzIDZDMTMgNi44OCAxMi42NCA3LjY4IDEyLjA3IDguMjVaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNTdXBwb3J0T3BlblwiIGhlaWdodD1cIjEzXCIgd2lkdGg9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxyXG4gICAgICAgICAgICBmaWxsPVwiIzNlM2UzZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pbllNaW4gbWVldFwiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNCAxLjQxTDEyLjU5IDBMNyA1LjU5TDEuNDEgMEwwIDEuNDFMNS41OSA3TDAgMTIuNTlMMS40MSAxNEw3IDguNDFMMTIuNTkgMTRMMTQgMTIuNTlMOC40MSA3TDE0IDEuNDFaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWJ1dHRvblwiIChtb3VzZW92ZXIpPVwiaGlkZVN0YXR1cyA9IGZhbHNlXCIgKG1vdXNlbGVhdmUpPVwiaGlkZVN0YXR1cyA9IHRydWVcIlxyXG4gICAgICAgIChjbGljayk9XCJnb1RvU3RhdHVzUGFnZSgpXCIgZGF0YS10ZXN0aWQ9XCJzaWRlYmFyLXN0YXR1c1wiPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwYW5lbC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCIjRkZGRkZGXCJcclxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0yMC42MjUgNi41SDEuMzc1QzAuNjE1NjEzIDYuNSAwIDUuODI4NDIgMCA1VjJDMCAxLjE3MTU4IDAuNjE1NjEzIDAuNSAxLjM3NSAwLjVIMjAuNjI1QzIxLjM4NDQgMC41IDIyIDEuMTcxNTggMjIgMlY1QzIyIDUuODI4NDIgMjEuMzg0NCA2LjUgMjAuNjI1IDYuNVpNMTguNTYyNSAyLjM3NUMxNy45OTI5IDIuMzc1IDE3LjUzMTIgMi44Nzg2NyAxNy41MzEyIDMuNUMxNy41MzEyIDQuMTIxMzMgMTcuOTkyOSA0LjYyNSAxOC41NjI1IDQuNjI1QzE5LjEzMjEgNC42MjUgMTkuNTkzOCA0LjEyMTMzIDE5LjU5MzggMy41QzE5LjU5MzggMi44Nzg2NyAxOS4xMzIxIDIuMzc1IDE4LjU2MjUgMi4zNzVaTTE1LjgxMjUgMi4zNzVDMTUuMjQyOSAyLjM3NSAxNC43ODEyIDIuODc4NjcgMTQuNzgxMiAzLjVDMTQuNzgxMiA0LjEyMTMzIDE1LjI0MjkgNC42MjUgMTUuODEyNSA0LjYyNUMxNi4zODIxIDQuNjI1IDE2Ljg0MzggNC4xMjEzMyAxNi44NDM4IDMuNUMxNi44NDM4IDIuODc4NjcgMTYuMzgyMSAyLjM3NSAxNS44MTI1IDIuMzc1Wk0yMC42MjUgMTRIMS4zNzVDMC42MTU2MTMgMTQgMCAxMy4zMjg0IDAgMTIuNVY5LjVDMCA4LjY3MTU4IDAuNjE1NjEzIDggMS4zNzUgOEgyMC42MjVDMjEuMzg0NCA4IDIyIDguNjcxNTggMjIgOS41VjEyLjVDMjIgMTMuMzI4NCAyMS4zODQ0IDE0IDIwLjYyNSAxNFpNMTguNTYyNSA5Ljg3NUMxNy45OTI5IDkuODc1IDE3LjUzMTIgMTAuMzc4NyAxNy41MzEyIDExQzE3LjUzMTIgMTEuNjIxMyAxNy45OTI5IDEyLjEyNSAxOC41NjI1IDEyLjEyNUMxOS4xMzIxIDEyLjEyNSAxOS41OTM4IDExLjYyMTMgMTkuNTkzOCAxMUMxOS41OTM4IDEwLjM3ODcgMTkuMTMyMSA5Ljg3NSAxOC41NjI1IDkuODc1Wk0xNS44MTI1IDkuODc1QzE1LjI0MjkgOS44NzUgMTQuNzgxMiAxMC4zNzg3IDE0Ljc4MTIgMTFDMTQuNzgxMiAxMS42MjEzIDE1LjI0MjkgMTIuMTI1IDE1LjgxMjUgMTIuMTI1QzE2LjM4MjEgMTIuMTI1IDE2Ljg0MzggMTEuNjIxMyAxNi44NDM4IDExQzE2Ljg0MzggMTAuMzc4NyAxNi4zODIxIDkuODc1IDE1LjgxMjUgOS44NzVaTTIwLjYyNSAyMS41SDEuMzc1QzAuNjE1NjEzIDIxLjUgMCAyMC44Mjg0IDAgMjBWMTdDMCAxNi4xNzE2IDAuNjE1NjEzIDE1LjUgMS4zNzUgMTUuNUgyMC42MjVDMjEuMzg0NCAxNS41IDIyIDE2LjE3MTYgMjIgMTdWMjBDMjIgMjAuODI4NCAyMS4zODQ0IDIxLjUgMjAuNjI1IDIxLjVaTTE4LjU2MjUgMTcuMzc1QzE3Ljk5MjkgMTcuMzc1IDE3LjUzMTIgMTcuODc4NyAxNy41MzEyIDE4LjVDMTcuNTMxMiAxOS4xMjEzIDE3Ljk5MjkgMTkuNjI1IDE4LjU2MjUgMTkuNjI1QzE5LjEzMjEgMTkuNjI1IDE5LjU5MzggMTkuMTIxMyAxOS41OTM4IDE4LjVDMTkuNTkzOCAxNy44Nzg3IDE5LjEzMjEgMTcuMzc1IDE4LjU2MjUgMTcuMzc1Wk0xNS44MTI1IDE3LjM3NUMxNS4yNDI5IDE3LjM3NSAxNC43ODEyIDE3Ljg3ODcgMTQuNzgxMiAxOC41QzE0Ljc4MTIgMTkuMTIxMyAxNS4yNDI5IDE5LjYyNSAxNS44MTI1IDE5LjYyNUMxNi4zODIxIDE5LjYyNSAxNi44NDM4IDE5LjEyMTMgMTYuODQzOCAxOC41QzE2Ljg0MzggMTcuODc4NyAxNi4zODIxIDE3LjM3NSAxNS44MTI1IDE3LjM3NVpcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxpZnJhbWUgaWQ9XCJzdGF0dXMtZnJhbWVcIiBbbmdDbGFzc109XCJ7J2lzT3Blbic6ICFoaWRlU3RhdHVzLCAnaXNDbG9zZWQnOiBoaWRlU3RhdHVzIH1cIlxyXG4gICAgICAgICAgICBzcmM9XCIvL3N0YXR1cy5yZXRhbGlhLmNsb3VkL2VtYmVkLXN0YXR1cy9saWdodC1zbVwiIG5hbWU9XCJzdGF0dXNQYWdlXCIgd2lkdGg9XCIyMzBcIiBoZWlnaHQ9XCI2MVwiIGZyYW1lQm9yZGVyPVwiMFwiXHJcbiAgICAgICAgICAgIHNjcm9sbGluZz1cIm5vXCI+XHJcbiAgICAgICAgPC9pZnJhbWU+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGlkPVwic2lkZWJhci1jb250YWluZXJcIiBbY2xhc3Mub3Blbi1zaWRlYmFyXT1cImlzU2lkZWJhck9wZW5cIj5cclxuICAgIDxkaXYgaWQ9XCJzdGlja3ktaGVhZGVyXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImxvZ28tZnVsbFwiIGhlaWdodD1cIjQwcHhcIiBzcmM9XCJodHRwczovL2ltYWdpbmVzaGFyZWQuYmxvYi5jb3JlLndpbmRvd3MubmV0L3BvcnRhbC9yZXRhbGlhX2ZpbGVzL2xvZ29zL3NpZGViYXJfbG9nby5wbmdcIiAoY2xpY2spPVwiZ29Ub1BvcnRhbCgpXCJcclxuICAgICAgICBkYXRhLXRlc3RpZD1cIm5hdi1sb2dvXCIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kdWxlLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kdWxlU2VhcmNoYmFyXCIgKm5nSWY9XCJwYW5lbEJ1dHRvblN0YXRlcy5pc01vZHVsZU9wZW5cIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kdWxlU2VhcmNoSW5wdXRcIiB0eXBlPVwic2VhcmNoXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgaWQ9XCJzZWFyY2hcIiBbdmFsdWVdPVwibW9kdWxlU2VhcmNoVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJmYWxzZVwiIFtwbGFjZWhvbGRlcl09XCJtb2R1bGVTZWFyY2hQbGFjZWhvbGRlclwiIChrZXl1cCk9XCJoYW5kbGVNb2R1bGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlTW9kdWxlU2VhcmNoKCRldmVudClcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwibWVudVwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNNb2R1bGVPcGVuXCI+XHJcbiAgICAgICAgPHN1Yi1pdGVtIFtpdGVtc109XCJtb2R1bGVzXCI+PC9zdWItaXRlbT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBpZD1cIm1lbnVcIiAqbmdJZj1cInBhbmVsQnV0dG9uU3RhdGVzLmlzU3VwcG9ydE9wZW5cIj5cclxuICAgICAgICA8c3ViLWl0ZW0gW2l0ZW1zXT1cInN1cHBvcnRSb3V0ZXNcIj48L3N1Yi1pdGVtPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHNob3AtbW9kYWwgW2F2YWlsYWJsZVNob3BzXT1cImF2YWlsYWJsZVNob3BzXCIgKHNlbGVjdGVkU2hvcCk9XCJzZWxlY3RlZFNob3AoJGV2ZW50KVwiPjwvc2hvcC1tb2RhbD4iXX0=
1
+ import { Component, EventEmitter, Input, Output, } from '@angular/core';
2
+ import { supportRoutes } from '../data/support-routes';
3
+ import { CookieNames } from '../models/cookie-names';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../services/module.service";
6
+ import * as i2 from "../services/sub-item.service";
7
+ import * as i3 from "../services/cookie.service";
8
+ import * as i4 from "ngx-smart-modal";
9
+ import * as i5 from "@angular/common";
10
+ import * as i6 from "./sub-item/sub-item.component";
11
+ import * as i7 from "./shop-modal/shop-modal.component";
12
+ export class SidebarComponent {
13
+ constructor(moduleService, subItemService, cookieService, ngxSmartModalService) {
14
+ this.moduleService = moduleService;
15
+ this.subItemService = subItemService;
16
+ this.cookieService = cookieService;
17
+ this.ngxSmartModalService = ngxSmartModalService;
18
+ this.selectedRoute = new EventEmitter();
19
+ this.moduleSearchValue = '';
20
+ this.modules = [];
21
+ this.modulesCopy = [];
22
+ this.supportRoutes = supportRoutes;
23
+ this.availableShops = [];
24
+ this.availableShopsCopy = [];
25
+ this.moduleSearchPlaceholder = 'Search Modules ...';
26
+ this.isSidebarOpen = this.getSidebarState();
27
+ this.hideStatus = true;
28
+ this.panelButtonStates = {
29
+ isModuleOpen: false,
30
+ isSupportOpen: false,
31
+ };
32
+ this.subItemService.subItemClickEvent.subscribe((item) => {
33
+ this.subItemClicked(item);
34
+ });
35
+ }
36
+ ngOnChanges(changes) {
37
+ if (changes.environment && changes.environment.currentValue.apiRequestUrl) {
38
+ this.getModules(true);
39
+ }
40
+ }
41
+ // SIDEBAR
42
+ toggleSidebar(e, option) {
43
+ e.stopPropagation();
44
+ // Allows us to expand the panel items in future without needing to change the toggle logic
45
+ for (let item in Object(this.panelButtonStates)) {
46
+ item === option
47
+ ? (this.panelButtonStates[item] = !this.panelButtonStates[item])
48
+ : (this.panelButtonStates[item] = false);
49
+ }
50
+ this.isSidebarOpen = this.panelButtonStates[option];
51
+ this.setSidebarState();
52
+ }
53
+ setSidebarState() {
54
+ this.cookieService.setCookie(CookieNames.isSidebarOpen, this.isSidebarOpen);
55
+ }
56
+ getSidebarState() {
57
+ let isSidebarOpen = this.cookieService.getCookie(CookieNames.isSidebarOpen) == 'true';
58
+ if (typeof isSidebarOpen === 'undefined') {
59
+ return true;
60
+ }
61
+ return isSidebarOpen;
62
+ }
63
+ goToPortal() {
64
+ window.location.href = this.environment.portalUrl;
65
+ }
66
+ handleModuleSearch(e) {
67
+ if (this.modulesCopy.length < 1) {
68
+ this.modulesCopy = [...this.modules];
69
+ }
70
+ this.moduleSearchValue = e && e.target ? e.target.value : '';
71
+ const searchString = this.moduleSearchValue.toLowerCase();
72
+ const moduleCopy = JSON.parse(JSON.stringify(this.modulesCopy));
73
+ this.modules = this.filterModules(moduleCopy, searchString);
74
+ }
75
+ filterModules(moduleItems, searchTerm) {
76
+ const matches = [];
77
+ if (!Array.isArray(this.modules))
78
+ return matches;
79
+ moduleItems.forEach((i) => {
80
+ if (i.name.toLowerCase().includes(searchTerm)) {
81
+ i.visible = true;
82
+ matches.push(i);
83
+ }
84
+ else {
85
+ const childResults = this.filterModules(i.children, searchTerm);
86
+ if (childResults.length) {
87
+ matches.push(Object.assign({}, i, { children: childResults }));
88
+ }
89
+ }
90
+ });
91
+ return matches;
92
+ }
93
+ subItemClicked(item) {
94
+ this.selectedModule = this.modules.find((m) => m.authorizationId ===
95
+ (item.authorizationId || item.moduleAuthorizationId));
96
+ if (this.selectedItem)
97
+ this.selectedItem.active = false;
98
+ this.selectedItem = item;
99
+ this.selectedItem.active = true;
100
+ if (this.selectedItem.relationName === 'Documentation') {
101
+ window.open(this.selectedItem.url, '_blank', 'noopener noreferrer');
102
+ }
103
+ else if ((this.selectedModule && !this.selectedModule.entityAccess) ||
104
+ !this.selectedModule.entityAccess.length) {
105
+ this.routeToUrl();
106
+ }
107
+ else if (this.selectedModule &&
108
+ this.selectedModule.entityAccess.length === 1) {
109
+ const soleShop = this.selectedModule.entityAccess[0];
110
+ this.subItemService.saveItemInfo(this.selectedModule, soleShop);
111
+ this.routeToUrl();
112
+ }
113
+ else {
114
+ this.mapShopModal();
115
+ this.ngxSmartModalService.getModal('shopModal').open();
116
+ }
117
+ }
118
+ selectedShop(selectedShop) {
119
+ this.subItemService.saveItemInfo(this.selectedModule, selectedShop.id);
120
+ this.routeToUrl();
121
+ }
122
+ mapShopModal() {
123
+ if (this.availableShopsCopy.length < 1) {
124
+ this.availableShopsCopy = [...this.availableShops];
125
+ }
126
+ this.availableShops = this.availableShopsCopy.filter((shop) => this.selectedModule.entityAccess.includes(shop.id));
127
+ }
128
+ goToStatusPage() {
129
+ window.open('https://status.retalia.cloud', '_blank', 'noopener noreferrer');
130
+ }
131
+ routeToUrl() {
132
+ let currentModule = this.moduleService.getCurrentModule(this.selectedItem);
133
+ if (currentModule &&
134
+ this.selectedItem &&
135
+ (currentModule.authorizationId === this.selectedItem.authorizationId ||
136
+ currentModule.authorizationId === this.selectedItem.moduleAuthorizationId)) {
137
+ let currentItem = JSON.parse(JSON.stringify(this.selectedItem));
138
+ const pathArray = this.selectedItem.url.split('/');
139
+ pathArray.splice(0, 2);
140
+ currentItem.url = pathArray.join('/');
141
+ this.selectedRoute.emit(currentItem);
142
+ }
143
+ else {
144
+ const itemUrl = this.selectedItem.url;
145
+ window.location.href = itemUrl;
146
+ }
147
+ }
148
+ getModules(isFirstCall) {
149
+ let apiUrl = this.environment.apiRequestUrl;
150
+ if (apiUrl.endsWith("/"))
151
+ apiUrl = apiUrl.slice(0, -1);
152
+ this.moduleService.getUserModules(apiUrl, '').then((moduleObject) => {
153
+ if (!moduleObject || !moduleObject.modulesDetails) {
154
+ if (isFirstCall) {
155
+ // If the UI relies on an interceptor to refire failed API calls, the initial module call will fail
156
+ setTimeout(() => this.getModules(false), 1000);
157
+ }
158
+ else {
159
+ console.log(`No modules were found using: ${apiUrl}`);
160
+ }
161
+ return;
162
+ }
163
+ this.availableShops = moduleObject.shops;
164
+ this.modules = this.moduleService.mapModuleItems(moduleObject.modulesDetails);
165
+ this.selectedItem = this.moduleService.findNestedUrlMatch(this.modules, window.location.pathname);
166
+ this.panelButtonStates.isModuleOpen = this.isSidebarOpen;
167
+ });
168
+ }
169
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SidebarComponent, deps: [{ token: i1.ModuleService }, { token: i2.SubItemService }, { token: i3.CookieService }, { token: i4.NgxSmartModalService }], target: i0.ɵɵFactoryTarget.Component }); }
170
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: SidebarComponent, selector: "sidebar", inputs: { environment: "environment", moduleSearchValue: "moduleSearchValue" }, outputs: { selectedRoute: "selectedRoute" }, usesOnChanges: true, ngImport: i0, template: "<div id=\"sidebar-panel\">\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isModuleOpen')\" data-testid=\"nav-menu\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isModuleOpen\" height=\"14\" width=\"21\" viewBox=\"0 0 18 12\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path d=\"M0 12H18V10H0V12ZM0 7H18V5H0V7ZM0 0V2H18V0H0Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isModuleOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isSupportOpen')\" data-testid=\"nav-support\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isSupportOpen\" width=\"18\" height=\"21\" viewBox=\"0 0 18 21\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 0H2C0.89 0 0 0.9 0 2V16C0 17.1 0.89 18 2 18H6L9 21L12 18H16C17.1 18 18 17.1 18 16V2C18 0.9 17.1 0 16 0ZM10 16H8V14H10V16ZM12.07 8.25L11.17 9.17C10.45 9.9 10 10.5 10 12H8V11.5C8 10.4 8.45 9.4 9.17 8.67L10.41 7.41C10.78 7.05 11 6.55 11 6C11 4.9 10.1 4 9 4C7.9 4 7 4.9 7 6H5C5 3.79 6.79 2 9 2C11.21 2 13 3.79 13 6C13 6.88 12.64 7.68 12.07 8.25Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isSupportOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n\r\n\r\n <div class=\"status-button\" (mouseover)=\"hideStatus = false\" (mouseleave)=\"hideStatus = true\"\r\n (click)=\"goToStatusPage()\" data-testid=\"sidebar-status\">\r\n <svg class=\"panel-icon\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"#FFFFFF\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M20.625 6.5H1.375C0.615613 6.5 0 5.82842 0 5V2C0 1.17158 0.615613 0.5 1.375 0.5H20.625C21.3844 0.5 22 1.17158 22 2V5C22 5.82842 21.3844 6.5 20.625 6.5ZM18.5625 2.375C17.9929 2.375 17.5312 2.87867 17.5312 3.5C17.5312 4.12133 17.9929 4.625 18.5625 4.625C19.1321 4.625 19.5938 4.12133 19.5938 3.5C19.5938 2.87867 19.1321 2.375 18.5625 2.375ZM15.8125 2.375C15.2429 2.375 14.7812 2.87867 14.7812 3.5C14.7812 4.12133 15.2429 4.625 15.8125 4.625C16.3821 4.625 16.8438 4.12133 16.8438 3.5C16.8438 2.87867 16.3821 2.375 15.8125 2.375ZM20.625 14H1.375C0.615613 14 0 13.3284 0 12.5V9.5C0 8.67158 0.615613 8 1.375 8H20.625C21.3844 8 22 8.67158 22 9.5V12.5C22 13.3284 21.3844 14 20.625 14ZM18.5625 9.875C17.9929 9.875 17.5312 10.3787 17.5312 11C17.5312 11.6213 17.9929 12.125 18.5625 12.125C19.1321 12.125 19.5938 11.6213 19.5938 11C19.5938 10.3787 19.1321 9.875 18.5625 9.875ZM15.8125 9.875C15.2429 9.875 14.7812 10.3787 14.7812 11C14.7812 11.6213 15.2429 12.125 15.8125 12.125C16.3821 12.125 16.8438 11.6213 16.8438 11C16.8438 10.3787 16.3821 9.875 15.8125 9.875ZM20.625 21.5H1.375C0.615613 21.5 0 20.8284 0 20V17C0 16.1716 0.615613 15.5 1.375 15.5H20.625C21.3844 15.5 22 16.1716 22 17V20C22 20.8284 21.3844 21.5 20.625 21.5ZM18.5625 17.375C17.9929 17.375 17.5312 17.8787 17.5312 18.5C17.5312 19.1213 17.9929 19.625 18.5625 19.625C19.1321 19.625 19.5938 19.1213 19.5938 18.5C19.5938 17.8787 19.1321 17.375 18.5625 17.375ZM15.8125 17.375C15.2429 17.375 14.7812 17.8787 14.7812 18.5C14.7812 19.1213 15.2429 19.625 15.8125 19.625C16.3821 19.625 16.8438 19.1213 16.8438 18.5C16.8438 17.8787 16.3821 17.375 15.8125 17.375Z\" />\r\n </svg>\r\n <iframe id=\"status-frame\" [ngClass]=\"{'isOpen': !hideStatus, 'isClosed': hideStatus }\"\r\n src=\"//status.retalia.cloud/embed-status/light-sm\" name=\"statusPage\" width=\"230\" height=\"61\" frameBorder=\"0\"\r\n scrolling=\"no\">\r\n </iframe>\r\n </div>\r\n</div>\r\n\r\n<div id=\"sidebar-container\" [class.open-sidebar]=\"isSidebarOpen\">\r\n <div id=\"sticky-header\">\r\n <img class=\"logo-full\" height=\"40px\" src=\"https://imagineshared.blob.core.windows.net/portal/retalia_files/logos/sidebar_logo.png\" (click)=\"goToPortal()\"\r\n data-testid=\"nav-logo\" />\r\n <div class=\"module-divider\"></div>\r\n <div class=\"moduleSearchbar\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <input class=\"moduleSearchInput\" type=\"search\" autocomplete=\"off\" id=\"search\" [value]=\"moduleSearchValue\"\r\n required=\"false\" [placeholder]=\"moduleSearchPlaceholder\" (keyup)=\"handleModuleSearch($event)\"\r\n (click)=\"handleModuleSearch($event)\" />\r\n </div>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <sub-item [items]=\"modules\"></sub-item>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isSupportOpen\">\r\n <sub-item [items]=\"supportRoutes\"></sub-item>\r\n </div>\r\n</div>\r\n\r\n<shop-modal [availableShops]=\"availableShops\" (selectedShop)=\"selectedShop($event)\"></shop-modal>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;1,300;1,400;1,600&display=swap\";.imagine-body{background-color:#fafbfc}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Bold.ttf) format(\"truetype\");font-weight:700;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Italic.ttf) format(\"truetype\");font-weight:400;font-style:italic}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-SemiBold.ttf) format(\"truetype\");font-weight:600;font-style:normal}#sidebar-panel{z-index:1;position:fixed;float:left;width:60px;height:100vh;color:#000;text-align:center;transition:.2s linear;background-color:#fff;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-panel{height:100%}}.panel-item{cursor:pointer;position:relative;height:40px;margin:10px;transition:.2s linear;border-radius:50%}.panel-item:hover{background-color:#919295}.panel-item:hover .panel-icon{fill:#fff}.panel-item:active,.panel-item:focus{background:#54545433}.panel-item:active .panel-icon,.panel-item:focus .panel-icon{fill:#545454}.panel-item .panel-icon{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#sidebar-container{position:sticky;top:0;height:100vh;overflow:hidden;font-size:12px;font-family:Poppins,sans-serif;width:0px;background:#f2f2f2;padding-left:60px;transition:.3s;transition-timing-function:cubic-bezier(.11,.95,.91,.93);-ms-overflow-style:none;scrollbar-width:none;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-container{top:auto;position:relative;border-right:0px}}.open-sidebar{width:260px!important}@media (max-width: 37.5em){.open-sidebar{width:160px!important}}@media print{#container{display:none}}.module-divider{width:240px;margin:10px;border-top:.2px solid rgba(128,128,128,.2);background-clip:padding-box}@media (max-width: 37.5em){.module-divider{width:240px!important}}div#menu{display:flex;flex-flow:column;background-color:transparent;z-index:10;direction:ltr;float:left;width:258px;height:85%;overflow-y:overlay;overflow-x:hidden;transition:.2s linear}@media (max-width: 37.5em){div#menu{width:160px!important}}.moduleSearchbar{z-index:20;position:inherit;cursor:pointer;width:240px;height:28px;border-radius:4px;margin:10px;background:#e2e2e2}@media (max-width: 37.5em){.moduleSearchbar{width:140px!important;height:40px}}.moduleSearchbar .moduleSearchInput{direction:ltr;width:inherit;height:inherit;padding-left:10px;color:#545454;background-color:transparent;border-style:none;outline:none;-webkit-appearance:none}.moduleSearchbar input:invalid{box-shadow:none}.moduleSearchbar ::placeholder{color:#919295;font-size:11px;opacity:1}#sticky-header{margin-top:10px;width:100%;text-align:center;position:sticky;transition:1s ease}#sticky-header .logo-full{cursor:pointer;padding:5px 21px 0}.status-button{cursor:pointer;position:inherit;bottom:0;margin-left:8px;margin-bottom:15px;width:40px;height:32px;padding-top:8px;border-radius:50%;transition:.2s linear}.status-button .panel-icon{fill:#0c1830}.status-button:hover{background-color:#545454}.status-button:hover .panel-icon{fill:#fff}#status-frame{position:inherit;bottom:-8px;padding-left:25px;transition:.2s linear}.isOpen{opacity:1;visibility:visible}.isClosed{opacity:0;visibility:hidden}::-webkit-scrollbar{width:5px;background:transparent}::-webkit-scrollbar-thumb{background-color:#5454544d;border-radius:10px;-webkit-transition:.2s linear;transition:.2s linear}::-webkit-scrollbar-thumb:hover{background-color:#545454e6}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i6.SubItemComponent, selector: "sub-item", inputs: ["items"] }, { kind: "component", type: i7.ShopModalComponent, selector: "shop-modal", inputs: ["availableShops", "shopSearchValue"], outputs: ["selectedShop"] }] }); }
171
+ }
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: SidebarComponent, decorators: [{
173
+ type: Component,
174
+ args: [{ selector: 'sidebar', template: "<div id=\"sidebar-panel\">\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isModuleOpen')\" data-testid=\"nav-menu\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isModuleOpen\" height=\"14\" width=\"21\" viewBox=\"0 0 18 12\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path d=\"M0 12H18V10H0V12ZM0 7H18V5H0V7ZM0 0V2H18V0H0Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isModuleOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n <div class=\"panel-item\" (click)=\"toggleSidebar($event, 'isSupportOpen')\" data-testid=\"nav-support\">\r\n <svg class=\"panel-icon\" *ngIf=\"!panelButtonStates.isSupportOpen\" width=\"18\" height=\"21\" viewBox=\"0 0 18 21\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M16 0H2C0.89 0 0 0.9 0 2V16C0 17.1 0.89 18 2 18H6L9 21L12 18H16C17.1 18 18 17.1 18 16V2C18 0.9 17.1 0 16 0ZM10 16H8V14H10V16ZM12.07 8.25L11.17 9.17C10.45 9.9 10 10.5 10 12H8V11.5C8 10.4 8.45 9.4 9.17 8.67L10.41 7.41C10.78 7.05 11 6.55 11 6C11 4.9 10.1 4 9 4C7.9 4 7 4.9 7 6H5C5 3.79 6.79 2 9 2C11.21 2 13 3.79 13 6C13 6.88 12.64 7.68 12.07 8.25Z\" />\r\n </svg>\r\n <svg class=\"panel-icon\" *ngIf=\"panelButtonStates.isSupportOpen\" height=\"13\" width=\"13\" viewBox=\"0 0 14 14\"\r\n fill=\"#3e3e3e\" xmlns=\"http://www.w3.org/2000/svg\" preserveAspectRatio=\"xMinYMin meet\">\r\n <path\r\n d=\"M14 1.41L12.59 0L7 5.59L1.41 0L0 1.41L5.59 7L0 12.59L1.41 14L7 8.41L12.59 14L14 12.59L8.41 7L14 1.41Z\" />\r\n </svg>\r\n </div>\r\n\r\n\r\n <div class=\"status-button\" (mouseover)=\"hideStatus = false\" (mouseleave)=\"hideStatus = true\"\r\n (click)=\"goToStatusPage()\" data-testid=\"sidebar-status\">\r\n <svg class=\"panel-icon\" width=\"22\" height=\"22\" viewBox=\"0 0 22 22\" fill=\"#FFFFFF\"\r\n xmlns=\"http://www.w3.org/2000/svg\">\r\n <path\r\n d=\"M20.625 6.5H1.375C0.615613 6.5 0 5.82842 0 5V2C0 1.17158 0.615613 0.5 1.375 0.5H20.625C21.3844 0.5 22 1.17158 22 2V5C22 5.82842 21.3844 6.5 20.625 6.5ZM18.5625 2.375C17.9929 2.375 17.5312 2.87867 17.5312 3.5C17.5312 4.12133 17.9929 4.625 18.5625 4.625C19.1321 4.625 19.5938 4.12133 19.5938 3.5C19.5938 2.87867 19.1321 2.375 18.5625 2.375ZM15.8125 2.375C15.2429 2.375 14.7812 2.87867 14.7812 3.5C14.7812 4.12133 15.2429 4.625 15.8125 4.625C16.3821 4.625 16.8438 4.12133 16.8438 3.5C16.8438 2.87867 16.3821 2.375 15.8125 2.375ZM20.625 14H1.375C0.615613 14 0 13.3284 0 12.5V9.5C0 8.67158 0.615613 8 1.375 8H20.625C21.3844 8 22 8.67158 22 9.5V12.5C22 13.3284 21.3844 14 20.625 14ZM18.5625 9.875C17.9929 9.875 17.5312 10.3787 17.5312 11C17.5312 11.6213 17.9929 12.125 18.5625 12.125C19.1321 12.125 19.5938 11.6213 19.5938 11C19.5938 10.3787 19.1321 9.875 18.5625 9.875ZM15.8125 9.875C15.2429 9.875 14.7812 10.3787 14.7812 11C14.7812 11.6213 15.2429 12.125 15.8125 12.125C16.3821 12.125 16.8438 11.6213 16.8438 11C16.8438 10.3787 16.3821 9.875 15.8125 9.875ZM20.625 21.5H1.375C0.615613 21.5 0 20.8284 0 20V17C0 16.1716 0.615613 15.5 1.375 15.5H20.625C21.3844 15.5 22 16.1716 22 17V20C22 20.8284 21.3844 21.5 20.625 21.5ZM18.5625 17.375C17.9929 17.375 17.5312 17.8787 17.5312 18.5C17.5312 19.1213 17.9929 19.625 18.5625 19.625C19.1321 19.625 19.5938 19.1213 19.5938 18.5C19.5938 17.8787 19.1321 17.375 18.5625 17.375ZM15.8125 17.375C15.2429 17.375 14.7812 17.8787 14.7812 18.5C14.7812 19.1213 15.2429 19.625 15.8125 19.625C16.3821 19.625 16.8438 19.1213 16.8438 18.5C16.8438 17.8787 16.3821 17.375 15.8125 17.375Z\" />\r\n </svg>\r\n <iframe id=\"status-frame\" [ngClass]=\"{'isOpen': !hideStatus, 'isClosed': hideStatus }\"\r\n src=\"//status.retalia.cloud/embed-status/light-sm\" name=\"statusPage\" width=\"230\" height=\"61\" frameBorder=\"0\"\r\n scrolling=\"no\">\r\n </iframe>\r\n </div>\r\n</div>\r\n\r\n<div id=\"sidebar-container\" [class.open-sidebar]=\"isSidebarOpen\">\r\n <div id=\"sticky-header\">\r\n <img class=\"logo-full\" height=\"40px\" src=\"https://imagineshared.blob.core.windows.net/portal/retalia_files/logos/sidebar_logo.png\" (click)=\"goToPortal()\"\r\n data-testid=\"nav-logo\" />\r\n <div class=\"module-divider\"></div>\r\n <div class=\"moduleSearchbar\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <input class=\"moduleSearchInput\" type=\"search\" autocomplete=\"off\" id=\"search\" [value]=\"moduleSearchValue\"\r\n required=\"false\" [placeholder]=\"moduleSearchPlaceholder\" (keyup)=\"handleModuleSearch($event)\"\r\n (click)=\"handleModuleSearch($event)\" />\r\n </div>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isModuleOpen\">\r\n <sub-item [items]=\"modules\"></sub-item>\r\n </div>\r\n <div id=\"menu\" *ngIf=\"panelButtonStates.isSupportOpen\">\r\n <sub-item [items]=\"supportRoutes\"></sub-item>\r\n </div>\r\n</div>\r\n\r\n<shop-modal [availableShops]=\"availableShops\" (selectedShop)=\"selectedShop($event)\"></shop-modal>", styles: ["@import\"https://fonts.googleapis.com/css2?family=Source+Sans+Pro:ital,wght@0,300;0,400;1,300;1,400;1,600&display=swap\";.imagine-body{background-color:#fafbfc}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Regular.ttf) format(\"truetype\");font-weight:400;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Bold.ttf) format(\"truetype\");font-weight:700;font-style:normal}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-Italic.ttf) format(\"truetype\");font-weight:400;font-style:italic}@font-face{font-family:Poppins;src:url(../assets/fonts/Poppins-SemiBold.ttf) format(\"truetype\");font-weight:600;font-style:normal}#sidebar-panel{z-index:1;position:fixed;float:left;width:60px;height:100vh;color:#000;text-align:center;transition:.2s linear;background-color:#fff;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-panel{height:100%}}.panel-item{cursor:pointer;position:relative;height:40px;margin:10px;transition:.2s linear;border-radius:50%}.panel-item:hover{background-color:#919295}.panel-item:hover .panel-icon{fill:#fff}.panel-item:active,.panel-item:focus{background:#54545433}.panel-item:active .panel-icon,.panel-item:focus .panel-icon{fill:#545454}.panel-item .panel-icon{margin:0;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%)}#sidebar-container{position:sticky;top:0;height:100vh;overflow:hidden;font-size:12px;font-family:Poppins,sans-serif;width:0px;background:#f2f2f2;padding-left:60px;transition:.3s;transition-timing-function:cubic-bezier(.11,.95,.91,.93);-ms-overflow-style:none;scrollbar-width:none;box-shadow:0 0 4px #0003}@media (max-width: 37.5em){#sidebar-container{top:auto;position:relative;border-right:0px}}.open-sidebar{width:260px!important}@media (max-width: 37.5em){.open-sidebar{width:160px!important}}@media print{#container{display:none}}.module-divider{width:240px;margin:10px;border-top:.2px solid rgba(128,128,128,.2);background-clip:padding-box}@media (max-width: 37.5em){.module-divider{width:240px!important}}div#menu{display:flex;flex-flow:column;background-color:transparent;z-index:10;direction:ltr;float:left;width:258px;height:85%;overflow-y:overlay;overflow-x:hidden;transition:.2s linear}@media (max-width: 37.5em){div#menu{width:160px!important}}.moduleSearchbar{z-index:20;position:inherit;cursor:pointer;width:240px;height:28px;border-radius:4px;margin:10px;background:#e2e2e2}@media (max-width: 37.5em){.moduleSearchbar{width:140px!important;height:40px}}.moduleSearchbar .moduleSearchInput{direction:ltr;width:inherit;height:inherit;padding-left:10px;color:#545454;background-color:transparent;border-style:none;outline:none;-webkit-appearance:none}.moduleSearchbar input:invalid{box-shadow:none}.moduleSearchbar ::placeholder{color:#919295;font-size:11px;opacity:1}#sticky-header{margin-top:10px;width:100%;text-align:center;position:sticky;transition:1s ease}#sticky-header .logo-full{cursor:pointer;padding:5px 21px 0}.status-button{cursor:pointer;position:inherit;bottom:0;margin-left:8px;margin-bottom:15px;width:40px;height:32px;padding-top:8px;border-radius:50%;transition:.2s linear}.status-button .panel-icon{fill:#0c1830}.status-button:hover{background-color:#545454}.status-button:hover .panel-icon{fill:#fff}#status-frame{position:inherit;bottom:-8px;padding-left:25px;transition:.2s linear}.isOpen{opacity:1;visibility:visible}.isClosed{opacity:0;visibility:hidden}::-webkit-scrollbar{width:5px;background:transparent}::-webkit-scrollbar-thumb{background-color:#5454544d;border-radius:10px;-webkit-transition:.2s linear;transition:.2s linear}::-webkit-scrollbar-thumb:hover{background-color:#545454e6}input[type=search]::-webkit-search-decoration,input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-results-button,input[type=search]::-webkit-search-results-decoration{-webkit-appearance:none}\n"] }]
175
+ }], ctorParameters: function () { return [{ type: i1.ModuleService }, { type: i2.SubItemService }, { type: i3.CookieService }, { type: i4.NgxSmartModalService }]; }, propDecorators: { selectedRoute: [{
176
+ type: Output
177
+ }], environment: [{
178
+ type: Input
179
+ }], moduleSearchValue: [{
180
+ type: Input
181
+ }] } });
182
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZWJhci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9zaWRlYmFyLW5hdmlnYXRpb24vc3JjL2xpYi9zaWRlYmFyL3NpZGViYXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvc2lkZWJhci1uYXZpZ2F0aW9uL3NyYy9saWIvc2lkZWJhci9zaWRlYmFyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFFTCxNQUFNLEdBRVAsTUFBTSxlQUFlLENBQUM7QUFNdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQzs7Ozs7Ozs7O0FBUXJELE1BQU0sT0FBTyxnQkFBZ0I7SUFtQjNCLFlBQ1UsYUFBNEIsRUFDNUIsY0FBOEIsRUFDOUIsYUFBNEIsRUFDN0Isb0JBQTBDO1FBSHpDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLG1CQUFjLEdBQWQsY0FBYyxDQUFnQjtRQUM5QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtRQUM3Qix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBdEJ6QyxrQkFBYSxHQUErQixJQUFJLFlBQVksRUFBRSxDQUFDO1FBRWhFLHNCQUFpQixHQUFRLEVBQUUsQ0FBQztRQUNyQyxZQUFPLEdBQWlCLEVBQUUsQ0FBQztRQUMzQixnQkFBVyxHQUFpQixFQUFFLENBQUM7UUFDL0Isa0JBQWEsR0FBaUIsYUFBYSxDQUFDO1FBRzVDLG1CQUFjLEdBQVcsRUFBRSxDQUFDO1FBQzVCLHVCQUFrQixHQUFXLEVBQUUsQ0FBQztRQUNoQyw0QkFBdUIsR0FBRyxvQkFBb0IsQ0FBQztRQUMvQyxrQkFBYSxHQUFZLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNoRCxl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TCxDQUFDOytHQXRNVSxnQkFBZ0I7bUdBQWhCLGdCQUFnQixpTUN0QjdCLDY2S0EyRGlHOzs0RkRyQ3BGLGdCQUFnQjtrQkFMNUIsU0FBUzsrQkFDRSxTQUFTO2dNQUtULGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0UsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxpQkFBaUI7c0JBQXpCLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSW5wdXQsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIE91dHB1dCxcclxuICBTaW1wbGVDaGFuZ2VzLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBNb2R1bGVJdGVtLCBTaG9wLCBTaWRlYmFyRW50cnkgfSBmcm9tICcuLi9tb2RlbHMvbW9kdWxlJztcclxuaW1wb3J0IHsgU3ViSXRlbVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zdWItaXRlbS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgTmd4U21hcnRNb2RhbFNlcnZpY2UgfSBmcm9tICduZ3gtc21hcnQtbW9kYWwnO1xyXG5pbXBvcnQgeyBNb2R1bGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvbW9kdWxlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudCB9IGZyb20gJy4uL21vZGVscy9lbnZpcm9ubWVudCc7XHJcbmltcG9ydCB7IHN1cHBvcnRSb3V0ZXMgfSBmcm9tICcuLi9kYXRhL3N1cHBvcnQtcm91dGVzJztcclxuaW1wb3J0IHsgQ29va2llTmFtZXMgfSBmcm9tICcuLi9tb2RlbHMvY29va2llLW5hbWVzJztcclxuaW1wb3J0IHsgQ29va2llU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Nvb2tpZS5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnc2lkZWJhcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL3NpZGViYXIuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3NpZGViYXIuY29tcG9uZW50LnNjc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIFNpZGViYXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xyXG4gIEBPdXRwdXQoKSBzZWxlY3RlZFJvdXRlOiBFdmVudEVtaXR0ZXI8U2lkZWJhckVudHJ5PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcclxuICBASW5wdXQoKSBlbnZpcm9ubWVudDogRW52aXJvbm1lbnQ7XHJcbiAgQElucHV0KCkgbW9kdWxlU2VhcmNoVmFsdWU6IGFueSA9ICcnO1xyXG4gIG1vZHVsZXM6IE1vZHVsZUl0ZW1bXSA9IFtdO1xyXG4gIG1vZHVsZXNDb3B5OiBNb2R1bGVJdGVtW10gPSBbXTtcclxuICBzdXBwb3J0Um91dGVzOiBNb2R1bGVJdGVtW10gPSBzdXBwb3J0Um91dGVzO1xyXG4gIHNlbGVjdGVkTW9kdWxlOiBNb2R1bGVJdGVtO1xyXG4gIHNlbGVjdGVkSXRlbTtcclxuICBhdmFpbGFibGVTaG9wczogU2hvcFtdID0gW107XHJcbiAgYXZhaWxhYmxlU2hvcHNDb3B5OiBTaG9wW10gPSBbXTtcclxuICBtb2R1bGVTZWFyY2hQbGFjZWhvbGRlciA9ICdTZWFyY2ggTW9kdWxlcyAuLi4nO1xyXG4gIGlzU2lkZWJhck9wZW46IGJvb2xlYW4gPSB0aGlzLmdldFNpZGViYXJTdGF0ZSgpO1xyXG4gIGhpZGVTdGF0dXM6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIHBhbmVsQnV0dG9uU3RhdGVzID0ge1xyXG4gICAgaXNNb2R1bGVPcGVuOiBmYWxzZSxcclxuICAgIGlzU3VwcG9ydE9wZW46IGZhbHNlLFxyXG4gIH07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBtb2R1bGVTZXJ2aWNlOiBNb2R1bGVTZXJ2aWNlLFxyXG4gICAgcHJpdmF0ZSBzdWJJdGVtU2VydmljZTogU3ViSXRlbVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvb2tpZVNlcnZpY2U6IENvb2tpZVNlcnZpY2UsXHJcbiAgICBwdWJsaWMgbmd4U21hcnRNb2RhbFNlcnZpY2U6IE5neFNtYXJ0TW9kYWxTZXJ2aWNlXHJcbiAgKSB7XHJcbiAgICB0aGlzLnN1Ykl0ZW1TZXJ2aWNlLnN1Ykl0ZW1DbGlja0V2ZW50LnN1YnNjcmliZSgoaXRlbSkgPT4ge1xyXG4gICAgICB0aGlzLnN1Ykl0ZW1DbGlja2VkKGl0ZW0pO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcy5lbnZpcm9ubWVudCAmJiBjaGFuZ2VzLmVudmlyb25tZW50LmN1cnJlbnRWYWx1ZS5hcGlSZXF1ZXN0VXJsKSB7XHJcbiAgICAgIHRoaXMuZ2V0TW9kdWxlcyh0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8vIFNJREVCQVJcclxuICBwdWJsaWMgdG9nZ2xlU2lkZWJhcihlOiBFdmVudCwgb3B0aW9uOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XHJcbiAgICAvLyBBbGxvd3MgdXMgdG8gZXhwYW5kIHRoZSBwYW5lbCBpdGVtcyBpbiBmdXR1cmUgd2l0aG91dCBuZWVkaW5nIHRvIGNoYW5nZSB0aGUgdG9nZ2xlIGxvZ2ljXHJcbiAgICBmb3IgKGxldCBpdGVtIGluIE9iamVjdCh0aGlzLnBhbmVsQnV0dG9uU3RhdGVzKSkge1xyXG4gICAgICBpdGVtID09PSBvcHRpb25cclxuICAgICAgICA/ICh0aGlzLnBhbmVsQnV0dG9uU3RhdGVzW2l0ZW1dID0gIXRoaXMucGFuZWxCdXR0b25TdGF0ZXNbaXRlbV0pXHJcbiAgICAgICAgOiAodGhpcy5wYW5lbEJ1dHRvblN0YXRlc1tpdGVtXSA9IGZhbHNlKTtcclxuICAgIH1cclxuICAgIHRoaXMuaXNTaWRlYmFyT3BlbiA9IHRoaXMucGFuZWxCdXR0b25TdGF0ZXNbb3B0aW9uXTtcclxuICAgIHRoaXMuc2V0U2lkZWJhclN0YXRlKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0U2lkZWJhclN0YXRlKCk6IHZvaWQge1xyXG4gICAgdGhpcy5jb29raWVTZXJ2aWNlLnNldENvb2tpZShDb29raWVOYW1lcy5pc1NpZGViYXJPcGVuLCB0aGlzLmlzU2lkZWJhck9wZW4pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldFNpZGViYXJTdGF0ZSgpOiBib29sZWFuIHtcclxuICAgIGxldCBpc1NpZGViYXJPcGVuOiBib29sZWFuID1cclxuICAgICAgdGhpcy5jb29raWVTZXJ2aWNlLmdldENvb2tpZShDb29raWVOYW1lcy5pc1NpZGViYXJPcGVuKSA9PSAndHJ1ZSc7XHJcbiAgICBpZiAodHlwZW9mIGlzU2lkZWJhck9wZW4gPT09ICd1bmRlZmluZWQnKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIGlzU2lkZWJhck9wZW47XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ29Ub1BvcnRhbCgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gdGhpcy5lbnZpcm9ubWVudC5wb3J0YWxVcmw7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlTW9kdWxlU2VhcmNoKGUpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLm1vZHVsZXNDb3B5Lmxlbmd0aCA8IDEpIHtcclxuICAgICAgdGhpcy5tb2R1bGVzQ29weSA9IFsuLi50aGlzLm1vZHVsZXNdO1xyXG4gICAgfVxyXG5cclxuICAgIHRoaXMubW9kdWxlU2VhcmNoVmFsdWUgPSBlICYmIGUudGFyZ2V0ID8gZS50YXJnZXQudmFsdWUgOiAnJztcclxuICAgIGNvbnN0IHNlYXJjaFN0cmluZyA9IHRoaXMubW9kdWxlU2VhcmNoVmFsdWUudG9Mb3dlckNhc2UoKTtcclxuXHJcbiAgICBjb25zdCBtb2R1bGVDb3B5ID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLm1vZHVsZXNDb3B5KSk7XHJcbiAgICB0aGlzLm1vZHVsZXMgPSB0aGlzLmZpbHRlck1vZHVsZXMobW9kdWxlQ29weSwgc2VhcmNoU3RyaW5nKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBmaWx0ZXJNb2R1bGVzKFxyXG4gICAgbW9kdWxlSXRlbXM6IE1vZHVsZUl0ZW1bXSB8IFNpZGViYXJFbnRyeVtdLFxyXG4gICAgc2VhcmNoVGVybTogc3RyaW5nXHJcbiAgKTogYW55W10ge1xyXG4gICAgY29uc3QgbWF0Y2hlcyA9IFtdO1xyXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMubW9kdWxlcykpIHJldHVybiBtYXRjaGVzO1xyXG5cclxuICAgIG1vZHVsZUl0ZW1zLmZvckVhY2goKGkpID0+IHtcclxuICAgICAgaWYgKGkubmFtZS50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKHNlYXJjaFRlcm0pKSB7XHJcbiAgICAgICAgaS52aXNpYmxlID0gdHJ1ZTtcclxuICAgICAgICBtYXRjaGVzLnB1c2goaSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgY29uc3QgY2hpbGRSZXN1bHRzOiBTaWRlYmFyRW50cnlbXSA9IHRoaXMuZmlsdGVyTW9kdWxlcyhcclxuICAgICAgICAgIGkuY2hpbGRyZW4sXHJcbiAgICAgICAgICBzZWFyY2hUZXJtXHJcbiAgICAgICAgKTtcclxuICAgICAgICBpZiAoY2hpbGRSZXN1bHRzLmxlbmd0aCkge1xyXG4gICAgICAgICAgbWF0Y2hlcy5wdXNoKE9iamVjdC5hc3NpZ24oe30sIGksIHsgY2hpbGRyZW46IGNoaWxkUmVzdWx0cyB9KSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuXHJcbiAgICByZXR1cm4gbWF0Y2hlcztcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzdWJJdGVtQ2xpY2tlZChpdGVtKTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkTW9kdWxlID0gdGhpcy5tb2R1bGVzLmZpbmQoXHJcbiAgICAgIChtKSA9PlxyXG4gICAgICAgIG0uYXV0aG9yaXphdGlvbklkID09PVxyXG4gICAgICAgIChpdGVtLmF1dGhvcml6YXRpb25JZCB8fCBpdGVtLm1vZHVsZUF1dGhvcml6YXRpb25JZClcclxuICAgICk7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB0aGlzLnNlbGVjdGVkSXRlbS5hY3RpdmUgPSBmYWxzZTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gaXRlbTtcclxuICAgIHRoaXMuc2VsZWN0ZWRJdGVtLmFjdGl2ZSA9IHRydWU7XHJcblxyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtLnJlbGF0aW9uTmFtZSA9PT0gJ0RvY3VtZW50YXRpb24nKSB7XHJcbiAgICAgIHdpbmRvdy5vcGVuKHRoaXMuc2VsZWN0ZWRJdGVtLnVybCwgJ19ibGFuaycsICdub29wZW5lciBub3JlZmVycmVyJyk7XHJcbiAgICB9IGVsc2UgaWYgKFxyXG4gICAgICAodGhpcy5zZWxlY3RlZE1vZHVsZSAmJiAhdGhpcy5zZWxlY3RlZE1vZHVsZS5lbnRpdHlBY2Nlc3MpIHx8XHJcbiAgICAgICF0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzcy5sZW5ndGhcclxuICAgICkge1xyXG4gICAgICB0aGlzLnJvdXRlVG9VcmwoKTtcclxuICAgIH0gZWxzZSBpZiAoXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRNb2R1bGUgJiZcclxuICAgICAgdGhpcy5zZWxlY3RlZE1vZHVsZS5lbnRpdHlBY2Nlc3MubGVuZ3RoID09PSAxXHJcbiAgICApIHtcclxuICAgICAgY29uc3Qgc29sZVNob3AgPSB0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzc1swXTtcclxuICAgICAgdGhpcy5zdWJJdGVtU2VydmljZS5zYXZlSXRlbUluZm8odGhpcy5zZWxlY3RlZE1vZHVsZSwgc29sZVNob3ApO1xyXG4gICAgICB0aGlzLnJvdXRlVG9VcmwoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMubWFwU2hvcE1vZGFsKCk7XHJcbiAgICAgIHRoaXMubmd4U21hcnRNb2RhbFNlcnZpY2UuZ2V0TW9kYWwoJ3Nob3BNb2RhbCcpLm9wZW4oKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZWxlY3RlZFNob3Aoc2VsZWN0ZWRTaG9wOiBTaG9wKTogdm9pZCB7XHJcbiAgICB0aGlzLnN1Ykl0ZW1TZXJ2aWNlLnNhdmVJdGVtSW5mbyh0aGlzLnNlbGVjdGVkTW9kdWxlLCBzZWxlY3RlZFNob3AuaWQpO1xyXG4gICAgdGhpcy5yb3V0ZVRvVXJsKCk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgbWFwU2hvcE1vZGFsKCk6IHZvaWQge1xyXG4gICAgaWYgKHRoaXMuYXZhaWxhYmxlU2hvcHNDb3B5Lmxlbmd0aCA8IDEpIHtcclxuICAgICAgdGhpcy5hdmFpbGFibGVTaG9wc0NvcHkgPSBbLi4udGhpcy5hdmFpbGFibGVTaG9wc107XHJcbiAgICB9XHJcbiAgICB0aGlzLmF2YWlsYWJsZVNob3BzID0gdGhpcy5hdmFpbGFibGVTaG9wc0NvcHkuZmlsdGVyKChzaG9wKSA9PlxyXG4gICAgICB0aGlzLnNlbGVjdGVkTW9kdWxlLmVudGl0eUFjY2Vzcy5pbmNsdWRlcyhzaG9wLmlkKVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnb1RvU3RhdHVzUGFnZSgpOiB2b2lkIHtcclxuICAgIHdpbmRvdy5vcGVuKFxyXG4gICAgICAnaHR0cHM6Ly9zdGF0dXMucmV0YWxpYS5jbG91ZCcsXHJcbiAgICAgICdfYmxhbmsnLFxyXG4gICAgICAnbm9vcGVuZXIgbm9yZWZlcnJlcidcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcm91dGVUb1VybCgpOiB2b2lkIHtcclxuICAgIGxldCBjdXJyZW50TW9kdWxlID0gdGhpcy5tb2R1bGVTZXJ2aWNlLmdldEN1cnJlbnRNb2R1bGUodGhpcy5zZWxlY3RlZEl0ZW0pO1xyXG4gICAgaWYgKFxyXG4gICAgICBjdXJyZW50TW9kdWxlICYmXHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtICYmXHJcbiAgICAgIChjdXJyZW50TW9kdWxlLmF1dGhvcml6YXRpb25JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0uYXV0aG9yaXphdGlvbklkIHx8XHJcbiAgICAgICBjdXJyZW50TW9kdWxlLmF1dGhvcml6YXRpb25JZCA9PT0gdGhpcy5zZWxlY3RlZEl0ZW0ubW9kdWxlQXV0aG9yaXphdGlvbklkKVxyXG4gICAgKSB7XHJcbiAgICAgIGxldCBjdXJyZW50SXRlbSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodGhpcy5zZWxlY3RlZEl0ZW0pKTtcclxuICAgICAgY29uc3QgcGF0aEFycmF5ID0gdGhpcy5zZWxlY3RlZEl0ZW0udXJsLnNwbGl0KCcvJyk7XHJcbiAgICAgIHBhdGhBcnJheS5zcGxpY2UoMCwgMik7XHJcbiAgICAgIGN1cnJlbnRJdGVtLnVybCA9IHBhdGhBcnJheS5qb2luKCcvJyk7XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWRSb3V0ZS5lbWl0KGN1cnJlbnRJdGVtKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIGNvbnN0IGl0ZW1VcmwgPSB0aGlzLnNlbGVjdGVkSXRlbS51cmw7XHJcbiAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gaXRlbVVybDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TW9kdWxlcyhpc0ZpcnN0Q2FsbDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgbGV0IGFwaVVybCA9IHRoaXMuZW52aXJvbm1lbnQuYXBpUmVxdWVzdFVybDtcclxuICAgIGlmIChhcGlVcmwuZW5kc1dpdGgoXCIvXCIpKVxyXG4gICAgIGFwaVVybCA9IGFwaVVybC5zbGljZSgwLCAtMSk7XHJcblxyXG4gICAgdGhpcy5tb2R1bGVTZXJ2aWNlLmdldFVzZXJNb2R1bGVzKGFwaVVybCwgJycpLnRoZW4oKG1vZHVsZU9iamVjdCkgPT4ge1xyXG4gICAgICBpZiAoIW1vZHVsZU9iamVjdCB8fCAhbW9kdWxlT2JqZWN0Lm1vZHVsZXNEZXRhaWxzKSB7XHJcbiAgICAgICAgaWYgKGlzRmlyc3RDYWxsKSB7XHJcbiAgICAgICAgICAvLyBJZiB0aGUgVUkgcmVsaWVzIG9uIGFuIGludGVyY2VwdG9yIHRvIHJlZmlyZSBmYWlsZWQgQVBJIGNhbGxzLCB0aGUgaW5pdGlhbCBtb2R1bGUgY2FsbCB3aWxsIGZhaWxcclxuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5nZXRNb2R1bGVzKGZhbHNlKSwgMTAwMCk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIGNvbnNvbGUubG9nKGBObyBtb2R1bGVzIHdlcmUgZm91bmQgdXNpbmc6ICR7YXBpVXJsfWApO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm47XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIHRoaXMuYXZhaWxhYmxlU2hvcHMgPSBtb2R1bGVPYmplY3Quc2hvcHM7XHJcbiAgICAgIHRoaXMubW9kdWxlcyA9IHRoaXMubW9kdWxlU2VydmljZS5tYXBNb2R1bGVJdGVtcyhcclxuICAgICAgICBtb2R1bGVPYmplY3QubW9kdWxlc0RldGFpbHNcclxuICAgICAgKTtcclxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLm1vZHVsZVNlcnZpY2UuZmluZE5lc3RlZFVybE1hdGNoKHRoaXMubW9kdWxlcyx3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpO1xyXG4gICAgICB0aGlzLnBhbmVsQnV0dG9uU3RhdGVzLmlzTW9kdWxlT3BlbiA9IHRoaXMuaXNTaWRlYmFyT3BlbjtcclxuICAgIH0pO1xyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGlkPVwic2lkZWJhci1wYW5lbFwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWl0ZW1cIiAoY2xpY2spPVwidG9nZ2xlU2lkZWJhcigkZXZlbnQsICdpc01vZHVsZU9wZW4nKVwiIGRhdGEtdGVzdGlkPVwibmF2LW1lbnVcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwiIXBhbmVsQnV0dG9uU3RhdGVzLmlzTW9kdWxlT3BlblwiIGhlaWdodD1cIjE0XCIgd2lkdGg9XCIyMVwiIHZpZXdCb3g9XCIwIDAgMTggMTJcIlxyXG4gICAgICAgICAgICBmaWxsPVwiIzNlM2UzZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pbllNaW4gbWVldFwiPlxyXG4gICAgICAgICAgICA8cGF0aCBkPVwiTTAgMTJIMThWMTBIMFYxMlpNMCA3SDE4VjVIMFY3Wk0wIDBWMkgxOFYwSDBaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNNb2R1bGVPcGVuXCIgaGVpZ2h0PVwiMTNcIiB3aWR0aD1cIjEzXCIgdmlld0JveD1cIjAgMCAxNCAxNFwiXHJcbiAgICAgICAgICAgIGZpbGw9XCIjM2UzZTNlXCIgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiIHByZXNlcnZlQXNwZWN0UmF0aW89XCJ4TWluWU1pbiBtZWV0XCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE0IDEuNDFMMTIuNTkgMEw3IDUuNTlMMS40MSAwTDAgMS40MUw1LjU5IDdMMCAxMi41OUwxLjQxIDE0TDcgOC40MUwxMi41OSAxNEwxNCAxMi41OUw4LjQxIDdMMTQgMS40MVpcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicGFuZWwtaXRlbVwiIChjbGljayk9XCJ0b2dnbGVTaWRlYmFyKCRldmVudCwgJ2lzU3VwcG9ydE9wZW4nKVwiIGRhdGEtdGVzdGlkPVwibmF2LXN1cHBvcnRcIj5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwiIXBhbmVsQnV0dG9uU3RhdGVzLmlzU3VwcG9ydE9wZW5cIiB3aWR0aD1cIjE4XCIgaGVpZ2h0PVwiMjFcIiB2aWV3Qm94PVwiMCAwIDE4IDIxXCJcclxuICAgICAgICAgICAgZmlsbD1cIiMzZTNlM2VcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgICBkPVwiTTE2IDBIMkMwLjg5IDAgMCAwLjkgMCAyVjE2QzAgMTcuMSAwLjg5IDE4IDIgMThINkw5IDIxTDEyIDE4SDE2QzE3LjEgMTggMTggMTcuMSAxOCAxNlYyQzE4IDAuOSAxNy4xIDAgMTYgMFpNMTAgMTZIOFYxNEgxMFYxNlpNMTIuMDcgOC4yNUwxMS4xNyA5LjE3QzEwLjQ1IDkuOSAxMCAxMC41IDEwIDEySDhWMTEuNUM4IDEwLjQgOC40NSA5LjQgOS4xNyA4LjY3TDEwLjQxIDcuNDFDMTAuNzggNy4wNSAxMSA2LjU1IDExIDZDMTEgNC45IDEwLjEgNCA5IDRDNy45IDQgNyA0LjkgNyA2SDVDNSAzLjc5IDYuNzkgMiA5IDJDMTEuMjEgMiAxMyAzLjc5IDEzIDZDMTMgNi44OCAxMi42NCA3LjY4IDEyLjA3IDguMjVaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgICAgICA8c3ZnIGNsYXNzPVwicGFuZWwtaWNvblwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNTdXBwb3J0T3BlblwiIGhlaWdodD1cIjEzXCIgd2lkdGg9XCIxM1wiIHZpZXdCb3g9XCIwIDAgMTQgMTRcIlxyXG4gICAgICAgICAgICBmaWxsPVwiIzNlM2UzZVwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwieE1pbllNaW4gbWVldFwiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0xNCAxLjQxTDEyLjU5IDBMNyA1LjU5TDEuNDEgMEwwIDEuNDFMNS41OSA3TDAgMTIuNTlMMS40MSAxNEw3IDguNDFMMTIuNTkgMTRMMTQgMTIuNTlMOC40MSA3TDE0IDEuNDFaXCIgLz5cclxuICAgICAgICA8L3N2Zz5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8ZGl2IGNsYXNzPVwic3RhdHVzLWJ1dHRvblwiIChtb3VzZW92ZXIpPVwiaGlkZVN0YXR1cyA9IGZhbHNlXCIgKG1vdXNlbGVhdmUpPVwiaGlkZVN0YXR1cyA9IHRydWVcIlxyXG4gICAgICAgIChjbGljayk9XCJnb1RvU3RhdHVzUGFnZSgpXCIgZGF0YS10ZXN0aWQ9XCJzaWRlYmFyLXN0YXR1c1wiPlxyXG4gICAgICAgIDxzdmcgY2xhc3M9XCJwYW5lbC1pY29uXCIgd2lkdGg9XCIyMlwiIGhlaWdodD1cIjIyXCIgdmlld0JveD1cIjAgMCAyMiAyMlwiIGZpbGw9XCIjRkZGRkZGXCJcclxuICAgICAgICAgICAgeG1sbnM9XCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Z1wiPlxyXG4gICAgICAgICAgICA8cGF0aFxyXG4gICAgICAgICAgICAgICAgZD1cIk0yMC42MjUgNi41SDEuMzc1QzAuNjE1NjEzIDYuNSAwIDUuODI4NDIgMCA1VjJDMCAxLjE3MTU4IDAuNjE1NjEzIDAuNSAxLjM3NSAwLjVIMjAuNjI1QzIxLjM4NDQgMC41IDIyIDEuMTcxNTggMjIgMlY1QzIyIDUuODI4NDIgMjEuMzg0NCA2LjUgMjAuNjI1IDYuNVpNMTguNTYyNSAyLjM3NUMxNy45OTI5IDIuMzc1IDE3LjUzMTIgMi44Nzg2NyAxNy41MzEyIDMuNUMxNy41MzEyIDQuMTIxMzMgMTcuOTkyOSA0LjYyNSAxOC41NjI1IDQuNjI1QzE5LjEzMjEgNC42MjUgMTkuNTkzOCA0LjEyMTMzIDE5LjU5MzggMy41QzE5LjU5MzggMi44Nzg2NyAxOS4xMzIxIDIuMzc1IDE4LjU2MjUgMi4zNzVaTTE1LjgxMjUgMi4zNzVDMTUuMjQyOSAyLjM3NSAxNC43ODEyIDIuODc4NjcgMTQuNzgxMiAzLjVDMTQuNzgxMiA0LjEyMTMzIDE1LjI0MjkgNC42MjUgMTUuODEyNSA0LjYyNUMxNi4zODIxIDQuNjI1IDE2Ljg0MzggNC4xMjEzMyAxNi44NDM4IDMuNUMxNi44NDM4IDIuODc4NjcgMTYuMzgyMSAyLjM3NSAxNS44MTI1IDIuMzc1Wk0yMC42MjUgMTRIMS4zNzVDMC42MTU2MTMgMTQgMCAxMy4zMjg0IDAgMTIuNVY5LjVDMCA4LjY3MTU4IDAuNjE1NjEzIDggMS4zNzUgOEgyMC42MjVDMjEuMzg0NCA4IDIyIDguNjcxNTggMjIgOS41VjEyLjVDMjIgMTMuMzI4NCAyMS4zODQ0IDE0IDIwLjYyNSAxNFpNMTguNTYyNSA5Ljg3NUMxNy45OTI5IDkuODc1IDE3LjUzMTIgMTAuMzc4NyAxNy41MzEyIDExQzE3LjUzMTIgMTEuNjIxMyAxNy45OTI5IDEyLjEyNSAxOC41NjI1IDEyLjEyNUMxOS4xMzIxIDEyLjEyNSAxOS41OTM4IDExLjYyMTMgMTkuNTkzOCAxMUMxOS41OTM4IDEwLjM3ODcgMTkuMTMyMSA5Ljg3NSAxOC41NjI1IDkuODc1Wk0xNS44MTI1IDkuODc1QzE1LjI0MjkgOS44NzUgMTQuNzgxMiAxMC4zNzg3IDE0Ljc4MTIgMTFDMTQuNzgxMiAxMS42MjEzIDE1LjI0MjkgMTIuMTI1IDE1LjgxMjUgMTIuMTI1QzE2LjM4MjEgMTIuMTI1IDE2Ljg0MzggMTEuNjIxMyAxNi44NDM4IDExQzE2Ljg0MzggMTAuMzc4NyAxNi4zODIxIDkuODc1IDE1LjgxMjUgOS44NzVaTTIwLjYyNSAyMS41SDEuMzc1QzAuNjE1NjEzIDIxLjUgMCAyMC44Mjg0IDAgMjBWMTdDMCAxNi4xNzE2IDAuNjE1NjEzIDE1LjUgMS4zNzUgMTUuNUgyMC42MjVDMjEuMzg0NCAxNS41IDIyIDE2LjE3MTYgMjIgMTdWMjBDMjIgMjAuODI4NCAyMS4zODQ0IDIxLjUgMjAuNjI1IDIxLjVaTTE4LjU2MjUgMTcuMzc1QzE3Ljk5MjkgMTcuMzc1IDE3LjUzMTIgMTcuODc4NyAxNy41MzEyIDE4LjVDMTcuNTMxMiAxOS4xMjEzIDE3Ljk5MjkgMTkuNjI1IDE4LjU2MjUgMTkuNjI1QzE5LjEzMjEgMTkuNjI1IDE5LjU5MzggMTkuMTIxMyAxOS41OTM4IDE4LjVDMTkuNTkzOCAxNy44Nzg3IDE5LjEzMjEgMTcuMzc1IDE4LjU2MjUgMTcuMzc1Wk0xNS44MTI1IDE3LjM3NUMxNS4yNDI5IDE3LjM3NSAxNC43ODEyIDE3Ljg3ODcgMTQuNzgxMiAxOC41QzE0Ljc4MTIgMTkuMTIxMyAxNS4yNDI5IDE5LjYyNSAxNS44MTI1IDE5LjYyNUMxNi4zODIxIDE5LjYyNSAxNi44NDM4IDE5LjEyMTMgMTYuODQzOCAxOC41QzE2Ljg0MzggMTcuODc4NyAxNi4zODIxIDE3LjM3NSAxNS44MTI1IDE3LjM3NVpcIiAvPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDxpZnJhbWUgaWQ9XCJzdGF0dXMtZnJhbWVcIiBbbmdDbGFzc109XCJ7J2lzT3Blbic6ICFoaWRlU3RhdHVzLCAnaXNDbG9zZWQnOiBoaWRlU3RhdHVzIH1cIlxyXG4gICAgICAgICAgICBzcmM9XCIvL3N0YXR1cy5yZXRhbGlhLmNsb3VkL2VtYmVkLXN0YXR1cy9saWdodC1zbVwiIG5hbWU9XCJzdGF0dXNQYWdlXCIgd2lkdGg9XCIyMzBcIiBoZWlnaHQ9XCI2MVwiIGZyYW1lQm9yZGVyPVwiMFwiXHJcbiAgICAgICAgICAgIHNjcm9sbGluZz1cIm5vXCI+XHJcbiAgICAgICAgPC9pZnJhbWU+XHJcbiAgICA8L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48ZGl2IGlkPVwic2lkZWJhci1jb250YWluZXJcIiBbY2xhc3Mub3Blbi1zaWRlYmFyXT1cImlzU2lkZWJhck9wZW5cIj5cclxuICAgIDxkaXYgaWQ9XCJzdGlja3ktaGVhZGVyXCI+XHJcbiAgICAgICAgPGltZyBjbGFzcz1cImxvZ28tZnVsbFwiIGhlaWdodD1cIjQwcHhcIiBzcmM9XCJodHRwczovL2ltYWdpbmVzaGFyZWQuYmxvYi5jb3JlLndpbmRvd3MubmV0L3BvcnRhbC9yZXRhbGlhX2ZpbGVzL2xvZ29zL3NpZGViYXJfbG9nby5wbmdcIiAoY2xpY2spPVwiZ29Ub1BvcnRhbCgpXCJcclxuICAgICAgICBkYXRhLXRlc3RpZD1cIm5hdi1sb2dvXCIgLz5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kdWxlLWRpdmlkZXJcIj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwibW9kdWxlU2VhcmNoYmFyXCIgKm5nSWY9XCJwYW5lbEJ1dHRvblN0YXRlcy5pc01vZHVsZU9wZW5cIj5cclxuICAgICAgICAgICAgPGlucHV0IGNsYXNzPVwibW9kdWxlU2VhcmNoSW5wdXRcIiB0eXBlPVwic2VhcmNoXCIgYXV0b2NvbXBsZXRlPVwib2ZmXCIgaWQ9XCJzZWFyY2hcIiBbdmFsdWVdPVwibW9kdWxlU2VhcmNoVmFsdWVcIlxyXG4gICAgICAgICAgICAgICAgcmVxdWlyZWQ9XCJmYWxzZVwiIFtwbGFjZWhvbGRlcl09XCJtb2R1bGVTZWFyY2hQbGFjZWhvbGRlclwiIChrZXl1cCk9XCJoYW5kbGVNb2R1bGVTZWFyY2goJGV2ZW50KVwiXHJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlTW9kdWxlU2VhcmNoKCRldmVudClcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGlkPVwibWVudVwiICpuZ0lmPVwicGFuZWxCdXR0b25TdGF0ZXMuaXNNb2R1bGVPcGVuXCI+XHJcbiAgICAgICAgPHN1Yi1pdGVtIFtpdGVtc109XCJtb2R1bGVzXCI+PC9zdWItaXRlbT5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBpZD1cIm1lbnVcIiAqbmdJZj1cInBhbmVsQnV0dG9uU3RhdGVzLmlzU3VwcG9ydE9wZW5cIj5cclxuICAgICAgICA8c3ViLWl0ZW0gW2l0ZW1zXT1cInN1cHBvcnRSb3V0ZXNcIj48L3N1Yi1pdGVtPlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PlxyXG5cclxuPHNob3AtbW9kYWwgW2F2YWlsYWJsZVNob3BzXT1cImF2YWlsYWJsZVNob3BzXCIgKHNlbGVjdGVkU2hvcCk9XCJzZWxlY3RlZFNob3AoJGV2ZW50KVwiPjwvc2hvcC1tb2RhbD4iXX0=