iptdevs-design-system 2.7.28 → 2.7.30

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 (42) hide show
  1. package/esm2020/lib/cod/cod-documents-section/cod-documents-section.component.mjs +15 -0
  2. package/esm2020/lib/cod/cod-form/cod-form.component.mjs +226 -0
  3. package/esm2020/lib/cod/cod.module.mjs +82 -0
  4. package/esm2020/lib/cod/logic/calculate-quotes.service.mjs +72 -0
  5. package/esm2020/lib/cod/logic/cod-form-controls.mjs +91 -0
  6. package/esm2020/lib/cod/logic/cod-form-steps.mjs +29 -0
  7. package/esm2020/lib/cod/logic/communicator.service.mjs +28 -0
  8. package/esm2020/lib/cod/logic/local-storage-cod.service.mjs +39 -0
  9. package/esm2020/lib/cod/steps/cod-form-step-five/cod-form-step-five.component.mjs +144 -0
  10. package/esm2020/lib/cod/steps/cod-form-step-four/cod-form-step-four.component.mjs +250 -0
  11. package/esm2020/lib/cod/steps/cod-form-step-one/cod-form-step-one.component.mjs +199 -0
  12. package/esm2020/lib/cod/steps/cod-form-step-three/cod-form-step-three.component.mjs +174 -0
  13. package/esm2020/lib/cod/steps/cod-form-step-two/cod-form-step-two.component.mjs +254 -0
  14. package/esm2020/lib/core/core.module.mjs +6 -3
  15. package/esm2020/lib/core/models/cod/cod-rq.model.mjs +1 -1
  16. package/esm2020/lib/core/services/copies.service.mjs +17 -0
  17. package/esm2020/lib/core/utils/copies.mjs +214 -0
  18. package/esm2020/lib/design-system.module.mjs +8 -4
  19. package/esm2020/public-api.mjs +19 -1
  20. package/fesm2015/iptdevs-design-system.mjs +1787 -51
  21. package/fesm2015/iptdevs-design-system.mjs.map +1 -1
  22. package/fesm2020/iptdevs-design-system.mjs +1787 -51
  23. package/fesm2020/iptdevs-design-system.mjs.map +1 -1
  24. package/lib/cod/cod-documents-section/cod-documents-section.component.d.ts +8 -0
  25. package/lib/cod/cod-form/cod-form.component.d.ts +37 -0
  26. package/lib/cod/cod.module.d.ts +19 -0
  27. package/lib/cod/logic/calculate-quotes.service.d.ts +14 -0
  28. package/lib/cod/logic/cod-form-controls.d.ts +16 -0
  29. package/lib/cod/logic/cod-form-steps.d.ts +15 -0
  30. package/lib/cod/logic/communicator.service.d.ts +13 -0
  31. package/lib/cod/logic/local-storage-cod.service.d.ts +8 -0
  32. package/lib/cod/steps/cod-form-step-five/cod-form-step-five.component.d.ts +31 -0
  33. package/lib/cod/steps/cod-form-step-four/cod-form-step-four.component.d.ts +47 -0
  34. package/lib/cod/steps/cod-form-step-one/cod-form-step-one.component.d.ts +46 -0
  35. package/lib/cod/steps/cod-form-step-three/cod-form-step-three.component.d.ts +35 -0
  36. package/lib/cod/steps/cod-form-step-two/cod-form-step-two.component.d.ts +44 -0
  37. package/lib/core/models/cod/cod-rq.model.d.ts +1 -0
  38. package/lib/core/services/copies.service.d.ts +7 -0
  39. package/lib/core/utils/copies.d.ts +1 -0
  40. package/lib/design-system.module.d.ts +2 -1
  41. package/package.json +1 -1
  42. package/public-api.d.ts +14 -0
@@ -0,0 +1,250 @@
1
+ import { Component, EventEmitter, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import Swal from 'sweetalert2';
4
+ import { map } from 'rxjs';
5
+ import { CodFormSteps } from '../../logic/cod-form-steps';
6
+ import { CodFormControls } from '../../logic/cod-form-controls';
7
+ import * as i0 from "@angular/core";
8
+ import * as i1 from "@angular/forms";
9
+ import * as i2 from "../../logic/calculate-quotes.service";
10
+ import * as i3 from "../../logic/communicator.service";
11
+ import * as i4 from "../../../core/services/parameters-service/parameters.service";
12
+ import * as i5 from "../../logic/cod-form-controls";
13
+ import * as i6 from "../../../core/services/commercial-service/comercial.service";
14
+ import * as i7 from "../../../components/atoms/select/select.component";
15
+ import * as i8 from "../../../components/atoms/input/input.component";
16
+ import * as i9 from "primeng/table";
17
+ import * as i10 from "primeng/api";
18
+ import * as i11 from "primeng/button";
19
+ export class CodFormStepFourComponent extends CodFormSteps {
20
+ constructor(fb, calculateQuotesService, communicatorService, parameterService, codFormControls, commercialService) {
21
+ super();
22
+ this.fb = fb;
23
+ this.calculateQuotesService = calculateQuotesService;
24
+ this.communicatorService = communicatorService;
25
+ this.parameterService = parameterService;
26
+ this.codFormControls = codFormControls;
27
+ this.commercialService = commercialService;
28
+ this.changeStepEvent = new EventEmitter();
29
+ this.financingData = new EventEmitter();
30
+ this.isCalculateQuotesButtonClicked = false;
31
+ this.errorMessage = 'Faltan campos por llenar.';
32
+ this.paymentMethods = [
33
+ { code: '1', name: 'Financiado' },
34
+ { code: '2', name: 'Contado' },
35
+ ];
36
+ this.dataFinancing = [];
37
+ this.isFinancing = false;
38
+ this.isSemestral = false;
39
+ this.codPrices = [];
40
+ // Controls del formulario
41
+ this.controls = new CodFormControls().controls[3];
42
+ }
43
+ ngOnInit() {
44
+ this.initForm();
45
+ this.startLocalStorageWork();
46
+ this.validateErrors();
47
+ this.getCodPricesByAgreement();
48
+ this.getValuesOfStepOneComponent();
49
+ }
50
+ getValuesOfStepOneComponent() {
51
+ // Tipo de curso seleccionado
52
+ this.communicatorService.getSelectedCourseType().subscribe(value => {
53
+ this.parameterService.getCoursesTypes().pipe(map((response) => {
54
+ const courseTypes = response.data;
55
+ return courseTypes.filter(({ name }) => name.includes('Semestral'));
56
+ }))
57
+ .subscribe((courseTypes) => {
58
+ for (let i = 0; i < courseTypes.length; i++) {
59
+ if (courseTypes[i].code.toString() === value) {
60
+ this.isSemestral = true;
61
+ break;
62
+ }
63
+ else {
64
+ this.isSemestral = false;
65
+ }
66
+ }
67
+ });
68
+ });
69
+ // Convenio seleccionado
70
+ this.communicatorService.getSelectedAgreement().subscribe(value => {
71
+ this.getCodPricesByAgreement(value);
72
+ });
73
+ }
74
+ getCodPricesByAgreement(agreement) {
75
+ let agreementSelected;
76
+ if (agreement) {
77
+ agreementSelected = agreement;
78
+ }
79
+ else {
80
+ agreementSelected = this.localStorageCOD.getCodFormData(1, 'agreement_by_category');
81
+ }
82
+ this.commercialService.getCodPricesByAgreement(Number(agreementSelected)).subscribe({
83
+ next: (response) => {
84
+ if (response.data) {
85
+ const codPrices = response.data;
86
+ this.codPrices = codPrices;
87
+ if (this.codFormStepFour.controls['payment_method'].value === '2') {
88
+ const aux = this.codPrices.filter(codPrice => codPrice.agreement === Number(agreementSelected))[0];
89
+ this.codFormStepFour.controls['program_price'].setValue(aux.normal_price);
90
+ }
91
+ if (this.codFormStepFour.controls['payment_method'].value === '1') {
92
+ const aux = this.codPrices.filter(codPrice => codPrice.agreement === Number(agreementSelected))[0];
93
+ this.codFormStepFour.controls['quota_times'].setValue(aux.code);
94
+ this.codFormStepFour.controls['program_price'].setValue(aux.normal_price);
95
+ }
96
+ }
97
+ },
98
+ error: (err) => console.log(err)
99
+ });
100
+ }
101
+ validateErrors() {
102
+ this.codFormStepFour.valueChanges.subscribe(changes => {
103
+ if (this.codFormStepFour.controls['quota_times'].hasError('min')) {
104
+ this.errorMessage = 'La cantidad de cuotas mínimas debe ser 1';
105
+ }
106
+ else if (this.codFormStepFour.controls['quota_times'].hasError('max')) {
107
+ this.errorMessage = 'La cantidad de cuotas no debe ser superior a 12';
108
+ }
109
+ else {
110
+ this.errorMessage = 'Faltan campos por llenar';
111
+ }
112
+ });
113
+ }
114
+ initForm() {
115
+ this.codFormStepFour = this.fb.group({
116
+ program_price: [{ value: '', disabled: true }, [Validators.required]],
117
+ payment_date: ['', [Validators.required]],
118
+ payment_method: ['', [Validators.required]],
119
+ quota_times: ['', [Validators.required]],
120
+ total_price: [{ value: '', disabled: true }, [Validators.required]],
121
+ });
122
+ this.listenPaymentMethodField();
123
+ }
124
+ listenPaymentMethodField() {
125
+ const control = this.codFormStepFour.get('payment_method');
126
+ control?.valueChanges.subscribe((change) => {
127
+ // Financiado
128
+ if (change === '1') {
129
+ // Poner validaciones
130
+ this.codFormStepFour.controls['program_price'].setValidators([Validators.required]);
131
+ this.codFormStepFour.controls['payment_date'].setValidators([Validators.required]);
132
+ this.codFormStepFour.controls['quota_times'].setValidators([Validators.required]);
133
+ this.codFormStepFour.controls['total_price'].setValidators([Validators.required]);
134
+ // Actualizar para que se tomen los cambios
135
+ this.updateValueAndValidity();
136
+ // Actualizar los controls globales
137
+ this.updateGlobalControls(change);
138
+ }
139
+ // de contado
140
+ if (change === '2') {
141
+ // Quitar las validaciones
142
+ this.codFormStepFour.controls['program_price'].setValidators([Validators.required]);
143
+ this.codFormStepFour.controls['payment_date'].setValidators([Validators.required]);
144
+ this.codFormStepFour.controls['quota_times'].clearValidators();
145
+ this.codFormStepFour.controls['total_price'].setValidators([Validators.required]);
146
+ // Actualizar para que se tomen los cambios
147
+ this.updateValueAndValidity();
148
+ // Actualizar los controls globales
149
+ this.updateGlobalControls(change);
150
+ }
151
+ });
152
+ }
153
+ updateGlobalControls(change) {
154
+ let controls = this.controls.filter(control => control.name !== 'payment_method');
155
+ controls.forEach(control => {
156
+ if (change === '1')
157
+ this.codFormControls.changeValue(4, control.name, true);
158
+ if (change === '2') {
159
+ if (control.name === 'quota_times')
160
+ this.codFormControls.changeValue(4, control.name, false);
161
+ }
162
+ });
163
+ }
164
+ updateValueAndValidity() {
165
+ this.codFormStepFour.controls['program_price'].updateValueAndValidity();
166
+ this.codFormStepFour.controls['payment_date'].updateValueAndValidity();
167
+ this.codFormStepFour.controls['quota_times'].updateValueAndValidity();
168
+ this.codFormStepFour.controls['total_price'].updateValueAndValidity();
169
+ }
170
+ startLocalStorageWork() {
171
+ this.controls.forEach(control => {
172
+ let localStorageValue = this.readAndWriteLS(4, control.name);
173
+ this.codFormStepFour.controls[control.name].setValue(localStorageValue.value);
174
+ this.listenFormChanges(4, control.name, this.codFormStepFour.controls[control.name].valueChanges);
175
+ });
176
+ }
177
+ showTable() {
178
+ this.isCalculateQuotesButtonClicked = true;
179
+ const total_price = this.codFormStepFour.controls['total_price'].value;
180
+ if ((total_price === 'null') || this.codFormStepFour.invalid) {
181
+ Swal.fire({
182
+ title: 'Error',
183
+ text: 'Debes ingresar el monto total de la matrícula y la cuota inicial',
184
+ icon: 'error'
185
+ });
186
+ return;
187
+ }
188
+ // Calcular cuotas
189
+ this.dataFinancing = [];
190
+ const quotaValues = this.codPrices.filter(codPrice => codPrice.code === Number(this.codFormStepFour.controls['quota_times'].value))[0].quota_price;
191
+ let params = {
192
+ date: new Date(this.codFormStepFour.controls['payment_date'].value),
193
+ quotaValues,
194
+ quotaTimes: this.codPrices.filter(codPrice => codPrice.code === Number(this.codFormStepFour.controls['quota_times'].value))[0].fee_number,
195
+ totalPrice: this.codFormStepFour.controls['total_price'].value
196
+ };
197
+ this.dataFinancing = this.calculateQuotesService.calculateQuotes(params);
198
+ this.isFinancing = true;
199
+ this.financingData.emit(this.dataFinancing);
200
+ }
201
+ calculateNewQuotes() {
202
+ this.isCalculateQuotesButtonClicked = false;
203
+ this.isFinancing = false;
204
+ this.financingData.emit(null);
205
+ }
206
+ sendForm() {
207
+ this.codFormStepFour.markAllAsTouched();
208
+ if (this.codFormStepFour.invalid)
209
+ return;
210
+ // Movernos al paso 5
211
+ this.changeStepEvent.emit(4);
212
+ }
213
+ isFinanced() {
214
+ return this.codFormStepFour.controls['payment_method'].value == 1;
215
+ }
216
+ // Eventos del select
217
+ selectPaymentMethod(paymentMethod) {
218
+ if (paymentMethod !== '') {
219
+ this.codFormStepFour.controls['payment_method'].setValue(paymentMethod);
220
+ this.getCodPricesByAgreement();
221
+ }
222
+ else {
223
+ this.codFormStepFour.controls['payment_method'].setValue(null);
224
+ }
225
+ }
226
+ selectQuotas(quotas) {
227
+ if (quotas !== 'Número de cuotas') {
228
+ const codPrice = this.codPrices.filter(codPrice => codPrice.code === Number(quotas));
229
+ this.codFormStepFour.controls['quota_times'].setValue(codPrice[0].code);
230
+ this.codFormStepFour.controls['total_price'].setValue(codPrice[0].enrollment);
231
+ this.codFormStepFour.controls['program_price'].setValue(codPrice[0].financed_price);
232
+ }
233
+ else {
234
+ this.codFormStepFour.controls['quota_times'].setValue(null);
235
+ this.codFormStepFour.controls['total_price'].setValue(null);
236
+ this.codFormStepFour.controls['program_price'].setValue(null);
237
+ }
238
+ }
239
+ }
240
+ CodFormStepFourComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: CodFormStepFourComponent, deps: [{ token: i1.FormBuilder }, { token: i2.CalculateQuotesService }, { token: i3.CommunicatorService }, { token: i4.ParameterService }, { token: i5.CodFormControls }, { token: i6.CommercialService }], target: i0.ɵɵFactoryTarget.Component });
241
+ CodFormStepFourComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: CodFormStepFourComponent, selector: "app-cod-form-step-four", outputs: { changeStepEvent: "changeStepEvent", financingData: "financingData" }, usesInheritance: true, ngImport: i0, template: "<div *ngIf=\"isSemestral\" class=\"m-1 p-2 border-round-lg bg-blue-500 text-white\">\r\n <strong>Nota: </strong>\r\n El tipo de curso seleccionado fue semestral, por lo tanto el estudiante debe pagar matr\u00EDcula y primera cuota (M&M)\r\n</div>\r\n\r\n<form autocomplete=\"off\" [formGroup]=\"codFormStepFour\" class=\"grid mt-2\">\r\n\r\n <div class=\"col-12\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepFour.controls['payment_method'].value\"\r\n [control]=\"codFormStepFour.controls['payment_method']\"\r\n (eventSelect)=\"selectPaymentMethod($event)\"\r\n [data]=\"paymentMethods\"\r\n [defaultText]=\"'M\u00E9todo de pago'\"\r\n ></ipt-select>\r\n <ipt-select *ngIf=\"isFinanced();\"\r\n [initialValue]=\"codFormStepFour.controls['quota_times'].value\"\r\n [control]=\"codFormStepFour.controls['quota_times']\"\r\n (eventSelect)=\"selectQuotas($event)\"\r\n [defaultText]=\"'N\u00FAmero de cuotas'\"\r\n [data]=\"codPrices\"\r\n [selectCode]=\"codFormStepFour.controls['quota_times'].value === null? 'N\u00FAmero de cuotas': codFormStepFour.controls['quota_times'].value\"\r\n ></ipt-select>\r\n </div>\r\n\r\n <div *ngIf=\"isFinanced();\" class=\"col-12\">\r\n <ipt-input *ngIf=\"isFinanced();\"\r\n [inputType]=\"'text'\"\r\n [placeHolder]=\"'Monto total de la matr\u00EDcula'\"\r\n [control]=\"codFormStepFour.controls['total_price']\"\r\n [withPipe]=\"true\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <ipt-input\r\n [withPipe]=\"true\"\r\n [inputType]=\"'text'\"\r\n [control]=\"codFormStepFour.controls['program_price']\"\r\n [placeHolder]=\"'Valor total del programa'\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <ipt-input\r\n onfocus=\"(this.type='date')\"\r\n [inputType]=\"'date'\"\r\n [control]=\"codFormStepFour.controls['payment_date']\"\r\n [placeHolder]=\"'Fecha de pago'\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <!-- Tabla de financiaci\u00F3n -->\r\n <div class=\"col-12\" *ngIf=\"isFinancing\">\r\n <p-table\r\n [value]=\"dataFinancing\"\r\n [tableStyle]=\"{'min-width': '100%'}\"\r\n [rowHover]=\"true\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex align-items-center\">\r\n C\u00E1lculo de cuotas\r\n <button pButton class=\"p-button-sm ml-auto\" label=\"Nuevo c\u00E1lculo\" (click)=\"calculateNewQuotes()\" lab icon=\"pi pi-replay\"></button>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th>#</th>\r\n <th>Valor</th>\r\n <th>Fecha</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-data>\r\n <tr>\r\n <td>{{ data[0] }}</td>\r\n <td>{{ data[1] }}</td>\r\n <td>{{ data[2] }}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n <!-- ---------------------- -->\r\n\r\n</form>\r\n\r\n<div class=\"flex mt-3 align-items-center gap-3\">\r\n <span *ngIf=\"codFormStepFour.invalid && codFormStepFour.touched\" class=\"text-red-500 font-bold text-center mt-1 py-2 bg-red-100 w-full border-round-xl\">{{ errorMessage }}</span>\r\n <div class=\"flex ml-auto gap-2\">\r\n <button *ngIf=\"codFormStepFour.controls['payment_method'].value === '1'\" [disabled]=\"isFinancing || codFormStepFour.controls['payment_method'].value !== '1'\"type=\"submit\" class=\"ml-auto p-button-sm p-button-secondary\" (click)=\"showTable()\" pButton label=\"Calcular cuotas\" icon=\"pi pi-sliders-h\"></button>\r\n <button [disabled]=\"!isFinancing && codFormStepFour.controls['payment_method'].value === '1'\" type=\"submit\" class=\"ml-auto p-button-sm\" (click)=\"sendForm()\" pButton label=\"Siguiente\" icon=\"pi pi-arrow-right\"></button>\r\n </div>\r\n</div>\r\n", styles: [""], components: [{ type: i7.SelectComponent, selector: "ipt-select", inputs: ["isRequired", "data", "defaultText", "selectCode", "disabledSel", "initialValue", "control"], outputs: ["eventSelect"] }, { type: i8.InputComponent, selector: "ipt-input", inputs: ["inputType", "placeHolder", "validateText", "withPipe", "list", "iconUrl", "control", "prefix", "thousands", "decimal"], outputs: ["dateSelected"] }, { type: i9.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "style", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "scrollDirection", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollDelay", "virtualRowHeight", "frozenWidth", "responsive", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "autoLayout", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "groupRowsByOrder", "minBufferPx", "maxBufferPx", "responsiveLayout", "breakpoint", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["selectAllChange", "selectionChange", "contextMenuSelectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i10.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { type: i11.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }] });
242
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: CodFormStepFourComponent, decorators: [{
243
+ type: Component,
244
+ args: [{ selector: 'app-cod-form-step-four', template: "<div *ngIf=\"isSemestral\" class=\"m-1 p-2 border-round-lg bg-blue-500 text-white\">\r\n <strong>Nota: </strong>\r\n El tipo de curso seleccionado fue semestral, por lo tanto el estudiante debe pagar matr\u00EDcula y primera cuota (M&M)\r\n</div>\r\n\r\n<form autocomplete=\"off\" [formGroup]=\"codFormStepFour\" class=\"grid mt-2\">\r\n\r\n <div class=\"col-12\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepFour.controls['payment_method'].value\"\r\n [control]=\"codFormStepFour.controls['payment_method']\"\r\n (eventSelect)=\"selectPaymentMethod($event)\"\r\n [data]=\"paymentMethods\"\r\n [defaultText]=\"'M\u00E9todo de pago'\"\r\n ></ipt-select>\r\n <ipt-select *ngIf=\"isFinanced();\"\r\n [initialValue]=\"codFormStepFour.controls['quota_times'].value\"\r\n [control]=\"codFormStepFour.controls['quota_times']\"\r\n (eventSelect)=\"selectQuotas($event)\"\r\n [defaultText]=\"'N\u00FAmero de cuotas'\"\r\n [data]=\"codPrices\"\r\n [selectCode]=\"codFormStepFour.controls['quota_times'].value === null? 'N\u00FAmero de cuotas': codFormStepFour.controls['quota_times'].value\"\r\n ></ipt-select>\r\n </div>\r\n\r\n <div *ngIf=\"isFinanced();\" class=\"col-12\">\r\n <ipt-input *ngIf=\"isFinanced();\"\r\n [inputType]=\"'text'\"\r\n [placeHolder]=\"'Monto total de la matr\u00EDcula'\"\r\n [control]=\"codFormStepFour.controls['total_price']\"\r\n [withPipe]=\"true\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <ipt-input\r\n [withPipe]=\"true\"\r\n [inputType]=\"'text'\"\r\n [control]=\"codFormStepFour.controls['program_price']\"\r\n [placeHolder]=\"'Valor total del programa'\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <div class=\"col-12\">\r\n <ipt-input\r\n onfocus=\"(this.type='date')\"\r\n [inputType]=\"'date'\"\r\n [control]=\"codFormStepFour.controls['payment_date']\"\r\n [placeHolder]=\"'Fecha de pago'\"\r\n ></ipt-input>\r\n </div>\r\n\r\n <!-- Tabla de financiaci\u00F3n -->\r\n <div class=\"col-12\" *ngIf=\"isFinancing\">\r\n <p-table\r\n [value]=\"dataFinancing\"\r\n [tableStyle]=\"{'min-width': '100%'}\"\r\n [rowHover]=\"true\"\r\n >\r\n <ng-template pTemplate=\"caption\">\r\n <div class=\"flex align-items-center\">\r\n C\u00E1lculo de cuotas\r\n <button pButton class=\"p-button-sm ml-auto\" label=\"Nuevo c\u00E1lculo\" (click)=\"calculateNewQuotes()\" lab icon=\"pi pi-replay\"></button>\r\n </div>\r\n </ng-template>\r\n <ng-template pTemplate=\"header\">\r\n <tr>\r\n <th>#</th>\r\n <th>Valor</th>\r\n <th>Fecha</th>\r\n </tr>\r\n </ng-template>\r\n <ng-template pTemplate=\"body\" let-data>\r\n <tr>\r\n <td>{{ data[0] }}</td>\r\n <td>{{ data[1] }}</td>\r\n <td>{{ data[2] }}</td>\r\n </tr>\r\n </ng-template>\r\n </p-table>\r\n </div>\r\n <!-- ---------------------- -->\r\n\r\n</form>\r\n\r\n<div class=\"flex mt-3 align-items-center gap-3\">\r\n <span *ngIf=\"codFormStepFour.invalid && codFormStepFour.touched\" class=\"text-red-500 font-bold text-center mt-1 py-2 bg-red-100 w-full border-round-xl\">{{ errorMessage }}</span>\r\n <div class=\"flex ml-auto gap-2\">\r\n <button *ngIf=\"codFormStepFour.controls['payment_method'].value === '1'\" [disabled]=\"isFinancing || codFormStepFour.controls['payment_method'].value !== '1'\"type=\"submit\" class=\"ml-auto p-button-sm p-button-secondary\" (click)=\"showTable()\" pButton label=\"Calcular cuotas\" icon=\"pi pi-sliders-h\"></button>\r\n <button [disabled]=\"!isFinancing && codFormStepFour.controls['payment_method'].value === '1'\" type=\"submit\" class=\"ml-auto p-button-sm\" (click)=\"sendForm()\" pButton label=\"Siguiente\" icon=\"pi pi-arrow-right\"></button>\r\n </div>\r\n</div>\r\n", styles: [""] }]
245
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.CalculateQuotesService }, { type: i3.CommunicatorService }, { type: i4.ParameterService }, { type: i5.CodFormControls }, { type: i6.CommercialService }]; }, propDecorators: { changeStepEvent: [{
246
+ type: Output
247
+ }], financingData: [{
248
+ type: Output
249
+ }] } });
250
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWZvcm0tc3RlcC1mb3VyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL2Rlc2lnbi1zeXN0ZW0vc3JjL2xpYi9jb2Qvc3RlcHMvY29kLWZvcm0tc3RlcC1mb3VyL2NvZC1mb3JtLXN0ZXAtZm91ci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29kL3N0ZXBzL2NvZC1mb3JtLXN0ZXAtZm91ci9jb2QtZm9ybS1zdGVwLWZvdXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hFLE9BQU8sRUFBMEIsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDcEUsT0FBTyxJQUFJLE1BQU0sYUFBYSxDQUFDO0FBQy9CLE9BQU8sRUFBVSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDbkMsT0FBTyxFQUFFLFlBQVksRUFBc0IsTUFBTSw0QkFBNEIsQ0FBQztBQUM5RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUFvQmhFLE1BQU0sT0FBTyx3QkFBeUIsU0FBUSxZQUFZO0lBbUJ4RCxZQUNVLEVBQWUsRUFDZixzQkFBOEMsRUFDOUMsbUJBQXdDLEVBQ3hDLGdCQUFrQyxFQUNsQyxlQUFnQyxFQUNoQyxpQkFBb0M7UUFFNUMsS0FBSyxFQUFFLENBQUM7UUFQQSxPQUFFLEdBQUYsRUFBRSxDQUFhO1FBQ2YsMkJBQXNCLEdBQXRCLHNCQUFzQixDQUF3QjtRQUM5Qyx3QkFBbUIsR0FBbkIsbUJBQW1CLENBQXFCO1FBQ3hDLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFDbEMsb0JBQWUsR0FBZixlQUFlLENBQWlCO1FBQ2hDLHNCQUFpQixHQUFqQixpQkFB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QUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3hFLElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDOUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsZUFBZSxDQUFDLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjLENBQUMsQ0FBQztTQUNyRjthQUFNO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVELElBQUksQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1RCxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0Q7SUFDSCxDQUFDOztxSEF2UFUsd0JBQXdCO3lHQUF4Qix3QkFBd0Isc0tDekJyQywwMkhBNEZBOzJGRG5FYSx3QkFBd0I7a0JBTHBDLFNBQVM7K0JBQ0Usd0JBQXdCO3NRQUt4QixlQUFlO3NCQUF4QixNQUFNO2dCQUNHLGFBQWE7c0JBQXRCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgT25Jbml0LCBPdXRwdXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybUdyb3VwLCBGb3JtQnVpbGRlciwgVmFsaWRhdG9ycyB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IFN3YWwgZnJvbSAnc3dlZXRhbGVydDInO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBDb2RGb3JtU3RlcHMsIGxvY2FsU3RvcmFnZVZhbHVlcyB9IGZyb20gJy4uLy4uL2xvZ2ljL2NvZC1mb3JtLXN0ZXBzJztcclxuaW1wb3J0IHsgQ29kRm9ybUNvbnRyb2xzIH0gZnJvbSAnLi4vLi4vbG9naWMvY29kLWZvcm0tY29udHJvbHMnO1xyXG5pbXBvcnQgeyBDYWxjdWxhdGVRdW90ZXNQYXJhbXMsIENhbGN1bGF0ZVF1b3Rlc1NlcnZpY2UgfSBmcm9tICcuLi8uLi9sb2dpYy9jYWxjdWxhdGUtcXVvdGVzLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb21tdW5pY2F0b3JTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbG9naWMvY29tbXVuaWNhdG9yLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBDb2RQcmljZXMgfSBmcm9tICcuLi8uLi8uLi9jb3JlL21vZGVscy9jb21tZXJjaWFsL2NvbW1lcmNpYWwubW9kZWwnO1xyXG5pbXBvcnQgeyBQYXJhbWV0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9wYXJhbWV0ZXJzLXNlcnZpY2UvcGFyYW1ldGVycy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29tbWVyY2lhbFNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2NvbW1lcmNpYWwtc2VydmljZS9jb21lcmNpYWwuc2VydmljZSc7XHJcblxyXG5pbnRlcmZhY2UgQ291cnNlVHlwZXMge1xyXG4gIGNvZGU6IG51bWJlcjtcclxuICBuYW1lOiBzdHJpbmc7XHJcbiAgbnVtYmVyX2NsYXNzOiBudW1iZXI7XHJcbiAgYWNhZGVtaWNfcGxhbjogbnVtYmVyO1xyXG4gIHVwZGF0ZWRfYXQ6IHN0cmluZztcclxuICBjcmVhdGVkX2F0OiBzdHJpbmc7XHJcbn1cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtY29kLWZvcm0tc3RlcC1mb3VyJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29kLWZvcm0tc3RlcC1mb3VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9jb2QtZm9ybS1zdGVwLWZvdXIuY29tcG9uZW50LmNzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgQ29kRm9ybVN0ZXBGb3VyQ29tcG9uZW50IGV4dGVuZHMgQ29kRm9ybVN0ZXBzIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAT3V0cHV0KCkgY2hhbmdlU3RlcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcbiAgQE91dHB1dCgpIGZpbmFuY2luZ0RhdGEgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcclxuXHJcbiAgY29kRm9ybVN0ZXBGb3VyITogRm9ybUdyb3VwO1xyXG4gIGlzQ2FsY3VsYXRlUXVvdGVzQnV0dG9uQ2xpY2tlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGVycm9yTWVzc2FnZTogc3RyaW5nID0gJ0ZhbHRhbiBjYW1wb3MgcG9yIGxsZW5hci4nO1xyXG4gIHBheW1lbnRNZXRob2RzOiBhbnlbXSA9IFtcclxuICAgIHsgY29kZTogJzEnLCBuYW1lOiAnRmluYW5jaWFkbycgfSxcclxuICAgIHsgY29kZTogJzInLCBuYW1lOiAnQ29udGFkbycgfSxcclxuICBdO1xyXG4gIGRhdGFGaW5hbmNpbmc6IGFueVtdID0gW107XHJcbiAgaXNGaW5hbmNpbmc6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBpc1NlbWVzdHJhbDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIGNvZFByaWNlczogQ29kUHJpY2VzW10gPSBbXTtcclxuXHJcbiAgLy8gQ29udHJvbHMgZGVsIGZvcm11bGFyaW9cclxuICBjb250cm9scyA9IG5ldyBDb2RGb3JtQ29udHJvbHMoKS5jb250cm9sc1szXTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGZiOiBGb3JtQnVpbGRlcixcclxuICAgIHByaXZhdGUgY2FsY3VsYXRlUXVvdGVzU2VydmljZTogQ2FsY3VsYXRlUXVvdGVzU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tbXVuaWNhdG9yU2VydmljZTogQ29tbXVuaWNhdG9yU2VydmljZSxcclxuICAgIHByaXZhdGUgcGFyYW1ldGVyU2VydmljZTogUGFyYW1ldGVyU2VydmljZSxcclxuICAgIHByaXZhdGUgY29kRm9ybUNvbnRyb2xzOiBDb2RGb3JtQ29udHJvbHMsXHJcbiAgICBwcml2YXRlIGNvbW1lcmNpYWxTZXJ2aWNlOiBDb21tZXJjaWFsU2VydmljZVxyXG4gICkge1xyXG4gICAgc3VwZXIoKTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCk6IHZvaWQge1xyXG4gICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgdGhpcy5zdGFydExvY2FsU3RvcmFnZVdvcmsoKTtcclxuICAgIHRoaXMudmFsaWRhdGVFcnJvcnMoKTtcclxuICAgIHRoaXMuZ2V0Q29kUHJpY2VzQnlBZ3JlZW1lbnQoKTtcclxuICAgIHRoaXMuZ2V0VmFsdWVzT2ZTdGVwT25lQ29tcG9uZW50KCk7XHJcbiAgfVxyXG5cclxuICBnZXRWYWx1ZXNPZlN0ZXBPbmVDb21wb25lbnQoKSB7XHJcbiAgICAvLyBUaXBvIGRlIGN1cnNvIHNlbGVjY2lvbmFkb1xyXG4gICAgdGhpcy5jb21tdW5pY2F0b3JTZXJ2aWNlLmdldFNlbGVjdGVkQ291cnNlVHlwZSgpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XHJcbiAgICAgIHRoaXMucGFyYW1ldGVyU2VydmljZS5nZXRDb3Vyc2VzVHlwZXMoKS5waXBlKFxyXG4gICAgICAgIG1hcCggKHJlc3BvbnNlOiBhbnkpID0+IHtcclxuICAgICAgICAgIGNvbnN0IGNvdXJzZVR5cGVzOiBDb3Vyc2VUeXBlc1tdID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgIHJldHVybiBjb3Vyc2VUeXBlcy5maWx0ZXIoICh7IG5hbWUgfSkgPT4gbmFtZS5pbmNsdWRlcygnU2VtZXN0cmFsJykgKVxyXG4gICAgICAgIH0pXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSggKGNvdXJzZVR5cGVzOiBDb3Vyc2VUeXBlc1tdKSA9PiB7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb3Vyc2VUeXBlcy5sZW5ndGg7IGkrKykge1xyXG4gICAgICAgICAgaWYgKGNvdXJzZVR5cGVzW2ldLmNvZGUudG9TdHJpbmcoKSA9PT0gdmFsdWUpIHtcclxuICAgICAgICAgICAgdGhpcy5pc1NlbWVzdHJhbCA9IHRydWU7XHJcbiAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5pc1NlbWVzdHJhbCA9IGZhbHNlO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSlcclxuICAgIH0pO1xyXG5cclxuICAgIC8vIENvbnZlbmlvIHNlbGVjY2lvbmFkb1xyXG4gICAgdGhpcy5jb21tdW5pY2F0b3JTZXJ2aWNlLmdldFNlbGVjdGVkQWdyZWVtZW50KCkuc3Vic2NyaWJlKHZhbHVlID0+IHtcclxuICAgICAgdGhpcy5nZXRDb2RQcmljZXNCeUFncmVlbWVudCh2YWx1ZSk7XHJcbiAgICB9KTtcclxuXHJcbiAgfVxyXG5cclxuICBnZXRDb2RQcmljZXNCeUFncmVlbWVudChhZ3JlZW1lbnQ/OiBzdHJpbmcpIHtcclxuICAgIGxldCBhZ3JlZW1lbnRTZWxlY3RlZDogc3RyaW5nIHwgbnVsbDtcclxuXHJcbiAgICBpZiAoYWdyZWVtZW50KSB7XHJcbiAgICAgIGFncmVlbWVudFNlbGVjdGVkID0gYWdyZWVtZW50O1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgYWdyZWVtZW50U2VsZWN0ZWQgPSB0aGlzLmxvY2FsU3RvcmFnZUNPRC5nZXRDb2RGb3JtRGF0YSgxLCAnYWdyZWVtZW50X2J5X2NhdGVnb3J5JylcclxuICAgIH1cclxuXHJcbiAgICB0aGlzLmNvbW1lcmNpYWxTZXJ2aWNlLmdldENvZFByaWNlc0J5QWdyZWVtZW50KE51bWJlcihhZ3JlZW1lbnRTZWxlY3RlZCkpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgIGNvbnN0IGNvZFByaWNlczogQ29kUHJpY2VzW10gPSByZXNwb25zZS5kYXRhO1xyXG4gICAgICAgICAgdGhpcy5jb2RQcmljZXMgPSBjb2RQcmljZXM7XHJcbiAgICAgICAgICBpZiAodGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfbWV0aG9kJ10udmFsdWUgPT09ICcyJykge1xyXG4gICAgICAgICAgICBjb25zdCBhdXggPSB0aGlzLmNvZFByaWNlcy5maWx0ZXIoY29kUHJpY2UgPT4gY29kUHJpY2UuYWdyZWVtZW50ID09PSBOdW1iZXIoYWdyZWVtZW50U2VsZWN0ZWQpKVswXTtcclxuICAgICAgICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3Byb2dyYW1fcHJpY2UnXS5zZXRWYWx1ZShhdXgubm9ybWFsX3ByaWNlKVxyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgaWYgKHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydwYXltZW50X21ldGhvZCddLnZhbHVlID09PSAnMScpIHtcclxuICAgICAgICAgICAgY29uc3QgYXV4ID0gdGhpcy5jb2RQcmljZXMuZmlsdGVyKGNvZFByaWNlID0+IGNvZFByaWNlLmFncmVlbWVudCA9PT0gTnVtYmVyKGFncmVlbWVudFNlbGVjdGVkKSlbMF07XHJcbiAgICAgICAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLnNldFZhbHVlKGF1eC5jb2RlKVxyXG4gICAgICAgICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncHJvZ3JhbV9wcmljZSddLnNldFZhbHVlKGF1eC5ub3JtYWxfcHJpY2UpXHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4gY29uc29sZS5sb2coZXJyKVxyXG4gICAgfSlcclxuICB9XHJcblxyXG4gIHZhbGlkYXRlRXJyb3JzKCkge1xyXG4gICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIudmFsdWVDaGFuZ2VzLnN1YnNjcmliZShjaGFuZ2VzID0+IHtcclxuICAgICAgaWYgKHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLmhhc0Vycm9yKCdtaW4nKSkge1xyXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0xhIGNhbnRpZGFkIGRlIGN1b3RhcyBtw61uaW1hcyBkZWJlIHNlciAxJztcclxuICAgICAgfSBlbHNlIGlmICh0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncXVvdGFfdGltZXMnXS5oYXNFcnJvcignbWF4JykpIHtcclxuICAgICAgICB0aGlzLmVycm9yTWVzc2FnZSA9ICdMYSBjYW50aWRhZCBkZSBjdW90YXMgbm8gZGViZSBzZXIgc3VwZXJpb3IgYSAxMic7XHJcbiAgICAgIH1cclxuICAgICAgIGVsc2Uge1xyXG4gICAgICAgIHRoaXMuZXJyb3JNZXNzYWdlID0gJ0ZhbHRhbiBjYW1wb3MgcG9yIGxsZW5hcic7XHJcbiAgICAgIH1cclxuICAgIH0pXHJcbiAgfVxyXG5cclxuICBpbml0Rm9ybSgpIHtcclxuICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyID0gdGhpcy5mYi5ncm91cCh7XHJcbiAgICAgIHByb2dyYW1fcHJpY2U6IFt7IHZhbHVlOiAnJywgZGlzYWJsZWQ6IHRydWUgfSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdXSxcclxuICAgICAgcGF5bWVudF9kYXRlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHBheW1lbnRfbWV0aG9kOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHF1b3RhX3RpbWVzOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIHRvdGFsX3ByaWNlOiBbeyB2YWx1ZTogJycsIGRpc2FibGVkOiB0cnVlIH0sIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLmxpc3RlblBheW1lbnRNZXRob2RGaWVsZCgpXHJcbiAgfVxyXG5cclxuICBsaXN0ZW5QYXltZW50TWV0aG9kRmllbGQoKSB7XHJcbiAgICBjb25zdCBjb250cm9sID0gdGhpcy5jb2RGb3JtU3RlcEZvdXIuZ2V0KCdwYXltZW50X21ldGhvZCcpO1xyXG4gICAgY29udHJvbD8udmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgoY2hhbmdlKSA9PiB7XHJcbiAgICAgIC8vIEZpbmFuY2lhZG9cclxuICAgICAgaWYgKGNoYW5nZSA9PT0gJzEnKSB7XHJcbiAgICAgICAgLy8gUG9uZXIgdmFsaWRhY2lvbmVzXHJcbiAgICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3Byb2dyYW1fcHJpY2UnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfZGF0ZSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncXVvdGFfdGltZXMnXS5zZXRWYWxpZGF0b3JzKFtWYWxpZGF0b3JzLnJlcXVpcmVkXSk7XHJcbiAgICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3RvdGFsX3ByaWNlJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG5cclxuICAgICAgICAvLyBBY3R1YWxpemFyIHBhcmEgcXVlIHNlIHRvbWVuIGxvcyBjYW1iaW9zXHJcbiAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7XHJcblxyXG4gICAgICAgIC8vIEFjdHVhbGl6YXIgbG9zIGNvbnRyb2xzIGdsb2JhbGVzXHJcbiAgICAgICAgdGhpcy51cGRhdGVHbG9iYWxDb250cm9scyhjaGFuZ2UpXHJcbiAgICAgIH1cclxuXHJcbiAgICAgIC8vIGRlIGNvbnRhZG9cclxuICAgICAgaWYgKGNoYW5nZSA9PT0gJzInKSB7XHJcbiAgICAgICAgLy8gUXVpdGFyIGxhcyB2YWxpZGFjaW9uZXNcclxuICAgICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncHJvZ3JhbV9wcmljZSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuICAgICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncGF5bWVudF9kYXRlJ10uc2V0VmFsaWRhdG9ycyhbVmFsaWRhdG9ycy5yZXF1aXJlZF0pO1xyXG4gICAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLmNsZWFyVmFsaWRhdG9ycygpO1xyXG4gICAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWyd0b3RhbF9wcmljZSddLnNldFZhbGlkYXRvcnMoW1ZhbGlkYXRvcnMucmVxdWlyZWRdKTtcclxuXHJcbiAgICAgICAgLy8gQWN0dWFsaXphciBwYXJhIHF1ZSBzZSB0b21lbiBsb3MgY2FtYmlvc1xyXG4gICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG5cclxuICAgICAgICAvLyBBY3R1YWxpemFyIGxvcyBjb250cm9scyBnbG9iYWxlc1xyXG4gICAgICAgIHRoaXMudXBkYXRlR2xvYmFsQ29udHJvbHMoY2hhbmdlKVxyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHVwZGF0ZUdsb2JhbENvbnRyb2xzKGNoYW5nZTogc3RyaW5nKSB7XHJcbiAgICBsZXQgY29udHJvbHMgPSB0aGlzLmNvbnRyb2xzLmZpbHRlcihjb250cm9sID0+IGNvbnRyb2wubmFtZSAhPT0gJ3BheW1lbnRfbWV0aG9kJyk7XHJcbiAgICBjb250cm9scy5mb3JFYWNoKGNvbnRyb2wgPT4ge1xyXG4gICAgICBpZiAoY2hhbmdlID09PSAnMScpIHRoaXMuY29kRm9ybUNvbnRyb2xzLmNoYW5nZVZhbHVlKDQsIGNvbnRyb2wubmFtZSwgdHJ1ZSlcclxuICAgICAgaWYgKGNoYW5nZSA9PT0gJzInKSB7XHJcbiAgICAgICAgaWYgKGNvbnRyb2wubmFtZSA9PT0gJ3F1b3RhX3RpbWVzJykgdGhpcy5jb2RGb3JtQ29udHJvbHMuY2hhbmdlVmFsdWUoNCwgY29udHJvbC5uYW1lLCBmYWxzZSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpIHtcclxuICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydwcm9ncmFtX3ByaWNlJ10udXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpO1xyXG4gICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfZGF0ZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWyd0b3RhbF9wcmljZSddLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcclxuICB9XHJcblxyXG4gIHN0YXJ0TG9jYWxTdG9yYWdlV29yaygpIHtcclxuICAgIHRoaXMuY29udHJvbHMuZm9yRWFjaChjb250cm9sID0+IHtcclxuICAgICAgbGV0IGxvY2FsU3RvcmFnZVZhbHVlOiBsb2NhbFN0b3JhZ2VWYWx1ZXMgPSB0aGlzLnJlYWRBbmRXcml0ZUxTKDQsIGNvbnRyb2wubmFtZSk7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzW2NvbnRyb2wubmFtZV0uc2V0VmFsdWUobG9jYWxTdG9yYWdlVmFsdWUudmFsdWUpO1xyXG4gICAgICB0aGlzLmxpc3RlbkZvcm1DaGFuZ2VzKDQsIGNvbnRyb2wubmFtZSwgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbY29udHJvbC5uYW1lXS52YWx1ZUNoYW5nZXMpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBzaG93VGFibGUoKSB7XHJcbiAgICB0aGlzLmlzQ2FsY3VsYXRlUXVvdGVzQnV0dG9uQ2xpY2tlZCA9IHRydWU7XHJcbiAgICBjb25zdCB0b3RhbF9wcmljZSA9IHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWyd0b3RhbF9wcmljZSddLnZhbHVlO1xyXG5cclxuICAgIGlmICgodG90YWxfcHJpY2UgPT09ICdudWxsJykgfHwgdGhpcy5jb2RGb3JtU3RlcEZvdXIuaW52YWxpZCkge1xyXG4gICAgICBTd2FsLmZpcmUoe1xyXG4gICAgICAgIHRpdGxlOiAnRXJyb3InLFxyXG4gICAgICAgIHRleHQ6ICdEZWJlcyBpbmdyZXNhciBlbCBtb250byB0b3RhbCBkZSBsYSBtYXRyw61jdWxhIHkgbGEgY3VvdGEgaW5pY2lhbCcsXHJcbiAgICAgICAgaWNvbjogJ2Vycm9yJ1xyXG4gICAgICB9KVxyXG5cclxuICAgICAgcmV0dXJuO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIENhbGN1bGFyIGN1b3Rhc1xyXG4gICAgdGhpcy5kYXRhRmluYW5jaW5nID0gW107XHJcbiAgICBjb25zdCBxdW90YVZhbHVlcyA9IHRoaXMuY29kUHJpY2VzLmZpbHRlcihjb2RQcmljZSA9PiBjb2RQcmljZS5jb2RlID09PSBOdW1iZXIodGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3F1b3RhX3RpbWVzJ10udmFsdWUpKVswXS5xdW90YV9wcmljZTtcclxuICAgIGxldCBwYXJhbXM6IENhbGN1bGF0ZVF1b3Rlc1BhcmFtcyA9IHtcclxuICAgICAgZGF0ZTogbmV3IERhdGUodGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfZGF0ZSddLnZhbHVlKSxcclxuICAgICAgcXVvdGFWYWx1ZXMsXHJcbiAgICAgIHF1b3RhVGltZXM6IHRoaXMuY29kUHJpY2VzLmZpbHRlcihjb2RQcmljZSA9PiBjb2RQcmljZS5jb2RlID09PSBOdW1iZXIodGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3F1b3RhX3RpbWVzJ10udmFsdWUpKVswXS5mZWVfbnVtYmVyLFxyXG4gICAgICB0b3RhbFByaWNlOiB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sndG90YWxfcHJpY2UnXS52YWx1ZVxyXG4gICAgfVxyXG4gICAgdGhpcy5kYXRhRmluYW5jaW5nID0gdGhpcy5jYWxjdWxhdGVRdW90ZXNTZXJ2aWNlLmNhbGN1bGF0ZVF1b3RlcyhwYXJhbXMpO1xyXG4gICAgdGhpcy5pc0ZpbmFuY2luZyA9IHRydWU7XHJcbiAgICB0aGlzLmZpbmFuY2luZ0RhdGEuZW1pdCh0aGlzLmRhdGFGaW5hbmNpbmcpO1xyXG4gIH1cclxuXHJcbiAgY2FsY3VsYXRlTmV3UXVvdGVzKCkge1xyXG4gICAgdGhpcy5pc0NhbGN1bGF0ZVF1b3Rlc0J1dHRvbkNsaWNrZWQgPSBmYWxzZTtcclxuICAgIHRoaXMuaXNGaW5hbmNpbmcgPSBmYWxzZTtcclxuICAgIHRoaXMuZmluYW5jaW5nRGF0YS5lbWl0KG51bGwpO1xyXG4gIH1cclxuXHJcbiAgc2VuZEZvcm0oKSB7XHJcbiAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5tYXJrQWxsQXNUb3VjaGVkKCk7XHJcbiAgICBpZiAodGhpcy5jb2RGb3JtU3RlcEZvdXIuaW52YWxpZCkgcmV0dXJuO1xyXG5cclxuICAgIC8vIE1vdmVybm9zIGFsIHBhc28gNVxyXG4gICAgdGhpcy5jaGFuZ2VTdGVwRXZlbnQuZW1pdCg0KTtcclxuICB9XHJcblxyXG4gIGlzRmluYW5jZWQoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfbWV0aG9kJ10udmFsdWUgPT0gMTtcclxuICB9XHJcblxyXG4gIC8vIEV2ZW50b3MgZGVsIHNlbGVjdFxyXG4gIHNlbGVjdFBheW1lbnRNZXRob2QocGF5bWVudE1ldGhvZDogYW55KSB7XHJcbiAgICBpZiAocGF5bWVudE1ldGhvZCAhPT0gJycpIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfbWV0aG9kJ10uc2V0VmFsdWUocGF5bWVudE1ldGhvZCk7XHJcbiAgICAgIHRoaXMuZ2V0Q29kUHJpY2VzQnlBZ3JlZW1lbnQoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydwYXltZW50X21ldGhvZCddLnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0UXVvdGFzKHF1b3Rhczogc3RyaW5nKSB7XHJcbiAgICBpZiAocXVvdGFzICE9PSAnTsO6bWVybyBkZSBjdW90YXMnKSB7XHJcbiAgICAgIGNvbnN0IGNvZFByaWNlOiBDb2RQcmljZXNbXSA9IHRoaXMuY29kUHJpY2VzLmZpbHRlcihjb2RQcmljZSA9PiBjb2RQcmljZS5jb2RlID09PSBOdW1iZXIocXVvdGFzKSk7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLnNldFZhbHVlKGNvZFByaWNlWzBdLmNvZGUpO1xyXG4gICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sndG90YWxfcHJpY2UnXS5zZXRWYWx1ZShjb2RQcmljZVswXS5lbnJvbGxtZW50KTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3Byb2dyYW1fcHJpY2UnXS5zZXRWYWx1ZShjb2RQcmljZVswXS5maW5hbmNlZF9wcmljZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncXVvdGFfdGltZXMnXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3RvdGFsX3ByaWNlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydwcm9ncmFtX3ByaWNlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxufVxyXG5cclxuIiwiPGRpdiAqbmdJZj1cImlzU2VtZXN0cmFsXCIgY2xhc3M9XCJtLTEgcC0yIGJvcmRlci1yb3VuZC1sZyBiZy1ibHVlLTUwMCB0ZXh0LXdoaXRlXCI+XHJcbiAgPHN0cm9uZz5Ob3RhOiA8L3N0cm9uZz5cclxuICBFbCB0aXBvIGRlIGN1cnNvIHNlbGVjY2lvbmFkbyBmdWUgc2VtZXN0cmFsLCBwb3IgbG8gdGFudG8gZWwgZXN0dWRpYW50ZSBkZWJlIHBhZ2FyIG1hdHLDrWN1bGEgeSBwcmltZXJhIGN1b3RhIChNJk0pXHJcbjwvZGl2PlxyXG5cclxuPGZvcm0gYXV0b2NvbXBsZXRlPVwib2ZmXCIgW2Zvcm1Hcm91cF09XCJjb2RGb3JtU3RlcEZvdXJcIiBjbGFzcz1cImdyaWQgbXQtMlwiPlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8aXB0LXNlbGVjdFxyXG4gICAgICBbaW5pdGlhbFZhbHVlXT1cImNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncGF5bWVudF9tZXRob2QnXS52YWx1ZVwiXHJcbiAgICAgIFtjb250cm9sXT1cImNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncGF5bWVudF9tZXRob2QnXVwiXHJcbiAgICAgIChldmVudFNlbGVjdCk9XCJzZWxlY3RQYXltZW50TWV0aG9kKCRldmVudClcIlxyXG4gICAgICBbZGF0YV09XCJwYXltZW50TWV0aG9kc1wiXHJcbiAgICAgIFtkZWZhdWx0VGV4dF09XCInTcOpdG9kbyBkZSBwYWdvJ1wiXHJcbiAgICA+PC9pcHQtc2VsZWN0PlxyXG4gICAgPGlwdC1zZWxlY3QgKm5nSWY9XCJpc0ZpbmFuY2VkKCk7XCJcclxuICAgICAgW2luaXRpYWxWYWx1ZV09XCJjb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3F1b3RhX3RpbWVzJ10udmFsdWVcIlxyXG4gICAgICBbY29udHJvbF09XCJjb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3F1b3RhX3RpbWVzJ11cIlxyXG4gICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0UXVvdGFzKCRldmVudClcIlxyXG4gICAgICBbZGVmYXVsdFRleHRdPVwiJ07Dum1lcm8gZGUgY3VvdGFzJ1wiXHJcbiAgICAgIFtkYXRhXT1cImNvZFByaWNlc1wiXHJcbiAgICAgIFtzZWxlY3RDb2RlXT1cImNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncXVvdGFfdGltZXMnXS52YWx1ZSA9PT0gbnVsbD8gJ07Dum1lcm8gZGUgY3VvdGFzJzogY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydxdW90YV90aW1lcyddLnZhbHVlXCJcclxuICAgID48L2lwdC1zZWxlY3Q+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgKm5nSWY9XCJpc0ZpbmFuY2VkKCk7XCIgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxpcHQtaW5wdXQgKm5nSWY9XCJpc0ZpbmFuY2VkKCk7XCJcclxuICAgICAgW2lucHV0VHlwZV09XCIndGV4dCdcIlxyXG4gICAgICBbcGxhY2VIb2xkZXJdPVwiJ01vbnRvIHRvdGFsIGRlIGxhIG1hdHLDrWN1bGEnXCJcclxuICAgICAgW2NvbnRyb2xdPVwiY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWyd0b3RhbF9wcmljZSddXCJcclxuICAgICAgW3dpdGhQaXBlXT1cInRydWVcIlxyXG4gICAgPjwvaXB0LWlucHV0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8aXB0LWlucHV0XHJcbiAgICAgIFt3aXRoUGlwZV09XCJ0cnVlXCJcclxuICAgICAgW2lucHV0VHlwZV09XCIndGV4dCdcIlxyXG4gICAgICBbY29udHJvbF09XCJjb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3Byb2dyYW1fcHJpY2UnXVwiXHJcbiAgICAgIFtwbGFjZUhvbGRlcl09XCInVmFsb3IgdG90YWwgZGVsIHByb2dyYW1hJ1wiXHJcbiAgICA+PC9pcHQtaW5wdXQ+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjb2wtMTJcIj5cclxuICAgIDxpcHQtaW5wdXRcclxuICAgICAgb25mb2N1cz1cIih0aGlzLnR5cGU9J2RhdGUnKVwiXHJcbiAgICAgIFtpbnB1dFR5cGVdPVwiJ2RhdGUnXCJcclxuICAgICAgW2NvbnRyb2xdPVwiY29kRm9ybVN0ZXBGb3VyLmNvbnRyb2xzWydwYXltZW50X2RhdGUnXVwiXHJcbiAgICAgIFtwbGFjZUhvbGRlcl09XCInRmVjaGEgZGUgcGFnbydcIlxyXG4gICAgPjwvaXB0LWlucHV0PlxyXG4gIDwvZGl2PlxyXG5cclxuICA8IS0tIFRhYmxhIGRlIGZpbmFuY2lhY2nDs24gLS0+XHJcbiAgPGRpdiBjbGFzcz1cImNvbC0xMlwiICpuZ0lmPVwiaXNGaW5hbmNpbmdcIj5cclxuICAgIDxwLXRhYmxlXHJcbiAgICAgIFt2YWx1ZV09XCJkYXRhRmluYW5jaW5nXCJcclxuICAgICAgW3RhYmxlU3R5bGVdPVwieydtaW4td2lkdGgnOiAnMTAwJSd9XCJcclxuICAgICAgW3Jvd0hvdmVyXT1cInRydWVcIlxyXG4gICAgPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiY2FwdGlvblwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG4gICAgICAgICAgQ8OhbGN1bG8gZGUgY3VvdGFzXHJcbiAgICAgICAgICA8YnV0dG9uIHBCdXR0b24gY2xhc3M9XCJwLWJ1dHRvbi1zbSBtbC1hdXRvXCIgbGFiZWw9XCJOdWV2byBjw6FsY3Vsb1wiIChjbGljayk9XCJjYWxjdWxhdGVOZXdRdW90ZXMoKVwiIGxhYiBpY29uPVwicGkgcGktcmVwbGF5XCI+PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvbmctdGVtcGxhdGU+XHJcbiAgICAgIDxuZy10ZW1wbGF0ZSBwVGVtcGxhdGU9XCJoZWFkZXJcIj5cclxuICAgICAgICA8dHI+XHJcbiAgICAgICAgICA8dGg+IzwvdGg+XHJcbiAgICAgICAgICA8dGg+VmFsb3I8L3RoPlxyXG4gICAgICAgICAgPHRoPkZlY2hhPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICA8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiYm9keVwiIGxldC1kYXRhPlxyXG4gICAgICAgIDx0cj5cclxuICAgICAgICAgIDx0ZD57eyBkYXRhWzBdIH19PC90ZD5cclxuICAgICAgICAgIDx0ZD57eyBkYXRhWzFdIH19PC90ZD5cclxuICAgICAgICAgIDx0ZD57eyBkYXRhWzJdIH19PC90ZD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgPC9wLXRhYmxlPlxyXG4gIDwvZGl2PlxyXG4gIDwhLS0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtLT5cclxuXHJcbjwvZm9ybT5cclxuXHJcbjxkaXYgY2xhc3M9XCJmbGV4IG10LTMgYWxpZ24taXRlbXMtY2VudGVyIGdhcC0zXCI+XHJcbiAgPHNwYW4gKm5nSWY9XCJjb2RGb3JtU3RlcEZvdXIuaW52YWxpZCAmJiBjb2RGb3JtU3RlcEZvdXIudG91Y2hlZFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwIGZvbnQtYm9sZCB0ZXh0LWNlbnRlciBtdC0xIHB5LTIgYmctcmVkLTEwMCB3LWZ1bGwgYm9yZGVyLXJvdW5kLXhsXCI+e3sgZXJyb3JNZXNzYWdlIH19PC9zcGFuPlxyXG4gIDxkaXYgY2xhc3M9XCJmbGV4IG1sLWF1dG8gZ2FwLTJcIj5cclxuICAgIDxidXR0b24gKm5nSWY9XCJjb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfbWV0aG9kJ10udmFsdWUgPT09ICcxJ1wiIFtkaXNhYmxlZF09XCJpc0ZpbmFuY2luZyB8fCBjb2RGb3JtU3RlcEZvdXIuY29udHJvbHNbJ3BheW1lbnRfbWV0aG9kJ10udmFsdWUgIT09ICcxJ1widHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwibWwtYXV0byBwLWJ1dHRvbi1zbSBwLWJ1dHRvbi1zZWNvbmRhcnlcIiAoY2xpY2spPVwic2hvd1RhYmxlKClcIiBwQnV0dG9uIGxhYmVsPVwiQ2FsY3VsYXIgY3VvdGFzXCIgaWNvbj1cInBpIHBpLXNsaWRlcnMtaFwiPjwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiBbZGlzYWJsZWRdPVwiIWlzRmluYW5jaW5nICYmIGNvZEZvcm1TdGVwRm91ci5jb250cm9sc1sncGF5bWVudF9tZXRob2QnXS52YWx1ZSA9PT0gJzEnXCIgdHlwZT1cInN1Ym1pdFwiIGNsYXNzPVwibWwtYXV0byBwLWJ1dHRvbi1zbVwiIChjbGljayk9XCJzZW5kRm9ybSgpXCIgcEJ1dHRvbiBsYWJlbD1cIlNpZ3VpZW50ZVwiIGljb249XCJwaSBwaS1hcnJvdy1yaWdodFwiPjwvYnV0dG9uPlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,199 @@
1
+ import { Component, EventEmitter, Output } from '@angular/core';
2
+ import { Validators } from '@angular/forms';
3
+ import { CodFormControls } from '../../logic/cod-form-controls';
4
+ import { CodFormSteps } from '../../logic/cod-form-steps';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "@angular/forms";
7
+ import * as i2 from "../../../core/services/parameters-service/parameters.service";
8
+ import * as i3 from "../../../core/services/copies.service";
9
+ import * as i4 from "../../../core/utils/base-service/base.service";
10
+ import * as i5 from "../../../core/services/course-service/course-service.model";
11
+ import * as i6 from "../../logic/communicator.service";
12
+ import * as i7 from "../../../components/atoms/select/select.component";
13
+ import * as i8 from "primeng/button";
14
+ export class CodFormStepOneComponent extends CodFormSteps {
15
+ constructor(fb, parameterService, copiesService, baseService, courseService, communicatorService) {
16
+ super();
17
+ this.fb = fb;
18
+ this.parameterService = parameterService;
19
+ this.copiesService = copiesService;
20
+ this.baseService = baseService;
21
+ this.courseService = courseService;
22
+ this.communicatorService = communicatorService;
23
+ this.changeStepEvent = new EventEmitter();
24
+ this.availibleCourses = [];
25
+ // Controls del formulario
26
+ this.controls = new CodFormControls().controls[0];
27
+ this.copies = this.copiesService.copies;
28
+ }
29
+ ngOnInit() {
30
+ this.getParameters();
31
+ this.initForm();
32
+ this.startLocalStorageWork();
33
+ this.setValuesByLocalStorage();
34
+ this.codFormStepOne.controls['course_type'].valueChanges
35
+ .subscribe(value => this.communicatorService.setCurrentCourseType(value));
36
+ this.communicatorService.setCurrentAgreement(this.localStorageCOD.getCodFormData(1, 'agreement_by_category'));
37
+ }
38
+ /* Es necesario recorrer el array de controls de nuestro formulario para:
39
+ ✅ Leer el Local Storage y setear los valores
40
+ ✅ Subscribirse a los cambios del formulario para setear valores nuevos
41
+
42
+ Nota: la clase CodFormSteps() se encarga de toda la lógica de LS con los pasos del formulario del COD
43
+ */
44
+ startLocalStorageWork() {
45
+ this.controls.forEach(control => {
46
+ let localStorageValue = this.readAndWriteLS(1, control.name);
47
+ this.codFormStepOne.controls[control.name].setValue(localStorageValue.value);
48
+ this.listenFormChanges(1, control.name, this.codFormStepOne.controls[control.name].valueChanges);
49
+ });
50
+ }
51
+ getParameters() {
52
+ this.parameterService.getAllPlans().subscribe((response) => {
53
+ this.plans = response.data;
54
+ });
55
+ this.parameterService.getLevels().subscribe((response) => {
56
+ this.levels = response.data;
57
+ });
58
+ }
59
+ initForm() {
60
+ this.codFormStepOne = this.fb.group({
61
+ academic_plan: ['', [Validators.required]],
62
+ course_type: ['', [Validators.required]],
63
+ agreement_by_category: ['', [Validators.required]],
64
+ english_level: ['', [Validators.required]],
65
+ availible_courses: ['', []],
66
+ });
67
+ }
68
+ setValuesByLocalStorage() {
69
+ const academicPlan = this.codFormStepOne.controls['academic_plan'].value || null;
70
+ if (!academicPlan)
71
+ return;
72
+ this.selectAcademicPlan(academicPlan);
73
+ const agreementByCategory = this.codFormStepOne.controls['agreement_by_category'].value || null;
74
+ if (!agreementByCategory)
75
+ return;
76
+ this.getAvailibleCourses();
77
+ const englishLevel = this.codFormStepOne.controls['english_level'].value || null;
78
+ if (!englishLevel)
79
+ return;
80
+ this.getAvailibleCourses();
81
+ }
82
+ sendForm() {
83
+ this.codFormStepOne.markAsTouched();
84
+ if (this.codFormStepOne.invalid)
85
+ return;
86
+ // Movernos al paso 2
87
+ this.changeStepEvent.emit(1);
88
+ }
89
+ resetForm() {
90
+ this.resetLocalStorage(this.controls);
91
+ this.codFormStepOne.reset();
92
+ }
93
+ // Eventos de los selects
94
+ selectAcademicPlan(academic_plan) {
95
+ if (academic_plan !== 'Plan') {
96
+ this.codFormStepOne.controls['academic_plan'].setValue(academic_plan);
97
+ this.getCourseType(academic_plan);
98
+ this.getAgreementByPlan(academic_plan);
99
+ }
100
+ else {
101
+ this.codFormStepOne.controls['academic_plan'].setValue(null);
102
+ this.codFormStepOne.controls['course_type'].setValue(null);
103
+ this.codFormStepOne.controls['agreement_by_category'].setValue(null);
104
+ }
105
+ }
106
+ getCourseType(plan) {
107
+ this.parameterService.getCoursesTypesByPlan(plan).subscribe((response) => {
108
+ this.course_type = response.data;
109
+ });
110
+ }
111
+ getAgreementByPlan(plan) {
112
+ this.parameterService.getAgreementByCategory(plan).subscribe((response) => {
113
+ this.agreements = response.data;
114
+ });
115
+ }
116
+ selectCoursesTypesByPlan(coursesTypes) {
117
+ if (coursesTypes !== 'Tipo de plan') {
118
+ this.codFormStepOne.controls['course_type'].setValue(coursesTypes);
119
+ this.getAvailibleCourses();
120
+ }
121
+ else {
122
+ this.codFormStepOne.controls['course_type'].setValue(null);
123
+ }
124
+ }
125
+ selectAgreementByCategory(agreementByCategories) {
126
+ if (agreementByCategories !== 'Convenio por categoria') {
127
+ this.codFormStepOne.controls['agreement_by_category'].setValue(agreementByCategories);
128
+ this.communicatorService.setCurrentAgreement(agreementByCategories);
129
+ this.getAvailibleCourses();
130
+ }
131
+ else {
132
+ this.codFormStepOne.controls['agreement_by_category'].setValue(null);
133
+ this.codFormStepOne.controls['school_name'].setValue(null);
134
+ }
135
+ }
136
+ selectLevel(levels) {
137
+ if (levels !== 'Nivel de inglés') {
138
+ this.codFormStepOne.controls['english_level'].setValue(levels);
139
+ this.getAvailibleCourses();
140
+ }
141
+ else {
142
+ this.codFormStepOne.controls['english_level'].setValue(null);
143
+ }
144
+ }
145
+ selectAvailibleCourses(availibleCourses) {
146
+ if (availibleCourses !== 'Grupos disponibles') {
147
+ this.codFormStepOne.controls['availible_courses'].setValue(availibleCourses);
148
+ }
149
+ else {
150
+ this.codFormStepOne.controls['availible_courses'].setValue(null);
151
+ this.codFormStepOne.controls['agreement_by_category'].setValue(null);
152
+ this.codFormStepOne.controls['course_type'].setValue(null);
153
+ this.codFormStepOne.controls['english_level'].setValue(null);
154
+ }
155
+ }
156
+ validRequest() {
157
+ return (this.codFormStepOne.controls['english_level'].value != '' &&
158
+ this.codFormStepOne.controls['agreement_by_category'].value != '' &&
159
+ this.codFormStepOne.controls['course_type'].value != '');
160
+ }
161
+ getAvailibleCourses() {
162
+ this.availibleCourses = [];
163
+ if (this.validRequest()) {
164
+ let request_availibleCourses = {
165
+ token: this.baseService.getUserToken(),
166
+ english_level: this.codFormStepOne.controls['english_level'].value,
167
+ agreement: this.codFormStepOne.controls['agreement_by_category'].value,
168
+ course_type: this.codFormStepOne.controls['course_type'].value,
169
+ };
170
+ this.courseService
171
+ .getAvailibleCourses(request_availibleCourses)
172
+ .subscribe((response) => {
173
+ if (response.data) {
174
+ let courses = response.data;
175
+ this.hasAvailableCourse = true;
176
+ courses.forEach(course => {
177
+ this.availibleCourses.push({
178
+ code: course.code,
179
+ name: `Curso ${course.modality === 1 ? 'Presencial' : 'Virtual'} ${course.course_type.name} (${course.english_level}) - Teacher ${course.teacher}, Fecha de inicio: ${course.to_start}`
180
+ });
181
+ });
182
+ }
183
+ else {
184
+ this.hasAvailableCourse = false;
185
+ this.codFormStepOne.controls['availible_courses'].setValue("");
186
+ }
187
+ });
188
+ }
189
+ }
190
+ }
191
+ CodFormStepOneComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: CodFormStepOneComponent, deps: [{ token: i1.FormBuilder }, { token: i2.ParameterService }, { token: i3.CopiesService }, { token: i4.BaseService }, { token: i5.CourseService }, { token: i6.CommunicatorService }], target: i0.ɵɵFactoryTarget.Component });
192
+ CodFormStepOneComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: CodFormStepOneComponent, selector: "app-cod-form-step-one", outputs: { changeStepEvent: "changeStepEvent" }, usesInheritance: true, ngImport: i0, template: "<form [formGroup]=\"codFormStepOne\" class=\"grid\">\r\n <div class=\"col\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['academic_plan'].value\"\r\n [selectCode]=\"codFormStepOne.controls['academic_plan'].value === null? 'Plan': codFormStepOne.controls['academic_plan'].value\"\r\n [defaultText]=\"'Plan'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAcademicPlan($event)\"\r\n [data]=\"plans\"\r\n [control]=\"codFormStepOne.controls['academic_plan']\"\r\n ></ipt-select>\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['course_type'].value\"\r\n [selectCode]=\"codFormStepOne.controls['course_type'].value === null? 'Tipo de plan': codFormStepOne.controls['course_type'].value\"\r\n [defaultText]=\"'Tipo de plan'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectCoursesTypesByPlan($event)\"\r\n [data]=\"course_type\"\r\n [control]=\"codFormStepOne.controls['course_type']\"\r\n ></ipt-select>\r\n </div>\r\n <div class=\"col\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['agreement_by_category'].value\"\r\n [selectCode]=\"codFormStepOne.controls['agreement_by_category'].value === null? 'Convenio por categoria': codFormStepOne.controls['agreement_by_category'].value\"\r\n [defaultText]=\"'Convenio por categoria'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAgreementByCategory($event)\"\r\n [data]=\"agreements\"\r\n [control]=\"codFormStepOne.controls['agreement_by_category']\"\r\n ></ipt-select>\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['english_level'].value\"\r\n [selectCode]=\"codFormStepOne.controls['english_level'].value === null? 'Nivel de ingl\u00E9s': codFormStepOne.controls['english_level'].value\"\r\n [defaultText]=\"'Nivel de ingl\u00E9s'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectLevel($event)\"\r\n [data]=\"levels\"\r\n [control]=\"codFormStepOne.controls['english_level']\"\r\n ></ipt-select>\r\n </div>\r\n <div class=\"col-12\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['availible_courses'].value\"\r\n [selectCode]=\"codFormStepOne.controls['availible_courses'].value === null? 'Grupos disponibles': codFormStepOne.controls['availible_courses'].value\"\r\n [defaultText]=\"'Grupos disponibles'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAvailibleCourses($event)\"\r\n [data]=\"availibleCourses\"\r\n [control]=\"codFormStepOne.controls['availible_courses']\"\r\n ></ipt-select>\r\n </div>\r\n <span *ngIf=\"!hasAvailableCourse\" class=\"mt-1 pl-2 text-red-500\">Todavia no hay cursos con estas caracter\u00EDsticas.</span>\r\n</form>\r\n\r\n<div class=\"flex mt-2 align-items-center gap-3\">\r\n <span *ngIf=\"codFormStepOne.invalid && codFormStepOne.touched\" class=\"text-red-500 font-bold text-center mt-1 py-2 bg-red-100 w-full border-round-xl\">Faltan campos por llenar.</span>\r\n <button type=\"submit\" class=\"ml-auto p-button-sm\" (click)=\"sendForm()\" pButton label=\"Siguiente\" icon=\"pi pi-arrow-right\"></button>\r\n</div>\r\n", styles: [""], components: [{ type: i7.SelectComponent, selector: "ipt-select", inputs: ["isRequired", "data", "defaultText", "selectCode", "disabledSel", "initialValue", "control"], outputs: ["eventSelect"] }], directives: [{ type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { type: i8.ButtonDirective, selector: "[pButton]", inputs: ["iconPos", "loadingIcon", "label", "icon", "loading"] }] });
193
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: CodFormStepOneComponent, decorators: [{
194
+ type: Component,
195
+ args: [{ selector: 'app-cod-form-step-one', template: "<form [formGroup]=\"codFormStepOne\" class=\"grid\">\r\n <div class=\"col\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['academic_plan'].value\"\r\n [selectCode]=\"codFormStepOne.controls['academic_plan'].value === null? 'Plan': codFormStepOne.controls['academic_plan'].value\"\r\n [defaultText]=\"'Plan'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAcademicPlan($event)\"\r\n [data]=\"plans\"\r\n [control]=\"codFormStepOne.controls['academic_plan']\"\r\n ></ipt-select>\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['course_type'].value\"\r\n [selectCode]=\"codFormStepOne.controls['course_type'].value === null? 'Tipo de plan': codFormStepOne.controls['course_type'].value\"\r\n [defaultText]=\"'Tipo de plan'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectCoursesTypesByPlan($event)\"\r\n [data]=\"course_type\"\r\n [control]=\"codFormStepOne.controls['course_type']\"\r\n ></ipt-select>\r\n </div>\r\n <div class=\"col\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['agreement_by_category'].value\"\r\n [selectCode]=\"codFormStepOne.controls['agreement_by_category'].value === null? 'Convenio por categoria': codFormStepOne.controls['agreement_by_category'].value\"\r\n [defaultText]=\"'Convenio por categoria'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAgreementByCategory($event)\"\r\n [data]=\"agreements\"\r\n [control]=\"codFormStepOne.controls['agreement_by_category']\"\r\n ></ipt-select>\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['english_level'].value\"\r\n [selectCode]=\"codFormStepOne.controls['english_level'].value === null? 'Nivel de ingl\u00E9s': codFormStepOne.controls['english_level'].value\"\r\n [defaultText]=\"'Nivel de ingl\u00E9s'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectLevel($event)\"\r\n [data]=\"levels\"\r\n [control]=\"codFormStepOne.controls['english_level']\"\r\n ></ipt-select>\r\n </div>\r\n <div class=\"col-12\">\r\n <ipt-select\r\n [initialValue]=\"codFormStepOne.controls['availible_courses'].value\"\r\n [selectCode]=\"codFormStepOne.controls['availible_courses'].value === null? 'Grupos disponibles': codFormStepOne.controls['availible_courses'].value\"\r\n [defaultText]=\"'Grupos disponibles'\"\r\n [isRequired]=\"true\"\r\n (eventSelect)=\"selectAvailibleCourses($event)\"\r\n [data]=\"availibleCourses\"\r\n [control]=\"codFormStepOne.controls['availible_courses']\"\r\n ></ipt-select>\r\n </div>\r\n <span *ngIf=\"!hasAvailableCourse\" class=\"mt-1 pl-2 text-red-500\">Todavia no hay cursos con estas caracter\u00EDsticas.</span>\r\n</form>\r\n\r\n<div class=\"flex mt-2 align-items-center gap-3\">\r\n <span *ngIf=\"codFormStepOne.invalid && codFormStepOne.touched\" class=\"text-red-500 font-bold text-center mt-1 py-2 bg-red-100 w-full border-round-xl\">Faltan campos por llenar.</span>\r\n <button type=\"submit\" class=\"ml-auto p-button-sm\" (click)=\"sendForm()\" pButton label=\"Siguiente\" icon=\"pi pi-arrow-right\"></button>\r\n</div>\r\n", styles: [""] }]
196
+ }], ctorParameters: function () { return [{ type: i1.FormBuilder }, { type: i2.ParameterService }, { type: i3.CopiesService }, { type: i4.BaseService }, { type: i5.CourseService }, { type: i6.CommunicatorService }]; }, propDecorators: { changeStepEvent: [{
197
+ type: Output
198
+ }] } });
199
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kLWZvcm0tc3RlcC1vbmUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vZGVzaWduLXN5c3RlbS9zcmMvbGliL2NvZC9zdGVwcy9jb2QtZm9ybS1zdGVwLW9uZS9jb2QtZm9ybS1zdGVwLW9uZS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi9kZXNpZ24tc3lzdGVtL3NyYy9saWIvY29kL3N0ZXBzL2NvZC1mb3JtLXN0ZXAtb25lL2NvZC1mb3JtLXN0ZXAtb25lLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUE0QixNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUYsT0FBTyxFQUEwQixVQUFVLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU1wRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBc0IsTUFBTSw0QkFBNEIsQ0FBQzs7Ozs7Ozs7OztBQVE5RSxNQUFNLE9BQU8sdUJBQXdCLFNBQVEsWUFBWTtJQWlCdkQsWUFDVSxFQUFlLEVBQ2YsZ0JBQWtDLEVBQ2xDLGFBQTRCLEVBQzVCLFdBQXdCLEVBQ3hCLGFBQTRCLEVBQzVCLG1CQUF3QztRQUVoRCxLQUFLLEVBQUUsQ0FBQztRQVBBLE9BQUUsR0FBRixFQUFFLENBQWE7UUFDZixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQWtCO1FBQ2xDLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLGdCQUFXLEdBQVgsV0FBVyxDQUFhO1FBQ3hCLGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLHdCQUFtQixHQUFuQixtQkFBbUIsQ0FBcUI7UUF0QnhDLG9CQUFlLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQVF2RCxxQkFBZ0IsR0FBVSxFQUFFLENBQUM7UUFLN0IsMEJBQTBCO1FBQzFC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USxDQUFDLElBQUksQ0FBQztvQkFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLElBQUksQ0FBQztvQkFDL0IsT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTt3QkFDdkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQzs0QkFDekIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJOzRCQUNqQixJQUFJLEVBQUUsU0FBUyxNQUFNLENBQUMsUUFBUSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLGFBQWEsZUFBZSxNQUFNLENBQUMsT0FBTyxzQkFBc0IsTUFBTSxDQUFDLFFBQVEsRUFBRTt5QkFDeEwsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFBO2lCQUNIO3FCQUFNO29CQUNMLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxLQUFLLENBQUM7b0JBQ2hDLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2lCQUNoRTtZQUNILENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDSCxDQUFDOztvSEF6TVUsdUJBQXVCO3dHQUF2Qix1QkFBdUIscUlDaEJwQyx5cEdBMkRBOzJGRDNDYSx1QkFBdUI7a0JBTG5DLFNBQVM7K0JBQ0UsdUJBQXVCO3FQQUt2QixlQUFlO3NCQUF4QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIElucHV0LCBPbkRlc3Ryb3ksIE9uSW5pdCwgT3V0cHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIFZhbGlkYXRvcnMgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7IEdldEF2YWlsaWJsZUNvdXJzZXNScSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvbW9kZWxzL2NvdXJzZS9jb3Vyc2UtcnEubW9kZWwnO1xyXG5pbXBvcnQgeyBDb3BpZXNTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9zZXJ2aWNlcy9jb3BpZXMuc2VydmljZSc7XHJcbmltcG9ydCB7IENvdXJzZVNlcnZpY2UgfSBmcm9tICcuLi8uLi8uLi9jb3JlL3NlcnZpY2VzL2NvdXJzZS1zZXJ2aWNlL2NvdXJzZS1zZXJ2aWNlLm1vZGVsJztcclxuaW1wb3J0IHsgUGFyYW1ldGVyU2VydmljZSB9IGZyb20gJy4uLy4uLy4uL2NvcmUvc2VydmljZXMvcGFyYW1ldGVycy1zZXJ2aWNlL3BhcmFtZXRlcnMuc2VydmljZSc7XHJcbmltcG9ydCB7IEJhc2VTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS91dGlscy9iYXNlLXNlcnZpY2UvYmFzZS5zZXJ2aWNlJztcclxuaW1wb3J0IHsgQ29kRm9ybUNvbnRyb2xzIH0gZnJvbSAnLi4vLi4vbG9naWMvY29kLWZvcm0tY29udHJvbHMnO1xyXG5pbXBvcnQgeyBDb2RGb3JtU3RlcHMsIGxvY2FsU3RvcmFnZVZhbHVlcyB9IGZyb20gJy4uLy4uL2xvZ2ljL2NvZC1mb3JtLXN0ZXBzJztcclxuaW1wb3J0IHsgQ29tbXVuaWNhdG9yU2VydmljZSB9IGZyb20gJy4uLy4uL2xvZ2ljL2NvbW11bmljYXRvci5zZXJ2aWNlJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnYXBwLWNvZC1mb3JtLXN0ZXAtb25lJyxcclxuICB0ZW1wbGF0ZVVybDogJy4vY29kLWZvcm0tc3RlcC1vbmUuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL2NvZC1mb3JtLXN0ZXAtb25lLmNvbXBvbmVudC5jc3MnXSxcclxufSlcclxuZXhwb3J0IGNsYXNzIENvZEZvcm1TdGVwT25lQ29tcG9uZW50IGV4dGVuZHMgQ29kRm9ybVN0ZXBzIGltcGxlbWVudHMgT25Jbml0IHtcclxuICBAT3V0cHV0KCkgY2hhbmdlU3RlcEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XHJcblxyXG4gIGNvcGllczogYW55O1xyXG4gIGNvZEZvcm1TdGVwT25lITogRm9ybUdyb3VwO1xyXG4gIGhhc0F2YWlsYWJsZUNvdXJzZSE6IGJvb2xlYW47XHJcblxyXG4gIC8vIFBhcmFtZXRlcnNcclxuICBhZ3JlZW1lbnRzOiBhbnk7XHJcbiAgYXZhaWxpYmxlQ291cnNlczogYW55W10gPSBbXTtcclxuICBjb3Vyc2VfdHlwZTogYW55O1xyXG4gIGxldmVsczogYW55O1xyXG4gIHBsYW5zOiBhbnk7XHJcblxyXG4gIC8vIENvbnRyb2xzIGRlbCBmb3JtdWxhcmlvXHJcbiAgY29udHJvbHMgPSBuZXcgQ29kRm9ybUNvbnRyb2xzKCkuY29udHJvbHNbMF07XHJcblxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBmYjogRm9ybUJ1aWxkZXIsXHJcbiAgICBwcml2YXRlIHBhcmFtZXRlclNlcnZpY2U6IFBhcmFtZXRlclNlcnZpY2UsXHJcbiAgICBwcml2YXRlIGNvcGllc1NlcnZpY2U6IENvcGllc1NlcnZpY2UsXHJcbiAgICBwcml2YXRlIGJhc2VTZXJ2aWNlOiBCYXNlU2VydmljZSxcclxuICAgIHByaXZhdGUgY291cnNlU2VydmljZTogQ291cnNlU2VydmljZSxcclxuICAgIHByaXZhdGUgY29tbXVuaWNhdG9yU2VydmljZTogQ29tbXVuaWNhdG9yU2VydmljZSxcclxuICApIHtcclxuICAgIHN1cGVyKCk7XHJcbiAgICB0aGlzLmNvcGllcyA9IHRoaXMuY29waWVzU2VydmljZS5jb3BpZXM7XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIHRoaXMuZ2V0UGFyYW1ldGVycygpO1xyXG4gICAgdGhpcy5pbml0Rm9ybSgpO1xyXG4gICAgdGhpcy5zdGFydExvY2FsU3RvcmFnZVdvcmsoKTtcclxuICAgIHRoaXMuc2V0VmFsdWVzQnlMb2NhbFN0b3JhZ2UoKVxyXG5cclxuICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10udmFsdWVDaGFuZ2VzXHJcbiAgICAuc3Vic2NyaWJlKHZhbHVlID0+IHRoaXMuY29tbXVuaWNhdG9yU2VydmljZS5zZXRDdXJyZW50Q291cnNlVHlwZSh2YWx1ZSkpO1xyXG5cclxuICAgIHRoaXMuY29tbXVuaWNhdG9yU2VydmljZS5zZXRDdXJyZW50QWdyZWVtZW50KHRoaXMubG9jYWxTdG9yYWdlQ09ELmdldENvZEZvcm1EYXRhKDEsICdhZ3JlZW1lbnRfYnlfY2F0ZWdvcnknKSEpO1xyXG4gIH1cclxuXHJcbiAgLyogRXMgbmVjZXNhcmlvIHJlY29ycmVyIGVsIGFycmF5IGRlIGNvbnRyb2xzIGRlIG51ZXN0cm8gZm9ybXVsYXJpbyBwYXJhOlxyXG4gICAg4pyFIExlZXIgZWwgTG9jYWwgU3RvcmFnZSB5IHNldGVhciBsb3MgdmFsb3Jlc1xyXG4gICAg4pyFIFN1YnNjcmliaXJzZSBhIGxvcyBjYW1iaW9zIGRlbCBmb3JtdWxhcmlvIHBhcmEgc2V0ZWFyIHZhbG9yZXMgbnVldm9zXHJcblxyXG4gICAgTm90YTogbGEgY2xhc2UgQ29kRm9ybVN0ZXBzKCkgc2UgZW5jYXJnYSBkZSB0b2RhIGxhIGzDs2dpY2EgZGUgTFMgY29uIGxvcyBwYXNvcyBkZWwgZm9ybXVsYXJpbyBkZWwgQ09EXHJcbiAgKi9cclxuICBzdGFydExvY2FsU3RvcmFnZVdvcmsoKSB7XHJcbiAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goY29udHJvbCA9PiB7XHJcbiAgICAgIGxldCBsb2NhbFN0b3JhZ2VWYWx1ZTogbG9jYWxTdG9yYWdlVmFsdWVzID0gdGhpcy5yZWFkQW5kV3JpdGVMUygxLCBjb250cm9sLm5hbWUpO1xyXG4gICAgICB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzW2NvbnRyb2wubmFtZV0uc2V0VmFsdWUobG9jYWxTdG9yYWdlVmFsdWUudmFsdWUpO1xyXG4gICAgICB0aGlzLmxpc3RlbkZvcm1DaGFuZ2VzKDEsIGNvbnRyb2wubmFtZSwgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1tjb250cm9sLm5hbWVdLnZhbHVlQ2hhbmdlcyk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldFBhcmFtZXRlcnMoKSB7XHJcbiAgICB0aGlzLnBhcmFtZXRlclNlcnZpY2UuZ2V0QWxsUGxhbnMoKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMucGxhbnMgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgfSk7XHJcbiAgICB0aGlzLnBhcmFtZXRlclNlcnZpY2UuZ2V0TGV2ZWxzKCkuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xyXG4gICAgICB0aGlzLmxldmVscyA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGluaXRGb3JtKCkge1xyXG4gICAgdGhpcy5jb2RGb3JtU3RlcE9uZSA9IHRoaXMuZmIuZ3JvdXAoe1xyXG4gICAgICBhY2FkZW1pY19wbGFuOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGNvdXJzZV90eXBlOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGFncmVlbWVudF9ieV9jYXRlZ29yeTogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF1dLFxyXG4gICAgICBlbmdsaXNoX2xldmVsOiBbJycsIFtWYWxpZGF0b3JzLnJlcXVpcmVkXV0sXHJcbiAgICAgIGF2YWlsaWJsZV9jb3Vyc2VzOiBbJycsIFtdXSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgc2V0VmFsdWVzQnlMb2NhbFN0b3JhZ2UoKSB7XHJcbiAgICBjb25zdCBhY2FkZW1pY1BsYW4gPSB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhY2FkZW1pY19wbGFuJ10udmFsdWUgfHwgbnVsbDtcclxuICAgIGlmICghYWNhZGVtaWNQbGFuKSByZXR1cm47XHJcbiAgICB0aGlzLnNlbGVjdEFjYWRlbWljUGxhbihhY2FkZW1pY1BsYW4pO1xyXG5cclxuICAgIGNvbnN0IGFncmVlbWVudEJ5Q2F0ZWdvcnkgPSB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhZ3JlZW1lbnRfYnlfY2F0ZWdvcnknXS52YWx1ZSB8fCBudWxsO1xyXG4gICAgaWYgKCFhZ3JlZW1lbnRCeUNhdGVnb3J5KSByZXR1cm47XHJcbiAgICB0aGlzLmdldEF2YWlsaWJsZUNvdXJzZXMoKTtcclxuXHJcbiAgICBjb25zdCBlbmdsaXNoTGV2ZWwgPSB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydlbmdsaXNoX2xldmVsJ10udmFsdWUgfHwgbnVsbDtcclxuICAgIGlmICghZW5nbGlzaExldmVsKSByZXR1cm47XHJcbiAgICB0aGlzLmdldEF2YWlsaWJsZUNvdXJzZXMoKTtcclxuICB9XHJcblxyXG4gIHNlbmRGb3JtKCkge1xyXG4gICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5tYXJrQXNUb3VjaGVkKCk7XHJcbiAgICBpZiAodGhpcy5jb2RGb3JtU3RlcE9uZS5pbnZhbGlkKSByZXR1cm47XHJcblxyXG4gICAgLy8gTW92ZXJub3MgYWwgcGFzbyAyXHJcbiAgICB0aGlzLmNoYW5nZVN0ZXBFdmVudC5lbWl0KDEpO1xyXG4gIH1cclxuXHJcbiAgcmVzZXRGb3JtKCkge1xyXG4gICAgdGhpcy5yZXNldExvY2FsU3RvcmFnZSh0aGlzLmNvbnRyb2xzKTtcclxuICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUucmVzZXQoKTtcclxuICB9XHJcblxyXG4gIC8vIEV2ZW50b3MgZGUgbG9zIHNlbGVjdHNcclxuICBzZWxlY3RBY2FkZW1pY1BsYW4oYWNhZGVtaWNfcGxhbjogYW55KSB7XHJcbiAgICBpZiAoYWNhZGVtaWNfcGxhbiAhPT0gJ1BsYW4nKSB7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FjYWRlbWljX3BsYW4nXS5zZXRWYWx1ZShhY2FkZW1pY19wbGFuKTtcclxuICAgICAgdGhpcy5nZXRDb3Vyc2VUeXBlKGFjYWRlbWljX3BsYW4pO1xyXG4gICAgICB0aGlzLmdldEFncmVlbWVudEJ5UGxhbihhY2FkZW1pY19wbGFuKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FjYWRlbWljX3BsYW4nXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snY291cnNlX3R5cGUnXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXRDb3Vyc2VUeXBlKHBsYW46IG51bWJlcikge1xyXG4gICAgdGhpcy5wYXJhbWV0ZXJTZXJ2aWNlLmdldENvdXJzZXNUeXBlc0J5UGxhbihwbGFuKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuY291cnNlX3R5cGUgPSByZXNwb25zZS5kYXRhO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBnZXRBZ3JlZW1lbnRCeVBsYW4ocGxhbjogbnVtYmVyKSB7XHJcbiAgICB0aGlzLnBhcmFtZXRlclNlcnZpY2UuZ2V0QWdyZWVtZW50QnlDYXRlZ29yeShwbGFuKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgIHRoaXMuYWdyZWVtZW50cyA9IHJlc3BvbnNlLmRhdGE7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHNlbGVjdENvdXJzZXNUeXBlc0J5UGxhbihjb3Vyc2VzVHlwZXM6IGFueSkge1xyXG4gICAgaWYgKGNvdXJzZXNUeXBlcyAhPT0gJ1RpcG8gZGUgcGxhbicpIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snY291cnNlX3R5cGUnXS5zZXRWYWx1ZShjb3Vyc2VzVHlwZXMpO1xyXG4gICAgICB0aGlzLmdldEF2YWlsaWJsZUNvdXJzZXMoKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBzZWxlY3RBZ3JlZW1lbnRCeUNhdGVnb3J5KGFncmVlbWVudEJ5Q2F0ZWdvcmllczogYW55KSB7XHJcbiAgICBpZiAoYWdyZWVtZW50QnlDYXRlZ29yaWVzICE9PSAnQ29udmVuaW8gcG9yIGNhdGVnb3JpYScpIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10uc2V0VmFsdWUoYWdyZWVtZW50QnlDYXRlZ29yaWVzKTtcclxuICAgICAgdGhpcy5jb21tdW5pY2F0b3JTZXJ2aWNlLnNldEN1cnJlbnRBZ3JlZW1lbnQoYWdyZWVtZW50QnlDYXRlZ29yaWVzKTtcclxuICAgICAgdGhpcy5nZXRBdmFpbGlibGVDb3Vyc2VzKCk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhZ3JlZW1lbnRfYnlfY2F0ZWdvcnknXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snc2Nob29sX25hbWUnXS5zZXRWYWx1ZShudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNlbGVjdExldmVsKGxldmVsczogYW55KSB7XHJcbiAgICBpZiAobGV2ZWxzICE9PSAnTml2ZWwgZGUgaW5nbMOpcycpIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnNldFZhbHVlKGxldmVscyk7XHJcbiAgICAgIHRoaXMuZ2V0QXZhaWxpYmxlQ291cnNlcygpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnNldFZhbHVlKG51bGwpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2VsZWN0QXZhaWxpYmxlQ291cnNlcyhhdmFpbGlibGVDb3Vyc2VzOiBhbnkpIHtcclxuICAgIGlmIChhdmFpbGlibGVDb3Vyc2VzICE9PSAnR3J1cG9zIGRpc3BvbmlibGVzJykge1xyXG4gICAgICB0aGlzLmNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhdmFpbGlibGVfY291cnNlcyddLnNldFZhbHVlKGF2YWlsaWJsZUNvdXJzZXMpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYXZhaWxpYmxlX2NvdXJzZXMnXS5zZXRWYWx1ZShudWxsKTtcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10uc2V0VmFsdWUobnVsbCk7XHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2VuZ2xpc2hfbGV2ZWwnXS5zZXRWYWx1ZShudWxsKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgdmFsaWRSZXF1ZXN0KCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIChcclxuICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnZhbHVlICE9ICcnICYmXHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FncmVlbWVudF9ieV9jYXRlZ29yeSddLnZhbHVlICE9ICcnICYmXHJcbiAgICAgIHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10udmFsdWUgIT0gJydcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXRBdmFpbGlibGVDb3Vyc2VzKCkge1xyXG4gICAgdGhpcy5hdmFpbGlibGVDb3Vyc2VzID0gW107XHJcbiAgICBpZiAodGhpcy52YWxpZFJlcXVlc3QoKSkge1xyXG4gICAgICBsZXQgcmVxdWVzdF9hdmFpbGlibGVDb3Vyc2VzOiBHZXRBdmFpbGlibGVDb3Vyc2VzUnEgPSB7XHJcbiAgICAgICAgdG9rZW46IHRoaXMuYmFzZVNlcnZpY2UuZ2V0VXNlclRva2VuKCksXHJcbiAgICAgICAgZW5nbGlzaF9sZXZlbDogdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnZhbHVlLFxyXG4gICAgICAgIGFncmVlbWVudDogdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10udmFsdWUsXHJcbiAgICAgICAgY291cnNlX3R5cGU6IHRoaXMuY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10udmFsdWUsXHJcbiAgICAgIH07XHJcbiAgICAgIHRoaXMuY291cnNlU2VydmljZVxyXG4gICAgICAuZ2V0QXZhaWxpYmxlQ291cnNlcyhyZXF1ZXN0X2F2YWlsaWJsZUNvdXJzZXMpXHJcbiAgICAgIC5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XHJcbiAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcclxuICAgICAgICAgICAgbGV0IGNvdXJzZXM6IGFueVtdID0gcmVzcG9uc2UuZGF0YTtcclxuICAgICAgICAgICAgdGhpcy5oYXNBdmFpbGFibGVDb3Vyc2UgPSB0cnVlO1xyXG4gICAgICAgICAgICBjb3Vyc2VzLmZvckVhY2goY291cnNlID0+IHtcclxuICAgICAgICAgICAgICB0aGlzLmF2YWlsaWJsZUNvdXJzZXMucHVzaCh7XHJcbiAgICAgICAgICAgICAgICBjb2RlOiBjb3Vyc2UuY29kZSxcclxuICAgICAgICAgICAgICAgIG5hbWU6IGBDdXJzbyAke2NvdXJzZS5tb2RhbGl0eSA9PT0gMSA/ICdQcmVzZW5jaWFsJyA6ICdWaXJ0dWFsJ30gJHtjb3Vyc2UuY291cnNlX3R5cGUubmFtZX0gKCR7Y291cnNlLmVuZ2xpc2hfbGV2ZWx9KSAtIFRlYWNoZXIgJHtjb3Vyc2UudGVhY2hlcn0sIEZlY2hhIGRlIGluaWNpbzogJHtjb3Vyc2UudG9fc3RhcnR9YFxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9KVxyXG4gICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5oYXNBdmFpbGFibGVDb3Vyc2UgPSBmYWxzZTtcclxuICAgICAgICAgICAgdGhpcy5jb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYXZhaWxpYmxlX2NvdXJzZXMnXS5zZXRWYWx1ZShcIlwiKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KTtcclxuICAgIH1cclxuICB9XHJcbn1cclxuIiwiPGZvcm0gW2Zvcm1Hcm91cF09XCJjb2RGb3JtU3RlcE9uZVwiIGNsYXNzPVwiZ3JpZFwiPlxyXG4gIDxkaXYgY2xhc3M9XCJjb2xcIj5cclxuICAgIDxpcHQtc2VsZWN0XHJcbiAgICAgIFtpbml0aWFsVmFsdWVdPVwiY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FjYWRlbWljX3BsYW4nXS52YWx1ZVwiXHJcbiAgICAgIFtzZWxlY3RDb2RlXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhY2FkZW1pY19wbGFuJ10udmFsdWUgPT09IG51bGw/ICdQbGFuJzogY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FjYWRlbWljX3BsYW4nXS52YWx1ZVwiXHJcbiAgICAgIFtkZWZhdWx0VGV4dF09XCInUGxhbidcIlxyXG4gICAgICBbaXNSZXF1aXJlZF09XCJ0cnVlXCJcclxuICAgICAgKGV2ZW50U2VsZWN0KT1cInNlbGVjdEFjYWRlbWljUGxhbigkZXZlbnQpXCJcclxuICAgICAgW2RhdGFdPVwicGxhbnNcIlxyXG4gICAgICBbY29udHJvbF09XCJjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWNhZGVtaWNfcGxhbiddXCJcclxuICAgID48L2lwdC1zZWxlY3Q+XHJcbiAgICA8aXB0LXNlbGVjdFxyXG4gICAgICBbaW5pdGlhbFZhbHVlXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydjb3Vyc2VfdHlwZSddLnZhbHVlXCJcclxuICAgICAgW3NlbGVjdENvZGVdPVwiY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2NvdXJzZV90eXBlJ10udmFsdWUgPT09IG51bGw/ICdUaXBvIGRlIHBsYW4nOiBjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snY291cnNlX3R5cGUnXS52YWx1ZVwiXHJcbiAgICAgIFtkZWZhdWx0VGV4dF09XCInVGlwbyBkZSBwbGFuJ1wiXHJcbiAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxyXG4gICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0Q291cnNlc1R5cGVzQnlQbGFuKCRldmVudClcIlxyXG4gICAgICBbZGF0YV09XCJjb3Vyc2VfdHlwZVwiXHJcbiAgICAgIFtjb250cm9sXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydjb3Vyc2VfdHlwZSddXCJcclxuICAgID48L2lwdC1zZWxlY3Q+XHJcbiAgPC9kaXY+XHJcbiAgPGRpdiBjbGFzcz1cImNvbFwiPlxyXG4gICAgPGlwdC1zZWxlY3RcclxuICAgICAgW2luaXRpYWxWYWx1ZV09XCJjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10udmFsdWVcIlxyXG4gICAgICBbc2VsZWN0Q29kZV09XCJjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYWdyZWVtZW50X2J5X2NhdGVnb3J5J10udmFsdWUgPT09IG51bGw/ICdDb252ZW5pbyBwb3IgY2F0ZWdvcmlhJzogY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2FncmVlbWVudF9ieV9jYXRlZ29yeSddLnZhbHVlXCJcclxuICAgICAgW2RlZmF1bHRUZXh0XT1cIidDb252ZW5pbyBwb3IgY2F0ZWdvcmlhJ1wiXHJcbiAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxyXG4gICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0QWdyZWVtZW50QnlDYXRlZ29yeSgkZXZlbnQpXCJcclxuICAgICAgW2RhdGFdPVwiYWdyZWVtZW50c1wiXHJcbiAgICAgIFtjb250cm9sXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhZ3JlZW1lbnRfYnlfY2F0ZWdvcnknXVwiXHJcbiAgICA+PC9pcHQtc2VsZWN0PlxyXG4gICAgPGlwdC1zZWxlY3RcclxuICAgICAgW2luaXRpYWxWYWx1ZV09XCJjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnZhbHVlXCJcclxuICAgICAgW3NlbGVjdENvZGVdPVwiY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2VuZ2xpc2hfbGV2ZWwnXS52YWx1ZSA9PT0gbnVsbD8gJ05pdmVsIGRlIGluZ2zDqXMnOiBjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snZW5nbGlzaF9sZXZlbCddLnZhbHVlXCJcclxuICAgICAgW2RlZmF1bHRUZXh0XT1cIidOaXZlbCBkZSBpbmdsw6lzJ1wiXHJcbiAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxyXG4gICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0TGV2ZWwoJGV2ZW50KVwiXHJcbiAgICAgIFtkYXRhXT1cImxldmVsc1wiXHJcbiAgICAgIFtjb250cm9sXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydlbmdsaXNoX2xldmVsJ11cIlxyXG4gICAgPjwvaXB0LXNlbGVjdD5cclxuICA8L2Rpdj5cclxuICA8ZGl2IGNsYXNzPVwiY29sLTEyXCI+XHJcbiAgICA8aXB0LXNlbGVjdFxyXG4gICAgICBbaW5pdGlhbFZhbHVlXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhdmFpbGlibGVfY291cnNlcyddLnZhbHVlXCJcclxuICAgICAgW3NlbGVjdENvZGVdPVwiY29kRm9ybVN0ZXBPbmUuY29udHJvbHNbJ2F2YWlsaWJsZV9jb3Vyc2VzJ10udmFsdWUgPT09IG51bGw/ICdHcnVwb3MgZGlzcG9uaWJsZXMnOiBjb2RGb3JtU3RlcE9uZS5jb250cm9sc1snYXZhaWxpYmxlX2NvdXJzZXMnXS52YWx1ZVwiXHJcbiAgICAgIFtkZWZhdWx0VGV4dF09XCInR3J1cG9zIGRpc3BvbmlibGVzJ1wiXHJcbiAgICAgIFtpc1JlcXVpcmVkXT1cInRydWVcIlxyXG4gICAgICAoZXZlbnRTZWxlY3QpPVwic2VsZWN0QXZhaWxpYmxlQ291cnNlcygkZXZlbnQpXCJcclxuICAgICAgW2RhdGFdPVwiYXZhaWxpYmxlQ291cnNlc1wiXHJcbiAgICAgIFtjb250cm9sXT1cImNvZEZvcm1TdGVwT25lLmNvbnRyb2xzWydhdmFpbGlibGVfY291cnNlcyddXCJcclxuICAgID48L2lwdC1zZWxlY3Q+XHJcbiAgPC9kaXY+XHJcbiAgPHNwYW4gKm5nSWY9XCIhaGFzQXZhaWxhYmxlQ291cnNlXCIgY2xhc3M9XCJtdC0xIHBsLTIgdGV4dC1yZWQtNTAwXCI+VG9kYXZpYSBubyBoYXkgY3Vyc29zIGNvbiBlc3RhcyBjYXJhY3RlcsOtc3RpY2FzLjwvc3Bhbj5cclxuPC9mb3JtPlxyXG5cclxuPGRpdiBjbGFzcz1cImZsZXggbXQtMiBhbGlnbi1pdGVtcy1jZW50ZXIgZ2FwLTNcIj5cclxuICA8c3BhbiAqbmdJZj1cImNvZEZvcm1TdGVwT25lLmludmFsaWQgJiYgY29kRm9ybVN0ZXBPbmUudG91Y2hlZFwiIGNsYXNzPVwidGV4dC1yZWQtNTAwIGZvbnQtYm9sZCB0ZXh0LWNlbnRlciBtdC0xIHB5LTIgYmctcmVkLTEwMCB3LWZ1bGwgYm9yZGVyLXJvdW5kLXhsXCI+RmFsdGFuIGNhbXBvcyBwb3IgbGxlbmFyLjwvc3Bhbj5cclxuICA8YnV0dG9uIHR5cGU9XCJzdWJtaXRcIiBjbGFzcz1cIm1sLWF1dG8gcC1idXR0b24tc21cIiAoY2xpY2spPVwic2VuZEZvcm0oKVwiIHBCdXR0b24gbGFiZWw9XCJTaWd1aWVudGVcIiBpY29uPVwicGkgcGktYXJyb3ctcmlnaHRcIj48L2J1dHRvbj5cclxuPC9kaXY+XHJcbiJdfQ==