@vgroup/dialbox 0.0.18 → 0.0.20
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.
|
@@ -137,57 +137,32 @@ export class DialboxComponent {
|
|
|
137
137
|
// this.callData.img = incomingCallData.customParameters.get('image');
|
|
138
138
|
// this.callData.isIncomingCall = true;
|
|
139
139
|
// }
|
|
140
|
-
// if (incomingCallData) {
|
|
141
|
-
// if (this.isCallInProgress) {
|
|
142
|
-
// this.newIncomingCalls.push(incomingCallData);
|
|
143
|
-
// this.getUserInformation(incomingCallData);
|
|
144
|
-
// } else {
|
|
145
|
-
// this.isCallInProgress = true;
|
|
146
|
-
// this.isDialpadHidden = false;
|
|
147
|
-
// this.callData.phone = (incomingCallData.parameters as any).From;
|
|
148
|
-
// this.getUserInformation(incomingCallData);
|
|
149
|
-
// this.callData.name = incomingCallData.customParameters.get('name');
|
|
150
|
-
// this.callData.img = incomingCallData.customParameters.get('image') || 'assets/images/user.jpg';
|
|
151
|
-
// this.callData.isIncomingCall = true;
|
|
152
|
-
// }
|
|
153
|
-
// incomingCallData.on('cancel', () => {
|
|
154
|
-
// this.incomingCallsList = this.incomingCallsList.filter((item: any) => item.parameters.CallSid !== (incomingCallData.parameters as any).CallSid);
|
|
155
|
-
// if(this.incomingCallsList.length == 0){
|
|
156
|
-
// this.isCallInProgress = false;
|
|
157
|
-
// }
|
|
158
|
-
// });
|
|
159
|
-
// incomingCallData.on('disconnect', () => {
|
|
160
|
-
// this.incomingCallsList = this.incomingCallsList.filter((item: any) => item.parameters.CallSid !== (incomingCallData.parameters as any).CallSid);
|
|
161
|
-
// if(this.incomingCallsList.length == 0){
|
|
162
|
-
// this.isCallInProgress = false;
|
|
163
|
-
// }
|
|
164
|
-
// });
|
|
165
|
-
// }
|
|
166
|
-
console.log('Incoming call received:', incomingCallData);
|
|
167
|
-
console.log('Current isCallInProgress:', this.isCallInProgress);
|
|
168
140
|
if (incomingCallData) {
|
|
169
|
-
console.log('Call parameters:', incomingCallData.parameters);
|
|
170
|
-
console.log('Call custom parameters:', incomingCallData.customParameters);
|
|
171
141
|
if (this.isCallInProgress) {
|
|
172
|
-
console.log('Call in progress, adding to queue');
|
|
173
142
|
this.newIncomingCalls.push(incomingCallData);
|
|
174
|
-
this.incomingCallsList = [...this.incomingCallsList, incomingCallData];
|
|
175
|
-
console.log('Updated incomingCallsList:', this.incomingCallsList);
|
|
176
|
-
this.incomingCallsNewInfoEvent.emit(this.incomingCallsList);
|
|
177
143
|
this.getUserInformation(incomingCallData);
|
|
178
144
|
}
|
|
179
145
|
else {
|
|
180
|
-
console.log('No call in progress, showing incoming call UI');
|
|
181
146
|
this.isCallInProgress = true;
|
|
182
147
|
this.isDialpadHidden = false;
|
|
183
|
-
this.callData.phone = incomingCallData.parameters
|
|
184
|
-
this.
|
|
185
|
-
this.callData.
|
|
148
|
+
this.callData.phone = incomingCallData.parameters?.From;
|
|
149
|
+
this.getUserInformation(incomingCallData);
|
|
150
|
+
this.callData.name = incomingCallData.customParameters?.get('name');
|
|
151
|
+
this.callData.img = incomingCallData.customParameters?.get('image') || 'assets/images/user.jpg';
|
|
186
152
|
this.callData.isIncomingCall = true;
|
|
187
|
-
this.incomingCallsList = [incomingCallData];
|
|
188
|
-
console.log('Setting up first call in incomingCallsList:', this.incomingCallsList);
|
|
189
|
-
this.incomingCallsNewInfoEvent.emit(this.incomingCallsList);
|
|
190
153
|
}
|
|
154
|
+
incomingCallData.on('cancel', () => {
|
|
155
|
+
this.incomingCallsList = this.incomingCallsList.filter((item) => item.parameters.CallSid !== incomingCallData.parameters?.CallSid);
|
|
156
|
+
if (this.incomingCallsList.length == 0) {
|
|
157
|
+
this.isCallInProgress = false;
|
|
158
|
+
}
|
|
159
|
+
});
|
|
160
|
+
incomingCallData.on('disconnect', () => {
|
|
161
|
+
this.incomingCallsList = this.incomingCallsList.filter((item) => item.parameters.CallSid !== incomingCallData.parameters?.CallSid);
|
|
162
|
+
if (this.incomingCallsList.length == 0) {
|
|
163
|
+
this.isCallInProgress = false;
|
|
164
|
+
}
|
|
165
|
+
});
|
|
191
166
|
}
|
|
192
167
|
});
|
|
193
168
|
this.subscriptions.add(sub1);
|
|
@@ -224,6 +199,50 @@ export class DialboxComponent {
|
|
|
224
199
|
}, 0);
|
|
225
200
|
}
|
|
226
201
|
}
|
|
202
|
+
// private registerDragElement() {
|
|
203
|
+
// try {
|
|
204
|
+
// const elmnt = document.getElementById('dragparent1');
|
|
205
|
+
// let pos1 = 0, pos2 = 0, pos3 = 0, pos4 = 0;
|
|
206
|
+
// const dragMouseDown = (e: any) => {
|
|
207
|
+
// // If the target is an input, return and don't initiate dragging
|
|
208
|
+
// if (e.target.tagName.toLowerCase() === 'input') {
|
|
209
|
+
// return;
|
|
210
|
+
// }
|
|
211
|
+
// e = e || window.event;
|
|
212
|
+
// // get the mouse cursor position at startup:
|
|
213
|
+
// pos3 = e.clientX;
|
|
214
|
+
// pos4 = e.clientY;
|
|
215
|
+
// document.onmouseup = closeDragElement;
|
|
216
|
+
// // call a function whenever the cursor moves:
|
|
217
|
+
// document.onmousemove = elementDrag;
|
|
218
|
+
// };
|
|
219
|
+
// const elementDrag = (e: any) => {
|
|
220
|
+
// e = e || window.event;
|
|
221
|
+
// // calculate the new cursor position:
|
|
222
|
+
// pos1 = pos3 - e.clientX;
|
|
223
|
+
// pos2 = pos4 - e.clientY;
|
|
224
|
+
// pos3 = e.clientX;
|
|
225
|
+
// pos4 = e.clientY;
|
|
226
|
+
// // set the element's new position:
|
|
227
|
+
// elmnt.style.top = elmnt.offsetTop - pos2 + 'px';
|
|
228
|
+
// elmnt.style.left = elmnt.offsetLeft - pos1 + 'px';
|
|
229
|
+
// };
|
|
230
|
+
// const closeDragElement = () => {
|
|
231
|
+
// /* stop moving when mouse button is released:*/
|
|
232
|
+
// document.onmouseup = null;
|
|
233
|
+
// document.onmousemove = null;
|
|
234
|
+
// };
|
|
235
|
+
// if (document.getElementById(elmnt.id + 'header')) {
|
|
236
|
+
// /* if present, the header is where you move the DIV from:*/
|
|
237
|
+
// document.getElementById(elmnt.id + 'header').onmousedown = dragMouseDown;
|
|
238
|
+
// } else {
|
|
239
|
+
// /* otherwise, move the DIV from anywhere inside the DIV:*/
|
|
240
|
+
// elmnt.onmousedown = dragMouseDown;
|
|
241
|
+
// }
|
|
242
|
+
// } catch (e) {
|
|
243
|
+
// console.log(e)
|
|
244
|
+
// }
|
|
245
|
+
// }
|
|
227
246
|
registerDragElement() {
|
|
228
247
|
try {
|
|
229
248
|
const elmnt = document.getElementById('dragparent1');
|
|
@@ -740,7 +759,7 @@ export class DialboxComponent {
|
|
|
740
759
|
}
|
|
741
760
|
}
|
|
742
761
|
saveLastDialed() {
|
|
743
|
-
const contact = this.filteredContactList.find(
|
|
762
|
+
const contact = this.filteredContactList.find(c => c.numbersList.some((n) => n.number === this.dialedNumber));
|
|
744
763
|
if (contact) {
|
|
745
764
|
this.lastDialed = {
|
|
746
765
|
name: contact.name,
|
|
@@ -970,10 +989,10 @@ export class DialboxComponent {
|
|
|
970
989
|
}
|
|
971
990
|
}
|
|
972
991
|
DialboxComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, deps: [{ token: i1.TwilioService }, { token: i2.ExtensionService }, { token: i3.MatDialog }, { token: i4.IpAddressService }, { token: i2.ExtensionService }, { token: i5.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
973
|
-
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { isDialpadHidden: "isDialpadHidden" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", numberDialed: "numberDialed" }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div>\r\n msssmsm\r\n</div>\r\n\r\n<div *ngIf=\"callData\">\r\n <p>Call Data: {{ callData | json }}</p>\r\n <p>Incoming Calls: {{ incomingCallsList?.length || 0 }}</p>\r\n</div>\r\n<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <lib-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent)=\"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\">\r\n </lib-call-progress> -->\r\n\r\n\r\n\r\n\r\n\r\n <lib-call-progress\r\n *ngIf=\"isCallInProgress\"\r\n [callData]=\"callData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\">\r\n <div>Debug: {{ incomingCallsList?.length || 0 }} incoming calls</div>\r\n\r\n</lib-call-progress>\r\n\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.CallProgressComponent, selector: "lib-call-progress", inputs: ["callData", "newIncomingCallData", "newIncomingCallsList"], outputs: ["endCallEvent", "incomingCallsNewInfo", "minimiseEvent", "incomingCallInitiated"] }, { kind: "pipe", type: i6.JsonPipe, name: "json" }] });
|
|
992
|
+
DialboxComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.10", type: DialboxComponent, selector: "lib-dialbox", inputs: { isDialpadHidden: "isDialpadHidden" }, outputs: { closeDialpadEvent: "closeDialpadEvent", callInitiated: "callInitiated", endCallEvent: "endCallEvent", minimiseEvent: "minimiseEvent", incomingCallsNewInfoEvent: "incomingCallsNewInfoEvent", incomingCallInitiated: "incomingCallInitiated", numberDialed: "numberDialed" }, viewQueries: [{ propertyName: "dialInputElement", first: true, predicate: ["dialInput"], descendants: true }], usesOnChanges: true, ngImport: i0, template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <lib-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></lib-call-progress>\r\n \r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"], dependencies: [{ kind: "directive", type: i6.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i6.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i6.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i6.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i7.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: i7.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i7.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i8.CallProgressComponent, selector: "lib-call-progress", inputs: ["callData", "newIncomingCallData", "newIncomingCallsList"], outputs: ["endCallEvent", "incomingCallsNewInfo", "minimiseEvent", "incomingCallInitiated"] }] });
|
|
974
993
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImport: i0, type: DialboxComponent, decorators: [{
|
|
975
994
|
type: Component,
|
|
976
|
-
args: [{ selector: 'lib-dialbox', template: "<div>\r\n msssmsm\r\n</div>\r\n\r\n<div *ngIf=\"callData\">\r\n <p>Call Data: {{ callData | json }}</p>\r\n <p>Incoming Calls: {{ incomingCallsList?.length || 0 }}</p>\r\n</div>\r\n<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <!-- <lib-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent)=\"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\">\r\n </lib-call-progress> -->\r\n\r\n\r\n\r\n\r\n\r\n <lib-call-progress\r\n *ngIf=\"isCallInProgress\"\r\n [callData]=\"callData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\">\r\n <div>Debug: {{ incomingCallsList?.length || 0 }} incoming calls</div>\r\n\r\n</lib-call-progress>\r\n\r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"] }]
|
|
995
|
+
args: [{ selector: 'lib-dialbox', template: "<div id=\"dragparent1\" [ngStyle]=\"{'display':isDialpadHidden ? 'none': 'block'}\">\r\n <lib-call-progress *ngIf=\"isCallInProgress\"\r\n (endCallEvent)=\"endCall()\"\r\n (minimiseEvent) = \"onMinimise($event)\"\r\n (incomingCallInitiated)=\"newIncomingCallInitiated()\"\r\n [newIncomingCallData]=\"newIncomingCallData\"\r\n [newIncomingCallsList]=\"incomingCallsList\"\r\n (incomingCallsNewInfo)=\"incomingCallsNewInfo($event)\"\r\n [callData]=\"callData\"></lib-call-progress>\r\n \r\n <div class=\"dialpad-container\" [ngClass]=\"{'mini-dialpad': isMinimised}\" tabindex=\"0\" (keydown)=\"handleDivKeydown($event)\">\r\n <div id=\"topPanel\" [ngStyle]=\"{'height': callerIdList.length ? '40%' : '39%'}\">\r\n <div class=\"dialpad-alerts\" *ngIf=\"dialAlert.show\">\r\n <div class=\"no-selection-alert\">\r\n <!-- <p class=\"mb-0\">Select C2C number to call</p> -->\r\n <p class=\"mb-0\">{{dialAlert.msg}}</p>\r\n <span class=\"fa fa-times\" (click)=\"shakeDedicatedBtn = false\"></span>\r\n </div>\r\n </div>\r\n <div class=\"dialpad-alerts\" *ngIf=\"callNumberToast.show\">\r\n <div class=\"dialbox-pop1 alert fade show\" [ngClass]=\"callNumberToast.type\" role=\"alert\">\r\n <div class=\"d-flex justify-content-between\">\r\n <div class=\"flex-grow-1 my-auto text-left\">\r\n You'r calling <strong>{{callNumberToast.displayNum}}</strong>\r\n </div>\r\n <div class=\"text-right\">\r\n <button class=\"btn btn-link btn-disc p-0 px-1\" (click)=\"cancelDialNumber()\">Cancel Call</button>\r\n <!-- <button class=\"btn btn-link btn-success btn-disc p-0 px-2\">Continue</button> -->\r\n </div>\r\n \r\n </div>\r\n </div>\r\n </div>\r\n <div style=\"padding: 0 18px\" (paste)=\"handleNumberPaste($event)\">\r\n <div class=\"d-flex justify-content-between mt-2\">\r\n <p></p>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"hideDialpad()\">\r\n <svg xmlns=\"http://www.w3.org/2000/svg\" height=\"24px\" viewBox=\"0 -960 960 960\" width=\"24px\" fill=\"#ffffff\"><path d=\"m256-200-56-56 224-224-224-224 56-56 224 224 224-224 56 56-224 224 224 224-56 56-224-224-224 224Z\"/></svg>\r\n </span>\r\n </div>\r\n <div class=\"input-box\">\r\n <input type=\"text\" #dialInput placeholder=\"Enter a name or number\" tabindex=\"1\" [(ngModel)]=\"dialedNumber\" (ngModelChange)=\"onDialInputChange($event)\"/>\r\n <span class=\"\" id=\"input-clear-btn\" (click)=\"clearInput()\" *ngIf=\"showInputClearBtn\">\r\n <svg width=\"50px\" height=\"30px\" viewBox=\"0 10 40 60\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" version=\"1.1\" baseProfile=\"full\" enable-background=\"new 0 0 76.00 76.00\" xml:space=\"preserve\">\r\n <path fill=\"#5d6061\" fill-opacity=\"1\" stroke-width=\"0.2\" stroke-linejoin=\"round\" d=\"M 47.5282,42.9497L 42.5784,38L 47.5282,33.0502L 44.9497,30.4718L 40,35.4216L 35.0502,30.4718L 32.4718,33.0502L 37.4216,38L 32.4718,42.9497L 35.0502,45.5282L 40,40.5784L 44.9497,45.5282L 47.5282,42.9497 Z M 18.0147,41.5355L 26.9646,50.4854C 28.0683,51.589 29,52 31,52L 52,52C 54.7614,52 57,49.7614 57,47L 57,29C 57,26.2386 54.7614,24 52,24L 31,24C 29,24 28.0683,24.4113 26.9646,25.5149L 18.0147,34.4645C 16.0621,36.4171 16.0621,39.5829 18.0147,41.5355 Z M 31,49C 30,49 29.6048,48.8828 29.086,48.3641L 20.1361,39.4142C 19.355,38.6332 19.355,37.3669 20.1361,36.5858L 29.086,27.6362C 29.6048,27.1175 30,27 31,27.0001L 52,27.0001C 53.1046,27.0001 54,27.8955 54,29.0001L 54,47.0001C 54,48.1046 53.1046,49.0001 52,49.0001L 31,49 Z \"/>\r\n </svg> \r\n </span>\r\n <span class=\"input-info-icon\" placement=\"bottom-right\" tooltipClass=\"input-tooltip\" ngbTooltip=\"For extension dialing, use formats like +12345678910 x123,+12345678910 ext.123, +12345678910,123\"><i class=\"fa fa-info-circle\"></i></span>\r\n </div>\r\n <div class=\"guide\" *ngIf=\"callerIdList.length && !(dialedNumber.length > 2)\">\r\n <span class=\"guidetext\">Please enter a number or select a saved contact</span>\r\n </div>\r\n <!-- <div class=\"input-error\" *ngIf=\"dialAlert.show\">\r\n <span>{{dialAlert.msg}}</span>\r\n </div> -->\r\n <div>\r\n <div class=\"contact-card\" *ngFor=\"let contact of filteredContactList\" (click)=\"onContactSelect(contact)\">\r\n <div class=\"contact-img\">\r\n <img [src]=\"contact.image\" alt=\"user image\" loading=\"lazy\" *ngIf=\"contact.image else alphaName\"/>\r\n <ng-template #alphaName>\r\n <span class=\"contact-alpha-img\">{{getFirstLetter(contact.firstName)}}</span>\r\n </ng-template>\r\n </div>\r\n <div class=\"contact-details\">\r\n <p style=\"margin-bottom: 4px\" class=\"contact-name\">{{getFullName(contact) }}</p>\r\n <p>{{contact.numbersList[0].number}}</p>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"wave-container\">\r\n <svg\r\n class=\"waves\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\r\n viewBox=\"0 24 150 28\"\r\n preserveAspectRatio=\"none\"\r\n shape-rendering=\"auto\"\r\n >\r\n <defs>\r\n <path\r\n id=\"gentle-wave\"\r\n d=\"M-160 44c30 0 58-18 88-18s 58 18 88 18 58-18 88-18 58 18 88 18 v44h-352z\"\r\n />\r\n </defs>\r\n <g class=\"parallax\">\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"0\"\r\n fill=\"rgba(255,255,255,0.7)\"\r\n />\r\n <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"3\"\r\n fill=\"rgba(255,255,255,0.5)\"\r\n />\r\n <!-- <use\r\n xlink:href=\"#gentle-wave\"\r\n x=\"48\"\r\n y=\"5\"\r\n fill=\"rgba(255,255,255,0.3)\"\r\n /> -->\r\n <use xlink:href=\"#gentle-wave\" x=\"48\" y=\"7\" fill=\"#fff\" />\r\n </g>\r\n </svg>\r\n </div>\r\n </div>\r\n <div class=\"btn-container\" *ngIf=\"!isMinimised\">\r\n <button class=\"dial-btn\" *ngFor=\"let key of keypadVal;let i = index\"\r\n (keydown.enter)=\"onEnter(key.num)\" (click)=\"addNumber(key.num)\"\r\n [ngStyle]=\"{'margin-top': key.text === '+' ? '3px' : '0'}\"\r\n [tabindex]=\"dialedNumber.length ? '0': i+2\" longPress (longPress)=\"addNumber(key.text)\" shortPress (shortPress)=\"addNumber(key.num)\">\r\n {{key.num}} \r\n <span *ngIf=\"key.num == 1;else otherThanOne\" class=\"material-symbols-outlined voicemail\">\r\n voicemail\r\n </span>\r\n <ng-template #otherThanOne>\r\n <span class=\"btn-albhabets\" [ngClass]=\"{'plusSign': key.text === '+'}\">{{key.text ? key.text : ' '}}</span>\r\n </ng-template>\r\n </button>\r\n </div>\r\n <div class=\"call-btn-container\" *ngIf=\"!isMinimised\" (mouseenter)=\"onCallBtnMouseEnter($event)\" (mouseleave)=\"onCallBtnMouseLeave($event)\">\r\n <div class=\"call-btn\" (click)=\"initiateCall()\" [tabindex]=\"dialedNumber.length ? '2': '15'\"\r\n [ngStyle]=\"{'pointer-events': dialedNumber.length && selectedCallerId ? 'auto' : 'none', 'opacity': dialedNumber.length && selectedCallerId ? '1' : '0.5'}\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </div>\r\n </div>\r\n <div *ngIf=\"callerIdList.length && !isMinimised\" class=\"position-relative\">\r\n <div class=\"shownCallerId\" *ngIf=\"selectedCallerId; else askBlock\" (click)=\"toggleCallerIdDiv()\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + selectedCallerId?.isoCode?.toLowerCase()\"></span>\r\n {{selectedCallerId?.number}}\r\n </div>\r\n </div>\r\n <ng-template #askBlock>\r\n <div class=\"shownCallerId\" (click)=\"toggleCallerIdDiv()\" [ngClass]=\"{ 'tilt-shaking': shakeDedicatedBtn }\">\r\n <div class=\"d-flex justify-content-center\">\r\n <h5 class=\"mb-0\">Select C2C number</h5>\r\n <!-- <span class=\"ml-2\" style=\"opacity:.8;margin-top:2px\">\r\n <img src=\"assets/images/icon_down_arrow.svg\" alt=\"down\" width=\"10px\">\r\n </span> -->\r\n <span class=\"fa fa-angle-down ml-2 text-blue\" style=\"margin-top:2px\"></span>\r\n </div>\r\n </div>\r\n </ng-template>\r\n <div class=\"guide2\" *ngIf=\"shakeDedicatedBtn\">\r\n <span class=\"guidetext\">Please select a number from below dropdown</span>\r\n </div>\r\n </div>\r\n\r\n <div *ngIf=\"callerIdList.length; else noCallerIdMessage\">\r\n <div class=\"caller-id-list-container\" *ngIf=\"callerIdList.length && !isMinimised\" id=\"callerIdContainer\" [ngClass]=\"{'visible': !isCallerIdHidden}\" >\r\n <div style=\"display: flex; justify-content: space-between\">\r\n <!-- <h4>Select C2C Softphone Number</h4> -->\r\n <h4>Make outgoing call using</h4>\r\n <span\r\n class=\"material-symbols-outlined\"\r\n style=\"cursor: pointer\"\r\n (click)=\"isCallerIdHidden = true\"\r\n >\r\n close\r\n </span>\r\n </div>\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"onDedicatedNumSelect(callerId)\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n <ng-template #noCallerIdMessage>\r\n <span class=\"no-caller-id-message\">To make any voice calls, please <a routerLink=\"/extension/dedicatednumber/{{token}}\" class=\"click-here-link\" title=\"Settings > C2C Number\">subscribe</a> to a voice capable C2C Number.\r\n </span>\r\n </ng-template>\r\n <div class=\"dedicated-overlay\" *ngIf=\"showDedicatedPopup\">\r\n <div class=\"card dedicatedNumPopup\">\r\n <div class=\"card-header chooseDedicatedHeader\">\r\n <h5>Choose C2C Number</h5>\r\n <span class=\"material-symbols-outlined dial-close-btn\" (click)=\"showDedicatedPopup = false\">close</span>\r\n </div>\r\n <div class=\"card-body dedicatedNumList\">\r\n <ul>\r\n <ng-container *ngFor=\"let callerId of callerIdList\">\r\n <li [ngClass]=\"{'selectedCallerIdClass': callerId?.number == selectedCallerId?.number}\" (click)=\"showDedicatedPopup = false\">\r\n <div>\r\n <span [ngClass]=\"'fi fi-' + callerId?.isoCode?.toLowerCase()\"></span>\r\n {{callerId?.number}}\r\n </div>\r\n <span>{{callerId?.countryName}}</span>\r\n </li>\r\n </ng-container>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"incoming-call-widget\" *ngFor=\"let call of newIncomingCalls;let i = index\" [ngStyle]=\"{'top': (30 + i * 72) + 'px'}\">\r\n <div>\r\n <div class=\"inc-user-img\">\r\n <img src=\"assets/images/user.jpg\" alt=\"user image\">\r\n </div>\r\n \r\n </div>\r\n <div class=\"flex-grow-1\">\r\n <!-- <h6 class=\"mb-1 font-weight-bold\">Incoming Call</h6> -->\r\n <p class=\"inc-user-name\">{{call.customParameters.get('name')}}</p>\r\n <p>{{call.parameters.From}}</p>\r\n\r\n <!-- <p class=\"inc-user-name\">John Doe</p> \r\n <p>+12337472489</p>\r\n <p style=\"font-size: 12px;color:#d5d5d5 !important;margin-top:2px\">Call on +12264584100</p> -->\r\n\r\n </div>\r\n <div class=\"d-flex\">\r\n <button class=\"inc-call-btn inc-accept-btn mr-2\" (click)=\"acceptNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call\r\n </span>\r\n </button>\r\n <button class=\"inc-call-btn inc-reject-btn\" (click)=\"rejectNewIncomingCall(call)\">\r\n <span class=\"material-symbols-outlined\" style=\"color: white\">\r\n call_end\r\n </span>\r\n </button>\r\n </div>\r\n \r\n </div>\r\n </div>\r\n</div>\r\n", styles: ["#dragparent1{position:fixed;left:100px;z-index:9999999;font-family:Lato,sans-serif;display:none}.dialpad-container{width:320px;height:600px;background:white;margin:auto;border-radius:30px;box-shadow:#00000040 0 54px 55px,#0000001f 0 -12px 30px,#0000001f 0 4px 6px,#0000002b 0 12px 13px,#00000017 0 -3px 5px;display:flex;flex-direction:column;box-sizing:border-box;position:relative;line-height:1.1}.dialpad-alerts{position:absolute;width:calc(100% - 28px);left:14px;top:8px;z-index:1200}.btn-disc{font-size:12px}.dialbox-pop1{font-size:.8rem;z-index:9;padding:8px}.input-error>span{color:#dfdfdf;margin-bottom:2px}.dial-close-btn{cursor:pointer;opacity:.6}.dial-close-btn:hover{opacity:1}.btn-container{display:flex;flex-wrap:wrap;padding:0 18px}.dial-btn{width:50px;height:50px;background-color:#fff;border-radius:4px;text-align:center;box-sizing:border-box;margin:4px 22px;font-size:28px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-family:Lato,sans-serif;font-weight:900;font-style:normal;color:#2b434d;cursor:pointer;opacity:.8;border:none}.dial-btn:hover{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:focus{opacity:1;box-shadow:#00000026 0 2px 8px}.dial-btn:active{box-shadow:#32325d40 0 30px 60px -12px inset,#0000004d 0 18px 36px -18px inset}.call-btn-container{display:flex;margin-top:8px;justify-content:center;position:relative}.call-btn{display:flex;align-items:center;justify-content:center;width:54px;height:54px;border-radius:27px;background-color:#2ecc71;outline:none;border:none;box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;opacity:.8;cursor:pointer}.call-btn:hover{opacity:1}.call-btn:focus{opacity:1}.caller-id-list-container{width:100%;height:auto;position:absolute;bottom:-100%;left:0;border-radius:0 0 30px 30px/0px 0px 30px 30px;padding:8px 12px 32px;box-sizing:border-box;color:#8a8a8a}.visible{animation:slideUp .8s forwards}#callerIdContainer ul{list-style:none;padding-left:0;margin:0}.dialpad-container h4{font-family:Lato,sans-serif;margin:0 0 8px}#callerIdContainer ul li{background-color:#fff;padding:8px;margin-top:7px;display:flex;border-radius:4px;justify-content:space-between;font-size:14px;cursor:pointer}.fi{border-radius:2px;margin-right:2px}@keyframes slideUp{0%{bottom:-100%}to{bottom:0}}.selectedCallerIdClass{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026;border:1px solid #e0e0e0;color:#3a3a3a}.toggleBtn{color:gray;border:none;background-color:#e5eef1}.btn-albhabets{font-family:Lato,sans-serif;font-size:12px;font-weight:400}.plusSign{font-weight:600;font-size:14px}.shownCallerId{text-align:center;padding:8px 10px;font-family:Lato,sans-serif;color:#2ecc71;border:1px solid #d7d7d7;background-color:#fff;width:80%;margin:12px auto auto;border-radius:12px;position:relative;cursor:pointer}.input-box{width:100%;background-color:#fff;padding:4px 10px;border:1px solid rgb(197,197,197);box-sizing:border-box;border-radius:24px;margin-top:12px;display:flex;justify-content:space-between}.input-box:focus-within{box-shadow:6px 6px 10px -1px #00000026,-5px -4px 10px -1px #00000026}.input-box input{font-size:18px;padding:8px 6px;width:100%;box-sizing:border-box;border:none;outline:none;font-weight:600;color:#2b434d}.input-box input::placeholder{font-size:16px;font-weight:500}#input-clear-btn{color:gray;display:flex;align-items:center;cursor:pointer}.contact-card{width:100%;height:54px;display:flex;border-radius:12px;overflow:hidden;margin-top:4px;box-shadow:6px 6px 10px -1px #e6eefc26;cursor:pointer;opacity:0;transform:translateY(20px);animation:slideIn .5s forwards}@keyframes slideIn{to{opacity:1;transform:translateY(0)}}.contact-img{width:50px;display:flex;align-items:center;justify-content:center;border-right:1px solid #bebebe;background-color:#fff}.contact-img img{max-width:50px}.contact-alpha-img{width:50px;display:flex;justify-content:center;align-items:center;font-size:38px;font-weight:600}.contact-details{padding:4px 8px;display:flex;flex-direction:column;justify-content:center}.contact-details p{margin:0;line-height:1;color:#fff}.contact-name{font-weight:600}#topPanel{height:39%;position:relative;margin-bottom:4px;padding:0;border-top-right-radius:30px;border-top-left-radius:30px}.wave-container{position:absolute;bottom:2px}.waves{width:320px;position:relative;margin-bottom:-7px;height:31px;min-height:31px}.parallax>use{animation:move-forever 25s cubic-bezier(.55,.5,.45,.5) infinite}.parallax>use:nth-child(1){animation-delay:-2s;animation-duration:7s}.parallax>use:nth-child(2){animation-delay:-3s;animation-duration:10s}.parallax>use:nth-child(3){animation-delay:-4s;animation-duration:13s}.parallax>use:nth-child(4){animation-delay:-5s;animation-duration:20s}@keyframes move-forever{0%{transform:translate3d(-90px,0,0)}to{transform:translate3d(85px,0,0)}}app-call-progress{position:absolute;top:0;left:0;width:100%;height:100%;background-color:transparent;z-index:1000}.mini-dialpad{height:124px!important}.voicemail{line-height:.7;font-size:18px}.dedicated-overlay{position:absolute;width:100%;height:100%;background-color:#2b434d99;display:flex;align-items:center;justify-content:center}.dedicatedNumPopup{width:90%;height:auto;box-sizing:border-box;color:#8a8a8a;background-color:#cbe7df}.chooseDedicatedHeader{padding:.75rem;display:flex;justify-content:space-between}.chooseDedicatedHeader h5{margin-bottom:0}.dedicatedNumList>ul{list-style-type:none;padding:0}.dedicatedNumList>ul li{background-color:#fff;padding:4px;cursor:pointer}@keyframes tilt-shaking{0%{transform:rotate(0)}25%{transform:rotate(5deg)}50%{transform:rotate(0)}75%{transform:rotate(-5deg)}to{transform:rotate(0)}}.tilt-shaking{background-color:#d45858;animation:tilt-shaking .5s infinite;color:#fff}.tilt-shaking h5,.dark .tilt-shaking span,.tilt-shaking span{color:#fff}.no-caller-id-message{display:inline-block;text-align:center;height:10vh;background-color:#fff3cd;color:#000;font-size:.9rem;line-height:1.5;padding:8px}.click-here-link{color:#0f9aee;text-decoration:underline;font-weight:700}.input-info-icon{margin-top:9px;cursor:pointer;color:#2b434d;opacity:.7}::ng-deep .input-tooltip .tooltip-inner{background-color:#000!important}.no-selection-alert{padding:3px 11px;border:1px solid;border-radius:4px;display:flex;justify-content:space-between;color:#721c24;background-color:#f8d7da;border-color:#f5c6cb;align-items:center}.guide{position:relative;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px}.guide:before{content:\"\";position:absolute;top:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-bottom:8px solid #303030}.guide2{position:absolute;top:-32px;left:24px;padding:8px;background-color:#303030;color:#fff;border-radius:8px;margin-top:8px;font-size:12px;pointer-events:none}.guide2:before{content:\"\";position:absolute;bottom:-8px;left:8px;width:0;height:0;border-left:8px solid transparent;border-right:8px solid transparent;border-top:8px solid #303030}.incoming-call-widget{position:absolute;right:-320px;top:30px;width:320px;height:68px;background-color:#3052cd;border-top-right-radius:8px;border-bottom-right-radius:8px;display:flex;align-items:center;padding:4px 12px}.incoming-call-widget h6,.incoming-call-widget p{margin-bottom:0;line-height:1.2;color:#fff}.inc-user-img{width:48px;height:48px;border-radius:50%;overflow:hidden;display:flex;align-items:center;justify-content:center;box-sizing:border-box;margin-right:8px}.inc-user-img img{width:100%}.inc-call-btn{width:40px;height:40px;border-radius:50%;outline:none;border-width:0;display:flex;align-items:center;justify-content:center}.inc-call-btn span{font-size:16px}.inc-accept-btn{background-color:#2ecc71;color:#fff}.inc-reject-btn{background-color:#e14e4e;color:#fff}.inc-user-name{font-weight:600}\n"] }]
|
|
977
996
|
}], ctorParameters: function () { return [{ type: i1.TwilioService }, { type: i2.ExtensionService }, { type: i3.MatDialog }, { type: i4.IpAddressService }, { type: i2.ExtensionService }, { type: i5.Router }]; }, propDecorators: { isDialpadHidden: [{
|
|
978
997
|
type: Input
|
|
979
998
|
}], closeDialpadEvent: [{
|
|
@@ -994,4 +1013,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.10", ngImpo
|
|
|
994
1013
|
}], numberDialed: [{
|
|
995
1014
|
type: Output
|
|
996
1015
|
}] } });
|
|
997
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBRWhMLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUkvQixPQUFtQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQTs7Ozs7Ozs7OztBQVduQyxNQUFNLE9BQU8sZ0JBQWdCO0lBNEQzQixZQUNVLGFBQTRCLEVBQzVCLFVBQTRCLEVBQzVCLE1BQWlCLEVBQ2pCLFNBQTJCLEVBQzNCLGdCQUFrQyxFQUNsQyxNQUFjO1FBTGQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFqRWYsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDaEMsc0JBQWlCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakUsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzRCxpQkFBWSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVELGtCQUFhLEdBQTBCLElBQUksWUFB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VSxnQkFBZ0I7a0dBQWhCLGdCQUFnQixnZ0JDbkI3Qiw4eWFBc1FBOzRGRG5QYSxnQkFBZ0I7a0JBTDVCLFNBQVM7K0JBQ0UsYUFBYTs4T0FLZCxlQUFlO3NCQUF2QixLQUFLO2dCQUNJLGlCQUFpQjtzQkFBMUIsTUFBTTtnQkFDRyxhQUFhO3NCQUF0QixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyx5QkFBeUI7c0JBQWxDLE1BQU07Z0JBQ0cscUJBQXFCO3NCQUE5QixNQUFNO2dCQUNpQixnQkFBZ0I7c0JBQXZDLFNBQVM7dUJBQUMsV0FBVztnQkFHWixZQUFZO3NCQUFyQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWZ0ZXJWaWV3SW5pdCwgQ29tcG9uZW50LCBFbGVtZW50UmVmLCBFdmVudEVtaXR0ZXIsIEhvc3RMaXN0ZW5lciwgSW5wdXQsIE9uQ2hhbmdlcywgT25Jbml0LCBPdXRwdXQsIFNpbXBsZUNoYW5nZXMsIFZpZXdDaGlsZCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFR3aWxpb1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvdHdpbGlvLnNlcnZpY2UnO1xuaW1wb3J0IHN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xuaW1wb3J0IHsgRXh0ZW5zaW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZS9leHRlbnNpb24uc2VydmljZSc7XG5pbXBvcnQgeyBDYWxsZXJJZERpYWxvZ0NvbXBvbmVudCB9IGZyb20gJy4vY29tcG9uZW50cy9jYWxsZXItaWQtZGlhbG9nL2NhbGxlci1pZC1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IE1hdERpYWxvZyB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5pbXBvcnQgcGFyc2VQaG9uZU51bWJlckZyb21TdHJpbmcsIHsgQXNZb3VUeXBlIH0gZnJvbSAnbGlicGhvbmVudW1iZXItanMnO1xuaW1wb3J0IHsga2V5cGFkIH0gZnJvbSAnLi4va2V5cGFkJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnXG5pbXBvcnQgeyBJcEFkZHJlc3NTZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL2lwLWFkZHJlc3Muc2VydmljZSc7XG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgQ2FsbCB9IGZyb20gJ0B0d2lsaW8vdm9pY2Utc2RrJztcblxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbGJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCwgT25DaGFuZ2VzIHtcbiAgQElucHV0KCkgaXNEaWFscGFkSGlkZGVuOiBib29sZWFuID0gZmFsc2U7XG4gIEBPdXRwdXQoKSBjbG9zZURpYWxwYWRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgY2FsbEluaXRpYXRlZDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgpIGVuZENhbGxFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBAT3V0cHV0KCkgbWluaW1pc2VFdmVudDogRXZlbnRFbWl0dGVyPGJvb2xlYW4+ID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsc05ld0luZm9FdmVudDogRXZlbnRFbWl0dGVyPGFueVtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55W10+KCk7XG4gIEBPdXRwdXQoKSBpbmNvbWluZ0NhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQFZpZXdDaGlsZCgnZGlhbElucHV0JykgZGlhbElucHV0RWxlbWVudCE6IEVsZW1lbnRSZWY7XG5cbiAgXG4gIEBPdXRwdXQoKSBudW1iZXJEaWFsZWQgPSBuZXcgRXZlbnRFbWl0dGVyPHN0cmluZz4oKTtcblxuXG4gIGlzQ2FsbEluUHJvZ3Jlc3M6IGJvb2xlYW4gPSBmYWxzZTtcbiAga2V5cGFkVmFsID0ga2V5cGFkO1xuICBcbiAgc2hvd0lucHV0Q2xlYXJCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgZGlhbGVkTnVtYmVyOiBzdHJpbmcgPSAnJztcbiAgY29udGFjdExpc3Q6IGFueVtdID0gW107XG4gIGZpbHRlcmVkQ29udGFjdExpc3Q6IGFueVtdID0gW107XG4gIGNhbGxlcklkTGlzdDogYW55W10gPSBbXTtcbiAgc2VsZWN0ZWRDYWxsZXJJZDogYW55O1xuICBpc0NhbGxlcklkSGlkZGVuOiBib29sZWFuID0gdHJ1ZTtcblxuICBpc1RyaWFsUGVyaW9kT3ZlcjogYm9vbGVhbiA9IGZhbHNlO1xuICBpc1BheW1lbnREdWU6IGJvb2xlYW4gPSBmYWxzZTtcbiAgdGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICB0b2FzdFRpbWVvdXQgPSA3MDAwO1xuICBjYWxsTnVtYmVyVG9hc3QgPSB7XG4gICAgc2hvdzogZmFsc2UsXG4gICAgdHlwZTogJ2FsZXJ0LXN1Y2Nlc3MnLFxuICAgIG51bWJlcjogJycsXG4gICAgZGlzcGxheU51bTogJydcbiAgfVxuICBjYWxsRGF0YTogYW55ID0ge1xuICAgIHBob25lOiAnJyxcbiAgICBkaXNwbGF5TnVtOiAnJyxcbiAgICBkaWFsOiBmYWxzZSxcbiAgICBuYW1lOiAnJyxcbiAgICBpbWc6ICdhc3NldHMvaW1hZ2VzL3VzZXIuanBnJyxcbiAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgZXh0TnVtOicnXG4gIH07XG4gIGxhc3REaWFsZWQ6IHsgbmFtZT86IHN0cmluZzsgaW1hZ2U/OiBzdHJpbmc7IG51bWJlcjogc3RyaW5nIH0gfCBudWxsID0gbnVsbDtcbiAgc2FuaXRpemVkTnVtOiBhbnk7XG4gIGRpYWxBbGVydCA9IHtcbiAgICBtc2c6ICcnLFxuICAgIHNob3c6IGZhbHNlXG4gIH1cbiAgdG9rZW4/OnN0cmluZztcbiBcbiAgc2hvd0RlZGljYXRlZFBvcHVwOmJvb2xlYW4gPSBmYWxzZTtcbiAgbmV3SW5jb21pbmdDYWxsczogYW55ID0gW107XG4gIGluY29taW5nQ2FsbHNMaXN0OiBhbnkgPSBbXTtcbiAgbmV3SW5jb21pbmdDYWxsRGF0YT86Q2FsbDtcbiAgcHJpdmF0ZSBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb24gPSBuZXcgU3Vic2NyaXB0aW9uKCk7XG4gIGNhbGxQcmVmZXJlbmNlOmFueTtcbiAgc2hha2VEZWRpY2F0ZWRCdG46IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNTbWFydERpYWxDYWxsOmJvb2xlYW4gPSBmYWxzZTtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSB0d2lsaW9TZXJ2aWNlOiBUd2lsaW9TZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0U2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIGRpYWxvZzogTWF0RGlhbG9nLFxuICAgIHByaXZhdGUgaXBTZXJ2aWNlOiBJcEFkZHJlc3NTZXJ2aWNlLFxuICAgIHByaXZhdGUgZXh0ZW5zaW9uU2VydmljZTogRXh0ZW5zaW9uU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICApIHsgfVxuXG4gIG5nT25Jbml0KCkge1xuICAgIHRyeXtcbiAgICAgIHRoaXMudG9rZW4gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJykgfHwgJyc7XG4gICAgICAvL3RoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7IFxuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgXG4gICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgY29uc3Qgc3ViMSA9IHRoaXMudHdpbGlvU2VydmljZS5kaWFsTnVtYmVyRnJvbU90aGVyTW9kdWxlLnN1YnNjcmliZSgoY29udGFjdDphbnkpID0+IHtcbiAgICAgICAgaWYgKGNvbnRhY3QubnVtYmVyKSB7XG4gICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSBmYWxzZTtcbiAgICAgICAgICBpZiAoY29udGFjdC5pc0RpYWxGcm9tSGlzdG9yeSkge1xuICAgICAgICAgICAgLy9oYW5kbGUgZGlhbGluZyBmcm9tIGhpc3RvcnkgcGFnZVxuICAgICAgICAgICAgaWYoY29udGFjdC5jYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJyl7XG4gICAgICAgICAgICAgXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHsgbnVtYmVyOiBjb250YWN0LmZyb20gfTtcbiAgICAgICAgICAgICAgdGhpcy5pc1NtYXJ0RGlhbENhbGwgPSB0cnVlO1xuICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICB9LCAyMDAwKTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBjb250YWN0Lm5hbWU7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWc7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuZnJvbSA9IGNvbnRhY3QuZnJvbTtcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oY29udGFjdCk7XG4gICAgICAgICAgICAvLyB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goY29udGFjdClcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhdGVDYWxsKCk7XG4gICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5wdXNoKGNvbnRhY3QpXG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChjb250YWN0LmNhbGxlcklkID09ICdhbHdheXNBc2snIHx8IGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpIHtcbiAgICAgICAgICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gY29udGFjdC5uYW1lO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1nO1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBcbiAgICAgICAgfVxuICAgICAgfSlcbiAgXG4gICAgICAvLyBoYW5kbGUgaW5jb21pbmcgY2FsbFxuICAgICAgY29uc3Qgc3ViMiA9IHRoaXMudHdpbGlvU2VydmljZS5jdXJyZW50Q2FsbC5zdWJzY3JpYmUoaW5jb21pbmdDYWxsRGF0YSA9PiB7XG4gICAgICAgIC8vIGlmIChpbmNvbWluZ0NhbGxEYXRhKSB7XG4gICAgICAgIC8vICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgICAgICAgLy8gICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMuRnJvbTtcbiAgICAgICAgLy8gICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XG4gICAgICAgIC8vICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCdpbWFnZScpO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSB0cnVlO1xuICAgICAgICAvLyB9XG5cbiAgICAgICAgLy8gaWYgKGluY29taW5nQ2FsbERhdGEpIHtcbiAgICAgICAgLy8gICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XG4gICAgICAgIC8vICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMucHVzaChpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgLy8gICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGluY29taW5nQ2FsbERhdGEpO1xuICAgICAgICAvLyAgIH0gZWxzZSB7XG4gICAgICAgIC8vICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgICAvLyAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgLy8gICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSAoaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzIGFzIGFueSkuRnJvbTtcblxuICAgICAgICAvLyAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgIC8vICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyk7XG4gICAgICAgIC8vICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgICAgICAvLyAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgICAgIC8vICAgfVxuICAgICAgICAvLyAgIGluY29taW5nQ2FsbERhdGEub24oJ2NhbmNlbCcsICgpID0+IHtcbiAgICAgICAgLy8gICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyBhcyBhbnkpLkNhbGxTaWQpO1xuICAgICAgICAvLyAgICAgaWYodGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgIC8vICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgfVxuICAgICAgICAvLyAgIH0pO1xuXG4gICAgICAgIC8vICAgaW5jb21pbmdDYWxsRGF0YS5vbignZGlzY29ubmVjdCcsICgpID0+IHtcbiAgICAgICAgLy8gICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IHRoaXMuaW5jb21pbmdDYWxsc0xpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0ucGFyYW1ldGVycy5DYWxsU2lkICE9PSAoaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzIGFzIGFueSkuQ2FsbFNpZCk7XG4gICAgICAgIC8vICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAvLyAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgICAvLyAgICAgICB9XG4gICAgICAgIC8vICAgfSk7XG4gICAgICAgIC8vIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnSW5jb21pbmcgY2FsbCByZWNlaXZlZDonLCBpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgY29uc29sZS5sb2coJ0N1cnJlbnQgaXNDYWxsSW5Qcm9ncmVzczonLCB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MpO1xuXG5cbiAgICAgICAgaWYgKGluY29taW5nQ2FsbERhdGEpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZygnQ2FsbCBwYXJhbWV0ZXJzOicsIGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyk7XG4gICAgICAgICAgY29uc29sZS5sb2coJ0NhbGwgY3VzdG9tIHBhcmFtZXRlcnM6JywgaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzKTtcbiAgICAgICAgICBcbiAgICAgICAgICBpZiAodGhpcy5pc0NhbGxJblByb2dyZXNzKSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnQ2FsbCBpbiBwcm9ncmVzcywgYWRkaW5nIHRvIHF1ZXVlJyk7XG4gICAgICAgICAgICB0aGlzLm5ld0luY29taW5nQ2FsbHMucHVzaChpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSBbLi4udGhpcy5pbmNvbWluZ0NhbGxzTGlzdCwgaW5jb21pbmdDYWxsRGF0YV07XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnVXBkYXRlZCBpbmNvbWluZ0NhbGxzTGlzdDonLCB0aGlzLmluY29taW5nQ2FsbHNMaXN0KTtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc05ld0luZm9FdmVudC5lbWl0KHRoaXMuaW5jb21pbmdDYWxsc0xpc3QpO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdObyBjYWxsIGluIHByb2dyZXNzLCBzaG93aW5nIGluY29taW5nIGNhbGwgVUknKTtcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IChpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMgYXMgYW55KS5Gcm9tO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnbmFtZScpIHx8ICdVbmtub3duJztcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IFtpbmNvbWluZ0NhbGxEYXRhXTtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdTZXR0aW5nIHVwIGZpcnN0IGNhbGwgaW4gaW5jb21pbmdDYWxsc0xpc3Q6JywgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCk7XG4gICAgICAgICAgICB0aGlzLmluY29taW5nQ2FsbHNOZXdJbmZvRXZlbnQuZW1pdCh0aGlzLmluY29taW5nQ2FsbHNMaXN0KTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YjEpO1xuICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLmFkZChzdWIyKTtcbiAgICB9Y2F0Y2goZSl7XG4gICAgICBjb25zb2xlLmxvZyhlKVxuICAgIH1cbiAgICBcbiAgfVxuXG4gIFxuICBnZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YTogYW55KSB7XG4gICAgbGV0IGRhdGEgPSB0aGlzLmZyb21FbnRyaWVzKEFycmF5LmZyb20oaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmVudHJpZXMoKSkpO1xuICAgIHRoaXMuZXh0ZW5zaW9uU2VydmljZS5nZXRVc2VySW5mb3JtYXRpb24oKGRhdGEgYXMgYW55KS50d2lsaW9BdXRoSWQpLnN1YnNjcmliZShcbiAgICByZXNwb25zZSA9PiB7XG4gICAgICBpbmNvbWluZ0NhbGxEYXRhWyd1c2VySW5mbyddPXJlc3BvbnNlXG4gICAgICB0aGlzLmluY29taW5nQ2FsbHNMaXN0LnB1c2goaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgfSwgZXJyb3IgPT4ge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3Igc3RhcnRpbmcgcmVjb3JkaW5nJywgZXJyb3IpO1xuICAgIH0pO1xuICB9XG5cbiAgZnJvbUVudHJpZXMoZW50cmllczogW3N0cmluZywgYW55XVtdKTogUmVjb3JkPHN0cmluZywgYW55PiB7XG4gICAgcmV0dXJuIGVudHJpZXMucmVkdWNlKChhY2MsIFtrZXksIHZhbHVlXSkgPT4ge1xuICAgICAgYWNjW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiBhY2M7XG4gICAgfSwge30gYXMgUmVjb3JkPHN0cmluZywgYW55Pik7XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZWdpc3RlckRyYWdFbGVtZW50KCk7XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKChjaGFuZ2VzIGFzIGFueSkuaXNEaWFscGFkSGlkZGVuICYmICF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgdGhpcy5nZXRDb250YWN0TGlzdCgpO1xuICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLmRpYWxJbnB1dEVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMCk7XG4gICAgfVxuICB9XG4gIHByaXZhdGUgcmVnaXN0ZXJEcmFnRWxlbWVudCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgZWxtbnQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZHJhZ3BhcmVudDEnKTtcbiAgICAgIGlmICghZWxtbnQpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignRHJhZyBlbGVtZW50IG5vdCBmb3VuZCcpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGxldCBwb3MxID0gMCwgcG9zMiA9IDAsIHBvczMgPSAwLCBwb3M0ID0gMDtcblxuICAgICAgY29uc3QgZHJhZ01vdXNlRG93biA9IChlOiBNb3VzZUV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBpZiAodGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgcG9zMyA9IGUuY2xpZW50WDtcbiAgICAgICAgcG9zNCA9IGUuY2xpZW50WTtcbiAgICAgICAgXG4gICAgICAgIGNvbnN0IG9uTW91c2VNb3ZlID0gKG1vdmVFdmVudDogTW91c2VFdmVudCkgPT4gZWxlbWVudERyYWcobW92ZUV2ZW50KTtcbiAgICAgICAgY29uc3Qgb25Nb3VzZVVwID0gKCkgPT4ge1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICAgICAgfTtcblxuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvbk1vdXNlVXApO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZWxlbWVudERyYWcgPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHBvczEgPSBwb3MzIC0gZS5jbGllbnRYO1xuICAgICAgICBwb3MyID0gcG9zNCAtIGUuY2xpZW50WTtcbiAgICAgICAgcG9zMyA9IGUuY2xpZW50WDtcbiAgICAgICAgcG9zNCA9IGUuY2xpZW50WTtcbiAgICAgICAgXG4gICAgICAgIGVsbW50LnN0eWxlLnRvcCA9IChlbG1udC5vZmZzZXRUb3AgLSBwb3MyKSArICdweCc7XG4gICAgICAgIGVsbW50LnN0eWxlLmxlZnQgPSAoZWxtbnQub2Zmc2V0TGVmdCAtIHBvczEpICsgJ3B4JztcbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGZvciBoZWFkZXIgZWxlbWVudFxuICAgICAgY29uc3QgaGVhZGVyID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoZWxtbnQuaWQgKyAnaGVhZGVyJyk7XG4gICAgICBpZiAoaGVhZGVyKSB7XG4gICAgICAgIGhlYWRlci5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBlbG1udC5vbm1vdXNlZG93biA9IGRyYWdNb3VzZURvd247XG4gICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSlcbiAgICB9XG4gIH1cblxuICBhZGROdW1iZXIobnVtOiBhbnkpIHtcbiAgICBpZiAoIG51bSA9PSAnIycgfHwgbnVtID09ICcqJyB8fG51bSA9PSAnKycgfHwgTnVtYmVyLmlzSW50ZWdlcihudW0pKSB7XG4gICAgICBpZiAobnVtID09ICcjJykge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtaGFzaC0ubXAzYCkucGxheSgpO1xuICAgICAgfSBlbHNlIGlmIChudW0gPT0gJyonKSB7XG4gICAgICAgIG5ldyBBdWRpbyhgL2Fzc2V0cy9kaWFsLXRvbmVzL2R0bWYvZHRtZi1zdGFyLS5tcDNgKS5wbGF5KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtJHtudW19LS5tcDNgKS5wbGF5KCk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyICs9IG51bTtcbiAgICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSB0cnVlO1xuXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcilcbiAgICAgIC8vIHRoaXMuZGlhbElucHV0UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9ZWxzZSBpZihudW0gPT09ICd2b2ljZW1haWwnKXtcbiAgICAgIC8vIHRoaXMuc2hvd0RlZGljYXRlZFBvcHVwID0gdHJ1ZTtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFsnZXh0ZW5zaW9uL3ZvaWNlbWFpbC8nK3RoaXMudG9rZW5dKTtcbiAgICB9XG4gIH1cbiAgXG4gIGhpZGVEaWFscGFkKCkge1xuICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmNsb3NlRGlhbHBhZEV2ZW50LmVtaXQoKTtcbiAgICB0aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gIH1cbiAgXG4gIG9uRGlhbElucHV0Q2hhbmdlKGlucHV0VmFsOiBhbnkpIHtcbiAgICB0cnkge1xuICAgICAgLy8gVXBkYXRlZCByZWdleCB0byBpbmNsdWRlIHgsIFgsIGV4dC4sIEV4dC4sIGFuZCAsXG4gICAgICBjb25zdCBpc051bWVyaWNJbnB1dCA9IC9eW1xcZFxccytcXC1dKyQvLnRlc3QoaW5wdXRWYWwpO1xuICAgICAgbGV0IG1haW5OdW1iZXIgPSBpbnB1dFZhbDtcblxuICAgICAgLy8gQ2hlY2sgZm9yIGV4dGVuc2lvbiBpbmRpY2F0b3JzIGFuZCBzcGxpdCB0aGUgaW5wdXRcbiAgICAgIGNvbnN0IGV4dE1hdGNoID0gaW5wdXRWYWwubWF0Y2goLyh4fFh8ZXh0XFwufEV4dFxcLnwsKSguKikvKTtcbiAgICAgIGlmIChleHRNYXRjaCkge1xuICAgICAgICBtYWluTnVtYmVyID0gaW5wdXRWYWwuc3Vic3RyaW5nKDAsIGV4dE1hdGNoLmluZGV4KS50cmltKCk7XG4gICAgICAgIHRoaXMuY2FsbERhdGEuZXh0TnVtID0gZXh0TWF0Y2hbMl0udHJpbSgpO1xuICAgICAgfVxuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBpc051bWVyaWNJbnB1dCA/IG1haW5OdW1iZXIucmVwbGFjZSgvW1xcc1xcLV0rL2csICcnKSA6IG1haW5OdW1iZXI7XG5cbiAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBpc051bWVyaWNJbnB1dCA/IHRoaXMuc2FuaXRpemVkTnVtIDogJyc7XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gaW5wdXRWYWwubGVuZ3RoID4gMDtcblxuICAgICAgaWYgKGlzTnVtZXJpY0lucHV0KSB7XG4gICAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gbmV3IEFzWW91VHlwZSgpLmlucHV0KHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgICAgIH1cblxuICAgICAgLy8gZW1pdCBjdXJyZW50IG51bWJlciB3aGVuZXZlciBpbnB1dCBjaGFuZ2VzXG4gICAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcblxuICAgICAgaWYgKGlucHV0VmFsLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gdGhpcy5jb250YWN0TGlzdC5maWx0ZXIoY29udGFjdCA9PiB7XG4gICAgICAgICAgY29uc3QgZnVsbE5hbWUgPSBgJHtjb250YWN0LmZpcnN0TmFtZX0gJHtjb250YWN0Lm1pZGRsZU5hbWV9ICR7Y29udGFjdC5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgcmV0dXJuIGZ1bGxOYW1lLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtLnRvTG93ZXJDYXNlKCkpIHx8IGNvbnRhY3QubnVtYmVyc0xpc3Quc29tZSgobnVtOiBhbnkpID0+IG51bS5udW1iZXIuaW5jbHVkZXModGhpcy5zYW5pdGl6ZWROdW0pKTtcbiAgICAgICAgfSkuc2xpY2UoMCwgMik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QgPSBbXTtcbiAgICAgIH1cblxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpO1xuICAgIH1cbiAgfVxuXG4gIGdldEZpcnN0TGV0dGVyKG5hbWU6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgcmV0dXJuIG5hbWUgPyBuYW1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpIDogJyc7XG4gIH1cbiAgY2xlYXJJbnB1dCgpIHtcbiAgICBpZiAodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSB0aGlzLmRpYWxlZE51bWJlci5zbGljZSgwLCAtMSk7XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoICE9PSAwO1xuXG4gICAgICB0aGlzLm9uRGlhbElucHV0Q2hhbmdlKHRoaXMuZGlhbGVkTnVtYmVyKVxuICAgIH1cbiAgfVxuICBjbGVhckFsbERpYWxlZCgpIHtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xuICAgIHRoaXMuc2FuaXRpemVkTnVtID0gJyc7XG4gICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IGZhbHNlO1xuICB9XG4gIGdldENhbGxlcklkTGlzdCgpIHtcbiAgICB0aGlzLmV4dFNlcnZpY2UuZGlzcGxheUlEKHRoaXMudG9rZW4gfHwgJycpLnN1YnNjcmliZSgocmVzOiBhbnkpID0+IHtcbiAgICAgIC8vdGhpcy5jYWxsZXJJZExpc3QgPSByZXMuY2FsbGVySWRMaXN0LmZpbHRlcihpdGVtID0+IGl0ZW0udHlwZSA9PT0gXCJDMkMgU29mdHBob25lIE51bWJlclwiKTtcbiAgICAgIHRoaXMuY2FsbGVySWRMaXN0ID0gcmVzLmNhbGxlcklkTGlzdC5maWx0ZXIoKGl0ZW06IGFueSkgPT4gaXRlbS52b2ljZUZlYXR1cmUgPT09IHRydWUpO1xuICAgICAgLy8gdGhpcy5jYWxsZXJJZExpc3QgPSByZXMuY2FsbGVySWRMaXN0O1xuICAgICAgaWYgKHRoaXMuY2FsbGVySWRMaXN0Lmxlbmd0aCA9PSAxKSB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IHRoaXMuY2FsbGVySWRMaXN0WzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbFByZWZlcmVuY2UgPT09ICdhbHdheXNBc2snIHx8IHRoaXMuY2FsbFByZWZlcmVuY2UgPT09ICdzbWFydERpYWxpbmcnKSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gbnVsbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSB0aGlzLmNhbGxlcklkTGlzdC5maW5kKGl0ZW0gPT4gKGl0ZW0ubnVtYmVyID09IHRoaXMuY2FsbFByZWZlcmVuY2UpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIGdldENvbnRhY3RMaXN0KCkge1xuICAgIHRoaXMudHdpbGlvU2VydmljZS5nZXRDb250YWN0TGlzdCgpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzcC5yZXNwb25zZSA9PSAnU3VjY2VzcycpIHtcbiAgICAgICAgdGhpcy5jb250YWN0TGlzdCA9IHJlc3AucGhvbmVCb29rO1xuICAgICAgfVxuICAgIH0sIGVyciA9PiB7XG4gICAgICBjb25zb2xlLmxvZyhlcnIpXG4gICAgfSlcbiAgfVxuICBnZXRGdWxsTmFtZShjb250YWN0OiBhbnkpOiBzdHJpbmcge1xuICAgIGxldCBmdWxsTmFtZSA9IGNvbnRhY3QuZmlyc3ROYW1lIHx8ICcnO1xuICAgIGlmIChjb250YWN0Lm1pZGRsZU5hbWUpIHtcbiAgICAgIGZ1bGxOYW1lICs9IGAgJHtjb250YWN0Lm1pZGRsZU5hbWV9YDtcbiAgICB9XG4gICAgaWYgKGNvbnRhY3QubGFzdE5hbWUpIHtcbiAgICAgIGZ1bGxOYW1lICs9IGAgJHtjb250YWN0Lmxhc3ROYW1lfWA7XG4gICAgfVxuICAgIHJldHVybiBmdWxsTmFtZS50cmltKCk7XG4gIH1cblxuXG4gIHRvZ2dsZUNhbGxlcklkRGl2KCkge1xuICAgIHRoaXMuaXNDYWxsZXJJZEhpZGRlbiA9ICF0aGlzLmlzQ2FsbGVySWRIaWRkZW47XG4gIH1cblxuICBvbkNvbnRhY3RTZWxlY3QoY29udGFjdDogYW55KSB7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSBjb250YWN0Lm51bWJlcnNMaXN0WzBdLm51bWJlcjtcbiAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSB0aGlzLmdldEZ1bGxOYW1lKGNvbnRhY3QpO1xuICAgIHRoaXMuY2FsbERhdGEuaW1nID0gY29udGFjdC5pbWFnZSB8fCAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZyc7XG4gICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcik7XG4gICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gIH1cblxuICBlbmRDYWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zb2xlLmxvZygnRW5kaW5nIGNhbGwnKTtcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gICAgICBcbiAgICAgIC8vIFJlc2V0IGNhbGwgZGF0YVxuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgcGhvbmU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgICAgICAgZGlhbDogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlOdW06ICcnLFxuICAgICAgICBleHROdW06ICcnXG4gICAgICB9O1xuICAgICAgXG4gICAgICAvLyBSZXNldCBkaWFsZWQgbnVtYmVyXG4gICAgICB0aGlzLmRpYWxlZE51bWJlciA9ICcnO1xuICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSAnJztcbiAgICAgIFxuICAgICAgLy8gRW1pdCBlbmQgY2FsbCBldmVudFxuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgICAgY29uc29sZS5sb2coJ0NhbGwgZW5kZWQgc3VjY2Vzc2Z1bGx5Jyk7XG4gICAgICBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gZW5kQ2FsbDonLCBlcnJvcik7XG4gICAgICAvLyBFdmVuIGlmIHRoZXJlJ3MgYW4gZXJyb3IsIHRyeSB0byByZXNldCB0aGUgc3RhdGVcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgcGhvbmU6ICcnLFxuICAgICAgICBuYW1lOiAnJyxcbiAgICAgICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgICAgICAgZGlhbDogZmFsc2UsXG4gICAgICAgIGRpc3BsYXlOdW06ICcnLFxuICAgICAgICBleHROdW06ICcnXG4gICAgICB9O1xuICAgICAgdGhpcy5lbmRDYWxsRXZlbnQuZW1pdCgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGFzeW5jIGluaXRpYXRlQ2FsbCgpIHtcbiAgLy8gICB0cnkge1xuICAvLyAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIG51bWJlcjonLCB0aGlzLmRpYWxlZE51bWJlcik7XG4gICAgICBcbiAgLy8gICAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gIC8vICAgICAgIGNvbnNvbGUubG9nKCdVc2luZyBsYXN0IGRpYWxlZCBudW1iZXI6JywgdGhpcy5sYXN0RGlhbGVkLm51bWJlcik7XG4gIC8vICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgLy8gICAgIGlmIChpc0ludmFsaWQpIHtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignSW52YWxpZCBudW1iZXIgZm9ybWF0Jyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAvLyAgICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgICAgIFxuICAvLyAgICAgLy8gQ2hlY2sgcGF5bWVudCBzdGF0dXNcbiAgLy8gICAgIHRoaXMuaXNQYXltZW50RHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BheW1lbnREdWUnKSA9PT0gJ3RydWUnO1xuICAvLyAgICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gIC8vICAgICAgIGNvbnNvbGUud2FybignUGF5bWVudCBpcyBkdWUnKTtcbiAgLy8gICAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUuIFRvIGNvbnRpbnVlIHVzaW5nIG91ciBzZXJ2aWNlcywga2luZGx5IHN1YnNjcmliZSB0byBhdm9pZCBpbnRlcnJ1cHRpb25zLicpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIC8vIENoZWNrIGlmIGRpYWxpbmcgb3duIG51bWJlclxuICAvLyAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignQXR0ZW1wdGVkIHRvIGRpYWwgb3duIG51bWJlcicpO1xuICAvLyAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2Fubm90IGRpYWwgeW91ciBvd24gbnVtYmVyJyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gQ2hlY2sgbWljcm9waG9uZSBwZXJtaXNzaW9uc1xuICAvLyAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMuY2hlY2tNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XG4gIC8vICAgICAgIGNvbnNvbGUud2FybignTWljcm9waG9uZSBwZXJtaXNzaW9uIG5vdCBncmFudGVkJyk7XG4gIC8vICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdObyBjYWxsZXIgSUQgc2VsZWN0ZWQnKTtcbiAgLy8gICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gIC8vICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnUGxlYXNlIHNlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCBmcm9tJyk7XG4gIC8vICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgLy8gICAgICAgfSwgMzAwMCk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc29sZS5sb2coJ0dldHRpbmcgbnVtYmVyIHdpdGggY291bnRyeSBjb2RlLi4uJyk7XG4gIC8vICAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSAnJztcbiAgICAgIFxuICAvLyAgICAgdHJ5IHtcbiAgLy8gICAgICAgYXdhaXQgdGhpcy5nZXRUb051bWJlcih0aGlzLnNhbml0aXplZE51bSk7XG4gIC8vICAgICB9IGNhdGNoIChlcnJvcikge1xuICAvLyAgICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBnZXR0aW5nIG51bWJlciB3aXRoIGNvdW50cnkgY29kZTonLCBlcnJvcik7XG4gIC8vICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRXJyb3IgcHJvY2Vzc2luZyBudW1iZXIuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAvLyAgICAgICBjb25zb2xlLmxvZygnQ2FsbCB0ZXJtaW5hdGVkIGJ5IHVzZXInKTtcbiAgLy8gICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgLy8gUHJlcGFyZSBjYWxsIGRhdGFcbiAgLy8gICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgIHBob25lOiB0aGlzLnNhbml0aXplZE51bSxcbiAgLy8gICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAvLyAgICAgICBkaWFsOiB0cnVlLFxuICAvLyAgICAgICBmcm9tOiB0aGlzLmlzU21hcnREaWFsQ2FsbCA/IHRoaXMuY2FsbERhdGEuZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXIsXG4gIC8vICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggZGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgLy8gICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gICAgICBcbiAgLy8gICAgIHJldHVybiB0cnVlO1xuICAgICAgXG4gIC8vICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGluaXRpYXRlQ2FsbDonLCBlcnJvcik7XG4gIC8vICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAvLyAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfVxuICAvLyAgICAgLy90aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gIC8vICAgLy8gfSBlbHNlIHtcbiAgLy8gICAvLyAgIHN3YWwoJ0Vycm9yJywgJ1RyaWFsIHBlcmlvZCBpcyBvdmVyLiBQbGVhc2Ugc2V0dXAgcGF5bWVudCBtZXRob2QgdG8gY29udGludWUgc2VydmljZXMnKVxuICAvLyAgIC8vIH1cbiAgLy8gfVxuXG5cbiAgLy8gIGFzeW5jIGluaXRpYXRlQ2FsbCgpIHtcbiAgLy8gICBpZiAoIXRoaXMuZGlhbGVkTnVtYmVyICYmIHRoaXMubGFzdERpYWxlZCkge1xuICAvLyAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAvLyAgIH1cbiAgLy8gICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcigpO1xuICAvLyAgIGlmIChpc0ludmFsaWQpIHtcbiAgLy8gICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAvLyAgIHRoaXMuaXNTYXZlZENvbnRhY3REaWFsbGVkKCk7XG4gIC8vICAgLy9sZXQgaXNDYWxsZXJJZFNldCA9IGF3YWl0IHRoaXMuaXNDYWxsZXJJZFNldCgpO1xuICAvLyAgIHRoaXMuaXNQYXltZW50RHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BheW1lbnREdWUnKSA9PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAvLyAgIGlmICh0aGlzLmlzUGF5bWVudER1ZSkge1xuICAvLyAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUsIFRvIGNvbnRpbnVlIG9uIHlvdXIgc2VydmljZXMga2luZGx5IHN1YnNjcmliZSB0byB1c2UgdW5pbnRlcnJ1cHRlZCBzZXJ2aWNlcy4nKTtcbiAgLy8gICAgIHJldHVybjtcbiAgLy8gICB9XG4gIC8vICAgdGhpcy5pc1RyaWFsUGVyaW9kT3ZlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0cmlhbE92ZXInKSA9PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAvLyAgIC8vIGlmICghdGhpcy5pc1RyaWFsUGVyaW9kT3Zlcikge1xuICAvLyAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0d2lsaW9OdW1iZXInKSkge1xuICAvLyAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XG4gIC8vICAgICAgIHJldHVybjtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMuY2hlY2tNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgaWYgKGhhc1Blcm1pc3Npb24pIHtcbiAgLy8gICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAvLyAgICAgICAgIC8vY2xlYXIgZGlzcGxheU51bSBpZiB2YWx1ZSBpcyBiaW5kZWQgZnJvbSBwcmV2aW91cyBjYWxsXG4gIC8vICAgICAgICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XG4gIC8vICAgICAgICAgLy8gZ2V0IG51bWJlciB0byBiZSBkaWFsbGVkIGZyb20gYmFja2VuZFxuICAvLyAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xuICAvLyAgICAgICAgIGlmICh0aGlzLnRlcm1pbmF0ZUNhbGwpIHtcbiAgLy8gICAgICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgcmV0dXJuO1xuICAvLyAgICAgICAgIH1cbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gdGhpcy5zYW5pdGl6ZWROdW07XG4gIC8vICAgICAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICAgIHRoaXMuY2FsbERhdGEuZGlhbCA9IHRydWU7XG4gIC8vICAgICAgICAgaWYgKCF0aGlzLmlzU21hcnREaWFsQ2FsbCkge1xuICAvLyAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5mcm9tID0gdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcjtcbiAgLy8gICAgICAgICB9XG4gICAgICAgICAgXG4gIC8vICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAvLyAgICAgICAgICAgICAgIC4uLnRoaXMuY2FsbERhdGEsXG4gIC8vICAgICAgICAgICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAvLyAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgLy8gICAgICAgICAgICAgICBkaWFsOiB0cnVlLFxuICAvLyAgICAgICAgICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgLy8gICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAvLyAgICAgICAgICAgICB9O1xuXG4gIC8vICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAvLyAgICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gIC8vICAgICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IHRydWU7XG4gIC8vICAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdTZWxlY3QgYSBDMkMgbnVtYmVyIHRvIGNhbGwnKTtcbiAgLy8gICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgLy8gICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgLy8gICAgICAgICB9LCAzMDAwKTtcbiAgLy8gICAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgLy90aGlzLmNhbGxpbmdPcGVuRXZlbnQuZW1pdCh7IHBob25lOiB0aGlzLmRpYWxlZE51bWJlciB9KTtcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgIH1cbiAgLy8gICAgIC8vdGhpcy5jbGVhckFsbERpYWxlZCgpO1xuICAvLyAgIC8vIH0gZWxzZSB7XG4gIC8vICAgLy8gICBzd2FsKCdFcnJvcicsICdUcmlhbCBwZXJpb2QgaXMgb3Zlci4gUGxlYXNlIHNldHVwIHBheW1lbnQgbWV0aG9kIHRvIGNvbnRpbnVlIHNlcnZpY2VzJylcbiAgLy8gICAvLyB9XG4gIC8vIH1cblxuXG4gIC8vIGFzeW5jIGluaXRpYXRlQ2FsbCgpIHtcbiAgLy8gICB0cnl7XG4gIC8vICAgICBpZiAoIXRoaXMuZGlhbGVkTnVtYmVyICYmIHRoaXMubGFzdERpYWxlZCkge1xuICAvLyAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gIC8vICAgICBpZiAoaXNJbnZhbGlkKSB7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cbiAgLy8gICAgIHRoaXMuc2F2ZUxhc3REaWFsZWQoKTtcbiAgLy8gICAgIHRoaXMuaXNTYXZlZENvbnRhY3REaWFsbGVkKCk7XG4gIC8vICAgICAvL2xldCBpc0NhbGxlcklkU2V0ID0gYXdhaXQgdGhpcy5pc0NhbGxlcklkU2V0KCk7XG5cbiAgLy8gICAgIHRoaXMuaXNQYXltZW50RHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BheW1lbnREdWUnKSA9PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAvLyAgICAgaWYgKHRoaXMuaXNQYXltZW50RHVlKSB7XG4gIC8vICAgICAgIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLCBUbyBjb250aW51ZSBvbiB5b3VyIHNlcnZpY2VzIGtpbmRseSBzdWJzY3JpYmUgdG8gdXNlIHVuaW50ZXJydXB0ZWQgc2VydmljZXMuJyk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgdGhpcy5pc1RyaWFsUGVyaW9kT3ZlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0cmlhbE92ZXInKSA9PSAnZmFsc2UnID8gZmFsc2UgOiB0cnVlO1xuICAvLyAgICAgLy8gaWYgKCF0aGlzLmlzVHJpYWxQZXJpb2RPdmVyKSB7XG4gIC8vICAgICAgIGlmICh0aGlzLnNhbml0aXplZE51bSA9PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcbiAgLy8gICAgICAgICBzd2FsKCdFcnJvcicsICdZb3UgY2FuIG5vdCBkaWFsIHRoaXMgbnVtYmVyJyk7XG4gIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgICB9XG5cbiAgLy8gICAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMuY2hlY2tNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgICBpZiAoaGFzUGVybWlzc2lvbikge1xuICAvLyAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgLy8gICAgICAgICAgIC8vY2xlYXIgZGlzcGxheU51bSBpZiB2YWx1ZSBpcyBiaW5kZWQgZnJvbSBwcmV2aW91cyBjYWxsXG4gIC8vICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSAnJztcbiAgLy8gICAgICAgICAgIC8vIGdldCBudW1iZXIgdG8gYmUgZGlhbGxlZCBmcm9tIGJhY2tlbmRcbiAgLy8gICAgICAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xuICAvLyAgICAgICAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAvLyAgICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgICAgcmV0dXJuO1xuICAvLyAgICAgICAgICAgfVxuICAvLyAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuc2FuaXRpemVkTnVtO1xuICAvLyAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5kaWFsID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgIGlmICghdGhpcy5pc1NtYXJ0RGlhbENhbGwpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5mcm9tID0gdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcjtcbiAgLy8gICAgICAgICAgIH1cbiAgICAgICAgICAgIFxuICAvLyAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gIC8vICAgICAgICAgICAgICAgICAuLi50aGlzLmNhbGxEYXRhLFxuICAvLyAgICAgICAgICAgICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAvLyAgICAgICAgICAgICAgICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAvLyAgICAgICAgICAgICAgICAgZGlhbDogdHJ1ZSxcbiAgLy8gICAgICAgICAgICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgLy8gICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXG4gIC8vICAgICAgICAgICAgICAgfTtcblxuICAvLyAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBkYXRhOicsIHRoaXMuY2FsbERhdGEpO1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5jYWxsSW5pdGlhdGVkLmVtaXQoeyAuLi50aGlzLmNhbGxEYXRhIH0pO1xuICAvLyAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gIC8vICAgICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAvLyAgICAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdTZWxlY3QgYSBDMkMgbnVtYmVyIHRvIGNhbGwnKTtcbiAgLy8gICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAvLyAgICAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gIC8vICAgICAgICAgICB9LCAzMDAwKTtcbiAgLy8gICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgICAgLy90aGlzLmNhbGxpbmdPcGVuRXZlbnQuZW1pdCh7IHBob25lOiB0aGlzLmRpYWxlZE51bWJlciB9KTtcbiAgLy8gICAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgICBhd2FpdCB0aGlzLmFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICAgIH1cbiAgLy8gICAgICAgLy90aGlzLmNsZWFyQWxsRGlhbGVkKCk7XG4gIC8vICAgICAvLyB9IGVsc2Uge1xuICAvLyAgICAgLy8gICBzd2FsKCdFcnJvcicsICdUcmlhbCBwZXJpb2QgaXMgb3Zlci4gUGxlYXNlIHNldHVwIHBheW1lbnQgbWV0aG9kIHRvIGNvbnRpbnVlIHNlcnZpY2VzJylcbiAgLy8gICAgIC8vIH1cbiAgLy8gICB9Y2F0Y2goZSl7XG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBpbml0aWF0ZUNhbGw6JywgZSk7XG5cbiAgLy8gICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG5cbiAgLy8gICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuXG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfVxuICAvLyB9XG5cblxuICBhc3luYyBpbml0aWF0ZUNhbGwoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmICghdGhpcy5kaWFsZWROdW1iZXIgJiYgdGhpcy5sYXN0RGlhbGVkKSB7XG4gICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgICAgIH1cbiAgXG4gICAgICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcigpO1xuICAgICAgaWYgKGlzSW52YWxpZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gICAgICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xuICBcbiAgICAgIHRoaXMuaXNQYXltZW50RHVlID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3BheW1lbnREdWUnKSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgIGlmICh0aGlzLmlzUGF5bWVudER1ZSkge1xuICAgICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZSwgVG8gY29udGludWUgb24geW91ciBzZXJ2aWNlcyBraW5kbHkgc3Vic2NyaWJlIHRvIHVzZSB1bmludGVycnVwdGVkIHNlcnZpY2VzLicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gIFxuICAgICAgdGhpcy5pc1RyaWFsUGVyaW9kT3ZlciA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCd0cmlhbE92ZXInKSA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgIFxuICAgICAgaWYgKHRoaXMuc2FuaXRpemVkTnVtID09PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcbiAgICAgICAgc3dhbCgnRXJyb3InLCAnWW91IGNhbiBub3QgZGlhbCB0aGlzIG51bWJlcicpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gIFxuICAgICAgY29uc3QgaGFzUGVybWlzc2lvbiA9IGF3YWl0IHRoaXMuY2hlY2tNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAgICAgaWYgKCFoYXNQZXJtaXNzaW9uKSB7XG4gICAgICAgIGF3YWl0IHRoaXMuYXNrRm9yTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICBcbiAgICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1NlbGVjdCBhIEMyQyBudW1iZXIgdG8gY2FsbCcpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgICAgIH0sIDMwMDApO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gIFxuICAgICAgLy8gQ2xlYXIgZGlzcGxheU51bSBpZiB2YWx1ZSBpcyBib3VuZCBmcm9tIHByZXZpb3VzIGNhbGxcbiAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAgICAgXG4gICAgICAvLyBHZXQgbnVtYmVyIHRvIGJlIGRpYWxlZCBmcm9tIGJhY2tlbmRcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xuICAgICAgaWYgKHRoaXMudGVybWluYXRlQ2FsbCkge1xuICAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICBcbiAgICAgIC8vIFVwZGF0ZSBjYWxsIGRhdGEgaW4gYSBzaW5nbGUgb3BlcmF0aW9uXG4gICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAgICAgICAuLi50aGlzLmNhbGxEYXRhLFxuICAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgICAgICAgZGlhbDogdHJ1ZSxcbiAgICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgICAgfTtcbiAgXG4gICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggZGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICB0aGlzLmNhbGxJbml0aWF0ZWQuZW1pdCh7IC4uLnRoaXMuY2FsbERhdGEgfSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgXG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhdGVDYWxsOicsIGUpO1xuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGlzSW52YWxpZE51bWJlcigpIHtcbiAgICB0cnkge1xuICAgICAgaWYodGhpcy5zYW5pdGl6ZWROdW0gPT0gJycpe1xuICAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ludmFsaWQgTnVtYmVyJyk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgdmFsaWROdW1iZXJQYXR0ZXJuID0gL15bK1xcZFxccygpLV0qJC87IC8vIFJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB2YWxpZCBjaGFyYWN0ZXJzXG4gICAgICBjb25zdCBwaG9uZU51bWJlciA9IHRoaXMuc2FuaXRpemVkTnVtO1xuICAgICAgaWYgKCF2YWxpZE51bWJlclBhdHRlcm4udGVzdChwaG9uZU51bWJlcikpIHtcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xuICAgICAgcmV0dXJuIHRydWU7IC8vIFJldHVybiB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBtZWFuaW5nIHRoZSBudW1iZXIgaXMgaW52YWxpZFxuICAgIH1cbiAgfVxuICBcbiAgc2F2ZUxhc3REaWFsZWQoKSB7XG4gICAgY29uc3QgY29udGFjdCA9IHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdC5maW5kKChjOiBhbnkpID0+IGMubnVtYmVyc0xpc3Quc29tZSgobjogYW55KSA9PiBuLm51bWJlciA9PT0gdGhpcy5kaWFsZWROdW1iZXIpKTtcbiAgICBpZiAoY29udGFjdCkge1xuICAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xuICAgICAgICBuYW1lOiBjb250YWN0Lm5hbWUsXG4gICAgICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZih0aGlzLmRpYWxlZE51bWJlcil7XG4gICAgICAgIHRoaXMubGFzdERpYWxlZCA9IHsgbnVtYmVyOiB0aGlzLmRpYWxlZE51bWJlciB9O1xuICAgICAgfVxuICAgICAgXG4gICAgfVxuICB9XG4gIGlzU2F2ZWRDb250YWN0RGlhbGxlZCgpe1xuICAgIGxldCBwaG9uZU51bSA9IHRoaXMuc2FuaXRpemVkTnVtLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGxldCBjb250YWN0ID0gIHRoaXMuY29udGFjdExpc3QuZmlsdGVyKChjb250YWN0OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBjb250YWN0Lm51bWJlcnNMaXN0LnNvbWUoKG51bTogYW55KSA9PiBudW0ubnVtYmVyID09PSBwaG9uZU51bSlcbiAgICB9KTtcbiAgICBpZihjb250YWN0Lmxlbmd0aCl7XG4gICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBgJHtjb250YWN0WzBdLmZpcnN0TmFtZX0gJHtjb250YWN0WzBdLm1pZGRsZU5hbWV9ICR7Y29udGFjdFswXS5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3RbMF0uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuc2FuaXRpemVkTnVtO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHNob3dEaWFsQWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XG4gICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICBzaG93OiB0cnVlXG4gICAgfTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbEFsZXJ0LnNob3cgPSBmYWxzZTtcbiAgICB9LCAzMDAwKTtcbiAgfVxuICBhc3luYyBpc0NhbGxlcklkU2V0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0a24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMuZXh0U2VydmljZS5mZXRjaENhbGxlcklkKHRrbiB8fCAnJykudG9Qcm9taXNlKCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RyaWFsT3ZlcicsIHJlcy50cmlhbE92ZXIpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNUcmlhbE92ZXIubmV4dChyZXMudHJpYWxPdmVyKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BheW1lbnREdWUnLCByZXMucGF5bWVudER1ZSk7XG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1BheW1lbnREdWUubmV4dChyZXMucGF5bWVudER1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLmNhbGxlcmlkKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWxsZXJJRCcsIHJlcy5jYWxsZXJpZCk7XG5cbiAgICAgICAgdGhpcy5leHRTZXJ2aWNlLmNoYW5nZU1lc3NhZ2UocmVzLmNhbGxlcmlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWxsZXJJRCcsICdOb3Qgc2V0Jyk7XG4gICAgICAgIHRoaXMuZXh0U2VydmljZS5jaGFuZ2VNZXNzYWdlKCdOb3Qgc2V0Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhbGxlcklEJykgIT09ICdOb3Qgc2V0Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIGFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXNlciBkZW5pZWQgbWljcm9waG9uZSBwZXJtaXNzaW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgLy8gYmVsb3cgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgd2l0aCBudW1iZXIgZnJvbSBzZXJ2ZXIgXG4gIGFzeW5jIGdldFRvTnVtYmVyKGRpYWxlZE51bWJlcjogc3RyaW5nKSB7XG4gICAgXG4gICAgICBpZiAoZGlhbGVkTnVtYmVyWzBdICE9PSAnKycpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBjYXNlIHdoZW4gdXNlciBnZW9sb2NhdGlvbiBkaWFsIGNvZGUgaXMgb25cbiAgICAgICAgbGV0IGlwQWRkcmVzczogYW55ID0gYXdhaXQgdGhpcy5pcFNlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnRvUHJvbWlzZSgpO1xuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5nZXRUb051bWJlcihkaWFsZWROdW1iZXIsaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICB0aGlzLnRvYXN0VGltZW91dCA9IHJlcy50aW1lSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd051bWJlclRvYXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICBpc0FsZXJ0RW5hYmxlKCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNBbGVydEVuYWJsZScpO1xuICB9XG4gIGFzeW5jIHNob3dOdW1iZXJUb2FzdChkYXRhOiBhbnkpIHtcbiAgICBjb25zdCBpc0FsZXJ0T24gPSAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzQ291bnRyeUNvZGVUb2FzdE9uJykpO1xuICAgIGlmIChpc0FsZXJ0T24gPT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0Lm51bWJlciA9IGRhdGEudG9OdW1iZXI7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSBkYXRhLmRpc3BsYXlOdW1iZXI7XG4gICAgLy90aGlzLmNhbGxEYXRhLnBob25lID0gZGF0YS50b051bWJlcjtcbiAgICBhd2FpdCB0aGlzLmRlbGF5KHRoaXMudG9hc3RUaW1lb3V0KTtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGRhdGEudG9OdW1iZXI7XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBkYXRhLnRvTnVtYmVyO1xuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSAnJztcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gJyc7XG4gIH1cbiAgZGVsYXkobXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbk1pbmltaXNlKGlzTWluaW1pc2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGlzTWluaW1pc2VkO1xuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGlzTWluaW1pc2VkKTtcbiAgfVxuICBoYW5kbGVOdW1iZXJQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8ICh3aW5kb3cgYXMgYW55KS5jbGlwYm9hcmREYXRhO1xuICAgIGNvbnN0IHBhc3RlZERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcblxuICAgIC8vIExvZyB0aGUgcGFzdGVkIGNvbnRlbnQgdG8gdGhlIGNvbnNvbGVcbiAgICBpZihwYXN0ZWREYXRhKXtcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gcGFzdGVkRGF0YTtcbiAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gcGFzdGVkRGF0YTtcbiAgICB9XG4gICAgXG4gIH1cbiAgb25FbnRlcihudW06c3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2cobnVtLCAnbnVtYmVyIGZuJylcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IHRoaXMuZGlhbGVkTnVtYmVyICtudW07XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmRpYWxlZE51bWJlcjtcbiAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdHJ1ZTtcbiAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgfVxuICBcbiAgZ2V0VXNlckNhbGxTZXR0aW5nKCkge1xuICAgIGNvbnN0IHRrbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcbiAgICB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIC8vdGhpcy5jYWxsUHJlZmVybmNlID0gcmVzcC51c2VyU2V0dGluZztcbiAgICAgICAgdGhpcy5jYWxsUHJlZmVyZW5jZSA9IHJlc3AuY2FsbGVyaWQ7XG4gICAgICAgIHRoaXMuZ2V0Q2FsbGVySWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBvbkRlZGljYXRlZE51bVNlbGVjdChpZDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gaWQ7XG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmV4dFNlcnZpY2Uuc2V0Q2FsbGVySWQoaWQpO1xuICB9XG4gIGNhbmNlbERpYWxOdW1iZXIoKSB7XG4gICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gdHJ1ZTtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVEaXZLZXlkb3duKGV2OmFueSl7XG4gICAgaWYodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID09IDApe1xuICAgICAgdGhpcy5kaWFsSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKGV2LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpYWxwYWQgaXMgb3BlblxuICAgICAgaWYgKCF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgICBpZih0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAyICYmIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCl7XG4gICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zZWxlY3RlZENhbGxlcklkKXtcbiAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25DYWxsQnRuTW91c2VFbnRlcihldjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnYWx3YXlzQXNrJykgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJykpIHtcbiAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAgIH1cblxuICB9XG4gIG9uQ2FsbEJ0bk1vdXNlTGVhdmUoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFjY2VwdE5ld0luY29taW5nQ2FsbChjYWxsOiBDYWxsKSB7XG4gICAgLy9maXJzdCBjdXQgdGhlIGN1cnJlbnQgY2FsbFxuICAgIC8vdGhpcy5jYWxsRGF0YSA9IGNhbGw7XG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxEYXRhID0gY2FsbDtcbiAgfVxuICByZWplY3ROZXdJbmNvbWluZ0NhbGwoY2FsbDogQ2FsbCkge1xuICAgIGNhbGwucmVqZWN0KCk7XG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGNhbGwucGFyYW1ldGVycyBhcyBhbnkpLkNhbGxTaWQpO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGNhbGwucGFyYW1ldGVycyBhcyBhbnkpLkNhbGxTaWQpO1xuICB9XG4gIG5ld0luY29taW5nQ2FsbEluaXRpYXRlZCgpIHtcbiAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IFtdO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsSW5pdGlhdGVkLmVtaXQoKTtcbiAgfVxuICBpbmNvbWluZ0NhbGxzTmV3SW5mbyhkYXRhOmFueSl7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IGRhdGE7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mb0V2ZW50LmVtaXQoZGF0YSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCdDbGVhbmluZyB1cCBDMmNEaWFscGFkQ29tcG9uZW50Jyk7XG4gICAgICBcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gYWxsIHN1YnNjcmlwdGlvbnNcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVuZCBhbnkgYWN0aXZlIGNhbGxcbiAgICAgIGlmICh0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGFueSB0aW1lb3V0cyBvciBpbnRlcnZhbHMgaWYgdGhleSBleGlzdFxuICAgICAgaWYgKHRoaXMudG9hc3RUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZW91dCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdDMmNEaWFscGFkQ29tcG9uZW50IGNsZWFudXAgY29tcGxldGUnKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY29tcG9uZW50IGNsZWFudXA6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdj5cclxuICBtc3NzbXNtXHJcbjwvZGl2PlxyXG5cclxuPGRpdiAqbmdJZj1cImNhbGxEYXRhXCI+XHJcbiAgPHA+Q2FsbCBEYXRhOiB7eyBjYWxsRGF0YSB8IGpzb24gfX08L3A+XHJcbiAgPHA+SW5jb21pbmcgQ2FsbHM6IHt7IGluY29taW5nQ2FsbHNMaXN0Py5sZW5ndGggfHwgMCB9fTwvcD5cclxuPC9kaXY+XHJcbjxkaXYgaWQ9XCJkcmFncGFyZW50MVwiIFtuZ1N0eWxlXT1cInsnZGlzcGxheSc6aXNEaWFscGFkSGlkZGVuID8gJ25vbmUnOiAnYmxvY2snfVwiPlxyXG4gIDwhLS0gPGxpYi1jYWxsLXByb2dyZXNzICpuZ0lmPVwiaXNDYWxsSW5Qcm9ncmVzc1wiXHJcbiAgIChlbmRDYWxsRXZlbnQpPVwiZW5kQ2FsbCgpXCJcclxuICAgKG1pbmltaXNlRXZlbnQpPVwib25NaW5pbWlzZSgkZXZlbnQpXCJcclxuICAgKGluY29taW5nQ2FsbEluaXRpYXRlZCk9XCJuZXdJbmNvbWluZ0NhbGxJbml0aWF0ZWQoKVwiXHJcbiAgIFtuZXdJbmNvbWluZ0NhbGxEYXRhXT1cIm5ld0luY29taW5nQ2FsbERhdGFcIlxyXG4gICBbbmV3SW5jb21pbmdDYWxsc0xpc3RdPVwiaW5jb21pbmdDYWxsc0xpc3RcIlxyXG4gICAoaW5jb21pbmdDYWxsc05ld0luZm8pPVwiaW5jb21pbmdDYWxsc05ld0luZm8oJGV2ZW50KVwiXHJcbiAgIFtjYWxsRGF0YV09XCJjYWxsRGF0YVwiPlxyXG4gIDwvbGliLWNhbGwtcHJvZ3Jlc3M+IC0tPlxyXG5cclxuXHJcblxyXG5cclxuXHJcbiAgPGxpYi1jYWxsLXByb2dyZXNzXHJcbiAgKm5nSWY9XCJpc0NhbGxJblByb2dyZXNzXCJcclxuICBbY2FsbERhdGFdPVwiY2FsbERhdGFcIlxyXG4gIFtuZXdJbmNvbWluZ0NhbGxzTGlzdF09XCJpbmNvbWluZ0NhbGxzTGlzdFwiXHJcbiAgKGluY29taW5nQ2FsbHNOZXdJbmZvKT1cImluY29taW5nQ2FsbHNOZXdJbmZvKCRldmVudClcIlxyXG4gIChpbmNvbWluZ0NhbGxJbml0aWF0ZWQpPVwibmV3SW5jb21pbmdDYWxsSW5pdGlhdGVkKClcIlxyXG4gIFtuZXdJbmNvbWluZ0NhbGxEYXRhXT1cIm5ld0luY29taW5nQ2FsbERhdGFcIj5cclxuICA8ZGl2PkRlYnVnOiB7eyBpbmNvbWluZ0NhbGxzTGlzdD8ubGVuZ3RoIHx8IDAgfX0gaW5jb21pbmcgY2FsbHM8L2Rpdj5cclxuXHJcbjwvbGliLWNhbGwtcHJvZ3Jlc3M+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJkaWFscGFkLWNvbnRhaW5lclwiIFtuZ0NsYXNzXT1cInsnbWluaS1kaWFscGFkJzogaXNNaW5pbWlzZWR9XCIgdGFiaW5kZXg9XCIwXCIgKGtleWRvd24pPVwiaGFuZGxlRGl2S2V5ZG93bigkZXZlbnQpXCI+XHJcbiAgICA8ZGl2IGlkPVwidG9wUGFuZWxcIiBbbmdTdHlsZV09XCJ7J2hlaWdodCc6IGNhbGxlcklkTGlzdC5sZW5ndGggPyAnNDAlJyA6ICczOSUnfVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1hbGVydHNcIiAqbmdJZj1cImRpYWxBbGVydC5zaG93XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cIm5vLXNlbGVjdGlvbi1hbGVydFwiPlxyXG4gICAgICAgICAgPCEtLSA8cCBjbGFzcz1cIm1iLTBcIj5TZWxlY3QgQzJDIG51bWJlciB0byBjYWxsPC9wPiAtLT5cclxuICAgICAgICAgIDxwIGNsYXNzPVwibWItMFwiPnt7ZGlhbEFsZXJ0Lm1zZ319PC9wPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS10aW1lc1wiIChjbGljayk9XCJzaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlXCI+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCIgKm5nSWY9XCJjYWxsTnVtYmVyVG9hc3Quc2hvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkaWFsYm94LXBvcDEgYWxlcnQgZmFkZSBzaG93XCIgW25nQ2xhc3NdPVwiY2FsbE51bWJlclRvYXN0LnR5cGVcIiByb2xlPVwiYWxlcnRcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW5cIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xIG15LWF1dG8gdGV4dC1sZWZ0XCI+XHJcbiAgICAgICAgICAgICAgWW91J3IgY2FsbGluZyA8c3Ryb25nPnt7Y2FsbE51bWJlclRvYXN0LmRpc3BsYXlOdW19fTwvc3Ryb25nPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtcmlnaHRcIj5cclxuICAgICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1kaXNjIHAtMCBweC0xXCIgKGNsaWNrKT1cImNhbmNlbERpYWxOdW1iZXIoKVwiPkNhbmNlbCBDYWxsPC9idXR0b24+XHJcbiAgICAgICAgICAgICAgPCEtLSA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1saW5rIGJ0bi1zdWNjZXNzIGJ0bi1kaXNjIHAtMCBweC0yXCI+Q29udGludWU8L2J1dHRvbj4gLS0+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICBcclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBzdHlsZT1cInBhZGRpbmc6IDAgMThweFwiIChwYXN0ZSk9XCJoYW5kbGVOdW1iZXJQYXN0ZSgkZXZlbnQpXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlbiBtdC0yXCI+XHJcbiAgICAgICAgICA8cD48L3A+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwiaGlkZURpYWxwYWQoKVwiPlxyXG4gICAgICAgICAgICA8c3ZnIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiBoZWlnaHQ9XCIyNHB4XCIgdmlld0JveD1cIjAgLTk2MCA5NjAgOTYwXCIgd2lkdGg9XCIyNHB4XCIgZmlsbD1cIiNmZmZmZmZcIj48cGF0aCBkPVwibTI1Ni0yMDAtNTYtNTYgMjI0LTIyNC0yMjQtMjI0IDU2LTU2IDIyNCAyMjQgMjI0LTIyNCA1NiA1Ni0yMjQgMjI0IDIyNCAyMjQtNTYgNTYtMjI0LTIyNC0yMjQgMjI0WlwiLz48L3N2Zz5cclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtYm94XCI+XHJcbiAgICAgICAgICA8aW5wdXQgdHlwZT1cInRleHRcIiAjZGlhbElucHV0IHBsYWNlaG9sZGVyPVwiRW50ZXIgYSBuYW1lIG9yIG51bWJlclwiIHRhYmluZGV4PVwiMVwiIFsobmdNb2RlbCldPVwiZGlhbGVkTnVtYmVyXCIgKG5nTW9kZWxDaGFuZ2UpPVwib25EaWFsSW5wdXRDaGFuZ2UoJGV2ZW50KVwiLz5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiXCIgaWQ9XCJpbnB1dC1jbGVhci1idG5cIiAoY2xpY2spPVwiY2xlYXJJbnB1dCgpXCIgKm5nSWY9XCJzaG93SW5wdXRDbGVhckJ0blwiPlxyXG4gICAgICAgICAgICA8c3ZnIHdpZHRoPVwiNTBweFwiIGhlaWdodD1cIjMwcHhcIiB2aWV3Qm94PVwiMCAxMCA0MCA2MFwiIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIiB4bWxuczp4bGluaz1cImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmtcIiB2ZXJzaW9uPVwiMS4xXCIgYmFzZVByb2ZpbGU9XCJmdWxsXCIgZW5hYmxlLWJhY2tncm91bmQ9XCJuZXcgMCAwIDc2LjAwIDc2LjAwXCIgeG1sOnNwYWNlPVwicHJlc2VydmVcIj5cclxuICAgICAgICAgICAgICA8cGF0aCBmaWxsPVwiIzVkNjA2MVwiIGZpbGwtb3BhY2l0eT1cIjFcIiBzdHJva2Utd2lkdGg9XCIwLjJcIiBzdHJva2UtbGluZWpvaW49XCJyb3VuZFwiIGQ9XCJNIDQ3LjUyODIsNDIuOTQ5N0wgNDIuNTc4NCwzOEwgNDcuNTI4MiwzMy4wNTAyTCA0NC45NDk3LDMwLjQ3MThMIDQwLDM1LjQyMTZMIDM1LjA1MDIsMzAuNDcxOEwgMzIuNDcxOCwzMy4wNTAyTCAzNy40MjE2LDM4TCAzMi40NzE4LDQyLjk0OTdMIDM1LjA1MDIsNDUuNTI4MkwgNDAsNDAuNTc4NEwgNDQuOTQ5Nyw0NS41MjgyTCA0Ny41MjgyLDQyLjk0OTcgWiBNIDE4LjAxNDcsNDEuNTM1NUwgMjYuOTY0Niw1MC40ODU0QyAyOC4wNjgzLDUxLjU4OSAyOSw1MiAzMSw1MkwgNTIsNTJDIDU0Ljc2MTQsNTIgNTcsNDkuNzYxNCA1Nyw0N0wgNTcsMjlDIDU3LDI2LjIzODYgNTQuNzYxNCwyNCA1MiwyNEwgMzEsMjRDIDI5LDI0IDI4LjA2ODMsMjQuNDExMyAyNi45NjQ2LDI1LjUxNDlMIDE4LjAxNDcsMzQuNDY0NUMgMTYuMDYyMSwzNi40MTcxIDE2LjA2MjEsMzkuNTgyOSAxOC4wMTQ3LDQxLjUzNTUgWiBNIDMxLDQ5QyAzMCw0OSAyOS42MDQ4LDQ4Ljg4MjggMjkuMDg2LDQ4LjM2NDFMIDIwLjEzNjEsMzkuNDE0MkMgMTkuMzU1LDM4LjYzMzIgMTkuMzU1LDM3LjM2NjkgMjAuMTM2MSwzNi41ODU4TCAyOS4wODYsMjcuNjM2MkMgMjkuNjA0OCwyNy4xMTc1IDMwLDI3IDMxLDI3LjAwMDFMIDUyLDI3LjAwMDFDIDUzLjEwNDYsMjcuMDAwMSA1NCwyNy44OTU1IDU0LDI5LjAwMDFMIDU0LDQ3LjAwMDFDIDU0LDQ4LjEwNDYgNTMuMTA0Niw0OS4wMDAxIDUyLDQ5LjAwMDFMIDMxLDQ5IFogXCIvPlxyXG4gICAgICAgICAgICA8L3N2Zz4gICAgICAgIFxyXG4gICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJpbnB1dC1pbmZvLWljb25cIiBwbGFjZW1lbnQ9XCJib3R0b20tcmlnaHRcIiB0b29sdGlwQ2xhc3M9XCJpbnB1dC10b29sdGlwXCIgbmdiVG9vbHRpcD1cIkZvciBleHRlbnNpb24gZGlhbGluZywgdXNlIGZvcm1hdHMgbGlrZSArMTIzNDU2Nzg5MTAgeDEyMywrMTIzNDU2Nzg5MTAgZXh0LjEyMywgKzEyMzQ1Njc4OTEwLDEyM1wiPjxpIGNsYXNzPVwiZmEgZmEtaW5mby1jaXJjbGVcIj48L2k+PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJndWlkZVwiICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhKGRpYWxlZE51bWJlci5sZW5ndGggPiAyKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJndWlkZXRleHRcIj5QbGVhc2UgZW50ZXIgYSBudW1iZXIgb3Igc2VsZWN0IGEgc2F2ZWQgY29udGFjdDwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8IS0tIDxkaXYgY2xhc3M9XCJpbnB1dC1lcnJvclwiICpuZ0lmPVwiZGlhbEFsZXJ0LnNob3dcIj5cclxuICAgICAgICAgIDxzcGFuPnt7ZGlhbEFsZXJ0Lm1zZ319PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PiAtLT5cclxuICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRhY3QtY2FyZFwiICpuZ0Zvcj1cImxldCBjb250YWN0IG9mIGZpbHRlcmVkQ29udGFjdExpc3RcIiAoY2xpY2spPVwib25Db250YWN0U2VsZWN0KGNvbnRhY3QpXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWltZ1wiPlxyXG4gICAgICAgICAgICAgIDxpbWcgW3NyY109XCJjb250YWN0LmltYWdlXCIgYWx0PVwidXNlciBpbWFnZVwiIGxvYWRpbmc9XCJsYXp5XCIgKm5nSWY9XCJjb250YWN0LmltYWdlIGVsc2UgYWxwaGFOYW1lXCIvPlxyXG4gICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjYWxwaGFOYW1lPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjb250YWN0LWFscGhhLWltZ1wiPnt7Z2V0Rmlyc3RMZXR0ZXIoY29udGFjdC5maXJzdE5hbWUpfX08L3NwYW4+XHJcbiAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWRldGFpbHNcIj5cclxuICAgICAgICAgICAgICA8cCBzdHlsZT1cIm1hcmdpbi1ib3R0b206IDRweFwiIGNsYXNzPVwiY29udGFjdC1uYW1lXCI+e3tnZXRGdWxsTmFtZShjb250YWN0KSB9fTwvcD5cclxuICAgICAgICAgICAgICA8cD57e2NvbnRhY3QubnVtYmVyc0xpc3RbMF0ubnVtYmVyfX08L3A+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwid2F2ZS1jb250YWluZXJcIj5cclxuICAgICAgICA8c3ZnXHJcbiAgICAgICAgICBjbGFzcz1cIndhdmVzXCJcclxuICAgICAgICAgIHhtbG5zPVwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIlxyXG4gICAgICAgICAgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCJcclxuICAgICAgICAgIHZpZXdCb3g9XCIwIDI0IDE1MCAyOFwiXHJcbiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPVwibm9uZVwiXHJcbiAgICAgICAgICBzaGFwZS1yZW5kZXJpbmc9XCJhdXRvXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICA8ZGVmcz5cclxuICAgICAgICAgICAgPHBhdGhcclxuICAgICAgICAgICAgICBpZD1cImdlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICBkPVwiTS0xNjAgNDRjMzAgMCA1OC0xOCA4OC0xOHMgNTggMTggODggMTggNTgtMTggODgtMTggNTggMTggODggMTggdjQ0aC0zNTJ6XCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgIDwvZGVmcz5cclxuICAgICAgICAgIDxnIGNsYXNzPVwicGFyYWxsYXhcIj5cclxuICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgeT1cIjBcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNylcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8dXNlXHJcbiAgICAgICAgICAgICAgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiXHJcbiAgICAgICAgICAgICAgeD1cIjQ4XCJcclxuICAgICAgICAgICAgICB5PVwiM1wiXHJcbiAgICAgICAgICAgICAgZmlsbD1cInJnYmEoMjU1LDI1NSwyNTUsMC41KVwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICAgIDwhLS0gPHVzZVxyXG4gICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgeT1cIjVcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuMylcIlxyXG4gICAgICAgICAgICAvPiAtLT5cclxuICAgICAgICAgICAgPHVzZSB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCIgeD1cIjQ4XCIgeT1cIjdcIiBmaWxsPVwiI2ZmZlwiIC8+XHJcbiAgICAgICAgICA8L2c+XHJcbiAgICAgICAgPC9zdmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCI+XHJcbiAgICAgIDxidXR0b24gY2xhc3M9XCJkaWFsLWJ0blwiICpuZ0Zvcj1cImxldCBrZXkgb2Yga2V5cGFkVmFsO2xldCBpID0gaW5kZXhcIlxyXG4gICAgICAoa2V5ZG93bi5lbnRlcik9XCJvbkVudGVyKGtleS5udW0pXCIgKGNsaWNrKT1cImFkZE51bWJlcihrZXkubnVtKVwiXHJcbiAgICAgIFtuZ1N0eWxlXT1cInsnbWFyZ2luLXRvcCc6IGtleS50ZXh0ID09PSAnKycgPyAnM3B4JyA6ICcwJ31cIlxyXG4gICAgICAgW3RhYmluZGV4XT1cImRpYWxlZE51bWJlci5sZW5ndGggPyAnMCc6IGkrMlwiIGxvbmdQcmVzcyAobG9uZ1ByZXNzKT1cImFkZE51bWJlcihrZXkudGV4dClcIiBzaG9ydFByZXNzIChzaG9ydFByZXNzKT1cImFkZE51bWJlcihrZXkubnVtKVwiPlxyXG4gICAgICAgIHt7a2V5Lm51bX19IFxyXG4gICAgICAgIDxzcGFuICpuZ0lmPVwia2V5Lm51bSA9PSAxO2Vsc2Ugb3RoZXJUaGFuT25lXCIgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHZvaWNlbWFpbFwiPlxyXG4gICAgICAgICAgdm9pY2VtYWlsXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgIDxuZy10ZW1wbGF0ZSAjb3RoZXJUaGFuT25lPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJidG4tYWxiaGFiZXRzXCIgW25nQ2xhc3NdPVwieydwbHVzU2lnbic6IGtleS50ZXh0ID09PSAnKyd9XCI+e3trZXkudGV4dCA/IGtleS50ZXh0IDogJyZuYnNwOyd9fTwvc3Bhbj5cclxuICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8L2J1dHRvbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGwtYnRuLWNvbnRhaW5lclwiICpuZ0lmPVwiIWlzTWluaW1pc2VkXCIgKG1vdXNlZW50ZXIpPVwib25DYWxsQnRuTW91c2VFbnRlcigkZXZlbnQpXCIgKG1vdXNlbGVhdmUpPVwib25DYWxsQnRuTW91c2VMZWF2ZSgkZXZlbnQpXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0blwiIChjbGljayk9XCJpbml0aWF0ZUNhbGwoKVwiIFt0YWJpbmRleF09XCJkaWFsZWROdW1iZXIubGVuZ3RoID8gJzInOiAnMTUnXCJcclxuICAgICAgICBbbmdTdHlsZV09XCJ7J3BvaW50ZXItZXZlbnRzJzogZGlhbGVkTnVtYmVyLmxlbmd0aCAmJiBzZWxlY3RlZENhbGxlcklkID8gJ2F1dG8nIDogJ25vbmUnLCAnb3BhY2l0eSc6IGRpYWxlZE51bWJlci5sZW5ndGggJiYgc2VsZWN0ZWRDYWxsZXJJZCA/ICcxJyA6ICcwLjUnfVwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XHJcbiAgICAgICAgICBjYWxsXHJcbiAgICAgICAgPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImNhbGxlcklkTGlzdC5sZW5ndGggJiYgIWlzTWluaW1pc2VkXCIgY2xhc3M9XCJwb3NpdGlvbi1yZWxhdGl2ZVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwic2hvd25DYWxsZXJJZFwiICpuZ0lmPVwic2VsZWN0ZWRDYWxsZXJJZDsgZWxzZSBhc2tCbG9ja1wiIChjbGljayk9XCJ0b2dnbGVDYWxsZXJJZERpdigpXCI+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cIidmaSBmaS0nICsgc2VsZWN0ZWRDYWxsZXJJZD8uaXNvQ29kZT8udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgIHt7c2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfX1cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSAjYXNrQmxvY2s+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAgKGNsaWNrKT1cInRvZ2dsZUNhbGxlcklkRGl2KClcIiBbbmdDbGFzc109XCJ7ICd0aWx0LXNoYWtpbmcnOiBzaGFrZURlZGljYXRlZEJ0biB9XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1jZW50ZXJcIj5cclxuICAgICAgICAgICAgPGg1IGNsYXNzPVwibWItMFwiPlNlbGVjdCBDMkMgbnVtYmVyPC9oNT5cclxuICAgICAgICAgICAgPCEtLSA8c3BhbiBjbGFzcz1cIm1sLTJcIiBzdHlsZT1cIm9wYWNpdHk6Ljg7bWFyZ2luLXRvcDoycHhcIj5cclxuICAgICAgICAgICAgICA8aW1nIHNyYz1cImFzc2V0cy9pbWFnZXMvaWNvbl9kb3duX2Fycm93LnN2Z1wiIGFsdD1cImRvd25cIiB3aWR0aD1cIjEwcHhcIj5cclxuICAgICAgICAgICAgPC9zcGFuPiAtLT5cclxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmYSBmYS1hbmdsZS1kb3duIG1sLTIgdGV4dC1ibHVlXCIgc3R5bGU9XCJtYXJnaW4tdG9wOjJweFwiPjwvc3Bhbj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiZ3VpZGUyXCIgKm5nSWY9XCJzaGFrZURlZGljYXRlZEJ0blwiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpZGV0ZXh0XCI+UGxlYXNlIHNlbGVjdCBhIG51bWJlciBmcm9tIGJlbG93IGRyb3Bkb3duPC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoOyBlbHNlIG5vQ2FsbGVySWRNZXNzYWdlXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiY2FsbGVyLWlkLWxpc3QtY29udGFpbmVyXCIgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICFpc01pbmltaXNlZFwiIGlkPVwiY2FsbGVySWRDb250YWluZXJcIiAgW25nQ2xhc3NdPVwieyd2aXNpYmxlJzogIWlzQ2FsbGVySWRIaWRkZW59XCIgPlxyXG4gICAgICA8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuXCI+XHJcbiAgICAgICAgPCEtLSA8aDQ+U2VsZWN0IEMyQyBTb2Z0cGhvbmUgTnVtYmVyPC9oND4gLS0+XHJcbiAgICAgICAgIDxoND5NYWtlIG91dGdvaW5nIGNhbGwgdXNpbmc8L2g0PlxyXG4gICAgICAgIDxzcGFuXHJcbiAgICAgICAgICBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIlxyXG4gICAgICAgICAgc3R5bGU9XCJjdXJzb3I6IHBvaW50ZXJcIlxyXG4gICAgICAgICAgKGNsaWNrKT1cImlzQ2FsbGVySWRIaWRkZW4gPSB0cnVlXCJcclxuICAgICAgICA+XHJcbiAgICAgICAgICBjbG9zZVxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDx1bD5cclxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjYWxsZXJJZCBvZiBjYWxsZXJJZExpc3RcIj5cclxuICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiIChjbGljayk9XCJvbkRlZGljYXRlZE51bVNlbGVjdChjYWxsZXJJZClcIj5cclxuICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgIHt7Y2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgPC9saT5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgPC91bD5cclxuICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8bmctdGVtcGxhdGUgI25vQ2FsbGVySWRNZXNzYWdlPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cIm5vLWNhbGxlci1pZC1tZXNzYWdlXCI+VG8gbWFrZSBhbnkgdm9pY2UgY2FsbHMsIHBsZWFzZSA8YSByb3V0ZXJMaW5rPVwiL2V4dGVuc2lvbi9kZWRpY2F0ZWRudW1iZXIve3t0b2tlbn19XCIgY2xhc3M9XCJjbGljay1oZXJlLWxpbmtcIiB0aXRsZT1cIlNldHRpbmdzID4gQzJDIE51bWJlclwiPnN1YnNjcmliZTwvYT4gdG8gYSB2b2ljZSBjYXBhYmxlIEMyQyBOdW1iZXIuXHJcbiAgICAgIDwvc3Bhbj5cclxuICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICA8ZGl2IGNsYXNzPVwiZGVkaWNhdGVkLW92ZXJsYXlcIiAqbmdJZj1cInNob3dEZWRpY2F0ZWRQb3B1cFwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FyZCBkZWRpY2F0ZWROdW1Qb3B1cFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjYXJkLWhlYWRlciBjaG9vc2VEZWRpY2F0ZWRIZWFkZXJcIj5cclxuICAgICAgICAgIDxoNT5DaG9vc2UgQzJDIE51bWJlcjwvaDU+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgZGlhbC1jbG9zZS1idG5cIiAoY2xpY2spPVwic2hvd0RlZGljYXRlZFBvcHVwID0gZmFsc2VcIj5jbG9zZTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1ib2R5IGRlZGljYXRlZE51bUxpc3RcIj5cclxuICAgICAgICAgIDx1bD5cclxuICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XHJcbiAgICAgICAgICAgICAgPGxpIFtuZ0NsYXNzXT1cInsnc2VsZWN0ZWRDYWxsZXJJZENsYXNzJzogY2FsbGVySWQ/Lm51bWJlciA9PSBzZWxlY3RlZENhbGxlcklkPy5udW1iZXJ9XCIgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+XHJcbiAgICAgICAgICAgICAgICA8ZGl2PlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIGNhbGxlcklkPy5pc29Db2RlPy50b0xvd2VyQ2FzZSgpXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICB7e2NhbGxlcklkPy5udW1iZXJ9fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8c3Bhbj57e2NhbGxlcklkPy5jb3VudHJ5TmFtZX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgPC91bD5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJpbmNvbWluZy1jYWxsLXdpZGdldFwiICpuZ0Zvcj1cImxldCBjYWxsIG9mIG5ld0luY29taW5nQ2FsbHM7bGV0IGkgPSBpbmRleFwiIFtuZ1N0eWxlXT1cInsndG9wJzogKDMwICsgaSAqIDcyKSArICdweCd9XCI+XHJcbiAgICAgIDxkaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImluYy11c2VyLWltZ1wiPlxyXG4gICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL3VzZXIuanBnXCIgYWx0PVwidXNlciBpbWFnZVwiPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIFxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZsZXgtZ3Jvdy0xXCI+XHJcbiAgICAgICAgPCEtLSA8aDYgY2xhc3M9XCJtYi0xIGZvbnQtd2VpZ2h0LWJvbGRcIj5JbmNvbWluZyBDYWxsPC9oNj4gLS0+XHJcbiAgICAgICAgPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+e3tjYWxsLmN1c3RvbVBhcmFtZXRlcnMuZ2V0KCduYW1lJyl9fTwvcD5cclxuICAgICAgICA8cD57e2NhbGwucGFyYW1ldGVycy5Gcm9tfX08L3A+XHJcblxyXG4gICAgICAgIDwhLS0gPHAgY2xhc3M9XCJpbmMtdXNlci1uYW1lXCI+Sm9obiBEb2U8L3A+IFxyXG4gICAgICAgIDxwPisxMjMzNzQ3MjQ4OTwvcD5cclxuICAgICAgICA8cCBzdHlsZT1cImZvbnQtc2l6ZTogMTJweDtjb2xvcjojZDVkNWQ1ICFpbXBvcnRhbnQ7bWFyZ2luLXRvcDoycHhcIj5DYWxsIG9uICsxMjI2NDU4NDEwMDwvcD4gLS0+XHJcblxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleFwiPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJpbmMtY2FsbC1idG4gaW5jLWFjY2VwdC1idG4gbXItMlwiIChjbGljayk9XCJhY2NlcHROZXdJbmNvbWluZ0NhbGwoY2FsbClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XHJcbiAgICAgICAgICAgIGNhbGxcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5jLWNhbGwtYnRuIGluYy1yZWplY3QtYnRuXCIgKGNsaWNrKT1cInJlamVjdE5ld0luY29taW5nQ2FsbChjYWxsKVwiPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCIgc3R5bGU9XCJjb2xvcjogd2hpdGVcIj5cclxuICAgICAgICAgICAgY2FsbF9lbmRcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8L2J1dHRvbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgXHJcbiAgICA8L2Rpdj5cclxuICA8L2Rpdj5cclxuPC9kaXY+XHJcbiJdfQ==
|
|
1016
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGlhbGJveC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9kaWFsYm94L3NyYy9saWIvZGlhbGJveC5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQWlCLFNBQVMsRUFBYyxZQUFZLEVBQWdCLEtBQUssRUFBcUIsTUFBTSxFQUFpQixTQUFTLEVBQXFCLE1BQU0sZUFBZSxDQUFDO0FBQ2hMLE9BQU8sSUFBSSxNQUFNLGFBQWEsQ0FBQztBQUsvQixPQUFtQyxFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLE1BQU0sQ0FBQzs7Ozs7Ozs7OztBQVVwQyxNQUFNLE9BQU8sZ0JBQWdCO0lBNEQzQixZQUNVLGFBQTRCLEVBQzVCLFVBQTRCLEVBQzVCLE1BQWlCLEVBQ2pCLFNBQTJCLEVBQzNCLGdCQUFrQyxFQUNsQyxNQUFjO1FBTGQsa0JBQWEsR0FBYixhQUFhLENBQWU7UUFDNUIsZUFBVSxHQUFWLFVBQVUsQ0FBa0I7UUFDNUIsV0FBTSxHQUFOLE1BQU0sQ0FBVztRQUNqQixjQUFTLEdBQVQsU0FBUyxDQUFrQjtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLFdBQU0sR0FBTixNQUFNLENBQVE7UUFqRWYsb0JBQWUsR0FBWSxLQUFLLENBQUM7UUFDaEMsc0JBQWlCLEdBQXVCLElBQUksWUFBWSxFQUFRLENBQUM7UUFDakUsa0JBQWEsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUMzRCxpQkFBWSxHQUF1QixJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzVELGtCQUFhLEdBQTBCLElBQUksWUFB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QUVELE9BQU8sQ0FBQyxHQUFHLENBQUMsc0NBQXNDLENBQUMsQ0FBQztTQUVyRDtRQUFDLE9BQU8sS0FBSyxFQUFFO1lBQ2QsT0FBTyxDQUFDLEtBQUssQ0FBQyxpQ0FBaUMsRUFBRSxLQUFLLENBQUMsQ0FBQztTQUN6RDtJQUNILENBQUM7OzhHQXhqQ1UsZ0JBQWdCO2tHQUFoQixnQkFBZ0IsZ2dCQ2xCN0IsK3JaQThPQTs0RkQ1TmEsZ0JBQWdCO2tCQUw1QixTQUFTOytCQUNFLGFBQWE7OE9BS2QsZUFBZTtzQkFBdkIsS0FBSztnQkFDSSxpQkFBaUI7c0JBQTFCLE1BQU07Z0JBQ0csYUFBYTtzQkFBdEIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU07Z0JBQ0cseUJBQXlCO3NCQUFsQyxNQUFNO2dCQUNHLHFCQUFxQjtzQkFBOUIsTUFBTTtnQkFDaUIsZ0JBQWdCO3NCQUF2QyxTQUFTO3VCQUFDLFdBQVc7Z0JBR1osWUFBWTtzQkFBckIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgc3dhbCBmcm9tICdzd2VldGFsZXJ0Mic7XG5pbXBvcnQgeyBNYXREaWFsb2cgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9kaWFsb2cnO1xuaW1wb3J0IHsgVHdpbGlvU2VydmljZSB9IGZyb20gJy4vc2VydmljZS90d2lsaW8uc2VydmljZSc7XG5pbXBvcnQgeyBFeHRlbnNpb25TZXJ2aWNlIH0gZnJvbSAnLi9zZXJ2aWNlL2V4dGVuc2lvbi5zZXJ2aWNlJztcbmltcG9ydCB7IENhbGxlcklkRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi9jb21wb25lbnRzL2NhbGxlci1pZC1kaWFsb2cvY2FsbGVyLWlkLWRpYWxvZy5jb21wb25lbnQnO1xuaW1wb3J0IHBhcnNlUGhvbmVOdW1iZXJGcm9tU3RyaW5nLCB7IEFzWW91VHlwZSB9IGZyb20gJ2xpYnBob25lbnVtYmVyLWpzJztcbmltcG9ydCB7IGtleXBhZCB9IGZyb20gJy4uL2tleXBhZCc7XG5pbXBvcnQgeyBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IElwQWRkcmVzc1NlcnZpY2UgfSBmcm9tICcuL3NlcnZpY2UvaXAtYWRkcmVzcy5zZXJ2aWNlJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBDYWxsIH0gZnJvbSAnQHR3aWxpby92b2ljZS1zZGsnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdsaWItZGlhbGJveCcsXG4gIHRlbXBsYXRlVXJsOiAnLi9kaWFsYm94LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGlhbGJveC5jb21wb25lbnQuY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGlhbGJveENvbXBvbmVudCAgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0luaXQsIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGlzRGlhbHBhZEhpZGRlbjogYm9vbGVhbiA9IGZhbHNlO1xuICBAT3V0cHV0KCkgY2xvc2VEaWFscGFkRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIGNhbGxJbml0aWF0ZWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoKSBlbmRDYWxsRXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1pbmltaXNlRXZlbnQ6IEV2ZW50RW1pdHRlcjxib29sZWFuPiA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcbiAgQE91dHB1dCgpIGluY29taW5nQ2FsbHNOZXdJbmZvRXZlbnQ6IEV2ZW50RW1pdHRlcjxhbnlbXT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueVtdPigpO1xuICBAT3V0cHV0KCkgaW5jb21pbmdDYWxsSW5pdGlhdGVkOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBWaWV3Q2hpbGQoJ2RpYWxJbnB1dCcpIGRpYWxJbnB1dEVsZW1lbnQhOiBFbGVtZW50UmVmO1xuXG4gIFxuICBAT3V0cHV0KCkgbnVtYmVyRGlhbGVkID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XG5cblxuICBpc0NhbGxJblByb2dyZXNzOiBib29sZWFuID0gZmFsc2U7XG4gIGtleXBhZFZhbCA9IGtleXBhZDtcbiAgXG4gIHNob3dJbnB1dENsZWFyQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGRpYWxlZE51bWJlcjogc3RyaW5nID0gJyc7XG4gIGNvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBmaWx0ZXJlZENvbnRhY3RMaXN0OiBhbnlbXSA9IFtdO1xuICBjYWxsZXJJZExpc3Q6IGFueVtdID0gW107XG4gIHNlbGVjdGVkQ2FsbGVySWQ6IGFueTtcbiAgaXNDYWxsZXJJZEhpZGRlbjogYm9vbGVhbiA9IHRydWU7XG5cbiAgaXNUcmlhbFBlcmlvZE92ZXI6IGJvb2xlYW4gPSBmYWxzZTtcbiAgaXNQYXltZW50RHVlOiBib29sZWFuID0gZmFsc2U7XG4gIHRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgdG9hc3RUaW1lb3V0ID0gNzAwMDtcbiAgY2FsbE51bWJlclRvYXN0ID0ge1xuICAgIHNob3c6IGZhbHNlLFxuICAgIHR5cGU6ICdhbGVydC1zdWNjZXNzJyxcbiAgICBudW1iZXI6ICcnLFxuICAgIGRpc3BsYXlOdW06ICcnXG4gIH1cbiAgY2FsbERhdGE6IGFueSA9IHtcbiAgICBwaG9uZTogJycsXG4gICAgZGlzcGxheU51bTogJycsXG4gICAgZGlhbDogZmFsc2UsXG4gICAgbmFtZTogJycsXG4gICAgaW1nOiAnYXNzZXRzL2ltYWdlcy91c2VyLmpwZycsXG4gICAgaXNJbmNvbWluZ0NhbGw6IGZhbHNlLFxuICAgIGV4dE51bTonJ1xuICB9O1xuICBsYXN0RGlhbGVkOiB7IG5hbWU/OiBzdHJpbmc7IGltYWdlPzogc3RyaW5nOyBudW1iZXI6IHN0cmluZyB9IHwgbnVsbCA9IG51bGw7XG4gIHNhbml0aXplZE51bTogYW55O1xuICBkaWFsQWxlcnQgPSB7XG4gICAgbXNnOiAnJyxcbiAgICBzaG93OiBmYWxzZVxuICB9XG4gIHRva2VuPzpzdHJpbmc7XG4gXG4gIHNob3dEZWRpY2F0ZWRQb3B1cDpib29sZWFuID0gZmFsc2U7XG4gIG5ld0luY29taW5nQ2FsbHM6IGFueSA9IFtdO1xuICBpbmNvbWluZ0NhbGxzTGlzdDogYW55ID0gW107XG4gIG5ld0luY29taW5nQ2FsbERhdGE/OkNhbGw7XG4gIHByaXZhdGUgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuICBjYWxsUHJlZmVyZW5jZTphbnk7XG4gIHNoYWtlRGVkaWNhdGVkQnRuOiBib29sZWFuID0gZmFsc2U7XG4gIGlzU21hcnREaWFsQ2FsbDpib29sZWFuID0gZmFsc2U7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgdHdpbGlvU2VydmljZTogVHdpbGlvU2VydmljZSxcbiAgICBwcml2YXRlIGV4dFNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSBkaWFsb2c6IE1hdERpYWxvZyxcbiAgICBwcml2YXRlIGlwU2VydmljZTogSXBBZGRyZXNzU2VydmljZSxcbiAgICBwcml2YXRlIGV4dGVuc2lvblNlcnZpY2U6IEV4dGVuc2lvblNlcnZpY2UsXG4gICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgKSB7IH1cblxuICBuZ09uSW5pdCgpIHtcbiAgICB0cnl7XG4gICAgICB0aGlzLnRva2VuID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2V4dF90b2tlbicpIHx8ICcnO1xuICAgICAgLy90aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlOyBcbiAgICAgIHRoaXMuZ2V0Q29udGFjdExpc3QoKTtcbiAgICAgIFxuICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgIGNvbnN0IHN1YjEgPSB0aGlzLnR3aWxpb1NlcnZpY2UuZGlhbE51bWJlckZyb21PdGhlck1vZHVsZS5zdWJzY3JpYmUoKGNvbnRhY3Q6YW55KSA9PiB7XG4gICAgICAgIGlmIChjb250YWN0Lm51bWJlcikge1xuICAgICAgICAgIHRoaXMuaXNTbWFydERpYWxDYWxsID0gZmFsc2U7XG4gICAgICAgICAgaWYgKGNvbnRhY3QuaXNEaWFsRnJvbUhpc3RvcnkpIHtcbiAgICAgICAgICAgIC8vaGFuZGxlIGRpYWxpbmcgZnJvbSBoaXN0b3J5IHBhZ2VcbiAgICAgICAgICAgIGlmKGNvbnRhY3QuY2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpe1xuICAgICAgICAgICAgIFxuICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSB7IG51bWJlcjogY29udGFjdC5mcm9tIH07XG4gICAgICAgICAgICAgIHRoaXMuaXNTbWFydERpYWxDYWxsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSwgMjAwMCk7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gY29udGFjdC5uYW1lO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1nO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLmZyb20gPSBjb250YWN0LmZyb207XG4gICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGNvbnRhY3QpO1xuICAgICAgICAgICAgLy8gdGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5wdXNoKGNvbnRhY3QpXG4gICAgICAgICAgICB0aGlzLmluaXRpYXRlQ2FsbCgpO1xuICAgICAgICAgIH1lbHNle1xuICAgICAgICAgICAgdGhpcy5nZXRVc2VyQ2FsbFNldHRpbmcoKTtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICB0aGlzLmdldFVzZXJJbmZvcm1hdGlvbihjb250YWN0KTtcbiAgICAgICAgICAgIC8vIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QucHVzaChjb250YWN0KVxuICAgICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAoY29udGFjdC5jYWxsZXJJZCA9PSAnYWx3YXlzQXNrJyB8fCBjb250YWN0LmNhbGxlcklkID09ICdzbWFydERpYWxpbmcnKSB7XG4gICAgICAgICAgICAgIHRoaXMuZ2V0VXNlckNhbGxTZXR0aW5nKCk7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IGNvbnRhY3QubnVtYmVyO1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNEaWFscGFkSGlkZGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgIH0sIDIwMDApO1xuICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gY29udGFjdC5udW1iZXI7XG4gICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEubmFtZSA9IGNvbnRhY3QubmFtZTtcbiAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pbWcgPSBjb250YWN0LmltZztcbiAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBjb250YWN0Lm51bWJlcjtcbiAgICAgICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgXG4gICAgICAgIH1cbiAgICAgIH0pXG4gIFxuICAgICAgLy8gaGFuZGxlIGluY29taW5nIGNhbGxcbiAgICAgIGNvbnN0IHN1YjIgPSB0aGlzLnR3aWxpb1NlcnZpY2UuY3VycmVudENhbGwuc3Vic2NyaWJlKGluY29taW5nQ2FsbERhdGEgPT4ge1xuICAgICAgICAvLyBpZiAoaW5jb21pbmdDYWxsRGF0YSkge1xuICAgICAgICAvLyAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgIC8vICAgdGhpcy5pc0RpYWxwYWRIaWRkZW4gPSBmYWxzZTtcbiAgICAgICAgLy8gICB0aGlzLmNhbGxEYXRhLnBob25lID0gaW5jb21pbmdDYWxsRGF0YS5wYXJhbWV0ZXJzLkZyb207XG4gICAgICAgIC8vICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnbmFtZScpO1xuICAgICAgICAvLyAgIHRoaXMuY2FsbERhdGEuaW1nID0gaW5jb21pbmdDYWxsRGF0YS5jdXN0b21QYXJhbWV0ZXJzLmdldCgnaW1hZ2UnKTtcbiAgICAgICAgLy8gICB0aGlzLmNhbGxEYXRhLmlzSW5jb21pbmdDYWxsID0gdHJ1ZTtcbiAgICAgICAgLy8gfVxuICAgICAgICBpZiAoaW5jb21pbmdDYWxsRGF0YSkge1xuICAgICAgICAgIGlmICh0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgICAgIHRoaXMubmV3SW5jb21pbmdDYWxscy5wdXNoKGluY29taW5nQ2FsbERhdGEpO1xuICAgICAgICAgICAgdGhpcy5nZXRVc2VySW5mb3JtYXRpb24oaW5jb21pbmdDYWxsRGF0YSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IChpbmNvbWluZ0NhbGxEYXRhLnBhcmFtZXRlcnMgYXMgYW55KT8uRnJvbTtcbiAgICAgICAgICAgIHRoaXMuZ2V0VXNlckluZm9ybWF0aW9uKGluY29taW5nQ2FsbERhdGEpO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycyBhcyBhbnkpPy5nZXQoJ25hbWUnKTtcbiAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuaW1nID0gKGluY29taW5nQ2FsbERhdGEuY3VzdG9tUGFyYW1ldGVycyBhcyBhbnkpPy5nZXQoJ2ltYWdlJykgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5pc0luY29taW5nQ2FsbCA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGluY29taW5nQ2FsbERhdGEub24oJ2NhbmNlbCcsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyBhcyBhbnkpPy5DYWxsU2lkKTtcbiAgICAgICAgICAgIGlmKHRoaXMuaW5jb21pbmdDYWxsc0xpc3QubGVuZ3RoID09IDApe1xuICAgICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGluY29taW5nQ2FsbERhdGEub24oJ2Rpc2Nvbm5lY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGluY29taW5nQ2FsbERhdGEucGFyYW1ldGVycyBhcyBhbnkpPy5DYWxsU2lkKTtcbiAgICAgICAgICAgICAgaWYodGhpcy5pbmNvbWluZ0NhbGxzTGlzdC5sZW5ndGggPT0gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoc3ViMSk7XG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbnMuYWRkKHN1YjIpO1xuICAgIH1jYXRjaChlKXtcbiAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgfVxuICAgIFxuICB9XG5cbiAgXG4gIGdldFVzZXJJbmZvcm1hdGlvbihpbmNvbWluZ0NhbGxEYXRhOiBhbnkpIHtcbiAgICBsZXQgZGF0YSA9IHRoaXMuZnJvbUVudHJpZXMoQXJyYXkuZnJvbShpbmNvbWluZ0NhbGxEYXRhLmN1c3RvbVBhcmFtZXRlcnMuZW50cmllcygpKSk7XG4gICAgdGhpcy5leHRlbnNpb25TZXJ2aWNlLmdldFVzZXJJbmZvcm1hdGlvbigoZGF0YSBhcyBhbnkpLnR3aWxpb0F1dGhJZCkuc3Vic2NyaWJlKFxuICAgIHJlc3BvbnNlID0+IHtcbiAgICAgIGluY29taW5nQ2FsbERhdGFbJ3VzZXJJbmZvJ109cmVzcG9uc2VcbiAgICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QucHVzaChpbmNvbWluZ0NhbGxEYXRhKTtcbiAgICB9LCBlcnJvciA9PiB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBzdGFydGluZyByZWNvcmRpbmcnLCBlcnJvcik7XG4gICAgfSk7XG4gIH1cblxuICBmcm9tRW50cmllcyhlbnRyaWVzOiBbc3RyaW5nLCBhbnldW10pOiBSZWNvcmQ8c3RyaW5nLCBhbnk+IHtcbiAgICByZXR1cm4gZW50cmllcy5yZWR1Y2UoKGFjYywgW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICBhY2Nba2V5XSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KTtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRHJhZ0VsZW1lbnQoKTtcbiAgfVxuXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICBpZiAoKGNoYW5nZXMgYXMgYW55KS5pc0RpYWxwYWRIaWRkZW4gJiYgIXRoaXMuaXNEaWFscGFkSGlkZGVuKSB7XG4gICAgICB0aGlzLmdldENvbnRhY3RMaXN0KCk7XG4gICAgICB0aGlzLmdldFVzZXJDYWxsU2V0dGluZygpO1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuZGlhbElucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICB9LCAwKTtcbiAgICB9XG4gIH1cbiAgLy8gcHJpdmF0ZSByZWdpc3RlckRyYWdFbGVtZW50KCkge1xuICAvLyAgIHRyeSB7XG4gIC8vICAgICBjb25zdCBlbG1udCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdkcmFncGFyZW50MScpO1xuXG4gIC8vICAgICBsZXQgcG9zMSA9IDAsIHBvczIgPSAwLCBwb3MzID0gMCwgcG9zNCA9IDA7XG5cbiAgLy8gICAgIGNvbnN0IGRyYWdNb3VzZURvd24gPSAoZTogYW55KSA9PiB7XG4gIC8vICAgICAgIC8vIElmIHRoZSB0YXJnZXQgaXMgYW4gaW5wdXQsIHJldHVybiBhbmQgZG9uJ3QgaW5pdGlhdGUgZHJhZ2dpbmdcbiAgLy8gICAgICAgaWYgKGUudGFyZ2V0LnRhZ05hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ2lucHV0Jykge1xuICAvLyAgICAgICAgIHJldHVybjtcbiAgLy8gICAgICAgfVxuXG4gIC8vICAgICAgIGUgPSBlIHx8IHdpbmRvdy5ldmVudDtcbiAgLy8gICAgICAgLy8gZ2V0IHRoZSBtb3VzZSBjdXJzb3IgcG9zaXRpb24gYXQgc3RhcnR1cDpcbiAgLy8gICAgICAgcG9zMyA9IGUuY2xpZW50WDtcbiAgLy8gICAgICAgcG9zNCA9IGUuY2xpZW50WTtcbiAgLy8gICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gY2xvc2VEcmFnRWxlbWVudDtcbiAgLy8gICAgICAgLy8gY2FsbCBhIGZ1bmN0aW9uIHdoZW5ldmVyIHRoZSBjdXJzb3IgbW92ZXM6XG4gIC8vICAgICAgIGRvY3VtZW50Lm9ubW91c2Vtb3ZlID0gZWxlbWVudERyYWc7XG4gIC8vICAgICB9O1xuXG4gIC8vICAgICBjb25zdCBlbGVtZW50RHJhZyA9IChlOiBhbnkpID0+IHtcblxuICAvLyAgICAgICBlID0gZSB8fCB3aW5kb3cuZXZlbnQ7XG4gIC8vICAgICAgIC8vIGNhbGN1bGF0ZSB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbjpcbiAgLy8gICAgICAgcG9zMSA9IHBvczMgLSBlLmNsaWVudFg7XG4gIC8vICAgICAgIHBvczIgPSBwb3M0IC0gZS5jbGllbnRZO1xuICAvLyAgICAgICBwb3MzID0gZS5jbGllbnRYO1xuICAvLyAgICAgICBwb3M0ID0gZS5jbGllbnRZO1xuICAvLyAgICAgICAvLyBzZXQgdGhlIGVsZW1lbnQncyBuZXcgcG9zaXRpb246XG4gIC8vICAgICAgIGVsbW50LnN0eWxlLnRvcCA9IGVsbW50Lm9mZnNldFRvcCAtIHBvczIgKyAncHgnO1xuICAvLyAgICAgICBlbG1udC5zdHlsZS5sZWZ0ID0gZWxtbnQub2Zmc2V0TGVmdCAtIHBvczEgKyAncHgnO1xuICAvLyAgICAgfTtcblxuICAvLyAgICAgY29uc3QgY2xvc2VEcmFnRWxlbWVudCA9ICgpID0+IHtcbiAgLy8gICAgICAgLyogc3RvcCBtb3Zpbmcgd2hlbiBtb3VzZSBidXR0b24gaXMgcmVsZWFzZWQ6Ki9cbiAgLy8gICAgICAgZG9jdW1lbnQub25tb3VzZXVwID0gbnVsbDtcbiAgLy8gICAgICAgZG9jdW1lbnQub25tb3VzZW1vdmUgPSBudWxsO1xuICAvLyAgICAgfTtcblxuICAvLyAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbW50LmlkICsgJ2hlYWRlcicpKSB7XG4gIC8vICAgICAgIC8qIGlmIHByZXNlbnQsIHRoZSBoZWFkZXIgaXMgd2hlcmUgeW91IG1vdmUgdGhlIERJViBmcm9tOiovXG4gIC8vICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbW50LmlkICsgJ2hlYWRlcicpLm9ubW91c2Vkb3duID0gZHJhZ01vdXNlRG93bjtcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIC8qIG90aGVyd2lzZSwgbW92ZSB0aGUgRElWIGZyb20gYW55d2hlcmUgaW5zaWRlIHRoZSBESVY6Ki9cbiAgLy8gICAgICAgZWxtbnQub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAvLyAgICAgfVxuICAvLyAgIH0gY2F0Y2ggKGUpIHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGUpXG4gIC8vICAgfVxuICAvLyB9XG5cblxuICBwcml2YXRlIHJlZ2lzdGVyRHJhZ0VsZW1lbnQoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IGVsbW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2RyYWdwYXJlbnQxJyk7XG4gICAgICBpZiAoIWVsbW50KSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJ0RyYWcgZWxlbWVudCBub3QgZm91bmQnKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBsZXQgcG9zMSA9IDAsIHBvczIgPSAwLCBwb3MzID0gMCwgcG9zNCA9IDA7XG5cbiAgICAgIGNvbnN0IGRyYWdNb3VzZURvd24gPSAoZTogTW91c2VFdmVudCkgPT4ge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgaWYgKHRhcmdldC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHBvczMgPSBlLmNsaWVudFg7XG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XG4gICAgICAgIFxuICAgICAgICBjb25zdCBvbk1vdXNlTW92ZSA9IChtb3ZlRXZlbnQ6IE1vdXNlRXZlbnQpID0+IGVsZW1lbnREcmFnKG1vdmVFdmVudCk7XG4gICAgICAgIGNvbnN0IG9uTW91c2VVcCA9ICgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUpO1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgb25Nb3VzZVVwKTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVsZW1lbnREcmFnID0gKGU6IE1vdXNlRXZlbnQpID0+IHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBwb3MxID0gcG9zMyAtIGUuY2xpZW50WDtcbiAgICAgICAgcG9zMiA9IHBvczQgLSBlLmNsaWVudFk7XG4gICAgICAgIHBvczMgPSBlLmNsaWVudFg7XG4gICAgICAgIHBvczQgPSBlLmNsaWVudFk7XG4gICAgICAgIFxuICAgICAgICBlbG1udC5zdHlsZS50b3AgPSAoZWxtbnQub2Zmc2V0VG9wIC0gcG9zMikgKyAncHgnO1xuICAgICAgICBlbG1udC5zdHlsZS5sZWZ0ID0gKGVsbW50Lm9mZnNldExlZnQgLSBwb3MxKSArICdweCc7XG4gICAgICB9O1xuXG4gICAgICAvLyBDaGVjayBmb3IgaGVhZGVyIGVsZW1lbnRcbiAgICAgIGNvbnN0IGhlYWRlciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGVsbW50LmlkICsgJ2hlYWRlcicpO1xuICAgICAgaWYgKGhlYWRlcikge1xuICAgICAgICBoZWFkZXIub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxtbnQub25tb3VzZWRvd24gPSBkcmFnTW91c2VEb3duO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKGUpXG4gICAgfVxuICB9XG5cbiAgYWRkTnVtYmVyKG51bTogYW55KSB7XG4gICAgaWYgKCBudW0gPT0gJyMnIHx8IG51bSA9PSAnKicgfHxudW0gPT0gJysnIHx8IE51bWJlci5pc0ludGVnZXIobnVtKSkge1xuICAgICAgaWYgKG51bSA9PSAnIycpIHtcbiAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLWhhc2gtLm1wM2ApLnBsYXkoKTtcbiAgICAgIH0gZWxzZSBpZiAobnVtID09ICcqJykge1xuICAgICAgICBuZXcgQXVkaW8oYC9hc3NldHMvZGlhbC10b25lcy9kdG1mL2R0bWYtc3Rhci0ubXAzYCkucGxheSgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3IEF1ZGlvKGAvYXNzZXRzL2RpYWwtdG9uZXMvZHRtZi9kdG1mLSR7bnVtfS0ubXAzYCkucGxheSgpO1xuICAgICAgfVxuXG4gICAgICB0aGlzLmRpYWxlZE51bWJlciArPSBudW07XG4gICAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdHJ1ZTtcblxuICAgICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XG5cbiAgICAgIHRoaXMub25EaWFsSW5wdXRDaGFuZ2UodGhpcy5kaWFsZWROdW1iZXIpXG4gICAgICAvLyB0aGlzLmRpYWxJbnB1dFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgfWVsc2UgaWYobnVtID09PSAndm9pY2VtYWlsJyl7XG4gICAgICAvLyB0aGlzLnNob3dEZWRpY2F0ZWRQb3B1cCA9IHRydWU7XG4gICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbJ2V4dGVuc2lvbi92b2ljZW1haWwvJyt0aGlzLnRva2VuXSk7XG4gICAgfVxuICB9XG4gIFxuICBoaWRlRGlhbHBhZCgpIHtcbiAgICB0aGlzLmlzRGlhbHBhZEhpZGRlbiA9IHRydWU7XG4gICAgdGhpcy5jbG9zZURpYWxwYWRFdmVudC5lbWl0KCk7XG4gICAgdGhpcy5jbGVhckFsbERpYWxlZCgpO1xuICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICB9XG4gIFxuICBvbkRpYWxJbnB1dENoYW5nZShpbnB1dFZhbDogYW55KSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vIFVwZGF0ZWQgcmVnZXggdG8gaW5jbHVkZSB4LCBYLCBleHQuLCBFeHQuLCBhbmQgLFxuICAgICAgY29uc3QgaXNOdW1lcmljSW5wdXQgPSAvXltcXGRcXHMrXFwtXSskLy50ZXN0KGlucHV0VmFsKTtcbiAgICAgIGxldCBtYWluTnVtYmVyID0gaW5wdXRWYWw7XG5cbiAgICAgIC8vIENoZWNrIGZvciBleHRlbnNpb24gaW5kaWNhdG9ycyBhbmQgc3BsaXQgdGhlIGlucHV0XG4gICAgICBjb25zdCBleHRNYXRjaCA9IGlucHV0VmFsLm1hdGNoKC8oeHxYfGV4dFxcLnxFeHRcXC58LCkoLiopLyk7XG4gICAgICBpZiAoZXh0TWF0Y2gpIHtcbiAgICAgICAgbWFpbk51bWJlciA9IGlucHV0VmFsLnN1YnN0cmluZygwLCBleHRNYXRjaC5pbmRleCkudHJpbSgpO1xuICAgICAgICB0aGlzLmNhbGxEYXRhLmV4dE51bSA9IGV4dE1hdGNoWzJdLnRyaW0oKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gaXNOdW1lcmljSW5wdXQgPyBtYWluTnVtYmVyLnJlcGxhY2UoL1tcXHNcXC1dKy9nLCAnJykgOiBtYWluTnVtYmVyO1xuXG4gICAgICB0aGlzLmNhbGxEYXRhLnBob25lID0gaXNOdW1lcmljSW5wdXQgPyB0aGlzLnNhbml0aXplZE51bSA6ICcnO1xuICAgICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IGlucHV0VmFsLmxlbmd0aCA+IDA7XG5cbiAgICAgIGlmIChpc051bWVyaWNJbnB1dCkge1xuICAgICAgICB0aGlzLmRpYWxlZE51bWJlciA9IG5ldyBBc1lvdVR5cGUoKS5pbnB1dCh0aGlzLnNhbml0aXplZE51bSk7XG4gICAgICB9XG5cbiAgICAgIC8vIGVtaXQgY3VycmVudCBudW1iZXIgd2hlbmV2ZXIgaW5wdXQgY2hhbmdlc1xuICAgICAgdGhpcy5udW1iZXJEaWFsZWQuZW1pdCh0aGlzLmRpYWxlZE51bWJlcik7XG5cbiAgICAgIGlmIChpbnB1dFZhbC5sZW5ndGggPiAyKSB7XG4gICAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IHRoaXMuY29udGFjdExpc3QuZmlsdGVyKGNvbnRhY3QgPT4ge1xuICAgICAgICAgIGNvbnN0IGZ1bGxOYW1lID0gYCR7Y29udGFjdC5maXJzdE5hbWV9ICR7Y29udGFjdC5taWRkbGVOYW1lfSAke2NvbnRhY3QubGFzdE5hbWV9YC50b0xvd2VyQ2FzZSgpO1xuICAgICAgICAgIHJldHVybiBmdWxsTmFtZS5pbmNsdWRlcyh0aGlzLnNhbml0aXplZE51bS50b0xvd2VyQ2FzZSgpKSB8fCBjb250YWN0Lm51bWJlcnNMaXN0LnNvbWUoKG51bTogYW55KSA9PiBudW0ubnVtYmVyLmluY2x1ZGVzKHRoaXMuc2FuaXRpemVkTnVtKSk7XG4gICAgICAgIH0pLnNsaWNlKDAsIDIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5maWx0ZXJlZENvbnRhY3RMaXN0ID0gW107XG4gICAgICB9XG5cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICBjb25zb2xlLmxvZyhlKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaXJzdExldHRlcihuYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBuYW1lID8gbmFtZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSA6ICcnO1xuICB9XG4gIGNsZWFySW5wdXQoKSB7XG4gICAgaWYgKHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCA+IDApIHtcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gdGhpcy5kaWFsZWROdW1iZXIuc2xpY2UoMCwgLTEpO1xuICAgICAgdGhpcy5zaG93SW5wdXRDbGVhckJ0biA9IHRoaXMuZGlhbGVkTnVtYmVyLmxlbmd0aCAhPT0gMDtcblxuICAgICAgdGhpcy5vbkRpYWxJbnB1dENoYW5nZSh0aGlzLmRpYWxlZE51bWJlcilcbiAgICB9XG4gIH1cbiAgY2xlYXJBbGxEaWFsZWQoKSB7XG4gICAgdGhpcy5kaWFsZWROdW1iZXIgPSAnJztcbiAgICB0aGlzLnNhbml0aXplZE51bSA9ICcnO1xuICAgIHRoaXMuc2hvd0lucHV0Q2xlYXJCdG4gPSBmYWxzZTtcbiAgfVxuICBnZXRDYWxsZXJJZExpc3QoKSB7XG4gICAgdGhpcy5leHRTZXJ2aWNlLmRpc3BsYXlJRCh0aGlzLnRva2VuIHx8ICcnKS5zdWJzY3JpYmUoKHJlczogYW55KSA9PiB7XG4gICAgICAvL3RoaXMuY2FsbGVySWRMaXN0ID0gcmVzLmNhbGxlcklkTGlzdC5maWx0ZXIoaXRlbSA9PiBpdGVtLnR5cGUgPT09IFwiQzJDIFNvZnRwaG9uZSBOdW1iZXJcIik7XG4gICAgICB0aGlzLmNhbGxlcklkTGlzdCA9IHJlcy5jYWxsZXJJZExpc3QuZmlsdGVyKChpdGVtOiBhbnkpID0+IGl0ZW0udm9pY2VGZWF0dXJlID09PSB0cnVlKTtcbiAgICAgIC8vIHRoaXMuY2FsbGVySWRMaXN0ID0gcmVzLmNhbGxlcklkTGlzdDtcbiAgICAgIGlmICh0aGlzLmNhbGxlcklkTGlzdC5sZW5ndGggPT0gMSkge1xuICAgICAgICB0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPSB0aGlzLmNhbGxlcklkTGlzdFswXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0aGlzLmNhbGxQcmVmZXJlbmNlID09PSAnYWx3YXlzQXNrJyB8fCB0aGlzLmNhbGxQcmVmZXJlbmNlID09PSAnc21hcnREaWFsaW5nJykge1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9IG51bGw7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gdGhpcy5jYWxsZXJJZExpc3QuZmluZChpdGVtID0+IChpdGVtLm51bWJlciA9PSB0aGlzLmNhbGxQcmVmZXJlbmNlKSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuICBnZXRDb250YWN0TGlzdCgpIHtcbiAgICB0aGlzLnR3aWxpb1NlcnZpY2UuZ2V0Q29udGFjdExpc3QoKS5zdWJzY3JpYmUoKHJlc3A6IGFueSkgPT4ge1xuICAgICAgaWYgKHJlc3AucmVzcG9uc2UgPT0gJ1N1Y2Nlc3MnKSB7XG4gICAgICAgIHRoaXMuY29udGFjdExpc3QgPSByZXNwLnBob25lQm9vaztcbiAgICAgIH1cbiAgICB9LCBlcnIgPT4ge1xuICAgICAgY29uc29sZS5sb2coZXJyKVxuICAgIH0pXG4gIH1cbiAgZ2V0RnVsbE5hbWUoY29udGFjdDogYW55KTogc3RyaW5nIHtcbiAgICBsZXQgZnVsbE5hbWUgPSBjb250YWN0LmZpcnN0TmFtZSB8fCAnJztcbiAgICBpZiAoY29udGFjdC5taWRkbGVOYW1lKSB7XG4gICAgICBmdWxsTmFtZSArPSBgICR7Y29udGFjdC5taWRkbGVOYW1lfWA7XG4gICAgfVxuICAgIGlmIChjb250YWN0Lmxhc3ROYW1lKSB7XG4gICAgICBmdWxsTmFtZSArPSBgICR7Y29udGFjdC5sYXN0TmFtZX1gO1xuICAgIH1cbiAgICByZXR1cm4gZnVsbE5hbWUudHJpbSgpO1xuICB9XG5cblxuICB0b2dnbGVDYWxsZXJJZERpdigpIHtcbiAgICB0aGlzLmlzQ2FsbGVySWRIaWRkZW4gPSAhdGhpcy5pc0NhbGxlcklkSGlkZGVuO1xuICB9XG5cbiAgb25Db250YWN0U2VsZWN0KGNvbnRhY3Q6IGFueSkge1xuICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gY29udGFjdC5udW1iZXJzTGlzdFswXS5udW1iZXI7XG4gICAgdGhpcy5jYWxsRGF0YS5uYW1lID0gdGhpcy5nZXRGdWxsTmFtZShjb250YWN0KTtcbiAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3QuaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgIHRoaXMub25EaWFsSW5wdXRDaGFuZ2UodGhpcy5kaWFsZWROdW1iZXIpO1xuICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICB9XG5cbiAgZW5kQ2FsbCgpIHtcbiAgICB0cnkge1xuICAgICAgY29uc29sZS5sb2coJ0VuZGluZyBjYWxsJyk7XG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuZmlsdGVyZWRDb250YWN0TGlzdCA9IFtdO1xuICAgICAgXG4gICAgICAvLyBSZXNldCBjYWxsIGRhdGFcbiAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgICAgIHBob25lOiAnJyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgIGRpYWw6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TnVtOiAnJyxcbiAgICAgICAgZXh0TnVtOiAnJ1xuICAgICAgfTtcbiAgICAgIFxuICAgICAgLy8gUmVzZXQgZGlhbGVkIG51bWJlclxuICAgICAgdGhpcy5kaWFsZWROdW1iZXIgPSAnJztcbiAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gJyc7XG4gICAgICBcbiAgICAgIC8vIEVtaXQgZW5kIGNhbGwgZXZlbnRcbiAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgICAgIGNvbnNvbGUubG9nKCdDYWxsIGVuZGVkIHN1Y2Nlc3NmdWxseScpO1xuICAgICAgXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGVuZENhbGw6JywgZXJyb3IpO1xuICAgICAgLy8gRXZlbiBpZiB0aGVyZSdzIGFuIGVycm9yLCB0cnkgdG8gcmVzZXQgdGhlIHN0YXRlXG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHRoaXMuY2FsbERhdGEgPSB7XG4gICAgICAgIHBob25lOiAnJyxcbiAgICAgICAgbmFtZTogJycsXG4gICAgICAgIGltZzogJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnLFxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgIGRpYWw6IGZhbHNlLFxuICAgICAgICBkaXNwbGF5TnVtOiAnJyxcbiAgICAgICAgZXh0TnVtOiAnJ1xuICAgICAgfTtcbiAgICAgIHRoaXMuZW5kQ2FsbEV2ZW50LmVtaXQoKTtcbiAgICB9XG4gIH1cblxuICAvLyBhc3luYyBpbml0aWF0ZUNhbGwoKSB7XG4gIC8vICAgdHJ5IHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKCdJbml0aWF0aW5nIGNhbGwgd2l0aCBudW1iZXI6JywgdGhpcy5kaWFsZWROdW1iZXIpO1xuICAgICAgXG4gIC8vICAgICBpZiAoIXRoaXMuZGlhbGVkTnVtYmVyICYmIHRoaXMubGFzdERpYWxlZCkge1xuICAvLyAgICAgICBjb25zb2xlLmxvZygnVXNpbmcgbGFzdCBkaWFsZWQgbnVtYmVyOicsIHRoaXMubGFzdERpYWxlZC5udW1iZXIpO1xuICAvLyAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnN0IGlzSW52YWxpZCA9IGF3YWl0IHRoaXMuaXNJbnZhbGlkTnVtYmVyKCk7XG4gIC8vICAgICBpZiAoaXNJbnZhbGlkKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ludmFsaWQgbnVtYmVyIGZvcm1hdCcpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIHRoaXMuc2F2ZUxhc3REaWFsZWQoKTtcbiAgLy8gICAgIHRoaXMuaXNTYXZlZENvbnRhY3REaWFsbGVkKCk7XG4gICAgICBcbiAgLy8gICAgIC8vIENoZWNrIHBheW1lbnQgc3RhdHVzXG4gIC8vICAgICB0aGlzLmlzUGF5bWVudER1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXltZW50RHVlJykgPT09ICd0cnVlJztcbiAgLy8gICAgIGlmICh0aGlzLmlzUGF5bWVudER1ZSkge1xuICAvLyAgICAgICBjb25zb2xlLndhcm4oJ1BheW1lbnQgaXMgZHVlJyk7XG4gIC8vICAgICAgIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLiBUbyBjb250aW51ZSB1c2luZyBvdXIgc2VydmljZXMsIGtpbmRseSBzdWJzY3JpYmUgdG8gYXZvaWQgaW50ZXJydXB0aW9ucy4nKTtcbiAgLy8gICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICAvLyBDaGVjayBpZiBkaWFsaW5nIG93biBudW1iZXJcbiAgLy8gICAgIGlmICh0aGlzLnNhbml0aXplZE51bSA9PT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XG4gIC8vICAgICAgIGNvbnNvbGUuZXJyb3IoJ0F0dGVtcHRlZCB0byBkaWFsIG93biBudW1iZXInKTtcbiAgLy8gICAgICAgc3dhbCgnRXJyb3InLCAnWW91IGNhbm5vdCBkaWFsIHlvdXIgb3duIG51bWJlcicpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIC8vIENoZWNrIG1pY3JvcGhvbmUgcGVybWlzc2lvbnNcbiAgLy8gICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSBhd2FpdCB0aGlzLmNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAvLyAgICAgICBjb25zb2xlLndhcm4oJ01pY3JvcGhvbmUgcGVybWlzc2lvbiBub3QgZ3JhbnRlZCcpO1xuICAvLyAgICAgICBhd2FpdCB0aGlzLmFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgIH1cblxuICAvLyAgICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignTm8gY2FsbGVyIElEIHNlbGVjdGVkJyk7XG4gIC8vICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAvLyAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ1BsZWFzZSBzZWxlY3QgYSBDMkMgbnVtYmVyIHRvIGNhbGwgZnJvbScpO1xuICAvLyAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgLy8gICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gIC8vICAgICAgIH0sIDMwMDApO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnNvbGUubG9nKCdHZXR0aW5nIG51bWJlciB3aXRoIGNvdW50cnkgY29kZS4uLicpO1xuICAvLyAgICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XG4gICAgICBcbiAgLy8gICAgIHRyeSB7XG4gIC8vICAgICAgIGF3YWl0IHRoaXMuZ2V0VG9OdW1iZXIodGhpcy5zYW5pdGl6ZWROdW0pO1xuICAvLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgLy8gICAgICAgY29uc29sZS5lcnJvcignRXJyb3IgZ2V0dGluZyBudW1iZXIgd2l0aCBjb3VudHJ5IGNvZGU6JywgZXJyb3IpO1xuICAvLyAgICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0Vycm9yIHByb2Nlc3NpbmcgbnVtYmVyLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGlmICh0aGlzLnRlcm1pbmF0ZUNhbGwpIHtcbiAgLy8gICAgICAgY29uc29sZS5sb2coJ0NhbGwgdGVybWluYXRlZCBieSB1c2VyJyk7XG4gIC8vICAgICAgIHRoaXMudGVybWluYXRlQ2FsbCA9IGZhbHNlO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIC8vIFByZXBhcmUgY2FsbCBkYXRhXG4gIC8vICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAvLyAgICAgICAuLi50aGlzLmNhbGxEYXRhLFxuICAvLyAgICAgICBwaG9uZTogdGhpcy5zYW5pdGl6ZWROdW0sXG4gIC8vICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgLy8gICAgICAgZGlhbDogdHJ1ZSxcbiAgLy8gICAgICAgZnJvbTogdGhpcy5pc1NtYXJ0RGlhbENhbGwgPyB0aGlzLmNhbGxEYXRhLmZyb20gOiB0aGlzLnNlbGVjdGVkQ2FsbGVySWQubnVtYmVyLFxuICAvLyAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAvLyAgICAgfTtcblxuICAvLyAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gIC8vICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgdGhpcy5jYWxsSW5pdGlhdGVkLmVtaXQoeyAuLi50aGlzLmNhbGxEYXRhIH0pO1xuICAgICAgXG4gIC8vICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIFxuICAvLyAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gIC8vICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBpbiBpbml0aWF0ZUNhbGw6JywgZXJyb3IpO1xuICAvLyAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdGYWlsZWQgdG8gaW5pdGlhdGUgY2FsbC4gUGxlYXNlIHRyeSBhZ2Fpbi4nKTtcbiAgLy8gICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IGZhbHNlO1xuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgIH1cbiAgLy8gICAgIC8vdGhpcy5jbGVhckFsbERpYWxlZCgpO1xuICAvLyAgIC8vIH0gZWxzZSB7XG4gIC8vICAgLy8gICBzd2FsKCdFcnJvcicsICdUcmlhbCBwZXJpb2QgaXMgb3Zlci4gUGxlYXNlIHNldHVwIHBheW1lbnQgbWV0aG9kIHRvIGNvbnRpbnVlIHNlcnZpY2VzJylcbiAgLy8gICAvLyB9XG4gIC8vIH1cblxuXG4gIC8vICBhc3luYyBpbml0aWF0ZUNhbGwoKSB7XG4gIC8vICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgLy8gICAgIHRoaXMuc2FuaXRpemVkTnVtID0gdGhpcy5sYXN0RGlhbGVkLm51bWJlcjtcbiAgLy8gICB9XG4gIC8vICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgLy8gICBpZiAoaXNJbnZhbGlkKSB7XG4gIC8vICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuc2F2ZUxhc3REaWFsZWQoKTtcbiAgLy8gICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xuICAvLyAgIC8vbGV0IGlzQ2FsbGVySWRTZXQgPSBhd2FpdCB0aGlzLmlzQ2FsbGVySWRTZXQoKTtcbiAgLy8gICB0aGlzLmlzUGF5bWVudER1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXltZW50RHVlJykgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgLy8gICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgLy8gICAgIHN3YWwoJ1dhcm5pbmcnLCAnUGxlYXNlIG5vdGUgdGhhdCB5b3VyIHBheW1lbnQgaXMgZHVlLCBUbyBjb250aW51ZSBvbiB5b3VyIHNlcnZpY2VzIGtpbmRseSBzdWJzY3JpYmUgdG8gdXNlIHVuaW50ZXJydXB0ZWQgc2VydmljZXMuJyk7XG4gIC8vICAgICByZXR1cm47XG4gIC8vICAgfVxuICAvLyAgIHRoaXMuaXNUcmlhbFBlcmlvZE92ZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHJpYWxPdmVyJykgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgLy8gICAvLyBpZiAoIXRoaXMuaXNUcmlhbFBlcmlvZE92ZXIpIHtcbiAgLy8gICAgIGlmICh0aGlzLnNhbml0aXplZE51bSA9PSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHdpbGlvTnVtYmVyJykpIHtcbiAgLy8gICAgICAgc3dhbCgnRXJyb3InLCAnWW91IGNhbiBub3QgZGlhbCB0aGlzIG51bWJlcicpO1xuICAvLyAgICAgICByZXR1cm47XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSBhd2FpdCB0aGlzLmNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgIGlmIChoYXNQZXJtaXNzaW9uKSB7XG4gIC8vICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQpIHtcbiAgLy8gICAgICAgICAvL2NsZWFyIGRpc3BsYXlOdW0gaWYgdmFsdWUgaXMgYmluZGVkIGZyb20gcHJldmlvdXMgY2FsbFxuICAvLyAgICAgICAgIHRoaXMuY2FsbERhdGEuZGlzcGxheU51bSA9ICcnO1xuICAvLyAgICAgICAgIC8vIGdldCBudW1iZXIgdG8gYmUgZGlhbGxlZCBmcm9tIGJhY2tlbmRcbiAgLy8gICAgICAgICBhd2FpdCB0aGlzLmdldFRvTnVtYmVyKHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgLy8gICAgICAgICBpZiAodGhpcy50ZXJtaW5hdGVDYWxsKSB7XG4gIC8vICAgICAgICAgICB0aGlzLnRlcm1pbmF0ZUNhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHJldHVybjtcbiAgLy8gICAgICAgICB9XG4gIC8vICAgICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuc2FuaXRpemVkTnVtO1xuICAvLyAgICAgICAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgICB0aGlzLmNhbGxEYXRhLmRpYWwgPSB0cnVlO1xuICAvLyAgICAgICAgIGlmICghdGhpcy5pc1NtYXJ0RGlhbENhbGwpIHtcbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEuZnJvbSA9IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXI7XG4gIC8vICAgICAgICAgfVxuICAgICAgICAgIFxuICAvLyAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICAgICAgICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgLy8gICAgICAgICAgICAgICAuLi50aGlzLmNhbGxEYXRhLFxuICAvLyAgICAgICAgICAgICAgIHBob25lOiB0aGlzLnNhbml0aXplZE51bSxcbiAgLy8gICAgICAgICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gIC8vICAgICAgICAgICAgICAgZGlhbDogdHJ1ZSxcbiAgLy8gICAgICAgICAgICAgICBmcm9tOiB0aGlzLmlzU21hcnREaWFsQ2FsbCA/IHRoaXMuY2FsbERhdGEuZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXIsXG4gIC8vICAgICAgICAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgLy8gICAgICAgICAgICAgfTtcblxuICAvLyAgICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggZGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgLy8gICAgICAgICAgICAgdGhpcy5pc0NhbGxJblByb2dyZXNzID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgICAgdGhpcy5jYWxsSW5pdGlhdGVkLmVtaXQoeyAuLi50aGlzLmNhbGxEYXRhIH0pO1xuICAvLyAgICAgICAgIHJldHVybiB0cnVlO1xuICAvLyAgICAgICB9IGVsc2Uge1xuICAvLyAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAvLyAgICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnU2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsJyk7XG4gIC8vICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gIC8vICAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gIC8vICAgICAgICAgfSwgMzAwMCk7XG4gIC8vICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIC8vdGhpcy5jYWxsaW5nT3BlbkV2ZW50LmVtaXQoeyBwaG9uZTogdGhpcy5kaWFsZWROdW1iZXIgfSk7XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICBhd2FpdCB0aGlzLmFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gIC8vICAgICB9XG4gIC8vICAgICAvL3RoaXMuY2xlYXJBbGxEaWFsZWQoKTtcbiAgLy8gICAvLyB9IGVsc2Uge1xuICAvLyAgIC8vICAgc3dhbCgnRXJyb3InLCAnVHJpYWwgcGVyaW9kIGlzIG92ZXIuIFBsZWFzZSBzZXR1cCBwYXltZW50IG1ldGhvZCB0byBjb250aW51ZSBzZXJ2aWNlcycpXG4gIC8vICAgLy8gfVxuICAvLyB9XG5cblxuICAvLyBhc3luYyBpbml0aWF0ZUNhbGwoKSB7XG4gIC8vICAgdHJ5e1xuICAvLyAgICAgaWYgKCF0aGlzLmRpYWxlZE51bWJlciAmJiB0aGlzLmxhc3REaWFsZWQpIHtcbiAgLy8gICAgICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmxhc3REaWFsZWQubnVtYmVyO1xuICAvLyAgICAgfVxuXG4gIC8vICAgICBjb25zdCBpc0ludmFsaWQgPSBhd2FpdCB0aGlzLmlzSW52YWxpZE51bWJlcigpO1xuICAvLyAgICAgaWYgKGlzSW52YWxpZCkge1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG4gIC8vICAgICB0aGlzLnNhdmVMYXN0RGlhbGVkKCk7XG4gIC8vICAgICB0aGlzLmlzU2F2ZWRDb250YWN0RGlhbGxlZCgpO1xuICAvLyAgICAgLy9sZXQgaXNDYWxsZXJJZFNldCA9IGF3YWl0IHRoaXMuaXNDYWxsZXJJZFNldCgpO1xuXG4gIC8vICAgICB0aGlzLmlzUGF5bWVudER1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXltZW50RHVlJykgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgLy8gICAgIGlmICh0aGlzLmlzUGF5bWVudER1ZSkge1xuICAvLyAgICAgICBzd2FsKCdXYXJuaW5nJywgJ1BsZWFzZSBub3RlIHRoYXQgeW91ciBwYXltZW50IGlzIGR1ZSwgVG8gY29udGludWUgb24geW91ciBzZXJ2aWNlcyBraW5kbHkgc3Vic2NyaWJlIHRvIHVzZSB1bmludGVycnVwdGVkIHNlcnZpY2VzLicpO1xuICAvLyAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICB9XG5cbiAgLy8gICAgIHRoaXMuaXNUcmlhbFBlcmlvZE92ZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHJpYWxPdmVyJykgPT0gJ2ZhbHNlJyA/IGZhbHNlIDogdHJ1ZTtcbiAgLy8gICAgIC8vIGlmICghdGhpcy5pc1RyaWFsUGVyaW9kT3Zlcikge1xuICAvLyAgICAgICBpZiAodGhpcy5zYW5pdGl6ZWROdW0gPT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XG4gIC8vICAgICAgICAgc3dhbCgnRXJyb3InLCAnWW91IGNhbiBub3QgZGlhbCB0aGlzIG51bWJlcicpO1xuICAvLyAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgLy8gICAgICAgfVxuXG4gIC8vICAgICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSBhd2FpdCB0aGlzLmNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgLy8gICAgICAgaWYgKGhhc1Blcm1pc3Npb24pIHtcbiAgLy8gICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENhbGxlcklkKSB7XG4gIC8vICAgICAgICAgICAvL2NsZWFyIGRpc3BsYXlOdW0gaWYgdmFsdWUgaXMgYmluZGVkIGZyb20gcHJldmlvdXMgY2FsbFxuICAvLyAgICAgICAgICAgdGhpcy5jYWxsRGF0YS5kaXNwbGF5TnVtID0gJyc7XG4gIC8vICAgICAgICAgICAvLyBnZXQgbnVtYmVyIHRvIGJlIGRpYWxsZWQgZnJvbSBiYWNrZW5kXG4gIC8vICAgICAgICAgICBhd2FpdCB0aGlzLmdldFRvTnVtYmVyKHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgLy8gICAgICAgICAgIGlmICh0aGlzLnRlcm1pbmF0ZUNhbGwpIHtcbiAgLy8gICAgICAgICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XG4gIC8vICAgICAgICAgICAgIHJldHVybjtcbiAgLy8gICAgICAgICAgIH1cbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEucGhvbmUgPSB0aGlzLnNhbml0aXplZE51bTtcbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEuaXNJbmNvbWluZ0NhbGwgPSBmYWxzZTtcbiAgLy8gICAgICAgICAgIHRoaXMuY2FsbERhdGEuZGlhbCA9IHRydWU7XG4gIC8vICAgICAgICAgICBpZiAoIXRoaXMuaXNTbWFydERpYWxDYWxsKSB7XG4gIC8vICAgICAgICAgICAgIHRoaXMuY2FsbERhdGEuZnJvbSA9IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXI7XG4gIC8vICAgICAgICAgICB9XG4gICAgICAgICAgICBcbiAgLy8gICAgICAgICAgIHRoaXMuaXNDYWxsSW5Qcm9ncmVzcyA9IHRydWU7XG4gIC8vICAgICAgICAgICAgICAgICB0aGlzLmNhbGxEYXRhID0ge1xuICAvLyAgICAgICAgICAgICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgLy8gICAgICAgICAgICAgICAgIHBob25lOiB0aGlzLnNhbml0aXplZE51bSxcbiAgLy8gICAgICAgICAgICAgICAgIGlzSW5jb21pbmdDYWxsOiBmYWxzZSxcbiAgLy8gICAgICAgICAgICAgICAgIGRpYWw6IHRydWUsXG4gIC8vICAgICAgICAgICAgICAgICBmcm9tOiB0aGlzLmlzU21hcnREaWFsQ2FsbCA/IHRoaXMuY2FsbERhdGEuZnJvbSA6IHRoaXMuc2VsZWN0ZWRDYWxsZXJJZC5udW1iZXIsXG4gIC8vICAgICAgICAgICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAvLyAgICAgICAgICAgICAgIH07XG5cbiAgLy8gICAgICAgICAgICAgICBjb25zb2xlLmxvZygnSW5pdGlhdGluZyBjYWxsIHdpdGggZGF0YTonLCB0aGlzLmNhbGxEYXRhKTtcbiAgLy8gICAgICAgICAgICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAvLyAgICAgICAgICAgICAgIHRoaXMuY2FsbEluaXRpYXRlZC5lbWl0KHsgLi4udGhpcy5jYWxsRGF0YSB9KTtcbiAgLy8gICAgICAgICAgIHJldHVybiB0cnVlO1xuICAvLyAgICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgLy8gICAgICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnU2VsZWN0IGEgQzJDIG51bWJlciB0byBjYWxsJyk7XG4gIC8vICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgLy8gICAgICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAvLyAgICAgICAgICAgfSwgMzAwMCk7XG4gIC8vICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gIC8vICAgICAgICAgfVxuICAvLyAgICAgICAgIC8vdGhpcy5jYWxsaW5nT3BlbkV2ZW50LmVtaXQoeyBwaG9uZTogdGhpcy5kaWFsZWROdW1iZXIgfSk7XG4gIC8vICAgICAgIH0gZWxzZSB7XG4gIC8vICAgICAgICAgYXdhaXQgdGhpcy5hc2tGb3JNaWNyb3Bob25lUGVybWlzc2lvbigpO1xuICAvLyAgICAgICB9XG4gIC8vICAgICAgIC8vdGhpcy5jbGVhckFsbERpYWxlZCgpO1xuICAvLyAgICAgLy8gfSBlbHNlIHtcbiAgLy8gICAgIC8vICAgc3dhbCgnRXJyb3InLCAnVHJpYWwgcGVyaW9kIGlzIG92ZXIuIFBsZWFzZSBzZXR1cCBwYXltZW50IG1ldGhvZCB0byBjb250aW51ZSBzZXJ2aWNlcycpXG4gIC8vICAgICAvLyB9XG4gIC8vICAgfWNhdGNoKGUpe1xuICAvLyAgICAgY29uc29sZS5lcnJvcignRXJyb3IgaW4gaW5pdGlhdGVDYWxsOicsIGUpO1xuXG4gIC8vICAgICB0aGlzLnNob3dEaWFsQWxlcnQoJ0ZhaWxlZCB0byBpbml0aWF0ZSBjYWxsLiBQbGVhc2UgdHJ5IGFnYWluLicpO1xuXG4gIC8vICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcblxuICAvLyAgICAgcmV0dXJuIGZhbHNlO1xuICAvLyAgIH1cbiAgLy8gfVxuXG5cbiAgYXN5bmMgaW5pdGlhdGVDYWxsKCkge1xuICAgIHRyeSB7XG4gICAgICBpZiAoIXRoaXMuZGlhbGVkTnVtYmVyICYmIHRoaXMubGFzdERpYWxlZCkge1xuICAgICAgICB0aGlzLnNhbml0aXplZE51bSA9IHRoaXMubGFzdERpYWxlZC5udW1iZXI7XG4gICAgICB9XG4gIFxuICAgICAgY29uc3QgaXNJbnZhbGlkID0gYXdhaXQgdGhpcy5pc0ludmFsaWROdW1iZXIoKTtcbiAgICAgIGlmIChpc0ludmFsaWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgdGhpcy5zYXZlTGFzdERpYWxlZCgpO1xuICAgICAgdGhpcy5pc1NhdmVkQ29udGFjdERpYWxsZWQoKTtcbiAgXG4gICAgICB0aGlzLmlzUGF5bWVudER1ZSA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdwYXltZW50RHVlJykgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICBpZiAodGhpcy5pc1BheW1lbnREdWUpIHtcbiAgICAgICAgc3dhbCgnV2FybmluZycsICdQbGVhc2Ugbm90ZSB0aGF0IHlvdXIgcGF5bWVudCBpcyBkdWUsIFRvIGNvbnRpbnVlIG9uIHlvdXIgc2VydmljZXMga2luZGx5IHN1YnNjcmliZSB0byB1c2UgdW5pbnRlcnJ1cHRlZCBzZXJ2aWNlcy4nKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICBcbiAgICAgIHRoaXMuaXNUcmlhbFBlcmlvZE92ZXIgPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgndHJpYWxPdmVyJykgPT09ICdmYWxzZScgPyBmYWxzZSA6IHRydWU7XG4gICAgICBcbiAgICAgIGlmICh0aGlzLnNhbml0aXplZE51bSA9PT0gbG9jYWxTdG9yYWdlLmdldEl0ZW0oJ3R3aWxpb051bWJlcicpKSB7XG4gICAgICAgIHN3YWwoJ0Vycm9yJywgJ1lvdSBjYW4gbm90IGRpYWwgdGhpcyBudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICBcbiAgICAgIGNvbnN0IGhhc1Blcm1pc3Npb24gPSBhd2FpdCB0aGlzLmNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTtcbiAgICAgIGlmICghaGFzUGVybWlzc2lvbikge1xuICAgICAgICBhd2FpdCB0aGlzLmFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgXG4gICAgICBpZiAoIXRoaXMuc2VsZWN0ZWRDYWxsZXJJZCkge1xuICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdTZWxlY3QgYSBDMkMgbnVtYmVyIHRvIGNhbGwnKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5zaGFrZURlZGljYXRlZEJ0biA9IGZhbHNlO1xuICAgICAgICB9LCAzMDAwKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICBcbiAgICAgIC8vIENsZWFyIGRpc3BsYXlOdW0gaWYgdmFsdWUgaXMgYm91bmQgZnJvbSBwcmV2aW91cyBjYWxsXG4gICAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSAnJztcbiAgICAgIFxuICAgICAgLy8gR2V0IG51bWJlciB0byBiZSBkaWFsZWQgZnJvbSBiYWNrZW5kXG4gICAgICBhd2FpdCB0aGlzLmdldFRvTnVtYmVyKHRoaXMuc2FuaXRpemVkTnVtKTtcbiAgICAgIGlmICh0aGlzLnRlcm1pbmF0ZUNhbGwpIHtcbiAgICAgICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgXG4gICAgICAvLyBVcGRhdGUgY2FsbCBkYXRhIGluIGEgc2luZ2xlIG9wZXJhdGlvblxuICAgICAgdGhpcy5jYWxsRGF0YSA9IHtcbiAgICAgICAgLi4udGhpcy5jYWxsRGF0YSxcbiAgICAgICAgcGhvbmU6IHRoaXMuc2FuaXRpemVkTnVtLFxuICAgICAgICBpc0luY29taW5nQ2FsbDogZmFsc2UsXG4gICAgICAgIGRpYWw6IHRydWUsXG4gICAgICAgIGZyb206IHRoaXMuaXNTbWFydERpYWxDYWxsID8gdGhpcy5jYWxsRGF0YS5mcm9tIDogdGhpcy5zZWxlY3RlZENhbGxlcklkLm51bWJlcixcbiAgICAgICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICAgIH07XG4gIFxuICAgICAgY29uc29sZS5sb2coJ0luaXRpYXRpbmcgY2FsbCB3aXRoIGRhdGE6JywgdGhpcy5jYWxsRGF0YSk7XG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgICAgdGhpcy5jYWxsSW5pdGlhdGVkLmVtaXQoeyAuLi50aGlzLmNhbGxEYXRhIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gIFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJ0Vycm9yIGluIGluaXRpYXRlQ2FsbDonLCBlKTtcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnRmFpbGVkIHRvIGluaXRpYXRlIGNhbGwuIFBsZWFzZSB0cnkgYWdhaW4uJyk7XG4gICAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSBmYWxzZTtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBhc3luYyBpc0ludmFsaWROdW1iZXIoKSB7XG4gICAgdHJ5IHtcbiAgICAgIGlmKHRoaXMuc2FuaXRpemVkTnVtID09ICcnKXtcbiAgICAgICAgdGhpcy5zaG93RGlhbEFsZXJ0KCdJbnZhbGlkIE51bWJlcicpO1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHZhbGlkTnVtYmVyUGF0dGVybiA9IC9eWytcXGRcXHMoKS1dKiQvOyAvLyBSZWd1bGFyIGV4cHJlc3Npb24gdG8gbWF0Y2ggdmFsaWQgY2hhcmFjdGVyc1xuICAgICAgY29uc3QgcGhvbmVOdW1iZXIgPSB0aGlzLnNhbml0aXplZE51bTtcbiAgICAgIGlmICghdmFsaWROdW1iZXJQYXR0ZXJuLnRlc3QocGhvbmVOdW1iZXIpKSB7XG4gICAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRoaXMuc2hvd0RpYWxBbGVydCgnSW52YWxpZCBOdW1iZXInKTtcbiAgICAgIHJldHVybiB0cnVlOyAvLyBSZXR1cm4gdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZCwgbWVhbmluZyB0aGUgbnVtYmVyIGlzIGludmFsaWRcbiAgICB9XG4gIH1cbiAgXG4gIHNhdmVMYXN0RGlhbGVkKCkge1xuICAgIGNvbnN0IGNvbnRhY3QgPSB0aGlzLmZpbHRlcmVkQ29udGFjdExpc3QuZmluZChjID0+IGMubnVtYmVyc0xpc3Quc29tZSgobjogYW55KSA9PiBuLm51bWJlciA9PT0gdGhpcy5kaWFsZWROdW1iZXIpKTtcbiAgICBpZiAoY29udGFjdCkge1xuICAgICAgdGhpcy5sYXN0RGlhbGVkID0ge1xuICAgICAgICBuYW1lOiBjb250YWN0Lm5hbWUsXG4gICAgICAgIGltYWdlOiBjb250YWN0LmltYWdlLFxuICAgICAgICBudW1iZXI6IHRoaXMuZGlhbGVkTnVtYmVyXG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBpZih0aGlzLmRpYWxlZE51bWJlcil7XG4gICAgICAgIHRoaXMubGFzdERpYWxlZCA9IHsgbnVtYmVyOiB0aGlzLmRpYWxlZE51bWJlciB9O1xuICAgICAgfVxuICAgICAgXG4gICAgfVxuICB9XG4gIGlzU2F2ZWRDb250YWN0RGlhbGxlZCgpe1xuICAgIGxldCBwaG9uZU51bSA9IHRoaXMuc2FuaXRpemVkTnVtLnJlcGxhY2UoL1xccysvZywgJycpO1xuICAgIGxldCBjb250YWN0ID0gIHRoaXMuY29udGFjdExpc3QuZmlsdGVyKChjb250YWN0OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBjb250YWN0Lm51bWJlcnNMaXN0LnNvbWUoKG51bTogYW55KSA9PiBudW0ubnVtYmVyID09PSBwaG9uZU51bSlcbiAgICB9KTtcbiAgICBpZihjb250YWN0Lmxlbmd0aCl7XG4gICAgICB0aGlzLmNhbGxEYXRhLm5hbWUgPSBgJHtjb250YWN0WzBdLmZpcnN0TmFtZX0gJHtjb250YWN0WzBdLm1pZGRsZU5hbWV9ICR7Y29udGFjdFswXS5sYXN0TmFtZX1gLnRvTG93ZXJDYXNlKCk7XG4gICAgICB0aGlzLmNhbGxEYXRhLmltZyA9IGNvbnRhY3RbMF0uaW1hZ2UgfHwgJ2Fzc2V0cy9pbWFnZXMvdXNlci5qcGcnO1xuICAgICAgdGhpcy5jYWxsRGF0YS5waG9uZSA9IHRoaXMuc2FuaXRpemVkTnVtO1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHNob3dEaWFsQWxlcnQobWVzc2FnZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kaWFsQWxlcnQgPSB7XG4gICAgICBtc2c6IG1lc3NhZ2UsXG4gICAgICBzaG93OiB0cnVlXG4gICAgfTtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuZGlhbEFsZXJ0LnNob3cgPSBmYWxzZTtcbiAgICB9LCAzMDAwKTtcbiAgfVxuICBhc3luYyBpc0NhbGxlcklkU2V0KCk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB0a24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnZXh0X3Rva2VuJyk7XG4gICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMuZXh0U2VydmljZS5mZXRjaENhbGxlcklkKHRrbiB8fCAnJykudG9Qcm9taXNlKCk7XG4gICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3RyaWFsT3ZlcicsIHJlcy50cmlhbE92ZXIpO1xuICAgICAgICB0aGlzLnR3aWxpb1NlcnZpY2UuaXNUcmlhbE92ZXIubmV4dChyZXMudHJpYWxPdmVyKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ3BheW1lbnREdWUnLCByZXMucGF5bWVudER1ZSk7XG4gICAgICAgIHRoaXMudHdpbGlvU2VydmljZS5pc1BheW1lbnREdWUubmV4dChyZXMucGF5bWVudER1ZSk7XG4gICAgICB9XG4gICAgICBpZiAocmVzLmNhbGxlcmlkKSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWxsZXJJRCcsIHJlcy5jYWxsZXJpZCk7XG5cbiAgICAgICAgdGhpcy5leHRTZXJ2aWNlLmNoYW5nZU1lc3NhZ2UocmVzLmNhbGxlcmlkKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKCdjYWxsZXJJRCcsICdOb3Qgc2V0Jyk7XG4gICAgICAgIHRoaXMuZXh0U2VydmljZS5jaGFuZ2VNZXNzYWdlKCdOb3Qgc2V0Jyk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2NhbGxlcklEJykgIT09ICdOb3Qgc2V0Jyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgY29uc29sZS5sb2coZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFzeW5jIGNoZWNrTWljcm9waG9uZVBlcm1pc3Npb24oKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHN0cmVhbSA9IGF3YWl0IG5hdmlnYXRvci5tZWRpYURldmljZXMuZ2V0VXNlck1lZGlhKHsgYXVkaW86IHRydWUgfSk7XG4gICAgICBzdHJlYW0uZ2V0VHJhY2tzKCkuZm9yRWFjaCh0cmFjayA9PiB0cmFjay5zdG9wKCkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGlmICgoZXJyb3IgYXMgYW55KS5uYW1lID09PSAnTm90QWxsb3dlZEVycm9yJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGFzeW5jIGFza0Zvck1pY3JvcGhvbmVQZXJtaXNzaW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzdHJlYW0gPSBhd2FpdCBuYXZpZ2F0b3IubWVkaWFEZXZpY2VzLmdldFVzZXJNZWRpYSh7IGF1ZGlvOiB0cnVlIH0pO1xuICAgICAgc3RyZWFtLmdldFRyYWNrcygpLmZvckVhY2godHJhY2sgPT4gdHJhY2suc3RvcCgpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgY29uc29sZS5lcnJvcignVXNlciBkZW5pZWQgbWljcm9waG9uZSBwZXJtaXNzaW9uOicsIGVycm9yKTtcbiAgICB9XG4gIH1cbiAgLy8gYmVsb3cgZnVuY3Rpb24gaXMgdG8gZ2V0IHRoZSBjb3VudHJ5IGNvZGUgd2l0aCBudW1iZXIgZnJvbSBzZXJ2ZXIgXG4gIGFzeW5jIGdldFRvTnVtYmVyKGRpYWxlZE51bWJlcjogc3RyaW5nKSB7XG4gICAgXG4gICAgICBpZiAoZGlhbGVkTnVtYmVyWzBdICE9PSAnKycpIHtcbiAgICAgICAgLy8gdGhpcyBpcyBjYXNlIHdoZW4gdXNlciBnZW9sb2NhdGlvbiBkaWFsIGNvZGUgaXMgb25cbiAgICAgICAgbGV0IGlwQWRkcmVzczogYW55ID0gYXdhaXQgdGhpcy5pcFNlcnZpY2UuZ2V0SXBBZGRyZXNzSW5mbygpLnRvUHJvbWlzZSgpO1xuICAgICAgICBjb25zdCByZXM6IGFueSA9IGF3YWl0IHRoaXMudHdpbGlvU2VydmljZS5nZXRUb051bWJlcihkaWFsZWROdW1iZXIsaXBBZGRyZXNzLmFkZHJlc3MuY291bnRyeUNvZGUpLnRvUHJvbWlzZSgpO1xuICAgICAgICBpZiAocmVzLnN0YXR1cyA9PSAyMDApIHtcbiAgICAgICAgICB0aGlzLnRvYXN0VGltZW91dCA9IHJlcy50aW1lSW50ZXJ2YWwgKiAxMDAwO1xuICAgICAgICAgIGF3YWl0IHRoaXMuc2hvd051bWJlclRvYXN0KHJlcyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgfVxuICBpc0FsZXJ0RW5hYmxlKCkge1xuICAgIHJldHVybiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaXNBbGVydEVuYWJsZScpO1xuICB9XG4gIGFzeW5jIHNob3dOdW1iZXJUb2FzdChkYXRhOiBhbnkpIHtcbiAgICBjb25zdCBpc0FsZXJ0T24gPSAobG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2lzQ291bnRyeUNvZGVUb2FzdE9uJykpO1xuICAgIGlmIChpc0FsZXJ0T24gPT0gJ3RydWUnKSB7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gdHJ1ZTtcbiAgICAgIHRoaXMuY2FsbE51bWJlclRvYXN0Lm51bWJlciA9IGRhdGEudG9OdW1iZXI7XG4gICAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gZGF0YS5kaXNwbGF5TnVtYmVyO1xuICAgIH1cbiAgICBcbiAgICBcbiAgICB0aGlzLmNhbGxEYXRhLmRpc3BsYXlOdW0gPSBkYXRhLmRpc3BsYXlOdW1iZXI7XG4gICAgLy90aGlzLmNhbGxEYXRhLnBob25lID0gZGF0YS50b051bWJlcjtcbiAgICBhd2FpdCB0aGlzLmRlbGF5KHRoaXMudG9hc3RUaW1lb3V0KTtcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IGRhdGEudG9OdW1iZXI7XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSBkYXRhLnRvTnVtYmVyO1xuICAgIHRoaXMuY2FsbE51bWJlclRvYXN0LnNob3cgPSBmYWxzZTtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5udW1iZXIgPSAnJztcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtID0gJyc7XG4gIH1cbiAgZGVsYXkobXM6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZTx2b2lkPihyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxuICBpc01pbmltaXNlZDogYm9vbGVhbiA9IGZhbHNlO1xuICBvbk1pbmltaXNlKGlzTWluaW1pc2VkOiBib29sZWFuKSB7XG4gICAgdGhpcy5pc01pbmltaXNlZCA9IGlzTWluaW1pc2VkO1xuICAgIHRoaXMubWluaW1pc2VFdmVudC5lbWl0KGlzTWluaW1pc2VkKTtcbiAgfVxuICBoYW5kbGVOdW1iZXJQYXN0ZShldmVudDogQ2xpcGJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIGNvbnN0IGNsaXBib2FyZERhdGEgPSBldmVudC5jbGlwYm9hcmREYXRhIHx8ICh3aW5kb3cgYXMgYW55KS5jbGlwYm9hcmREYXRhO1xuICAgIGNvbnN0IHBhc3RlZERhdGEgPSBjbGlwYm9hcmREYXRhLmdldERhdGEoJ3RleHQnKTtcblxuICAgIC8vIExvZyB0aGUgcGFzdGVkIGNvbnRlbnQgdG8gdGhlIGNvbnNvbGVcbiAgICBpZihwYXN0ZWREYXRhKXtcbiAgICAgIHRoaXMuZGlhbGVkTnVtYmVyID0gcGFzdGVkRGF0YTtcbiAgICAgIHRoaXMuc2FuaXRpemVkTnVtID0gcGFzdGVkRGF0YTtcbiAgICB9XG4gICAgXG4gIH1cbiAgb25FbnRlcihudW06c3RyaW5nKSB7XG4gICAgY29uc29sZS5sb2cobnVtLCAnbnVtYmVyIGZuJylcbiAgICB0aGlzLmRpYWxlZE51bWJlciA9IHRoaXMuZGlhbGVkTnVtYmVyICtudW07XG4gICAgdGhpcy5zYW5pdGl6ZWROdW0gPSB0aGlzLmRpYWxlZE51bWJlcjtcbiAgICB0aGlzLnNob3dJbnB1dENsZWFyQnRuID0gdHJ1ZTtcbiAgICB0aGlzLm51bWJlckRpYWxlZC5lbWl0KHRoaXMuZGlhbGVkTnVtYmVyKTtcbiAgfVxuICBcbiAgZ2V0VXNlckNhbGxTZXR0aW5nKCkge1xuICAgIGNvbnN0IHRrbiA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKCdleHRfdG9rZW4nKTtcbiAgICB0aGlzLmV4dFNlcnZpY2UuZmV0Y2hDYWxsZXJJZCh0a24gfHwgJycpLnN1YnNjcmliZSgocmVzcDogYW55KSA9PiB7XG4gICAgICBpZiAocmVzcC5zdGF0dXMgPT0gMjAwKSB7XG4gICAgICAgIC8vdGhpcy5jYWxsUHJlZmVybmNlID0gcmVzcC51c2VyU2V0dGluZztcbiAgICAgICAgdGhpcy5jYWxsUHJlZmVyZW5jZSA9IHJlc3AuY2FsbGVyaWQ7XG4gICAgICAgIHRoaXMuZ2V0Q2FsbGVySWRMaXN0KCk7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuICBvbkRlZGljYXRlZE51bVNlbGVjdChpZDogYW55KSB7XG4gICAgdGhpcy5zZWxlY3RlZENhbGxlcklkID0gaWQ7XG4gICAgdGhpcy5pc0NhbGxlcklkSGlkZGVuID0gdHJ1ZTtcbiAgICB0aGlzLmV4dFNlcnZpY2Uuc2V0Q2FsbGVySWQoaWQpO1xuICB9XG4gIGNhbmNlbERpYWxOdW1iZXIoKSB7XG4gICAgdGhpcy50ZXJtaW5hdGVDYWxsID0gdHJ1ZTtcbiAgICB0aGlzLmNhbGxOdW1iZXJUb2FzdC5zaG93ID0gZmFsc2U7XG4gIH1cblxuICBoYW5kbGVEaXZLZXlkb3duKGV2OmFueSl7XG4gICAgaWYodGhpcy5kaWFsZWROdW1iZXIubGVuZ3RoID09IDApe1xuICAgICAgdGhpcy5kaWFsSW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG4gICAgaWYgKGV2LmtleSA9PT0gJ0VudGVyJykge1xuICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRpYWxwYWQgaXMgb3BlblxuICAgICAgaWYgKCF0aGlzLmlzRGlhbHBhZEhpZGRlbikge1xuICAgICAgICBpZih0aGlzLmRpYWxlZE51bWJlci5sZW5ndGggPiAyICYmIHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCl7XG4gICAgICAgICAgdGhpcy5pbml0aWF0ZUNhbGwoKTtcbiAgICAgICAgfVxuICAgICAgICBpZighdGhpcy5zZWxlY3RlZENhbGxlcklkKXtcbiAgICAgICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gdHJ1ZTtcbiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZTtcbiAgICAgICAgICB9LCAxMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgb25DYWxsQnRuTW91c2VFbnRlcihldjogYW55KSB7XG4gICAgaWYgKCF0aGlzLnNlbGVjdGVkQ2FsbGVySWQgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnYWx3YXlzQXNrJykgfHwgKHRoaXMuc2VsZWN0ZWRDYWxsZXJJZCA9PSAnc21hcnREaWFsaW5nJykpIHtcbiAgICAgIHRoaXMuc2hha2VEZWRpY2F0ZWRCdG4gPSB0cnVlO1xuICAgIH1cblxuICB9XG4gIG9uQ2FsbEJ0bk1vdXNlTGVhdmUoZXY6IGFueSkge1xuICAgIGlmICghdGhpcy5zZWxlY3RlZENhbGxlcklkIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ2Fsd2F5c0FzaycpIHx8ICh0aGlzLnNlbGVjdGVkQ2FsbGVySWQgPT0gJ3NtYXJ0RGlhbGluZycpKSB7XG4gICAgICB0aGlzLnNoYWtlRGVkaWNhdGVkQnRuID0gZmFsc2U7XG4gICAgfVxuICB9XG4gIGFjY2VwdE5ld0luY29taW5nQ2FsbChjYWxsOiBDYWxsKSB7XG4gICAgLy9maXJzdCBjdXQgdGhlIGN1cnJlbnQgY2FsbFxuICAgIC8vdGhpcy5jYWxsRGF0YSA9IGNhbGw7XG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxEYXRhID0gY2FsbDtcbiAgfVxuICByZWplY3ROZXdJbmNvbWluZ0NhbGwoY2FsbDogQ2FsbCkge1xuICAgIGNhbGwucmVqZWN0KCk7XG4gICAgdGhpcy5uZXdJbmNvbWluZ0NhbGxzID0gdGhpcy5uZXdJbmNvbWluZ0NhbGxzLmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGNhbGwucGFyYW1ldGVycyBhcyBhbnkpLkNhbGxTaWQpO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsc0xpc3QgPSB0aGlzLmluY29taW5nQ2FsbHNMaXN0LmZpbHRlcigoaXRlbTogYW55KSA9PiBpdGVtLnBhcmFtZXRlcnMuQ2FsbFNpZCAhPT0gKGNhbGwucGFyYW1ldGVycyBhcyBhbnkpLkNhbGxTaWQpO1xuICB9XG4gIG5ld0luY29taW5nQ2FsbEluaXRpYXRlZCgpIHtcbiAgICB0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MgPSB0cnVlO1xuICAgIHRoaXMubmV3SW5jb21pbmdDYWxscyA9IFtdO1xuICAgIHRoaXMuaW5jb21pbmdDYWxsSW5pdGlhdGVkLmVtaXQoKTtcbiAgfVxuICBpbmNvbWluZ0NhbGxzTmV3SW5mbyhkYXRhOmFueSl7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTGlzdCA9IGRhdGE7XG4gICAgdGhpcy5pbmNvbWluZ0NhbGxzTmV3SW5mb0V2ZW50LmVtaXQoZGF0YSk7XG4gIH1cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnNvbGUubG9nKCdDbGVhbmluZyB1cCBDMmNEaWFscGFkQ29tcG9uZW50Jyk7XG4gICAgICBcbiAgICAgIC8vIFVuc3Vic2NyaWJlIGZyb20gYWxsIHN1YnNjcmlwdGlvbnNcbiAgICAgIGlmICh0aGlzLnN1YnNjcmlwdGlvbnMpIHtcbiAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIEVuZCBhbnkgYWN0aXZlIGNhbGxcbiAgICAgIGlmICh0aGlzLmlzQ2FsbEluUHJvZ3Jlc3MpIHtcbiAgICAgICAgdGhpcy5lbmRDYWxsKCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIENsZWFyIGFueSB0aW1lb3V0cyBvciBpbnRlcnZhbHMgaWYgdGhleSBleGlzdFxuICAgICAgaWYgKHRoaXMudG9hc3RUaW1lb3V0KSB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRvYXN0VGltZW91dCk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIGNvbnNvbGUubG9nKCdDMmNEaWFscGFkQ29tcG9uZW50IGNsZWFudXAgY29tcGxldGUnKTtcbiAgICAgIFxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdFcnJvciBkdXJpbmcgY29tcG9uZW50IGNsZWFudXA6JywgZXJyb3IpO1xuICAgIH1cbiAgfVxufVxuIiwiPGRpdiBpZD1cImRyYWdwYXJlbnQxXCIgW25nU3R5bGVdPVwieydkaXNwbGF5Jzppc0RpYWxwYWRIaWRkZW4gPyAnbm9uZSc6ICdibG9jayd9XCI+XHJcbiAgPGxpYi1jYWxsLXByb2dyZXNzICpuZ0lmPVwiaXNDYWxsSW5Qcm9ncmVzc1wiXHJcbiAgIChlbmRDYWxsRXZlbnQpPVwiZW5kQ2FsbCgpXCJcclxuICAgKG1pbmltaXNlRXZlbnQpID0gXCJvbk1pbmltaXNlKCRldmVudClcIlxyXG4gICAoaW5jb21pbmdDYWxsSW5pdGlhdGVkKT1cIm5ld0luY29taW5nQ2FsbEluaXRpYXRlZCgpXCJcclxuICAgW25ld0luY29taW5nQ2FsbERhdGFdPVwibmV3SW5jb21pbmdDYWxsRGF0YVwiXHJcbiAgIFtuZXdJbmNvbWluZ0NhbGxzTGlzdF09XCJpbmNvbWluZ0NhbGxzTGlzdFwiXHJcbiAgIChpbmNvbWluZ0NhbGxzTmV3SW5mbyk9XCJpbmNvbWluZ0NhbGxzTmV3SW5mbygkZXZlbnQpXCJcclxuICAgIFtjYWxsRGF0YV09XCJjYWxsRGF0YVwiPjwvbGliLWNhbGwtcHJvZ3Jlc3M+XHJcbiAgICBcclxuICA8ZGl2IGNsYXNzPVwiZGlhbHBhZC1jb250YWluZXJcIiBbbmdDbGFzc109XCJ7J21pbmktZGlhbHBhZCc6IGlzTWluaW1pc2VkfVwiIHRhYmluZGV4PVwiMFwiIChrZXlkb3duKT1cImhhbmRsZURpdktleWRvd24oJGV2ZW50KVwiPlxyXG4gICAgPGRpdiBpZD1cInRvcFBhbmVsXCIgW25nU3R5bGVdPVwieydoZWlnaHQnOiBjYWxsZXJJZExpc3QubGVuZ3RoID8gJzQwJScgOiAnMzklJ31cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImRpYWxwYWQtYWxlcnRzXCIgKm5nSWY9XCJkaWFsQWxlcnQuc2hvd1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJuby1zZWxlY3Rpb24tYWxlcnRcIj5cclxuICAgICAgICAgIDwhLS0gPHAgY2xhc3M9XCJtYi0wXCI+U2VsZWN0IEMyQyBudW1iZXIgdG8gY2FsbDwvcD4gLS0+XHJcbiAgICAgICAgICA8cCBjbGFzcz1cIm1iLTBcIj57e2RpYWxBbGVydC5tc2d9fTwvcD5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtdGltZXNcIiAoY2xpY2spPVwic2hha2VEZWRpY2F0ZWRCdG4gPSBmYWxzZVwiPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkaWFscGFkLWFsZXJ0c1wiICpuZ0lmPVwiY2FsbE51bWJlclRvYXN0LnNob3dcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZGlhbGJveC1wb3AxIGFsZXJ0IGZhZGUgc2hvd1wiIFtuZ0NsYXNzXT1cImNhbGxOdW1iZXJUb2FzdC50eXBlXCIgcm9sZT1cImFsZXJ0XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMSBteS1hdXRvIHRleHQtbGVmdFwiPlxyXG4gICAgICAgICAgICAgIFlvdSdyIGNhbGxpbmcgPHN0cm9uZz57e2NhbGxOdW1iZXJUb2FzdC5kaXNwbGF5TnVtfX08L3N0cm9uZz5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXJpZ2h0XCI+XHJcbiAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tZGlzYyBwLTAgcHgtMVwiIChjbGljayk9XCJjYW5jZWxEaWFsTnVtYmVyKClcIj5DYW5jZWwgQ2FsbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwhLS0gPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc3VjY2VzcyBidG4tZGlzYyBwLTAgcHgtMlwiPkNvbnRpbnVlPC9idXR0b24+IC0tPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgXHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgc3R5bGU9XCJwYWRkaW5nOiAwIDE4cHhcIiAocGFzdGUpPVwiaGFuZGxlTnVtYmVyUGFzdGUoJGV2ZW50KVwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXgganVzdGlmeS1jb250ZW50LWJldHdlZW4gbXQtMlwiPlxyXG4gICAgICAgICAgPHA+PC9wPlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cImhpZGVEaWFscGFkKClcIj5cclxuICAgICAgICAgICAgPHN2ZyB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgaGVpZ2h0PVwiMjRweFwiIHZpZXdCb3g9XCIwIC05NjAgOTYwIDk2MFwiIHdpZHRoPVwiMjRweFwiIGZpbGw9XCIjZmZmZmZmXCI+PHBhdGggZD1cIm0yNTYtMjAwLTU2LTU2IDIyNC0yMjQtMjI0LTIyNCA1Ni01NiAyMjQgMjI0IDIyNC0yMjQgNTYgNTYtMjI0IDIyNCAyMjQgMjI0LTU2IDU2LTIyNC0yMjQtMjI0IDIyNFpcIi8+PC9zdmc+XHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWJveFwiPlxyXG4gICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgI2RpYWxJbnB1dCBwbGFjZWhvbGRlcj1cIkVudGVyIGEgbmFtZSBvciBudW1iZXJcIiB0YWJpbmRleD1cIjFcIiBbKG5nTW9kZWwpXT1cImRpYWxlZE51bWJlclwiIChuZ01vZGVsQ2hhbmdlKT1cIm9uRGlhbElucHV0Q2hhbmdlKCRldmVudClcIi8+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIlwiIGlkPVwiaW5wdXQtY2xlYXItYnRuXCIgKGNsaWNrKT1cImNsZWFySW5wdXQoKVwiICpuZ0lmPVwic2hvd0lucHV0Q2xlYXJCdG5cIj5cclxuICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjUwcHhcIiBoZWlnaHQ9XCIzMHB4XCIgdmlld0JveD1cIjAgMTAgNDAgNjBcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCIgeG1sbnM6eGxpbms9XCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rXCIgdmVyc2lvbj1cIjEuMVwiIGJhc2VQcm9maWxlPVwiZnVsbFwiIGVuYWJsZS1iYWNrZ3JvdW5kPVwibmV3IDAgMCA3Ni4wMCA3Ni4wMFwiIHhtbDpzcGFjZT1cInByZXNlcnZlXCI+XHJcbiAgICAgICAgICAgICAgPHBhdGggZmlsbD1cIiM1ZDYwNjFcIiBmaWxsLW9wYWNpdHk9XCIxXCIgc3Ryb2tlLXdpZHRoPVwiMC4yXCIgc3Ryb2tlLWxpbmVqb2luPVwicm91bmRcIiBkPVwiTSA0Ny41MjgyLDQyLjk0OTdMIDQyLjU3ODQsMzhMIDQ3LjUyODIsMzMuMDUwMkwgNDQuOTQ5NywzMC40NzE4TCA0MCwzNS40MjE2TCAzNS4wNTAyLDMwLjQ3MThMIDMyLjQ3MTgsMzMuMDUwMkwgMzcuNDIxNiwzOEwgMzIuNDcxOCw0Mi45NDk3TCAzNS4wNTAyLDQ1LjUyODJMIDQwLDQwLjU3ODRMIDQ0Ljk0OTcsNDUuNTI4MkwgNDcuNTI4Miw0Mi45NDk3IFogTSAxOC4wMTQ3LDQxLjUzNTVMIDI2Ljk2NDYsNTAuNDg1NEMgMjguMDY4Myw1MS41ODkgMjksNTIgMzEsNTJMIDUyLDUyQyA1NC43NjE0LDUyIDU3LDQ5Ljc2MTQgNTcsNDdMIDU3LDI5QyA1NywyNi4yMzg2IDU0Ljc2MTQsMjQgNTIsMjRMIDMxLDI0QyAyOSwyNCAyOC4wNjgzLDI0LjQxMTMgMjYuOTY0NiwyNS41MTQ5TCAxOC4wMTQ3LDM0LjQ2NDVDIDE2LjA2MjEsMzYuNDE3MSAxNi4wNjIxLDM5LjU4MjkgMTguMDE0Nyw0MS41MzU1IFogTSAzMSw0OUMgMzAsNDkgMjkuNjA0OCw0OC44ODI4IDI5LjA4Niw0OC4zNjQxTCAyMC4xMzYxLDM5LjQxNDJDIDE5LjM1NSwzOC42MzMyIDE5LjM1NSwzNy4zNjY5IDIwLjEzNjEsMzYuNTg1OEwgMjkuMDg2LDI3LjYzNjJDIDI5LjYwNDgsMjcuMTE3NSAzMCwyNyAzMSwyNy4wMDAxTCA1MiwyNy4wMDAxQyA1My4xMDQ2LDI3LjAwMDEgNTQsMjcuODk1NSA1NCwyOS4wMDAxTCA1NCw0Ny4wMDAxQyA1NCw0OC4xMDQ2IDUzLjEwNDYsNDkuMDAwMSA1Miw0OS4wMDAxTCAzMSw0OSBaIFwiLz5cclxuICAgICAgICAgICAgPC9zdmc+ICAgICAgICBcclxuICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiaW5wdXQtaW5mby1pY29uXCIgcGxhY2VtZW50PVwiYm90dG9tLXJpZ2h0XCIgdG9vbHRpcENsYXNzPVwiaW5wdXQtdG9vbHRpcFwiIG5nYlRvb2x0aXA9XCJGb3IgZXh0ZW5zaW9uIGRpYWxpbmcsIHVzZSBmb3JtYXRzIGxpa2UgKzEyMzQ1Njc4OTEwIHgxMjMsKzEyMzQ1Njc4OTEwIGV4dC4xMjMsICsxMjM0NTY3ODkxMCwxMjNcIj48aSBjbGFzcz1cImZhIGZhLWluZm8tY2lyY2xlXCI+PC9pPjwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiZ3VpZGVcIiAqbmdJZj1cImNhbGxlcklkTGlzdC5sZW5ndGggJiYgIShkaWFsZWROdW1iZXIubGVuZ3RoID4gMilcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZ3VpZGV0ZXh0XCI+UGxlYXNlIGVudGVyIGEgbnVtYmVyIG9yIHNlbGVjdCBhIHNhdmVkIGNvbnRhY3Q8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPCEtLSA8ZGl2IGNsYXNzPVwiaW5wdXQtZXJyb3JcIiAqbmdJZj1cImRpYWxBbGVydC5zaG93XCI+XHJcbiAgICAgICAgICA8c3Bhbj57e2RpYWxBbGVydC5tc2d9fTwvc3Bhbj5cclxuICAgICAgICA8L2Rpdj4gLS0+XHJcbiAgICAgICAgPGRpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb250YWN0LWNhcmRcIiAqbmdGb3I9XCJsZXQgY29udGFjdCBvZiBmaWx0ZXJlZENvbnRhY3RMaXN0XCIgKGNsaWNrKT1cIm9uQ29udGFjdFNlbGVjdChjb250YWN0KVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1pbWdcIj5cclxuICAgICAgICAgICAgICA8aW1nIFtzcmNdPVwiY29udGFjdC5pbWFnZVwiIGFsdD1cInVzZXIgaW1hZ2VcIiBsb2FkaW5nPVwibGF6eVwiICpuZ0lmPVwiY29udGFjdC5pbWFnZSBlbHNlIGFscGhhTmFtZVwiLz5cclxuICAgICAgICAgICAgICA8bmctdGVtcGxhdGUgI2FscGhhTmFtZT5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY29udGFjdC1hbHBoYS1pbWdcIj57e2dldEZpcnN0TGV0dGVyKGNvbnRhY3QuZmlyc3ROYW1lKX19PC9zcGFuPlxyXG4gICAgICAgICAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGFjdC1kZXRhaWxzXCI+XHJcbiAgICAgICAgICAgICAgPHAgc3R5bGU9XCJtYXJnaW4tYm90dG9tOiA0cHhcIiBjbGFzcz1cImNvbnRhY3QtbmFtZVwiPnt7Z2V0RnVsbE5hbWUoY29udGFjdCkgfX08L3A+XHJcbiAgICAgICAgICAgICAgPHA+e3tjb250YWN0Lm51bWJlcnNMaXN0WzBdLm51bWJlcn19PC9wPlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cIndhdmUtY29udGFpbmVyXCI+XHJcbiAgICAgICAgPHN2Z1xyXG4gICAgICAgICAgY2xhc3M9XCJ3YXZlc1wiXHJcbiAgICAgICAgICB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCJcclxuICAgICAgICAgIHhtbG5zOnhsaW5rPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiXHJcbiAgICAgICAgICB2aWV3Qm94PVwiMCAyNCAxNTAgMjhcIlxyXG4gICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz1cIm5vbmVcIlxyXG4gICAgICAgICAgc2hhcGUtcmVuZGVyaW5nPVwiYXV0b1wiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgPGRlZnM+XHJcbiAgICAgICAgICAgIDxwYXRoXHJcbiAgICAgICAgICAgICAgaWQ9XCJnZW50bGUtd2F2ZVwiXHJcbiAgICAgICAgICAgICAgZD1cIk0tMTYwIDQ0YzMwIDAgNTgtMTggODgtMThzIDU4IDE4IDg4IDE4IDU4LTE4IDg4LTE4IDU4IDE4IDg4IDE4IHY0NGgtMzUyelwiXHJcbiAgICAgICAgICAgIC8+XHJcbiAgICAgICAgICA8L2RlZnM+XHJcbiAgICAgICAgICA8ZyBjbGFzcz1cInBhcmFsbGF4XCI+XHJcbiAgICAgICAgICAgIDx1c2VcclxuICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICB4PVwiNDhcIlxyXG4gICAgICAgICAgICAgIHk9XCIwXCJcclxuICAgICAgICAgICAgICBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjcpXCJcclxuICAgICAgICAgICAgLz5cclxuICAgICAgICAgICAgPHVzZVxyXG4gICAgICAgICAgICAgIHhsaW5rOmhyZWY9XCIjZ2VudGxlLXdhdmVcIlxyXG4gICAgICAgICAgICAgIHg9XCI0OFwiXHJcbiAgICAgICAgICAgICAgeT1cIjNcIlxyXG4gICAgICAgICAgICAgIGZpbGw9XCJyZ2JhKDI1NSwyNTUsMjU1LDAuNSlcIlxyXG4gICAgICAgICAgICAvPlxyXG4gICAgICAgICAgICA8IS0tIDx1c2VcclxuICAgICAgICAgICAgICB4bGluazpocmVmPVwiI2dlbnRsZS13YXZlXCJcclxuICAgICAgICAgICAgICB4PVwiNDhcIlxyXG4gICAgICAgICAgICAgIHk9XCI1XCJcclxuICAgICAgICAgICAgICBmaWxsPVwicmdiYSgyNTUsMjU1LDI1NSwwLjMpXCJcclxuICAgICAgICAgICAgLz4gLS0+XHJcbiAgICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj1cIiNnZW50bGUtd2F2ZVwiIHg9XCI0OFwiIHk9XCI3XCIgZmlsbD1cIiNmZmZcIiAvPlxyXG4gICAgICAgICAgPC9nPlxyXG4gICAgICAgIDwvc3ZnPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImJ0bi1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZFwiPlxyXG4gICAgICA8YnV0dG9uIGNsYXNzPVwiZGlhbC1idG5cIiAqbmdGb3I9XCJsZXQga2V5IG9mIGtleXBhZFZhbDtsZXQgaSA9IGluZGV4XCJcclxuICAgICAgKGtleWRvd24uZW50ZXIpPVwib25FbnRlcihrZXkubnVtKVwiIChjbGljayk9XCJhZGROdW1iZXIoa2V5Lm51bSlcIlxyXG4gICAgICBbbmdTdHlsZV09XCJ7J21hcmdpbi10b3AnOiBrZXkudGV4dCA9PT0gJysnID8gJzNweCcgOiAnMCd9XCJcclxuICAgICAgIFt0YWJpbmRleF09XCJkaWFsZWROdW1iZXIubGVuZ3RoID8gJzAnOiBpKzJcIiBsb25nUHJlc3MgKGxvbmdQcmVzcyk9XCJhZGROdW1iZXIoa2V5LnRleHQpXCIgc2hvcnRQcmVzcyAoc2hvcnRQcmVzcyk9XCJhZGROdW1iZXIoa2V5Lm51bSlcIj5cclxuICAgICAgICB7e2tleS5udW19fSBcclxuICAgICAgICA8c3BhbiAqbmdJZj1cImtleS5udW0gPT0gMTtlbHNlIG90aGVyVGhhbk9uZVwiIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB2b2ljZW1haWxcIj5cclxuICAgICAgICAgIHZvaWNlbWFpbFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgICA8bmctdGVtcGxhdGUgI290aGVyVGhhbk9uZT5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYnRuLWFsYmhhYmV0c1wiIFtuZ0NsYXNzXT1cInsncGx1c1NpZ24nOiBrZXkudGV4dCA9PT0gJysnfVwiPnt7a2V5LnRleHQgPyBrZXkudGV4dCA6ICcmbmJzcDsnfX08L3NwYW4+XHJcbiAgICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPC9idXR0b24+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgY2xhc3M9XCJjYWxsLWJ0bi1jb250YWluZXJcIiAqbmdJZj1cIiFpc01pbmltaXNlZFwiIChtb3VzZWVudGVyKT1cIm9uQ2FsbEJ0bk1vdXNlRW50ZXIoJGV2ZW50KVwiIChtb3VzZWxlYXZlKT1cIm9uQ2FsbEJ0bk1vdXNlTGVhdmUoJGV2ZW50KVwiPlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY2FsbC1idG5cIiAoY2xpY2spPVwiaW5pdGlhdGVDYWxsKClcIiBbdGFiaW5kZXhdPVwiZGlhbGVkTnVtYmVyLmxlbmd0aCA/ICcyJzogJzE1J1wiXHJcbiAgICAgICAgW25nU3R5bGVdPVwieydwb2ludGVyLWV2ZW50cyc6IGRpYWxlZE51bWJlci5sZW5ndGggJiYgc2VsZWN0ZWRDYWxsZXJJZCA/ICdhdXRvJyA6ICdub25lJywgJ29wYWNpdHknOiBkaWFsZWROdW1iZXIubGVuZ3RoICYmIHNlbGVjdGVkQ2FsbGVySWQgPyAnMScgOiAnMC41J31cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPlxyXG4gICAgICAgICAgY2FsbFxyXG4gICAgICAgIDwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJjYWxsZXJJZExpc3QubGVuZ3RoICYmICFpc01pbmltaXNlZFwiIGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInNob3duQ2FsbGVySWRcIiAqbmdJZj1cInNlbGVjdGVkQ2FsbGVySWQ7IGVsc2UgYXNrQmxvY2tcIiAoY2xpY2spPVwidG9nZ2xlQ2FsbGVySWREaXYoKVwiPlxyXG4gICAgICAgIDxkaXY+XHJcbiAgICAgICAgICA8c3BhbiBbbmdDbGFzc109XCInZmkgZmktJyArIHNlbGVjdGVkQ2FsbGVySWQ/Lmlzb0NvZGU/LnRvTG93ZXJDYXNlKClcIj48L3NwYW4+XHJcbiAgICAgICAgICB7e3NlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn19XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8bmctdGVtcGxhdGUgI2Fza0Jsb2NrPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzaG93bkNhbGxlcklkXCIgIChjbGljayk9XCJ0b2dnbGVDYWxsZXJJZERpdigpXCIgW25nQ2xhc3NdPVwieyAndGlsdC1zaGFraW5nJzogc2hha2VEZWRpY2F0ZWRCdG4gfVwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBqdXN0aWZ5LWNvbnRlbnQtY2VudGVyXCI+XHJcbiAgICAgICAgICAgIDxoNSBjbGFzcz1cIm1iLTBcIj5TZWxlY3QgQzJDIG51bWJlcjwvaDU+XHJcbiAgICAgICAgICAgIDwhLS0gPHNwYW4gY2xhc3M9XCJtbC0yXCIgc3R5bGU9XCJvcGFjaXR5Oi44O21hcmdpbi10b3A6MnB4XCI+XHJcbiAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL2ljb25fZG93bl9hcnJvdy5zdmdcIiBhbHQ9XCJkb3duXCIgd2lkdGg9XCIxMHB4XCI+XHJcbiAgICAgICAgICAgIDwvc3Bhbj4gLS0+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmEgZmEtYW5nbGUtZG93biBtbC0yIHRleHQtYmx1ZVwiIHN0eWxlPVwibWFyZ2luLXRvcDoycHhcIj48L3NwYW4+XHJcbiAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9uZy10ZW1wbGF0ZT5cclxuICAgICAgPGRpdiBjbGFzcz1cImd1aWRlMlwiICpuZ0lmPVwic2hha2VEZWRpY2F0ZWRCdG5cIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cImd1aWRldGV4dFwiPlBsZWFzZSBzZWxlY3QgYSBudW1iZXIgZnJvbSBiZWxvdyBkcm9wZG93bjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuXHJcbiAgICA8ZGl2ICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aDsgZWxzZSBub0NhbGxlcklkTWVzc2FnZVwiPlxyXG4gICAgPGRpdiBjbGFzcz1cImNhbGxlci1pZC1saXN0LWNvbnRhaW5lclwiICpuZ0lmPVwiY2FsbGVySWRMaXN0Lmxlbmd0aCAmJiAhaXNNaW5pbWlzZWRcIiBpZD1cImNhbGxlcklkQ29udGFpbmVyXCIgIFtuZ0NsYXNzXT1cInsndmlzaWJsZSc6ICFpc0NhbGxlcklkSGlkZGVufVwiID5cclxuICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGZsZXg7IGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlblwiPlxyXG4gICAgICAgIDwhLS0gPGg0PlNlbGVjdCBDMkMgU29mdHBob25lIE51bWJlcjwvaDQ+IC0tPlxyXG4gICAgICAgICA8aDQ+TWFrZSBvdXRnb2luZyBjYWxsIHVzaW5nPC9oND5cclxuICAgICAgICA8c3BhblxyXG4gICAgICAgICAgY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkXCJcclxuICAgICAgICAgIHN0eWxlPVwiY3Vyc29yOiBwb2ludGVyXCJcclxuICAgICAgICAgIChjbGljayk9XCJpc0NhbGxlcklkSGlkZGVuID0gdHJ1ZVwiXHJcbiAgICAgICAgPlxyXG4gICAgICAgICAgY2xvc2VcclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8dWw+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY2FsbGVySWQgb2YgY2FsbGVySWRMaXN0XCI+XHJcbiAgICAgICAgICA8bGkgW25nQ2xhc3NdPVwieydzZWxlY3RlZENhbGxlcklkQ2xhc3MnOiBjYWxsZXJJZD8ubnVtYmVyID09IHNlbGVjdGVkQ2FsbGVySWQ/Lm51bWJlcn1cIiAoY2xpY2spPVwib25EZWRpY2F0ZWROdW1TZWxlY3QoY2FsbGVySWQpXCI+XHJcbiAgICAgICAgICAgIDxkaXY+XHJcbiAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiJ2ZpIGZpLScgKyBjYWxsZXJJZD8uaXNvQ29kZT8udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICB7e2NhbGxlcklkPy5udW1iZXJ9fVxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPHNwYW4+e3tjYWxsZXJJZD8uY291bnRyeU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgIDwvbGk+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgIDwvdWw+XHJcbiAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPG5nLXRlbXBsYXRlICNub0NhbGxlcklkTWVzc2FnZT5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJuby1jYWxsZXItaWQtbWVzc2FnZVwiPlRvIG1ha2UgYW55IHZvaWNlIGNhbGxzLCBwbGVhc2UgPGEgcm91dGVyTGluaz1cIi9leHRlbnNpb24vZGVkaWNhdGVkbnVtYmVyL3t7dG9rZW59fVwiIGNsYXNzPVwiY2xpY2staGVyZS1saW5rXCIgdGl0bGU9XCJTZXR0aW5ncyA+IEMyQyBOdW1iZXJcIj5zdWJzY3JpYmU8L2E+IHRvIGEgdm9pY2UgY2FwYWJsZSBDMkMgTnVtYmVyLlxyXG4gICAgICA8L3NwYW4+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPGRpdiBjbGFzcz1cImRlZGljYXRlZC1vdmVybGF5XCIgKm5nSWY9XCJzaG93RGVkaWNhdGVkUG9wdXBcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImNhcmQgZGVkaWNhdGVkTnVtUG9wdXBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2FyZC1oZWFkZXIgY2hvb3NlRGVkaWNhdGVkSGVhZGVyXCI+XHJcbiAgICAgICAgICA8aDU+Q2hvb3NlIEMyQyBOdW1iZXI8L2g1PlxyXG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIGRpYWwtY2xvc2UtYnRuXCIgKGNsaWNrKT1cInNob3dEZWRpY2F0ZWRQb3B1cCA9IGZhbHNlXCI+Y2xvc2U8L3NwYW4+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNhcmQtYm9keSBkZWRpY2F0ZWROdW1MaXN0XCI+XHJcbiAgICAgICAgICA8dWw+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNhbGxlcklkIG9mIGNhbGxlcklkTGlzdFwiPlxyXG4gICAgICAgICAgICAgIDxsaSBbbmdDbGFzc109XCJ7J3NlbGVjdGVkQ2FsbGVySWRDbGFzcyc6IGNhbGxlcklkPy5udW1iZXIgPT0gc2VsZWN0ZWRDYWxsZXJJZD8ubnVtYmVyfVwiIChjbGljayk9XCJzaG93RGVkaWNhdGVkUG9wdXAgPSBmYWxzZVwiPlxyXG4gICAgICAgICAgICAgICAgPGRpdj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwiJ2ZpIGZpLScgKyBjYWxsZXJJZD8uaXNvQ29kZT8udG9Mb3dlckNhc2UoKVwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAge3tjYWxsZXJJZD8ubnVtYmVyfX1cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgICAgPHNwYW4+e3tjYWxsZXJJZD8uY291bnRyeU5hbWV9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICA8L2xpPlxyXG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgIDwvdWw+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaW5jb21pbmctY2FsbC13aWRnZXRcIiAqbmdGb3I9XCJsZXQgY2FsbCBvZiBuZXdJbmNvbWluZ0NhbGxzO2xldCBpID0gaW5kZXhcIiBbbmdTdHlsZV09XCJ7J3RvcCc6ICgzMCArIGkgKiA3MikgKyAncHgnfVwiPlxyXG4gICAgICA8ZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJpbmMtdXNlci1pbWdcIj5cclxuICAgICAgICAgIDxpbWcgc3JjPVwiYXNzZXRzL2ltYWdlcy91c2VyLmpwZ1wiIGFsdD1cInVzZXIgaW1hZ2VcIj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICBcclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiPlxyXG4gICAgICAgIDwhLS0gPGg2IGNsYXNzPVwibWItMSBmb250LXdlaWdodC1ib2xkXCI+SW5jb21pbmcgQ2FsbDwvaDY+IC0tPlxyXG4gICAgICAgIDxwIGNsYXNzPVwiaW5jLXVzZXItbmFtZVwiPnt7Y2FsbC5jdXN0b21QYXJhbWV0ZXJzLmdldCgnbmFtZScpfX08L3A+XHJcbiAgICAgICAgPHA+e3tjYWxsLnBhcmFtZXRlcnMuRnJvbX19PC9wPlxyXG5cclxuICAgICAgICA8IS0tIDxwIGNsYXNzPVwiaW5jLXVzZXItbmFtZVwiPkpvaG4gRG9lPC9wPiBcclxuICAgICAgICA8cD4rMTIzMzc0NzI0ODk8L3A+XHJcbiAgICAgICAgPHAgc3R5bGU9XCJmb250LXNpemU6IDEycHg7Y29sb3I6I2Q1ZDVkNSAhaW1wb3J0YW50O21hcmdpbi10b3A6MnB4XCI+Q2FsbCBvbiArMTIyNjQ1ODQxMDA8L3A+IC0tPlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiaW5jLWNhbGwtYnRuIGluYy1hY2NlcHQtYnRuIG1yLTJcIiAoY2xpY2spPVwiYWNjZXB0TmV3SW5jb21pbmdDYWxsKGNhbGwpXCI+XHJcbiAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWRcIiBzdHlsZT1cImNvbG9yOiB3aGl0ZVwiPlxyXG4gICAgICAgICAgICBjYWxsXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImluYy1jYWxsLWJ0biBpbmMtcmVqZWN0LWJ0blwiIChjbGljayk9XCJyZWplY3ROZXdJbmNvbWluZ0NhbGwoY2FsbClcIj5cclxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiIHN0eWxlPVwiY29sb3I6IHdoaXRlXCI+XHJcbiAgICAgICAgICAgIGNhbGxfZW5kXHJcbiAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgPC9idXR0b24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgIFxyXG4gICAgPC9kaXY+XHJcbiAgPC9kaXY+XHJcbjwvZGl2PlxyXG4iXX0=
|