@hitsoft/kadooglu.kalite 0.0.0-stage → 1.0.1

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 (62) hide show
  1. package/README.md +23 -2
  2. package/config/enums/index.d.ts +1 -0
  3. package/config/enums/route-names.d.ts +5 -0
  4. package/config/index.d.ts +5 -0
  5. package/config/kalite-config.module.d.ts +8 -0
  6. package/config/providers/index.d.ts +1 -0
  7. package/config/providers/route.provider.d.ts +4 -0
  8. package/config/public-api.d.ts +3 -0
  9. package/esm2020/config/enums/index.mjs +2 -0
  10. package/esm2020/config/enums/route-names.mjs +2 -0
  11. package/esm2020/config/hitsoft-kadooglu.kalite-config.mjs +5 -0
  12. package/esm2020/config/kalite-config.module.mjs +18 -0
  13. package/esm2020/config/providers/index.mjs +2 -0
  14. package/esm2020/config/providers/route.provider.mjs +57 -0
  15. package/esm2020/config/public-api.mjs +4 -0
  16. package/esm2020/hitsoft-kadooglu.kalite.mjs +5 -0
  17. package/esm2020/lib/components/intake-form.component.mjs +162 -0
  18. package/esm2020/lib/components/intake-list.component.mjs +80 -0
  19. package/esm2020/lib/components/kalite.component.mjs +18 -0
  20. package/esm2020/lib/components/process-analysis.component.mjs +197 -0
  21. package/esm2020/lib/components/quality-definitions.component.mjs +97 -0
  22. package/esm2020/lib/components/quality-notifications.component.mjs +64 -0
  23. package/esm2020/lib/components/quality-parameters.component.mjs +332 -0
  24. package/esm2020/lib/components/quality-reports.component.mjs +107 -0
  25. package/esm2020/lib/kalite-notification.module.mjs +23 -0
  26. package/esm2020/lib/kalite-routing.module.mjs +41 -0
  27. package/esm2020/lib/kalite.module.mjs +41 -0
  28. package/esm2020/lib/models/intake.models.mjs +2 -0
  29. package/esm2020/lib/models/quality.models.mjs +2 -0
  30. package/esm2020/lib/services/kalite.service.mjs +21 -0
  31. package/esm2020/lib/services/print-form.mjs +96 -0
  32. package/esm2020/lib/services/quality-api.service.mjs +119 -0
  33. package/esm2020/lib/services/quality-measurements.mjs +127 -0
  34. package/esm2020/public-api.mjs +16 -0
  35. package/fesm2015/hitsoft-kadooglu.kalite-config.mjs +80 -0
  36. package/fesm2015/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
  37. package/fesm2015/hitsoft-kadooglu.kalite.mjs +1483 -0
  38. package/fesm2015/hitsoft-kadooglu.kalite.mjs.map +1 -0
  39. package/fesm2020/hitsoft-kadooglu.kalite-config.mjs +80 -0
  40. package/fesm2020/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
  41. package/fesm2020/hitsoft-kadooglu.kalite.mjs +1442 -0
  42. package/fesm2020/hitsoft-kadooglu.kalite.mjs.map +1 -0
  43. package/index.d.ts +5 -0
  44. package/lib/components/intake-form.component.d.ts +50 -0
  45. package/lib/components/intake-list.component.d.ts +48 -0
  46. package/lib/components/kalite.component.d.ts +10 -0
  47. package/lib/components/process-analysis.component.d.ts +46 -0
  48. package/lib/components/quality-definitions.component.d.ts +46 -0
  49. package/lib/components/quality-notifications.component.d.ts +44 -0
  50. package/lib/components/quality-parameters.component.d.ts +82 -0
  51. package/lib/components/quality-reports.component.d.ts +31 -0
  52. package/lib/kalite-notification.module.d.ts +14 -0
  53. package/lib/kalite-routing.module.d.ts +7 -0
  54. package/lib/kalite.module.d.ts +23 -0
  55. package/lib/models/intake.models.d.ts +185 -0
  56. package/lib/models/quality.models.d.ts +114 -0
  57. package/lib/services/kalite.service.d.ts +10 -0
  58. package/lib/services/print-form.d.ts +2 -0
  59. package/lib/services/quality-api.service.d.ts +71 -0
  60. package/lib/services/quality-measurements.d.ts +8 -0
  61. package/package.json +42 -3
  62. package/public-api.d.ts +12 -0
@@ -0,0 +1,332 @@
1
+ import { Component, ViewChild } from '@angular/core';
2
+ import { defer } from 'rxjs';
3
+ import { finalize } from 'rxjs/operators';
4
+ import { errorMessage, localDate } from '../services/quality-measurements';
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../services/quality-api.service";
7
+ import * as i2 from "@abp/ng.core";
8
+ import * as i3 from "@angular/router";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "@abp/ng.theme.shared";
12
+ export class QualityParametersComponent {
13
+ constructor(api, permissions, changeDetector, route) {
14
+ this.api = api;
15
+ this.permissions = permissions;
16
+ this.changeDetector = changeDetector;
17
+ this.route = route;
18
+ this.controlType = 'Process';
19
+ this.movementTypes = [];
20
+ this.movementDetails = [];
21
+ this.movementTypeCode = '';
22
+ this.movementDetailCode = '';
23
+ this.newInputForm = false;
24
+ this.forms = [];
25
+ this.facilities = [];
26
+ this.facilityCode = '';
27
+ this.facilitySteps = [];
28
+ this.editingStep = null;
29
+ this.newStep = false;
30
+ this.formCode = '';
31
+ this.template = null;
32
+ this.editingParameter = null;
33
+ this.editingLimit = null;
34
+ this.newParameter = false;
35
+ this.newLimit = false;
36
+ this.parameterModalVisible = false;
37
+ this.limitModalVisible = false;
38
+ this.modalError = '';
39
+ this.editorModalOptions = { size: 'xl', centered: true };
40
+ this.optionsText = '';
41
+ this.pendingRequests = 0;
42
+ this.busyText = 'Kalite tanımları yükleniyor…';
43
+ this.error = '';
44
+ this.success = '';
45
+ }
46
+ get busy() { return this.pendingRequests > 0; }
47
+ ngOnInit() {
48
+ if (this.route.snapshot.queryParamMap.get('type') === 'Input')
49
+ this.controlType = 'Input';
50
+ this.movementDetailCode = this.route.snapshot.queryParamMap.get('detail') || '';
51
+ this.api.qualityMovementTypes().subscribe({ next: x => this.movementTypes = x, error: e => this.error = errorMessage(e) });
52
+ this.api.movementDetails().subscribe({ next: x => {
53
+ this.movementDetails = x.filter(d => d.active);
54
+ this.movementTypeCode = x.find(d => d.code === this.movementDetailCode)?.movementTypeCode || '';
55
+ if (this.controlType === 'Input')
56
+ this.selectInput();
57
+ }, error: e => this.error = errorMessage(e) });
58
+ this.track(this.api.parameterFacilities(), 'Kalite tanımları yükleniyor…').subscribe({
59
+ next: facilities => { this.facilities = facilities; this.selectFacility(); if (this.facilityCode)
60
+ this.loadSteps(); },
61
+ error: () => this.error = 'Tesis listesi yüklenemedi.',
62
+ });
63
+ this.track(this.api.forms(), 'Kalite tanımları yükleniyor…').subscribe({
64
+ next: forms => { this.forms = forms; this.switchType(this.controlType); },
65
+ error: () => this.error = 'Form listesi yüklenemedi.',
66
+ });
67
+ }
68
+ get canEdit() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Edit'); }
69
+ get canCreate() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Create'); }
70
+ get canDelete() { return this.permissions.getGrantedPolicy('Kalite.Parameters.Delete'); }
71
+ get visibleForms() { return this.forms.filter(f => (f.controlType || 'Process') === this.controlType); }
72
+ get visibleDetails() { return this.movementDetails.filter(d => !this.movementTypeCode || d.movementTypeCode === this.movementTypeCode); }
73
+ switchType(type) {
74
+ this.controlType = type;
75
+ this.editingStep = null;
76
+ this.facilitySteps = [];
77
+ this.template = null;
78
+ if (type === 'Input')
79
+ this.selectInput();
80
+ else {
81
+ this.formCode = this.visibleForms[0]?.code || '';
82
+ this.newInputForm = false;
83
+ this.load();
84
+ }
85
+ }
86
+ selectInput() {
87
+ if (!this.visibleDetails.some(d => d.code === this.movementDetailCode))
88
+ this.movementDetailCode = this.visibleDetails[0]?.code || '';
89
+ const form = this.visibleForms.find(f => f.movementDetailCode === this.movementDetailCode);
90
+ if (form) {
91
+ this.formCode = form.code;
92
+ this.newInputForm = false;
93
+ this.load();
94
+ return;
95
+ }
96
+ const detail = this.movementDetails.find(d => d.code === this.movementDetailCode);
97
+ this.newInputForm = !!detail;
98
+ this.formCode = detail ? 'IN_' + detail.code : '';
99
+ this.template = detail ? { form: { code: this.formCode, controlType: 'Input', movementDetailCode: detail.code,
100
+ averageMode: 'Arithmetic', name: detail.name || this.movementTypes.find(t => t.code === detail.movementTypeCode)?.name || '',
101
+ documentCode: '', publicationDate: localDate(), revisionDate: localDate(), revisionNumber: '1', active: true },
102
+ parameters: [], limits: [], steps: [] } : null;
103
+ }
104
+ load() {
105
+ if (!this.formCode)
106
+ return;
107
+ if (this.controlType === 'Process') {
108
+ this.selectFacility();
109
+ if (this.facilityCode)
110
+ this.loadSteps();
111
+ }
112
+ this.error = '';
113
+ this.track(this.api.template(this.formCode), 'Kalite tanımları yükleniyor…').subscribe({
114
+ next: template => {
115
+ template.form.publicationDate = template.form.publicationDate?.slice(0, 10);
116
+ template.form.revisionDate = template.form.revisionDate?.slice(0, 10);
117
+ this.template = template;
118
+ this.editingParameter = null;
119
+ this.editingLimit = null;
120
+ },
121
+ error: () => { this.error = 'Form tanımı yüklenemedi.'; },
122
+ });
123
+ }
124
+ revealStepEditor() {
125
+ this.changeDetector.detectChanges();
126
+ this.stepEditor?.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'start' });
127
+ this.stepEditor?.nativeElement.focus({ preventScroll: true });
128
+ }
129
+ parameterModalChanged(visible) {
130
+ this.parameterModalVisible = visible;
131
+ if (!visible) {
132
+ this.editingParameter = null;
133
+ this.modalError = '';
134
+ }
135
+ }
136
+ limitModalChanged(visible) {
137
+ this.limitModalVisible = visible;
138
+ if (!visible) {
139
+ this.editingLimit = null;
140
+ this.modalError = '';
141
+ }
142
+ }
143
+ closeParameterModal() {
144
+ if (!this.busy)
145
+ this.parameterModalChanged(false);
146
+ }
147
+ closeLimitModal() {
148
+ if (!this.busy)
149
+ this.limitModalChanged(false);
150
+ }
151
+ track(request, message) {
152
+ return defer(() => {
153
+ this.pendingRequests++;
154
+ this.busyText = message;
155
+ return request.pipe(finalize(() => this.pendingRequests--));
156
+ });
157
+ }
158
+ processName(code) {
159
+ return this.template?.steps.find(step => step.processCode === code)?.name || code;
160
+ }
161
+ steps() {
162
+ return this.facilitySteps.filter(x => x.active);
163
+ }
164
+ matchingFacilities() {
165
+ return this.facilities.filter(x => x.formCode === this.formCode);
166
+ }
167
+ selectFacility() {
168
+ if (!this.matchingFacilities().some(x => x.code === this.facilityCode))
169
+ this.facilityCode = this.matchingFacilities()[0]?.code || '';
170
+ }
171
+ loadSteps() {
172
+ if (!this.facilityCode)
173
+ return;
174
+ this.track(this.api.steps(this.facilityCode), 'Kalite tanımları yükleniyor…').subscribe({
175
+ next: steps => this.facilitySteps = steps,
176
+ error: () => this.error = 'Proses adımları yüklenemedi.',
177
+ });
178
+ }
179
+ addStep() {
180
+ this.newStep = true;
181
+ this.editingStep = { code: '', facilityCode: this.facilityCode, processCode: '',
182
+ name: '', order: this.facilitySteps.length + 1, active: true };
183
+ this.revealStepEditor();
184
+ }
185
+ editStep(step) {
186
+ this.newStep = false;
187
+ this.editingStep = { ...step };
188
+ this.revealStepEditor();
189
+ }
190
+ saveStep() {
191
+ if (!this.editingStep)
192
+ return;
193
+ const step = { ...this.editingStep,
194
+ code: this.editingStep.code.trim().toUpperCase(),
195
+ processCode: this.editingStep.processCode.trim().toUpperCase(),
196
+ name: this.editingStep.name.trim() };
197
+ this.track(this.api.saveStep(step), 'Değişiklikler kaydediliyor…').subscribe({
198
+ next: () => { this.editingStep = null; this.success = 'Proses adımı kaydedildi.'; this.loadSteps(); },
199
+ error: () => { this.error = 'Proses adımı kaydedilemedi.'; },
200
+ });
201
+ }
202
+ orderedParameters() {
203
+ const order = this.steps().map(step => step.processCode);
204
+ return [...(this.template?.parameters || [])].sort((a, b) => order.indexOf(a.stepCode) - order.indexOf(b.stepCode) || a.order - b.order);
205
+ }
206
+ limitsFor(code) {
207
+ return this.template?.limits.filter(limit => limit.parameterCode === code) || [];
208
+ }
209
+ editForm() {
210
+ if (!this.template || !this.canEdit)
211
+ return;
212
+ this.track(this.api.saveForm(this.template.form), 'Değişiklikler kaydediliyor…').subscribe({
213
+ next: () => {
214
+ this.success = 'Form başlığı kaydedildi.';
215
+ this.newInputForm = false;
216
+ this.api.forms().subscribe({ next: forms => { this.forms = forms; this.load(); } });
217
+ },
218
+ error: () => { this.error = 'Form başlığı kaydedilemedi.'; },
219
+ });
220
+ }
221
+ addParameter() {
222
+ if (!this.template || this.newInputForm)
223
+ return;
224
+ this.newParameter = true;
225
+ this.optionsText = '';
226
+ this.editingParameter = {
227
+ code: '', formCode: this.formCode, stepCode: this.template.steps[0]?.processCode || '',
228
+ order: this.template.parameters.length + 1, name: '', unit: '', valueType: 'Number',
229
+ decimalPlaces: 2, required: false, calculated: false, formula: '', options: [], active: true,
230
+ };
231
+ this.editingLimit = null;
232
+ this.modalError = '';
233
+ this.parameterModalVisible = true;
234
+ }
235
+ editParameter(parameter) {
236
+ this.newParameter = false;
237
+ this.editingParameter = { ...parameter, options: [...(parameter.options || [])] };
238
+ this.optionsText = this.editingParameter.options.join(', ');
239
+ this.editingLimit = null;
240
+ this.modalError = '';
241
+ this.parameterModalVisible = true;
242
+ }
243
+ saveParameter() {
244
+ if (!this.editingParameter || this.busy)
245
+ return;
246
+ const parameter = { ...this.editingParameter,
247
+ code: this.editingParameter.code.trim().toUpperCase(),
248
+ name: this.editingParameter.name.trim(),
249
+ options: this.optionsText.split(',').map(x => x.trim()).filter(Boolean),
250
+ };
251
+ if (!parameter.code || !parameter.name || (this.controlType === 'Process' && !parameter.stepCode)) {
252
+ this.modalError = 'Parametre kodu, adı ve proses kontrolünde proses adımı zorunludur.';
253
+ return;
254
+ }
255
+ this.modalError = '';
256
+ const request = this.newParameter ? this.api.createParameter(parameter) : this.api.updateParameter(parameter);
257
+ this.track(request, 'Değişiklikler kaydediliyor…').subscribe({
258
+ next: () => { this.parameterModalChanged(false); this.success = 'Parametre kaydedildi.'; this.load(); },
259
+ error: () => { this.modalError = 'Parametre kaydedilemedi.'; },
260
+ });
261
+ }
262
+ deleteParameter(parameter) {
263
+ if (!confirm(`${parameter.name} parametresi ve bağlı limitleri kalıcı olarak silinsin mi?`))
264
+ return;
265
+ this.track(this.api.deleteParameter(parameter.code), 'Değişiklikler kaydediliyor…').subscribe({
266
+ next: () => this.load(), error: e => this.error = errorMessage(e),
267
+ });
268
+ }
269
+ addLimit(parameter) {
270
+ this.newLimit = true;
271
+ this.editingParameter = null;
272
+ this.editingLimit = {
273
+ code: '', parameterCode: parameter.code, oilType: '', origin: '', minimum: null, maximum: null,
274
+ nominal: null, expectedText: '', validFrom: null, validUntil: null, active: true,
275
+ };
276
+ this.modalError = '';
277
+ this.limitModalVisible = true;
278
+ }
279
+ editLimit(limit) {
280
+ this.newLimit = false;
281
+ this.editingParameter = null;
282
+ this.editingLimit = { ...limit,
283
+ validFrom: limit.validFrom?.slice(0, 10) || null,
284
+ validUntil: limit.validUntil?.slice(0, 10) || null,
285
+ };
286
+ this.modalError = '';
287
+ this.limitModalVisible = true;
288
+ }
289
+ saveLimit() {
290
+ if (!this.editingLimit || this.busy)
291
+ return;
292
+ const limit = { ...this.editingLimit,
293
+ code: this.newLimit ? this.editingLimit.code.trim().toUpperCase() : this.editingLimit.code,
294
+ oilType: this.editingLimit.oilType?.trim() || '',
295
+ };
296
+ if (!limit.code) {
297
+ this.modalError = 'Limit kodu zorunludur.';
298
+ return;
299
+ }
300
+ this.modalError = '';
301
+ const request = this.newLimit ? this.api.createLimit(limit) : this.api.updateLimit(limit);
302
+ this.track(request, 'Değişiklikler kaydediliyor…').subscribe({
303
+ next: () => { this.limitModalChanged(false); this.success = 'Limit kaydedildi.'; this.load(); },
304
+ error: e => { this.modalError = errorMessage(e); },
305
+ });
306
+ }
307
+ deleteLimit(limit) {
308
+ if (this.busy)
309
+ return;
310
+ if (!confirm(`${limit.code} limiti kalıcı olarak silinsin mi?`))
311
+ return;
312
+ this.track(this.api.deleteLimit(limit.code), 'Değişiklikler kaydediliyor…').subscribe({
313
+ next: () => { this.limitModalChanged(false); this.load(); },
314
+ error: e => {
315
+ if (this.limitModalVisible)
316
+ this.modalError = errorMessage(e);
317
+ else
318
+ this.error = errorMessage(e);
319
+ },
320
+ });
321
+ }
322
+ }
323
+ QualityParametersComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityParametersComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }, { token: i0.ChangeDetectorRef }, { token: i3.ActivatedRoute }], target: i0.ɵɵFactoryTarget.Component });
324
+ QualityParametersComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityParametersComponent, selector: "lib-quality-parameters", viewQueries: [{ propertyName: "stepEditor", first: true, predicate: ["stepEditor"], descendants: true }], ngImport: i0, template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Kalite Parametreleri (Kalite Sorular\u0131)</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-primary]=\"controlType === 'Input'\" [class.btn-outline-secondary]=\"controlType !== 'Input'\" (click)=\"switchType('Input')\">Girdi Kontrol</button><button class=\"btn\" [class.btn-primary]=\"controlType === 'Process'\" [class.btn-outline-secondary]=\"controlType !== 'Process'\" (click)=\"switchType('Process')\">Proses Kontrol</button></div>\r\n <div class=\"row mb-3\" *ngIf=\"controlType === 'Input'\">\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"movementTypeCode\" (change)=\"selectInput()\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of movementTypes\" [value]=\"type.code\">{{ type.name }}</option></select></div>\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC / Detay</label><select class=\"form-control\" [(ngModel)]=\"movementDetailCode\" (change)=\"selectInput()\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let d of visibleDetails\" [value]=\"d.code\">{{ d.name || d.movementTypeCode }}{{ d.detailCode ? ' / ' + d.detailCode : ' (detays\u0131z)' }}</option></select></div>\r\n <p class=\"col-md-12 mt-2 text-muted\" *ngIf=\"!visibleDetails.length\">\u00D6nce Kalite Tan\u0131mlar\u0131 ekran\u0131nda kalite kontrole tabi hareket t\u00FCr\u00FCn\u00FC tan\u0131mlay\u0131n.</p>\r\n </div>\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\">\r\n <label for=\"formSelect\">Form</label>\r\n <select id=\"formSelect\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"formCode\" (change)=\"load()\">\r\n <option *ngFor=\"let form of visibleForms\" [value]=\"form.code\">{{ form.documentCode }} \u2013 {{ form.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right mt-2 mt-md-0\">\r\n <button class=\"btn btn-primary\" *ngIf=\"canCreate\" (click)=\"addParameter()\" [disabled]=\"busy || !template || newInputForm\">+ Yeni Parametre</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div>\r\n <div *ngIf=\"success\" class=\"alert alert-success\" (click)=\"success = ''\">{{ success }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n\r\n <ng-container *ngIf=\"template\">\r\n <div [hidden]=\"busy\">\r\n <div class=\"row align-items-end mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <div class=\"col-md-4\"><label for=\"facilitySelect\">Proses s\u0131ras\u0131 i\u00E7in tesis</label>\r\n <select id=\"facilitySelect\" class=\"form-control\" [(ngModel)]=\"facilityCode\" (change)=\"loadSteps()\">\r\n <option *ngFor=\"let facility of matchingFacilities()\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right\"><button class=\"btn btn-outline-primary\" *ngIf=\"canEdit\" (click)=\"addStep()\">+ Proses Ad\u0131m\u0131</button></div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <span class=\"step-pill\" *ngFor=\"let step of facilitySteps\">\r\n <button type=\"button\" class=\"btn btn-sm\" [class.btn-outline-primary]=\"step.active\" [class.btn-outline-secondary]=\"!step.active\"\r\n (click)=\"editStep(step)\" [disabled]=\"!canEdit\">{{ step.order }}. {{ step.name }}<span *ngIf=\"!step.active\"> (pasif)</span></button>\r\n </span>\r\n </div>\r\n <div #stepEditor tabindex=\"-1\" class=\"card mt-3 mb-3 editor-card\" *ngIf=\"editingStep as step\"><div class=\"card-body\">\r\n <h5>{{ newStep ? 'Yeni Proses Ad\u0131m\u0131' : 'Proses Ad\u0131m\u0131n\u0131 D\u00FCzenle' }}</h5>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"step.code\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-2\"><label>Proses Kodu</label><input class=\"form-control\" [(ngModel)]=\"step.processCode\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-4\"><label>Ad</label><input class=\"form-control\" [(ngModel)]=\"step.name\" /></div>\r\n <div class=\"col-md-2\"><label>S\u0131ra</label><input type=\"number\" min=\"1\" class=\"form-control\" [(ngModel)]=\"step.order\" /></div>\r\n <div class=\"col-md-2 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"step.active\" /> Aktif</label></div>\r\n </div>\r\n <button class=\"btn btn-primary mt-3 mr-2\" (click)=\"saveStep()\" [disabled]=\"busy\">Kaydet</button>\r\n <button class=\"btn btn-secondary mt-3\" (click)=\"editingStep = null\">\u0130ptal</button>\r\n </div></div>\r\n <div class=\"form-header rounded p-3 mb-3\">\r\n <p *ngIf=\"newInputForm\" class=\"text-muted\">\u00D6nce form ba\u015Fl\u0131\u011F\u0131n\u0131 kaydedin, ard\u0131ndan kalite sorular\u0131n\u0131 ekleyin.</p>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Form Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"template.form.name\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Dok\u00FCman Kodu</label><input class=\"form-control\" [(ngModel)]=\"template.form.documentCode\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Yay\u0131n Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.publicationDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.revisionDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon No</label><input class=\"form-control\" [(ngModel)]=\"template.form.revisionNumber\" [disabled]=\"!canEdit\" /></div>\r\n </div>\r\n <div class=\"row mt-2\" *ngIf=\"controlType === 'Input'\"><div class=\"col-md-4\"><label>Ortalama Tipi</label><select class=\"form-control\" [(ngModel)]=\"template.form.averageMode\" [disabled]=\"!canEdit\"><option value=\"Arithmetic\">Aritmetik</option><option value=\"Weighted\">Miktar a\u011F\u0131rl\u0131kl\u0131</option></select></div><div class=\"col-md-4\"><label>Miktar Birimi</label><select class=\"form-control\" [(ngModel)]=\"template.form.quantityUnit\" [disabled]=\"!canEdit\"><option value=\"kg\">Kilogram</option><option value=\"t\">Ton</option></select></div></div>\r\n <button class=\"btn btn-outline-primary mt-3\" *ngIf=\"canEdit\" (click)=\"editForm()\" [disabled]=\"busy\">Ba\u015Fl\u0131\u011F\u0131 Kaydet</button>\r\n </div>\r\n\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-striped table-sm parameter-table\">\r\n <thead><tr><th>\u0130\u015Flemler</th><th *ngIf=\"controlType === 'Process'\">Proses Ad\u0131m\u0131</th><th>S\u0131ra</th><th>Kod</th><th>Parametre / Soru</th><th>Birim</th><th>Veri Tipi</th><th>Limit / Nominal</th><th>Durum</th></tr></thead>\r\n <tbody>\r\n <tr *ngFor=\"let parameter of orderedParameters()\">\r\n <td class=\"actions\">\r\n <button class=\"btn btn-sm btn-outline-primary mr-1\" *ngIf=\"canEdit\" (click)=\"editParameter(parameter)\">D\u00FCzenle</button>\r\n <button class=\"btn btn-sm btn-outline-secondary mr-1\" *ngIf=\"canCreate\" (click)=\"addLimit(parameter)\">+ Limit</button>\r\n <button class=\"btn btn-sm btn-outline-danger\" *ngIf=\"canDelete && parameter.active\" (click)=\"deleteParameter(parameter)\">Sil</button>\r\n </td>\r\n <td *ngIf=\"controlType === 'Process'\">{{ processName(parameter.stepCode) }}</td><td>{{ parameter.order }}</td>\r\n <td><code>{{ parameter.code }}</code></td><td>{{ parameter.name }}</td><td>{{ parameter.unit || '\u2014' }}</td>\r\n <td>{{ parameter.valueType }}<span *ngIf=\"parameter.calculated\"> / Hesaplanan</span></td>\r\n <td>\r\n <div *ngFor=\"let limit of limitsFor(parameter.code)\">\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0 limit-link\" (click)=\"editLimit(limit)\">{{ limit.code }}</button>:\r\n <span *ngIf=\"limit.oilType\">{{ limit.oilType }} \u00B7 </span>\r\n <span *ngIf=\"limit.origin\">{{ limit.origin === 'Imported' ? '\u0130thal' : '\u0130\u00E7 Piyasa' }} \u00B7 </span>\r\n <span *ngIf=\"limit.minimum != null\">Min {{ limit.minimum }} </span>\r\n <span *ngIf=\"limit.maximum != null\">Max {{ limit.maximum }} </span>\r\n <span *ngIf=\"limit.nominal != null\">Nominal {{ limit.nominal }} </span>\r\n <span *ngIf=\"limit.expectedText\">{{ limit.expectedText }}</span>\r\n <span *ngIf=\"!limit.active\" class=\"text-muted\">(pasif)</span>\r\n </div>\r\n </td>\r\n <td>{{ parameter.active ? 'Aktif' : 'Pasif' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<abp-modal [visible]=\"parameterModalVisible\" (visibleChange)=\"parameterModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newParameter ? 'Yeni Parametre' : 'Parametreyi D\u00FCzenle' }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingParameter as parameter\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"parameter.code\" [disabled]=\"!newParameter\" /></div>\r\n <div class=\"col-md-4\"><label>Ad / Soru</label><input class=\"form-control\" [(ngModel)]=\"parameter.name\" /></div>\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\"><label>Proses Ad\u0131m\u0131</label><select class=\"form-control\" [(ngModel)]=\"parameter.stepCode\"><option *ngFor=\"let step of steps()\" [value]=\"step.processCode\">{{ step.name }}</option></select></div>\r\n <div class=\"col-md-4\"><label>S\u0131ra</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"parameter.order\" /></div>\r\n <div class=\"col-md-4\"><label>Birim</label><input class=\"form-control\" [(ngModel)]=\"parameter.unit\" /></div>\r\n <div class=\"col-md-4\"><label>Veri Tipi</label><select class=\"form-control\" [(ngModel)]=\"parameter.valueType\"><option value=\"Number\">Say\u0131sal</option><option value=\"Text\">Metin</option><option value=\"Choice\">Se\u00E7im</option></select></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ondal\u0131k Basamak</label><input type=\"number\" min=\"0\" max=\"8\" class=\"form-control\" [(ngModel)]=\"parameter.decimalPlaces\" /></div>\r\n <div class=\"col-md-4\"><label>Se\u00E7enekler (virg\u00FClle ayr\u0131lm\u0131\u015F)</label><input class=\"form-control\" [(ngModel)]=\"optionsText\" [disabled]=\"parameter.valueType !== 'Choice'\" /></div>\r\n <div class=\"col-md-4\"><label>Hesaplama Form\u00FCl\u00FC</label><input class=\"form-control\" [(ngModel)]=\"parameter.formula\" [disabled]=\"!parameter.calculated\" placeholder=\"PARAM_KODU * 2\" /></div>\r\n <div class=\"col-md-4 d-flex flex-column justify-content-end\"><label><input type=\"checkbox\" [(ngModel)]=\"parameter.required\" /> Zorunlu</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.calculated\" /> Hesaplanan</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeParameterModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveParameter()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n\r\n<abp-modal [visible]=\"limitModalVisible\" (visibleChange)=\"limitModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newLimit ? 'Yeni Limit' : 'Limiti D\u00FCzenle' }} \u2013 {{ editingLimit?.parameterCode }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingLimit as limit\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"limit.code\" [disabled]=\"!newLimit\" /></div>\r\n <div class=\"col-md-4\"><label>Ya\u011F Cinsi / Ko\u015Ful</label><select class=\"form-control\" [(ngModel)]=\"limit.oilType\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Palm Oil\">Palm Oil</option><option value=\"Palm Olein\">Palm Olein</option></select></div>\r\n <div class=\"col-md-4\"><label>Men\u015Fei</label><select class=\"form-control\" [(ngModel)]=\"limit.origin\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Domestic\">\u0130\u00E7 Piyasa</option><option value=\"Imported\">\u0130thal</option></select></div>\r\n <div class=\"col-md-4\"><label>Min</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.minimum\" /></div>\r\n <div class=\"col-md-4\"><label>Max</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.maximum\" /></div>\r\n <div class=\"col-md-4\"><label>Nominal</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.nominal\" /></div>\r\n <div class=\"col-md-4\"><label>Beklenen Metin</label><input class=\"form-control\" [(ngModel)]=\"limit.expectedText\" /></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validFrom\" /></div>\r\n <div class=\"col-md-4\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validUntil\" /></div>\r\n <div class=\"col-md-4 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"limit.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-danger\" *ngIf=\"!newLimit && canDelete\"\r\n (click)=\"deleteLimit(editingLimit!)\" [disabled]=\"busy\">Sil</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeLimitModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveLimit()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".form-header{background:#f7f8fa;border:1px solid #e3e6eb}.parameter-table{min-width:1100px}.parameter-table .actions{white-space:nowrap}.parameter-table .limit-link{color:#007bff}.parameter-table .limit-link:hover,.parameter-table .limit-link:focus{color:#0056b3}.editor-card{border-color:#8864ac;scroll-margin-top:90px}.editor-card:focus{outline:2px solid #8864ac;outline-offset:2px}.step-pill{display:inline-block;margin:0 .4rem .4rem 0}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"], dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i5.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: i5.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i5.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i5.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i5.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }] });
325
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityParametersComponent, decorators: [{
326
+ type: Component,
327
+ args: [{ selector: 'lib-quality-parameters', template: "<div class=\"container-fluid\">\r\n <div class=\"mb-2\">\r\n <h3 class=\"page-title\">Kalite Parametreleri (Kalite Sorular\u0131)</h3>\r\n </div>\r\n\r\n <div class=\"card mt-2\"><div class=\"card-body\">\r\n <div class=\"btn-group mb-3\" role=\"tablist\"><button class=\"btn\" [class.btn-primary]=\"controlType === 'Input'\" [class.btn-outline-secondary]=\"controlType !== 'Input'\" (click)=\"switchType('Input')\">Girdi Kontrol</button><button class=\"btn\" [class.btn-primary]=\"controlType === 'Process'\" [class.btn-outline-secondary]=\"controlType !== 'Process'\" (click)=\"switchType('Process')\">Proses Kontrol</button></div>\r\n <div class=\"row mb-3\" *ngIf=\"controlType === 'Input'\">\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC</label><select class=\"form-control\" [(ngModel)]=\"movementTypeCode\" (change)=\"selectInput()\"><option value=\"\">T\u00FCm\u00FC</option><option *ngFor=\"let type of movementTypes\" [value]=\"type.code\">{{ type.name }}</option></select></div>\r\n <div class=\"col-md-6\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC / Detay</label><select class=\"form-control\" [(ngModel)]=\"movementDetailCode\" (change)=\"selectInput()\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let d of visibleDetails\" [value]=\"d.code\">{{ d.name || d.movementTypeCode }}{{ d.detailCode ? ' / ' + d.detailCode : ' (detays\u0131z)' }}</option></select></div>\r\n <p class=\"col-md-12 mt-2 text-muted\" *ngIf=\"!visibleDetails.length\">\u00D6nce Kalite Tan\u0131mlar\u0131 ekran\u0131nda kalite kontrole tabi hareket t\u00FCr\u00FCn\u00FC tan\u0131mlay\u0131n.</p>\r\n </div>\r\n <div class=\"row align-items-end mb-3\">\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\">\r\n <label for=\"formSelect\">Form</label>\r\n <select id=\"formSelect\" class=\"form-control\" [disabled]=\"busy\" [(ngModel)]=\"formCode\" (change)=\"load()\">\r\n <option *ngFor=\"let form of visibleForms\" [value]=\"form.code\">{{ form.documentCode }} \u2013 {{ form.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right mt-2 mt-md-0\">\r\n <button class=\"btn btn-primary\" *ngIf=\"canCreate\" (click)=\"addParameter()\" [disabled]=\"busy || !template || newInputForm\">+ Yeni Parametre</button>\r\n </div>\r\n </div>\r\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div>\r\n <div *ngIf=\"success\" class=\"alert alert-success\" (click)=\"success = ''\">{{ success }}</div>\r\n <div class=\"quality-grid-loading\" *ngIf=\"busy\" role=\"status\" aria-live=\"polite\" aria-busy=\"true\">\r\n <span class=\"spinner-border text-primary\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n\r\n <ng-container *ngIf=\"template\">\r\n <div [hidden]=\"busy\">\r\n <div class=\"row align-items-end mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <div class=\"col-md-4\"><label for=\"facilitySelect\">Proses s\u0131ras\u0131 i\u00E7in tesis</label>\r\n <select id=\"facilitySelect\" class=\"form-control\" [(ngModel)]=\"facilityCode\" (change)=\"loadSteps()\">\r\n <option *ngFor=\"let facility of matchingFacilities()\" [value]=\"facility.code\">{{ facility.name }}</option>\r\n </select>\r\n </div>\r\n <div class=\"col-md-8 text-md-right\"><button class=\"btn btn-outline-primary\" *ngIf=\"canEdit\" (click)=\"addStep()\">+ Proses Ad\u0131m\u0131</button></div>\r\n </div>\r\n <div class=\"mb-3\" *ngIf=\"controlType === 'Process'\">\r\n <span class=\"step-pill\" *ngFor=\"let step of facilitySteps\">\r\n <button type=\"button\" class=\"btn btn-sm\" [class.btn-outline-primary]=\"step.active\" [class.btn-outline-secondary]=\"!step.active\"\r\n (click)=\"editStep(step)\" [disabled]=\"!canEdit\">{{ step.order }}. {{ step.name }}<span *ngIf=\"!step.active\"> (pasif)</span></button>\r\n </span>\r\n </div>\r\n <div #stepEditor tabindex=\"-1\" class=\"card mt-3 mb-3 editor-card\" *ngIf=\"editingStep as step\"><div class=\"card-body\">\r\n <h5>{{ newStep ? 'Yeni Proses Ad\u0131m\u0131' : 'Proses Ad\u0131m\u0131n\u0131 D\u00FCzenle' }}</h5>\r\n <div class=\"row\">\r\n <div class=\"col-md-2\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"step.code\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-2\"><label>Proses Kodu</label><input class=\"form-control\" [(ngModel)]=\"step.processCode\" [disabled]=\"!newStep\" /></div>\r\n <div class=\"col-md-4\"><label>Ad</label><input class=\"form-control\" [(ngModel)]=\"step.name\" /></div>\r\n <div class=\"col-md-2\"><label>S\u0131ra</label><input type=\"number\" min=\"1\" class=\"form-control\" [(ngModel)]=\"step.order\" /></div>\r\n <div class=\"col-md-2 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"step.active\" /> Aktif</label></div>\r\n </div>\r\n <button class=\"btn btn-primary mt-3 mr-2\" (click)=\"saveStep()\" [disabled]=\"busy\">Kaydet</button>\r\n <button class=\"btn btn-secondary mt-3\" (click)=\"editingStep = null\">\u0130ptal</button>\r\n </div></div>\r\n <div class=\"form-header rounded p-3 mb-3\">\r\n <p *ngIf=\"newInputForm\" class=\"text-muted\">\u00D6nce form ba\u015Fl\u0131\u011F\u0131n\u0131 kaydedin, ard\u0131ndan kalite sorular\u0131n\u0131 ekleyin.</p>\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Form Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"template.form.name\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Dok\u00FCman Kodu</label><input class=\"form-control\" [(ngModel)]=\"template.form.documentCode\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Yay\u0131n Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.publicationDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon Tarihi</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"template.form.revisionDate\" [disabled]=\"!canEdit\" /></div>\r\n <div class=\"col-md-2\"><label>Revizyon No</label><input class=\"form-control\" [(ngModel)]=\"template.form.revisionNumber\" [disabled]=\"!canEdit\" /></div>\r\n </div>\r\n <div class=\"row mt-2\" *ngIf=\"controlType === 'Input'\"><div class=\"col-md-4\"><label>Ortalama Tipi</label><select class=\"form-control\" [(ngModel)]=\"template.form.averageMode\" [disabled]=\"!canEdit\"><option value=\"Arithmetic\">Aritmetik</option><option value=\"Weighted\">Miktar a\u011F\u0131rl\u0131kl\u0131</option></select></div><div class=\"col-md-4\"><label>Miktar Birimi</label><select class=\"form-control\" [(ngModel)]=\"template.form.quantityUnit\" [disabled]=\"!canEdit\"><option value=\"kg\">Kilogram</option><option value=\"t\">Ton</option></select></div></div>\r\n <button class=\"btn btn-outline-primary mt-3\" *ngIf=\"canEdit\" (click)=\"editForm()\" [disabled]=\"busy\">Ba\u015Fl\u0131\u011F\u0131 Kaydet</button>\r\n </div>\r\n\r\n <div class=\"table-responsive\">\r\n <table class=\"table table-bordered table-striped table-sm parameter-table\">\r\n <thead><tr><th>\u0130\u015Flemler</th><th *ngIf=\"controlType === 'Process'\">Proses Ad\u0131m\u0131</th><th>S\u0131ra</th><th>Kod</th><th>Parametre / Soru</th><th>Birim</th><th>Veri Tipi</th><th>Limit / Nominal</th><th>Durum</th></tr></thead>\r\n <tbody>\r\n <tr *ngFor=\"let parameter of orderedParameters()\">\r\n <td class=\"actions\">\r\n <button class=\"btn btn-sm btn-outline-primary mr-1\" *ngIf=\"canEdit\" (click)=\"editParameter(parameter)\">D\u00FCzenle</button>\r\n <button class=\"btn btn-sm btn-outline-secondary mr-1\" *ngIf=\"canCreate\" (click)=\"addLimit(parameter)\">+ Limit</button>\r\n <button class=\"btn btn-sm btn-outline-danger\" *ngIf=\"canDelete && parameter.active\" (click)=\"deleteParameter(parameter)\">Sil</button>\r\n </td>\r\n <td *ngIf=\"controlType === 'Process'\">{{ processName(parameter.stepCode) }}</td><td>{{ parameter.order }}</td>\r\n <td><code>{{ parameter.code }}</code></td><td>{{ parameter.name }}</td><td>{{ parameter.unit || '\u2014' }}</td>\r\n <td>{{ parameter.valueType }}<span *ngIf=\"parameter.calculated\"> / Hesaplanan</span></td>\r\n <td>\r\n <div *ngFor=\"let limit of limitsFor(parameter.code)\">\r\n <button type=\"button\" class=\"btn btn-link btn-sm p-0 limit-link\" (click)=\"editLimit(limit)\">{{ limit.code }}</button>:\r\n <span *ngIf=\"limit.oilType\">{{ limit.oilType }} \u00B7 </span>\r\n <span *ngIf=\"limit.origin\">{{ limit.origin === 'Imported' ? '\u0130thal' : '\u0130\u00E7 Piyasa' }} \u00B7 </span>\r\n <span *ngIf=\"limit.minimum != null\">Min {{ limit.minimum }} </span>\r\n <span *ngIf=\"limit.maximum != null\">Max {{ limit.maximum }} </span>\r\n <span *ngIf=\"limit.nominal != null\">Nominal {{ limit.nominal }} </span>\r\n <span *ngIf=\"limit.expectedText\">{{ limit.expectedText }}</span>\r\n <span *ngIf=\"!limit.active\" class=\"text-muted\">(pasif)</span>\r\n </div>\r\n </td>\r\n <td>{{ parameter.active ? 'Aktif' : 'Pasif' }}</td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n\r\n </div>\r\n </ng-container>\r\n </div></div>\r\n</div>\r\n\r\n<abp-modal [visible]=\"parameterModalVisible\" (visibleChange)=\"parameterModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newParameter ? 'Yeni Parametre' : 'Parametreyi D\u00FCzenle' }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingParameter as parameter\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"parameter.code\" [disabled]=\"!newParameter\" /></div>\r\n <div class=\"col-md-4\"><label>Ad / Soru</label><input class=\"form-control\" [(ngModel)]=\"parameter.name\" /></div>\r\n <div class=\"col-md-4\" *ngIf=\"controlType === 'Process'\"><label>Proses Ad\u0131m\u0131</label><select class=\"form-control\" [(ngModel)]=\"parameter.stepCode\"><option *ngFor=\"let step of steps()\" [value]=\"step.processCode\">{{ step.name }}</option></select></div>\r\n <div class=\"col-md-4\"><label>S\u0131ra</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"parameter.order\" /></div>\r\n <div class=\"col-md-4\"><label>Birim</label><input class=\"form-control\" [(ngModel)]=\"parameter.unit\" /></div>\r\n <div class=\"col-md-4\"><label>Veri Tipi</label><select class=\"form-control\" [(ngModel)]=\"parameter.valueType\"><option value=\"Number\">Say\u0131sal</option><option value=\"Text\">Metin</option><option value=\"Choice\">Se\u00E7im</option></select></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ondal\u0131k Basamak</label><input type=\"number\" min=\"0\" max=\"8\" class=\"form-control\" [(ngModel)]=\"parameter.decimalPlaces\" /></div>\r\n <div class=\"col-md-4\"><label>Se\u00E7enekler (virg\u00FClle ayr\u0131lm\u0131\u015F)</label><input class=\"form-control\" [(ngModel)]=\"optionsText\" [disabled]=\"parameter.valueType !== 'Choice'\" /></div>\r\n <div class=\"col-md-4\"><label>Hesaplama Form\u00FCl\u00FC</label><input class=\"form-control\" [(ngModel)]=\"parameter.formula\" [disabled]=\"!parameter.calculated\" placeholder=\"PARAM_KODU * 2\" /></div>\r\n <div class=\"col-md-4 d-flex flex-column justify-content-end\"><label><input type=\"checkbox\" [(ngModel)]=\"parameter.required\" /> Zorunlu</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.calculated\" /> Hesaplanan</label><label><input type=\"checkbox\" [(ngModel)]=\"parameter.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeParameterModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveParameter()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n\r\n<abp-modal [visible]=\"limitModalVisible\" (visibleChange)=\"limitModalChanged($event)\"\r\n [busy]=\"busy\" [options]=\"editorModalOptions\" [suppressUnsavedChangesWarning]=\"true\">\r\n <ng-template #abpHeader>\r\n <h5 class=\"modal-title\">{{ newLimit ? 'Yeni Limit' : 'Limiti D\u00FCzenle' }} \u2013 {{ editingLimit?.parameterCode }}</h5>\r\n </ng-template>\r\n <ng-template #abpBody>\r\n <div *ngIf=\"modalError\" class=\"alert alert-danger\" role=\"alert\">{{ modalError }}</div>\r\n <div *ngIf=\"busy\" class=\"d-flex align-items-center mb-3\" role=\"status\" aria-live=\"polite\">\r\n <span class=\"spinner-border spinner-border-sm text-primary mr-2\" aria-hidden=\"true\"></span>\r\n <span>{{ busyText }}</span>\r\n </div>\r\n <fieldset *ngIf=\"editingLimit as limit\" [disabled]=\"busy\" class=\"border-0 p-0 m-0\">\r\n <div class=\"row\">\r\n <div class=\"col-md-4\"><label>Kod</label><input class=\"form-control\" [(ngModel)]=\"limit.code\" [disabled]=\"!newLimit\" /></div>\r\n <div class=\"col-md-4\"><label>Ya\u011F Cinsi / Ko\u015Ful</label><select class=\"form-control\" [(ngModel)]=\"limit.oilType\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Palm Oil\">Palm Oil</option><option value=\"Palm Olein\">Palm Olein</option></select></div>\r\n <div class=\"col-md-4\"><label>Men\u015Fei</label><select class=\"form-control\" [(ngModel)]=\"limit.origin\"><option value=\"\">T\u00FCm\u00FC</option><option value=\"Domestic\">\u0130\u00E7 Piyasa</option><option value=\"Imported\">\u0130thal</option></select></div>\r\n <div class=\"col-md-4\"><label>Min</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.minimum\" /></div>\r\n <div class=\"col-md-4\"><label>Max</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.maximum\" /></div>\r\n <div class=\"col-md-4\"><label>Nominal</label><input type=\"number\" class=\"form-control\" [(ngModel)]=\"limit.nominal\" /></div>\r\n <div class=\"col-md-4\"><label>Beklenen Metin</label><input class=\"form-control\" [(ngModel)]=\"limit.expectedText\" /></div>\r\n </div>\r\n <div class=\"row mt-2\">\r\n <div class=\"col-md-4\"><label>Ba\u015Flang\u0131\u00E7</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validFrom\" /></div>\r\n <div class=\"col-md-4\"><label>Biti\u015F</label><input type=\"date\" class=\"form-control\" [(ngModel)]=\"limit.validUntil\" /></div>\r\n <div class=\"col-md-4 d-flex align-items-end\"><label><input type=\"checkbox\" [(ngModel)]=\"limit.active\" /> Aktif</label></div>\r\n </div>\r\n </fieldset>\r\n </ng-template>\r\n <ng-template #abpFooter>\r\n <button type=\"button\" class=\"btn btn-outline-danger\" *ngIf=\"!newLimit && canDelete\"\r\n (click)=\"deleteLimit(editingLimit!)\" [disabled]=\"busy\">Sil</button>\r\n <button type=\"button\" class=\"btn btn-secondary\" (click)=\"closeLimitModal()\" [disabled]=\"busy\">\u0130ptal</button>\r\n <button type=\"button\" class=\"btn btn-primary\" (click)=\"saveLimit()\" [disabled]=\"busy\">Kaydet</button>\r\n </ng-template>\r\n</abp-modal>\r\n", styles: [".form-header{background:#f7f8fa;border:1px solid #e3e6eb}.parameter-table{min-width:1100px}.parameter-table .actions{white-space:nowrap}.parameter-table .limit-link{color:#007bff}.parameter-table .limit-link:hover,.parameter-table .limit-link:focus{color:#0056b3}.editor-card{border-color:#8864ac;scroll-margin-top:90px}.editor-card:focus{outline:2px solid #8864ac;outline-offset:2px}.step-pill{display:inline-block;margin:0 .4rem .4rem 0}.quality-grid-loading{min-height:280px;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;background:#f8f9fa;border:1px solid #dee2e6;border-radius:4px;color:#495057}\n"] }]
328
+ }], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }, { type: i0.ChangeDetectorRef }, { type: i3.ActivatedRoute }]; }, propDecorators: { stepEditor: [{
329
+ type: ViewChild,
330
+ args: ['stepEditor']
331
+ }] } });
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1wYXJhbWV0ZXJzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBcUIsU0FBUyxFQUFzQixTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUFjLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN6QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFNMUMsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQzs7Ozs7Ozs7QUFPM0UsTUFBTSxPQUFPLDBCQUEwQjtJQWlDckMsWUFDVSxHQUFzQixFQUN0QixXQUE4QixFQUM5QixjQUFpQyxFQUNqQyxLQUFxQjtRQUhyQixRQUFHLEdBQUgsR0FBRyxDQUFtQjtRQUN0QixnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFDOUIsbUJBQWMsR0FBZCxjQUFjLENBQW1CO1FBQ2pDLFVBQUssR0FBTCxLQUFLLENBQWdCO1FBcEMvQixnQkFBVyxHQUF3QixTQUFTLENBQUM7UUFDN0Msa0JBQWEsR0FBbUIsRUFBRSxDQUFDO1FBQ25DLG9CQUFlLEdBQXFCLEVBQUUsQ0FBQztRQUN2QyxxQkFBZ0IsR0FBRyxFQUFFLENBQUM7UUFDdEIsdUJBQWtCLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsS0FBSyxDQUFDO1FBR3JCLFVBQUssR0FBa0IsRUFBRSxDQUFDO1FBQzFCLGVBQVUsR0FBc0IsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQUcsRUFB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RUQsV0FBVyxDQUFDLEtBQW1CO1FBQzdCLElBQUksSUFBSSxDQUFDLElBQUk7WUFBRSxPQUFPO1FBQ3RCLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxLQUFLLENBQUMsSUFBSSxvQ0FBb0MsQ0FBQztZQUFFLE9BQU87UUFDeEUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsNkJBQTZCLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDcEYsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0QsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFO2dCQUNULElBQUksSUFBSSxDQUFDLGlCQUFpQjtvQkFBRSxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQzs7b0JBQ3pELElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3BDLENBQUM7U0FDRixDQUFDLENBQUM7SUFDTCxDQUFDOzt1SEF0U1UsMEJBQTBCOzJHQUExQiwwQkFBMEIsd0tDZnZDLDhoZ0JBZ0xBOzJGRGpLYSwwQkFBMEI7a0JBTHRDLFNBQVM7K0JBQ0Usd0JBQXdCO3FNQVdELFVBQVU7c0JBQTFDLFNBQVM7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdG9yUmVmLCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIE9uSW5pdCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IE9ic2VydmFibGUsIGRlZmVyIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGZpbmFsaXplIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBQZXJtaXNzaW9uU2VydmljZSB9IGZyb20gJ0BhYnAvbmcuY29yZSc7XHJcbmltcG9ydCB7IFF1YWxpdHlGYWNpbGl0eSwgUXVhbGl0eUZvcm0sIFF1YWxpdHlMaW1pdCwgUXVhbGl0eVBhcmFtZXRlciwgUXVhbGl0eVN0ZXAsIFF1YWxpdHlUZW1wbGF0ZSB9IGZyb20gJy4uL21vZGVscy9xdWFsaXR5Lm1vZGVscyc7XHJcbmltcG9ydCB7IFF1YWxpdHlBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1hcGkuc2VydmljZSc7XHJcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgTW92ZW1lbnREZXRhaWwsIE1vdmVtZW50VHlwZSB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgZXJyb3JNZXNzYWdlLCBsb2NhbERhdGUgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWFsaXR5LW1lYXN1cmVtZW50cyc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LXBhcmFtZXRlcnMnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9xdWFsaXR5LXBhcmFtZXRlcnMuY29tcG9uZW50Lmh0bWwnLFxyXG4gIHN0eWxlVXJsczogWycuL3F1YWxpdHktcGFyYW1ldGVycy5jb21wb25lbnQuc2NzcyddLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgUXVhbGl0eVBhcmFtZXRlcnNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIGNvbnRyb2xUeXBlOiAnSW5wdXQnIHwgJ1Byb2Nlc3MnID0gJ1Byb2Nlc3MnO1xyXG4gIG1vdmVtZW50VHlwZXM6IE1vdmVtZW50VHlwZVtdID0gW107XHJcbiAgbW92ZW1lbnREZXRhaWxzOiBNb3ZlbWVudERldGFpbFtdID0gW107XHJcbiAgbW92ZW1lbnRUeXBlQ29kZSA9ICcnO1xyXG4gIG1vdmVtZW50RGV0YWlsQ29kZSA9ICcnO1xyXG4gIG5ld0lucHV0Rm9ybSA9IGZhbHNlO1xyXG4gIEBWaWV3Q2hpbGQoJ3N0ZXBFZGl0b3InKSBwcml2YXRlIHN0ZXBFZGl0b3I/OiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PjtcclxuXHJcbiAgZm9ybXM6IFF1YWxpdHlGb3JtW10gPSBbXTtcclxuICBmYWNpbGl0aWVzOiBRdWFsaXR5RmFjaWxpdHlbXSA9IFtdO1xyXG4gIGZhY2lsaXR5Q29kZSA9ICcnO1xyXG4gIGZhY2lsaXR5U3RlcHM6IFF1YWxpdHlTdGVwW10gPSBbXTtcclxuICBlZGl0aW5nU3RlcDogUXVhbGl0eVN0ZXAgfCBudWxsID0gbnVsbDtcclxuICBuZXdTdGVwID0gZmFsc2U7XHJcbiAgZm9ybUNvZGUgPSAnJztcclxuICB0ZW1wbGF0ZTogUXVhbGl0eVRlbXBsYXRlIHwgbnVsbCA9IG51bGw7XHJcbiAgZWRpdGluZ1BhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlciB8IG51bGwgPSBudWxsO1xyXG4gIGVkaXRpbmdMaW1pdDogUXVhbGl0eUxpbWl0IHwgbnVsbCA9IG51bGw7XHJcbiAgbmV3UGFyYW1ldGVyID0gZmFsc2U7XHJcbiAgbmV3TGltaXQgPSBmYWxzZTtcclxuICBwYXJhbWV0ZXJNb2RhbFZpc2libGUgPSBmYWxzZTtcclxuICBsaW1pdE1vZGFsVmlzaWJsZSA9IGZhbHNlO1xyXG4gIG1vZGFsRXJyb3IgPSAnJztcclxuICByZWFkb25seSBlZGl0b3JNb2RhbE9wdGlvbnMgPSB7IHNpemU6ICd4bCcgYXMgY29uc3QsIGNlbnRlcmVkOiB0cnVlIH07XHJcbiAgb3B0aW9uc1RleHQgPSAnJztcclxuICBwcml2YXRlIHBlbmRpbmdSZXF1ZXN0cyA9IDA7XHJcbiAgYnVzeVRleHQgPSAnS2FsaXRlIHRhbsSxbWxhcsSxIHnDvGtsZW5peW9y4oCmJztcclxuXHJcbiAgZ2V0IGJ1c3koKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBlbmRpbmdSZXF1ZXN0cyA+IDA7IH1cclxuICBlcnJvciA9ICcnO1xyXG4gIHN1Y2Nlc3MgPSAnJztcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsXHJcbiAgICBwcml2YXRlIHBlcm1pc3Npb25zOiBQZXJtaXNzaW9uU2VydmljZSxcclxuICAgIHByaXZhdGUgY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgcHJpdmF0ZSByb3V0ZTogQWN0aXZhdGVkUm91dGUsXHJcbiAgKSB7fVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCd0eXBlJykgPT09ICdJbnB1dCcpIHRoaXMuY29udHJvbFR5cGUgPSAnSW5wdXQnO1xyXG4gICAgdGhpcy5tb3ZlbWVudERldGFpbENvZGUgPSB0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuZ2V0KCdkZXRhaWwnKSB8fCAnJztcclxuICAgIHRoaXMuYXBpLnF1YWxpdHlNb3ZlbWVudFR5cGVzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB0aGlzLm1vdmVtZW50VHlwZXMgPSB4LCBlcnJvcjogZSA9PiB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpIH0pO1xyXG4gICAgdGhpcy5hcGkubW92ZW1lbnREZXRhaWxzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB7XHJcbiAgICAgIHRoaXMubW92ZW1lbnREZXRhaWxzID0geC5maWx0ZXIoZCA9PiBkLmFjdGl2ZSk7XHJcbiAgICAgIHRoaXMubW92ZW1lbnRUeXBlQ29kZSA9IHguZmluZChkID0+IGQuY29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpPy5tb3ZlbWVudFR5cGVDb2RlIHx8ICcnO1xyXG4gICAgICBpZiAodGhpcy5jb250cm9sVHlwZSA9PT0gJ0lucHV0JykgdGhpcy5zZWxlY3RJbnB1dCgpO1xyXG4gICAgfSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkucGFyYW1ldGVyRmFjaWxpdGllcygpLCAnS2FsaXRlIHRhbsSxbWxhcsSxIHnDvGtsZW5peW9y4oCmJykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogZmFjaWxpdGllcyA9PiB7IHRoaXMuZmFjaWxpdGllcyA9IGZhY2lsaXRpZXM7IHRoaXMuc2VsZWN0RmFjaWxpdHkoKTsgaWYgKHRoaXMuZmFjaWxpdHlDb2RlKSB0aGlzLmxvYWRTdGVwcygpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdUZXNpcyBsaXN0ZXNpIHnDvGtsZW5lbWVkaS4nLFxyXG4gICAgfSk7XHJcbiAgICB0aGlzLnRyYWNrKHRoaXMuYXBpLmZvcm1zKCksICdLYWxpdGUgdGFuxLFtbGFyxLEgecO8a2xlbml5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiBmb3JtcyA9PiB7IHRoaXMuZm9ybXMgPSBmb3JtczsgdGhpcy5zd2l0Y2hUeXBlKHRoaXMuY29udHJvbFR5cGUpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdGb3JtIGxpc3Rlc2kgecO8a2xlbmVtZWRpLicsXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIGdldCBjYW5FZGl0KCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KCdLYWxpdGUuUGFyYW1ldGVycy5FZGl0Jyk7IH1cclxuICBnZXQgY2FuQ3JlYXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KCdLYWxpdGUuUGFyYW1ldGVycy5DcmVhdGUnKTsgfVxyXG4gIGdldCBjYW5EZWxldGUoKTogYm9vbGVhbiB7IHJldHVybiB0aGlzLnBlcm1pc3Npb25zLmdldEdyYW50ZWRQb2xpY3koJ0thbGl0ZS5QYXJhbWV0ZXJzLkRlbGV0ZScpOyB9XHJcblxyXG4gIGdldCB2aXNpYmxlRm9ybXMoKTogUXVhbGl0eUZvcm1bXSB7IHJldHVybiB0aGlzLmZvcm1zLmZpbHRlcihmID0+IChmLmNvbnRyb2xUeXBlIHx8ICdQcm9jZXNzJykgPT09IHRoaXMuY29udHJvbFR5cGUpOyB9XHJcbiAgZ2V0IHZpc2libGVEZXRhaWxzKCk6IE1vdmVtZW50RGV0YWlsW10geyByZXR1cm4gdGhpcy5tb3ZlbWVudERldGFpbHMuZmlsdGVyKGQgPT4gIXRoaXMubW92ZW1lbnRUeXBlQ29kZSB8fCBkLm1vdmVtZW50VHlwZUNvZGUgPT09IHRoaXMubW92ZW1lbnRUeXBlQ29kZSk7IH1cclxuICBzd2l0Y2hUeXBlKHR5cGU6ICdJbnB1dCcgfCAnUHJvY2VzcycpOiB2b2lkIHtcclxuICAgIHRoaXMuY29udHJvbFR5cGUgPSB0eXBlOyB0aGlzLmVkaXRpbmdTdGVwID0gbnVsbDsgdGhpcy5mYWNpbGl0eVN0ZXBzID0gW107IHRoaXMudGVtcGxhdGUgPSBudWxsO1xyXG4gICAgaWYgKHR5cGUgPT09ICdJbnB1dCcpIHRoaXMuc2VsZWN0SW5wdXQoKTtcclxuICAgIGVsc2UgeyB0aGlzLmZvcm1Db2RlID0gdGhpcy52aXNpYmxlRm9ybXNbMF0/LmNvZGUgfHwgJyc7IHRoaXMubmV3SW5wdXRGb3JtID0gZmFsc2U7IHRoaXMubG9hZCgpOyB9XHJcbiAgfVxyXG4gIHNlbGVjdElucHV0KCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnZpc2libGVEZXRhaWxzLnNvbWUoZCA9PiBkLmNvZGUgPT09IHRoaXMubW92ZW1lbnREZXRhaWxDb2RlKSkgdGhpcy5tb3ZlbWVudERldGFpbENvZGUgPSB0aGlzLnZpc2libGVEZXRhaWxzWzBdPy5jb2RlIHx8ICcnO1xyXG4gICAgY29uc3QgZm9ybSA9IHRoaXMudmlzaWJsZUZvcm1zLmZpbmQoZiA9PiBmLm1vdmVtZW50RGV0YWlsQ29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpO1xyXG4gICAgaWYgKGZvcm0pIHsgdGhpcy5mb3JtQ29kZSA9IGZvcm0uY29kZTsgdGhpcy5uZXdJbnB1dEZvcm0gPSBmYWxzZTsgdGhpcy5sb2FkKCk7IHJldHVybjsgfVxyXG4gICAgY29uc3QgZGV0YWlsID0gdGhpcy5tb3ZlbWVudERldGFpbHMuZmluZChkID0+IGQuY29kZSA9PT0gdGhpcy5tb3ZlbWVudERldGFpbENvZGUpO1xyXG4gICAgdGhpcy5uZXdJbnB1dEZvcm0gPSAhIWRldGFpbDsgdGhpcy5mb3JtQ29kZSA9IGRldGFpbCA/ICdJTl8nICsgZGV0YWlsLmNvZGUgOiAnJztcclxuICAgIHRoaXMudGVtcGxhdGUgPSBkZXRhaWwgPyB7IGZvcm06IHsgY29kZTogdGhpcy5mb3JtQ29kZSwgY29udHJvbFR5cGU6ICdJbnB1dCcsIG1vdmVtZW50RGV0YWlsQ29kZTogZGV0YWlsLmNvZGUsXHJcbiAgICAgIGF2ZXJhZ2VNb2RlOiAnQXJpdGhtZXRpYycsIG5hbWU6IGRldGFpbC5uYW1lIHx8IHRoaXMubW92ZW1lbnRUeXBlcy5maW5kKHQgPT4gdC5jb2RlID09PSBkZXRhaWwubW92ZW1lbnRUeXBlQ29kZSk/Lm5hbWUgfHwgJycsXHJcbiAgICAgIGRvY3VtZW50Q29kZTogJycsIHB1YmxpY2F0aW9uRGF0ZTogbG9jYWxEYXRlKCksIHJldmlzaW9uRGF0ZTogbG9jYWxEYXRlKCksIHJldmlzaW9uTnVtYmVyOiAnMScsIGFjdGl2ZTogdHJ1ZSB9LFxyXG4gICAgICBwYXJhbWV0ZXJzOiBbXSwgbGltaXRzOiBbXSwgc3RlcHM6IFtdIH0gOiBudWxsO1xyXG4gIH1cclxuXHJcbiAgbG9hZCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5mb3JtQ29kZSkgcmV0dXJuO1xyXG4gICAgaWYgKHRoaXMuY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJykgeyB0aGlzLnNlbGVjdEZhY2lsaXR5KCk7IGlmICh0aGlzLmZhY2lsaXR5Q29kZSkgdGhpcy5sb2FkU3RlcHMoKTsgfVxyXG4gICAgdGhpcy5lcnJvciA9ICcnO1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS50ZW1wbGF0ZSh0aGlzLmZvcm1Db2RlKSwgJ0thbGl0ZSB0YW7EsW1sYXLEsSB5w7xrbGVuaXlvcuKApicpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IHRlbXBsYXRlID0+IHtcclxuICAgICAgICB0ZW1wbGF0ZS5mb3JtLnB1YmxpY2F0aW9uRGF0ZSA9IHRlbXBsYXRlLmZvcm0ucHVibGljYXRpb25EYXRlPy5zbGljZSgwLCAxMCk7XHJcbiAgICAgICAgdGVtcGxhdGUuZm9ybS5yZXZpc2lvbkRhdGUgPSB0ZW1wbGF0ZS5mb3JtLnJldmlzaW9uRGF0ZT8uc2xpY2UoMCwgMTApO1xyXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTtcclxuICAgICAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsO1xyXG4gICAgICAgIHRoaXMuZWRpdGluZ0xpbWl0ID0gbnVsbDtcclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdGb3JtIHRhbsSxbcSxIHnDvGtsZW5lbWVkaS4nOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHJldmVhbFN0ZXBFZGl0b3IoKTogdm9pZCB7XHJcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIHRoaXMuc3RlcEVkaXRvcj8ubmF0aXZlRWxlbWVudC5zY3JvbGxJbnRvVmlldyh7IGJlaGF2aW9yOiAnc21vb3RoJywgYmxvY2s6ICdzdGFydCcgfSk7XHJcbiAgICB0aGlzLnN0ZXBFZGl0b3I/Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoeyBwcmV2ZW50U2Nyb2xsOiB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcGFyYW1ldGVyTW9kYWxDaGFuZ2VkKHZpc2libGU6IGJvb2xlYW4pOiB2b2lkIHtcclxuICAgIHRoaXMucGFyYW1ldGVyTW9kYWxWaXNpYmxlID0gdmlzaWJsZTtcclxuICAgIGlmICghdmlzaWJsZSkgeyB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgfVxyXG4gIH1cclxuXHJcbiAgbGltaXRNb2RhbENoYW5nZWQodmlzaWJsZTogYm9vbGVhbik6IHZvaWQge1xyXG4gICAgdGhpcy5saW1pdE1vZGFsVmlzaWJsZSA9IHZpc2libGU7XHJcbiAgICBpZiAoIXZpc2libGUpIHsgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgfVxyXG4gIH1cclxuXHJcbiAgY2xvc2VQYXJhbWV0ZXJNb2RhbCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5idXN5KSB0aGlzLnBhcmFtZXRlck1vZGFsQ2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBjbG9zZUxpbWl0TW9kYWwoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuYnVzeSkgdGhpcy5saW1pdE1vZGFsQ2hhbmdlZChmYWxzZSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIHRyYWNrPFQ+KHJlcXVlc3Q6IE9ic2VydmFibGU8VD4sIG1lc3NhZ2U6IHN0cmluZyk6IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIGRlZmVyKCgpID0+IHtcclxuICAgICAgdGhpcy5wZW5kaW5nUmVxdWVzdHMrKztcclxuICAgICAgdGhpcy5idXN5VGV4dCA9IG1lc3NhZ2U7XHJcbiAgICAgIHJldHVybiByZXF1ZXN0LnBpcGUoZmluYWxpemUoKCkgPT4gdGhpcy5wZW5kaW5nUmVxdWVzdHMtLSkpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcm9jZXNzTmFtZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHRoaXMudGVtcGxhdGU/LnN0ZXBzLmZpbmQoc3RlcCA9PiBzdGVwLnByb2Nlc3NDb2RlID09PSBjb2RlKT8ubmFtZSB8fCBjb2RlO1xyXG4gIH1cclxuXHJcbiAgc3RlcHMoKTogUXVhbGl0eVN0ZXBbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYWNpbGl0eVN0ZXBzLmZpbHRlcih4ID0+IHguYWN0aXZlKTtcclxuICB9XHJcblxyXG4gIG1hdGNoaW5nRmFjaWxpdGllcygpOiBRdWFsaXR5RmFjaWxpdHlbXSB7XHJcbiAgICByZXR1cm4gdGhpcy5mYWNpbGl0aWVzLmZpbHRlcih4ID0+IHguZm9ybUNvZGUgPT09IHRoaXMuZm9ybUNvZGUpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0RmFjaWxpdHkoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMubWF0Y2hpbmdGYWNpbGl0aWVzKCkuc29tZSh4ID0+IHguY29kZSA9PT0gdGhpcy5mYWNpbGl0eUNvZGUpKVxyXG4gICAgICB0aGlzLmZhY2lsaXR5Q29kZSA9IHRoaXMubWF0Y2hpbmdGYWNpbGl0aWVzKClbMF0/LmNvZGUgfHwgJyc7XHJcbiAgfVxyXG5cclxuICBsb2FkU3RlcHMoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZmFjaWxpdHlDb2RlKSByZXR1cm47XHJcbiAgICB0aGlzLnRyYWNrKHRoaXMuYXBpLnN0ZXBzKHRoaXMuZmFjaWxpdHlDb2RlKSwgJ0thbGl0ZSB0YW7EsW1sYXLEsSB5w7xrbGVuaXlvcuKApicpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IHN0ZXBzID0+IHRoaXMuZmFjaWxpdHlTdGVwcyA9IHN0ZXBzLFxyXG4gICAgICBlcnJvcjogKCkgPT4gdGhpcy5lcnJvciA9ICdQcm9zZXMgYWTEsW1sYXLEsSB5w7xrbGVuZW1lZGkuJyxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkU3RlcCgpOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U3RlcCA9IHRydWU7XHJcbiAgICB0aGlzLmVkaXRpbmdTdGVwID0geyBjb2RlOiAnJywgZmFjaWxpdHlDb2RlOiB0aGlzLmZhY2lsaXR5Q29kZSwgcHJvY2Vzc0NvZGU6ICcnLFxyXG4gICAgICBuYW1lOiAnJywgb3JkZXI6IHRoaXMuZmFjaWxpdHlTdGVwcy5sZW5ndGggKyAxLCBhY3RpdmU6IHRydWUgfTtcclxuICAgIHRoaXMucmV2ZWFsU3RlcEVkaXRvcigpO1xyXG4gIH1cclxuXHJcbiAgZWRpdFN0ZXAoc3RlcDogUXVhbGl0eVN0ZXApOiB2b2lkIHtcclxuICAgIHRoaXMubmV3U3RlcCA9IGZhbHNlO1xyXG4gICAgdGhpcy5lZGl0aW5nU3RlcCA9IHsgLi4uc3RlcCB9O1xyXG4gICAgdGhpcy5yZXZlYWxTdGVwRWRpdG9yKCk7XHJcbiAgfVxyXG5cclxuICBzYXZlU3RlcCgpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5lZGl0aW5nU3RlcCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc3RlcCA9IHsgLi4udGhpcy5lZGl0aW5nU3RlcCxcclxuICAgICAgY29kZTogdGhpcy5lZGl0aW5nU3RlcC5jb2RlLnRyaW0oKS50b1VwcGVyQ2FzZSgpLFxyXG4gICAgICBwcm9jZXNzQ29kZTogdGhpcy5lZGl0aW5nU3RlcC5wcm9jZXNzQ29kZS50cmltKCkudG9VcHBlckNhc2UoKSxcclxuICAgICAgbmFtZTogdGhpcy5lZGl0aW5nU3RlcC5uYW1lLnRyaW0oKSB9O1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS5zYXZlU3RlcChzdGVwKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMuZWRpdGluZ1N0ZXAgPSBudWxsOyB0aGlzLnN1Y2Nlc3MgPSAnUHJvc2VzIGFkxLFtxLEga2F5ZGVkaWxkaS4nOyB0aGlzLmxvYWRTdGVwcygpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLmVycm9yID0gJ1Byb3NlcyBhZMSxbcSxIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgb3JkZXJlZFBhcmFtZXRlcnMoKTogUXVhbGl0eVBhcmFtZXRlcltdIHtcclxuICAgIGNvbnN0IG9yZGVyID0gdGhpcy5zdGVwcygpLm1hcChzdGVwID0+IHN0ZXAucHJvY2Vzc0NvZGUpO1xyXG4gICAgcmV0dXJuIFsuLi4odGhpcy50ZW1wbGF0ZT8ucGFyYW1ldGVycyB8fCBbXSldLnNvcnQoKGEsIGIpID0+XHJcbiAgICAgIG9yZGVyLmluZGV4T2YoYS5zdGVwQ29kZSkgLSBvcmRlci5pbmRleE9mKGIuc3RlcENvZGUpIHx8IGEub3JkZXIgLSBiLm9yZGVyKTtcclxuICB9XHJcblxyXG4gIGxpbWl0c0Zvcihjb2RlOiBzdHJpbmcpOiBRdWFsaXR5TGltaXRbXSB7XHJcbiAgICByZXR1cm4gdGhpcy50ZW1wbGF0ZT8ubGltaXRzLmZpbHRlcihsaW1pdCA9PiBsaW1pdC5wYXJhbWV0ZXJDb2RlID09PSBjb2RlKSB8fCBbXTtcclxuICB9XHJcblxyXG4gIGVkaXRGb3JtKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlIHx8ICF0aGlzLmNhbkVkaXQpIHJldHVybjtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkuc2F2ZUZvcm0odGhpcy50ZW1wbGF0ZS5mb3JtKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMuc3VjY2VzcyA9ICdGb3JtIGJhxZ9sxLHEn8SxIGtheWRlZGlsZGkuJzsgdGhpcy5uZXdJbnB1dEZvcm0gPSBmYWxzZTtcclxuICAgICAgICB0aGlzLmFwaS5mb3JtcygpLnN1YnNjcmliZSh7IG5leHQ6IGZvcm1zID0+IHsgdGhpcy5mb3JtcyA9IGZvcm1zOyB0aGlzLmxvYWQoKTsgfSB9KTsgfSxcclxuICAgICAgZXJyb3I6ICgpID0+IHsgdGhpcy5lcnJvciA9ICdGb3JtIGJhxZ9sxLHEn8SxIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkUGFyYW1ldGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLnRlbXBsYXRlIHx8IHRoaXMubmV3SW5wdXRGb3JtKSByZXR1cm47XHJcbiAgICB0aGlzLm5ld1BhcmFtZXRlciA9IHRydWU7XHJcbiAgICB0aGlzLm9wdGlvbnNUZXh0ID0gJyc7XHJcbiAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSB7XHJcbiAgICAgIGNvZGU6ICcnLCBmb3JtQ29kZTogdGhpcy5mb3JtQ29kZSwgc3RlcENvZGU6IHRoaXMudGVtcGxhdGUuc3RlcHNbMF0/LnByb2Nlc3NDb2RlIHx8ICcnLFxyXG4gICAgICBvcmRlcjogdGhpcy50ZW1wbGF0ZS5wYXJhbWV0ZXJzLmxlbmd0aCArIDEsIG5hbWU6ICcnLCB1bml0OiAnJywgdmFsdWVUeXBlOiAnTnVtYmVyJyxcclxuICAgICAgZGVjaW1hbFBsYWNlczogMiwgcmVxdWlyZWQ6IGZhbHNlLCBjYWxjdWxhdGVkOiBmYWxzZSwgZm9ybXVsYTogJycsIG9wdGlvbnM6IFtdLCBhY3RpdmU6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsO1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnBhcmFtZXRlck1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBlZGl0UGFyYW1ldGVyKHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHZvaWQge1xyXG4gICAgdGhpcy5uZXdQYXJhbWV0ZXIgPSBmYWxzZTtcclxuICAgIHRoaXMuZWRpdGluZ1BhcmFtZXRlciA9IHsgLi4ucGFyYW1ldGVyLCBvcHRpb25zOiBbLi4uKHBhcmFtZXRlci5vcHRpb25zIHx8IFtdKV0gfTtcclxuICAgIHRoaXMub3B0aW9uc1RleHQgPSB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIub3B0aW9ucy5qb2luKCcsICcpO1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSBudWxsO1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLnBhcmFtZXRlck1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzYXZlUGFyYW1ldGVyKCk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgfHwgdGhpcy5idXN5KSByZXR1cm47XHJcbiAgICBjb25zdCBwYXJhbWV0ZXIgPSB7IC4uLnRoaXMuZWRpdGluZ1BhcmFtZXRlcixcclxuICAgICAgY29kZTogdGhpcy5lZGl0aW5nUGFyYW1ldGVyLmNvZGUudHJpbSgpLnRvVXBwZXJDYXNlKCksXHJcbiAgICAgIG5hbWU6IHRoaXMuZWRpdGluZ1BhcmFtZXRlci5uYW1lLnRyaW0oKSxcclxuICAgICAgb3B0aW9uczogdGhpcy5vcHRpb25zVGV4dC5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbiksXHJcbiAgICB9O1xyXG4gICAgaWYgKCFwYXJhbWV0ZXIuY29kZSB8fCAhcGFyYW1ldGVyLm5hbWUgfHwgKHRoaXMuY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJyAmJiAhcGFyYW1ldGVyLnN0ZXBDb2RlKSkge1xyXG4gICAgICB0aGlzLm1vZGFsRXJyb3IgPSAnUGFyYW1ldHJlIGtvZHUsIGFkxLEgdmUgcHJvc2VzIGtvbnRyb2zDvG5kZSBwcm9zZXMgYWTEsW3EsSB6b3J1bmx1ZHVyLic7IHJldHVybjtcclxuICAgIH1cclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubmV3UGFyYW1ldGVyID8gdGhpcy5hcGkuY3JlYXRlUGFyYW1ldGVyKHBhcmFtZXRlcikgOiB0aGlzLmFwaS51cGRhdGVQYXJhbWV0ZXIocGFyYW1ldGVyKTtcclxuICAgIHRoaXMudHJhY2socmVxdWVzdCwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMucGFyYW1ldGVyTW9kYWxDaGFuZ2VkKGZhbHNlKTsgdGhpcy5zdWNjZXNzID0gJ1BhcmFtZXRyZSBrYXlkZWRpbGRpLic7IHRoaXMubG9hZCgpOyB9LFxyXG4gICAgICBlcnJvcjogKCkgPT4geyB0aGlzLm1vZGFsRXJyb3IgPSAnUGFyYW1ldHJlIGtheWRlZGlsZW1lZGkuJzsgfSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZGVsZXRlUGFyYW1ldGVyKHBhcmFtZXRlcjogUXVhbGl0eVBhcmFtZXRlcik6IHZvaWQge1xyXG4gICAgaWYgKCFjb25maXJtKGAke3BhcmFtZXRlci5uYW1lfSBwYXJhbWV0cmVzaSB2ZSBiYcSfbMSxIGxpbWl0bGVyaSBrYWzEsWPEsSBvbGFyYWsgc2lsaW5zaW4gbWk/YCkpIHJldHVybjtcclxuICAgIHRoaXMudHJhY2sodGhpcy5hcGkuZGVsZXRlUGFyYW1ldGVyKHBhcmFtZXRlci5jb2RlKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB0aGlzLmxvYWQoKSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgYWRkTGltaXQocGFyYW1ldGVyOiBRdWFsaXR5UGFyYW1ldGVyKTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld0xpbWl0ID0gdHJ1ZTtcclxuICAgIHRoaXMuZWRpdGluZ1BhcmFtZXRlciA9IG51bGw7XHJcbiAgICB0aGlzLmVkaXRpbmdMaW1pdCA9IHtcclxuICAgICAgY29kZTogJycsIHBhcmFtZXRlckNvZGU6IHBhcmFtZXRlci5jb2RlLCBvaWxUeXBlOiAnJywgb3JpZ2luOiAnJywgbWluaW11bTogbnVsbCwgbWF4aW11bTogbnVsbCxcclxuICAgICAgbm9taW5hbDogbnVsbCwgZXhwZWN0ZWRUZXh0OiAnJywgdmFsaWRGcm9tOiBudWxsLCB2YWxpZFVudGlsOiBudWxsLCBhY3RpdmU6IHRydWUsXHJcbiAgICB9O1xyXG4gICAgdGhpcy5tb2RhbEVycm9yID0gJyc7XHJcbiAgICB0aGlzLmxpbWl0TW9kYWxWaXNpYmxlID0gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGVkaXRMaW1pdChsaW1pdDogUXVhbGl0eUxpbWl0KTogdm9pZCB7XHJcbiAgICB0aGlzLm5ld0xpbWl0ID0gZmFsc2U7XHJcbiAgICB0aGlzLmVkaXRpbmdQYXJhbWV0ZXIgPSBudWxsO1xyXG4gICAgdGhpcy5lZGl0aW5nTGltaXQgPSB7IC4uLmxpbWl0LFxyXG4gICAgICB2YWxpZEZyb206IGxpbWl0LnZhbGlkRnJvbT8uc2xpY2UoMCwgMTApIHx8IG51bGwsXHJcbiAgICAgIHZhbGlkVW50aWw6IGxpbWl0LnZhbGlkVW50aWw/LnNsaWNlKDAsIDEwKSB8fCBudWxsLFxyXG4gICAgfTtcclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgdGhpcy5saW1pdE1vZGFsVmlzaWJsZSA9IHRydWU7XHJcbiAgfVxyXG5cclxuICBzYXZlTGltaXQoKTogdm9pZCB7XHJcbiAgICBpZiAoIXRoaXMuZWRpdGluZ0xpbWl0IHx8IHRoaXMuYnVzeSkgcmV0dXJuO1xyXG4gICAgY29uc3QgbGltaXQgPSB7IC4uLnRoaXMuZWRpdGluZ0xpbWl0LFxyXG4gICAgICBjb2RlOiB0aGlzLm5ld0xpbWl0ID8gdGhpcy5lZGl0aW5nTGltaXQuY29kZS50cmltKCkudG9VcHBlckNhc2UoKSA6IHRoaXMuZWRpdGluZ0xpbWl0LmNvZGUsXHJcbiAgICAgIG9pbFR5cGU6IHRoaXMuZWRpdGluZ0xpbWl0Lm9pbFR5cGU/LnRyaW0oKSB8fCAnJyxcclxuICAgIH07XHJcbiAgICBpZiAoIWxpbWl0LmNvZGUpIHsgdGhpcy5tb2RhbEVycm9yID0gJ0xpbWl0IGtvZHUgem9ydW5sdWR1ci4nOyByZXR1cm47IH1cclxuICAgIHRoaXMubW9kYWxFcnJvciA9ICcnO1xyXG4gICAgY29uc3QgcmVxdWVzdCA9IHRoaXMubmV3TGltaXQgPyB0aGlzLmFwaS5jcmVhdGVMaW1pdChsaW1pdCkgOiB0aGlzLmFwaS51cGRhdGVMaW1pdChsaW1pdCk7XHJcbiAgICB0aGlzLnRyYWNrKHJlcXVlc3QsICdEZcSfacWfaWtsaWtsZXIga2F5ZGVkaWxpeW9y4oCmJykuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKCkgPT4geyB0aGlzLmxpbWl0TW9kYWxDaGFuZ2VkKGZhbHNlKTsgdGhpcy5zdWNjZXNzID0gJ0xpbWl0IGtheWRlZGlsZGkuJzsgdGhpcy5sb2FkKCk7IH0sXHJcbiAgICAgIGVycm9yOiBlID0+IHsgdGhpcy5tb2RhbEVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBkZWxldGVMaW1pdChsaW1pdDogUXVhbGl0eUxpbWl0KTogdm9pZCB7XHJcbiAgICBpZiAodGhpcy5idXN5KSByZXR1cm47XHJcbiAgICBpZiAoIWNvbmZpcm0oYCR7bGltaXQuY29kZX0gbGltaXRpIGthbMSxY8SxIG9sYXJhayBzaWxpbnNpbiBtaT9gKSkgcmV0dXJuO1xyXG4gICAgdGhpcy50cmFjayh0aGlzLmFwaS5kZWxldGVMaW1pdChsaW1pdC5jb2RlKSwgJ0RlxJ9pxZ9pa2xpa2xlciBrYXlkZWRpbGl5b3LigKYnKS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAoKSA9PiB7IHRoaXMubGltaXRNb2RhbENoYW5nZWQoZmFsc2UpOyB0aGlzLmxvYWQoKTsgfSxcclxuICAgICAgZXJyb3I6IGUgPT4ge1xyXG4gICAgICAgIGlmICh0aGlzLmxpbWl0TW9kYWxWaXNpYmxlKSB0aGlzLm1vZGFsRXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7XHJcbiAgICAgICAgZWxzZSB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpO1xyXG4gICAgICB9LFxyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcbiIsIjxkaXYgY2xhc3M9XCJjb250YWluZXItZmx1aWRcIj5cclxuICA8ZGl2IGNsYXNzPVwibWItMlwiPlxyXG4gICAgPGgzIGNsYXNzPVwicGFnZS10aXRsZVwiPkthbGl0ZSBQYXJhbWV0cmVsZXJpIChLYWxpdGUgU29ydWxhcsSxKTwvaDM+XHJcbiAgPC9kaXY+XHJcblxyXG4gIDxkaXYgY2xhc3M9XCJjYXJkIG10LTJcIj48ZGl2IGNsYXNzPVwiY2FyZC1ib2R5XCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiYnRuLWdyb3VwIG1iLTNcIiByb2xlPVwidGFibGlzdFwiPjxidXR0b24gY2xhc3M9XCJidG5cIiBbY2xhc3MuYnRuLXByaW1hcnldPVwiY29udHJvbFR5cGUgPT09ICdJbnB1dCdcIiBbY2xhc3MuYnRuLW91dGxpbmUtc2Vjb25kYXJ5XT1cImNvbnRyb2xUeXBlICE9PSAnSW5wdXQnXCIgKGNsaWNrKT1cInN3aXRjaFR5cGUoJ0lucHV0JylcIj5HaXJkaSBLb250cm9sPC9idXR0b24+PGJ1dHRvbiBjbGFzcz1cImJ0blwiIFtjbGFzcy5idG4tcHJpbWFyeV09XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCJjb250cm9sVHlwZSAhPT0gJ1Byb2Nlc3MnXCIgKGNsaWNrKT1cInN3aXRjaFR5cGUoJ1Byb2Nlc3MnKVwiPlByb3NlcyBLb250cm9sPC9idXR0b24+PC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IG1iLTNcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnSW5wdXQnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvDwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibW92ZW1lbnRUeXBlQ29kZVwiIChjaGFuZ2UpPVwic2VsZWN0SW5wdXQoKVwiPjxvcHRpb24gdmFsdWU9XCJcIj5Uw7xtw7w8L29wdGlvbj48b3B0aW9uICpuZ0Zvcj1cImxldCB0eXBlIG9mIG1vdmVtZW50VHlwZXNcIiBbdmFsdWVdPVwidHlwZS5jb2RlXCI+e3sgdHlwZS5uYW1lIH19PC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNlwiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvCAvIERldGF5PC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJtb3ZlbWVudERldGFpbENvZGVcIiAoY2hhbmdlKT1cInNlbGVjdElucHV0KClcIj48b3B0aW9uIHZhbHVlPVwiXCI+U2XDp2luPC9vcHRpb24+PG9wdGlvbiAqbmdGb3I9XCJsZXQgZCBvZiB2aXNpYmxlRGV0YWlsc1wiIFt2YWx1ZV09XCJkLmNvZGVcIj57eyBkLm5hbWUgfHwgZC5tb3ZlbWVudFR5cGVDb2RlIH19e3sgZC5kZXRhaWxDb2RlID8gJyAvICcgKyBkLmRldGFpbENvZGUgOiAnIChkZXRheXPEsXopJyB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICA8cCBjbGFzcz1cImNvbC1tZC0xMiBtdC0yIHRleHQtbXV0ZWRcIiAqbmdJZj1cIiF2aXNpYmxlRGV0YWlscy5sZW5ndGhcIj7Dlm5jZSBLYWxpdGUgVGFuxLFtbGFyxLEgZWtyYW7EsW5kYSBrYWxpdGUga29udHJvbGUgdGFiaSBoYXJla2V0IHTDvHLDvG7DvCB0YW7EsW1sYXnEsW4uPC9wPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwicm93IGFsaWduLWl0ZW1zLWVuZCBtYi0zXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiICpuZ0lmPVwiY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJ1wiPlxyXG4gICAgICAgIDxsYWJlbCBmb3I9XCJmb3JtU2VsZWN0XCI+Rm9ybTwvbGFiZWw+XHJcbiAgICAgICAgPHNlbGVjdCBpZD1cImZvcm1TZWxlY3RcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFtkaXNhYmxlZF09XCJidXN5XCIgWyhuZ01vZGVsKV09XCJmb3JtQ29kZVwiIChjaGFuZ2UpPVwibG9hZCgpXCI+XHJcbiAgICAgICAgICA8b3B0aW9uICpuZ0Zvcj1cImxldCBmb3JtIG9mIHZpc2libGVGb3Jtc1wiIFt2YWx1ZV09XCJmb3JtLmNvZGVcIj57eyBmb3JtLmRvY3VtZW50Q29kZSB9fSDigJMge3sgZm9ybS5uYW1lIH19PC9vcHRpb24+XHJcbiAgICAgICAgPC9zZWxlY3Q+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTggdGV4dC1tZC1yaWdodCBtdC0yIG10LW1kLTBcIj5cclxuICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCIgKm5nSWY9XCJjYW5DcmVhdGVcIiAoY2xpY2spPVwiYWRkUGFyYW1ldGVyKClcIiBbZGlzYWJsZWRdPVwiYnVzeSB8fCAhdGVtcGxhdGUgfHwgbmV3SW5wdXRGb3JtXCI+KyBZZW5pIFBhcmFtZXRyZTwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj57eyBlcnJvciB9fTwvZGl2PlxyXG4gICAgPGRpdiAqbmdJZj1cInN1Y2Nlc3NcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LXN1Y2Nlc3NcIiAoY2xpY2spPVwic3VjY2VzcyA9ICcnXCI+e3sgc3VjY2VzcyB9fTwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cInF1YWxpdHktZ3JpZC1sb2FkaW5nXCIgKm5nSWY9XCJidXN5XCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiIGFyaWEtYnVzeT1cInRydWVcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJzcGlubmVyLWJvcmRlciB0ZXh0LXByaW1hcnlcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IGJ1c3lUZXh0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcblxyXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInRlbXBsYXRlXCI+XHJcbiAgICAgIDxkaXYgW2hpZGRlbl09XCJidXN5XCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJyb3cgYWxpZ24taXRlbXMtZW5kIG1iLTNcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnUHJvY2VzcydcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWwgZm9yPVwiZmFjaWxpdHlTZWxlY3RcIj5Qcm9zZXMgc8SxcmFzxLEgacOnaW4gdGVzaXM8L2xhYmVsPlxyXG4gICAgICAgICAgPHNlbGVjdCBpZD1cImZhY2lsaXR5U2VsZWN0XCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImZhY2lsaXR5Q29kZVwiIChjaGFuZ2UpPVwibG9hZFN0ZXBzKClcIj5cclxuICAgICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgZmFjaWxpdHkgb2YgbWF0Y2hpbmdGYWNpbGl0aWVzKClcIiBbdmFsdWVdPVwiZmFjaWxpdHkuY29kZVwiPnt7IGZhY2lsaXR5Lm5hbWUgfX08L29wdGlvbj5cclxuICAgICAgICAgIDwvc2VsZWN0PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOCB0ZXh0LW1kLXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5XCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT1cImFkZFN0ZXAoKVwiPisgUHJvc2VzIEFkxLFtxLE8L2J1dHRvbj48L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJtYi0zXCIgKm5nSWY9XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzdGVwLXBpbGxcIiAqbmdGb3I9XCJsZXQgc3RlcCBvZiBmYWNpbGl0eVN0ZXBzXCI+XHJcbiAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tc21cIiBbY2xhc3MuYnRuLW91dGxpbmUtcHJpbWFyeV09XCJzdGVwLmFjdGl2ZVwiIFtjbGFzcy5idG4tb3V0bGluZS1zZWNvbmRhcnldPVwiIXN0ZXAuYWN0aXZlXCJcclxuICAgICAgICAgICAgKGNsaWNrKT1cImVkaXRTdGVwKHN0ZXApXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCI+e3sgc3RlcC5vcmRlciB9fS4ge3sgc3RlcC5uYW1lIH19PHNwYW4gKm5nSWY9XCIhc3RlcC5hY3RpdmVcIj4gKHBhc2lmKTwvc3Bhbj48L2J1dHRvbj5cclxuICAgICAgICA8L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2ICNzdGVwRWRpdG9yIHRhYmluZGV4PVwiLTFcIiBjbGFzcz1cImNhcmQgbXQtMyBtYi0zIGVkaXRvci1jYXJkXCIgKm5nSWY9XCJlZGl0aW5nU3RlcCBhcyBzdGVwXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxyXG4gICAgICAgIDxoNT57eyBuZXdTdGVwID8gJ1llbmkgUHJvc2VzIEFkxLFtxLEnIDogJ1Byb3NlcyBBZMSxbcSxbsSxIETDvHplbmxlJyB9fTwvaDU+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPktvZDwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzdGVwLmNvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld1N0ZXBcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPlByb3NlcyBLb2R1PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN0ZXAucHJvY2Vzc0NvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld1N0ZXBcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkFkPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInN0ZXAubmFtZVwiIC8+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTJcIj48bGFiZWw+U8SxcmE8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzdGVwLm9yZGVyXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMiBkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInN0ZXAuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtMyBtci0yXCIgKGNsaWNrKT1cInNhdmVTdGVwKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPktheWRldDwvYnV0dG9uPlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeSBtdC0zXCIgKGNsaWNrKT1cImVkaXRpbmdTdGVwID0gbnVsbFwiPsSwcHRhbDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj48L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cImZvcm0taGVhZGVyIHJvdW5kZWQgcC0zIG1iLTNcIj5cclxuICAgICAgICA8cCAqbmdJZj1cIm5ld0lucHV0Rm9ybVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPsOWbmNlIGZvcm0gYmHFn2zEscSfxLFuxLEga2F5ZGVkaW4sIGFyZMSxbmRhbiBrYWxpdGUgc29ydWxhcsSxbsSxIGVrbGV5aW4uPC9wPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5Gb3JtIEFkxLE8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidGVtcGxhdGUuZm9ybS5uYW1lXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5Eb2vDvG1hbiBLb2R1PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0uZG9jdW1lbnRDb2RlXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5ZYXnEsW4gVGFyaWhpPC9sYWJlbD48aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidGVtcGxhdGUuZm9ybS5wdWJsaWNhdGlvbkRhdGVcIiBbZGlzYWJsZWRdPVwiIWNhbkVkaXRcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0yXCI+PGxhYmVsPlJldml6eW9uIFRhcmloaTwvbGFiZWw+PGlucHV0IHR5cGU9XCJkYXRlXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0ucmV2aXNpb25EYXRlXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMlwiPjxsYWJlbD5SZXZpenlvbiBObzwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0ZW1wbGF0ZS5mb3JtLnJldmlzaW9uTnVtYmVyXCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCIgLz48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93IG10LTJcIiAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnSW5wdXQnXCI+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk9ydGFsYW1hIFRpcGk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0uYXZlcmFnZU1vZGVcIiBbZGlzYWJsZWRdPVwiIWNhbkVkaXRcIj48b3B0aW9uIHZhbHVlPVwiQXJpdGhtZXRpY1wiPkFyaXRtZXRpazwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJXZWlnaHRlZFwiPk1pa3RhciBhxJ/EsXJsxLFrbMSxPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk1pa3RhciBCaXJpbWk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInRlbXBsYXRlLmZvcm0ucXVhbnRpdHlVbml0XCIgW2Rpc2FibGVkXT1cIiFjYW5FZGl0XCI+PG9wdGlvbiB2YWx1ZT1cImtnXCI+S2lsb2dyYW08L29wdGlvbj48b3B0aW9uIHZhbHVlPVwidFwiPlRvbjwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjwvZGl2PlxyXG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtcHJpbWFyeSBtdC0zXCIgKm5nSWY9XCJjYW5FZGl0XCIgKGNsaWNrKT1cImVkaXRGb3JtKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPkJhxZ9sxLHEn8SxIEtheWRldDwvYnV0dG9uPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCI+XHJcbiAgICAgICAgPHRhYmxlIGNsYXNzPVwidGFibGUgdGFibGUtYm9yZGVyZWQgdGFibGUtc3RyaXBlZCB0YWJsZS1zbSBwYXJhbWV0ZXItdGFibGVcIj5cclxuICAgICAgICAgIDx0aGVhZD48dHI+PHRoPsSwxZ9sZW1sZXI8L3RoPjx0aCAqbmdJZj1cImNvbnRyb2xUeXBlID09PSAnUHJvY2VzcydcIj5Qcm9zZXMgQWTEsW3EsTwvdGg+PHRoPlPEsXJhPC90aD48dGg+S29kPC90aD48dGg+UGFyYW1ldHJlIC8gU29ydTwvdGg+PHRoPkJpcmltPC90aD48dGg+VmVyaSBUaXBpPC90aD48dGg+TGltaXQgLyBOb21pbmFsPC90aD48dGg+RHVydW08L3RoPjwvdHI+PC90aGVhZD5cclxuICAgICAgICAgIDx0Ym9keT5cclxuICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBwYXJhbWV0ZXIgb2Ygb3JkZXJlZFBhcmFtZXRlcnMoKVwiPlxyXG4gICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImFjdGlvbnNcIj5cclxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnkgbXItMVwiICpuZ0lmPVwiY2FuRWRpdFwiIChjbGljayk9XCJlZGl0UGFyYW1ldGVyKHBhcmFtZXRlcilcIj5Ew7x6ZW5sZTwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtc2Vjb25kYXJ5IG1yLTFcIiAqbmdJZj1cImNhbkNyZWF0ZVwiIChjbGljayk9XCJhZGRMaW1pdChwYXJhbWV0ZXIpXCI+KyBMaW1pdDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tc20gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKm5nSWY9XCJjYW5EZWxldGUgJiYgcGFyYW1ldGVyLmFjdGl2ZVwiIChjbGljayk9XCJkZWxldGVQYXJhbWV0ZXIocGFyYW1ldGVyKVwiPlNpbDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiY29udHJvbFR5cGUgPT09ICdQcm9jZXNzJ1wiPnt7IHByb2Nlc3NOYW1lKHBhcmFtZXRlci5zdGVwQ29kZSkgfX08L3RkPjx0ZD57eyBwYXJhbWV0ZXIub3JkZXIgfX08L3RkPlxyXG4gICAgICAgICAgICAgIDx0ZD48Y29kZT57eyBwYXJhbWV0ZXIuY29kZSB9fTwvY29kZT48L3RkPjx0ZD57eyBwYXJhbWV0ZXIubmFtZSB9fTwvdGQ+PHRkPnt7IHBhcmFtZXRlci51bml0IHx8ICfigJQnIH19PC90ZD5cclxuICAgICAgICAgICAgICA8dGQ+e3sgcGFyYW1ldGVyLnZhbHVlVHlwZSB9fTxzcGFuICpuZ0lmPVwicGFyYW1ldGVyLmNhbGN1bGF0ZWRcIj4gLyBIZXNhcGxhbmFuPC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPlxyXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgbGltaXQgb2YgbGltaXRzRm9yKHBhcmFtZXRlci5jb2RlKVwiPlxyXG4gICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tbGluayBidG4tc20gcC0wIGxpbWl0LWxpbmtcIiAoY2xpY2spPVwiZWRpdExpbWl0KGxpbWl0KVwiPnt7IGxpbWl0LmNvZGUgfX08L2J1dHRvbj46XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGltaXQub2lsVHlwZVwiPnt7IGxpbWl0Lm9pbFR5cGUgfX0gwrcgPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0Lm9yaWdpblwiPnt7IGxpbWl0Lm9yaWdpbiA9PT0gJ0ltcG9ydGVkJyA/ICfEsHRoYWwnIDogJ8Sww6cgUGl5YXNhJyB9fSDCtyA8L3NwYW4+XHJcbiAgICAgICAgICAgICAgICAgIDxzcGFuICpuZ0lmPVwibGltaXQubWluaW11bSAhPSBudWxsXCI+TWluIHt7IGxpbWl0Lm1pbmltdW0gfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0Lm1heGltdW0gIT0gbnVsbFwiPk1heCB7eyBsaW1pdC5tYXhpbXVtIH19IDwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCJsaW1pdC5ub21pbmFsICE9IG51bGxcIj5Ob21pbmFsIHt7IGxpbWl0Lm5vbWluYWwgfX0gPC9zcGFuPlxyXG4gICAgICAgICAgICAgICAgICA8c3BhbiAqbmdJZj1cImxpbWl0LmV4cGVjdGVkVGV4dFwiPnt7IGxpbWl0LmV4cGVjdGVkVGV4dCB9fTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgICAgPHNwYW4gKm5nSWY9XCIhbGltaXQuYWN0aXZlXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+KHBhc2lmKTwvc3Bhbj5cclxuICAgICAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgICAgPHRkPnt7IHBhcmFtZXRlci5hY3RpdmUgPyAnQWt0aWYnIDogJ1Bhc2lmJyB9fTwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvdGFibGU+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLWNvbnRhaW5lcj5cclxuICA8L2Rpdj48L2Rpdj5cclxuPC9kaXY+XHJcblxyXG48YWJwLW1vZGFsIFt2aXNpYmxlXT1cInBhcmFtZXRlck1vZGFsVmlzaWJsZVwiICh2aXNpYmxlQ2hhbmdlKT1cInBhcmFtZXRlck1vZGFsQ2hhbmdlZCgkZXZlbnQpXCJcclxuICBbYnVzeV09XCJidXN5XCIgW29wdGlvbnNdPVwiZWRpdG9yTW9kYWxPcHRpb25zXCIgW3N1cHByZXNzVW5zYXZlZENoYW5nZXNXYXJuaW5nXT1cInRydWVcIj5cclxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3sgbmV3UGFyYW1ldGVyID8gJ1llbmkgUGFyYW1ldHJlJyA6ICdQYXJhbWV0cmV5aSBEw7x6ZW5sZScgfX08L2g1PlxyXG4gIDwvbmctdGVtcGxhdGU+XHJcbiAgPG5nLXRlbXBsYXRlICNhYnBCb2R5PlxyXG4gICAgPGRpdiAqbmdJZj1cIm1vZGFsRXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiIHJvbGU9XCJhbGVydFwiPnt7IG1vZGFsRXJyb3IgfX08L2Rpdj5cclxuICAgIDxkaXYgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIG1iLTNcIiByb2xlPVwic3RhdHVzXCIgYXJpYS1saXZlPVwicG9saXRlXCI+XHJcbiAgICAgIDxzcGFuIGNsYXNzPVwic3Bpbm5lci1ib3JkZXIgc3Bpbm5lci1ib3JkZXItc20gdGV4dC1wcmltYXJ5IG1yLTJcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L3NwYW4+XHJcbiAgICAgIDxzcGFuPnt7IGJ1c3lUZXh0IH19PC9zcGFuPlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZmllbGRzZXQgKm5nSWY9XCJlZGl0aW5nUGFyYW1ldGVyIGFzIHBhcmFtZXRlclwiIFtkaXNhYmxlZF09XCJidXN5XCIgY2xhc3M9XCJib3JkZXItMCBwLTAgbS0wXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPktvZDwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuY29kZVwiIFtkaXNhYmxlZF09XCIhbmV3UGFyYW1ldGVyXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5BZCAvIFNvcnU8L2xhYmVsPjxpbnB1dCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVyLm5hbWVcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCIgKm5nSWY9XCJjb250cm9sVHlwZSA9PT0gJ1Byb2Nlc3MnXCI+PGxhYmVsPlByb3NlcyBBZMSxbcSxPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuc3RlcENvZGVcIj48b3B0aW9uICpuZ0Zvcj1cImxldCBzdGVwIG9mIHN0ZXBzKClcIiBbdmFsdWVdPVwic3RlcC5wcm9jZXNzQ29kZVwiPnt7IHN0ZXAubmFtZSB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPlPEsXJhPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIub3JkZXJcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkJpcmltPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci51bml0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5WZXJpIFRpcGk8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci52YWx1ZVR5cGVcIj48b3B0aW9uIHZhbHVlPVwiTnVtYmVyXCI+U2F5xLFzYWw8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiVGV4dFwiPk1ldGluPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkNob2ljZVwiPlNlw6dpbTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbXQtMlwiPlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk9uZGFsxLFrIEJhc2FtYWs8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjhcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicGFyYW1ldGVyLmRlY2ltYWxQbGFjZXNcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPlNlw6dlbmVrbGVyICh2aXJnw7xsbGUgYXlyxLFsbcSxxZ8pPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cIm9wdGlvbnNUZXh0XCIgW2Rpc2FibGVkXT1cInBhcmFtZXRlci52YWx1ZVR5cGUgIT09ICdDaG9pY2UnXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5IZXNhcGxhbWEgRm9ybcO8bMO8PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci5mb3JtdWxhXCIgW2Rpc2FibGVkXT1cIiFwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIHBsYWNlaG9sZGVyPVwiUEFSQU1fS09EVSAqIDJcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00IGQtZmxleCBmbGV4LWNvbHVtbiBqdXN0aWZ5LWNvbnRlbnQtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInBhcmFtZXRlci5yZXF1aXJlZFwiIC8+IFpvcnVubHU8L2xhYmVsPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuY2FsY3VsYXRlZFwiIC8+IEhlc2FwbGFuYW48L2xhYmVsPjxsYWJlbD48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJwYXJhbWV0ZXIuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9maWVsZHNldD5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjbG9zZVBhcmFtZXRlck1vZGFsKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPsSwcHRhbDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAoY2xpY2spPVwic2F2ZVBhcmFtZXRlcigpXCIgW2Rpc2FibGVkXT1cImJ1c3lcIj5LYXlkZXQ8L2J1dHRvbj5cclxuICA8L25nLXRlbXBsYXRlPlxyXG48L2FicC1tb2RhbD5cclxuXHJcbjxhYnAtbW9kYWwgW3Zpc2libGVdPVwibGltaXRNb2RhbFZpc2libGVcIiAodmlzaWJsZUNoYW5nZSk9XCJsaW1pdE1vZGFsQ2hhbmdlZCgkZXZlbnQpXCJcclxuICBbYnVzeV09XCJidXN5XCIgW29wdGlvbnNdPVwiZWRpdG9yTW9kYWxPcHRpb25zXCIgW3N1cHByZXNzVW5zYXZlZENoYW5nZXNXYXJuaW5nXT1cInRydWVcIj5cclxuICA8bmctdGVtcGxhdGUgI2FicEhlYWRlcj5cclxuICAgIDxoNSBjbGFzcz1cIm1vZGFsLXRpdGxlXCI+e3sgbmV3TGltaXQgPyAnWWVuaSBMaW1pdCcgOiAnTGltaXRpIETDvHplbmxlJyB9fSDigJMge3sgZWRpdGluZ0xpbWl0Py5wYXJhbWV0ZXJDb2RlIH19PC9oNT5cclxuICA8L25nLXRlbXBsYXRlPlxyXG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT5cclxuICAgIDxkaXYgKm5nSWY9XCJtb2RhbEVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIiByb2xlPVwiYWxlcnRcIj57eyBtb2RhbEVycm9yIH19PC9kaXY+XHJcbiAgICA8ZGl2ICpuZ0lmPVwiYnVzeVwiIGNsYXNzPVwiZC1mbGV4IGFsaWduLWl0ZW1zLWNlbnRlciBtYi0zXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtbGl2ZT1cInBvbGl0ZVwiPlxyXG4gICAgICA8c3BhbiBjbGFzcz1cInNwaW5uZXItYm9yZGVyIHNwaW5uZXItYm9yZGVyLXNtIHRleHQtcHJpbWFyeSBtci0yXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPlxyXG4gICAgICA8c3Bhbj57eyBidXN5VGV4dCB9fTwvc3Bhbj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGZpZWxkc2V0ICpuZ0lmPVwiZWRpdGluZ0xpbWl0IGFzIGxpbWl0XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiBjbGFzcz1cImJvcmRlci0wIHAtMCBtLTBcIj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+S29kPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmNvZGVcIiBbZGlzYWJsZWRdPVwiIW5ld0xpbWl0XCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5ZYcSfIENpbnNpIC8gS2/Fn3VsPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC5vaWxUeXBlXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJQYWxtIE9pbFwiPlBhbG0gT2lsPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIlBhbG0gT2xlaW5cIj5QYWxtIE9sZWluPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+TWVuxZ9laTwvbGFiZWw+PHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibGltaXQub3JpZ2luXCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlTDvG3DvDwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJEb21lc3RpY1wiPsSww6cgUGl5YXNhPC9vcHRpb24+PG9wdGlvbiB2YWx1ZT1cIkltcG9ydGVkXCI+xLB0aGFsPC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+TWluPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC5taW5pbXVtXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5NYXg8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0Lm1heGltdW1cIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPk5vbWluYWw8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0Lm5vbWluYWxcIiAvPjwvZGl2PlxyXG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkJla2xlbmVuIE1ldGluPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmV4cGVjdGVkVGV4dFwiIC8+PC9kaXY+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtdC0yXCI+XHJcbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+QmHFn2xhbmfEscOnPC9sYWJlbD48aW5wdXQgdHlwZT1cImRhdGVcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwibGltaXQudmFsaWRGcm9tXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5CaXRpxZ88L2xhYmVsPjxpbnB1dCB0eXBlPVwiZGF0ZVwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJsaW1pdC52YWxpZFVudGlsXCIgLz48L2Rpdj5cclxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBkLWZsZXggYWxpZ24taXRlbXMtZW5kXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cImxpbWl0LmFjdGl2ZVwiIC8+IEFrdGlmPC9sYWJlbD48L2Rpdj5cclxuICAgICAgICA8L2Rpdj5cclxuICAgIDwvZmllbGRzZXQ+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuICA8bmctdGVtcGxhdGUgI2FicEZvb3Rlcj5cclxuICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLW91dGxpbmUtZGFuZ2VyXCIgKm5nSWY9XCIhbmV3TGltaXQgJiYgY2FuRGVsZXRlXCJcclxuICAgICAgICAoY2xpY2spPVwiZGVsZXRlTGltaXQoZWRpdGluZ0xpbWl0ISlcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPlNpbDwvYnV0dG9uPlxyXG4gICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNlY29uZGFyeVwiIChjbGljayk9XCJjbG9zZUxpbWl0TW9kYWwoKVwiIFtkaXNhYmxlZF09XCJidXN5XCI+xLBwdGFsPC9idXR0b24+XHJcbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiIChjbGljayk9XCJzYXZlTGltaXQoKVwiIFtkaXNhYmxlZF09XCJidXN5XCI+S2F5ZGV0PC9idXR0b24+XHJcbiAgPC9uZy10ZW1wbGF0ZT5cclxuPC9hYnAtbW9kYWw+XHJcbiJdfQ==