@posiwise/admin-module 0.0.180 → 0.0.181

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 (126) hide show
  1. package/fesm2022/posiwise-admin-module.mjs +463 -441
  2. package/fesm2022/posiwise-admin-module.mjs.map +1 -1
  3. package/lib/components/resources/resources-admin-details/resources-admin-details.component.d.ts +1 -1
  4. package/lib/components/subscriptions/subscription-users/subscription-users.component.d.ts +1 -1
  5. package/package.json +4 -6
  6. package/esm2022/index.mjs +0 -87
  7. package/esm2022/lib/admin-guard.service.mjs +0 -44
  8. package/esm2022/lib/admin-module.routing.mjs +0 -919
  9. package/esm2022/lib/admin.module.mjs +0 -485
  10. package/esm2022/lib/components/TOS/terms-of-service/terms-of-service.component.mjs +0 -93
  11. package/esm2022/lib/components/TOS/terms-of-service-details/terms-of-service-details.component.mjs +0 -98
  12. package/esm2022/lib/components/TOS/terms-of-service-tabs/terms-of-service-tabs.component.mjs +0 -26
  13. package/esm2022/lib/components/config/global-config-details/global-config-details.component.mjs +0 -75
  14. package/esm2022/lib/components/config/global-config-list/global-config-list.component.mjs +0 -92
  15. package/esm2022/lib/components/config/global-config-tabs/global-config-tabs.component.mjs +0 -24
  16. package/esm2022/lib/components/contact-us/contact-us-list/contact-us-list.component.mjs +0 -101
  17. package/esm2022/lib/components/contact-us/contact-us-tabs/contact-us-tabs.component.mjs +0 -25
  18. package/esm2022/lib/components/credentials/credentials/credentials.component.mjs +0 -88
  19. package/esm2022/lib/components/credentials/credentials-details/credentials-details.component.mjs +0 -79
  20. package/esm2022/lib/components/credentials/credentials-tab/credentials-tab.component.mjs +0 -31
  21. package/esm2022/lib/components/credentials/subscription-credentials/subscription-credentials.component.mjs +0 -92
  22. package/esm2022/lib/components/credentials/subscription-credentials-details/subscription-credentials-details.component.mjs +0 -102
  23. package/esm2022/lib/components/domain-config/domain-config-details/base-domain-config.component.mjs +0 -88
  24. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-build/domain-config-build.component.mjs +0 -731
  25. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-core/domain-config-core.component.mjs +0 -123
  26. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-details.component.mjs +0 -57
  27. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-integrations/domain-config-integrations.component.mjs +0 -91
  28. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-interface/domain-config-interface.component.mjs +0 -144
  29. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-organization/domain-config-organization.component.mjs +0 -30
  30. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-security/domain-config-security.component.mjs +0 -31
  31. package/esm2022/lib/components/domain-config/domain-config-details/domain-config-social/domain-config-social.component.mjs +0 -30
  32. package/esm2022/lib/components/domain-config/domain-config-list/domain-config-list.component.mjs +0 -98
  33. package/esm2022/lib/components/domain-config/domain-config-tabs/domain-config-tabs.component.mjs +0 -25
  34. package/esm2022/lib/components/faqs/add-faq/add-faq.component.mjs +0 -218
  35. package/esm2022/lib/components/faqs/edit-faq/edit-faq.component.mjs +0 -204
  36. package/esm2022/lib/components/faqs/faqs-list/faqs-list.component.mjs +0 -277
  37. package/esm2022/lib/components/faqs/faqs-tabs/faqs-tabs.component.mjs +0 -25
  38. package/esm2022/lib/components/feedback-questions/feedback-questions-details/feedback-questions-details.component.mjs +0 -84
  39. package/esm2022/lib/components/feedback-questions/feedback-questions-list/feedback-questions-list.component.mjs +0 -98
  40. package/esm2022/lib/components/generic/generic-insight/generic-insight.component.mjs +0 -12
  41. package/esm2022/lib/components/generic/generic-misc/generic-misc.component.mjs +0 -127
  42. package/esm2022/lib/components/generic/generic-tabs/generic-tabs.component.mjs +0 -31
  43. package/esm2022/lib/components/incidents/add-edit-incident/add-edit-incident.component.mjs +0 -152
  44. package/esm2022/lib/components/incidents/incidents-list/incidents-list.component.mjs +0 -118
  45. package/esm2022/lib/components/incidents/incidents-tabs/incidents-tabs.component.mjs +0 -25
  46. package/esm2022/lib/components/login-notifications/login-notification-details/login-notification-details.component.mjs +0 -111
  47. package/esm2022/lib/components/login-notifications/login-notification-tabs/login-notification-tabs.component.mjs +0 -25
  48. package/esm2022/lib/components/login-notifications/login-notifications-list/login-notifications-list.component.mjs +0 -97
  49. package/esm2022/lib/components/mailer/mailer-details/mailer-details.component.mjs +0 -115
  50. package/esm2022/lib/components/mailer/mailer-list/mailer-list.component.mjs +0 -113
  51. package/esm2022/lib/components/mailer/mailer-tabs/mailer-tabs.component.mjs +0 -24
  52. package/esm2022/lib/components/newsletters/newsletter-details/newsletter-details.component.mjs +0 -87
  53. package/esm2022/lib/components/newsletters/newsletter-item-details/newsletter-item-details.component.mjs +0 -284
  54. package/esm2022/lib/components/newsletters/newsletter-users-list/newsletter-users-list.component.mjs +0 -76
  55. package/esm2022/lib/components/newsletters/newsletters-insight/newsletters-insight.component.mjs +0 -53
  56. package/esm2022/lib/components/newsletters/newsletters-items/newsletters-items-view-details/newsletters-items-view-details.component.mjs +0 -59
  57. package/esm2022/lib/components/newsletters/newsletters-items/newsletters-items.component.mjs +0 -179
  58. package/esm2022/lib/components/newsletters/newsletters-list/newsletters-list.component.mjs +0 -103
  59. package/esm2022/lib/components/newsletters/newsletters-tabs/newsletters-tabs.component.mjs +0 -38
  60. package/esm2022/lib/components/permissions/permissions-details/permissions-details.component.mjs +0 -109
  61. package/esm2022/lib/components/permissions/permissions-list/permissions-list.component.mjs +0 -87
  62. package/esm2022/lib/components/permissions/permissions-tabs/permissions-tabs.component.mjs +0 -31
  63. package/esm2022/lib/components/permissions/role-details/role-details.component.mjs +0 -140
  64. package/esm2022/lib/components/permissions/roles-list/roles-list.component.mjs +0 -93
  65. package/esm2022/lib/components/products/product-details/product-details.component.mjs +0 -370
  66. package/esm2022/lib/components/products/products-insight/products-insight.component.mjs +0 -52
  67. package/esm2022/lib/components/products/products-list/products-list.component.mjs +0 -144
  68. package/esm2022/lib/components/products/products-tabs/products-tabs.component.mjs +0 -28
  69. package/esm2022/lib/components/products/users-list-for-product/users-list-for-product.component.mjs +0 -55
  70. package/esm2022/lib/components/resources/resources-admin-details/resources-admin-details.component.mjs +0 -380
  71. package/esm2022/lib/components/resources/resources-admin-tabs/resources-admin-tabs.component.mjs +0 -33
  72. package/esm2022/lib/components/resources/resources-admin-tabs/resources-index/resources-index.component.mjs +0 -154
  73. package/esm2022/lib/components/resources/resources-admin-tabs/resources-insight/resources-insight.component.mjs +0 -54
  74. package/esm2022/lib/components/resources/resources-lists-insight/resources-lists-insight.component.mjs +0 -61
  75. package/esm2022/lib/components/subscriptions/subscription-agents/subscription-agents.component.mjs +0 -120
  76. package/esm2022/lib/components/subscriptions/subscription-agents-list/subscription-agents-list.component.mjs +0 -135
  77. package/esm2022/lib/components/subscriptions/subscription-details/subscription-details.component.mjs +0 -210
  78. package/esm2022/lib/components/subscriptions/subscription-product-details/subscription-product-details.component.mjs +0 -225
  79. package/esm2022/lib/components/subscriptions/subscription-products/subscription-products.component.mjs +0 -66
  80. package/esm2022/lib/components/subscriptions/subscription-users/add-members/add-members.component.mjs +0 -173
  81. package/esm2022/lib/components/subscriptions/subscription-users/subscription-users.component.mjs +0 -215
  82. package/esm2022/lib/components/subscriptions/subscriptions-insight/base-subscription-insight.component.mjs +0 -47
  83. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-price/subscription-insight-average-price.component.mjs +0 -34
  84. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-average-user/subscription-insight-average-user.component.mjs +0 -34
  85. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-churn/subscription-insight-churn.component.mjs +0 -55
  86. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-nps/subscription-insight-nps.component.mjs +0 -103
  87. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-product-session/subscription-insight-product-session.component.mjs +0 -34
  88. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-revenue/subscription-insight-revenue.component.mjs +0 -55
  89. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-tabs/subscription-insight-tabs.component.mjs +0 -23
  90. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscription-insight-user-session/subscription-insight-user-session.component.mjs +0 -34
  91. package/esm2022/lib/components/subscriptions/subscriptions-insight/subscriptions-insight.component.mjs +0 -55
  92. package/esm2022/lib/components/subscriptions/subscriptions-list/invite-users/invite-users.component.mjs +0 -232
  93. package/esm2022/lib/components/subscriptions/subscriptions-list/subscriptions-list.component.mjs +0 -311
  94. package/esm2022/lib/components/subscriptions/subscriptions-tabs/subscriptions-tabs.component.mjs +0 -35
  95. package/esm2022/lib/components/tags/tags-category/tags-category.component.mjs +0 -153
  96. package/esm2022/lib/components/tags/tags-details/tags-details.component.mjs +0 -153
  97. package/esm2022/lib/components/tags/tags-list/tags-list.component.mjs +0 -145
  98. package/esm2022/lib/components/tags/tags-tabs/tags-tabs.component.mjs +0 -32
  99. package/esm2022/lib/components/tips/tip-detail/tip-detail.component.mjs +0 -88
  100. package/esm2022/lib/components/tips/tips-list/tips-list.component.mjs +0 -49
  101. package/esm2022/lib/components/tips/tips-tabs/tips-tabs.component.mjs +0 -25
  102. package/esm2022/lib/components/tracking/ahoy-events/ahoy-events.component.mjs +0 -216
  103. package/esm2022/lib/components/tracking/ahoy-messages/ahoy-messages.component.mjs +0 -200
  104. package/esm2022/lib/components/tracking/ahoy-visits/ahoy-visits.component.mjs +0 -198
  105. package/esm2022/lib/components/tracking/events/events.component.mjs +0 -198
  106. package/esm2022/lib/components/tracking/tracking-tabs/tracking-tabs.component.mjs +0 -49
  107. package/esm2022/lib/components/tracking/versions/versions.component.mjs +0 -208
  108. package/esm2022/lib/components/users/user-details/user-details.component.mjs +0 -167
  109. package/esm2022/lib/components/users/users-insight/users-insight.component.mjs +0 -53
  110. package/esm2022/lib/components/users/users-list/users-list.component.mjs +0 -338
  111. package/esm2022/lib/components/users/users-tabs/users-tabs.component.mjs +0 -32
  112. package/esm2022/lib/shared/interface/admin-module-shared.interface.mjs +0 -2
  113. package/esm2022/lib/shared/interface/api-response.interface.mjs +0 -2
  114. package/esm2022/lib/shared/interface/contact-us.interface.mjs +0 -2
  115. package/esm2022/lib/shared/interface/credential.interface.mjs +0 -2
  116. package/esm2022/lib/shared/interface/domain-config.interface.mjs +0 -2
  117. package/esm2022/lib/shared/interface/feedback-question.interface.mjs +0 -2
  118. package/esm2022/lib/shared/interface/global-config.interface.mjs +0 -2
  119. package/esm2022/lib/shared/interface/login-notification.interface.mjs +0 -2
  120. package/esm2022/lib/shared/interface/newsletter.interface.mjs +0 -2
  121. package/esm2022/lib/shared/interface/permission.interface.mjs +0 -2
  122. package/esm2022/lib/shared/interface/privacy-tos.interface.mjs +0 -2
  123. package/esm2022/lib/shared/interface/tip.interface.mjs +0 -2
  124. package/esm2022/lib/shared/interface/tracking.interface.mjs +0 -2
  125. package/esm2022/lib/shared/routers/routers.mjs +0 -40
  126. package/esm2022/posiwise-admin-module.mjs +0 -5
@@ -1,198 +0,0 @@
1
- import { ChangeDetectorRef, Component, Injector } from '@angular/core';
2
- import { AdminDataService } from '@posiwise/admin-module-utils';
3
- import { AppBaseComponent } from '@posiwise/app-base-component';
4
- import { AhoyService, PermissionService } from '@posiwise/common-services';
5
- import { PAGE_SIZE } from '@posiwise/common-utilities';
6
- import { HelperService } from '@posiwise/helper-service';
7
- import * as i0 from "@angular/core";
8
- import * as i1 from "@posiwise/common-services";
9
- import * as i2 from "@posiwise/admin-module-utils";
10
- import * as i3 from "primeng/table";
11
- import * as i4 from "primeng/api";
12
- import * as i5 from "primeng/dropdown";
13
- import * as i6 from "primeng/multiselect";
14
- import * as i7 from "primeng/inputtext";
15
- import * as i8 from "primeng/calendar";
16
- import * as i9 from "@ng-bootstrap/ng-bootstrap";
17
- import * as i10 from "@angular/common";
18
- import * as i11 from "@angular/forms";
19
- import * as i12 from "@angular/router";
20
- import * as i13 from "primeng/progressspinner";
21
- import * as i14 from "@posiwise/shared-components";
22
- import * as i15 from "@posiwise/directives";
23
- import * as i16 from "@jsverse/transloco";
24
- import * as i17 from "@posiwise/pipes";
25
- export class AhoyVisitsComponent extends AppBaseComponent {
26
- constructor(injector, ahoyService, adminDataService, cdr) {
27
- super(injector);
28
- this.ahoyService = ahoyService;
29
- this.adminDataService = adminDataService;
30
- this.cdr = cdr;
31
- this.page = 1;
32
- this.userPage = 1;
33
- this.stopLoading = false;
34
- this.data = {
35
- visits: [],
36
- object_count: 0,
37
- unfiltered_count: 0
38
- };
39
- this.loading = true;
40
- this.isLoaded = false;
41
- this.userLoading = false;
42
- this.searchText = '';
43
- this.userSearchText = '';
44
- this.microServices = [];
45
- this.selectedOption = [];
46
- this.criteria = [];
47
- this.searchOptions = [];
48
- }
49
- ngOnInit() {
50
- this.subscriptionId = PermissionService.selectedSubscription?.id;
51
- this.microServices = HelperService.getMicroServices(this.appConfig.links);
52
- this.loadUser();
53
- }
54
- ngAfterViewChecked() {
55
- this.cdr.detectChanges();
56
- }
57
- onLazyLoad(event) {
58
- const pageDetails = HelperService.onTableLazyLoad(event);
59
- this.page = pageDetails.page;
60
- this.getAhoyVisits({
61
- page: this.page,
62
- page_size: PAGE_SIZE,
63
- order_by: pageDetails.sortField,
64
- order_direction: pageDetails.sortOrder,
65
- search: this.searchText
66
- });
67
- }
68
- onPanelShow() {
69
- setTimeout(() => {
70
- const multiSelectPanelWrapper = document.querySelector('.p-multiselect-items-wrapper');
71
- if (multiSelectPanelWrapper) {
72
- if (this.scrollListener) {
73
- multiSelectPanelWrapper.removeEventListener('scroll', this.scrollListener);
74
- }
75
- this.scrollListener = this.onScroll.bind(this);
76
- multiSelectPanelWrapper.addEventListener('scroll', this.scrollListener);
77
- }
78
- else {
79
- console.log('MultiSelect panel not found.');
80
- }
81
- }, 0);
82
- }
83
- onScroll(event) {
84
- const element = event.target;
85
- if (element.scrollHeight - element.scrollTop === element.clientHeight) {
86
- this.loadUser();
87
- }
88
- }
89
- loadUser() {
90
- if (this.stopLoading || this.userSearchText !== '') {
91
- this.userLoading = false;
92
- return;
93
- }
94
- this.userLoading = true;
95
- this.adminDataService
96
- .getUsers({
97
- page: this.userPage,
98
- page_size: PAGE_SIZE,
99
- search: this.userSearchText
100
- }, this.subscriptionId)
101
- .then(result => {
102
- this.userLoading = false;
103
- if (result.length === 0) {
104
- this.stopLoading = true;
105
- }
106
- else {
107
- const validResults = result.filter(user => user.value && user.label);
108
- this.searchOptions = [...this.searchOptions, ...validResults];
109
- this.userPage++;
110
- }
111
- });
112
- }
113
- getAhoyVisits(paging) {
114
- this.isLoaded = false;
115
- const service = this.microServices.find(x => x.name === this.selectedMicroService) ??
116
- this.microServices.find(x => x.value === this.appConfig.links?.main_api);
117
- const obj = {
118
- ...paging,
119
- ...(this.startDate && this.endDate
120
- ? {
121
- start_at: new Date(this.startDate).toISOString(),
122
- end_at: new Date(this.endDate).toISOString()
123
- }
124
- : {}),
125
- search: this.searchText || '',
126
- user_ids: this.selectedOption?.join(',') || undefined
127
- // NOSONAR
128
- };
129
- Object.keys(obj).forEach(key => obj[key] === undefined && delete obj[key]);
130
- this.ahoyService
131
- .getAhoyVisits(obj, service, paging)
132
- .subscribe((response) => {
133
- this.data = response;
134
- })
135
- .add(() => {
136
- this.loading = false;
137
- this.isLoaded = true;
138
- });
139
- }
140
- onDateSelection() {
141
- if (this.startDate && this.endDate) {
142
- this.getAhoyVisits({
143
- page: this.page,
144
- page_size: PAGE_SIZE
145
- });
146
- }
147
- }
148
- onServiceChange(value) {
149
- this.selectedMicroService = value;
150
- this.getAhoyVisits({ page: this.page, page_size: PAGE_SIZE });
151
- }
152
- onSearchOptionChange($event) {
153
- this.criteria = [];
154
- this.selectedOption = $event.value;
155
- this.getAhoyVisits({
156
- page: this.page,
157
- page_size: PAGE_SIZE
158
- });
159
- }
160
- handleFilter($event) {
161
- this.userSearchText = $event.filter;
162
- this.stopLoading = false;
163
- this.userPage = 1;
164
- this.adminDataService
165
- .getUsers({
166
- page: this.userPage,
167
- page_size: PAGE_SIZE,
168
- search: this.userSearchText
169
- }, this.subscriptionId)
170
- .then(result => {
171
- const newUsers = result.filter(user => user.value &&
172
- user.label &&
173
- !this.selectedOption.some(selected => selected.value === user.value));
174
- newUsers.forEach(user => {
175
- const index = this.searchOptions.findIndex(existing => existing.value === user.value);
176
- if (index !== -1) {
177
- console.log('Removing user');
178
- this.searchOptions.splice(index, 1);
179
- }
180
- });
181
- this.searchOptions = [...this.searchOptions, ...newUsers];
182
- });
183
- }
184
- ngOnDestroy() {
185
- super.ngOnDestroy();
186
- const multiVisitSelectPanel = HelperService.getMultiSelectPanel();
187
- if (multiVisitSelectPanel && this.scrollListener) {
188
- multiVisitSelectPanel.removeEventListener('scroll', this.scrollListener);
189
- }
190
- }
191
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: AhoyVisitsComponent, deps: [{ token: i0.Injector }, { token: i1.AhoyService }, { token: i2.AdminDataService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
192
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: AhoyVisitsComponent, selector: "pw-ahoy-visits", usesInheritance: true, ngImport: i0, template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Ahoy Visits</h2>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"data.visits\"\n [paginator]=\"data.object_count !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"data.object_count\"\n [loading]=\"loading\"\n [sortField]=\"'started_at'\"\n [sortOrder]=\"-1\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div *rbacAllow=\"'SuperAdmin'\"\n class=\"col-sm-2 mb-2 mb-md-0\">\n <p-dropdown\n [options]=\"microServices\"\n (onChange)=\"onServiceChange($event.value)\"\n [placeholder]=\"'Select Service'\"\n optionLabel=\"name\"\n optionValue=\"name\">\n </p-dropdown>\n </div>\n <div class=\"col-sm-2\">\n <p-multiSelect #multiSelector [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter by users\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\"\n [lazy]=\"true\"\n (scroll)=\"onScroll($event)\"\n (onPanelShow)=\"onPanelShow()\"\n [loading]=\"userLoading\"\n (onFilter)=\"handleFilter($event)\"\n >\n </p-multiSelect>\n </div>\n <div class=\"col-sm-2\">\n <p-calendar [showTime]=\"true\"\n [appendTo]=\"'body'\"\n (onSelect)=\"onDateSelection()\"\n [placeholder]=\"'Start Date'\"\n [(ngModel)]=\"startDate\"\n [showIcon]=\"true\"\n dateFormat=\"yy-M-dd\"\n >\n </p-calendar>\n </div>\n <div class=\"col-sm-2\">\n <p-calendar [appendTo]=\"'body'\"\n [showTime]=\"true\"\n (onSelect)=\"onDateSelection()\"\n [placeholder]=\"'End Date'\"\n [(ngModel)]=\"endDate\"\n [showIcon]=\"true\"\n dateFormat=\"yy-M-dd\">\n </p-calendar>\n </div>\n <div class=\"col d-flex align-items-center\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search Visits...\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"mw-90 form-control bg-white\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"browser\">\n {{ 'Admin.Tracking.Browser' | transloco }}\n <p-sortIcon field=\"browser\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"device_type\">\n {{ 'Admin.Tracking.DeviceType' | transloco }}\n <p-sortIcon field=\"device_type\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"ip\">\n {{ 'Admin.Tracking.Ip' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"referring_domain\">\n {{ 'Admin.Tracking.Domain' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"landing_page\">\n {{ 'Admin.Tracking.LandingPage' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"country\">\n {{ 'Admin.Tracking.Country' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"region\">\n {{ 'Admin.Tracking.Region' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"city\">\n {{ 'Admin.Tracking.City' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"os\">\n {{ 'Admin.Tracking.Os' | transloco }}\n <p-sortIcon field=\"os\"></p-sortIcon>\n </th>\n <th scope=\"true\">\n {{ 'Admin.Tracking.User' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"started_at\">\n {{ 'Admin.Tracking.StartedAt' | transloco }}\n <p-sortIcon field=\"started_at\"></p-sortIcon>\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-visits>\n <tr [class.d-none]=\"loading\">\n <td data-head=\"Browser\">{{ visits.browser }}</td>\n <td data-head=\"Device Type\">{{ visits.device_type }}</td>\n <td data-head=\"IP\">{{ visits.ip }}</td>\n <td data-head=\"referring_domain\">\n <span [ngbTooltip]=\"visits.referring_domain\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.referring_domain | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"landing_page\">\n <span [ngbTooltip]=\"visits.landing_page\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.landing_page | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"country\">\n <span [ngbTooltip]=\"visits.country\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.country | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"region\">\n <span [ngbTooltip]=\"visits.region\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.region | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"city\">\n <span [ngbTooltip]=\"visits.city\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.city | textTruncate: 20 }}\n </span></td>\n <td data-head=\"OS\">{{ visits.os }}</td>\n <td data-head=\"User\">\n <span *ngIf=\"visits?.user_id\">\n <span *ngIf=\"visits?.user\"><a [routerLink]=\"['/members', visits?.user?.slug]\">{{ visits?.user?.first_name }} {{ visits?.user?.last_name }}</a></span>\n <span *ngIf=\"!visits?.user\">{{ visits?.user_id }}</span>\n </span>\n </td>\n <td data-head=\"Started At\">{{ visits.started_at | dateFormat : 'datetime' }}</td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\" data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span *ngIf=\"data.object_count !== 0\" class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && data.unfiltered_count === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Ahoy.NoVistitsDataMessage' | transloco\"> </pw-no-data>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.table-responsive td,.table-responsive th{font-size:11px!important}\n"], dependencies: [{ kind: "component", type: i3.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll", "virtualRowHeight"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i4.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "directive", type: i3.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i3.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i5.Dropdown, selector: "p-dropdown", inputs: ["id", "scrollHeight", "filter", "name", "style", "panelStyle", "styleClass", "panelStyleClass", "readonly", "required", "editable", "appendTo", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "variant", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "autoDisplayFirst", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "maxlength", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "autoOptionFocus", "autofocusFilter", "autoShowPanelOnPrintableCharacterKeyDown", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6.MultiSelect, selector: "p-multiSelect", inputs: ["id", "ariaLabel", "style", "styleClass", "panelStyle", "panelStyleClass", "inputId", "disabled", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "variant", "appendTo", "dataKey", "name", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "defaultLabel", "placeholder", "options", "filterValue", "itemSize", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "directive", type: i7.InputText, selector: "[pInputText]", inputs: ["variant"] }, { kind: "component", type: i8.Calendar, selector: "p-calendar", inputs: ["iconDisplay", "style", "styleClass", "inputStyle", "inputId", "name", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "disabled", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "appendTo", "readonlyInput", "shortYearCutoff", "monthNavigator", "yearNavigator", "hourFormat", "timeOnly", "stepYearPicker", "stepHour", "stepMinute", "stepSecond", "showSeconds", "required", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "showTransitionOptions", "hideTransitionOptions", "tabindex", "variant", "minDate", "maxDate", "disabledDates", "disabledDays", "yearRange", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "locale", "view", "defaultDate"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "directive", type: i9.NgbTooltip, selector: "[ngbTooltip]", inputs: ["animation", "autoClose", "placement", "popperOptions", "triggers", "positionTarget", "container", "disableTooltip", "tooltipClass", "tooltipContext", "openDelay", "closeDelay", "ngbTooltip"], outputs: ["shown", "hidden"], exportAs: ["ngbTooltip"] }, { kind: "directive", type: i10.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i11.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i11.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i11.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i12.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i13.ProgressSpinner, selector: "p-progressSpinner", inputs: ["styleClass", "style", "strokeWidth", "fill", "animationDuration", "ariaLabel"] }, { kind: "component", type: i14.NoDataComponent, selector: "pw-no-data", inputs: ["message", "description", "withImage"] }, { kind: "directive", type: i15.RbacAllowDirective, selector: "[rbacAllow]", inputs: ["rbacAllow"] }, { kind: "pipe", type: i16.TranslocoPipe, name: "transloco" }, { kind: "pipe", type: i17.DateFormatPipe, name: "dateFormat" }, { kind: "pipe", type: i17.TextTruncatePipe, name: "textTruncate" }] }); }
193
- }
194
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: AhoyVisitsComponent, decorators: [{
195
- type: Component,
196
- args: [{ selector: 'pw-ahoy-visits', template: "<div class=\"row\">\n <div class=\"col-12 d-flex justify-content-between align-items-center\">\n <h2 class=\"card-title p-0 float-start\">Ahoy Visits</h2>\n </div>\n</div>\n<div class=\"w-100 text-center mt-3\"\n *ngIf=\"!isLoaded\">\n <p-progressSpinner strokeWidth=\"2\"> </p-progressSpinner>\n</div>\n<div class=\"primeng-datatable-container mt-0\" [class.hideTable]=\"data.unfiltered_count === 0\">\n <div class=\"user-management-table table-responsive\">\n <p-table #dt\n [value]=\"data.visits\"\n [paginator]=\"data.object_count !== 0\"\n [lazy]=\"true\"\n [rows]=\"PAGE_SIZE\"\n [totalRecords]=\"data.object_count\"\n [loading]=\"loading\"\n [sortField]=\"'started_at'\"\n [sortOrder]=\"-1\"\n [filterDelay]=\"1000\"\n (onLazyLoad)=\"onLazyLoad($event)\">\n <ng-template pTemplate=\"caption\">\n <div class=\"row\">\n <div *rbacAllow=\"'SuperAdmin'\"\n class=\"col-sm-2 mb-2 mb-md-0\">\n <p-dropdown\n [options]=\"microServices\"\n (onChange)=\"onServiceChange($event.value)\"\n [placeholder]=\"'Select Service'\"\n optionLabel=\"name\"\n optionValue=\"name\">\n </p-dropdown>\n </div>\n <div class=\"col-sm-2\">\n <p-multiSelect #multiSelector [options]=\"searchOptions\"\n (onChange)=\"onSearchOptionChange($event)\"\n placeholder=\"Filter by users\"\n [(ngModel)]=\"filterSource\"\n [showToggleAll]=\"true\"\n [showHeader]=\"true\"\n appendTo=\"body\"\n [lazy]=\"true\"\n (scroll)=\"onScroll($event)\"\n (onPanelShow)=\"onPanelShow()\"\n [loading]=\"userLoading\"\n (onFilter)=\"handleFilter($event)\"\n >\n </p-multiSelect>\n </div>\n <div class=\"col-sm-2\">\n <p-calendar [showTime]=\"true\"\n [appendTo]=\"'body'\"\n (onSelect)=\"onDateSelection()\"\n [placeholder]=\"'Start Date'\"\n [(ngModel)]=\"startDate\"\n [showIcon]=\"true\"\n dateFormat=\"yy-M-dd\"\n >\n </p-calendar>\n </div>\n <div class=\"col-sm-2\">\n <p-calendar [appendTo]=\"'body'\"\n [showTime]=\"true\"\n (onSelect)=\"onDateSelection()\"\n [placeholder]=\"'End Date'\"\n [(ngModel)]=\"endDate\"\n [showIcon]=\"true\"\n dateFormat=\"yy-M-dd\">\n </p-calendar>\n </div>\n <div class=\"col d-flex align-items-center\">\n <i class=\"fa fa-search mt-2 me-2\" aria-hidden=\"true\"></i>\n <input type=\"text\"\n [(ngModel)]=\"searchText\"\n pInputText\n size=\"50\"\n placeholder=\"Search Visits...\"\n (input)=\"dt.filterGlobal($event.target.value, 'contains')\"\n class=\"mw-90 form-control bg-white\" />\n </div>\n </div>\n </ng-template>\n <ng-template pTemplate=\"header\">\n <tr>\n <th scope=\"true\"\n pSortableColumn=\"browser\">\n {{ 'Admin.Tracking.Browser' | transloco }}\n <p-sortIcon field=\"browser\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"device_type\">\n {{ 'Admin.Tracking.DeviceType' | transloco }}\n <p-sortIcon field=\"device_type\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"ip\">\n {{ 'Admin.Tracking.Ip' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"referring_domain\">\n {{ 'Admin.Tracking.Domain' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"landing_page\">\n {{ 'Admin.Tracking.LandingPage' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"country\">\n {{ 'Admin.Tracking.Country' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"region\">\n {{ 'Admin.Tracking.Region' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"city\">\n {{ 'Admin.Tracking.City' | transloco }}\n <p-sortIcon field=\"ip\"></p-sortIcon>\n </th>\n <th scope=\"true\"\n pSortableColumn=\"os\">\n {{ 'Admin.Tracking.Os' | transloco }}\n <p-sortIcon field=\"os\"></p-sortIcon>\n </th>\n <th scope=\"true\">\n {{ 'Admin.Tracking.User' | transloco }}\n </th>\n <th scope=\"true\"\n pSortableColumn=\"started_at\">\n {{ 'Admin.Tracking.StartedAt' | transloco }}\n <p-sortIcon field=\"started_at\"></p-sortIcon>\n </th>\n </tr>\n </ng-template>\n <ng-template pTemplate=\"body\"\n let-visits>\n <tr [class.d-none]=\"loading\">\n <td data-head=\"Browser\">{{ visits.browser }}</td>\n <td data-head=\"Device Type\">{{ visits.device_type }}</td>\n <td data-head=\"IP\">{{ visits.ip }}</td>\n <td data-head=\"referring_domain\">\n <span [ngbTooltip]=\"visits.referring_domain\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.referring_domain | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"landing_page\">\n <span [ngbTooltip]=\"visits.landing_page\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.landing_page | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"country\">\n <span [ngbTooltip]=\"visits.country\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.country | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"region\">\n <span [ngbTooltip]=\"visits.region\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.region | textTruncate: 20 }}\n </span>\n </td>\n <td data-head=\"city\">\n <span [ngbTooltip]=\"visits.city\"\n tooltipClass=\"custom-tooltip\"\n placement=\"top\" container=\"body\"> {{ visits.city | textTruncate: 20 }}\n </span></td>\n <td data-head=\"OS\">{{ visits.os }}</td>\n <td data-head=\"User\">\n <span *ngIf=\"visits?.user_id\">\n <span *ngIf=\"visits?.user\"><a [routerLink]=\"['/members', visits?.user?.slug]\">{{ visits?.user?.first_name }} {{ visits?.user?.last_name }}</a></span>\n <span *ngIf=\"!visits?.user\">{{ visits?.user_id }}</span>\n </span>\n </td>\n <td data-head=\"Started At\">{{ visits.started_at | dateFormat : 'datetime' }}</td>\n </tr>\n </ng-template>\n </p-table>\n <div *ngIf=\" data.object_count === 0 && data.unfiltered_count !== 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Search.NoDataMessage' | transloco\" [description]=\"'Search.NoDataDescription' | transloco\">\n </pw-no-data>\n </div>\n <span *ngIf=\"data.object_count !== 0\" class=\"total-records-count\">{{ 'Label.Total' | transloco }}: {{ data.object_count }}</span>\n </div>\n</div>\n<div *ngIf=\"!loading && data.unfiltered_count === 0\">\n <pw-no-data [withImage]=\"true\" [message]=\"'Admin.Ahoy.NoVistitsDataMessage' | transloco\"> </pw-no-data>\n</div>\n", styles: [":root{--first: rgb(23 105 225);--second: rgb(54 194 131);--third: rgb(255 171 0);--text: rgb(34 34 34);--tabs_bg: rgb(23 105 225);--tabs_sub_bg: rgb(70, 136, 236);--tabs_text: rgb(255 255 255);--titles: rgb(34 34 34);--sidebar_bg: rgb(0, 48, 63);--sidebar_text: rgb(255 255 255)}.table-responsive td,.table-responsive th{font-size:11px!important}\n"] }]
197
- }], ctorParameters: () => [{ type: i0.Injector }, { type: i1.AhoyService }, { type: i2.AdminDataService }, { type: i0.ChangeDetectorRef }] });
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWhveS12aXNpdHMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9hZG1pbi1tb2R1bGUvc3JjL2xpYi9jb21wb25lbnRzL3RyYWNraW5nL2Fob3ktdmlzaXRzL2Fob3ktdmlzaXRzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvYWRtaW4tbW9kdWxlL3NyYy9saWIvY29tcG9uZW50cy90cmFja2luZy9haG95LXZpc2l0cy9haG95LXZpc2l0cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBRUgsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxRQUFRLEVBR1gsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFXekQsTUFBTSxPQUFPLG1CQUNULFNBQVEsZ0JBQWdCO0lBb0N4QixZQUNJLFFBQWtCLEVBQ0QsV0FBd0IsRUFDeEIsZ0JBQWtDLEVBQ2xDLEdBQXNCO1FBRXZDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUpDLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFyQ25DLFNBQUksR0FBRyxDQUFDLENBQUM7UUFFVCxhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsZ0JBQVcsR0FB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QUssSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUMzRSxDQUFDO1lBRUYsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDcEIsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQ3RDLFFBQVEsQ0FBQyxFQUFFLENBQUMsUUFBUSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUM1QyxDQUFDO2dCQUNGLElBQUksS0FBSyxLQUFLLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLENBQUMsQ0FBQztvQkFDN0IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO2dCQUN4QyxDQUFDO1lBQ0wsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsYUFBYSxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsYUFBYSxFQUFFLEdBQUcsUUFBUSxDQUFDLENBQUM7UUFDOUQsQ0FBQyxDQUFDLENBQUM7SUFDWCxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDcEIsTUFBTSxxQkFBcUIsR0FBRyxhQUFhLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUVsRSxJQUFJLHFCQUFxQixJQUFJLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMvQyxxQkFBcUIsQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQzdFLENBQUM7SUFDTCxDQUFDOytHQW5OUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2RUN4QmhDLCsrUEFvTUE7OzRGRDVLYSxtQkFBbUI7a0JBTC9CLFNBQVM7K0JBQ0ksZ0JBQWdCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBJbmplY3RvcixcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0XG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBBZG1pbkRhdGFTZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2FkbWluLW1vZHVsZS11dGlscyc7XG5pbXBvcnQgeyBBcHBCYXNlQ29tcG9uZW50IH0gZnJvbSAnQHBvc2l3aXNlL2FwcC1iYXNlLWNvbXBvbmVudCc7XG5pbXBvcnQgeyBBaG95U2VydmljZSwgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAcG9zaXdpc2UvY29tbW9uLXNlcnZpY2VzJztcbmltcG9ydCB7IFBBR0VfU0laRSwgUGFnaW5nIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5cbmltcG9ydCB7IExhenlMb2FkRXZlbnQsIFNlbGVjdEl0ZW0gfSBmcm9tICdwcmltZW5nL2FwaSc7XG5cbmltcG9ydCB7IEFob3lWaXNpdFJlc3BvbnNlIH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL2ludGVyZmFjZS90cmFja2luZy5pbnRlcmZhY2UnO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ3B3LWFob3ktdmlzaXRzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vYWhveS12aXNpdHMuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2Fob3ktdmlzaXRzLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgQWhveVZpc2l0c0NvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIEFmdGVyVmlld0NoZWNrZWRcbntcbiAgICBwcml2YXRlIHBhZ2UgPSAxO1xuICAgIHByaXZhdGUgc2Nyb2xsTGlzdGVuZXI7XG4gICAgcHJpdmF0ZSB1c2VyUGFnZSA9IDE7XG4gICAgcHJpdmF0ZSBzdG9wTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgZGF0YTogQWhveVZpc2l0UmVzcG9uc2UgPSB7XG4gICAgICAgIHZpc2l0czogW10sXG4gICAgICAgIG9iamVjdF9jb3VudDogMCxcbiAgICAgICAgdW5maWx0ZXJlZF9jb3VudDogMFxuICAgIH07XG5cbiAgICBsb2FkaW5nID0gdHJ1ZTtcbiAgICBpc0xvYWRlZCA9IGZhbHNlO1xuICAgIHVzZXJMb2FkaW5nID0gZmFsc2U7XG5cbiAgICBzZWFyY2hUZXh0ID0gJyc7XG4gICAgdXNlclNlYXJjaFRleHQgPSAnJztcblxuICAgIG1pY3JvU2VydmljZXMgPSBbXTtcblxuICAgIHNlbGVjdGVkTWljcm9TZXJ2aWNlOiBzdHJpbmc7XG5cbiAgICBzdGFydERhdGU6IHN0cmluZztcbiAgICBlbmREYXRlOiBzdHJpbmc7XG5cbiAgICBzZWxlY3RlZE9wdGlvbjogU2VsZWN0SXRlbVtdID0gW107XG4gICAgZmlsdGVyU291cmNlOiBzdHJpbmdbXTtcblxuICAgIHN1YnNjcmlwdGlvbklkOiBudW1iZXI7XG5cbiAgICBjcml0ZXJpYSA9IFtdO1xuICAgIHNlYXJjaE9wdGlvbnMgPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWhveVNlcnZpY2U6IEFob3lTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFkbWluRGF0YVNlcnZpY2U6IEFkbWluRGF0YVNlcnZpY2UsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZlxuICAgICkge1xuICAgICAgICBzdXBlcihpbmplY3Rvcik7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWQgPSBQZXJtaXNzaW9uU2VydmljZS5zZWxlY3RlZFN1YnNjcmlwdGlvbj8uaWQ7XG4gICAgICAgIHRoaXMubWljcm9TZXJ2aWNlcyA9IEhlbHBlclNlcnZpY2UuZ2V0TWljcm9TZXJ2aWNlcyh0aGlzLmFwcENvbmZpZy5saW5rcyk7XG4gICAgICAgIHRoaXMubG9hZFVzZXIoKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBvbkxhenlMb2FkKGV2ZW50OiBMYXp5TG9hZEV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHBhZ2VEZXRhaWxzID0gSGVscGVyU2VydmljZS5vblRhYmxlTGF6eUxvYWQoZXZlbnQpO1xuICAgICAgICB0aGlzLnBhZ2UgPSBwYWdlRGV0YWlscy5wYWdlO1xuICAgICAgICB0aGlzLmdldEFob3lWaXNpdHMoe1xuICAgICAgICAgICAgcGFnZTogdGhpcy5wYWdlLFxuICAgICAgICAgICAgcGFnZV9zaXplOiBQQUdFX1NJWkUsXG4gICAgICAgICAgICBvcmRlcl9ieTogcGFnZURldGFpbHMuc29ydEZpZWxkLFxuICAgICAgICAgICAgb3JkZXJfZGlyZWN0aW9uOiBwYWdlRGV0YWlscy5zb3J0T3JkZXIsXG4gICAgICAgICAgICBzZWFyY2g6IHRoaXMuc2VhcmNoVGV4dFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvblBhbmVsU2hvdygpIHtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtdWx0aVNlbGVjdFBhbmVsV3JhcHBlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wLW11bHRpc2VsZWN0LWl0ZW1zLXdyYXBwZXInKTtcblxuICAgICAgICAgICAgaWYgKG11bHRpU2VsZWN0UGFuZWxXcmFwcGVyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2Nyb2xsTGlzdGVuZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgbXVsdGlTZWxlY3RQYW5lbFdyYXBwZXIucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsTGlzdGVuZXIgPSB0aGlzLm9uU2Nyb2xsLmJpbmQodGhpcyk7XG4gICAgICAgICAgICAgICAgbXVsdGlTZWxlY3RQYW5lbFdyYXBwZXIuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdNdWx0aVNlbGVjdCBwYW5lbCBub3QgZm91bmQuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDApO1xuICAgIH1cblxuICAgIG9uU2Nyb2xsKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAoZWxlbWVudC5zY3JvbGxIZWlnaHQgLSBlbGVtZW50LnNjcm9sbFRvcCA9PT0gZWxlbWVudC5jbGllbnRIZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZFVzZXIoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWRVc2VyKCkge1xuICAgICAgICBpZiAodGhpcy5zdG9wTG9hZGluZyB8fCB0aGlzLnVzZXJTZWFyY2hUZXh0ICE9PSAnJykge1xuICAgICAgICAgICAgdGhpcy51c2VyTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXNlckxvYWRpbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLmFkbWluRGF0YVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRVc2VycyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMudXNlclBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHRoaXMudXNlclNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy51c2VyTG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcExvYWRpbmcgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbGlkUmVzdWx0cyA9IHJlc3VsdC5maWx0ZXIodXNlciA9PiB1c2VyLnZhbHVlICYmIHVzZXIubGFiZWwpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaE9wdGlvbnMgPSBbLi4udGhpcy5zZWFyY2hPcHRpb25zLCAuLi52YWxpZFJlc3VsdHNdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzZXJQYWdlKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRBaG95VmlzaXRzKHBhZ2luZzogUGFnaW5nKSB7XG4gICAgICAgIHRoaXMuaXNMb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qgc2VydmljZSA9XG4gICAgICAgICAgICB0aGlzLm1pY3JvU2VydmljZXMuZmluZCh4ID0+IHgubmFtZSA9PT0gdGhpcy5zZWxlY3RlZE1pY3JvU2VydmljZSkgPz9cbiAgICAgICAgICAgIHRoaXMubWljcm9TZXJ2aWNlcy5maW5kKHggPT4geC52YWx1ZSA9PT0gdGhpcy5hcHBDb25maWcubGlua3M/Lm1haW5fYXBpKTtcbiAgICAgICAgY29uc3Qgb2JqID0ge1xuICAgICAgICAgICAgLi4ucGFnaW5nLFxuICAgICAgICAgICAgLi4uKHRoaXMuc3RhcnREYXRlICYmIHRoaXMuZW5kRGF0ZVxuICAgICAgICAgICAgICAgID8ge1xuICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0X2F0OiBuZXcgRGF0ZSh0aGlzLnN0YXJ0RGF0ZSkudG9JU09TdHJpbmcoKSxcbiAgICAgICAgICAgICAgICAgICAgICBlbmRfYXQ6IG5ldyBEYXRlKHRoaXMuZW5kRGF0ZSkudG9JU09TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDoge30pLFxuICAgICAgICAgICAgc2VhcmNoOiB0aGlzLnNlYXJjaFRleHQgfHwgJycsXG4gICAgICAgICAgICB1c2VyX2lkczogdGhpcy5zZWxlY3RlZE9wdGlvbj8uam9pbignLCcpIHx8IHVuZGVmaW5lZFxuICAgICAgICAgICAgLy8gTk9TT05BUlxuICAgICAgICB9O1xuICAgICAgICBPYmplY3Qua2V5cyhvYmopLmZvckVhY2goa2V5ID0+IG9ialtrZXldID09PSB1bmRlZmluZWQgJiYgZGVsZXRlIG9ialtrZXldKTtcblxuICAgICAgICB0aGlzLmFob3lTZXJ2aWNlXG4gICAgICAgICAgICAuZ2V0QWhveVZpc2l0cyhvYmosIHNlcnZpY2UsIHBhZ2luZylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlOiBBaG95VmlzaXRSZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5hZGQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25EYXRlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5zdGFydERhdGUgJiYgdGhpcy5lbmREYXRlKSB7XG4gICAgICAgICAgICB0aGlzLmdldEFob3lWaXNpdHMoe1xuICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgICAgICBwYWdlX3NpemU6IFBBR0VfU0laRVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblNlcnZpY2VDaGFuZ2UodmFsdWU6IHN0cmluZykge1xuICAgICAgICB0aGlzLnNlbGVjdGVkTWljcm9TZXJ2aWNlID0gdmFsdWU7XG4gICAgICAgIHRoaXMuZ2V0QWhveVZpc2l0cyh7IHBhZ2U6IHRoaXMucGFnZSwgcGFnZV9zaXplOiBQQUdFX1NJWkUgfSk7XG4gICAgfVxuXG4gICAgb25TZWFyY2hPcHRpb25DaGFuZ2UoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMuY3JpdGVyaWEgPSBbXTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE9wdGlvbiA9ICRldmVudC52YWx1ZTtcbiAgICAgICAgdGhpcy5nZXRBaG95VmlzaXRzKHtcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBoYW5kbGVGaWx0ZXIoJGV2ZW50KSB7XG4gICAgICAgIHRoaXMudXNlclNlYXJjaFRleHQgPSAkZXZlbnQuZmlsdGVyO1xuICAgICAgICB0aGlzLnN0b3BMb2FkaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMudXNlclBhZ2UgPSAxO1xuICAgICAgICB0aGlzLmFkbWluRGF0YVNlcnZpY2VcbiAgICAgICAgICAgIC5nZXRVc2VycyhcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMudXNlclBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIHBhZ2Vfc2l6ZTogUEFHRV9TSVpFLFxuICAgICAgICAgICAgICAgICAgICBzZWFyY2g6IHRoaXMudXNlclNlYXJjaFRleHRcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRoaXMuc3Vic2NyaXB0aW9uSWRcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC50aGVuKHJlc3VsdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbmV3VXNlcnMgPSByZXN1bHQuZmlsdGVyKFxuICAgICAgICAgICAgICAgICAgICB1c2VyID0+XG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLnZhbHVlICYmXG4gICAgICAgICAgICAgICAgICAgICAgICB1c2VyLmxhYmVsICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5zZWxlY3RlZE9wdGlvbi5zb21lKHNlbGVjdGVkID0+IHNlbGVjdGVkLnZhbHVlID09PSB1c2VyLnZhbHVlKVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBuZXdVc2Vycy5mb3JFYWNoKHVzZXIgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuc2VhcmNoT3B0aW9ucy5maW5kSW5kZXgoXG4gICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZyA9PiBleGlzdGluZy52YWx1ZSA9PT0gdXNlci52YWx1ZVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUmVtb3ZpbmcgdXNlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWFyY2hPcHRpb25zLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlYXJjaE9wdGlvbnMgPSBbLi4udGhpcy5zZWFyY2hPcHRpb25zLCAuLi5uZXdVc2Vyc107XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcbiAgICAgICAgY29uc3QgbXVsdGlWaXNpdFNlbGVjdFBhbmVsID0gSGVscGVyU2VydmljZS5nZXRNdWx0aVNlbGVjdFBhbmVsKCk7XG5cbiAgICAgICAgaWYgKG11bHRpVmlzaXRTZWxlY3RQYW5lbCAmJiB0aGlzLnNjcm9sbExpc3RlbmVyKSB7XG4gICAgICAgICAgICBtdWx0aVZpc2l0U2VsZWN0UGFuZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5zY3JvbGxMaXN0ZW5lcik7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwicm93XCI+XG4gIDxkaXYgY2xhc3M9XCJjb2wtMTIgZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIGFsaWduLWl0ZW1zLWNlbnRlclwiPlxuICAgIDxoMiBjbGFzcz1cImNhcmQtdGl0bGUgcC0wIGZsb2F0LXN0YXJ0XCI+QWhveSBWaXNpdHM8L2gyPlxuICA8L2Rpdj5cbjwvZGl2PlxuPGRpdiBjbGFzcz1cInctMTAwIHRleHQtY2VudGVyIG10LTNcIlxuICAqbmdJZj1cIiFpc0xvYWRlZFwiPlxuICA8cC1wcm9ncmVzc1NwaW5uZXIgc3Ryb2tlV2lkdGg9XCIyXCI+IDwvcC1wcm9ncmVzc1NwaW5uZXI+XG48L2Rpdj5cbjxkaXYgY2xhc3M9XCJwcmltZW5nLWRhdGF0YWJsZS1jb250YWluZXIgbXQtMFwiIFtjbGFzcy5oaWRlVGFibGVdPVwiZGF0YS51bmZpbHRlcmVkX2NvdW50ID09PSAwXCI+XG4gIDxkaXYgY2xhc3M9XCJ1c2VyLW1hbmFnZW1lbnQtdGFibGUgdGFibGUtcmVzcG9uc2l2ZVwiPlxuICAgIDxwLXRhYmxlICNkdFxuICAgICAgW3ZhbHVlXT1cImRhdGEudmlzaXRzXCJcbiAgICAgIFtwYWdpbmF0b3JdPVwiZGF0YS5vYmplY3RfY291bnQgIT09IDBcIlxuICAgICAgW2xhenldPVwidHJ1ZVwiXG4gICAgICBbcm93c109XCJQQUdFX1NJWkVcIlxuICAgICAgW3RvdGFsUmVjb3Jkc109XCJkYXRhLm9iamVjdF9jb3VudFwiXG4gICAgICBbbG9hZGluZ109XCJsb2FkaW5nXCJcbiAgICAgIFtzb3J0RmllbGRdPVwiJ3N0YXJ0ZWRfYXQnXCJcbiAgICAgIFtzb3J0T3JkZXJdPVwiLTFcIlxuICAgICAgW2ZpbHRlckRlbGF5XT1cIjEwMDBcIlxuICAgICAgKG9uTGF6eUxvYWQpPVwib25MYXp5TG9hZCgkZXZlbnQpXCI+XG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiAqcmJhY0FsbG93PVwiJ1N1cGVyQWRtaW4nXCJcbiAgICAgICAgICAgIGNsYXNzPVwiY29sLXNtLTIgbWItMiBtYi1tZC0wXCI+XG4gICAgICAgICAgICA8cC1kcm9wZG93blxuICAgICAgICAgICAgICBbb3B0aW9uc109XCJtaWNyb1NlcnZpY2VzXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uU2VydmljZUNoYW5nZSgkZXZlbnQudmFsdWUpXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidTZWxlY3QgU2VydmljZSdcIlxuICAgICAgICAgICAgICBvcHRpb25MYWJlbD1cIm5hbWVcIlxuICAgICAgICAgICAgICBvcHRpb25WYWx1ZT1cIm5hbWVcIj5cbiAgICAgICAgICAgIDwvcC1kcm9wZG93bj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxuICAgICAgICAgICAgICA8cC1tdWx0aVNlbGVjdCAjbXVsdGlTZWxlY3RvciBbb3B0aW9uc109XCJzZWFyY2hPcHRpb25zXCJcbiAgICAgICAgICAgICAgKG9uQ2hhbmdlKT1cIm9uU2VhcmNoT3B0aW9uQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICBwbGFjZWhvbGRlcj1cIkZpbHRlciBieSB1c2Vyc1wiXG4gICAgICAgICAgICAgIFsobmdNb2RlbCldPVwiZmlsdGVyU291cmNlXCJcbiAgICAgICAgICAgICAgW3Nob3dUb2dnbGVBbGxdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFtzaG93SGVhZGVyXT1cInRydWVcIlxuICAgICAgICAgICAgICBhcHBlbmRUbz1cImJvZHlcIlxuICAgICAgICAgICAgICBbbGF6eV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKHNjcm9sbCk9XCJvblNjcm9sbCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKG9uUGFuZWxTaG93KT1cIm9uUGFuZWxTaG93KClcIlxuICAgICAgICAgICAgICBbbG9hZGluZ109XCJ1c2VyTG9hZGluZ1wiXG4gICAgICAgICAgICAgIChvbkZpbHRlcik9XCJoYW5kbGVGaWx0ZXIoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9wLW11bHRpU2VsZWN0PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1zbS0yXCI+XG4gICAgICAgICAgICA8cC1jYWxlbmRhciBbc2hvd1RpbWVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIFthcHBlbmRUb109XCInYm9keSdcIlxuICAgICAgICAgICAgICAob25TZWxlY3QpPVwib25EYXRlU2VsZWN0aW9uKClcIlxuICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1N0YXJ0IERhdGUnXCJcbiAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGFydERhdGVcIlxuICAgICAgICAgICAgICBbc2hvd0ljb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJ5eS1NLWRkXCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9wLWNhbGVuZGFyPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtc20tMlwiPlxuICAgICAgICAgICAgPHAtY2FsZW5kYXIgW2FwcGVuZFRvXT1cIidib2R5J1wiXG4gICAgICAgICAgICAgIFtzaG93VGltZV09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgKG9uU2VsZWN0KT1cIm9uRGF0ZVNlbGVjdGlvbigpXCJcbiAgICAgICAgICAgICAgW3BsYWNlaG9sZGVyXT1cIidFbmQgRGF0ZSdcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVuZERhdGVcIlxuICAgICAgICAgICAgICBbc2hvd0ljb25dPVwidHJ1ZVwiXG4gICAgICAgICAgICAgIGRhdGVGb3JtYXQ9XCJ5eS1NLWRkXCI+XG4gICAgICAgICAgICA8L3AtY2FsZW5kYXI+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXNlYXJjaCBtdC0yIG1lLTJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNlYXJjaFRleHRcIlxuICAgICAgICAgICAgICBwSW5wdXRUZXh0XG4gICAgICAgICAgICAgIHNpemU9XCI1MFwiXG4gICAgICAgICAgICAgIHBsYWNlaG9sZGVyPVwiU2VhcmNoIFZpc2l0cy4uLlwiXG4gICAgICAgICAgICAgIChpbnB1dCk9XCJkdC5maWx0ZXJHbG9iYWwoJGV2ZW50LnRhcmdldC52YWx1ZSwgJ2NvbnRhaW5zJylcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm13LTkwIGZvcm0tY29udHJvbCBiZy13aGl0ZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwiYnJvd3NlclwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlRyYWNraW5nLkJyb3dzZXInIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImJyb3dzZXJcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImRldmljZV90eXBlXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuRGV2aWNlVHlwZScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiZGV2aWNlX3R5cGVcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImlwXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuSXAnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImlwXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJyZWZlcnJpbmdfZG9tYWluXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuRG9tYWluJyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJpcFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwibGFuZGluZ19wYWdlXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuTGFuZGluZ1BhZ2UnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICA8cC1zb3J0SWNvbiBmaWVsZD1cImlwXCI+PC9wLXNvcnRJY29uPlxuICAgICAgICAgIDwvdGg+XG4gICAgICAgICAgPHRoIHNjb3BlPVwidHJ1ZVwiXG4gICAgICAgICAgICBwU29ydGFibGVDb2x1bW49XCJjb3VudHJ5XCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuQ291bnRyeScgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiaXBcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cInJlZ2lvblwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlRyYWNraW5nLlJlZ2lvbicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwiaXBcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCJcbiAgICAgICAgICAgIHBTb3J0YWJsZUNvbHVtbj1cImNpdHlcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5UcmFja2luZy5DaXR5JyB8IHRyYW5zbG9jbyB9fVxuICAgICAgICAgICAgPHAtc29ydEljb24gZmllbGQ9XCJpcFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwib3NcIj5cbiAgICAgICAgICAgIHt7ICdBZG1pbi5UcmFja2luZy5PcycgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwib3NcIj48L3Atc29ydEljb24+XG4gICAgICAgICAgPC90aD5cbiAgICAgICAgICA8dGggc2NvcGU9XCJ0cnVlXCI+XG4gICAgICAgICAgICB7eyAnQWRtaW4uVHJhY2tpbmcuVXNlcicgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICA8L3RoPlxuICAgICAgICAgIDx0aCBzY29wZT1cInRydWVcIlxuICAgICAgICAgICAgcFNvcnRhYmxlQ29sdW1uPVwic3RhcnRlZF9hdFwiPlxuICAgICAgICAgICAge3sgJ0FkbWluLlRyYWNraW5nLlN0YXJ0ZWRBdCcgfCB0cmFuc2xvY28gfX1cbiAgICAgICAgICAgIDxwLXNvcnRJY29uIGZpZWxkPVwic3RhcnRlZF9hdFwiPjwvcC1zb3J0SWNvbj5cbiAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJib2R5XCJcbiAgICAgICAgbGV0LXZpc2l0cz5cbiAgICAgICAgPHRyIFtjbGFzcy5kLW5vbmVdPVwibG9hZGluZ1wiPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJCcm93c2VyXCI+e3sgdmlzaXRzLmJyb3dzZXIgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJEZXZpY2UgVHlwZVwiPnt7IHZpc2l0cy5kZXZpY2VfdHlwZSB9fTwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIklQXCI+e3sgdmlzaXRzLmlwIH19PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwicmVmZXJyaW5nX2RvbWFpblwiPlxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwidmlzaXRzLnJlZmVycmluZ19kb21haW5cIlxuICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiICBjb250YWluZXI9XCJib2R5XCI+IHt7IHZpc2l0cy5yZWZlcnJpbmdfZG9tYWluIHwgdGV4dFRydW5jYXRlOiAyMCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cImxhbmRpbmdfcGFnZVwiPlxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwidmlzaXRzLmxhbmRpbmdfcGFnZVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgIGNvbnRhaW5lcj1cImJvZHlcIj4ge3sgdmlzaXRzLmxhbmRpbmdfcGFnZSB8IHRleHRUcnVuY2F0ZTogMjAgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiY291bnRyeVwiPlxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwidmlzaXRzLmNvdW50cnlcIlxuICAgICAgICAgICAgICB0b29sdGlwQ2xhc3M9XCJjdXN0b20tdG9vbHRpcFwiXG4gICAgICAgICAgICAgIHBsYWNlbWVudD1cInRvcFwiICBjb250YWluZXI9XCJib2R5XCI+IHt7IHZpc2l0cy5jb3VudHJ5IHwgdGV4dFRydW5jYXRlOiAyMCB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cInJlZ2lvblwiPlxuICAgICAgICAgICAgPHNwYW4gW25nYlRvb2x0aXBdPVwidmlzaXRzLnJlZ2lvblwiXG4gICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgIGNvbnRhaW5lcj1cImJvZHlcIj4ge3sgdmlzaXRzLnJlZ2lvbiB8IHRleHRUcnVuY2F0ZTogMjAgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJjaXR5XCI+XG4gICAgICAgICAgICA8c3BhbiBbbmdiVG9vbHRpcF09XCJ2aXNpdHMuY2l0eVwiXG4gICAgICAgICAgICAgIHRvb2x0aXBDbGFzcz1cImN1c3RvbS10b29sdGlwXCJcbiAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCIgIGNvbnRhaW5lcj1cImJvZHlcIj4ge3sgdmlzaXRzLmNpdHkgfCB0ZXh0VHJ1bmNhdGU6IDIwIH19XG4gICAgICAgICAgICA8L3NwYW4+PC90ZD5cbiAgICAgICAgICA8dGQgZGF0YS1oZWFkPVwiT1NcIj57eyB2aXNpdHMub3MgfX08L3RkPlxuICAgICAgICAgIDx0ZCBkYXRhLWhlYWQ9XCJVc2VyXCI+XG4gICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZpc2l0cz8udXNlcl9pZFwiPlxuICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cInZpc2l0cz8udXNlclwiPjxhIFtyb3V0ZXJMaW5rXT1cIlsnL21lbWJlcnMnLCB2aXNpdHM/LnVzZXI/LnNsdWddXCI+e3sgdmlzaXRzPy51c2VyPy5maXJzdF9uYW1lIH19IHt7IHZpc2l0cz8udXNlcj8ubGFzdF9uYW1lIH19PC9hPjwvc3Bhbj5cbiAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhdmlzaXRzPy51c2VyXCI+e3sgdmlzaXRzPy51c2VyX2lkIH19PC9zcGFuPlxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgPHRkIGRhdGEtaGVhZD1cIlN0YXJ0ZWQgQXRcIj57eyB2aXNpdHMuc3RhcnRlZF9hdCB8IGRhdGVGb3JtYXQgOiAnZGF0ZXRpbWUnIH19PC90ZD5cbiAgICAgICAgPC90cj5cbiAgICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPC9wLXRhYmxlPlxuICAgIDxkaXYgKm5nSWY9XCIgZGF0YS5vYmplY3RfY291bnQgPT09IDAgJiYgZGF0YS51bmZpbHRlcmVkX2NvdW50ICE9PSAwXCI+XG4gICAgICA8cHctbm8tZGF0YSBbd2l0aEltYWdlXT1cInRydWVcIiBbbWVzc2FnZV09XCInU2VhcmNoLk5vRGF0YU1lc3NhZ2UnIHwgdHJhbnNsb2NvXCIgW2Rlc2NyaXB0aW9uXT1cIidTZWFyY2guTm9EYXRhRGVzY3JpcHRpb24nIHwgdHJhbnNsb2NvXCI+XG4gICAgICA8L3B3LW5vLWRhdGE+XG4gICAgPC9kaXY+XG4gICAgPHNwYW4gKm5nSWY9XCJkYXRhLm9iamVjdF9jb3VudCAhPT0gMFwiIGNsYXNzPVwidG90YWwtcmVjb3Jkcy1jb3VudFwiPnt7ICdMYWJlbC5Ub3RhbCcgfCB0cmFuc2xvY28gfX06IHt7ICBkYXRhLm9iamVjdF9jb3VudCB9fTwvc3Bhbj5cbiAgPC9kaXY+XG48L2Rpdj5cbjxkaXYgKm5nSWY9XCIhbG9hZGluZyAmJiBkYXRhLnVuZmlsdGVyZWRfY291bnQgPT09IDBcIj5cbiAgPHB3LW5vLWRhdGEgW3dpdGhJbWFnZV09XCJ0cnVlXCIgW21lc3NhZ2VdPVwiJ0FkbWluLkFob3kuTm9WaXN0aXRzRGF0YU1lc3NhZ2UnIHwgdHJhbnNsb2NvXCI+IDwvcHctbm8tZGF0YT5cbjwvZGl2PlxuIl19