@posiwise/resource-module 0.0.148 → 0.0.150
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/index.mjs +22 -3
- package/esm2022/lib/public/components/reslease-note-card/release-note-card.component.mjs +13 -9
- package/esm2022/lib/public/components/resource-blogs/resource-blog-top-banner/resource-blog-top-banner.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-blogs/resource-blog.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.mjs +18 -12
- package/esm2022/lib/public/components/resource-case-studies/resource-case-studies.component.mjs +10 -10
- package/esm2022/lib/public/components/resource-company-card/resource-company-card.component.mjs +7 -8
- package/esm2022/lib/public/components/resource-contact-us/resource-contact-us.component.mjs +510 -0
- package/esm2022/lib/public/components/resource-contact-us/resource-contact-us.module.mjs +77 -0
- package/esm2022/lib/public/components/resource-edit-card/resource-edit-card.component.mjs +5 -5
- package/esm2022/lib/public/components/resource-edit-card-lazy/resource-edit-card-lazy.component.mjs +75 -0
- package/esm2022/lib/public/components/resource-integration/integration-top-banner/integration-top-banner.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-integration/resource-integration.component.mjs +13 -13
- package/esm2022/lib/public/components/resource-post/related-resources/related-resources.component.mjs +8 -8
- package/esm2022/lib/public/components/resource-post/related-resources/resource-cards/resource-cards.component.mjs +8 -8
- package/esm2022/lib/public/components/resource-post/resource-post-details/resource-post-details.component.mjs +55 -24
- package/esm2022/lib/public/components/resource-post/resource-post.component.mjs +7 -8
- package/esm2022/lib/public/components/resource-release-notes/resource-release-notes-top-banner/resource-release-notes-top-banner.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-release-notes/resource-release-notes.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-top-banner-edit/resource-top-banner-edit.component.mjs +3 -3
- package/esm2022/lib/public/components/resource-vault/resource-vault.component.mjs +8 -8
- package/esm2022/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.mjs +18 -12
- package/esm2022/lib/public/components/resource-videos/resource-videos-top-banner/resource-videos-top-banner.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-videos/resource-videos.component.mjs +6 -6
- package/esm2022/lib/public/components/resource-webinars/replay-event-cards/replay-event-cards.component.mjs +8 -8
- package/esm2022/lib/public/components/resource-webinars/resource-webinars.component.mjs +9 -9
- package/esm2022/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.mjs +21 -14
- package/esm2022/lib/public/components/resources/resource-tags/resource-tags.component.mjs +3 -3
- package/esm2022/lib/public/components/resources/resources.component.mjs +21 -18
- package/esm2022/lib/public/components/resources/vault-section/vault-section.component.mjs +5 -5
- package/esm2022/lib/public/components/resources-hub/resources-hub.component.mjs +12 -11
- package/esm2022/lib/public/components/testimonial-card/testimonial-card.component.mjs +10 -9
- package/esm2022/lib/public/components/white-papers/white-papers-top-banner/white-papers-top-banner.component.mjs +6 -6
- package/esm2022/lib/public/components/white-papers/white-papers.component.mjs +6 -6
- package/esm2022/lib/public/modules/blogs/resource-blogs.module.mjs +30 -0
- package/esm2022/lib/public/modules/case-studies/resource-case-studies.module.mjs +35 -0
- package/esm2022/lib/public/modules/events/resource-events.module.mjs +30 -0
- package/esm2022/lib/public/modules/hub/resource-hub.module.mjs +29 -0
- package/esm2022/lib/public/modules/integrations/resource-integrations.module.mjs +30 -0
- package/esm2022/lib/public/modules/post/resource-post.module.mjs +32 -0
- package/esm2022/lib/public/modules/release-notes/resource-release-notes.module.mjs +30 -0
- package/esm2022/lib/public/modules/root/resource-root-shared.module.mjs +61 -0
- package/esm2022/lib/public/modules/root/resource-root.module.mjs +32 -0
- package/esm2022/lib/public/modules/videos/resource-videos.module.mjs +30 -0
- package/esm2022/lib/public/modules/white-papers/resource-white-papers.module.mjs +31 -0
- package/esm2022/lib/public/resource-public.module.mjs +5 -175
- package/esm2022/lib/public/resource-public.routing.module.mjs +13 -62
- package/esm2022/lib/public/shared/resource-cards.module.mjs +116 -0
- package/esm2022/lib/public/shared/resource-edit.module.mjs +64 -0
- package/esm2022/lib/public/shared/resource-shared.module.mjs +116 -0
- package/esm2022/lib/shared/resource-modal.interface.mjs +2 -0
- package/fesm2022/posiwise-resource-module-base-top-banner.component-DFT3ZpJE.mjs +111 -0
- package/fesm2022/posiwise-resource-module-base-top-banner.component-DFT3ZpJE.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-posiwise-resource-module-D953ymF3.mjs +2311 -0
- package/fesm2022/posiwise-resource-module-posiwise-resource-module-D953ymF3.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-blogs.module-Dpg-VGXf.mjs +91 -0
- package/fesm2022/posiwise-resource-module-resource-blogs.module-Dpg-VGXf.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-case-studies.module-Bxfa0c61.mjs +127 -0
- package/fesm2022/posiwise-resource-module-resource-case-studies.module-Bxfa0c61.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-events.module-CNKoXu2J.mjs +245 -0
- package/fesm2022/posiwise-resource-module-resource-events.module-CNKoXu2J.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-hub.module-ggk9jRt9.mjs +249 -0
- package/fesm2022/posiwise-resource-module-resource-hub.module-ggk9jRt9.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-integrations.module-vGdvpS64.mjs +286 -0
- package/fesm2022/posiwise-resource-module-resource-integrations.module-vGdvpS64.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-post.module-RkJpZSPU.mjs +318 -0
- package/fesm2022/posiwise-resource-module-resource-post.module-RkJpZSPU.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-release-notes.module-DKu39Lgo.mjs +124 -0
- package/fesm2022/posiwise-resource-module-resource-release-notes.module-DKu39Lgo.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-root.module-CItOAAUj.mjs +403 -0
- package/fesm2022/posiwise-resource-module-resource-root.module-CItOAAUj.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-videos.module-CuXWTy8y.mjs +91 -0
- package/fesm2022/posiwise-resource-module-resource-videos.module-CuXWTy8y.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module-resource-white-papers.module-BJe9cvpS.mjs +92 -0
- package/fesm2022/posiwise-resource-module-resource-white-papers.module-BJe9cvpS.mjs.map +1 -0
- package/fesm2022/posiwise-resource-module.mjs +32 -3119
- package/fesm2022/posiwise-resource-module.mjs.map +1 -1
- package/index.d.ts +17 -2
- package/lib/public/components/reslease-note-card/release-note-card.component.d.ts +2 -1
- package/lib/public/components/resource-case-studies/case-studies-cards/case-studies-cards.component.d.ts +4 -2
- package/lib/public/components/resource-contact-us/resource-contact-us.component.d.ts +126 -0
- package/lib/public/components/resource-contact-us/resource-contact-us.module.d.ts +23 -0
- package/lib/public/components/resource-edit-card-lazy/resource-edit-card-lazy.component.d.ts +19 -0
- package/lib/public/components/resource-post/resource-post-details/resource-post-details.component.d.ts +5 -4
- package/lib/public/components/resource-videos/resource-video-cards/resource-video-cards.component.d.ts +4 -2
- package/lib/public/components/resource-webinars/upcoming-event-cards/upcoming-event-cards.component.d.ts +4 -2
- package/lib/public/components/resources/resources.component.d.ts +3 -2
- package/lib/public/modules/blogs/resource-blogs.module.d.ts +10 -0
- package/lib/public/modules/case-studies/resource-case-studies.module.d.ts +10 -0
- package/lib/public/modules/events/resource-events.module.d.ts +10 -0
- package/lib/public/modules/hub/resource-hub.module.d.ts +9 -0
- package/lib/public/modules/integrations/resource-integrations.module.d.ts +10 -0
- package/lib/public/modules/post/resource-post.module.d.ts +11 -0
- package/lib/public/modules/release-notes/resource-release-notes.module.d.ts +10 -0
- package/lib/public/modules/root/resource-root-shared.module.d.ts +17 -0
- package/lib/public/modules/root/resource-root.module.d.ts +11 -0
- package/lib/public/modules/videos/resource-videos.module.d.ts +10 -0
- package/lib/public/modules/white-papers/resource-white-papers.module.d.ts +10 -0
- package/lib/public/resource-public.module.d.ts +2 -51
- package/lib/public/shared/resource-cards.module.d.ts +32 -0
- package/lib/public/shared/resource-edit.module.d.ts +22 -0
- package/lib/public/shared/resource-shared.module.d.ts +19 -0
- package/lib/shared/resource-modal.interface.d.ts +6 -0
- package/package.json +1 -1
- package/esm2022/lib/public/components/resource-card-list/resource-card-list.component.mjs +0 -22
- package/esm2022/lib/public/components/resources-read/resources-read.component.mjs +0 -125
- package/lib/public/components/resource-card-list/resource-card-list.component.d.ts +0 -8
- package/lib/public/components/resources-read/resources-read.component.d.ts +0 -43
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
import { moveItemInArray } from '@angular/cdk/drag-drop';
|
|
2
|
+
import { DOCUMENT } from '@angular/common';
|
|
3
|
+
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, ElementRef, Inject, Injector, Input, TemplateRef, ViewChild } from '@angular/core';
|
|
4
|
+
import { UntypedFormBuilder, Validators } from '@angular/forms';
|
|
5
|
+
import { DomSanitizer } from '@angular/platform-browser';
|
|
6
|
+
import { AdminService } from '@posiwise/admin-module-utils';
|
|
7
|
+
import { AppBaseComponent } from '@posiwise/app-base-component';
|
|
8
|
+
import { AbTestService, AuthService, ValidationService } from '@posiwise/common-services';
|
|
9
|
+
import { HelperService } from '@posiwise/helper-service';
|
|
10
|
+
import { CustomUploaderComponent } from '@posiwise/shared-components';
|
|
11
|
+
import { CrmService } from '@posiwise/smart-crm-shared';
|
|
12
|
+
import { StatusCodes } from 'http-status-codes';
|
|
13
|
+
import Swal from 'sweetalert2';
|
|
14
|
+
import { NgbModal } from '@ng-bootstrap/ng-bootstrap';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
import * as i1 from "@angular/forms";
|
|
17
|
+
import * as i2 from "@posiwise/common-services";
|
|
18
|
+
import * as i3 from "@posiwise/smart-crm-shared";
|
|
19
|
+
import * as i4 from "@angular/platform-browser";
|
|
20
|
+
import * as i5 from "@posiwise/admin-module-utils";
|
|
21
|
+
import * as i6 from "@ng-bootstrap/ng-bootstrap";
|
|
22
|
+
import * as i7 from "@angular/common";
|
|
23
|
+
import * as i8 from "@angular/router";
|
|
24
|
+
import * as i9 from "@angular/cdk/drag-drop";
|
|
25
|
+
import * as i10 from "@posiwise/directives";
|
|
26
|
+
import * as i11 from "ngx-captcha";
|
|
27
|
+
import * as i12 from "primeng/dropdown";
|
|
28
|
+
import * as i13 from "@posiwise/shared-components";
|
|
29
|
+
import * as i14 from "@jsverse/transloco";
|
|
30
|
+
export class Trial4ContactUsComponent extends AppBaseComponent {
|
|
31
|
+
openQuestionsEditModal() {
|
|
32
|
+
this.editingQuestions = JSON.parse(JSON.stringify(this.editingQuestions ?? []));
|
|
33
|
+
this.modalService.open(this.questionsEditModal, { centered: true, size: 'lg' });
|
|
34
|
+
}
|
|
35
|
+
constructor(fb, authService, crmService, sanitizer, adminService, injector, abTestService, modalService, cdr, document) {
|
|
36
|
+
super(injector);
|
|
37
|
+
this.fb = fb;
|
|
38
|
+
this.authService = authService;
|
|
39
|
+
this.crmService = crmService;
|
|
40
|
+
this.sanitizer = sanitizer;
|
|
41
|
+
this.adminService = adminService;
|
|
42
|
+
this.abTestService = abTestService;
|
|
43
|
+
this.modalService = modalService;
|
|
44
|
+
this.cdr = cdr;
|
|
45
|
+
this.document = document;
|
|
46
|
+
this.editingQuestions = [];
|
|
47
|
+
this.isFooterVisible = false;
|
|
48
|
+
this.recaptcha = null;
|
|
49
|
+
this.subscriptionId = this.appConfig.crm.subscription_id;
|
|
50
|
+
this.sourceId = this.appConfig.crm.source_id;
|
|
51
|
+
this.masterSubscriptionId = this.appConfig.master_subscription.subscription_id;
|
|
52
|
+
this.canEditResourcesValue = false;
|
|
53
|
+
this.logo = this.appConfig?.company?.logos?.main_contrast?.url;
|
|
54
|
+
this.trialBgImage2 = this.appConfig?.signup_config.trial?.image_bg2?.url;
|
|
55
|
+
this.tosId = this.appConfig?.main_tos_id;
|
|
56
|
+
this.description = this.appConfig.company.description;
|
|
57
|
+
this.email = this.appConfig.company.email;
|
|
58
|
+
this.companyName = this.appConfig.company.name;
|
|
59
|
+
this.street = this.appConfig.company.street;
|
|
60
|
+
this.questions = this.appConfig?.pages_config?.contact_us?.questions;
|
|
61
|
+
this.hubspot = this.appConfig?.pages_config?.contact_us?.hubspot;
|
|
62
|
+
this.footerLinks = this.appConfig?.pages_config?.footer_links?.items;
|
|
63
|
+
this.footerLinksData = this.appConfig?.pages_config?.footer_links;
|
|
64
|
+
this.youtubeUrl = this.appConfig.social?.youtube_url;
|
|
65
|
+
this.linkedInUrl = this.appConfig.social?.linkedin_url;
|
|
66
|
+
this.domainId = this.appConfig.domain_id;
|
|
67
|
+
this.editingEmail = this.email;
|
|
68
|
+
this.isEditingEmail = false;
|
|
69
|
+
this.submitted = false;
|
|
70
|
+
this.isCaptchaVerified = false;
|
|
71
|
+
this.isEmailValid = true;
|
|
72
|
+
this.isEditingStreet = false;
|
|
73
|
+
this.editingFooterLinks = {
|
|
74
|
+
items: []
|
|
75
|
+
};
|
|
76
|
+
this.captchaKeyV2 = this.appConfig.integrations.captcha_key_V2;
|
|
77
|
+
this.contactUsForm();
|
|
78
|
+
}
|
|
79
|
+
ngOnInit() {
|
|
80
|
+
setTimeout(() => (this.isHubspotReady = true), 2000);
|
|
81
|
+
if (this.userLoggedIn) {
|
|
82
|
+
this.localStorage.getItem$('product').subscribe(res => {
|
|
83
|
+
const data = res ? JSON.parse(res) : null;
|
|
84
|
+
this.id = data?.subscriptionId;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
this.previewData = {
|
|
88
|
+
url: this.logo,
|
|
89
|
+
name: 'logo_main_contrast.png'
|
|
90
|
+
};
|
|
91
|
+
this.editingStreet = this.street;
|
|
92
|
+
if (Array.isArray(this.appConfig.pages_config?.ab_tests)) {
|
|
93
|
+
this.abTests = this.appConfig.pages_config.ab_tests.find(test => test.description === 'contact-us');
|
|
94
|
+
this.microserviceName = this.abTests?.microservice_name;
|
|
95
|
+
this.experimentName = this.abTests?.experiment_name;
|
|
96
|
+
this.shardName = this.abTests?.db_shard;
|
|
97
|
+
}
|
|
98
|
+
const footerItem = this.getFooterHubspotForm();
|
|
99
|
+
if (footerItem?.div) {
|
|
100
|
+
// NOSONAR: Trusted HTML content is handled safely here
|
|
101
|
+
this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(footerItem.div); // NOSONAR
|
|
102
|
+
}
|
|
103
|
+
this.editingQuestions = this.questions;
|
|
104
|
+
this.question = this.questions?.[0]?.question;
|
|
105
|
+
this.psaOptions = [
|
|
106
|
+
{ label: 'Select PSA', value: '' },
|
|
107
|
+
...(this.questions?.[0]?.options ?? [])
|
|
108
|
+
.filter(q => q.option?.trim())
|
|
109
|
+
.map(q => ({
|
|
110
|
+
label: q.option,
|
|
111
|
+
value: q.option
|
|
112
|
+
}))
|
|
113
|
+
];
|
|
114
|
+
}
|
|
115
|
+
ngOnChanges(changes) {
|
|
116
|
+
if (changes['user'] || changes['userLoggedIn']) {
|
|
117
|
+
if (this.userLoggedIn && this.user) {
|
|
118
|
+
this.updateCanEditResourcesValue();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
openLogoEditModal() {
|
|
123
|
+
this.modalService.open(this.logoModal, {
|
|
124
|
+
centered: true,
|
|
125
|
+
size: 'md'
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
onSaveFile(event) {
|
|
129
|
+
const formData = new FormData();
|
|
130
|
+
const data = { subscription_id: this.subscriptionId };
|
|
131
|
+
if (event.file instanceof File) {
|
|
132
|
+
data[event.name] = event.file;
|
|
133
|
+
}
|
|
134
|
+
else if (event.file === null) {
|
|
135
|
+
data[`remove_${event.name}`] = true;
|
|
136
|
+
}
|
|
137
|
+
for (const key in data) {
|
|
138
|
+
formData.append(key, data[key]);
|
|
139
|
+
}
|
|
140
|
+
this.adminService.updateDomainConfig(this.domainId, formData).subscribe(() => {
|
|
141
|
+
if (event.file) {
|
|
142
|
+
this.logo = URL.createObjectURL(event.file);
|
|
143
|
+
this.modalService.dismissAll();
|
|
144
|
+
}
|
|
145
|
+
this.toast.success(event.file ? 'Logo updated' : 'Logo removed');
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
saveQuestions(modal) {
|
|
149
|
+
const updateData = {
|
|
150
|
+
contact_us: {
|
|
151
|
+
...this.appConfig.pages_config?.contact_us,
|
|
152
|
+
questions: this.editingQuestions
|
|
153
|
+
},
|
|
154
|
+
subscription_id: this.id
|
|
155
|
+
};
|
|
156
|
+
this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
|
|
157
|
+
this.questions = this.editingQuestions;
|
|
158
|
+
this.toast.success('Questions updated');
|
|
159
|
+
this.question = this.editingQuestions?.[0]?.question;
|
|
160
|
+
if (this.editingQuestions?.[0]?.options?.length > 0) {
|
|
161
|
+
this.psaOptions = [
|
|
162
|
+
{ label: 'Select PSA', value: '' },
|
|
163
|
+
...(this.questions?.[0]?.options ?? [])
|
|
164
|
+
.filter(q => q.option?.trim())
|
|
165
|
+
.map(q => ({
|
|
166
|
+
label: q.option,
|
|
167
|
+
value: q.option
|
|
168
|
+
}))
|
|
169
|
+
];
|
|
170
|
+
}
|
|
171
|
+
else {
|
|
172
|
+
this.psaOptions = [];
|
|
173
|
+
}
|
|
174
|
+
modal.close();
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
addNewQuestion() {
|
|
178
|
+
this.editingQuestions.push({ question: '', options: [] });
|
|
179
|
+
}
|
|
180
|
+
addQuestionOption(qIndex) {
|
|
181
|
+
this.editingQuestions[qIndex].options.push({ option: '' });
|
|
182
|
+
}
|
|
183
|
+
removeQuestionOption(qIndex, optIndex) {
|
|
184
|
+
this.editingQuestions[qIndex].options.splice(optIndex, 1);
|
|
185
|
+
}
|
|
186
|
+
dropQuestions(event) {
|
|
187
|
+
moveItemInArray(this.editingQuestions, event.previousIndex, event.currentIndex);
|
|
188
|
+
}
|
|
189
|
+
dropQuestionOptions(qIndex, event) {
|
|
190
|
+
moveItemInArray(this.editingQuestions[qIndex].options, event.previousIndex, event.currentIndex);
|
|
191
|
+
}
|
|
192
|
+
openSocialEditModal() {
|
|
193
|
+
this.editingYoutubeUrl = this.youtubeUrl;
|
|
194
|
+
this.editingLinkedInUrl = this.linkedInUrl;
|
|
195
|
+
this.editingCompanyName = this.companyName;
|
|
196
|
+
this.modalService.open(this.socialEditModal, { centered: true, size: 'lg' });
|
|
197
|
+
}
|
|
198
|
+
saveSocialLinks(modal) {
|
|
199
|
+
const updateData = {
|
|
200
|
+
youtube_url: this.editingYoutubeUrl,
|
|
201
|
+
linkedin_url: this.editingLinkedInUrl,
|
|
202
|
+
company_name: this.editingCompanyName,
|
|
203
|
+
subscription_id: this.id
|
|
204
|
+
};
|
|
205
|
+
this.adminService.updateDomainConfig(this.domainId, updateData).subscribe(() => {
|
|
206
|
+
this.youtubeUrl = this.editingYoutubeUrl;
|
|
207
|
+
this.linkedInUrl = this.editingLinkedInUrl;
|
|
208
|
+
this.companyName = this.editingCompanyName;
|
|
209
|
+
this.toast.success('Social links and company name updated');
|
|
210
|
+
modal.close();
|
|
211
|
+
});
|
|
212
|
+
}
|
|
213
|
+
hasValidOptions() {
|
|
214
|
+
return this.questions?.[0]?.options?.some(opt => opt.option?.trim());
|
|
215
|
+
}
|
|
216
|
+
ngAfterViewInit() {
|
|
217
|
+
this.watchIframeHeightChange();
|
|
218
|
+
this.observer = new IntersectionObserver(([entry]) => {
|
|
219
|
+
if (entry.isIntersecting) {
|
|
220
|
+
this.isFooterVisible = true;
|
|
221
|
+
this.cdr.detectChanges();
|
|
222
|
+
this.observer?.disconnect();
|
|
223
|
+
}
|
|
224
|
+
}, { threshold: 0.1 });
|
|
225
|
+
this.observer.observe(this.footerSection.nativeElement);
|
|
226
|
+
}
|
|
227
|
+
openEditFooterLinksModal(content) {
|
|
228
|
+
this.footerLinksData = this.footerLinksData ?? {};
|
|
229
|
+
this.footerLinksData.items = this.footerLinksData.items ?? [];
|
|
230
|
+
this.editingFooterLinks = JSON.parse(JSON.stringify(this.footerLinksData));
|
|
231
|
+
this.modalService.open(content, {
|
|
232
|
+
size: 'lg',
|
|
233
|
+
centered: true,
|
|
234
|
+
windowClass: 'modal-holder'
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
watchIframeHeightChange() {
|
|
238
|
+
const iframe = this.document.querySelector('.hubspot-container');
|
|
239
|
+
if (!iframe)
|
|
240
|
+
return;
|
|
241
|
+
const interval = setInterval(() => {
|
|
242
|
+
const newHeight = iframe['offsetHeight'];
|
|
243
|
+
if (newHeight === 250) {
|
|
244
|
+
clearInterval(interval);
|
|
245
|
+
this.callAbTestFinish();
|
|
246
|
+
}
|
|
247
|
+
}, 300);
|
|
248
|
+
}
|
|
249
|
+
// New method to handle Hubspot content loading
|
|
250
|
+
onHubspotLoad(event) {
|
|
251
|
+
const container = event.target;
|
|
252
|
+
container.classList.add('content-loaded');
|
|
253
|
+
// Optional: Trigger layout recalculation
|
|
254
|
+
setTimeout(() => {
|
|
255
|
+
window.dispatchEvent(new Event('resize'));
|
|
256
|
+
}, 100);
|
|
257
|
+
}
|
|
258
|
+
callAbTestFinish() {
|
|
259
|
+
if (this.experimentName && this.microserviceName) {
|
|
260
|
+
this.abTestService
|
|
261
|
+
.finishABExperiment(this.experimentName, this.microserviceName)
|
|
262
|
+
.subscribe(() => {
|
|
263
|
+
this.modalService.open(this.content, {
|
|
264
|
+
centered: true,
|
|
265
|
+
windowClass: 'modal-holder'
|
|
266
|
+
});
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
contactUsForm() {
|
|
271
|
+
this.form = this.fb.group({
|
|
272
|
+
first_name: ['', Validators.required],
|
|
273
|
+
last_name: [''],
|
|
274
|
+
company: [''],
|
|
275
|
+
psa: [''],
|
|
276
|
+
enquiry: ['', Validators.required],
|
|
277
|
+
email: ['', Validators.required]
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
onSubmit() {
|
|
281
|
+
this.submitted = true;
|
|
282
|
+
if (this.form.valid) {
|
|
283
|
+
this.isCaptchaVerified = true;
|
|
284
|
+
this.submitted = false;
|
|
285
|
+
}
|
|
286
|
+
}
|
|
287
|
+
handleSuccess(token) {
|
|
288
|
+
if (token) {
|
|
289
|
+
this.authService.validateReCaptcha(token).subscribe((isSuccess) => {
|
|
290
|
+
if (isSuccess && this.form.valid) {
|
|
291
|
+
const data = { ...this.form.getRawValue() };
|
|
292
|
+
const formattedEnquiry = `${data.enquiry}; Question: ${this.question}; Answer: ${data.psa}`;
|
|
293
|
+
const postData = {
|
|
294
|
+
first_name: `${data.first_name}`,
|
|
295
|
+
last_name: `${data.first_name}`,
|
|
296
|
+
company: `${data.first_name}`,
|
|
297
|
+
email: `${data.email}`,
|
|
298
|
+
enquiry: this.psaOptions.length ? formattedEnquiry : `${data.enquiry}`,
|
|
299
|
+
psa: data.psa,
|
|
300
|
+
subscription_id: this.subscriptionId,
|
|
301
|
+
crm_source_id: this.sourceId,
|
|
302
|
+
master_subscription_id: this.masterSubscriptionId,
|
|
303
|
+
notify_user: false,
|
|
304
|
+
is_manual: false
|
|
305
|
+
};
|
|
306
|
+
this.crmService.postCrmLead(this.subscriptionId, postData).subscribe(resp => {
|
|
307
|
+
// example of snippet to close the experiment and track in GA
|
|
308
|
+
if (resp?.status === StatusCodes.OK) {
|
|
309
|
+
this.googleAnalyticsService.sendEvent('new-lead-registration', // category, eg: videos
|
|
310
|
+
'subscribe-success', // action, eg: Play
|
|
311
|
+
'coming-soon-three', // label, eg: Chappy
|
|
312
|
+
1 // value, eg: 10
|
|
313
|
+
);
|
|
314
|
+
if (this.experimentName && this.microserviceName) {
|
|
315
|
+
this.abTestService
|
|
316
|
+
.finishABExperiment(this.experimentName, this.microserviceName)
|
|
317
|
+
.subscribe(() => {
|
|
318
|
+
this.modalService.open(this.content, {
|
|
319
|
+
centered: true,
|
|
320
|
+
windowClass: 'modal-holder'
|
|
321
|
+
});
|
|
322
|
+
});
|
|
323
|
+
}
|
|
324
|
+
else {
|
|
325
|
+
Swal.fire(resp.message);
|
|
326
|
+
}
|
|
327
|
+
}
|
|
328
|
+
this.form.reset();
|
|
329
|
+
this.isCaptchaVerified = false;
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
});
|
|
333
|
+
}
|
|
334
|
+
}
|
|
335
|
+
scrollToTop() {
|
|
336
|
+
this.document.documentElement.scrollTop = 0;
|
|
337
|
+
}
|
|
338
|
+
getFooterHubspotForm() {
|
|
339
|
+
if (!this.hubspot?.length) {
|
|
340
|
+
return null;
|
|
341
|
+
}
|
|
342
|
+
return this.hubspot.find(item => item.position === 'footer') ?? null;
|
|
343
|
+
}
|
|
344
|
+
navigateToBookMeeting() {
|
|
345
|
+
window.open('https://calendly.com/cloudolive', '_blank', 'noreferrer noopener');
|
|
346
|
+
}
|
|
347
|
+
validateEmail() {
|
|
348
|
+
const email = this.form.get('email').value;
|
|
349
|
+
if (email) {
|
|
350
|
+
this.isEmailValid = ValidationService.email(email);
|
|
351
|
+
}
|
|
352
|
+
else {
|
|
353
|
+
this.isEmailValid = true;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
addFooterLink() {
|
|
357
|
+
this.editingFooterLinks.items.push({
|
|
358
|
+
title: '',
|
|
359
|
+
path: '',
|
|
360
|
+
subtitles: []
|
|
361
|
+
});
|
|
362
|
+
}
|
|
363
|
+
removeFooterLink(index) {
|
|
364
|
+
this.editingFooterLinks.items.splice(index, 1);
|
|
365
|
+
}
|
|
366
|
+
addSubtitle(footerIndex) {
|
|
367
|
+
this.editingFooterLinks.items[footerIndex].subtitles.push({
|
|
368
|
+
title: '',
|
|
369
|
+
path: ''
|
|
370
|
+
});
|
|
371
|
+
}
|
|
372
|
+
removeSubtitle(footerIndex, subtitleIndex) {
|
|
373
|
+
this.editingFooterLinks.items[footerIndex].subtitles.splice(subtitleIndex, 1);
|
|
374
|
+
}
|
|
375
|
+
dropFooterLinks(event) {
|
|
376
|
+
moveItemInArray(this.editingFooterLinks.items, event.previousIndex, event.currentIndex);
|
|
377
|
+
}
|
|
378
|
+
dropSubtitles(footerIndex, event) {
|
|
379
|
+
moveItemInArray(this.editingFooterLinks.items[footerIndex].subtitles, event.previousIndex, event.currentIndex);
|
|
380
|
+
}
|
|
381
|
+
saveFooterLinks(modal) {
|
|
382
|
+
const updatedConfig = {
|
|
383
|
+
footer_links: this.editingFooterLinks,
|
|
384
|
+
subscription_id: this.id
|
|
385
|
+
};
|
|
386
|
+
this.adminService
|
|
387
|
+
.updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
|
|
388
|
+
.subscribe(() => {
|
|
389
|
+
this.toast.success('Footer links updated');
|
|
390
|
+
this.footerLinks = [...this.editingFooterLinks.items];
|
|
391
|
+
this.footerLinksData = { ...this.editingFooterLinks };
|
|
392
|
+
modal.close();
|
|
393
|
+
});
|
|
394
|
+
}
|
|
395
|
+
saveEmail() {
|
|
396
|
+
this.email = this.editingEmail;
|
|
397
|
+
this.adminService
|
|
398
|
+
.updateDomainConfig(this.appConfig?.domain_id, {
|
|
399
|
+
company_email: this.editingEmail,
|
|
400
|
+
subscription_id: this.id
|
|
401
|
+
})
|
|
402
|
+
.subscribe(() => {
|
|
403
|
+
this.toast.success('Email updated');
|
|
404
|
+
this.isEditingEmail = false;
|
|
405
|
+
});
|
|
406
|
+
}
|
|
407
|
+
saveStreet() {
|
|
408
|
+
this.adminService
|
|
409
|
+
.updateDomainConfig(this.appConfig?.domain_id, {
|
|
410
|
+
company_address: this.editingStreet,
|
|
411
|
+
subscription_id: this.id
|
|
412
|
+
})
|
|
413
|
+
.subscribe(() => {
|
|
414
|
+
this.toast.success('Street updated');
|
|
415
|
+
this.street = this.editingStreet;
|
|
416
|
+
this.isEditingStreet = false;
|
|
417
|
+
});
|
|
418
|
+
}
|
|
419
|
+
cancelStreet() {
|
|
420
|
+
this.editingStreet = this.street;
|
|
421
|
+
this.isEditingStreet = false;
|
|
422
|
+
}
|
|
423
|
+
openHubspotEditModal(footerItem) {
|
|
424
|
+
this.editingHubspotHtml = footerItem.div;
|
|
425
|
+
this.editingHubspotId = footerItem.id;
|
|
426
|
+
this.modalService.open(this.hubspotEditModal, { centered: true, size: 'lg' });
|
|
427
|
+
}
|
|
428
|
+
saveHubspotHtml(modal) {
|
|
429
|
+
const updatedConfig = {
|
|
430
|
+
contact_us: {
|
|
431
|
+
...this.appConfig?.pages_config?.contact_us,
|
|
432
|
+
hubspot: [
|
|
433
|
+
{
|
|
434
|
+
id: '7423639',
|
|
435
|
+
position: 'footer',
|
|
436
|
+
div: this.editingHubspotHtml
|
|
437
|
+
}
|
|
438
|
+
]
|
|
439
|
+
},
|
|
440
|
+
subscription_id: this.id
|
|
441
|
+
};
|
|
442
|
+
this.adminService
|
|
443
|
+
.updateDomainConfig(this.appConfig?.domain_id, updatedConfig)
|
|
444
|
+
.subscribe(() => {
|
|
445
|
+
// NOSONAR: Trusted HTML content is handled safely here
|
|
446
|
+
this.hubspotHtml = this.sanitizer.bypassSecurityTrustHtml(this.editingHubspotHtml); // NOSONAR
|
|
447
|
+
this.toast.success('Hubspot Embed updated');
|
|
448
|
+
modal.close();
|
|
449
|
+
});
|
|
450
|
+
}
|
|
451
|
+
updateCanEditResourcesValue() {
|
|
452
|
+
this.canEditResourcesValue = HelperService.canEditResources(this.user, this.userLoggedIn, this.permissionService);
|
|
453
|
+
}
|
|
454
|
+
canEditResources() {
|
|
455
|
+
return this.canEditResourcesValue;
|
|
456
|
+
}
|
|
457
|
+
ngOnDestroy() {
|
|
458
|
+
this.observer?.disconnect();
|
|
459
|
+
}
|
|
460
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i2.AuthService }, { token: i3.CrmService }, { token: i4.DomSanitizer }, { token: i5.AdminService }, { token: i0.Injector }, { token: i2.AbTestService }, { token: i6.NgbModal }, { token: i0.ChangeDetectorRef }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
461
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.11", type: Trial4ContactUsComponent, selector: "pw-trial-4-contact-us", inputs: { subscriptionId: "subscriptionId", sourceId: "sourceId", masterSubscriptionId: "masterSubscriptionId", experimentName: "experimentName", microserviceName: "microserviceName", shardName: "shardName", user: "user", userLoggedIn: "userLoggedIn" }, viewQueries: [{ propertyName: "footerSection", first: true, predicate: ["footerSection"], descendants: true, static: true }, { propertyName: "content", first: true, predicate: ["bookMeeting"], descendants: true, static: true }, { propertyName: "editFooterLinksModal", first: true, predicate: ["editFooterLinksModal"], descendants: true }, { propertyName: "logoModal", first: true, predicate: ["logoModal"], descendants: true }, { propertyName: "logoUploader", first: true, predicate: ["logoUploader"], descendants: true }, { propertyName: "hubspotEditModal", first: true, predicate: ["hubspotEditModal"], descendants: true }, { propertyName: "socialEditModal", first: true, predicate: ["socialEditModal"], descendants: true }, { propertyName: "questionsEditModal", first: true, predicate: ["questionsEditModal"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now & schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"], dependencies: [{ kind: "directive", type: i7.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i7.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i7.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i8.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "directive", type: i9.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i9.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i9.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "directive", type: i6.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.EventTrackerDirective, selector: "[eventTracker]", inputs: ["eventTracker"] }, { kind: "directive", type: i10.LazyImgDirective, selector: "img" }, { kind: "component", type: i11.ReCaptcha2Component, selector: "ngx-recaptcha2", inputs: ["theme", "size"] }, { kind: "component", type: i12.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", "disabled", "itemSize", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "filterValue", "options"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i13.CustomUploaderComponent, selector: "pw-custom-uploader", inputs: ["controlName", "previewData", "aspectRatio", "title"], outputs: ["saveEvent"] }, { kind: "component", type: i13.FieldErrorDisplayComponent, selector: "pw-field-error-display", inputs: ["errorMsg", "displayError"] }, { kind: "pipe", type: i14.TranslocoPipe, name: "transloco" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
|
|
462
|
+
}
|
|
463
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.11", ngImport: i0, type: Trial4ContactUsComponent, decorators: [{
|
|
464
|
+
type: Component,
|
|
465
|
+
args: [{ selector: 'pw-trial-4-contact-us', changeDetection: ChangeDetectionStrategy.OnPush, template: "<section #footerSection class=\"bg-black text-white py-5 footer-section\">\n <div class=\"container\" *ngIf=\"isFooterVisible\">\n <div class=\"row\">\n\n <!-- LEFT COLUMN -->\n <div class=\"col-md-6 mb-4 d-flex flex-column justify-content-between\" [ngClass]=\"{ 'site-column': getFooterHubspotForm() }\">\n <div>\n <h3 class=\"mb-4 d-flex align-items-center\">\n <span class=\"me-2 text-white\">Site Map:</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon cursor-pointer text-white ms-3\" (click)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.enter)=\"openEditFooterLinksModal(editFooterLinksModal)\" (keydown.space)=\"openEditFooterLinksModal(editFooterLinksModal)\" ngbTooltip=\"Edit Footer Links\"></i>\n </h3>\n <ul class=\"mt-4\">\n <li routerLink=\"/\"\n class=\"cursor-pointer user-info-label link-label\"> Home </li>\n <li *ngFor=\"let link of footerLinks\" [routerLink]=\"link?.path\"\n class=\"cursor-pointer user-info-label link-label mt-4\"><span *ngIf=\"link?.title\">{{link?.title}}</span> </li>\n <li routerLink=\"/login\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Log in </li>\n <li [routerLink]=\"'/privacy-and-tos/' + tosId\"\n class=\"cursor-pointer user-info-label mt-4 link-label\"> Privacy statement </li>\n </ul>\n <p class=\"address-section email-section mb-4\">\n <span class=\"user-info-label\">Email: </span>\n <ng-container *ngIf=\"!isEditingEmail; else editEmail\">\n <span class=\"user-info\">{{ email }}</span>\n <i *ngIf=\"canEditResourcesValue\" class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\" (click)=\"isEditingEmail = true\" (keydown.enter)=\"isEditingEmail = true\" (keydown.space)=\"isEditingEmail = true\"></i>\n </ng-container>\n\n <ng-template #editEmail>\n <input\n class=\"form-control d-inline w-auto\"\n [(ngModel)]=\"editingEmail\"\n />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveEmail()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"isEditingEmail = false\">Cancel</button>\n </ng-template>\n </p>\n <span class=\"email-section mt-3 address-text\">\n <span class=\"user-info-label\">\n Address:\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon cursor-pointer ms-2 text-white\"\n title=\"Edit Address\"\n (click)=\"isEditingStreet = true\"\n (keydown.enter)=\"isEditingStreet = true\"\n (keydown.space)=\"isEditingStreet = true\"></i>\n </span><br/>\n\n <ng-container *ngIf=\"!isEditingStreet; else editStreetBlock\">\n <span class=\"address-text user-info\">{{ street }}</span>\n </ng-container>\n\n <ng-template #editStreetBlock>\n <div class=\"d-flex align-items-center mt-3\">\n <input class=\"form-control form-control-sm\" [(ngModel)]=\"editingStreet\" />\n <button class=\"btn btn-sm btn-primary ms-2\" (click)=\"saveStreet()\">Save</button>\n <button class=\"btn btn-sm btn-secondary ms-2\" (click)=\"cancelStreet()\">Cancel</button>\n </div>\n </ng-template>\n\n </span>\n\n </div>\n <div class=\"d-flex\">\n <img [src]=\"logo\"\n alt=\"Company logo\"\n class=\"img-fluid mt-4 logo-image cursor-pointer\"\n width=\"160\"\n height=\"35\"\n (click)=\"scrollToTop()\"\n (keydown.enter)=\"scrollToTop()\"\n (keydown.space)=\"scrollToTop()\"\n title=\"Click to go to top of page\" />\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon fa-sm ms-3 cursor-pointer text-white align-self-center mt-3\"\n (click)=\"openLogoEditModal()\"\n (keydown.enter)=\"openLogoEditModal()\"\n (keydown.space)=\"openLogoEditModal()\"\n title=\"Edit Logo\"></i>\n </div>\n </div>\n\n <!-- RIGHT COLUMN -->\n <div class=\"col-md-6\" *ngIf=\"isFooterVisible\">\n <ng-container *ngIf=\"getFooterHubspotForm() as footerItem; else defaultForm\">\n <div class=\"d-flex\">\n <div\n *ngIf=\"isHubspotReady\"\n class=\"hubspot-container w-100 content-loaded\"\n [innerHTML]=\"hubspotHtml\"\n (load)=\"onHubspotLoad($event)\">\n </div>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer\"\n (click)=\"openHubspotEditModal(footerItem)\"\n (keydown.enter)=\"openHubspotEditModal(footerItem)\"\n (keydown.space)=\"openHubspotEditModal(footerItem)\"\n title=\"Edit Hubspot Embed\"></i>\n </div>\n </ng-container>\n\n <ng-template #defaultForm>\n <div class=\"d-flex\">\n <h3 class=\"text-white mb-4\"> <span class=\"text-white\">Get in touch:</span></h3>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3 mt-2\"\n (click)=\"openQuestionsEditModal()\"\n (keydown.enter)=\"openQuestionsEditModal()\"\n (keydown.space)=\"openQuestionsEditModal()\"\n title=\"Edit Questions\"></i>\n </div>\n <div class=\"contact-form\">\n <form [formGroup]=\"form\">\n <div class=\"mb-3\">\n <div class=\"email\">\n <div class=\"form-field\">\n <label for=\"email\">Email:</label>\n <div class=\"w-100\">\n <input type=\"text\"\n class=\"mb-1\"\n id=\"email\"\n formControlName=\"email\" />\n <pw-field-error-display [displayError]=\"\n !form.get('email').valid && (form.get('email').touched || submitted)\n \"\n errorMsg=\"Email is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"first_name\">First name:</label>\n <div class=\"w-100\">\n <input input type=\"text\"\n id=\"first_name\"\n formControlName=\"first_name\" />\n <pw-field-error-display [displayError]=\"\n !form.get('first_name').valid && (form.get('first_name').touched || submitted)\n \"\n errorMsg=\"First name is required\">\n </pw-field-error-display>\n </div>\n </div>\n <div class=\"form-field\">\n <label for=\"last_name\">Last name:</label>\n <input type=\"text\"\n id=\"last_name\"\n formControlName=\"last_name\" />\n </div>\n <div class=\"form-field\">\n <label for=\"company\">Company:</label>\n <input type=\"text\"\n id=\"company\"\n formControlName=\"company\" />\n </div>\n <div class=\"form-field\" *ngIf=\"hasValidOptions()\">\n <label for=\"psa\" class=\"select-label\">{{question}}</label>\n <p-dropdown\n formControlName=\"psa\"\n [options]=\"psaOptions\"\n [placeholder]=\"'Select PSA'\"\n styleClass=\"input-select\">\n </p-dropdown>\n </div>\n <div class=\"form-field\">\n <label for=\"enquiry\" class=\"select-label\">How can we help you?</label>\n <div class=\"enquiry-field\">\n <textarea id=\"enquiry\" formControlName=\"enquiry\" class=\"\">\n </textarea>\n <pw-field-error-display [displayError]=\"\n !form.get('enquiry').valid && (form.get('enquiry').touched || submitted)\n \"\n errorMsg=\"Enquiry is required\">\n </pw-field-error-display>\n </div>\n </div>\n </div>\n </div>\n <div class=\"text-end\">\n <div class=\"captcha-wrapper-container\"\n *ngIf=\"isCaptchaVerified\">\n <ngx-recaptcha2 [ngModelOptions]=\"{ standalone: true }\"\n [siteKey]=\"captchaKeyV2\"\n size=\"normal\"\n [(ngModel)]=\"recaptcha\"\n (success)=\"handleSuccess($event)\">\n </ngx-recaptcha2>\n </div>\n <button type=\"submit\"\n (click)=\"onSubmit()\"\n *ngIf=\"!isCaptchaVerified\"\n class=\"sign-btn sign-header-btn mt-3\">\n {{ 'Button.Submit' | transloco }}\n </button>\n </div>\n\n <div class=\"d-flex align-items-center mt-4\">\n <div class=\"icons d-flex align-items-center\">\n <a [eventTracker]=\"{\n category: 'youtube',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"youtubeUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\">\n <img src=\"/assets/img/icons/youtube.png\"\n class=\"img-fluid youtube-icon\"\n width=\"54\"\n height=\"54\"\n alt=\"\" />\n </a>\n <a [eventTracker]=\"{\n category: 'linkedin',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n [href]=\"linkedInUrl\"\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n class=\"ms-3\">\n <img src=\"/assets/img/icons/social/linkedin.svg\"\n class=\"img-fluid linkedin-icon\"\n width=\"48\"\n height=\"48\"\n alt=\"\" />\n </a>\n <i *ngIf=\"canEditResourcesValue\"\n class=\"fa fa-edit in-page-edit-icon text-white cursor-pointer ms-3\"\n (click)=\"openSocialEditModal()\"\n (keydown.enter)=\"openSocialEditModal()\"\n (keydown.space)=\"openSocialEditModal()\"\n title=\"Edit Social Links & Company Name\"></i>\n </div>\n <div class=\"copyright text-white\">\n 2025 {{companyName}}.\n </div>\n </div>\n </form>\n </div>\n </ng-template>\n </div>\n </div>\n </div>\n</section>\n\n\n\n<ng-template #bookMeeting\n let-modal>\n <div class=\"modal-header\">\n <button type=\"button\"\n class=\"btn-close float-end\"\n aria-label=\"Close\"\n (click)=\"modal.dismiss()\">\n </button>\n </div>\n <div class=\"modal-body\">\n <h3 class=\"text-center modal-basic-title\">\n Thanks for getting in touch! Our team will be in contact shortly, or we\n can compare calendars now & schedule a time\n </h3>\n <button type=\"button\"\n [eventTracker]=\"{\n category: 'request-demo',\n action: 'click',\n label: 'cloudolive-landing-page-b',\n value: 1\n }\"\n (click)=\"navigateToBookMeeting()\"\n class=\"sign-btn sign-header-btn mx-auto d-block mb-3\">\n Let's do it\n </button>\n </div>\n</ng-template>\n\n\n<ng-template #editFooterLinksModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Footer Links</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Footer Links Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropFooterLinks($event)\">\n <div *ngFor=\"let footer of editingFooterLinks.items; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerTitle{{i}}\" class=\"form-label\">Title</label>\n <input id=\"footerTitle{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.title\" />\n </div>\n <div class=\"col-md-5 mb-2\">\n <label for=\"footerPath{{i}}\" class=\"form-label\">Path</label>\n <input id=\"footerPath{{i}}\" class=\"form-control\" [(ngModel)]=\"footer.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeFooterLink(i)\" (keydown.enter)=\"removeFooterLink(i)\" (keydown.space)=\"removeFooterLink(i)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Subtitles -->\n <div cdkDropList (cdkDropListDropped)=\"dropSubtitles(i, $event)\">\n <div *ngFor=\"let sub of footer.subtitles; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-5\">\n <label for=\"subtitleTitle{{i}}{{j}}\" class=\"form-label\">Subtitle Title</label>\n <input id=\"subtitleTitle{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.title\" />\n </div>\n <div class=\"col-md-5\">\n <label for=\"subtitlePath{{i}}{{j}}\" class=\"form-label\">Subtitle Path</label>\n <input id=\"subtitlePath{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"sub.path\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeSubtitle(i, j)\" (keydown.enter)=\"removeSubtitle(i, j)\" (keydown.space)=\"removeSubtitle(i, j)\"></i>\n <i class=\"fa fa-bars cursor-move in-page-bars-icon\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addSubtitle(i)\">\n + Add Subtitle\n </button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addFooterLink()\">\n + Add Footer Link\n </button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveFooterLinks(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n\n\n<ng-template #logoModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Upload Logo</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <pw-custom-uploader\n [aspectRatio]=\"'fullLogo'\"\n [title]=\"'Main Contrast Logo'\"\n [controlName]=\"'logo_main_contrast'\"\n [previewData]=\"previewData\"\n (saveEvent)=\"onSaveFile($event)\">\n </pw-custom-uploader>\n </div>\n</ng-template>\n\n\n\n<ng-template #hubspotEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Hubspot Embed</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"hubspotId\" class=\"form-label\">Hubspot ID</label>\n <input id=\"hubspotId\" [(ngModel)]=\"editingHubspotId\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"hubspotEmbedDiv\" class=\"form-label\">Embed DIV</label>\n <textarea id=\"hubspotEmbedDiv\" [(ngModel)]=\"editingHubspotHtml\" rows=\"8\" class=\"form-control\"></textarea>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveHubspotHtml(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n<ng-template #socialEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Social Links & Company Name</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n <div class=\"modal-body\">\n <div class=\"mb-3\">\n <label for=\"youtubeUrl\" class=\"form-label\">YouTube URL</label>\n <input id=\"youtubeUrl\" [(ngModel)]=\"editingYoutubeUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"linkedinUrl\" class=\"form-label\">LinkedIn URL</label>\n <input id=\"linkedinUrl\" [(ngModel)]=\"editingLinkedInUrl\" class=\"form-control\" />\n </div>\n <div class=\"mb-3\">\n <label for=\"companyName\" class=\"form-label\">Company Name</label>\n <input id=\"companyName\" [(ngModel)]=\"editingCompanyName\" class=\"form-control\" />\n </div>\n </div>\n <div class=\"modal-footer\">\n <button class=\"btn btn-primary\" (click)=\"saveSocialLinks(modal)\">Save</button>\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n </div>\n</ng-template>\n\n\n\n<ng-template #questionsEditModal let-modal>\n <div class=\"modal-header\">\n <h5 class=\"modal-title\">Edit Questions</h5>\n <button type=\"button\" class=\"btn-close\" aria-label=\"Close\" (click)=\"modal.dismiss()\"></button>\n </div>\n\n <div class=\"modal-body\">\n <h4 class=\"mb-3\">Questions Section</h4>\n <div cdkDropList (cdkDropListDropped)=\"dropQuestions($event)\">\n <div *ngFor=\"let q of editingQuestions; let i = index\" class=\"border p-3 mb-3\" cdkDrag>\n <div class=\"row\">\n <div class=\"col-md-11 mb-2\">\n <label for=\"questionText{{i}}\" class=\"form-label\">Question</label>\n <input id=\"questionText{{i}}\" class=\"form-control\" [(ngModel)]=\"q.question\" placeholder=\"Enter question\" />\n </div>\n <div class=\"col-md-1 d-flex justify-content-end align-items-start mt-4\">\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n\n <!-- Options Section -->\n <div cdkDropList (cdkDropListDropped)=\"dropQuestionOptions(i, $event)\">\n <div *ngFor=\"let opt of q.options; let j = index\" class=\"row border p-3 mb-2 align-items-center\" cdkDrag>\n <div class=\"col-md-7 mb-2\">\n <label for=\"questionOption{{i}}{{j}}\" class=\"form-label\">Option</label>\n <input id=\"questionOption{{i}}{{j}}\" class=\"form-control\" [(ngModel)]=\"opt.option\" placeholder=\"Enter option\" />\n </div>\n <div class=\"col-md-2 d-flex justify-content-between align-items-center mt-4\">\n <i class=\"fa fa-trash in-page-trash-icon text-danger cursor-pointer\" (click)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\" (keydown.enter)=\"removeQuestionOption(i, j)\"></i>\n <i class=\"fa fa-bars in-page-bars-icon cursor-move\" cdkDragHandle></i>\n </div>\n </div>\n </div>\n\n <button class=\"btn btn-outline-primary btn-sm mt-2\" (click)=\"addQuestionOption(i)\">+ Add Option</button>\n </div>\n </div>\n\n <button class=\"btn btn-primary mt-3\" (click)=\"addNewQuestion()\">+ Add Question</button>\n </div>\n\n <div class=\"modal-footer\">\n <button class=\"btn btn-secondary\" (click)=\"modal.dismiss()\">Cancel</button>\n <button class=\"btn btn-primary\" (click)=\"saveQuestions(modal)\">Save</button>\n </div>\n</ng-template>\n\n\n\n", styles: [".product-explainer-section{background-color:#000}.footer-section input.form-control,.footer-section select.form-control,.footer-section textarea.form-control{background-color:#fff;border:none;color:#000;font-size:14px}.btn-primary{background-color:#007bff;border:none}.site-column{margin-top:2.9rem}.email-section{color:#fff;font-size:2rem}.address-section{margin-top:5rem}.address-text{line-height:2.2rem}.user-info{font-size:1.5rem}.user-info-label{font-size:1.7rem;font-weight:700}.contact-form form .form-field{display:flex;align-items:center;margin-bottom:1.2rem}.contact-form form .form-field label{width:130px;min-width:130px;margin:0;font-size:14px;color:#fff;font-weight:600;text-transform:uppercase;letter-spacing:1px}.contact-form form .form-field p-dropdown{width:100%}.contact-form form .form-field input,.contact-form form .form-field select,.contact-form form .form-field textarea,.contact-form form .form-field ::ng-deep p-dropdown .p-inputwrapper{flex:1;border:none;border-radius:30px;padding:12px 20px;font-size:14px;width:100%!important;max-width:100%;color:#000}.contact-form form .form-field textarea{resize:vertical}.contact-form form .submit-button{background-color:#3b82f6;border:none;border-radius:30px;font-size:16px;font-weight:500;padding:10px 24px;margin-top:1.2rem}.input-select{height:43px}.select-label{width:210px!important}.copyright{margin-top:2rem;margin-left:4rem;font-size:19px;font-weight:700}.d-flex img{margin-right:0!important}.youtube-icon{height:38px}.enquiry-field{margin-left:.5rem;width:63%}::ng-deep .text-danger{margin-top:.25rem!important;margin-left:.5rem!important}@media (min-width: 768px){.hubspot-container{margin-top:-3rem}}@media (min-width: 768px) and (max-width: 1200px){.container{padding:0rem 6rem!important}}.link-label{cursor:pointer;transition:color .3s}.link-label:hover{color:var(--first)}.icons img{transition:transform .3s ease,filter .3s ease;cursor:pointer}.icons img:hover{transform:scale(1.1);filter:brightness(1.2)}.logo-image{max-width:160px;width:160px;height:35px;object-fit:contain;aspect-ratio:160/35}\n"] }]
|
|
466
|
+
}], ctorParameters: () => [{ type: i1.UntypedFormBuilder }, { type: i2.AuthService }, { type: i3.CrmService }, { type: i4.DomSanitizer }, { type: i5.AdminService }, { type: i0.Injector }, { type: i2.AbTestService }, { type: i6.NgbModal }, { type: i0.ChangeDetectorRef }, { type: Document, decorators: [{
|
|
467
|
+
type: Inject,
|
|
468
|
+
args: [DOCUMENT]
|
|
469
|
+
}] }], propDecorators: { footerSection: [{
|
|
470
|
+
type: ViewChild,
|
|
471
|
+
args: ['footerSection', { static: true }]
|
|
472
|
+
}], content: [{
|
|
473
|
+
type: ViewChild,
|
|
474
|
+
args: ['bookMeeting', { static: true }]
|
|
475
|
+
}], editFooterLinksModal: [{
|
|
476
|
+
type: ViewChild,
|
|
477
|
+
args: ['editFooterLinksModal']
|
|
478
|
+
}], logoModal: [{
|
|
479
|
+
type: ViewChild,
|
|
480
|
+
args: ['logoModal']
|
|
481
|
+
}], logoUploader: [{
|
|
482
|
+
type: ViewChild,
|
|
483
|
+
args: ['logoUploader']
|
|
484
|
+
}], hubspotEditModal: [{
|
|
485
|
+
type: ViewChild,
|
|
486
|
+
args: ['hubspotEditModal']
|
|
487
|
+
}], socialEditModal: [{
|
|
488
|
+
type: ViewChild,
|
|
489
|
+
args: ['socialEditModal']
|
|
490
|
+
}], questionsEditModal: [{
|
|
491
|
+
type: ViewChild,
|
|
492
|
+
args: ['questionsEditModal']
|
|
493
|
+
}], subscriptionId: [{
|
|
494
|
+
type: Input
|
|
495
|
+
}], sourceId: [{
|
|
496
|
+
type: Input
|
|
497
|
+
}], masterSubscriptionId: [{
|
|
498
|
+
type: Input
|
|
499
|
+
}], experimentName: [{
|
|
500
|
+
type: Input
|
|
501
|
+
}], microserviceName: [{
|
|
502
|
+
type: Input
|
|
503
|
+
}], shardName: [{
|
|
504
|
+
type: Input
|
|
505
|
+
}], user: [{
|
|
506
|
+
type: Input
|
|
507
|
+
}], userLoggedIn: [{
|
|
508
|
+
type: Input
|
|
509
|
+
}] } });
|
|
510
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Jlc291cmNlLW1vZHVsZS9zcmMvbGliL3B1YmxpYy9jb21wb25lbnRzL3Jlc291cmNlLWNvbnRhY3QtdXMvcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL3Jlc291cmNlLW1vZHVsZS9zcmMvbGliL3B1YmxpYy9jb21wb25lbnRzL3Jlc291cmNlLWNvbnRhY3QtdXMvcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDekQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFFSCx1QkFBdUIsRUFDdkIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFDUixLQUFLLEVBS0wsV0FBVyxFQUNYLFNBQVMsRUFDWixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsa0JBQWtCLEVBQW9CLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2xGLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUV6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDaEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUUxRixPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDekQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0s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cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbW92ZUl0ZW1JbkFycmF5IH0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBET0NVTUVOVCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQge1xuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEVsZW1lbnRSZWYsXG4gICAgSW5qZWN0LFxuICAgIEluamVjdG9yLFxuICAgIElucHV0LFxuICAgIE9uQ2hhbmdlcyxcbiAgICBPbkRlc3Ryb3ksXG4gICAgT25Jbml0LFxuICAgIFNpbXBsZUNoYW5nZXMsXG4gICAgVGVtcGxhdGVSZWYsXG4gICAgVmlld0NoaWxkXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgVW50eXBlZEZvcm1CdWlsZGVyLCBVbnR5cGVkRm9ybUdyb3VwLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRG9tU2FuaXRpemVyIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5cbmltcG9ydCB7IEFkbWluU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9hZG1pbi1tb2R1bGUtdXRpbHMnO1xuaW1wb3J0IHsgQXBwQmFzZUNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9hcHAtYmFzZS1jb21wb25lbnQnO1xuaW1wb3J0IHsgQWJUZXN0U2VydmljZSwgQXV0aFNlcnZpY2UsIFZhbGlkYXRpb25TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi1zZXJ2aWNlcyc7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnQHBvc2l3aXNlL2NvbW1vbi11dGlsaXRpZXMnO1xuaW1wb3J0IHsgSGVscGVyU2VydmljZSB9IGZyb20gJ0Bwb3Npd2lzZS9oZWxwZXItc2VydmljZSc7XG5pbXBvcnQgeyBDdXN0b21VcGxvYWRlckNvbXBvbmVudCB9IGZyb20gJ0Bwb3Npd2lzZS9zaGFyZWQtY29tcG9uZW50cyc7XG5pbXBvcnQgeyBDcm1TZXJ2aWNlIH0gZnJvbSAnQHBvc2l3aXNlL3NtYXJ0LWNybS1zaGFyZWQnO1xuXG5pbXBvcnQgeyBTdGF0dXNDb2RlcyB9IGZyb20gJ2h0dHAtc3RhdHVzLWNvZGVzJztcbmltcG9ydCBTd2FsIGZyb20gJ3N3ZWV0YWxlcnQyJztcblxuaW1wb3J0IHsgTmdiTW9kYWwgfSBmcm9tICdAbmctYm9vdHN0cmFwL25nLWJvb3RzdHJhcCc7XG5cbmltcG9ydCB7IFJlc291cmNlTW9kYWxDb250ZXh0IH0gZnJvbSAnLi4vLi4vLi4vc2hhcmVkL3Jlc291cmNlLW1vZGFsLmludGVyZmFjZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAncHctdHJpYWwtNC1jb250YWN0LXVzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vcmVzb3VyY2UtY29udGFjdC11cy5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIFRyaWFsNENvbnRhY3RVc0NvbXBvbmVudFxuICAgIGV4dGVuZHMgQXBwQmFzZUNvbXBvbmVudFxuICAgIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveVxue1xuICAgIEBWaWV3Q2hpbGQoJ2Zvb3RlclNlY3Rpb24nLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb290ZXJTZWN0aW9uITogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkKCdib29rTWVldGluZycsIHsgc3RhdGljOiB0cnVlIH0pIGNvbnRlbnQ6IFRlbXBsYXRlUmVmPFJlc291cmNlTW9kYWxDb250ZXh0PjtcbiAgICBAVmlld0NoaWxkKCdlZGl0Rm9vdGVyTGlua3NNb2RhbCcpIGVkaXRGb290ZXJMaW5rc01vZGFsOiBUZW1wbGF0ZVJlZjxDdXN0b21VcGxvYWRlckNvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb01vZGFsJykgbG9nb01vZGFsOiBUZW1wbGF0ZVJlZjxDdXN0b21VcGxvYWRlckNvbXBvbmVudD47XG4gICAgQFZpZXdDaGlsZCgnbG9nb1VwbG9hZGVyJykgbG9nb1VwbG9hZGVyOiBDdXN0b21VcGxvYWRlckNvbXBvbmVudDtcbiAgICBAVmlld0NoaWxkKCdodWJzcG90RWRpdE1vZGFsJykgaHVic3BvdEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8UmVzb3VyY2VNb2RhbENvbnRleHQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3NvY2lhbEVkaXRNb2RhbCcpIHNvY2lhbEVkaXRNb2RhbDogVGVtcGxhdGVSZWY8Q3VzdG9tVXBsb2FkZXJDb21wb25lbnQ+O1xuICAgIEBWaWV3Q2hpbGQoJ3F1ZXN0aW9uc0VkaXRNb2RhbCcpIHF1ZXN0aW9uc0VkaXRNb2RhbDogVGVtcGxhdGVSZWY8Q3VzdG9tVXBsb2FkZXJDb21wb25lbnQ+O1xuXG4gICAgZWRpdGluZ1F1ZXN0aW9ucyA9IFtdO1xuICAgIGlzSHVic3BvdFJlYWR5OiBib29sZWFuO1xuXG4gICAgaXNGb290ZXJWaXNpYmxlID0gZmFsc2U7XG4gICAgcHJpdmF0ZSBvYnNlcnZlcj86IEludGVyc2VjdGlvbk9ic2VydmVyO1xuXG4gICAgb3BlblF1ZXN0aW9uc0VkaXRNb2RhbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nUXVlc3Rpb25zID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh0aGlzLmVkaXRpbmdRdWVzdGlvbnMgPz8gW10pKTtcbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbih0aGlzLnF1ZXN0aW9uc0VkaXRNb2RhbCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJyB9KTtcbiAgICB9XG5cbiAgICBlZGl0aW5nWW91dHViZVVybDogc3RyaW5nO1xuICAgIGVkaXRpbmdMaW5rZWRJblVybDogc3RyaW5nO1xuICAgIGVkaXRpbmdDb21wYW55TmFtZTogc3RyaW5nO1xuXG4gICAgZm9ybTogVW50eXBlZEZvcm1Hcm91cDtcblxuICAgIHJlY2FwdGNoYSA9IG51bGw7XG5cbiAgICBwcmV2aWV3RGF0YTtcblxuICAgIEBJbnB1dCgpIHN1YnNjcmlwdGlvbklkID0gdGhpcy5hcHBDb25maWcuY3JtLnN1YnNjcmlwdGlvbl9pZDtcbiAgICBASW5wdXQoKSBzb3VyY2VJZCA9IHRoaXMuYXBwQ29uZmlnLmNybS5zb3VyY2VfaWQ7XG4gICAgQElucHV0KCkgbWFzdGVyU3Vic2NyaXB0aW9uSWQgPSB0aGlzLmFwcENvbmZpZy5tYXN0ZXJfc3Vic2NyaXB0aW9uLnN1YnNjcmlwdGlvbl9pZDtcbiAgICBASW5wdXQoKSBleHBlcmltZW50TmFtZTtcbiAgICBASW5wdXQoKSBtaWNyb3NlcnZpY2VOYW1lO1xuICAgIEBJbnB1dCgpIHNoYXJkTmFtZTtcbiAgICBASW5wdXQoKSB1c2VyOiBVc2VyO1xuXG4gICAgY2FuRWRpdFJlc291cmNlc1ZhbHVlID0gZmFsc2U7XG4gICAgQElucHV0KCkgdXNlckxvZ2dlZEluOiBib29sZWFuO1xuXG4gICAgaWQ7XG5cbiAgICBsb2dvID0gdGhpcy5hcHBDb25maWc/LmNvbXBhbnk/LmxvZ29zPy5tYWluX2NvbnRyYXN0Py51cmw7XG4gICAgdHJpYWxCZ0ltYWdlMiA9IHRoaXMuYXBwQ29uZmlnPy5zaWdudXBfY29uZmlnLnRyaWFsPy5pbWFnZV9iZzI/LnVybDtcbiAgICB0b3NJZCA9IHRoaXMuYXBwQ29uZmlnPy5tYWluX3Rvc19pZDtcbiAgICBkZXNjcmlwdGlvbiA9IHRoaXMuYXBwQ29uZmlnLmNvbXBhbnkuZGVzY3JpcHRpb247XG4gICAgZW1haWwgPSB0aGlzLmFwcENvbmZpZy5jb21wYW55LmVtYWlsO1xuICAgIGNvbXBhbnlOYW1lID0gdGhpcy5hcHBDb25maWcuY29tcGFueS5uYW1lO1xuICAgIHN0cmVldCA9IHRoaXMuYXBwQ29uZmlnLmNvbXBhbnkuc3RyZWV0O1xuICAgIHF1ZXN0aW9ucyA9IHRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmNvbnRhY3RfdXM/LnF1ZXN0aW9ucztcbiAgICBodWJzcG90ID0gdGhpcy5hcHBDb25maWc/LnBhZ2VzX2NvbmZpZz8uY29udGFjdF91cz8uaHVic3BvdDtcbiAgICBmb290ZXJMaW5rcyA9IHRoaXMuYXBwQ29uZmlnPy5wYWdlc19jb25maWc/LmZvb3Rlcl9saW5rcz8uaXRlbXM7XG5cbiAgICBmb290ZXJMaW5rc0RhdGEgPSB0aGlzLmFwcENvbmZpZz8ucGFnZXNfY29uZmlnPy5mb290ZXJfbGlua3M7XG5cbiAgICB5b3V0dWJlVXJsID0gdGhpcy5hcHBDb25maWcuc29jaWFsPy55b3V0dWJlX3VybDtcbiAgICBsaW5rZWRJblVybCA9IHRoaXMuYXBwQ29uZmlnLnNvY2lhbD8ubGlua2VkaW5fdXJsO1xuICAgIGRvbWFpbklkID0gdGhpcy5hcHBDb25maWcuZG9tYWluX2lkO1xuXG4gICAgZWRpdGluZ0VtYWlsID0gdGhpcy5lbWFpbDtcbiAgICBpc0VkaXRpbmdFbWFpbCA9IGZhbHNlO1xuXG4gICAgZWRpdGluZ0h1YnNwb3RIdG1sOiBzdHJpbmc7XG4gICAgZWRpdGluZ0h1YnNwb3RJZDogc3RyaW5nO1xuICAgIGNhcHRjaGFLZXlWMjogc3RyaW5nO1xuICAgIGh1YnNwb3RIdG1sO1xuXG4gICAgYWJUZXN0cztcblxuICAgIHN1Ym1pdHRlZCA9IGZhbHNlO1xuICAgIGlzQ2FwdGNoYVZlcmlmaWVkID0gZmFsc2U7XG4gICAgaXNFbWFpbFZhbGlkID0gdHJ1ZTtcbiAgICBpc0VkaXRpbmdTdHJlZXQgPSBmYWxzZTtcblxuICAgIHBzYU9wdGlvbnM7XG5cbiAgICBxdWVzdGlvbjtcblxuICAgIGVkaXRpbmdGb290ZXJMaW5rcyA9IHtcbiAgICAgICAgaXRlbXM6IFtdXG4gICAgfTtcbiAgICBlZGl0aW5nU3RyZWV0OiBzdHJpbmc7XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBmYjogVW50eXBlZEZvcm1CdWlsZGVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGF1dGhTZXJ2aWNlOiBBdXRoU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBjcm1TZXJ2aWNlOiBDcm1TZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHNhbml0aXplcjogRG9tU2FuaXRpemVyLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGFkbWluU2VydmljZTogQWRtaW5TZXJ2aWNlLFxuICAgICAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYWJUZXN0U2VydmljZTogQWJUZXN0U2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBtb2RhbFNlcnZpY2U6IE5nYk1vZGFsLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGNkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgcmVhZG9ubHkgZG9jdW1lbnQ6IERvY3VtZW50XG4gICAgKSB7XG4gICAgICAgIHN1cGVyKGluamVjdG9yKTtcbiAgICAgICAgdGhpcy5jYXB0Y2hhS2V5VjIgPSB0aGlzLmFwcENvbmZpZy5pbnRlZ3JhdGlvbnMuY2FwdGNoYV9rZXlfVjI7XG4gICAgICAgIHRoaXMuY29udGFjdFVzRm9ybSgpO1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+ICh0aGlzLmlzSHVic3BvdFJlYWR5ID0gdHJ1ZSksIDIwMDApO1xuICAgICAgICBpZiAodGhpcy51c2VyTG9nZ2VkSW4pIHtcbiAgICAgICAgICAgIHRoaXMubG9jYWxTdG9yYWdlLmdldEl0ZW0kKCdwcm9kdWN0Jykuc3Vic2NyaWJlKHJlcyA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlcyA/IEpTT04ucGFyc2UocmVzKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IGRhdGE/LnN1YnNjcmlwdGlvbklkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmV2aWV3RGF0YSA9IHtcbiAgICAgICAgICAgIHVybDogdGhpcy5sb2dvLFxuICAgICAgICAgICAgbmFtZTogJ2xvZ29fbWFpbl9jb250cmFzdC5wbmcnXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuZWRpdGluZ1N0cmVldCA9IHRoaXMuc3RyZWV0O1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmFwcENvbmZpZy5wYWdlc19jb25maWc/LmFiX3Rlc3RzKSkge1xuICAgICAgICAgICAgdGhpcy5hYlRlc3RzID0gdGhpcy5hcHBDb25maWcucGFnZXNfY29uZmlnLmFiX3Rlc3RzLmZpbmQoXG4gICAgICAgICAgICAgICAgdGVzdCA9PiB0ZXN0LmRlc2NyaXB0aW9uID09PSAnY29udGFjdC11cydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLm1pY3Jvc2VydmljZU5hbWUgPSB0aGlzLmFiVGVzdHM/Lm1pY3Jvc2VydmljZV9uYW1lO1xuICAgICAgICAgICAgdGhpcy5leHBlcmltZW50TmFtZSA9IHRoaXMuYWJUZXN0cz8uZXhwZXJpbWVudF9uYW1lO1xuICAgICAgICAgICAgdGhpcy5zaGFyZE5hbWUgPSB0aGlzLmFiVGVzdHM/LmRiX3NoYXJkO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZm9vdGVySXRlbSA9IHRoaXMuZ2V0Rm9vdGVySHVic3BvdEZvcm0oKTtcbiAgICAgICAgaWYgKGZvb3Rlckl0ZW0/LmRpdikge1xuICAgICAgICAgICAgLy8gTk9TT05BUjogVHJ1c3RlZCBIVE1MIGNvbnRlbnQgaXMgaGFuZGxlZCBzYWZlbHkgaGVyZVxuICAgICAgICAgICAgdGhpcy5odWJzcG90SHRtbCA9IHRoaXMuc2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RIdG1sKGZvb3Rlckl0ZW0uZGl2KTsgLy8gTk9TT05BUlxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdGluZ1F1ZXN0aW9ucyA9IHRoaXMucXVlc3Rpb25zO1xuICAgICAgICB0aGlzLnF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnM/LlswXT8ucXVlc3Rpb247XG4gICAgICAgIHRoaXMucHNhT3B0aW9ucyA9IFtcbiAgICAgICAgICAgIHsgbGFiZWw6ICdTZWxlY3QgUFNBJywgdmFsdWU6ICcnIH0sXG4gICAgICAgICAgICAuLi4odGhpcy5xdWVzdGlvbnM/LlswXT8ub3B0aW9ucyA/PyBbXSlcbiAgICAgICAgICAgICAgICAuZmlsdGVyKHEgPT4gcS5vcHRpb24/LnRyaW0oKSlcbiAgICAgICAgICAgICAgICAubWFwKHEgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHEub3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogcS5vcHRpb25cbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgXTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcykge1xuICAgICAgICBpZiAoY2hhbmdlc1sndXNlciddIHx8IGNoYW5nZXNbJ3VzZXJMb2dnZWRJbiddKSB7XG4gICAgICAgICAgICBpZiAodGhpcy51c2VyTG9nZ2VkSW4gJiYgdGhpcy51c2VyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDYW5FZGl0UmVzb3VyY2VzVmFsdWUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9wZW5Mb2dvRWRpdE1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMubG9nb01vZGFsLCB7XG4gICAgICAgICAgICBjZW50ZXJlZDogdHJ1ZSxcbiAgICAgICAgICAgIHNpemU6ICdtZCdcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgb25TYXZlRmlsZShldmVudCk6IHZvaWQge1xuICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpO1xuICAgICAgICBjb25zdCBkYXRhID0geyBzdWJzY3JpcHRpb25faWQ6IHRoaXMuc3Vic2NyaXB0aW9uSWQgfTtcblxuICAgICAgICBpZiAoZXZlbnQuZmlsZSBpbnN0YW5jZW9mIEZpbGUpIHtcbiAgICAgICAgICAgIGRhdGFbZXZlbnQubmFtZV0gPSBldmVudC5maWxlO1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmZpbGUgPT09IG51bGwpIHtcbiAgICAgICAgICAgIGRhdGFbYHJlbW92ZV8ke2V2ZW50Lm5hbWV9YF0gPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZGF0YSkge1xuICAgICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgZGF0YVtrZXldKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmRvbWFpbklkLCBmb3JtRGF0YSkuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIGlmIChldmVudC5maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2dvID0gVVJMLmNyZWF0ZU9iamVjdFVSTChldmVudC5maWxlKTtcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5kaXNtaXNzQWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoZXZlbnQuZmlsZSA/ICdMb2dvIHVwZGF0ZWQnIDogJ0xvZ28gcmVtb3ZlZCcpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBzYXZlUXVlc3Rpb25zKG1vZGFsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZURhdGEgPSB7XG4gICAgICAgICAgICBjb250YWN0X3VzOiB7XG4gICAgICAgICAgICAgICAgLi4udGhpcy5hcHBDb25maWcucGFnZXNfY29uZmlnPy5jb250YWN0X3VzLFxuICAgICAgICAgICAgICAgIHF1ZXN0aW9uczogdGhpcy5lZGl0aW5nUXVlc3Rpb25zXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLmlkXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2UudXBkYXRlRG9tYWluQ29uZmlnKHRoaXMuZG9tYWluSWQsIHVwZGF0ZURhdGEpLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnF1ZXN0aW9ucyA9IHRoaXMuZWRpdGluZ1F1ZXN0aW9ucztcbiAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnUXVlc3Rpb25zIHVwZGF0ZWQnKTtcbiAgICAgICAgICAgIHRoaXMucXVlc3Rpb24gPSB0aGlzLmVkaXRpbmdRdWVzdGlvbnM/LlswXT8ucXVlc3Rpb247XG4gICAgICAgICAgICBpZiAodGhpcy5lZGl0aW5nUXVlc3Rpb25zPy5bMF0/Lm9wdGlvbnM/Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBzYU9wdGlvbnMgPSBbXG4gICAgICAgICAgICAgICAgICAgIHsgbGFiZWw6ICdTZWxlY3QgUFNBJywgdmFsdWU6ICcnIH0sXG4gICAgICAgICAgICAgICAgICAgIC4uLih0aGlzLnF1ZXN0aW9ucz8uWzBdPy5vcHRpb25zID8/IFtdKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihxID0+IHEub3B0aW9uPy50cmltKCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAubWFwKHEgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcS5vcHRpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHEub3B0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnBzYU9wdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYWRkTmV3UXVlc3Rpb24oKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ1F1ZXN0aW9ucy5wdXNoKHsgcXVlc3Rpb246ICcnLCBvcHRpb25zOiBbXSB9KTtcbiAgICB9XG5cbiAgICBhZGRRdWVzdGlvbk9wdGlvbihxSW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdRdWVzdGlvbnNbcUluZGV4XS5vcHRpb25zLnB1c2goeyBvcHRpb246ICcnIH0pO1xuICAgIH1cblxuICAgIHJlbW92ZVF1ZXN0aW9uT3B0aW9uKHFJbmRleDogbnVtYmVyLCBvcHRJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ1F1ZXN0aW9uc1txSW5kZXhdLm9wdGlvbnMuc3BsaWNlKG9wdEluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBkcm9wUXVlc3Rpb25zKGV2ZW50KTogdm9pZCB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmVkaXRpbmdRdWVzdGlvbnMsIGV2ZW50LnByZXZpb3VzSW5kZXgsIGV2ZW50LmN1cnJlbnRJbmRleCk7XG4gICAgfVxuXG4gICAgZHJvcFF1ZXN0aW9uT3B0aW9ucyhxSW5kZXg6IG51bWJlciwgZXZlbnQpOiB2b2lkIHtcbiAgICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICAgICAgdGhpcy5lZGl0aW5nUXVlc3Rpb25zW3FJbmRleF0ub3B0aW9ucyxcbiAgICAgICAgICAgIGV2ZW50LnByZXZpb3VzSW5kZXgsXG4gICAgICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBvcGVuU29jaWFsRWRpdE1vZGFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdZb3V0dWJlVXJsID0gdGhpcy55b3V0dWJlVXJsO1xuICAgICAgICB0aGlzLmVkaXRpbmdMaW5rZWRJblVybCA9IHRoaXMubGlua2VkSW5Vcmw7XG4gICAgICAgIHRoaXMuZWRpdGluZ0NvbXBhbnlOYW1lID0gdGhpcy5jb21wYW55TmFtZTtcblxuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuc29jaWFsRWRpdE1vZGFsLCB7IGNlbnRlcmVkOiB0cnVlLCBzaXplOiAnbGcnIH0pO1xuICAgIH1cblxuICAgIHNhdmVTb2NpYWxMaW5rcyhtb2RhbCk6IHZvaWQge1xuICAgICAgICBjb25zdCB1cGRhdGVEYXRhID0ge1xuICAgICAgICAgICAgeW91dHViZV91cmw6IHRoaXMuZWRpdGluZ1lvdXR1YmVVcmwsXG4gICAgICAgICAgICBsaW5rZWRpbl91cmw6IHRoaXMuZWRpdGluZ0xpbmtlZEluVXJsLFxuICAgICAgICAgICAgY29tcGFueV9uYW1lOiB0aGlzLmVkaXRpbmdDb21wYW55TmFtZSxcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmRvbWFpbklkLCB1cGRhdGVEYXRhKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy55b3V0dWJlVXJsID0gdGhpcy5lZGl0aW5nWW91dHViZVVybDtcbiAgICAgICAgICAgIHRoaXMubGlua2VkSW5VcmwgPSB0aGlzLmVkaXRpbmdMaW5rZWRJblVybDtcbiAgICAgICAgICAgIHRoaXMuY29tcGFueU5hbWUgPSB0aGlzLmVkaXRpbmdDb21wYW55TmFtZTtcbiAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnU29jaWFsIGxpbmtzIGFuZCBjb21wYW55IG5hbWUgdXBkYXRlZCcpO1xuICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgaGFzVmFsaWRPcHRpb25zKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5xdWVzdGlvbnM/LlswXT8ub3B0aW9ucz8uc29tZShvcHQgPT4gb3B0Lm9wdGlvbj8udHJpbSgpKTtcbiAgICB9XG5cbiAgICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgICAgIHRoaXMud2F0Y2hJZnJhbWVIZWlnaHRDaGFuZ2UoKTtcbiAgICAgICAgdGhpcy5vYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcihcbiAgICAgICAgICAgIChbZW50cnldKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGb290ZXJWaXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHsgdGhyZXNob2xkOiAwLjEgfVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMub2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLmZvb3RlclNlY3Rpb24ubmF0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgb3BlbkVkaXRGb290ZXJMaW5rc01vZGFsKGNvbnRlbnQpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5mb290ZXJMaW5rc0RhdGEgPSB0aGlzLmZvb3RlckxpbmtzRGF0YSA/PyB7fTtcbiAgICAgICAgdGhpcy5mb290ZXJMaW5rc0RhdGEuaXRlbXMgPSB0aGlzLmZvb3RlckxpbmtzRGF0YS5pdGVtcyA/PyBbXTtcbiAgICAgICAgdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHRoaXMuZm9vdGVyTGlua3NEYXRhKSk7XG5cbiAgICAgICAgdGhpcy5tb2RhbFNlcnZpY2Uub3Blbihjb250ZW50LCB7XG4gICAgICAgICAgICBzaXplOiAnbGcnLFxuICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB3YXRjaElmcmFtZUhlaWdodENoYW5nZSgpIHtcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaHVic3BvdC1jb250YWluZXInKTtcbiAgICAgICAgaWYgKCFpZnJhbWUpIHJldHVybjtcbiAgICAgICAgY29uc3QgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBuZXdIZWlnaHQgPSBpZnJhbWVbJ29mZnNldEhlaWdodCddO1xuICAgICAgICAgICAgaWYgKG5ld0hlaWdodCA9PT0gMjUwKSB7XG4gICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbCk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsQWJUZXN0RmluaXNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDMwMCk7XG4gICAgfVxuXG4gICAgLy8gTmV3IG1ldGhvZCB0byBoYW5kbGUgSHVic3BvdCBjb250ZW50IGxvYWRpbmdcbiAgICBvbkh1YnNwb3RMb2FkKGV2ZW50OiBFdmVudCkge1xuICAgICAgICBjb25zdCBjb250YWluZXIgPSBldmVudC50YXJnZXQgYXMgSFRNTERpdkVsZW1lbnQ7XG4gICAgICAgIGNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCdjb250ZW50LWxvYWRlZCcpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsOiBUcmlnZ2VyIGxheW91dCByZWNhbGN1bGF0aW9uXG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgd2luZG93LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdyZXNpemUnKSk7XG4gICAgICAgIH0sIDEwMCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjYWxsQWJUZXN0RmluaXNoKCkge1xuICAgICAgICBpZiAodGhpcy5leHBlcmltZW50TmFtZSAmJiB0aGlzLm1pY3Jvc2VydmljZU5hbWUpIHtcbiAgICAgICAgICAgIHRoaXMuYWJUZXN0U2VydmljZVxuICAgICAgICAgICAgICAgIC5maW5pc2hBQkV4cGVyaW1lbnQodGhpcy5leHBlcmltZW50TmFtZSwgdGhpcy5taWNyb3NlcnZpY2VOYW1lKVxuICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuY29udGVudCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyZWQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb250YWN0VXNGb3JtKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmZvcm0gPSB0aGlzLmZiLmdyb3VwKHtcbiAgICAgICAgICAgIGZpcnN0X25hbWU6IFsnJywgVmFsaWRhdG9ycy5yZXF1aXJlZF0sXG4gICAgICAgICAgICBsYXN0X25hbWU6IFsnJ10sXG4gICAgICAgICAgICBjb21wYW55OiBbJyddLFxuICAgICAgICAgICAgcHNhOiBbJyddLFxuICAgICAgICAgICAgZW5xdWlyeTogWycnLCBWYWxpZGF0b3JzLnJlcXVpcmVkXSxcbiAgICAgICAgICAgIGVtYWlsOiBbJycsIFZhbGlkYXRvcnMucmVxdWlyZWRdXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIG9uU3VibWl0KCkge1xuICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IHRydWU7XG4gICAgICAgIGlmICh0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgIHRoaXMuaXNDYXB0Y2hhVmVyaWZpZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5zdWJtaXR0ZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZVN1Y2Nlc3ModG9rZW46IHN0cmluZykge1xuICAgICAgICBpZiAodG9rZW4pIHtcbiAgICAgICAgICAgIHRoaXMuYXV0aFNlcnZpY2UudmFsaWRhdGVSZUNhcHRjaGEodG9rZW4pLnN1YnNjcmliZSgoaXNTdWNjZXNzOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGlzU3VjY2VzcyAmJiB0aGlzLmZvcm0udmFsaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHsgLi4udGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgfTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRW5xdWlyeSA9IGAke2RhdGEuZW5xdWlyeX07IFF1ZXN0aW9uOiAke3RoaXMucXVlc3Rpb259OyBBbnN3ZXI6ICR7ZGF0YS5wc2F9YDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zdERhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lOiBgJHtkYXRhLmZpcnN0X25hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfbmFtZTogYCR7ZGF0YS5maXJzdF9uYW1lfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wYW55OiBgJHtkYXRhLmZpcnN0X25hbWV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVtYWlsOiBgJHtkYXRhLmVtYWlsfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICBlbnF1aXJ5OiB0aGlzLnBzYU9wdGlvbnMubGVuZ3RoID8gZm9ybWF0dGVkRW5xdWlyeSA6IGAke2RhdGEuZW5xdWlyeX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHNhOiBkYXRhLnBzYSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5zdWJzY3JpcHRpb25JZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNybV9zb3VyY2VfaWQ6IHRoaXMuc291cmNlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfc3Vic2NyaXB0aW9uX2lkOiB0aGlzLm1hc3RlclN1YnNjcmlwdGlvbklkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5X3VzZXI6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNfbWFudWFsOiBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3JtU2VydmljZS5wb3N0Q3JtTGVhZCh0aGlzLnN1YnNjcmlwdGlvbklkLCBwb3N0RGF0YSkuc3Vic2NyaWJlKHJlc3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGV4YW1wbGUgb2Ygc25pcHBldCB0byBjbG9zZSB0aGUgZXhwZXJpbWVudCBhbmQgdHJhY2sgaW4gR0FcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwPy5zdGF0dXMgPT09IFN0YXR1c0NvZGVzLk9LKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nb29nbGVBbmFseXRpY3NTZXJ2aWNlLnNlbmRFdmVudChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25ldy1sZWFkLXJlZ2lzdHJhdGlvbicsIC8vIGNhdGVnb3J5LCBlZzogdmlkZW9zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzdWJzY3JpYmUtc3VjY2VzcycsIC8vIGFjdGlvbiwgZWc6IFBsYXlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbWluZy1zb29uLXRocmVlJywgLy8gbGFiZWwsIGVnOiBDaGFwcHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvLyB2YWx1ZSwgZWc6IDEwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5leHBlcmltZW50TmFtZSAmJiB0aGlzLm1pY3Jvc2VydmljZU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hYlRlc3RTZXJ2aWNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluaXNoQUJFeHBlcmltZW50KHRoaXMuZXhwZXJpbWVudE5hbWUsIHRoaXMubWljcm9zZXJ2aWNlTmFtZSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWxTZXJ2aWNlLm9wZW4odGhpcy5jb250ZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlcmVkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3dDbGFzczogJ21vZGFsLWhvbGRlcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3YWwuZmlyZShyZXNwLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5yZXNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NhcHRjaGFWZXJpZmllZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHNjcm9sbFRvVG9wKCkge1xuICAgICAgICB0aGlzLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgIH1cblxuICAgIGdldEZvb3Rlckh1YnNwb3RGb3JtKCkge1xuICAgICAgICBpZiAoIXRoaXMuaHVic3BvdD8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmh1YnNwb3QuZmluZChpdGVtID0+IGl0ZW0ucG9zaXRpb24gPT09ICdmb290ZXInKSA/PyBudWxsO1xuICAgIH1cblxuICAgIG5hdmlnYXRlVG9Cb29rTWVldGluZygpIHtcbiAgICAgICAgd2luZG93Lm9wZW4oJ2h0dHBzOi8vY2FsZW5kbHkuY29tL2Nsb3Vkb2xpdmUnLCAnX2JsYW5rJywgJ25vcmVmZXJyZXIgbm9vcGVuZXInKTtcbiAgICB9XG5cbiAgICB2YWxpZGF0ZUVtYWlsKCkge1xuICAgICAgICBjb25zdCBlbWFpbCA9IHRoaXMuZm9ybS5nZXQoJ2VtYWlsJykudmFsdWU7XG4gICAgICAgIGlmIChlbWFpbCkge1xuICAgICAgICAgICAgdGhpcy5pc0VtYWlsVmFsaWQgPSBWYWxpZGF0aW9uU2VydmljZS5lbWFpbChlbWFpbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmlzRW1haWxWYWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBhZGRGb290ZXJMaW5rKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdGb290ZXJMaW5rcy5pdGVtcy5wdXNoKHtcbiAgICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICAgIHBhdGg6ICcnLFxuICAgICAgICAgICAgc3VidGl0bGVzOiBbXVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVGb290ZXJMaW5rKGluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MuaXRlbXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICB9XG5cbiAgICBhZGRTdWJ0aXRsZShmb290ZXJJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLml0ZW1zW2Zvb3RlckluZGV4XS5zdWJ0aXRsZXMucHVzaCh7XG4gICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICBwYXRoOiAnJ1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmVTdWJ0aXRsZShmb290ZXJJbmRleDogbnVtYmVyLCBzdWJ0aXRsZUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nRm9vdGVyTGlua3MuaXRlbXNbZm9vdGVySW5kZXhdLnN1YnRpdGxlcy5zcGxpY2Uoc3VidGl0bGVJbmRleCwgMSk7XG4gICAgfVxuXG4gICAgZHJvcEZvb3RlckxpbmtzKGV2ZW50KSB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheSh0aGlzLmVkaXRpbmdGb290ZXJMaW5rcy5pdGVtcywgZXZlbnQucHJldmlvdXNJbmRleCwgZXZlbnQuY3VycmVudEluZGV4KTtcbiAgICB9XG5cbiAgICBkcm9wU3VidGl0bGVzKGZvb3RlckluZGV4OiBudW1iZXIsIGV2ZW50KSB7XG4gICAgICAgIG1vdmVJdGVtSW5BcnJheShcbiAgICAgICAgICAgIHRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLml0ZW1zW2Zvb3RlckluZGV4XS5zdWJ0aXRsZXMsXG4gICAgICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICAgICAgZXZlbnQuY3VycmVudEluZGV4XG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2F2ZUZvb3RlckxpbmtzKG1vZGFsKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRDb25maWcgPSB7XG4gICAgICAgICAgICBmb290ZXJfbGlua3M6IHRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLFxuICAgICAgICAgICAgc3Vic2NyaXB0aW9uX2lkOiB0aGlzLmlkXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVEb21haW5Db25maWcodGhpcy5hcHBDb25maWc/LmRvbWFpbl9pZCwgdXBkYXRlZENvbmZpZylcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnRm9vdGVyIGxpbmtzIHVwZGF0ZWQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlckxpbmtzID0gWy4uLnRoaXMuZWRpdGluZ0Zvb3RlckxpbmtzLml0ZW1zXTtcbiAgICAgICAgICAgICAgICB0aGlzLmZvb3RlckxpbmtzRGF0YSA9IHsgLi4udGhpcy5lZGl0aW5nRm9vdGVyTGlua3MgfTtcbiAgICAgICAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2F2ZUVtYWlsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmVtYWlsID0gdGhpcy5lZGl0aW5nRW1haWw7XG5cbiAgICAgICAgdGhpcy5hZG1pblNlcnZpY2VcbiAgICAgICAgICAgIC51cGRhdGVEb21haW5Db25maWcodGhpcy5hcHBDb25maWc/LmRvbWFpbl9pZCwge1xuICAgICAgICAgICAgICAgIGNvbXBhbnlfZW1haWw6IHRoaXMuZWRpdGluZ0VtYWlsLFxuICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbl9pZDogdGhpcy5pZFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudG9hc3Quc3VjY2VzcygnRW1haWwgdXBkYXRlZCcpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNFZGl0aW5nRW1haWwgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHNhdmVTdHJlZXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuYWRtaW5TZXJ2aWNlXG4gICAgICAgICAgICAudXBkYXRlRG9tYWluQ29uZmlnKHRoaXMuYXBwQ29uZmlnPy5kb21haW5faWQsIHtcbiAgICAgICAgICAgICAgICBjb21wYW55X2FkZHJlc3M6IHRoaXMuZWRpdGluZ1N0cmVldCxcbiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ1N0cmVldCB1cGRhdGVkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHJlZXQgPSB0aGlzLmVkaXRpbmdTdHJlZXQ7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0VkaXRpbmdTdHJlZXQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNhbmNlbFN0cmVldCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5lZGl0aW5nU3RyZWV0ID0gdGhpcy5zdHJlZXQ7XG4gICAgICAgIHRoaXMuaXNFZGl0aW5nU3RyZWV0ID0gZmFsc2U7XG4gICAgfVxuXG4gICAgb3Blbkh1YnNwb3RFZGl0TW9kYWwoZm9vdGVySXRlbSk6IHZvaWQge1xuICAgICAgICB0aGlzLmVkaXRpbmdIdWJzcG90SHRtbCA9IGZvb3Rlckl0ZW0uZGl2O1xuICAgICAgICB0aGlzLmVkaXRpbmdIdWJzcG90SWQgPSBmb290ZXJJdGVtLmlkO1xuICAgICAgICB0aGlzLm1vZGFsU2VydmljZS5vcGVuKHRoaXMuaHVic3BvdEVkaXRNb2RhbCwgeyBjZW50ZXJlZDogdHJ1ZSwgc2l6ZTogJ2xnJyB9KTtcbiAgICB9XG5cbiAgICBzYXZlSHVic3BvdEh0bWwobW9kYWwpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgdXBkYXRlZENvbmZpZyA9IHtcbiAgICAgICAgICAgIGNvbnRhY3RfdXM6IHtcbiAgICAgICAgICAgICAgICAuLi50aGlzLmFwcENvbmZpZz8ucGFnZXNfY29uZmlnPy5jb250YWN0X3VzLFxuICAgICAgICAgICAgICAgIGh1YnNwb3Q6IFtcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6ICc3NDIzNjM5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnZm9vdGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpdjogdGhpcy5lZGl0aW5nSHVic3BvdEh0bWxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25faWQ6IHRoaXMuaWRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmFkbWluU2VydmljZVxuICAgICAgICAgICAgLnVwZGF0ZURvbWFpbkNvbmZpZyh0aGlzLmFwcENvbmZpZz8uZG9tYWluX2lkLCB1cGRhdGVkQ29uZmlnKVxuICAgICAgICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gTk9TT05BUjogVHJ1c3RlZCBIVE1MIGNvbnRlbnQgaXMgaGFuZGxlZCBzYWZlbHkgaGVyZVxuICAgICAgICAgICAgICAgIHRoaXMuaHVic3BvdEh0bWwgPSB0aGlzLnNhbml0aXplci5ieXBhc3NTZWN1cml0eVRydXN0SHRtbCh0aGlzLmVkaXRpbmdIdWJzcG90SHRtbCk7IC8vIE5PU09OQVJcbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0LnN1Y2Nlc3MoJ0h1YnNwb3QgRW1iZWQgdXBkYXRlZCcpO1xuICAgICAgICAgICAgICAgIG1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSB1cGRhdGVDYW5FZGl0UmVzb3VyY2VzVmFsdWUoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FuRWRpdFJlc291cmNlc1ZhbHVlID0gSGVscGVyU2VydmljZS5jYW5FZGl0UmVzb3VyY2VzKFxuICAgICAgICAgICAgdGhpcy51c2VyLFxuICAgICAgICAgICAgdGhpcy51c2VyTG9nZ2VkSW4sXG4gICAgICAgICAgICB0aGlzLnBlcm1pc3Npb25TZXJ2aWNlXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgY2FuRWRpdFJlc291cmNlcygpOiBib29sZWFuIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FuRWRpdFJlc291cmNlc1ZhbHVlO1xuICAgIH1cblxuICAgIG92ZXJyaWRlIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgICAgICB0aGlzLm9ic2VydmVyPy5kaXNjb25uZWN0KCk7XG4gICAgfVxufVxuIiwiPHNlY3Rpb24gICNmb290ZXJTZWN0aW9uIGNsYXNzPVwiYmctYmxhY2sgdGV4dC13aGl0ZSBweS01IGZvb3Rlci1zZWN0aW9uXCI+XG4gIDxkaXYgY2xhc3M9XCJjb250YWluZXJcIiAqbmdJZj1cImlzRm9vdGVyVmlzaWJsZVwiPlxuICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cblxuICAgICAgPCEtLSBMRUZUIENPTFVNTiAtLT5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtYi00IGQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiIFtuZ0NsYXNzXT1cInsgJ3NpdGUtY29sdW1uJzogZ2V0Rm9vdGVySHVic3BvdEZvcm0oKSB9XCI+XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgPGgzIGNsYXNzPVwibWItNCBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1lLTIgdGV4dC13aGl0ZVwiPlNpdGUgTWFwOjwvc3Bhbj5cbiAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCIgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIGN1cnNvci1wb2ludGVyIHRleHQtd2hpdGUgbXMtM1wiIChjbGljayk9XCJvcGVuRWRpdEZvb3RlckxpbmtzTW9kYWwoZWRpdEZvb3RlckxpbmtzTW9kYWwpXCIgKGtleWRvd24uZW50ZXIpPVwib3BlbkVkaXRGb290ZXJMaW5rc01vZGFsKGVkaXRGb290ZXJMaW5rc01vZGFsKVwiIChrZXlkb3duLnNwYWNlKT1cIm9wZW5FZGl0Rm9vdGVyTGlua3NNb2RhbChlZGl0Rm9vdGVyTGlua3NNb2RhbClcIiBuZ2JUb29sdGlwPVwiRWRpdCBGb290ZXIgTGlua3NcIj48L2k+XG4gICAgICAgICAgPC9oMz5cbiAgICAgICAgICA8dWwgY2xhc3M9XCJtdC00XCI+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGluaz1cIi9cIlxuICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB1c2VyLWluZm8tbGFiZWwgbGluay1sYWJlbFwiPiBIb21lIDwvbGk+XG4gICAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IGxpbmsgb2YgZm9vdGVyTGlua3NcIiBbcm91dGVyTGlua109XCJsaW5rPy5wYXRoXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJjdXJzb3ItcG9pbnRlciB1c2VyLWluZm8tbGFiZWwgbGluay1sYWJlbCBtdC00XCI+PHNwYW4gICpuZ0lmPVwibGluaz8udGl0bGVcIj57e2xpbms/LnRpdGxlfX08L3NwYW4+IDwvbGk+XG4gICAgICAgICAgICA8bGkgcm91dGVyTGluaz1cIi9sb2dpblwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiY3Vyc29yLXBvaW50ZXIgdXNlci1pbmZvLWxhYmVsIG10LTQgbGluay1sYWJlbFwiPiBMb2cgaW4gPC9saT5cbiAgICAgICAgICAgIDxsaSBbcm91dGVyTGlua109XCInL3ByaXZhY3ktYW5kLXRvcy8nICsgdG9zSWRcIlxuICAgICAgICAgICAgICBjbGFzcz1cImN1cnNvci1wb2ludGVyIHVzZXItaW5mby1sYWJlbCBtdC00IGxpbmstbGFiZWxcIj4gUHJpdmFjeSBzdGF0ZW1lbnQgPC9saT5cbiAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDxwIGNsYXNzPVwiYWRkcmVzcy1zZWN0aW9uIGVtYWlsLXNlY3Rpb24gbWItNFwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLWluZm8tbGFiZWxcIj5FbWFpbDogPC9zcGFuPlxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VkaXRpbmdFbWFpbDsgZWxzZSBlZGl0RW1haWxcIj5cbiAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ1c2VyLWluZm9cIj57eyBlbWFpbCB9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgPGkgKm5nSWY9XCJjYW5FZGl0UmVzb3VyY2VzVmFsdWVcIiBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gdGV4dC13aGl0ZSBjdXJzb3ItcG9pbnRlciBtcy0zXCIgKGNsaWNrKT1cImlzRWRpdGluZ0VtYWlsID0gdHJ1ZVwiIChrZXlkb3duLmVudGVyKT1cImlzRWRpdGluZ0VtYWlsID0gdHJ1ZVwiIChrZXlkb3duLnNwYWNlKT1cImlzRWRpdGluZ0VtYWlsID0gdHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRFbWFpbD5cbiAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgZC1pbmxpbmUgdy1hdXRvXCJcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cImVkaXRpbmdFbWFpbFwiXG4gICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG1zLTJcIiAoY2xpY2spPVwic2F2ZUVtYWlsKClcIj5TYXZlPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnkgbXMtMlwiIChjbGljayk9XCJpc0VkaXRpbmdFbWFpbCA9IGZhbHNlXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJlbWFpbC1zZWN0aW9uIG10LTMgYWRkcmVzcy10ZXh0XCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInVzZXItaW5mby1sYWJlbFwiPlxuICAgICAgICAgICAgICBBZGRyZXNzOlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImNhbkVkaXRSZXNvdXJjZXNWYWx1ZVwiXG4gICAgICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiBjdXJzb3ItcG9pbnRlciBtcy0yIHRleHQtd2hpdGVcIlxuICAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXQgQWRkcmVzc1wiXG4gICAgICAgICAgICAgICAgIChjbGljayk9XCJpc0VkaXRpbmdTdHJlZXQgPSB0cnVlXCJcbiAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiaXNFZGl0aW5nU3RyZWV0ID0gdHJ1ZVwiXG4gICAgICAgICAgICAgICAgIChrZXlkb3duLnNwYWNlKT1cImlzRWRpdGluZ1N0cmVldCA9IHRydWVcIj48L2k+XG4gICAgICAgICAgICA8L3NwYW4+PGJyLz5cblxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiFpc0VkaXRpbmdTdHJlZXQ7IGVsc2UgZWRpdFN0cmVldEJsb2NrXCI+XG4gICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYWRkcmVzcy10ZXh0IHVzZXItaW5mb1wiPnt7IHN0cmVldCB9fTwvc3Bhbj5cbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgICA8bmctdGVtcGxhdGUgI2VkaXRTdHJlZXRCbG9jaz5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtM1wiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbCBmb3JtLWNvbnRyb2wtc21cIiBbKG5nTW9kZWwpXT1cImVkaXRpbmdTdHJlZXRcIiAvPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1wcmltYXJ5IG1zLTJcIiAoY2xpY2spPVwic2F2ZVN0cmVldCgpXCI+U2F2ZTwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1zZWNvbmRhcnkgbXMtMlwiIChjbGljayk9XCJjYW5jZWxTdHJlZXQoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XG5cbiAgICAgICAgICA8L3NwYW4+XG5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICA8aW1nIFtzcmNdPVwibG9nb1wiXG4gICAgICAgICAgICAgICBhbHQ9XCJDb21wYW55IGxvZ29cIlxuICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWQgbXQtNCBsb2dvLWltYWdlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgIHdpZHRoPVwiMTYwXCJcbiAgICAgICAgICAgICAgIGhlaWdodD1cIjM1XCJcbiAgICAgICAgICAgICAgIChjbGljayk9XCJzY3JvbGxUb1RvcCgpXCJcbiAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cInNjcm9sbFRvVG9wKClcIlxuICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwic2Nyb2xsVG9Ub3AoKVwiXG4gICAgICAgICAgICAgICB0aXRsZT1cIkNsaWNrIHRvIGdvIHRvIHRvcCBvZiBwYWdlXCIgLz5cbiAgICAgICAgICA8aSAqbmdJZj1cImNhbkVkaXRSZXNvdXJjZXNWYWx1ZVwiXG4gICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIGZhLXNtIG1zLTMgY3Vyc29yLXBvaW50ZXIgdGV4dC13aGl0ZSBhbGlnbi1zZWxmLWNlbnRlciBtdC0zXCJcbiAgICAgICAgICAgICAoY2xpY2spPVwib3BlbkxvZ29FZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib3BlbkxvZ29FZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib3BlbkxvZ29FZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgdGl0bGU9XCJFZGl0IExvZ29cIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDwhLS0gUklHSFQgQ09MVU1OIC0tPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCIgKm5nSWY9XCJpc0Zvb3RlclZpc2libGVcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImdldEZvb3Rlckh1YnNwb3RGb3JtKCkgYXMgZm9vdGVySXRlbTsgZWxzZSBkZWZhdWx0Rm9ybVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxuICAgICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgKm5nSWY9XCJpc0h1YnNwb3RSZWFkeVwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJodWJzcG90LWNvbnRhaW5lciB3LTEwMCBjb250ZW50LWxvYWRlZFwiXG4gICAgICAgICAgICAgICAgW2lubmVySFRNTF09XCJodWJzcG90SHRtbFwiXG4gICAgICAgICAgICAgICAgKGxvYWQpPVwib25IdWJzcG90TG9hZCgkZXZlbnQpXCI+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8aSAqbmdJZj1cImNhbkVkaXRSZXNvdXJjZXNWYWx1ZVwiXG4gICAgICAgICAgICAgIGNsYXNzPVwiZmEgZmEtZWRpdCBpbi1wYWdlLWVkaXQtaWNvbiB0ZXh0LXdoaXRlIGN1cnNvci1wb2ludGVyXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW5IdWJzcG90RWRpdE1vZGFsKGZvb3Rlckl0ZW0pXCJcbiAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwib3Blbkh1YnNwb3RFZGl0TW9kYWwoZm9vdGVySXRlbSlcIlxuICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuSHVic3BvdEVkaXRNb2RhbChmb290ZXJJdGVtKVwiXG4gICAgICAgICAgICAgIHRpdGxlPVwiRWRpdCBIdWJzcG90IEVtYmVkXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI2RlZmF1bHRGb3JtPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICA8aDMgY2xhc3M9XCJ0ZXh0LXdoaXRlIG1iLTRcIj4gPHNwYW4gY2xhc3M9XCJ0ZXh0LXdoaXRlXCI+R2V0IGluIHRvdWNoOjwvc3Bhbj48L2gzPlxuICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImZhIGZhLWVkaXQgaW4tcGFnZS1lZGl0LWljb24gdGV4dC13aGl0ZSBjdXJzb3ItcG9pbnRlciBtcy0zIG10LTJcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuUXVlc3Rpb25zRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIm9wZW5RdWVzdGlvbnNFZGl0TW9kYWwoKVwiXG4gICAgICAgICAgICAgICAgKGtleWRvd24uc3BhY2UpPVwib3BlblF1ZXN0aW9uc0VkaXRNb2RhbCgpXCJcbiAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXQgUXVlc3Rpb25zXCI+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1mb3JtXCI+XG4gICAgICAgICAgICAgIDxmb3JtIFtmb3JtR3JvdXBdPVwiZm9ybVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZW1haWxcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiZW1haWxcIj5FbWFpbDo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtYi0xXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJlbWFpbFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImVtYWlsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgPHB3LWZpZWxkLWVycm9yLWRpc3BsYXkgW2Rpc3BsYXlFcnJvcl09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgIWZvcm0uZ2V0KCdlbWFpbCcpLnZhbGlkICYmIChmb3JtLmdldCgnZW1haWwnKS50b3VjaGVkIHx8IHN1Ym1pdHRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1zZz1cIkVtYWlsIGlzIHJlcXVpcmVkXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvcHctZmllbGQtZXJyb3ItZGlzcGxheT5cbiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmb3JtLWZpZWxkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZpcnN0X25hbWVcIj5GaXJzdCBuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgaW5wdXQgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaWQ9XCJmaXJzdF9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImZpcnN0X25hbWVcIiAvPlxuICAgICAgICAgICAgICAgICAgICAgICAgICA8cHctZmllbGQtZXJyb3ItZGlzcGxheSBbZGlzcGxheUVycm9yXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAhZm9ybS5nZXQoJ2ZpcnN0X25hbWUnKS52YWxpZCAmJiAoZm9ybS5nZXQoJ2ZpcnN0X25hbWUnKS50b3VjaGVkIHx8IHN1Ym1pdHRlZClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICBlcnJvck1zZz1cIkZpcnN0IG5hbWUgaXMgcmVxdWlyZWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9wdy1maWVsZC1lcnJvci1kaXNwbGF5PlxuICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZvcm0tZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwibGFzdF9uYW1lXCI+TGFzdCBuYW1lOjwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkPVwibGFzdF9uYW1lXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1Db250cm9sTmFtZT1cImxhc3RfbmFtZVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJjb21wYW55XCI+Q29tcGFueTo8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cImNvbXBhbnlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwiY29tcGFueVwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiICpuZ0lmPVwiaGFzVmFsaWRPcHRpb25zKClcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwicHNhXCIgY2xhc3M9XCJzZWxlY3QtbGFiZWxcIj57e3F1ZXN0aW9ufX08L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICAgIDxwLWRyb3Bkb3duXG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJwc2FcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW29wdGlvbnNdPVwicHNhT3B0aW9uc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcGxhY2Vob2xkZXJdPVwiJ1NlbGVjdCBQU0EnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlQ2xhc3M9XCJpbnB1dC1zZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8L3AtZHJvcGRvd24+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZm9ybS1maWVsZFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJlbnF1aXJ5XCIgY2xhc3M9XCJzZWxlY3QtbGFiZWxcIj5Ib3cgY2FuIHdlIGhlbHAgeW91PzwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImVucXVpcnktZmllbGRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYSAgaWQ9XCJlbnF1aXJ5XCIgZm9ybUNvbnRyb2xOYW1lPVwiZW5xdWlyeVwiIGNsYXNzPVwiXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvdGV4dGFyZWE+XG4gICAgICAgICAgICAgICAgICAgICAgICAgIDxwdy1maWVsZC1lcnJvci1kaXNwbGF5IFtkaXNwbGF5RXJyb3JdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICFmb3JtLmdldCgnZW5xdWlyeScpLnZhbGlkICYmIChmb3JtLmdldCgnZW5xdWlyeScpLnRvdWNoZWQgfHwgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIGVycm9yTXNnPVwiRW5xdWlyeSBpcyByZXF1aXJlZFwiPlxuICAgICAgICAgICAgICAgICAgICA8L3B3LWZpZWxkLWVycm9yLWRpc3BsYXk+XG4gICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtZW5kXCI+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FwdGNoYS13cmFwcGVyLWNvbnRhaW5lclwiXG4gICAgICAgICAgICAgICAgICAqbmdJZj1cImlzQ2FwdGNoYVZlcmlmaWVkXCI+XG4gICAgICAgICAgICAgICAgICA8bmd4LXJlY2FwdGNoYTIgW25nTW9kZWxPcHRpb25zXT1cInsgc3RhbmRhbG9uZTogdHJ1ZSB9XCJcbiAgICAgICAgICAgICAgICAgICAgW3NpdGVLZXldPVwiY2FwdGNoYUtleVYyXCJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZT1cIm5vcm1hbFwiXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwicmVjYXB0Y2hhXCJcbiAgICAgICAgICAgICAgICAgICAgKHN1Y2Nlc3MpPVwiaGFuZGxlU3VjY2VzcygkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICA8L25neC1yZWNhcHRjaGEyPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwic3VibWl0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9uU3VibWl0KClcIlxuICAgICAgICAgICAgICAgICAgICAqbmdJZj1cIiFpc0NhcHRjaGFWZXJpZmllZFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwic2lnbi1idG4gc2lnbi1oZWFkZXItYnRuIG10LTNcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ0J1dHRvbi5TdWJtaXQnIHwgdHJhbnNsb2NvIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG10LTRcIj5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29ucyBkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIFtldmVudFRyYWNrZXJdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6ICd5b3V0dWJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2NsaWNrJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAnY2xvdWRvbGl2ZS1sYW5kaW5nLXBhZ2UtYicsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogMVxuICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtocmVmXT1cInlvdXR1YmVVcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiL2Fzc2V0cy9pbWcvaWNvbnMveW91dHViZS5wbmdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpbWctZmx1aWQgeW91dHViZS1pY29uXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoPVwiNTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PVwiNTRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgYWx0PVwiXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8YSBbZXZlbnRUcmFja2VyXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGVnb3J5OiAnbGlua2VkaW4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiAnY2xpY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICdjbG91ZG9saXZlLWxhbmRpbmctcGFnZS1iJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAxXG4gICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2hyZWZdPVwibGlua2VkSW5VcmxcIlxuICAgICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiXG4gICAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJtcy0zXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGltZyBzcmM9XCIvYXNzZXRzL2ltZy9pY29ucy9zb2NpYWwvbGlua2VkaW4uc3ZnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiaW1nLWZsdWlkIGxpbmtlZGluLWljb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGg9XCI0OFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9XCI0OFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBhbHQ9XCJcIiAvPlxuICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgIDxpICpuZ0lmPVwiY2FuRWRpdFJlc291cmNlc1ZhbHVlXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmYSBmYS1lZGl0IGluLXBhZ2UtZWRpdC1pY29uIHRleHQtd2hpdGUgY3Vyc29yLXBvaW50ZXIgbXMtM1wiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvcGVuU29jaWFsRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5lbnRlcik9XCJvcGVuU29jaWFsRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgICAoa2V5ZG93bi5zcGFjZSk9XCJvcGVuU29jaWFsRWRpdE1vZGFsKClcIlxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cIkVkaXQgU29jaWFsIExpbmtzICYgQ29tcGFueSBOYW1lXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29weXJpZ2h0IHRleHQtd2hpdGVcIj5cbiAgICAgICAgICAgICAgICAgICAgMjAyNSB7e2NvbXBhbnlOYW1lfX0uXG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9mb3JtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9zZWN0aW9uPlxuXG5cblxuPG5nLXRlbXBsYXRlICNib29rTWVldGluZ1xuICBsZXQtbW9kYWw+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1oZWFkZXJcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIlxuICAgICAgY2xhc3M9XCJidG4tY2xvc2UgZmxvYXQtZW5kXCJcbiAgICAgIGFyaWEtbGFiZWw9XCJDbG9zZVwiXG4gICAgICAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxoMyBjbGFzcz1cInRleHQtY2VudGVyIG1vZGFsLWJhc2ljLXRpdGxlXCI+XG4gICAgICBUaGFua3MgZm9yIGdldHRpbmcgaW4gdG91Y2ghIE91ciB0ZWFtIHdpbGwgYmUgaW4gY29udGFjdCBzaG9ydGx5LCBvciB3ZVxuICAgICAgY2FuIGNvbXBhcmUgY2FsZW5kYXJzIG5vdyAmYW1wOyBzY2hlZHVsZSBhIHRpbWVcbiAgICA8L2gzPlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiXG4gICAgICBbZXZlbnRUcmFja2VyXT1cIntcbiAgICAgICAgY2F0ZWdvcnk6ICdyZXF1ZXN0LWRlbW8nLFxuICAgICAgICBhY3Rpb246ICdjbGljaycsXG4gICAgICAgIGxhYmVsOiAnY2xvdWRvbGl2ZS1sYW5kaW5nLXBhZ2UtYicsXG4gICAgICAgIHZhbHVlOiAxXG4gICAgICB9XCJcbiAgICAgIChjbGljayk9XCJuYXZpZ2F0ZVRvQm9va01lZXRpbmcoKVwiXG4gICAgICBjbGFzcz1cInNpZ24tYnRuIHNpZ24taGVhZGVyLWJ0biBteC1hdXRvIGQtYmxvY2sgbWItM1wiPlxuICAgICAgTGV0J3MgZG8gaXRcbiAgICA8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjZWRpdEZvb3RlckxpbmtzTW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5FZGl0IEZvb3RlciBMaW5rczwvaDU+XG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4tY2xvc2VcIiBhcmlhLWxhYmVsPVwiQ2xvc2VcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+PC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1ib2R5XCI+XG4gICAgPGg0IGNsYXNzPVwibWItM1wiPkZvb3RlciBMaW5rcyBTZWN0aW9uPC9oND5cbiAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcEZvb3RlckxpbmtzKCRldmVudClcIj5cbiAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGZvb3RlciBvZiBlZGl0aW5nRm9vdGVyTGlua3MuaXRlbXM7IGxldCBpID0gaW5kZXhcIiBjbGFzcz1cImJvcmRlciBwLTMgbWItM1wiIGNka0RyYWc+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTUgbWItMlwiPlxuICAgICAgICAgICAgPGxhYmVsIGZvcj1cImZvb3RlclRpdGxle3tpfX1cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5UaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJmb290ZXJUaXRsZXt7aX19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImZvb3Rlci50aXRsZVwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC01IG1iLTJcIj5cbiAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJmb290ZXJQYXRoe3tpfX1cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5QYXRoPC9sYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCBpZD1cImZvb3RlclBhdGh7e2l9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJmb290ZXIucGF0aFwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS10cmFzaCBpbi1wYWdlLXRyYXNoLWljb24gdGV4dC1kYW5nZXIgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwicmVtb3ZlRm9vdGVyTGluayhpKVwiIChrZXlkb3duLmVudGVyKT1cInJlbW92ZUZvb3RlckxpbmsoaSlcIiAoa2V5ZG93bi5zcGFjZSk9XCJyZW1vdmVGb290ZXJMaW5rKGkpXCI+PC9pPlxuICAgICAgICAgICAgPGkgY2xhc3M9XCJmYSBmYS1iYXJzIGluLXBhZ2UtYmFycy1pY29uIGN1cnNvci1tb3ZlXCIgY2RrRHJhZ0hhbmRsZT48L2k+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDwhLS0gU3VidGl0bGVzIC0tPlxuICAgICAgICA8ZGl2IGNka0Ryb3BMaXN0IChjZGtEcm9wTGlzdERyb3BwZWQpPVwiZHJvcFN1YnRpdGxlcyhpLCAkZXZlbnQpXCI+XG4gICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgc3ViIG9mIGZvb3Rlci5zdWJ0aXRsZXM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInJvdyBib3JkZXIgcC0zIG1iLTIgYWxpZ24taXRlbXMtY2VudGVyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3VidGl0bGVUaXRsZXt7aX19e3tqfX1cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5TdWJ0aXRsZSBUaXRsZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDxpbnB1dCBpZD1cInN1YnRpdGxlVGl0bGV7e2l9fXt7an19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN1Yi50aXRsZVwiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNVwiPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic3VidGl0bGVQYXRoe3tpfX17e2p9fVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPlN1YnRpdGxlIFBhdGg8L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJzdWJ0aXRsZVBhdGh7e2l9fXt7an19XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN1Yi5wYXRoXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIGluLXBhZ2UtdHJhc2gtaWNvbiB0ZXh0LWRhbmdlciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVTdWJ0aXRsZShpLCBqKVwiIChrZXlkb3duLmVudGVyKT1cInJlbW92ZVN1YnRpdGxlKGksIGopXCIgKGtleWRvd24uc3BhY2UpPVwicmVtb3ZlU3VidGl0bGUoaSwgailcIj48L2k+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFycyBjdXJzb3ItbW92ZSBpbi1wYWdlLWJhcnMtaWNvblwiIGNka0RyYWdIYW5kbGU+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gbXQtMlwiIChjbGljayk9XCJhZGRTdWJ0aXRsZShpKVwiPlxuICAgICAgICAgICsgQWRkIFN1YnRpdGxlXG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTNcIiAoY2xpY2spPVwiYWRkRm9vdGVyTGluaygpXCI+XG4gICAgICArIEFkZCBGb290ZXIgTGlua1xuICAgIDwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc2Vjb25kYXJ5XCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPkNhbmNlbDwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2F2ZUZvb3RlckxpbmtzKG1vZGFsKVwiPlNhdmU8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cblxuXG5cbjxuZy10ZW1wbGF0ZSAjbG9nb01vZGFsIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+VXBsb2FkIExvZ288L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8cHctY3VzdG9tLXVwbG9hZGVyXG4gICAgICBbYXNwZWN0UmF0aW9dPVwiJ2Z1bGxMb2dvJ1wiXG4gICAgICBbdGl0bGVdPVwiJ01haW4gQ29udHJhc3QgTG9nbydcIlxuICAgICAgW2NvbnRyb2xOYW1lXT1cIidsb2dvX21haW5fY29udHJhc3QnXCJcbiAgICAgIFtwcmV2aWV3RGF0YV09XCJwcmV2aWV3RGF0YVwiXG4gICAgICAoc2F2ZUV2ZW50KT1cIm9uU2F2ZUZpbGUoJGV2ZW50KVwiPlxuICAgIDwvcHctY3VzdG9tLXVwbG9hZGVyPlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+XG5cblxuXG48bmctdGVtcGxhdGUgI2h1YnNwb3RFZGl0TW9kYWwgbGV0LW1vZGFsPlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyXCI+XG4gICAgPGg1IGNsYXNzPVwibW9kYWwtdGl0bGVcIj5FZGl0IEh1YnNwb3QgRW1iZWQ8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImh1YnNwb3RJZFwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkh1YnNwb3QgSUQ8L2xhYmVsPlxuICAgICAgPGlucHV0IGlkPVwiaHVic3BvdElkXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nSHVic3BvdElkXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJtYi0zXCI+XG4gICAgICA8bGFiZWwgZm9yPVwiaHVic3BvdEVtYmVkRGl2XCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+RW1iZWQgRElWPC9sYWJlbD5cbiAgICAgIDx0ZXh0YXJlYSBpZD1cImh1YnNwb3RFbWJlZERpdlwiIFsobmdNb2RlbCldPVwiZWRpdGluZ0h1YnNwb3RIdG1sXCIgcm93cz1cIjhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiPjwvdGV4dGFyZWE+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlSHVic3BvdEh0bWwobW9kYWwpXCI+U2F2ZTwvYnV0dG9uPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJtb2RhbC5kaXNtaXNzKClcIj5DYW5jZWw8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cbjxuZy10ZW1wbGF0ZSAjc29jaWFsRWRpdE1vZGFsIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RWRpdCBTb2NpYWwgTGlua3MgJiBDb21wYW55IE5hbWU8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWJvZHlcIj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cInlvdXR1YmVVcmxcIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5Zb3VUdWJlIFVSTDwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJ5b3V0dWJlVXJsXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nWW91dHViZVVybFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgLz5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwibWItM1wiPlxuICAgICAgPGxhYmVsIGZvcj1cImxpbmtlZGluVXJsXCIgY2xhc3M9XCJmb3JtLWxhYmVsXCI+TGlua2VkSW4gVVJMPC9sYWJlbD5cbiAgICAgIDxpbnB1dCBpZD1cImxpbmtlZGluVXJsXCIgWyhuZ01vZGVsKV09XCJlZGl0aW5nTGlua2VkSW5VcmxcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIC8+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm1iLTNcIj5cbiAgICAgIDxsYWJlbCBmb3I9XCJjb21wYW55TmFtZVwiIGNsYXNzPVwiZm9ybS1sYWJlbFwiPkNvbXBhbnkgTmFtZTwvbGFiZWw+XG4gICAgICA8aW5wdXQgaWQ9XCJjb21wYW55TmFtZVwiIFsobmdNb2RlbCldPVwiZWRpdGluZ0NvbXBhbnlOYW1lXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiAvPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWZvb3RlclwiPlxuICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2F2ZVNvY2lhbExpbmtzKG1vZGFsKVwiPlNhdmU8L2J1dHRvbj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+Q2FuY2VsPC9idXR0b24+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT5cblxuXG5cbjxuZy10ZW1wbGF0ZSAjcXVlc3Rpb25zRWRpdE1vZGFsIGxldC1tb2RhbD5cbiAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+RWRpdCBRdWVzdGlvbnM8L2g1PlxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuLWNsb3NlXCIgYXJpYS1sYWJlbD1cIkNsb3NlXCIgKGNsaWNrKT1cIm1vZGFsLmRpc21pc3MoKVwiPjwvYnV0dG9uPlxuICA8L2Rpdj5cblxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPlxuICAgIDxoNCBjbGFzcz1cIm1iLTNcIj5RdWVzdGlvbnMgU2VjdGlvbjwvaDQ+XG4gICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BRdWVzdGlvbnMoJGV2ZW50KVwiPlxuICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgcSBvZiBlZGl0aW5nUXVlc3Rpb25zOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJib3JkZXIgcC0zIG1iLTNcIiBjZGtEcmFnPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMSBtYi0yXCI+XG4gICAgICAgICAgICA8bGFiZWwgZm9yPVwicXVlc3Rpb25UZXh0e3tpfX1cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5RdWVzdGlvbjwvbGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgaWQ9XCJxdWVzdGlvblRleHR7e2l9fVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJxLnF1ZXN0aW9uXCIgcGxhY2Vob2xkZXI9XCJFbnRlciBxdWVzdGlvblwiIC8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIGFsaWduLWl0ZW1zLXN0YXJ0IG10LTRcIj5cbiAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFycyBpbi1wYWdlLWJhcnMtaWNvbiBjdXJzb3ItbW92ZVwiIGNka0RyYWdIYW5kbGU+PC9pPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cblxuICAgICAgICA8IS0tIE9wdGlvbnMgU2VjdGlvbiAtLT5cbiAgICAgICAgPGRpdiBjZGtEcm9wTGlzdCAoY2RrRHJvcExpc3REcm9wcGVkKT1cImRyb3BRdWVzdGlvbk9wdGlvbnMoaSwgJGV2ZW50KVwiPlxuICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IG9wdCBvZiBxLm9wdGlvbnM7IGxldCBqID0gaW5kZXhcIiBjbGFzcz1cInJvdyBib3JkZXIgcC0zIG1iLTIgYWxpZ24taXRlbXMtY2VudGVyXCIgY2RrRHJhZz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNyBtYi0yXCI+XG4gICAgICAgICAgICAgIDxsYWJlbCBmb3I9XCJxdWVzdGlvbk9wdGlvbnt7aX19e3tqfX1cIiBjbGFzcz1cImZvcm0tbGFiZWxcIj5PcHRpb248L2xhYmVsPlxuICAgICAgICAgICAgICA8aW5wdXQgaWQ9XCJxdWVzdGlvbk9wdGlvbnt7aX19e3tqfX1cIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwib3B0Lm9wdGlvblwiIHBsYWNlaG9sZGVyPVwiRW50ZXIgb3B0aW9uXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yIGQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBhbGlnbi1pdGVtcy1jZW50ZXIgbXQtNFwiPlxuICAgICAgICAgICAgICA8aSBjbGFzcz1cImZhIGZhLXRyYXNoIGluLXBhZ2UtdHJhc2gtaWNvbiB0ZXh0LWRhbmdlciBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJyZW1vdmVRdWVzdGlvbk9wdGlvbihpLCBqKVwiIChrZXlkb3duLmVudGVyKT1cInJlbW92ZVF1ZXN0aW9uT3B0aW9uKGksIGopXCIgKGtleWRvd24uZW50ZXIpPVwicmVtb3ZlUXVlc3Rpb25PcHRpb24oaSwgailcIj48L2k+XG4gICAgICAgICAgICAgIDxpIGNsYXNzPVwiZmEgZmEtYmFycyBpbi1wYWdlLWJhcnMtaWNvbiBjdXJzb3ItbW92ZVwiIGNka0RyYWdIYW5kbGU+PC9pPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBidG4tc20gbXQtMlwiIChjbGljayk9XCJhZGRRdWVzdGlvbk9wdGlvbihpKVwiPisgQWRkIE9wdGlvbjwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5IG10LTNcIiAoY2xpY2spPVwiYWRkTmV3UXVlc3Rpb24oKVwiPisgQWRkIFF1ZXN0aW9uPC9idXR0b24+XG4gIDwvZGl2PlxuXG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj5cbiAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiAoY2xpY2spPVwibW9kYWwuZGlzbWlzcygpXCI+Q2FuY2VsPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlUXVlc3Rpb25zKG1vZGFsKVwiPlNhdmU8L2J1dHRvbj5cbiAgPC9kaXY+XG48L25nLXRlbXBsYXRlPlxuXG5cblxuIl19
|