cloud-ide-element 1.0.2 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. package/README.md +63 -271
  2. package/fesm2022/cloud-ide-element.mjs +614 -618
  3. package/fesm2022/cloud-ide-element.mjs.map +1 -1
  4. package/index.d.ts +1362 -3
  5. package/package.json +4 -31
  6. package/esm2022/cloud-ide-element.mjs +0 -5
  7. package/esm2022/lib/components/confirmation-modal/confirmation-modal.component.mjs +0 -182
  8. package/esm2022/lib/components/data-grid/data-grid.component.mjs +0 -1363
  9. package/esm2022/lib/components/data-grid/data-grid.types.mjs +0 -37
  10. package/esm2022/lib/components/dropdown/dropdown.component.mjs +0 -396
  11. package/esm2022/lib/components/global-notifications/global-notifications.component.mjs +0 -30
  12. package/esm2022/lib/components/json-editor/json-editor.component.mjs +0 -521
  13. package/esm2022/lib/components/skeleton-loader/skeleton-loader.component.mjs +0 -33
  14. package/esm2022/lib/components/toast-notification/toast-notification.component.mjs +0 -152
  15. package/esm2022/lib/elements/button/cide-ele-button.component.mjs +0 -249
  16. package/esm2022/lib/elements/file-input/file-input.component.mjs +0 -83
  17. package/esm2022/lib/elements/icon/icon.component.mjs +0 -26
  18. package/esm2022/lib/elements/input/input.component.mjs +0 -467
  19. package/esm2022/lib/elements/select/select.component.mjs +0 -471
  20. package/esm2022/lib/elements/spinner/spinner.component.mjs +0 -32
  21. package/esm2022/lib/elements/tab/cide-ele-tab.component.mjs +0 -74
  22. package/esm2022/lib/elements/textarea/textarea.component.mjs +0 -157
  23. package/esm2022/lib/services/confirmation.service.mjs +0 -151
  24. package/esm2022/lib/services/dropdown-manager.service.mjs +0 -93
  25. package/esm2022/lib/services/notification.service.mjs +0 -196
  26. package/esm2022/lib/utils/directives/resizer/resizer.directive.mjs +0 -231
  27. package/esm2022/lib/utils/directives/tooltip/tooltip.directive.mjs +0 -294
  28. package/esm2022/lib/utils/pipes/capitalize/capitalize.pipe.mjs +0 -38
  29. package/esm2022/lib/utils/services/elements/elements.service.mjs +0 -39
  30. package/esm2022/public-api.mjs +0 -31
  31. package/lib/components/confirmation-modal/confirmation-modal.component.d.ts +0 -16
  32. package/lib/components/data-grid/data-grid.component.d.ts +0 -244
  33. package/lib/components/data-grid/data-grid.types.d.ts +0 -146
  34. package/lib/components/dropdown/dropdown.component.d.ts +0 -75
  35. package/lib/components/global-notifications/global-notifications.component.d.ts +0 -5
  36. package/lib/components/json-editor/json-editor.component.d.ts +0 -116
  37. package/lib/components/skeleton-loader/skeleton-loader.component.d.ts +0 -11
  38. package/lib/components/toast-notification/toast-notification.component.d.ts +0 -13
  39. package/lib/elements/button/cide-ele-button.component.d.ts +0 -85
  40. package/lib/elements/file-input/file-input.component.d.ts +0 -25
  41. package/lib/elements/icon/icon.component.d.ts +0 -9
  42. package/lib/elements/input/input.component.d.ts +0 -182
  43. package/lib/elements/select/select.component.d.ts +0 -91
  44. package/lib/elements/spinner/spinner.component.d.ts +0 -19
  45. package/lib/elements/tab/cide-ele-tab.component.d.ts +0 -26
  46. package/lib/elements/textarea/textarea.component.d.ts +0 -47
  47. package/lib/services/confirmation.service.d.ts +0 -65
  48. package/lib/services/dropdown-manager.service.d.ts +0 -22
  49. package/lib/services/notification.service.d.ts +0 -81
  50. package/lib/utils/directives/resizer/resizer.directive.d.ts +0 -44
  51. package/lib/utils/directives/tooltip/tooltip.directive.d.ts +0 -43
  52. package/lib/utils/pipes/capitalize/capitalize.pipe.d.ts +0 -7
  53. package/lib/utils/services/elements/elements.service.d.ts +0 -12
  54. package/public-api.d.ts +0 -22
@@ -1,467 +0,0 @@
1
- import { CommonModule } from '@angular/common';
2
- import { Component, EventEmitter, Input, Output, forwardRef, inject } from '@angular/core';
3
- import { FormsModule, NG_VALIDATORS, NG_VALUE_ACCESSOR } from '@angular/forms';
4
- import { CapitalizePipe } from '../../utils/pipes/capitalize/capitalize.pipe';
5
- import { CideElementsService } from '../../utils/services/elements/elements.service';
6
- import * as i0 from "@angular/core";
7
- import * as i1 from "@angular/common";
8
- import * as i2 from "@angular/forms";
9
- export class CideInputComponent {
10
- constructor() {
11
- // Modern Angular v20 dependency injection pattern
12
- this.capitalizePipe = inject(CapitalizePipe);
13
- this.elementService = inject(CideElementsService);
14
- /*=======Set custom controls inputs to set components=========*/
15
- /**
16
- * @description to se the visual of control like solid control offerd by material design or outline with a border
17
- * @options solid | outline | standard
18
- */
19
- this.fill = 'outline';
20
- /** @description Lable of control (Title), Like Name, Email */
21
- this.label = "";
22
- /** @description to hide and show label */
23
- this.labelHide = false;
24
- /** @description is control Editable or Disabled */
25
- this.disabled = false;
26
- /** @description Is Clear Input Cross button is visible or not */
27
- this.clearInput = false;
28
- /** @description Position of Label 'floating' | 'fixed' */
29
- this.labelPlacement = "fixed";
30
- /** @description Lable direction from start of contrl or end of control */
31
- this.labelDir = "start";
32
- /** @description Place holder for control to display if there is no value */
33
- this.placeholder = "";
34
- /** @description it is to set leading icon, at the start of control */
35
- this.leadingIcon = "";
36
- /** @description it is to set trailing icon, at the end of control, for password type control eye is the trailing icon */
37
- this.trailingIcon = "";
38
- /** @description to display below the control for suggestion, if there is any error then error will bw the first to shoe in place of help text */
39
- this.helperText = "";
40
- /** @description default true to collapse when there is no help text or error text, if false then element area in DOM will be reserved never detroy */
41
- this.helperTextCollapse = true;
42
- /** @description show and hide helper text its forecfull */
43
- this.hideHelperAndErrorText = false;
44
- /** @description if found any error in control the error thext will be used to display error message, if there is help text still error text is having higher priority then helptext */
45
- this.errorText = "";
46
- /** @description maxlength for control */
47
- this.maxlength = 0;
48
- /** @description minlength for control */
49
- this.minlength = 0;
50
- /** @description is control is required or not input type is true | false */
51
- this.required = false;
52
- /** @description Auto capatalization for the value and applicable to word or to complete sentance */
53
- this.autocapitalize = "off";
54
- /** @description auto complete type to help reader what is the type of value */
55
- this.autocomplete = "off";
56
- /** @description type of control */
57
- this.type = 'text';
58
- /** @description width of control, default width is 100% */
59
- this.width = '100%';
60
- /** @description uniq id of control, used to differenciat the value also prevent value should not effect another values */
61
- this.id = '';
62
- /** @description to get input value using one way binding like: [ngModel] or by two way binding [(ngModel)] */
63
- this.ngModel = '';
64
- this.option = ["anksuh", "bhure"];
65
- /** @description min value for number type control */
66
- this.min = 0;
67
- /** @description max value for number type control */
68
- this.max = 0;
69
- /**
70
- * @description
71
- * Holds the size of the component like Small, Extra small, Large
72
- * by Default it takes small size
73
- * or the size set by the project setup service
74
- * or it will beset for individual component
75
- *
76
- * Size Appled
77
- * Component level then setup service then finally default md
78
- * Options: "2xs" | ""xs" | "sm" | "md" | "lg" | "xl" | "xxl"
79
- */
80
- this.size = "sm";
81
- /** @description to set return value using one way binding like: (ngModelChanges) or by two way binding [(ngModel)] */
82
- this.ngModelChange = new EventEmitter();
83
- /*
84
- internal Properties for input
85
- */
86
- /** @description is vale need to read from ngModel or from value(need to implement), it is detected and maild fals on value chnages */
87
- this.isNgModel = this.ngModel ? true : false;
88
- /** @description this is to set control value is valid or not, set by us inside validate callbck method called by angular */
89
- this.isValid = true;
90
- /** @description when control is touched then the will maid true by the us to check it is touched or not, when we will set this true we will call the onTouched callback method of angualr to inform angular that somthis is changed and control is touched */
91
- this.isTouched = false;
92
- /** @description we will take type of control in type but is may be not exactly which input's type so we need to get type and set actule type to our input, also when type is set password but in calse view in textt then inuut type need to change to text */
93
- this.typeInternal = "text";
94
- /** @description if traling is set the it is assigned by it, but some case tarling icon not as it is set need tro be changed at runtime, like password visibility hide and show */
95
- this.trailingIconInternal = "";
96
- /*
97
- Properties connected with trailingIconInternal
98
- */
99
- this.isTrailingIconAllwedClick = false;
100
- // Properties connected with id
101
- this.idRandom = this.randomString();
102
- // ==================================METHODS FOR CUSTOM FORM COMPONENT=============================
103
- // FOR ANGULAR CALLED BY UI
104
- /**
105
- * @description Function to call when the HTML Chnage to tell Angular somthing is changed.
106
- * @field value : inputType
107
- */
108
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
109
- this.onChange = (value) => { };
110
- /** @description Function to call when the input is touched (clciked) to tell Angular somthing is changed. */
111
- this.onTouched = () => { };
112
- /** @description Function to call when the input is need to Validate to tell Angular somthing is changed (in case of some input dipendent validation). */
113
- this.onValidate = () => { };
114
- // Modern Angular v20 pattern: Use constructor for initialization only
115
- // Validate control
116
- this.onValidate();
117
- }
118
- /**
119
- * @description
120
- * Method that performs synchronous validation against the provided control.
121
- * Exicuted by Angular
122
- *
123
- * @param control The control to validate against.
124
- *
125
- * @returns A map of validation errors if validation fails,
126
- * otherwise null.
127
- */
128
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
129
- validate(control) {
130
- const validation_error = this.isControlValid(this.ngModel);
131
- if (validation_error?.status) {
132
- return validation_error;
133
- }
134
- else {
135
- return null;
136
- }
137
- }
138
- /**
139
- * @description
140
- * Registers a callback function to call when the validator inputs change.
141
- * Exicuted by Angular
142
- *
143
- * @param fn The callback function
144
- */
145
- registerOnValidatorChange(fn) {
146
- this.onValidate = fn;
147
- }
148
- /** @description when form control change from model side this method is implemented */
149
- writeValue(value) {
150
- if (!this.isNgModel) {
151
- const ngModel = this.autoCapitalizeByOption(value, this.type);
152
- console.log('writeValue', this.ngModel, ngModel);
153
- this.ngModel = ngModel;
154
- }
155
- }
156
- /** @description Allows Angular to register a function to call when the model changes. */
157
- // Save the function as a property to call later here.
158
- registerOnChange(fn) {
159
- this.onChange = fn;
160
- }
161
- /** @description Allows Angular to register a function to call when the input has been touched. */
162
- // Save the function as a property to call later here.
163
- registerOnTouched(fn) {
164
- this.onTouched = fn;
165
- }
166
- //==========================================================================
167
- /*
168
- Methods for input
169
- */
170
- /** @description Detect wether input propertires canged or not */
171
- ngOnChanges(changes) {
172
- if (changes?.['value']) {
173
- this.isNgModel = true;
174
- this.ngModel = this.processValue(this.ngModel, this.type);
175
- }
176
- if (this.isValidValueAndType(this.ngModel, this.type) || this.isTouched) {
177
- this.isControlValid(this.ngModel);
178
- }
179
- // Ditect type change
180
- if (changes?.['type']) {
181
- this.detectTypeChange();
182
- }
183
- }
184
- ngOnInit() {
185
- if (this.id) {
186
- this.getControlData();
187
- }
188
- }
189
- /** @description custom method run when HTML changes, we call method registerd by angular to detect change */
190
- upDateValue(value) {
191
- const target = value.target;
192
- this.isControlValid(target?.value);
193
- const updatedValue = this.processValue(target?.value, this.type);
194
- this.ngModel = updatedValue;
195
- this.ngModelChange?.emit(updatedValue);
196
- // console.log(target)
197
- this.onChange(updatedValue);
198
- }
199
- /**
200
- * @description method applicable in case of control type checkbox
201
- *
202
- * @param value boolean | string
203
- */
204
- updateValueCheckBox(value) {
205
- // Convert string to boolean
206
- this.ngModel = !this.ngModel;
207
- value = (typeof value === 'boolean') ? value : (value === 'true' ? true : false);
208
- this.ngModelChange?.emit(value);
209
- this.onChange(value);
210
- }
211
- /** @description clear the value */
212
- ClearInputValue() {
213
- if (this.type == "text") {
214
- this.upDateValue({ target: { value: "" } });
215
- }
216
- }
217
- /** @description when HTML is focuesd */
218
- focusControl() {
219
- this.isTouched = true;
220
- this.onTouched();
221
- this.onValidate();
222
- }
223
- /** @description If control value need to be processed, like UPPERCASE */
224
- processValue(value, type) {
225
- value = this.autoCapitalizeByOption(value, type);
226
- return value;
227
- }
228
- /** @description for capitalization */
229
- autoCapitalizeByOption(value, type) {
230
- if (type == 'text') {
231
- if (this.autocapitalize == "on") {
232
- return this.capitalizePipe?.transform(value, 'allUpperCase');
233
- }
234
- if (this.autocapitalize == "words") {
235
- return this.capitalizePipe?.transform(value, 'titleCase');
236
- }
237
- if (this.autocapitalize == "sentences") {
238
- return this.capitalizePipe?.transform(value, "sentenceCase");
239
- }
240
- }
241
- return value;
242
- }
243
- /** @description It is used to return the value is valid or not */
244
- isValidValueAndType(value, type) {
245
- if (type == 'text') {
246
- if (typeof (value) == 'string') {
247
- if (value?.length > 0) {
248
- return true;
249
- }
250
- else {
251
- return false;
252
- }
253
- }
254
- else {
255
- return false;
256
- }
257
- }
258
- else {
259
- return false;
260
- }
261
- }
262
- /** @description to check control is valid or not */
263
- isControlValid(value) {
264
- const validation_status = {
265
- validation: {},
266
- status: false
267
- };
268
- if (this.required) {
269
- if (!value) {
270
- validation_status.status = true;
271
- validation_status.validation.required = `required!`;
272
- }
273
- }
274
- if (this.type == 'text') {
275
- if (typeof (value) == 'string') {
276
- if (this.maxlength > 0) {
277
- if (value?.length > this.maxlength) {
278
- validation_status.status = true;
279
- validation_status.validation.maxlength = `maximum length is ${this.maxlength}!`;
280
- }
281
- }
282
- if (this.minlength > 0) {
283
- if (value?.length < this.minlength) {
284
- validation_status.status = true;
285
- validation_status.validation.minlength = `minimum length is ${this.minlength}!`;
286
- }
287
- }
288
- }
289
- else {
290
- validation_status.status = true;
291
- validation_status.validation.required = `required!`;
292
- }
293
- }
294
- this.isValid = !validation_status.status;
295
- this.errorText = Object.values(validation_status.validation).at(0) || '';
296
- return validation_status;
297
- }
298
- /** @description Allows Angular to disable the input. */
299
- setDisabledState(isDisabled) {
300
- this.disabled = isDisabled;
301
- }
302
- /** @description Method for trailing Icon Click */
303
- trailingIconClick() {
304
- if (this.type === 'password') {
305
- if (this.typeInternal === 'password') {
306
- this.typeInternal = 'text';
307
- this.trailingIconInternal = 'visibility';
308
- }
309
- else {
310
- this.typeInternal = 'password';
311
- this.trailingIconInternal = 'visibility_off';
312
- }
313
- }
314
- else {
315
- this.typeInternal = this.type;
316
- }
317
- }
318
- /**
319
- * Method to generate Random String
320
- * @param setupPrarameter { lenght: number, prefix: string }
321
- * default lenght is 10, prefox is ""
322
- * @returns string
323
- */
324
- randomString(setupPrarameter = { lenght: 10, prefix: "" }) {
325
- //variable consisting alphabets in small and capital letter
326
- const characters = "ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz";
327
- //loop to select a new character in each iteration
328
- let random_string = setupPrarameter?.prefix || "";
329
- for (let i = 0; i < setupPrarameter?.lenght; i++) {
330
- const rnum = Math.floor(Math.random() * characters.length);
331
- random_string += characters.substring(rnum, rnum + 1);
332
- }
333
- //return the generated string
334
- return random_string;
335
- }
336
- async getControlData() {
337
- const cide_element_data = await this.elementService?.getElementData({ sype_key: this.id });
338
- if (cide_element_data) {
339
- this.label = cide_element_data?.sype_label;
340
- this.labelPlacement = (cide_element_data?.sype_label_placement || 'floating');
341
- this.type = (cide_element_data?.sype_type || 'text');
342
- this.required = (cide_element_data?.sype_required || false);
343
- this.size = (cide_element_data?.sype_size || 'md');
344
- this.helperTextCollapse = (cide_element_data?.sype_helper_text_collapse || false);
345
- this.maxlength = (cide_element_data?.sype_max_length);
346
- this.minlength = (cide_element_data?.sype_min_length);
347
- this.leadingIcon = (cide_element_data?.sype_leading_icon);
348
- this.labelHide = (cide_element_data?.sype_label_hide);
349
- this.hideHelperAndErrorText = (cide_element_data?.sype_hide_helper_and_error_text);
350
- this.detectTypeChange();
351
- // Validate control
352
- this.onValidate();
353
- }
354
- }
355
- /**
356
- * @description use to detact the change in type if changes done this method is ued to run
357
- */
358
- detectTypeChange() {
359
- if (this.type === 'password') {
360
- this.typeInternal = "password";
361
- this.trailingIconInternal = "visibility_off";
362
- this.isTrailingIconAllwedClick = true;
363
- }
364
- else {
365
- this.typeInternal = this.type;
366
- this.trailingIconInternal = this.trailingIcon;
367
- }
368
- }
369
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
370
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.7", type: CideInputComponent, isStandalone: true, selector: "cide-ele-input", inputs: { fill: "fill", label: "label", labelHide: "labelHide", disabled: "disabled", clearInput: "clearInput", labelPlacement: "labelPlacement", labelDir: "labelDir", placeholder: "placeholder", leadingIcon: "leadingIcon", trailingIcon: "trailingIcon", helperText: "helperText", helperTextCollapse: "helperTextCollapse", hideHelperAndErrorText: "hideHelperAndErrorText", errorText: "errorText", maxlength: "maxlength", minlength: "minlength", required: "required", autocapitalize: "autocapitalize", autocomplete: "autocomplete", type: "type", width: "width", id: "id", ngModel: "ngModel", option: "option", min: "min", max: "max", size: "size" }, outputs: { ngModelChange: "ngModelChange" }, providers: [
371
- {
372
- provide: NG_VALUE_ACCESSOR,
373
- useExisting: forwardRef(() => CideInputComponent),
374
- multi: true
375
- },
376
- /** @description to apply validations */
377
- {
378
- provide: NG_VALIDATORS,
379
- multi: true,
380
- useExisting: forwardRef(() => CideInputComponent),
381
- },
382
- CapitalizePipe
383
- ], usesOnChanges: true, ngImport: i0, template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'number' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>", styles: [""], dependencies: [{ kind: "ngmodule", type:
384
- // directives
385
- CommonModule }, { kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type:
386
- // for ngModel
387
- FormsModule }, { kind: "directive", type: i2.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: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
388
- }
389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.7", ngImport: i0, type: CideInputComponent, decorators: [{
390
- type: Component,
391
- args: [{ selector: 'cide-ele-input', standalone: true, imports: [
392
- // directives
393
- CommonModule,
394
- // for ngModel
395
- FormsModule
396
- ], providers: [
397
- {
398
- provide: NG_VALUE_ACCESSOR,
399
- useExisting: forwardRef(() => CideInputComponent),
400
- multi: true
401
- },
402
- /** @description to apply validations */
403
- {
404
- provide: NG_VALIDATORS,
405
- multi: true,
406
- useExisting: forwardRef(() => CideInputComponent),
407
- },
408
- CapitalizePipe
409
- ], template: "<div class=\"cide-input\">\r\n <!------------------------------------------TEXT | PASSWORD------------------------------------------>\r\n <div *ngIf=\"type === 'text' || type === 'number' || type === 'password'\">\r\n <div class=\"tw-w-full tw-relative\" [ngStyle]=\"{ width: width }\" [ngClass]=\"{\r\n 'cide-element-size-xxs': (size === '2xs'),\r\n 'cide-element-size-xs': (size === 'xs'),\r\n 'cide-element-size-sm': (size === 'sm'),\r\n 'cide-element-size-md': (size === 'md'),\r\n 'cide-element-size-lg': (size === 'lg'),\r\n 'cide-element-leading-icon': leadingIcon,\r\n 'cide-element-trailing-icon': trailingIconInternal,\r\n 'cide-element-clear-input': clearInput,\r\n 'cide-element-input-label-floating': (labelPlacement === 'floating'),\r\n 'cide-element-input-label-start': (labelDir === 'start'),\r\n 'cide-element-input-label-end': (labelDir === 'end'),\r\n 'cide-element-input-label-fixed': (labelPlacement === 'fixed'),\r\n 'cide-element-input-label-less': (!label || labelHide),\r\n 'cide-element-style-outline': (fill === 'outline'),\r\n 'cide-element-style-solid': (fill === 'solid'),\r\n 'cide-element-style-standard': (fill === 'standard'),\r\n 'cide-element-input-number': (type === 'number')\r\n }\">\r\n <!-- label -->\r\n <label [for]=\"id\" class=\"cide-input-label\" *ngIf=\"label && !labelHide\">{{label}}</label>\r\n\r\n <!-- all one line elemets which dose not affect with label and error text -->\r\n <div class=\"cide-element-input-wrapper\">\r\n <!-- Leading Icon -->\r\n <span class=\"cide-input-leading-icon-wrapper\" *ngIf=\"leadingIcon\">\r\n <span\r\n class=\"cide-input-leading-icon material-symbols-outlined tw-text-center\">{{leadingIcon}}</span>\r\n </span>\r\n\r\n <!-- Traling icon -->\r\n <span class=\"tw-absolute cide-input-trailing-icon -tw-bottom-1 tw-select-none tw-right-0\"\r\n *ngIf=\"trailingIconInternal\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"\r\n [ngClass]=\"{'tw-cursor-pointer': isTrailingIconAllwedClick}\" [attr.tabindex]=\"false\"\r\n (click)=\"trailingIconClick()\" (keyup)=\"trailingIconClick()\">{{trailingIconInternal}}</span>\r\n </span>\r\n\r\n <!-- Clear -->\r\n <button class=\"cide-input-clear\"\r\n *ngIf=\"clearInput && ngModel\" (click)=\"ClearInputValue()\">\r\n <span class=\"cide-input-clear-icon material-symbols-outlined\">close</span>\r\n </button>\r\n\r\n <!-- Input -->\r\n <input [placeholder]=\"placeholder\" [id]=\"id\"\r\n [ngClass]=\"[((label && labelPlacement === 'fixed') ? 'tw-rounded-e-md tw-rounded-es-md' : 'tw-rounded-md '), (!leadingIcon ? 'tw-pl-1' : ''), (trailingIconInternal ? 'tw-pr-8': ''), (!trailingIconInternal ? 'tw-pr-1' : ''), ((size === 'md') ? 'tw-h-8 tw-pt-0.5 tw-pb-0' : (size === 'sm' ? 'tw-h-7' : '')), (labelHide ? '!tw-mt-0' : '')]\"\r\n [(ngModel)]=\"ngModel\" [type]=\"typeInternal\" (input)=\"upDateValue($event)\" (focus)=\"focusControl()\"\r\n [autocomplete]=\"autocomplete\" [min]=\"min\" [max]=\"max\"\r\n class=\"tw-m-0 tw-w-full tw-bg-transparent tw-overflow-hidden tw-border-solid tw-p-0 cide-input-input tw-outline-none\" />\r\n </div>\r\n <!-- error text / helper text -->\r\n <span *ngIf=\"(errorText || helperText || !helperTextCollapse) && !hideHelperAndErrorText\"\r\n class=\"cide-input-help-error-text\">{{\r\n isValid\r\n ? helperText : (errorText ?\r\n (isTouched ? errorText : helperText)\r\n : helperText)}}</span>\r\n </div>\r\n </div>\r\n\r\n <!-- Input with tralling icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-right-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-1 tw-pr-8 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!-- Input with leading icon -->\r\n <!-- <div class=\"tw-inline-block tw-h-12 tw-w-64\">\r\n <div class=\"tw-w-fullh-full tw-relative\">\r\n <label\r\n class=\"tw-absolute -tw-top-1/3 tw-mx-2 tw-bg-white tw-px-0.5 tw-py-0 tw-text-sm tw-leading-4 tw-text-gray-700\">Name</label>\r\n <span class=\"tw-absolute -tw-bottom-px tw-left-0 -tw-z-10 tw-text-gray-400\">\r\n <span class=\"material-symbols-outlined tw-w-8 tw-text-center !tw-text-2xl\"> person </span>\r\n </span>\r\n <input\r\n class=\"tw-m-0 tw-h-8 tw-w-full tw-overflow-hidden tw-rounded-md tw-border-2 tw-border-solid tw-border-gray-300 tw-bg-transparent tw-p-0 tw-pb-0.5 tw-pl-8 tw-pr-1 tw-text-sm tw-text-gray-600 tw-outline-none hover:tw-border-blue-400 focus:tw-border-blue-400 focus:tw-text-gray-950\"\r\n value=\"Ankush Bhure\" />\r\n </div>\r\n </div> -->\r\n\r\n <!------------------------------------------CHECKBOX------------------------------------------>\r\n <div *ngIf=\"type === 'checkbox'\" class=\"tw-flex\">\r\n <div class=\"cide-checkbox tw-relative\">\r\n <input [checked]=\"ngModel\" [value]=\"ngModel\" [id]=\"idRandom\" [type]=\"type\"\r\n class=\"tw-absolute tw-left-0 tw-invisible\" (click)=\"updateValueCheckBox(!ngModel); focusControl()\"\r\n [autocomplete]=\"autocomplete\" />\r\n <label class=\"cide-checkbox-label tw-cursor-pointer\" [for]=\"idRandom\">\r\n <span class=\"tw-border-2 tw-border-solid tw-relative tw-rounded-md\">\r\n <svg width=\"12px\" height=\"10px\" class=\"tw-absolute\">\r\n <use xlink:href=\"#sdfwiorfklasfjjalfjwerwr\"></use>\r\n </svg>\r\n </span>\r\n <span class=\"tw-text-sm tw-pl-2 tw-leading-[18px] tw-select-none tw-cursor-pointer\"\r\n *ngIf=\"!labelHide\">{{label}}</span>\r\n </label>\r\n <svg class=\"tw-absolute tw-h-0 tw-w-0 tw-select-none tw-pointer-events-none\">\r\n <!-- Element hidden and its xpath is used to display inside SVG -->\r\n <symbol id=\"sdfwiorfklasfjjalfjwerwr\" viewbox=\"0 0 12 10\">\r\n <polyline points=\"1.5 6 4.5 9 10.5 1\"></polyline>\r\n </symbol>\r\n </svg>\r\n </div>\r\n </div>\r\n\r\n <!-------------------------------------------SELECT------------------------------------------->\r\n <div *ngIf=\"type === 'select'\">sas\r\n <div class=\"tw-relative\">\r\n <div class=\"tw-absolute\">\r\n @for (item of option; track $index) {\r\n <div class=\"tw-w-full\">\r\n {{item}}\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>" }]
410
- }], ctorParameters: () => [], propDecorators: { fill: [{
411
- type: Input
412
- }], label: [{
413
- type: Input
414
- }], labelHide: [{
415
- type: Input
416
- }], disabled: [{
417
- type: Input
418
- }], clearInput: [{
419
- type: Input
420
- }], labelPlacement: [{
421
- type: Input
422
- }], labelDir: [{
423
- type: Input
424
- }], placeholder: [{
425
- type: Input
426
- }], leadingIcon: [{
427
- type: Input
428
- }], trailingIcon: [{
429
- type: Input
430
- }], helperText: [{
431
- type: Input
432
- }], helperTextCollapse: [{
433
- type: Input
434
- }], hideHelperAndErrorText: [{
435
- type: Input
436
- }], errorText: [{
437
- type: Input
438
- }], maxlength: [{
439
- type: Input
440
- }], minlength: [{
441
- type: Input
442
- }], required: [{
443
- type: Input
444
- }], autocapitalize: [{
445
- type: Input
446
- }], autocomplete: [{
447
- type: Input
448
- }], type: [{
449
- type: Input
450
- }], width: [{
451
- type: Input
452
- }], id: [{
453
- type: Input
454
- }], ngModel: [{
455
- type: Input
456
- }], option: [{
457
- type: Input
458
- }], min: [{
459
- type: Input
460
- }], max: [{
461
- type: Input
462
- }], size: [{
463
- type: Input
464
- }], ngModelChange: [{
465
- type: Output
466
- }] } });
467
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xvdWQtaWRlLWVsZW1lbnQvc3JjL2xpYi9lbGVtZW50cy9pbnB1dC9pbnB1dC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbG91ZC1pZGUtZWxlbWVudC9zcmMvbGliL2VsZW1lbnRzL2lucHV0L2lucHV0LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBaUIsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3SCxPQUFPLEVBQXlDLFdBQVcsRUFBRSxhQUFhLEVBQUUsaUJBQWlCLEVBQStCLE1BQU0sZ0JBQWdCLENBQUM7QUFDbkosT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhDQUE4QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdEQUFnRCxDQUFDOzs7O0FBeUNyRixNQUFNLE9BQU8sa0JBQWtCO0lBTTdCO1FBSkEsa0RBQWtEO1FBQzNDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3ZDLG1CQUFjLEdBQUcsTUFBTSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFPckQsZ0VBQWdFO1FBRWhFOzs7V0FHRztRQUNNLFNBQUksR0FBcUIsU0FBUyxDQUFDO1FBQzVDLDhEQUE4RDtRQUNyRCxVQUFLLEdBQVcsRUFBRSxDQUFDO1FBQzVCLDBDQUEwQztRQUNqQyxjQUFTLEdBQVksS0FBSyxDQUFDO1FBQ3BDLG1EQUFtRDtRQUMxQyxhQUFRLEdBQVksS0FBSyxDQUFDO1FBQ25DLGlFQUFpRTtRQUN4RCxlQUFVLEdBQVksS0FBSyxDQUFD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QWE7NEJBQ3RCLEtBQUssRUFBRSxJQUFJOzRCQUNYLFdBQVcsRUFBRSxVQUFVLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDO3lCQUNsRDt3QkFDRCxjQUFjO3FCQUNmO3dEQW9CUSxJQUFJO3NCQUFaLEtBQUs7Z0JBRUcsS0FBSztzQkFBYixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxXQUFXO3NCQUFuQixLQUFLO2dCQUVHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBRUcsWUFBWTtzQkFBcEIsS0FBSztnQkFFRyxVQUFVO3NCQUFsQixLQUFLO2dCQUVHLGtCQUFrQjtzQkFBMUIsS0FBSztnQkFFRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBRUcsU0FBUztzQkFBakIsS0FBSztnQkFFRyxTQUFTO3NCQUFqQixLQUFLO2dCQUVHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBRUcsUUFBUTtzQkFBaEIsS0FBSztnQkFFRyxjQUFjO3NCQUF0QixLQUFLO2dCQUVHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBRUcsSUFBSTtzQkFBWixLQUFLO2dCQUVHLEtBQUs7c0JBQWIsS0FBSztnQkFFRyxFQUFFO3NCQUFWLEtBQUs7Z0JBRUcsT0FBTztzQkFBZixLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxHQUFHO3NCQUFYLEtBQUs7Z0JBRUcsR0FBRztzQkFBWCxLQUFLO2dCQVlHLElBQUk7c0JBQVosS0FBSztnQkFFSSxhQUFhO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkNoYW5nZXMsIE9uSW5pdCwgT3V0cHV0LCBTaW1wbGVDaGFuZ2VzLCBmb3J3YXJkUmVmLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQWJzdHJhY3RDb250cm9sLCBDb250cm9sVmFsdWVBY2Nlc3NvciwgRm9ybXNNb2R1bGUsIE5HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SLCBWYWxpZGF0aW9uRXJyb3JzLCBWYWxpZGF0b3IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IENhcGl0YWxpemVQaXBlIH0gZnJvbSAnLi4vLi4vdXRpbHMvcGlwZXMvY2FwaXRhbGl6ZS9jYXBpdGFsaXplLnBpcGUnO1xyXG5pbXBvcnQgeyBDaWRlRWxlbWVudHNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vdXRpbHMvc2VydmljZXMvZWxlbWVudHMvZWxlbWVudHMuc2VydmljZSc7XHJcbmltcG9ydCB7IGF1dG9jYXBpdGFsaXplVHlwZSwgYXV0b2NvbXBsZXRlVHlwZSwgY29udHJvbFR5cGUsIGVsZW1lbnRTdHlsZVR5cGUsIGlucHV0VHlwZSwgbGFiZWxEaXJUeXBlLCBsYWJlbFBsYWNlbWVudFR5cGUsIHRoZW1lU2l6ZSB9IGZyb20gJ2Nsb3VkLWlkZS1sbXMtbW9kZWwnO1xyXG5cclxuLyoqIEBkZXNjcmlwdGlvbiB0eXBlIHRvIHJlZ2lzdGVyIGVycm9yIHJlbGF0ZWQgdG8gY29udHJvbCAqL1xyXG5leHBvcnQgdHlwZSBFcnJvclZhbGlkYXRpb25TdGF0dXMgPSB7XHJcbiAgbWF4bGVuZ3RoPzogc3RyaW5nLFxyXG4gIG1pbmxlbmd0aD86IHN0cmluZyxcclxuICByZXF1aXJlZD86IHN0cmluZyxcclxufVxyXG5leHBvcnQgdHlwZSBWYWxpZGF0aW9uU3RhdHVzID0ge1xyXG4gIHZhbGlkYXRpb246IEVycm9yVmFsaWRhdGlvblN0YXR1cyxcclxuICBzdGF0dXM6IGJvb2xlYW5cclxufVxyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdjaWRlLWVsZS1pbnB1dCcsXHJcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcclxuICB0ZW1wbGF0ZVVybDogJy4vaW5wdXQuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsOiAnLi9pbnB1dC5jb21wb25lbnQuc2NzcycsXHJcbiAgaW1wb3J0czogW1xyXG4gICAgLy8gZGlyZWN0aXZlc1xyXG4gICAgQ29tbW9uTW9kdWxlLFxyXG4gICAgLy8gZm9yIG5nTW9kZWxcclxuICAgIEZvcm1zTW9kdWxlXHJcbiAgXSxcclxuICBwcm92aWRlcnM6IFtcclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENpZGVJbnB1dENvbXBvbmVudCksXHJcbiAgICAgIG11bHRpOiB0cnVlXHJcbiAgICB9LFxyXG4gICAgLyoqIEBkZXNjcmlwdGlvbiB0byBhcHBseSB2YWxpZGF0aW9ucyAgKi9cclxuICAgIHtcclxuICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUyxcclxuICAgICAgbXVsdGk6IHRydWUsXHJcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IENpZGVJbnB1dENvbXBvbmVudCksXHJcbiAgICB9LFxyXG4gICAgQ2FwaXRhbGl6ZVBpcGVcclxuICBdXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgQ2lkZUlucHV0Q29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIFZhbGlkYXRvciwgT25DaGFuZ2VzLCBPbkluaXQge1xyXG5cclxuICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgZGVwZW5kZW5jeSBpbmplY3Rpb24gcGF0dGVyblxyXG4gIHB1YmxpYyBjYXBpdGFsaXplUGlwZSA9IGluamVjdChDYXBpdGFsaXplUGlwZSk7XHJcbiAgcHJpdmF0ZSBlbGVtZW50U2VydmljZSA9IGluamVjdChDaWRlRWxlbWVudHNTZXJ2aWNlKTtcclxuXHJcbiAgY29uc3RydWN0b3IoKSB7XHJcbiAgICAvLyBNb2Rlcm4gQW5ndWxhciB2MjAgcGF0dGVybjogVXNlIGNvbnN0cnVjdG9yIGZvciBpbml0aWFsaXphdGlvbiBvbmx5XHJcbiAgICAvLyBWYWxpZGF0ZSBjb250cm9sXHJcbiAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICB9XHJcbiAgLyo9PT09PT09U2V0IGN1c3RvbSBjb250cm9scyBpbnB1dHMgdG8gc2V0IGNvbXBvbmVudHM9PT09PT09PT0qL1xyXG5cclxuICAvKiogXHJcbiAgICogQGRlc2NyaXB0aW9uIHRvIHNlIHRoZSB2aXN1YWwgb2YgY29udHJvbCBsaWtlIHNvbGlkIGNvbnRyb2wgb2ZmZXJkIGJ5IG1hdGVyaWFsIGRlc2lnbiBvciBvdXRsaW5lIHdpdGggYSBib3JkZXJcclxuICAgKiBAb3B0aW9ucyBzb2xpZCB8IG91dGxpbmUgfCBzdGFuZGFyZFxyXG4gICAqL1xyXG4gIEBJbnB1dCgpIGZpbGw6IGVsZW1lbnRTdHlsZVR5cGUgPSAnb3V0bGluZSc7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBMYWJsZSBvZiBjb250cm9sIChUaXRsZSksIExpa2UgTmFtZSwgRW1haWwgKi9cclxuICBASW5wdXQoKSBsYWJlbDogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHRvIGhpZGUgYW5kIHNob3cgbGFiZWwgKi9cclxuICBASW5wdXQoKSBsYWJlbEhpZGU6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIGlzIGNvbnRyb2wgRWRpdGFibGUgb3IgRGlzYWJsZWQgKi9cclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gSXMgQ2xlYXIgSW5wdXQgQ3Jvc3MgYnV0dG9uIGlzIHZpc2libGUgb3Igbm90ICovXHJcbiAgQElucHV0KCkgY2xlYXJJbnB1dDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gUG9zaXRpb24gb2YgTGFiZWwgJ2Zsb2F0aW5nJyB8ICdmaXhlZCcgKi9cclxuICBASW5wdXQoKSBsYWJlbFBsYWNlbWVudDogbGFiZWxQbGFjZW1lbnRUeXBlID0gXCJmaXhlZFwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gTGFibGUgZGlyZWN0aW9uIGZyb20gc3RhcnQgb2YgY29udHJsIG9yIGVuZCBvZiBjb250cm9sICovXHJcbiAgQElucHV0KCkgbGFiZWxEaXI6IGxhYmVsRGlyVHlwZSA9IFwic3RhcnRcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIFBsYWNlIGhvbGRlciBmb3IgY29udHJvbCB0byBkaXNwbGF5IGlmIHRoZXJlIGlzIG5vIHZhbHVlICovXHJcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpdCBpcyB0byBzZXQgbGVhZGluZyBpY29uLCBhdCB0aGUgc3RhcnQgb2YgY29udHJvbCAgKi9cclxuICBASW5wdXQoKSBsZWFkaW5nSWNvbjogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGl0IGlzIHRvIHNldCB0cmFpbGluZyBpY29uLCBhdCB0aGUgZW5kIG9mIGNvbnRyb2wsIGZvciBwYXNzd29yZCB0eXBlIGNvbnRyb2wgZXllIGlzIHRoZSB0cmFpbGluZyBpY29uICAqL1xyXG4gIEBJbnB1dCgpIHRyYWlsaW5nSWNvbjogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIHRvIGRpc3BsYXkgYmVsb3cgdGhlIGNvbnRyb2wgZm9yIHN1Z2dlc3Rpb24sIGlmIHRoZXJlIGlzIGFueSBlcnJvciB0aGVuIGVycm9yIHdpbGwgYncgdGhlIGZpcnN0IHRvIHNob2UgaW4gcGxhY2Ugb2YgaGVscCB0ZXh0ICovXHJcbiAgQElucHV0KCkgaGVscGVyVGV4dDogc3RyaW5nID0gXCJcIjtcclxuICAvKiogQGRlc2NyaXB0aW9uIGRlZmF1bHQgdHJ1ZSB0byBjb2xsYXBzZSB3aGVuIHRoZXJlIGlzIG5vIGhlbHAgdGV4dCBvciBlcnJvciB0ZXh0LCBpZiBmYWxzZSB0aGVuIGVsZW1lbnQgYXJlYSBpbiBET00gd2lsbCBiZSByZXNlcnZlZCBuZXZlciBkZXRyb3kgICovXHJcbiAgQElucHV0KCkgaGVscGVyVGV4dENvbGxhcHNlOiBib29sZWFuID0gdHJ1ZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIHNob3cgYW5kIGhpZGUgaGVscGVyIHRleHQgaXRzIGZvcmVjZnVsbCAqL1xyXG4gIEBJbnB1dCgpIGhpZGVIZWxwZXJBbmRFcnJvclRleHQ6IGJvb2xlYW4gPSBmYWxzZTtcclxuICAvKiogQGRlc2NyaXB0aW9uIGlmIGZvdW5kIGFueSBlcnJvciBpbiBjb250cm9sIHRoZSBlcnJvciB0aGV4dCB3aWxsIGJlIHVzZWQgdG8gZGlzcGxheSBlcnJvciBtZXNzYWdlLCBpZiB0aGVyZSBpcyBoZWxwIHRleHQgc3RpbGwgZXJyb3IgdGV4dCBpcyBoYXZpbmcgaGlnaGVyIHByaW9yaXR5IHRoZW4gaGVscHRleHQgKi9cclxuICBASW5wdXQoKSBlcnJvclRleHQ6IHN0cmluZyA9IFwiXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBtYXhsZW5ndGggZm9yIGNvbnRyb2wgKi9cclxuICBASW5wdXQoKSBtYXhsZW5ndGg6IG51bWJlciA9IDA7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBtaW5sZW5ndGggZm9yIGNvbnRyb2wgKi9cclxuICBASW5wdXQoKSBtaW5sZW5ndGg6IG51bWJlciA9IDA7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpcyBjb250cm9sIGlzIHJlcXVpcmVkIG9yIG5vdCBpbnB1dCB0eXBlIGlzIHRydWUgfCBmYWxzZSAqL1xyXG4gIEBJbnB1dCgpIHJlcXVpcmVkOiBib29sZWFuID0gZmFsc2U7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBBdXRvIGNhcGF0YWxpemF0aW9uIGZvciB0aGUgdmFsdWUgYW5kIGFwcGxpY2FibGUgdG8gd29yZCBvciB0byBjb21wbGV0ZSBzZW50YW5jZSAqL1xyXG4gIEBJbnB1dCgpIGF1dG9jYXBpdGFsaXplOiBhdXRvY2FwaXRhbGl6ZVR5cGUgPSBcIm9mZlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gYXV0byBjb21wbGV0ZSB0eXBlIHRvIGhlbHAgcmVhZGVyIHdoYXQgaXMgdGhlIHR5cGUgb2YgdmFsdWUgKi9cclxuICBASW5wdXQoKSBhdXRvY29tcGxldGU6IGF1dG9jb21wbGV0ZVR5cGUgPSBcIm9mZlwiO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdHlwZSBvZiBjb250cm9sICovXHJcbiAgQElucHV0KCkgdHlwZTogY29udHJvbFR5cGUgPSAndGV4dCc7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aWR0aCBvZiBjb250cm9sLCBkZWZhdWx0IHdpZHRoIGlzIDEwMCUgKi9cclxuICBASW5wdXQoKSB3aWR0aDogc3RyaW5nID0gJzEwMCUnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdW5pcSBpZCBvZiBjb250cm9sLCB1c2VkIHRvIGRpZmZlcmVuY2lhdCB0aGUgdmFsdWUgYWxzbyBwcmV2ZW50IHZhbHVlIHNob3VsZCBub3QgZWZmZWN0IGFub3RoZXIgdmFsdWVzICovXHJcbiAgQElucHV0KCkgaWQ6IHN0cmluZyA9ICcnO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gZ2V0IGlucHV0IHZhbHVlIHVzaW5nIG9uZSB3YXkgYmluZGluZyBsaWtlOiBbbmdNb2RlbF0gb3IgYnkgdHdvIHdheSBiaW5kaW5nIFsobmdNb2RlbCldICovXHJcbiAgQElucHV0KCkgbmdNb2RlbDogaW5wdXRUeXBlID0gJyc7XHJcbiAgQElucHV0KCkgb3B0aW9uOiBzdHJpbmdbXSA9IFtcImFua3N1aFwiLCBcImJodXJlXCJdO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWluIHZhbHVlIGZvciBudW1iZXIgdHlwZSBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWluOiBudW1iZXIgPSAwO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gbWF4IHZhbHVlIGZvciBudW1iZXIgdHlwZSBjb250cm9sICovXHJcbiAgQElucHV0KCkgbWF4OiBudW1iZXIgPSAwO1xyXG4gIC8qKlxyXG4gICAqIEBkZXNjcmlwdGlvblxyXG4gICAqIEhvbGRzIHRoZSBzaXplIG9mIHRoZSBjb21wb25lbnQgbGlrZSBTbWFsbCwgRXh0cmEgc21hbGwsIExhcmdlXHJcbiAgICogYnkgRGVmYXVsdCBpdCB0YWtlcyBzbWFsbCBzaXplXHJcbiAgICogb3IgdGhlIHNpemUgc2V0IGJ5IHRoZSBwcm9qZWN0IHNldHVwIHNlcnZpY2VcclxuICAgKiBvciBpdCB3aWxsIGJlc2V0IGZvciBpbmRpdmlkdWFsIGNvbXBvbmVudFxyXG4gICAqIFxyXG4gICAqIFNpemUgQXBwbGVkIFxyXG4gICAqIENvbXBvbmVudCBsZXZlbCB0aGVuIHNldHVwIHNlcnZpY2UgdGhlbiBmaW5hbGx5IGRlZmF1bHQgbWRcclxuICAgKiAgT3B0aW9uczogXCIyeHNcIiB8IFwiXCJ4c1wiIHwgXCJzbVwiIHwgXCJtZFwiIHwgXCJsZ1wiIHwgXCJ4bFwiIHwgXCJ4eGxcIiBcclxuICAgKi9cclxuICBASW5wdXQoKSBzaXplOiB0aGVtZVNpemUgPSBcInNtXCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB0byBzZXQgcmV0dXJuIHZhbHVlIHVzaW5nIG9uZSB3YXkgYmluZGluZyBsaWtlOiAobmdNb2RlbENoYW5nZXMpIG9yIGJ5IHR3byB3YXkgYmluZGluZyBbKG5nTW9kZWwpXSAqL1xyXG4gIEBPdXRwdXQoKSBuZ01vZGVsQ2hhbmdlOiBFdmVudEVtaXR0ZXI8aW5wdXRUeXBlPiA9IG5ldyBFdmVudEVtaXR0ZXI8aW5wdXRUeXBlPigpO1xyXG5cclxuICAvKlxyXG4gICAgICBpbnRlcm5hbCBQcm9wZXJ0aWVzIGZvciBpbnB1dFxyXG4gICovXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpcyB2YWxlIG5lZWQgdG8gcmVhZCBmcm9tIG5nTW9kZWwgb3IgZnJvbSB2YWx1ZShuZWVkIHRvIGltcGxlbWVudCksIGl0IGlzIGRldGVjdGVkIGFuZCBtYWlsZCBmYWxzIG9uIHZhbHVlIGNobmFnZXMgKi9cclxuICBwdWJsaWMgaXNOZ01vZGVsOiBib29sZWFuID0gdGhpcy5uZ01vZGVsID8gdHJ1ZSA6IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gdGhpcyBpcyB0byBzZXQgY29udHJvbCB2YWx1ZSBpcyB2YWxpZCBvciBub3QsIHNldCBieSB1cyBpbnNpZGUgdmFsaWRhdGUgY2FsbGJjayBtZXRob2QgY2FsbGVkIGJ5IGFuZ3VsYXIgICovXHJcbiAgcHVibGljIGlzVmFsaWQ6IGJvb2xlYW4gPSB0cnVlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gd2hlbiBjb250cm9sIGlzIHRvdWNoZWQgdGhlbiB0aGUgd2lsbCBtYWlkIHRydWUgYnkgdGhlIHVzIHRvIGNoZWNrIGl0IGlzIHRvdWNoZWQgb3Igbm90LCB3aGVuIHdlIHdpbGwgc2V0IHRoaXMgdHJ1ZSB3ZSB3aWxsIGNhbGwgdGhlIG9uVG91Y2hlZCBjYWxsYmFjayBtZXRob2Qgb2YgYW5ndWFsciB0byBpbmZvcm0gYW5ndWxhciB0aGF0IHNvbXRoaXMgaXMgY2hhbmdlZCBhbmQgY29udHJvbCBpcyB0b3VjaGVkICovXHJcbiAgcHVibGljIGlzVG91Y2hlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIC8qKiBAZGVzY3JpcHRpb24gd2Ugd2lsbCB0YWtlIHR5cGUgb2YgY29udHJvbCBpbiB0eXBlIGJ1dCBpcyBtYXkgYmUgbm90IGV4YWN0bHkgd2hpY2ggaW5wdXQncyB0eXBlIHNvIHdlIG5lZWQgdG8gZ2V0IHR5cGUgYW5kIHNldCBhY3R1bGUgdHlwZSB0byBvdXIgaW5wdXQsIGFsc28gd2hlbiB0eXBlIGlzIHNldCBwYXNzd29yZCBidXQgaW4gY2Fsc2UgdmlldyBpbiB0ZXh0dCB0aGVuIGludXV0IHR5cGUgbmVlZCB0byBjaGFuZ2UgdG8gdGV4dCAqL1xyXG4gIHB1YmxpYyB0eXBlSW50ZXJuYWw6IGNvbnRyb2xUeXBlID0gXCJ0ZXh0XCI7XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBpZiB0cmFsaW5nIGlzIHNldCB0aGUgaXQgaXMgYXNzaWduZWQgYnkgaXQsIGJ1dCBzb21lIGNhc2UgdGFybGluZyBpY29uIG5vdCBhcyBpdCBpcyBzZXQgbmVlZCB0cm8gYmUgY2hhbmdlZCBhdCBydW50aW1lLCBsaWtlIHBhc3N3b3JkIHZpc2liaWxpdHkgaGlkZSBhbmQgc2hvdyAqL1xyXG4gIHB1YmxpYyB0cmFpbGluZ0ljb25JbnRlcm5hbDogc3RyaW5nID0gXCJcIjtcclxuXHJcbiAgLyogXHJcbiAgICAgIFByb3BlcnRpZXMgY29ubmVjdGVkIHdpdGggdHJhaWxpbmdJY29uSW50ZXJuYWwgXHJcbiAgKi9cclxuICBwdWJsaWMgaXNUcmFpbGluZ0ljb25BbGx3ZWRDbGljazogYm9vbGVhbiA9IGZhbHNlO1xyXG5cclxuICAvLyBQcm9wZXJ0aWVzIGNvbm5lY3RlZCB3aXRoIGlkXHJcbiAgcHVibGljIGlkUmFuZG9tOiBzdHJpbmcgPSB0aGlzLnJhbmRvbVN0cmluZygpO1xyXG5cclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09TUVUSE9EUyBGT1IgQ1VTVE9NIEZPUk0gQ09NUE9ORU5UPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAvLyBGT1IgQU5HVUxBUiBDQUxMRUQgQlkgVUlcclxuXHJcbiAgLyoqIFxyXG4gICAqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIEhUTUwgQ2huYWdlIHRvIHRlbGwgQW5ndWxhciBzb210aGluZyBpcyBjaGFuZ2VkLlxyXG4gICAqIEBmaWVsZCB2YWx1ZSA6IGlucHV0VHlwZVxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICBwcml2YXRlIG9uQ2hhbmdlID0gKHZhbHVlOiBpbnB1dFR5cGUpID0+IHsgfTtcclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIHRvdWNoZWQgKGNsY2lrZWQpIHRvIHRlbGwgQW5ndWxhciBzb210aGluZyBpcyBjaGFuZ2VkLiAqL1xyXG4gIG9uVG91Y2hlZCA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBGdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGlucHV0IGlzIG5lZWQgdG8gVmFsaWRhdGUgdG8gdGVsbCBBbmd1bGFyIHNvbXRoaW5nIGlzIGNoYW5nZWQgKGluIGNhc2Ugb2Ygc29tZSBpbnB1dCBkaXBlbmRlbnQgdmFsaWRhdGlvbikuICovXHJcbiAgb25WYWxpZGF0ZSA9ICgpID0+IHsgfTtcclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uXHJcbiAgICogTWV0aG9kIHRoYXQgcGVyZm9ybXMgc3luY2hyb25vdXMgdmFsaWRhdGlvbiBhZ2FpbnN0IHRoZSBwcm92aWRlZCBjb250cm9sLlxyXG4gICAqIEV4aWN1dGVkIGJ5IEFuZ3VsYXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSBjb250cm9sIFRoZSBjb250cm9sIHRvIHZhbGlkYXRlIGFnYWluc3QuXHJcbiAgICpcclxuICAgKiBAcmV0dXJucyBBIG1hcCBvZiB2YWxpZGF0aW9uIGVycm9ycyBpZiB2YWxpZGF0aW9uIGZhaWxzLFxyXG4gICAqIG90aGVyd2lzZSBudWxsLlxyXG4gICAqL1xyXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcclxuICB2YWxpZGF0ZShjb250cm9sOiBBYnN0cmFjdENvbnRyb2wpOiBWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbCB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uX2Vycm9yID0gdGhpcy5pc0NvbnRyb2xWYWxpZCh0aGlzLm5nTW9kZWwpO1xyXG4gICAgaWYgKHZhbGlkYXRpb25fZXJyb3I/LnN0YXR1cykge1xyXG4gICAgICByZXR1cm4gdmFsaWRhdGlvbl9lcnJvcjtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBudWxsO1xyXG4gICAgfVxyXG4gIH1cclxuICAvKipcclxuICAgKiBAZGVzY3JpcHRpb25cclxuICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLlxyXG4gICAqIEV4aWN1dGVkIGJ5IEFuZ3VsYXJcclxuICAgKlxyXG4gICAqIEBwYXJhbSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb25cclxuICAgKi9cclxuICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlPyhmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vblZhbGlkYXRlID0gZm47XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIHdoZW4gZm9ybSBjb250cm9sIGNoYW5nZSBmcm9tIG1vZGVsIHNpZGUgdGhpcyBtZXRob2QgaXMgaW1wbGVtZW50ZWQgICovXHJcbiAgd3JpdGVWYWx1ZSh2YWx1ZTogaW5wdXRUeXBlKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuaXNOZ01vZGVsKSB7XHJcbiAgICAgIGNvbnN0IG5nTW9kZWwgPSB0aGlzLmF1dG9DYXBpdGFsaXplQnlPcHRpb24odmFsdWUsIHRoaXMudHlwZSk7XHJcbiAgICAgIGNvbnNvbGUubG9nKCd3cml0ZVZhbHVlJywgdGhpcy5uZ01vZGVsLCBuZ01vZGVsKTtcclxuICAgICAgdGhpcy5uZ01vZGVsID0gbmdNb2RlbDtcclxuICAgIH1cclxuICB9XHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBBbGxvd3MgQW5ndWxhciB0byByZWdpc3RlciBhIGZ1bmN0aW9uIHRvIGNhbGwgd2hlbiB0aGUgbW9kZWwgY2hhbmdlcy4gKi9cclxuICAvLyBTYXZlIHRoZSBmdW5jdGlvbiBhcyBhIHByb3BlcnR5IHRvIGNhbGwgbGF0ZXIgaGVyZS5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IGlucHV0VHlwZSkgPT4gdm9pZCk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIHJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBpbnB1dCBoYXMgYmVlbiB0b3VjaGVkLiAqL1xyXG4gIC8vIFNhdmUgdGhlIGZ1bmN0aW9uIGFzIGEgcHJvcGVydHkgdG8gY2FsbCBsYXRlciBoZXJlLlxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiAoKSA9PiB2b2lkKTogdm9pZCB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCA9IGZuO1xyXG4gIH1cclxuXHJcbiAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxyXG5cclxuICAvKlxyXG4gICAgTWV0aG9kcyBmb3IgaW5wdXRcclxuKi9cclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiBEZXRlY3Qgd2V0aGVyIGlucHV0IHByb3BlcnRpcmVzIGNhbmdlZCBvciBub3QgKi9cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XHJcbiAgICBpZiAoY2hhbmdlcz8uWyd2YWx1ZSddKSB7XHJcbiAgICAgIHRoaXMuaXNOZ01vZGVsID0gdHJ1ZTtcclxuICAgICAgdGhpcy5uZ01vZGVsID0gdGhpcy5wcm9jZXNzVmFsdWUodGhpcy5uZ01vZGVsLCB0aGlzLnR5cGUpO1xyXG4gICAgfVxyXG4gICAgaWYgKHRoaXMuaXNWYWxpZFZhbHVlQW5kVHlwZSh0aGlzLm5nTW9kZWwsIHRoaXMudHlwZSkgfHwgdGhpcy5pc1RvdWNoZWQpIHtcclxuICAgICAgdGhpcy5pc0NvbnRyb2xWYWxpZCh0aGlzLm5nTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIERpdGVjdCB0eXBlIGNoYW5nZVxyXG4gICAgaWYgKGNoYW5nZXM/LlsndHlwZSddKSB7XHJcbiAgICAgIHRoaXMuZGV0ZWN0VHlwZUNoYW5nZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5pZCkge1xyXG4gICAgICB0aGlzLmdldENvbnRyb2xEYXRhKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIGN1c3RvbSBtZXRob2QgcnVuIHdoZW4gSFRNTCBjaGFuZ2VzLCB3ZSBjYWxsIG1ldGhvZCByZWdpc3RlcmQgYnkgYW5ndWxhciB0byBkZXRlY3QgY2hhbmdlICovXHJcbiAgdXBEYXRlVmFsdWUodmFsdWU6IHsgdGFyZ2V0OiB7IHZhbHVlOiBpbnB1dFR5cGUgfSB9IHwgRXZlbnQpIHtcclxuICAgIGNvbnN0IHRhcmdldCA9IHZhbHVlLnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50IHwgeyB2YWx1ZTogaW5wdXRUeXBlIH07XHJcbiAgICB0aGlzLmlzQ29udHJvbFZhbGlkKHRhcmdldD8udmFsdWUpO1xyXG4gICAgY29uc3QgdXBkYXRlZFZhbHVlID0gdGhpcy5wcm9jZXNzVmFsdWUodGFyZ2V0Py52YWx1ZSwgdGhpcy50eXBlKTtcclxuICAgIHRoaXMubmdNb2RlbCA9IHVwZGF0ZWRWYWx1ZTtcclxuICAgIHRoaXMubmdNb2RlbENoYW5nZT8uZW1pdCh1cGRhdGVkVmFsdWUpO1xyXG4gICAgLy8gY29uc29sZS5sb2codGFyZ2V0KVxyXG4gICAgdGhpcy5vbkNoYW5nZSh1cGRhdGVkVmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIG1ldGhvZCBhcHBsaWNhYmxlIGluIGNhc2Ugb2YgY29udHJvbCB0eXBlIGNoZWNrYm94XHJcbiAgICogXHJcbiAgICogQHBhcmFtIHZhbHVlIGJvb2xlYW4gfCBzdHJpbmdcclxuICAgKi9cclxuICB1cGRhdGVWYWx1ZUNoZWNrQm94KHZhbHVlOiBzdHJpbmcgfCBib29sZWFuKSB7XHJcbiAgICAvLyBDb252ZXJ0IHN0cmluZyB0byBib29sZWFuXHJcbiAgICB0aGlzLm5nTW9kZWwgPSAhdGhpcy5uZ01vZGVsO1xyXG4gICAgdmFsdWUgPSAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpID8gdmFsdWUgOiAodmFsdWUgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZSk7XHJcbiAgICB0aGlzLm5nTW9kZWxDaGFuZ2U/LmVtaXQodmFsdWUpO1xyXG4gICAgdGhpcy5vbkNoYW5nZSh2YWx1ZSk7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIGNsZWFyIHRoZSB2YWx1ZSAqL1xyXG4gIENsZWFySW5wdXRWYWx1ZSgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT0gXCJ0ZXh0XCIpIHtcclxuICAgICAgdGhpcy51cERhdGVWYWx1ZSh7IHRhcmdldDogeyB2YWx1ZTogXCJcIiB9IH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqIEBkZXNjcmlwdGlvbiB3aGVuIEhUTUwgaXMgZm9jdWVzZCAqL1xyXG4gIGZvY3VzQ29udHJvbCgpIHtcclxuICAgIHRoaXMuaXNUb3VjaGVkID0gdHJ1ZTtcclxuICAgIHRoaXMub25Ub3VjaGVkKCk7XHJcbiAgICB0aGlzLm9uVmFsaWRhdGUoKTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gSWYgY29udHJvbCB2YWx1ZSBuZWVkIHRvIGJlIHByb2Nlc3NlZCwgbGlrZSBVUFBFUkNBU0UgKi9cclxuICBwcm9jZXNzVmFsdWUodmFsdWU6IGlucHV0VHlwZSwgdHlwZTogY29udHJvbFR5cGUpIHtcclxuICAgIHZhbHVlID0gdGhpcy5hdXRvQ2FwaXRhbGl6ZUJ5T3B0aW9uKHZhbHVlLCB0eXBlKTtcclxuICAgIHJldHVybiB2YWx1ZTtcclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gZm9yIGNhcGl0YWxpemF0aW9uICovXHJcbiAgYXV0b0NhcGl0YWxpemVCeU9wdGlvbih2YWx1ZTogaW5wdXRUeXBlLCB0eXBlOiBjb250cm9sVHlwZSkge1xyXG4gICAgaWYgKHR5cGUgPT0gJ3RleHQnKSB7XHJcbiAgICAgIGlmICh0aGlzLmF1dG9jYXBpdGFsaXplID09IFwib25cIikge1xyXG4gICAgICAgIHJldHVybiB0aGlzLmNhcGl0YWxpemVQaXBlPy50cmFuc2Zvcm0odmFsdWUgYXMgc3RyaW5nLCAnYWxsVXBwZXJDYXNlJyk7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKHRoaXMuYXV0b2NhcGl0YWxpemUgPT0gXCJ3b3Jkc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsICd0aXRsZUNhc2UnKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAodGhpcy5hdXRvY2FwaXRhbGl6ZSA9PSBcInNlbnRlbmNlc1wiKSB7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FwaXRhbGl6ZVBpcGU/LnRyYW5zZm9ybSh2YWx1ZSBhcyBzdHJpbmcsIFwic2VudGVuY2VDYXNlXCIpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdmFsdWU7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEl0IGlzIHVzZWQgdG8gcmV0dXJuIHRoZSB2YWx1ZSBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc1ZhbGlkVmFsdWVBbmRUeXBlKHZhbHVlOiBpbnB1dFR5cGUsIHR5cGU6IGNvbnRyb2xUeXBlKSB7XHJcbiAgICBpZiAodHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIH1cclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIC8qKiBAZGVzY3JpcHRpb24gdG8gY2hlY2sgY29udHJvbCBpcyB2YWxpZCBvciBub3QgKi9cclxuICBpc0NvbnRyb2xWYWxpZCh2YWx1ZTogaW5wdXRUeXBlKTogVmFsaWRhdGlvblN0YXR1cyB7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uX3N0YXR1czogVmFsaWRhdGlvblN0YXR1cyA9IHtcclxuICAgICAgdmFsaWRhdGlvbjoge30sXHJcbiAgICAgIHN0YXR1czogZmFsc2VcclxuICAgIH07XHJcblxyXG4gICAgaWYgKHRoaXMucmVxdWlyZWQpIHtcclxuICAgICAgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMudHlwZSA9PSAndGV4dCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiAodmFsdWUpID09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMubWF4bGVuZ3RoID4gMCkge1xyXG4gICAgICAgICAgaWYgKHZhbHVlPy5sZW5ndGggPiB0aGlzLm1heGxlbmd0aCkge1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy5zdGF0dXMgPSB0cnVlO1xyXG4gICAgICAgICAgICB2YWxpZGF0aW9uX3N0YXR1cy52YWxpZGF0aW9uLm1heGxlbmd0aCA9IGBtYXhpbXVtIGxlbmd0aCBpcyAke3RoaXMubWF4bGVuZ3RofSFgO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICBpZiAodGhpcy5taW5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgICBpZiAodmFsdWU/Lmxlbmd0aCA8IHRoaXMubWlubGVuZ3RoKSB7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24ubWlubGVuZ3RoID0gYG1pbmltdW0gbGVuZ3RoIGlzICR7dGhpcy5taW5sZW5ndGh9IWA7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHZhbGlkYXRpb25fc3RhdHVzLnN0YXR1cyA9IHRydWU7XHJcbiAgICAgICAgdmFsaWRhdGlvbl9zdGF0dXMudmFsaWRhdGlvbi5yZXF1aXJlZCA9IGByZXF1aXJlZCFgO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLmlzVmFsaWQgPSAhdmFsaWRhdGlvbl9zdGF0dXMuc3RhdHVzO1xyXG4gICAgdGhpcy5lcnJvclRleHQgPSBPYmplY3QudmFsdWVzKHZhbGlkYXRpb25fc3RhdHVzLnZhbGlkYXRpb24pLmF0KDApIHx8ICcnXHJcbiAgICByZXR1cm4gdmFsaWRhdGlvbl9zdGF0dXM7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIEFsbG93cyBBbmd1bGFyIHRvIGRpc2FibGUgdGhlIGlucHV0LiAqL1xyXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7XHJcbiAgfVxyXG5cclxuICAvKiogQGRlc2NyaXB0aW9uIE1ldGhvZCBmb3IgdHJhaWxpbmcgSWNvbiBDbGljayAqL1xyXG4gIHRyYWlsaW5nSWNvbkNsaWNrKCkge1xyXG4gICAgaWYgKHRoaXMudHlwZSA9PT0gJ3Bhc3N3b3JkJykge1xyXG4gICAgICBpZiAodGhpcy50eXBlSW50ZXJuYWwgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9ICd0ZXh0JztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHknO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIHRoaXMudHlwZUludGVybmFsID0gJ3Bhc3N3b3JkJztcclxuICAgICAgICB0aGlzLnRyYWlsaW5nSWNvbkludGVybmFsID0gJ3Zpc2liaWxpdHlfb2ZmJztcclxuICAgICAgfVxyXG4gICAgfWVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9IHRoaXMudHlwZTtcclxuICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBNZXRob2QgdG8gZ2VuZXJhdGUgUmFuZG9tIFN0cmluZ1xyXG4gICAqIEBwYXJhbSBzZXR1cFByYXJhbWV0ZXIgeyBsZW5naHQ6IG51bWJlciwgcHJlZml4OiBzdHJpbmcgfVxyXG4gICAqIGRlZmF1bHQgbGVuZ2h0IGlzIDEwLCBwcmVmb3ggaXMgXCJcIlxyXG4gICAqIEByZXR1cm5zIHN0cmluZ1xyXG4gICAqL1xyXG4gIHJhbmRvbVN0cmluZyhzZXR1cFByYXJhbWV0ZXI6IHsgbGVuZ2h0OiBudW1iZXIsIHByZWZpeDogc3RyaW5nIH0gPSB7IGxlbmdodDogMTAsIHByZWZpeDogXCJcIiB9KTogc3RyaW5nIHtcclxuICAgIC8vdmFyaWFibGUgY29uc2lzdGluZyBhbHBoYWJldHMgaW4gc21hbGwgYW5kIGNhcGl0YWwgbGV0dGVyICBcclxuICAgIGNvbnN0IGNoYXJhY3RlcnMgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFRaYWJjZGVmZ2hpa2xtbm9wcXJzdHV2d3h5elwiO1xyXG4gICAgLy9sb29wIHRvIHNlbGVjdCBhIG5ldyBjaGFyYWN0ZXIgaW4gZWFjaCBpdGVyYXRpb24gIFxyXG4gICAgbGV0IHJhbmRvbV9zdHJpbmcgPSBzZXR1cFByYXJhbWV0ZXI/LnByZWZpeCB8fCBcIlwiO1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXR1cFByYXJhbWV0ZXI/LmxlbmdodDsgaSsrKSB7XHJcbiAgICAgIGNvbnN0IHJudW0gPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBjaGFyYWN0ZXJzLmxlbmd0aCk7XHJcbiAgICAgIHJhbmRvbV9zdHJpbmcgKz0gY2hhcmFjdGVycy5zdWJzdHJpbmcocm51bSwgcm51bSArIDEpO1xyXG4gICAgfVxyXG4gICAgLy9yZXR1cm4gdGhlIGdlbmVyYXRlZCBzdHJpbmcgIFxyXG4gICAgcmV0dXJuIHJhbmRvbV9zdHJpbmc7XHJcbiAgfVxyXG5cclxuICBhc3luYyBnZXRDb250cm9sRGF0YSgpIHtcclxuICAgIGNvbnN0IGNpZGVfZWxlbWVudF9kYXRhID0gYXdhaXQgdGhpcy5lbGVtZW50U2VydmljZT8uZ2V0RWxlbWVudERhdGEoeyBzeXBlX2tleTogdGhpcy5pZCB9KTtcclxuICAgIGlmIChjaWRlX2VsZW1lbnRfZGF0YSkge1xyXG4gICAgICB0aGlzLmxhYmVsID0gY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfbGFiZWwgYXMgc3RyaW5nO1xyXG4gICAgICB0aGlzLmxhYmVsUGxhY2VtZW50ID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2xhYmVsX3BsYWNlbWVudCB8fCAnZmxvYXRpbmcnKSBhcyBsYWJlbFBsYWNlbWVudFR5cGU7XHJcbiAgICAgIHRoaXMudHlwZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV90eXBlIHx8ICd0ZXh0JykgYXMgY29udHJvbFR5cGU7XHJcbiAgICAgIHRoaXMucmVxdWlyZWQgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfcmVxdWlyZWQgfHwgZmFsc2UpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMuc2l6ZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9zaXplIHx8ICdtZCcpIGFzIHRoZW1lU2l6ZTtcclxuICAgICAgdGhpcy5oZWxwZXJUZXh0Q29sbGFwc2UgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfaGVscGVyX3RleHRfY29sbGFwc2UgfHwgZmFsc2UpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMubWF4bGVuZ3RoID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX21heF9sZW5ndGgpIGFzIG51bWJlcjtcclxuICAgICAgdGhpcy5taW5sZW5ndGggPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfbWluX2xlbmd0aCkgYXMgbnVtYmVyO1xyXG4gICAgICB0aGlzLmxlYWRpbmdJY29uID0gKGNpZGVfZWxlbWVudF9kYXRhPy5zeXBlX2xlYWRpbmdfaWNvbikgYXMgc3RyaW5nO1xyXG4gICAgICB0aGlzLmxhYmVsSGlkZSA9IChjaWRlX2VsZW1lbnRfZGF0YT8uc3lwZV9sYWJlbF9oaWRlKSBhcyBib29sZWFuO1xyXG4gICAgICB0aGlzLmhpZGVIZWxwZXJBbmRFcnJvclRleHQgPSAoY2lkZV9lbGVtZW50X2RhdGE/LnN5cGVfaGlkZV9oZWxwZXJfYW5kX2Vycm9yX3RleHQpIGFzIGJvb2xlYW47XHJcbiAgICAgIHRoaXMuZGV0ZWN0VHlwZUNoYW5nZSgpO1xyXG4gICAgICAvLyBWYWxpZGF0ZSBjb250cm9sXHJcbiAgICAgIHRoaXMub25WYWxpZGF0ZSgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQGRlc2NyaXB0aW9uIHVzZSB0byBkZXRhY3QgdGhlIGNoYW5nZSBpbiB0eXBlIGlmIGNoYW5nZXMgZG9uZSB0aGlzIG1ldGhvZCBpcyB1ZWQgdG8gcnVuXHJcbiAgICovXHJcbiAgZGV0ZWN0VHlwZUNoYW5nZSgpIHtcclxuICAgIGlmICh0aGlzLnR5cGUgPT09ICdwYXNzd29yZCcpIHtcclxuICAgICAgdGhpcy50eXBlSW50ZXJuYWwgPSBcInBhc3N3b3JkXCI7XHJcbiAgICAgIHRoaXMudHJhaWxpbmdJY29uSW50ZXJuYWwgPSBcInZpc2liaWxpdHlfb2ZmXCI7XHJcbiAgICAgIHRoaXMuaXNUcmFpbGluZ0ljb25BbGx3ZWRDbGljayA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLnR5cGVJbnRlcm5hbCA9IHRoaXMudHlwZTtcclxuICAgICAgdGhpcy50cmFpbGluZ0ljb25JbnRlcm5hbCA9IHRoaXMudHJhaWxpbmdJY29uO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwiY2lkZS1pbnB1dFwiPlxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1URVhUIHwgUEFTU1dPUkQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+XHJcbiAgICA8ZGl2ICpuZ0lmPVwidHlwZSA9PT0gJ3RleHQnIHx8IHR5cGUgPT09ICdudW1iZXInIHx8IHR5cGUgPT09ICdwYXNzd29yZCdcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwidHctdy1mdWxsIHR3LXJlbGF0aXZlXCIgW25nU3R5bGVdPVwieyB3aWR0aDogd2lkdGggfVwiIFtuZ0NsYXNzXT1cIntcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtc2l6ZS14eHMnOiAoc2l6ZSA9PT0gJzJ4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXhzJzogKHNpemUgPT09ICd4cycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLXNtJzogKHNpemUgPT09ICdzbScpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLW1kJzogKHNpemUgPT09ICdtZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zaXplLWxnJzogKHNpemUgPT09ICdsZycpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1sZWFkaW5nLWljb24nOiBsZWFkaW5nSWNvbixcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtdHJhaWxpbmctaWNvbic6IHRyYWlsaW5nSWNvbkludGVybmFsLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1jbGVhci1pbnB1dCc6IGNsZWFySW5wdXQsXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LWlucHV0LWxhYmVsLWZsb2F0aW5nJzogKGxhYmVsUGxhY2VtZW50ID09PSAnZmxvYXRpbmcnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtc3RhcnQnOiAobGFiZWxEaXIgPT09ICdzdGFydCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1lbmQnOiAobGFiZWxEaXIgPT09ICdlbmQnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbGFiZWwtZml4ZWQnOiAobGFiZWxQbGFjZW1lbnQgPT09ICdmaXhlZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1pbnB1dC1sYWJlbC1sZXNzJzogKCFsYWJlbCB8fCBsYWJlbEhpZGUpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1vdXRsaW5lJzogKGZpbGwgPT09ICdvdXRsaW5lJyksXHJcbiAgICAgICAgICAgICAgICAnY2lkZS1lbGVtZW50LXN0eWxlLXNvbGlkJzogKGZpbGwgPT09ICdzb2xpZCcpLFxyXG4gICAgICAgICAgICAgICAgJ2NpZGUtZWxlbWVudC1zdHlsZS1zdGFuZGFyZCc6IChmaWxsID09PSAnc3RhbmRhcmQnKSxcclxuICAgICAgICAgICAgICAgICdjaWRlLWVsZW1lbnQtaW5wdXQtbnVtYmVyJzogKHR5cGUgPT09ICdudW1iZXInKVxyXG4gICAgICAgICAgICB9XCI+XHJcbiAgICAgICAgICAgIDwhLS0gbGFiZWwgLS0+XHJcbiAgICAgICAgICAgIDxsYWJlbCBbZm9yXT1cImlkXCIgY2xhc3M9XCJjaWRlLWlucHV0LWxhYmVsXCIgKm5nSWY9XCJsYWJlbCAmJiAhbGFiZWxIaWRlXCI+e3tsYWJlbH19PC9sYWJlbD5cclxuXHJcbiAgICAgICAgICAgIDwhLS0gYWxsIG9uZSBsaW5lIGVsZW1ldHMgd2hpY2ggZG9zZSBub3QgYWZmZWN0IHdpdGggbGFiZWwgYW5kIGVycm9yIHRleHQgLS0+XHJcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaWRlLWVsZW1lbnQtaW5wdXQtd3JhcHBlclwiPlxyXG4gICAgICAgICAgICAgICAgPCEtLSBMZWFkaW5nIEljb24gLS0+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNpZGUtaW5wdXQtbGVhZGluZy1pY29uLXdyYXBwZXJcIiAqbmdJZj1cImxlYWRpbmdJY29uXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW5cclxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaWRlLWlucHV0LWxlYWRpbmctaWNvbiBtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXRleHQtY2VudGVyXCI+e3tsZWFkaW5nSWNvbn19PC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9zcGFuPlxyXG5cclxuICAgICAgICAgICAgICAgIDwhLS0gVHJhbGluZyBpY29uIC0tPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0dy1hYnNvbHV0ZSBjaWRlLWlucHV0LXRyYWlsaW5nLWljb24gLXR3LWJvdHRvbS0xIHR3LXNlbGVjdC1ub25lIHR3LXJpZ2h0LTBcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwidHJhaWxpbmdJY29uSW50ZXJuYWxcIj5cclxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm1hdGVyaWFsLXN5bWJvbHMtb3V0bGluZWQgdHctdy04IHR3LXRleHQtY2VudGVyICF0dy10ZXh0LTJ4bFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cInsndHctY3Vyc29yLXBvaW50ZXInOiBpc1RyYWlsaW5nSWNvbkFsbHdlZENsaWNrfVwiIFthdHRyLnRhYmluZGV4XT1cImZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInRyYWlsaW5nSWNvbkNsaWNrKClcIiAoa2V5dXApPVwidHJhaWxpbmdJY29uQ2xpY2soKVwiPnt7dHJhaWxpbmdJY29uSW50ZXJuYWx9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cclxuXHJcbiAgICAgICAgICAgICAgICA8IS0tIENsZWFyIC0tPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImNpZGUtaW5wdXQtY2xlYXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICpuZ0lmPVwiY2xlYXJJbnB1dCAmJiBuZ01vZGVsXCIgKGNsaWNrKT1cIkNsZWFySW5wdXRWYWx1ZSgpXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjaWRlLWlucHV0LWNsZWFyLWljb24gbWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZFwiPmNsb3NlPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgPC9idXR0b24+XHJcblxyXG4gICAgICAgICAgICAgICAgPCEtLSBJbnB1dCAtLT5cclxuICAgICAgICAgICAgICAgIDxpbnB1dCBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXJcIiBbaWRdPVwiaWRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIlsoKGxhYmVsICYmIGxhYmVsUGxhY2VtZW50ID09PSAnZml4ZWQnKSA/ICd0dy1yb3VuZGVkLWUtbWQgdHctcm91bmRlZC1lcy1tZCcgOiAndHctcm91bmRlZC1tZCAnKSwgKCFsZWFkaW5nSWNvbiA/ICd0dy1wbC0xJyA6ICcnKSwgKHRyYWlsaW5nSWNvbkludGVybmFsID8gJ3R3LXByLTgnOiAnJyksICghdHJhaWxpbmdJY29uSW50ZXJuYWwgPyAndHctcHItMScgOiAnJyksICgoc2l6ZSA9PT0gJ21kJykgPyAndHctaC04IHR3LXB0LTAuNSB0dy1wYi0wJyA6IChzaXplID09PSAnc20nID8gJ3R3LWgtNycgOiAnJykpLCAobGFiZWxIaWRlID8gJyF0dy1tdC0wJyA6ICcnKV1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwibmdNb2RlbFwiIFt0eXBlXT1cInR5cGVJbnRlcm5hbFwiIChpbnB1dCk9XCJ1cERhdGVWYWx1ZSgkZXZlbnQpXCIgKGZvY3VzKT1cImZvY3VzQ29udHJvbCgpXCJcclxuICAgICAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiIFttaW5dPVwibWluXCIgW21heF09XCJtYXhcIlxyXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LXctZnVsbCB0dy1iZy10cmFuc3BhcmVudCB0dy1vdmVyZmxvdy1oaWRkZW4gdHctYm9yZGVyLXNvbGlkIHR3LXAtMCBjaWRlLWlucHV0LWlucHV0IHR3LW91dGxpbmUtbm9uZVwiIC8+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICA8IS0tIGVycm9yIHRleHQgLyBoZWxwZXIgdGV4dCAtLT5cclxuICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIoZXJyb3JUZXh0IHx8IGhlbHBlclRleHQgfHwgIWhlbHBlclRleHRDb2xsYXBzZSkgJiYgIWhpZGVIZWxwZXJBbmRFcnJvclRleHRcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJjaWRlLWlucHV0LWhlbHAtZXJyb3ItdGV4dFwiPnt7XHJcbiAgICAgICAgICAgICAgICBpc1ZhbGlkXHJcbiAgICAgICAgICAgICAgICA/IGhlbHBlclRleHQgOiAoZXJyb3JUZXh0ID9cclxuICAgICAgICAgICAgICAgIChpc1RvdWNoZWQgPyBlcnJvclRleHQgOiBoZWxwZXJUZXh0KVxyXG4gICAgICAgICAgICAgICAgOiBoZWxwZXJUZXh0KX19PC9zcGFuPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLSBJbnB1dCB3aXRoIHRyYWxsaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1yaWdodC0wIC10dy16LTEwIHR3LXRleHQtZ3JheS00MDBcIj5cclxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibWF0ZXJpYWwtc3ltYm9scy1vdXRsaW5lZCB0dy13LTggdHctdGV4dC1jZW50ZXIgIXR3LXRleHQtMnhsXCI+IHBlcnNvbiA8L3NwYW4+XHJcbiAgICAgICAgICAgIDwvc3Bhbj5cclxuICAgICAgICAgICAgPGlucHV0XHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cInR3LW0tMCB0dy1oLTggdHctdy1mdWxsIHR3LW92ZXJmbG93LWhpZGRlbiB0dy1yb3VuZGVkLW1kIHR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1ib3JkZXItZ3JheS0zMDAgdHctYmctdHJhbnNwYXJlbnQgdHctcC0wIHR3LXBiLTAuNSB0dy1wbC0xIHR3LXByLTggdHctdGV4dC1zbSB0dy10ZXh0LWdyYXktNjAwIHR3LW91dGxpbmUtbm9uZSBob3Zlcjp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctYm9yZGVyLWJsdWUtNDAwIGZvY3VzOnR3LXRleHQtZ3JheS05NTBcIlxyXG4gICAgICAgICAgICAgICAgdmFsdWU9XCJBbmt1c2ggQmh1cmVcIiAvPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+IC0tPlxyXG5cclxuICAgIDwhLS0gSW5wdXQgd2l0aCBsZWFkaW5nIGljb24gLS0+XHJcbiAgICA8IS0tIDxkaXYgY2xhc3M9XCJ0dy1pbmxpbmUtYmxvY2sgdHctaC0xMiB0dy13LTY0XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInR3LXctZnVsbGgtZnVsbCB0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8bGFiZWxcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LXRvcC0xLzMgdHctbXgtMiB0dy1iZy13aGl0ZSB0dy1weC0wLjUgdHctcHktMCB0dy10ZXh0LXNtIHR3LWxlYWRpbmctNCB0dy10ZXh0LWdyYXktNzAwXCI+TmFtZTwvbGFiZWw+XHJcbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidHctYWJzb2x1dGUgLXR3LWJvdHRvbS1weCB0dy1sZWZ0LTAgLXR3LXotMTAgdHctdGV4dC1ncmF5LTQwMFwiPlxyXG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtYXRlcmlhbC1zeW1ib2xzLW91dGxpbmVkIHR3LXctOCB0dy10ZXh0LWNlbnRlciAhdHctdGV4dC0yeGxcIj4gcGVyc29uIDwvc3Bhbj5cclxuICAgICAgICAgICAgPC9zcGFuPlxyXG4gICAgICAgICAgICA8aW5wdXRcclxuICAgICAgICAgICAgICAgIGNsYXNzPVwidHctbS0wIHR3LWgtOCB0dy13LWZ1bGwgdHctb3ZlcmZsb3ctaGlkZGVuIHR3LXJvdW5kZWQtbWQgdHctYm9yZGVyLTIgdHctYm9yZGVyLXNvbGlkIHR3LWJvcmRlci1ncmF5LTMwMCB0dy1iZy10cmFuc3BhcmVudCB0dy1wLTAgdHctcGItMC41IHR3LXBsLTggdHctcHItMSB0dy10ZXh0LXNtIHR3LXRleHQtZ3JheS02MDAgdHctb3V0bGluZS1ub25lIGhvdmVyOnR3LWJvcmRlci1ibHVlLTQwMCBmb2N1czp0dy1ib3JkZXItYmx1ZS00MDAgZm9jdXM6dHctdGV4dC1ncmF5LTk1MFwiXHJcbiAgICAgICAgICAgICAgICB2YWx1ZT1cIkFua3VzaCBCaHVyZVwiIC8+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj4gLS0+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1DSEVDS0JPWC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnY2hlY2tib3gnXCIgY2xhc3M9XCJ0dy1mbGV4XCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNpZGUtY2hlY2tib3ggdHctcmVsYXRpdmVcIj5cclxuICAgICAgICAgICAgPGlucHV0IFtjaGVja2VkXT1cIm5nTW9kZWxcIiBbdmFsdWVdPVwibmdNb2RlbFwiIFtpZF09XCJpZFJhbmRvbVwiIFt0eXBlXT1cInR5cGVcIlxyXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJ0dy1hYnNvbHV0ZSB0dy1sZWZ0LTAgdHctaW52aXNpYmxlXCIgKGNsaWNrKT1cInVwZGF0ZVZhbHVlQ2hlY2tCb3goIW5nTW9kZWwpOyBmb2N1c0NvbnRyb2woKVwiXHJcbiAgICAgICAgICAgICAgICBbYXV0b2NvbXBsZXRlXT1cImF1dG9jb21wbGV0ZVwiIC8+XHJcbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNpZGUtY2hlY2tib3gtbGFiZWwgdHctY3Vyc29yLXBvaW50ZXJcIiBbZm9yXT1cImlkUmFuZG9tXCI+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LWJvcmRlci0yIHR3LWJvcmRlci1zb2xpZCB0dy1yZWxhdGl2ZSB0dy1yb3VuZGVkLW1kXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHN2ZyB3aWR0aD1cIjEycHhcIiBoZWlnaHQ9XCIxMHB4XCIgY2xhc3M9XCJ0dy1hYnNvbHV0ZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9XCIjc2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCI+PC91c2U+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9zdmc+XHJcbiAgICAgICAgICAgICAgICA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInR3LXRleHQtc20gdHctcGwtMiB0dy1sZWFkaW5nLVsxOHB4XSB0dy1zZWxlY3Qtbm9uZSB0dy1jdXJzb3ItcG9pbnRlclwiXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCIhbGFiZWxIaWRlXCI+e3tsYWJlbH19PC9zcGFuPlxyXG4gICAgICAgICAgICA8L2xhYmVsPlxyXG4gICAgICAgICAgICA8c3ZnIGNsYXNzPVwidHctYWJzb2x1dGUgdHctaC0wIHR3LXctMCB0dy1zZWxlY3Qtbm9uZSB0dy1wb2ludGVyLWV2ZW50cy1ub25lXCI+XHJcbiAgICAgICAgICAgICAgICA8IS0tIEVsZW1lbnQgaGlkZGVuIGFuZCBpdHMgeHBhdGggaXMgdXNlZCB0byBkaXNwbGF5IGluc2lkZSBTVkcgLS0+XHJcbiAgICAgICAgICAgICAgICA8c3ltYm9sIGlkPVwic2Rmd2lvcmZrbGFzZmpqYWxmandlcndyXCIgdmlld2JveD1cIjAgMCAxMiAxMFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxwb2x5bGluZSBwb2ludHM9XCIxLjUgNiA0LjUgOSAxMC41IDFcIj48L3BvbHlsaW5lPlxyXG4gICAgICAgICAgICAgICAgPC9zeW1ib2w+XHJcbiAgICAgICAgICAgIDwvc3ZnPlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPCEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tU0VMRUNULS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT5cclxuICAgIDxkaXYgKm5nSWY9XCJ0eXBlID09PSAnc2VsZWN0J1wiPnNhc1xyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0dy1yZWxhdGl2ZVwiPlxyXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwidHctYWJzb2x1dGVcIj5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGl0ZW0gb2Ygb3B0aW9uOyB0cmFjayAkaW5kZXgpIHtcclxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0dy13LWZ1bGxcIj5cclxuICAgICAgICAgICAgICAgICAgICB7e2l0ZW19fVxyXG4gICAgICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==