@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.
- package/README.md +23 -2
- package/config/enums/index.d.ts +1 -0
- package/config/enums/route-names.d.ts +5 -0
- package/config/index.d.ts +5 -0
- package/config/kalite-config.module.d.ts +8 -0
- package/config/providers/index.d.ts +1 -0
- package/config/providers/route.provider.d.ts +4 -0
- package/config/public-api.d.ts +3 -0
- package/esm2020/config/enums/index.mjs +2 -0
- package/esm2020/config/enums/route-names.mjs +2 -0
- package/esm2020/config/hitsoft-kadooglu.kalite-config.mjs +5 -0
- package/esm2020/config/kalite-config.module.mjs +18 -0
- package/esm2020/config/providers/index.mjs +2 -0
- package/esm2020/config/providers/route.provider.mjs +57 -0
- package/esm2020/config/public-api.mjs +4 -0
- package/esm2020/hitsoft-kadooglu.kalite.mjs +5 -0
- package/esm2020/lib/components/intake-form.component.mjs +162 -0
- package/esm2020/lib/components/intake-list.component.mjs +80 -0
- package/esm2020/lib/components/kalite.component.mjs +18 -0
- package/esm2020/lib/components/process-analysis.component.mjs +197 -0
- package/esm2020/lib/components/quality-definitions.component.mjs +97 -0
- package/esm2020/lib/components/quality-notifications.component.mjs +64 -0
- package/esm2020/lib/components/quality-parameters.component.mjs +332 -0
- package/esm2020/lib/components/quality-reports.component.mjs +107 -0
- package/esm2020/lib/kalite-notification.module.mjs +23 -0
- package/esm2020/lib/kalite-routing.module.mjs +41 -0
- package/esm2020/lib/kalite.module.mjs +41 -0
- package/esm2020/lib/models/intake.models.mjs +2 -0
- package/esm2020/lib/models/quality.models.mjs +2 -0
- package/esm2020/lib/services/kalite.service.mjs +21 -0
- package/esm2020/lib/services/print-form.mjs +96 -0
- package/esm2020/lib/services/quality-api.service.mjs +119 -0
- package/esm2020/lib/services/quality-measurements.mjs +127 -0
- package/esm2020/public-api.mjs +16 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2015/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs +1483 -0
- package/fesm2015/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs +80 -0
- package/fesm2020/hitsoft-kadooglu.kalite-config.mjs.map +1 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs +1442 -0
- package/fesm2020/hitsoft-kadooglu.kalite.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/intake-form.component.d.ts +50 -0
- package/lib/components/intake-list.component.d.ts +48 -0
- package/lib/components/kalite.component.d.ts +10 -0
- package/lib/components/process-analysis.component.d.ts +46 -0
- package/lib/components/quality-definitions.component.d.ts +46 -0
- package/lib/components/quality-notifications.component.d.ts +44 -0
- package/lib/components/quality-parameters.component.d.ts +82 -0
- package/lib/components/quality-reports.component.d.ts +31 -0
- package/lib/kalite-notification.module.d.ts +14 -0
- package/lib/kalite-routing.module.d.ts +7 -0
- package/lib/kalite.module.d.ts +23 -0
- package/lib/models/intake.models.d.ts +185 -0
- package/lib/models/quality.models.d.ts +114 -0
- package/lib/services/kalite.service.d.ts +10 -0
- package/lib/services/print-form.d.ts +2 -0
- package/lib/services/quality-api.service.d.ts +71 -0
- package/lib/services/quality-measurements.d.ts +8 -0
- package/package.json +42 -3
- package/public-api.d.ts +12 -0
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { errorMessage } from '../services/quality-measurements';
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import * as i1 from "../services/quality-api.service";
|
|
5
|
+
import * as i2 from "@abp/ng.core";
|
|
6
|
+
import * as i3 from "@angular/common";
|
|
7
|
+
import * as i4 from "@angular/forms";
|
|
8
|
+
import * as i5 from "@angular/router";
|
|
9
|
+
import * as i6 from "@abp/ng.theme.shared";
|
|
10
|
+
export class QualityDefinitionsComponent {
|
|
11
|
+
constructor(api, permissions) {
|
|
12
|
+
this.api = api;
|
|
13
|
+
this.permissions = permissions;
|
|
14
|
+
this.tab = 'details';
|
|
15
|
+
this.types = [];
|
|
16
|
+
this.details = [];
|
|
17
|
+
this.tanks = [];
|
|
18
|
+
this.shifts = [];
|
|
19
|
+
this.detail = null;
|
|
20
|
+
this.tank = null;
|
|
21
|
+
this.shift = null;
|
|
22
|
+
this.isNew = true;
|
|
23
|
+
this.busy = false;
|
|
24
|
+
this.error = '';
|
|
25
|
+
this.modalError = '';
|
|
26
|
+
this.success = '';
|
|
27
|
+
this.laborants = [];
|
|
28
|
+
this.laborantsBusy = false;
|
|
29
|
+
this.laborantsError = '';
|
|
30
|
+
this.profiles = [{ code: '', name: 'Soruları kendim tanımlayacağım' }, { code: 'RAW', name: 'Ham Ayçiçek Yağı' }, { code: 'REFINED', name: 'Rafine Yağ' }, { code: 'PALM', name: 'Palm Oil / Palm Olein' }, { code: 'COAL', name: 'Kömür' }, { code: 'NAOH', name: 'Kostik (NaOH)' }, { code: 'PHOSPHORIC', name: 'Fosforik Asit' }, { code: 'SULFURIC', name: 'Sülfürik Asit' }, { code: 'PERLITE', name: 'Perlit' }, { code: 'EARTH', name: 'Ağartma Toprağı' }];
|
|
31
|
+
}
|
|
32
|
+
get canEdit() { return this.permissions.getGrantedPolicy('Kalite.Definitions.Edit'); }
|
|
33
|
+
get canDelete() { return this.permissions.getGrantedPolicy('Kalite.Definitions.Delete'); }
|
|
34
|
+
ngOnInit() { this.load(); }
|
|
35
|
+
load() {
|
|
36
|
+
this.busy = true;
|
|
37
|
+
this.error = '';
|
|
38
|
+
if (this.tab === 'details') {
|
|
39
|
+
this.api.movementTypes().subscribe({ next: x => this.types = x, error: e => this.error = errorMessage(e) });
|
|
40
|
+
this.api.movementDetails().subscribe({ next: x => { this.details = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
41
|
+
}
|
|
42
|
+
else if (this.tab === 'tanks')
|
|
43
|
+
this.api.tanks().subscribe({ next: x => { this.tanks = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
44
|
+
else
|
|
45
|
+
this.api.shifts().subscribe({ next: x => { this.shifts = x; this.busy = false; }, error: e => { this.error = errorMessage(e); this.busy = false; } });
|
|
46
|
+
}
|
|
47
|
+
selectTab(tab) { this.tab = tab; this.close(); this.load(); }
|
|
48
|
+
name(code) { return this.types.find(x => x.code === code)?.name || code; }
|
|
49
|
+
openDetail(value) { this.error = ''; this.modalError = ''; this.isNew = !value; this.detail = value ? { ...value } : { code: '', movementTypeCode: '', detailCode: '', name: '', profile: '', active: true }; }
|
|
50
|
+
openTank(value) { this.error = ''; this.modalError = ''; this.isNew = !value; this.tank = value ? { ...value } : { code: '', name: '', type: 'Raw', capacity: null, active: true }; }
|
|
51
|
+
openShift(value) {
|
|
52
|
+
this.error = '';
|
|
53
|
+
this.modalError = '';
|
|
54
|
+
this.isNew = !value;
|
|
55
|
+
this.shift = value ? { ...value, analystUserId: value.analystUserId || null } : { code: '', name: '', startHour: 7, endHour: 15, analyst: '', analystUserId: null, active: true };
|
|
56
|
+
this.laborants = [];
|
|
57
|
+
this.laborantsBusy = true;
|
|
58
|
+
this.laborantsError = '';
|
|
59
|
+
this.api.laborants().subscribe({ next: x => { this.laborants = x; this.laborantsBusy = false; },
|
|
60
|
+
error: e => { this.laborantsError = errorMessage(e); this.laborantsBusy = false; } });
|
|
61
|
+
}
|
|
62
|
+
laborantChanged() {
|
|
63
|
+
if (this.shift)
|
|
64
|
+
this.shift.analyst = this.laborants.find(x => x.id === this.shift.analystUserId)?.userName || '';
|
|
65
|
+
}
|
|
66
|
+
get selectedLaborantMissing() { return !!this.shift?.analystUserId && !this.laborants.some(x => x.id === this.shift.analystUserId); }
|
|
67
|
+
close() { this.detail = null; this.tank = null; this.shift = null; this.modalError = ''; }
|
|
68
|
+
save() {
|
|
69
|
+
const value = this.detail || this.tank || this.shift;
|
|
70
|
+
if (!value)
|
|
71
|
+
return;
|
|
72
|
+
value.code = this.isNew ? value.code.trim().toUpperCase() : value.code;
|
|
73
|
+
this.busy = true;
|
|
74
|
+
this.modalError = '';
|
|
75
|
+
const request = this.detail ? this.api.saveDetail(this.detail, this.isNew) : this.tank ? this.api.saveTank(this.tank, this.isNew) : this.api.saveShift(this.shift);
|
|
76
|
+
request.subscribe({ next: () => { this.close(); this.success = 'Tanım kaydedildi.'; this.load(); }, error: e => { this.modalError = errorMessage(e); this.busy = false; } });
|
|
77
|
+
}
|
|
78
|
+
delete() {
|
|
79
|
+
const value = this.detail || this.tank || this.shift;
|
|
80
|
+
if (!value || this.isNew || this.busy)
|
|
81
|
+
return;
|
|
82
|
+
const type = this.detail ? 'araç hareket türü detayını' : this.tank ? 'tankı' : 'vardiyayı';
|
|
83
|
+
if (!confirm(`${value.code} kodlu ${type} ve bağlı tanımları kalıcı olarak silinsin mi?`))
|
|
84
|
+
return;
|
|
85
|
+
this.busy = true;
|
|
86
|
+
this.modalError = '';
|
|
87
|
+
const request = this.detail ? this.api.deleteDetail(value.code) : this.tank ? this.api.deleteTank(value.code) : this.api.deleteShift(value.code);
|
|
88
|
+
request.subscribe({ next: () => { this.close(); this.success = 'Tanım silindi.'; this.load(); }, error: e => { this.modalError = errorMessage(e); this.busy = false; } });
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
QualityDefinitionsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityDefinitionsComponent, deps: [{ token: i1.QualityApiService }, { token: i2.PermissionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
92
|
+
QualityDefinitionsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityDefinitionsComponent, selector: "lib-quality-definitions", ngImport: i0, template: "<div class=\"container-fluid\"><h3>Kalite Tan\u0131mlar\u0131</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"d-flex justify-content-between mb-3\"><div class=\"btn-group\">\n <button class=\"btn\" [class.btn-primary]=\"tab === 'details'\" [class.btn-outline-secondary]=\"tab !== 'details'\" (click)=\"selectTab('details')\">Ara\u00E7 Hareket T\u00FCrleri Detay</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'tanks'\" [class.btn-outline-secondary]=\"tab !== 'tanks'\" (click)=\"selectTab('tanks')\">Tanklar</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'shifts'\" [class.btn-outline-secondary]=\"tab !== 'shifts'\" (click)=\"selectTab('shifts')\">Vardiyalar</button>\n </div><button class=\"btn btn-primary\" *ngIf=\"canEdit\" [disabled]=\"busy\" (click)=\"tab === 'details' ? openDetail() : tab === 'tanks' ? openTank() : openShift()\">+ Yeni Kay\u0131t</button></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div><div *ngIf=\"success\" class=\"alert alert-success\">{{ success }}</div><div *ngIf=\"busy\" class=\"quality-loading\" role=\"status\">Tan\u0131mlar y\u00FCkleniyor\u2026</div>\n <div class=\"table-responsive\" [hidden]=\"busy\">\n <table *ngIf=\"tab === 'details'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Ara\u00E7 Hareket T\u00FCr\u00FC</th><th>Detay Kodu</th><th>Detay Ad\u0131</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let d of details\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openDetail(d)\">D\u00FCzenle</button><a class=\"quality-questions-link\" [routerLink]=\"['/kalite/parameters']\" [queryParams]=\"{type: 'Input', detail: d.code}\">Kalite Sorular\u0131</a></td><td>{{ name(d.movementTypeCode) }}</td><td>{{ d.detailCode || '\u2014' }}</td><td>{{ d.name || '\u2014' }}</td><td>{{ d.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'tanks'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Tip</th><th>Kapasite</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let t of tanks\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openTank(t)\">D\u00FCzenle</button></td><td>{{ t.code }}</td><td>{{ t.name }}</td><td>{{ t.type === 'Raw' ? 'Ham Ya\u011F' : t.type === 'Refined' ? 'Rafine' : t.type === 'Product' ? '\u00DCr\u00FCn' : 'Ara' }}</td><td>{{ t.capacity }}</td><td>{{ t.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'shifts'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Ba\u015Flang\u0131\u00E7</th><th>Biti\u015F</th><th>Laborant</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let s of shifts\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openShift(s)\">D\u00FCzenle</button></td><td>{{ s.code }}</td><td>{{ s.name }}</td><td>{{ s.startHour | number:'2.0-0' }}:00</td><td>{{ s.endHour | number:'2.0-0' }}:00</td><td>{{ s.analyst }}</td><td>{{ s.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n </div><p *ngIf=\"tab === 'details'\" class=\"text-muted\">Etkin tan\u0131mlarda bulunan ara\u00E7 hareket t\u00FCrleri kalite kontrole tabidir. Detay kodu ve ad\u0131 bo\u015F b\u0131rak\u0131larak yaln\u0131z hareket t\u00FCr\u00FC ba\u015Fl\u0131\u011F\u0131 tan\u0131mlanabilir.</p>\n</div></div></div>\n<abp-modal [visible]=\"!!(detail || tank || shift)\" (visibleChange)=\"!$event && close()\" [busy]=\"busy\" [options]=\"{size: 'lg'}\">\n <ng-template #abpHeader><h5>{{ isNew ? 'Yeni Tan\u0131m' : 'Tan\u0131m\u0131 D\u00FCzenle' }}</h5></ng-template>\n <ng-template #abpBody><div *ngIf=\"modalError\" class=\"alert alert-danger\">{{ modalError }}</div>\n <div *ngIf=\"detail as d\" class=\"row\">\n <div class=\"col-md-4\"><label>Kay\u0131t Kodu *</label><input class=\"form-control\" [(ngModel)]=\"d.code\" [disabled]=\"!isNew\" maxlength=\"24\" /></div><div class=\"col-md-8\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC *</label><select class=\"form-control\" [(ngModel)]=\"d.movementTypeCode\" [disabled]=\"!isNew\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{ type.name }}</option></select></div>\n <div class=\"col-md-4 mt-3\"><label>Detay Kodu</label><input class=\"form-control\" [(ngModel)]=\"d.detailCode\" /></div><div class=\"col-md-8 mt-3\"><label>Detay Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"d.name\" /></div>\n <div class=\"col-md-12 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Sorular\u0131</label><select class=\"form-control\" [(ngModel)]=\"d.profile\" [disabled]=\"!isNew\"><option *ngFor=\"let p of profiles\" [value]=\"p.code\">{{ p.name }}</option></select><small class=\"text-muted\">Se\u00E7ilen \u015Fablonun sorular\u0131 ve limitleri Kalite Parametreleri ekran\u0131ndan d\u00FCzenlenebilir.</small></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"d.active\" /> Aktif</label></div>\n </div>\n <div *ngIf=\"tank as t\" class=\"row\"><div class=\"col-md-4\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"t.code\" [disabled]=\"!isNew\" /></div><div class=\"col-md-8\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"t.name\" /></div><div class=\"col-md-6 mt-3\"><label>Tip</label><select class=\"form-control\" [(ngModel)]=\"t.type\"><option value=\"Raw\">Ham Ya\u011F</option><option value=\"Refined\">Rafine</option><option value=\"Intermediate\">Ara</option><option value=\"Product\">\u00DCr\u00FCn</option></select></div><div class=\"col-md-6 mt-3\"><label>Kapasite</label><input type=\"number\" min=\"0\" class=\"form-control\" [(ngModel)]=\"t.capacity\" /></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"t.active\" /> Aktif</label></div></div>\n <div *ngIf=\"shift as s\" class=\"row\">\n <div class=\"col-md-3\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"s.code\" [disabled]=\"!isNew\" /></div>\n <div class=\"col-md-9\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"s.name\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.startHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Biti\u015F Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.endHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Laborant</label>\n <select class=\"form-control\" [(ngModel)]=\"s.analystUserId\" (change)=\"laborantChanged()\" [disabled]=\"busy || laborantsBusy\">\n <option [ngValue]=\"null\">{{ !s.analystUserId && s.analyst ? 'Mevcut: ' + s.analyst + ' (eski kay\u0131t)' : 'Se\u00E7in' }}</option>\n <option *ngIf=\"selectedLaborantMissing\" [ngValue]=\"s.analystUserId\" disabled>{{ s.analyst }} (se\u00E7ilebilir de\u011Fil)</option>\n <option *ngFor=\"let user of laborants\" [ngValue]=\"user.id\">{{ user.userName }}</option>\n </select>\n <small *ngIf=\"laborantsBusy\" class=\"text-muted\">Kullan\u0131c\u0131lar y\u00FCkleniyor\u2026</small>\n <small *ngIf=\"!laborantsBusy && !laborantsError && !laborants.length\" class=\"text-muted\">Bu firmada aktif ve proses veri giri\u015Fi yetkisi olan kullan\u0131c\u0131 bulunamad\u0131.</small>\n <div *ngIf=\"laborantsError\" class=\"text-danger\" role=\"alert\">{{ laborantsError }}</div>\n </div>\n <div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"s.active\" /> Aktif</label></div>\n </div>\n </ng-template><ng-template #abpFooter><button class=\"btn btn-danger mr-auto\" *ngIf=\"canDelete && !isNew\" [disabled]=\"busy\" (click)=\"delete()\">Sil</button><button class=\"btn btn-secondary\" [disabled]=\"busy\" (click)=\"close()\">Vazge\u00E7</button><button class=\"btn btn-primary\" [disabled]=\"busy\" (click)=\"save()\">Kaydet</button></ng-template>\n</abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i4.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: i4.NumberValueAccessor, selector: "input[type=number][formControlName],input[type=number][formControl],input[type=number][ngModel]" }, { kind: "directive", type: i4.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i4.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.MaxLengthValidator, selector: "[maxlength][formControlName],[maxlength][formControl],[maxlength][ngModel]", inputs: ["maxlength"] }, { kind: "directive", type: i4.MinValidator, selector: "input[type=number][min][formControlName],input[type=number][min][formControl],input[type=number][min][ngModel]", inputs: ["min"] }, { kind: "directive", type: i4.MaxValidator, selector: "input[type=number][max][formControlName],input[type=number][max][formControl],input[type=number][max][ngModel]", inputs: ["max"] }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i5.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "component", type: i6.ModalComponent, selector: "abp-modal", inputs: ["visible", "busy", "options", "suppressUnsavedChangesWarning"], outputs: ["visibleChange", "init", "appear", "disappear"] }, { kind: "pipe", type: i3.DecimalPipe, name: "number" }] });
|
|
93
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityDefinitionsComponent, decorators: [{
|
|
94
|
+
type: Component,
|
|
95
|
+
args: [{ selector: 'lib-quality-definitions', template: "<div class=\"container-fluid\"><h3>Kalite Tan\u0131mlar\u0131</h3><div class=\"card\"><div class=\"card-body\">\n <div class=\"d-flex justify-content-between mb-3\"><div class=\"btn-group\">\n <button class=\"btn\" [class.btn-primary]=\"tab === 'details'\" [class.btn-outline-secondary]=\"tab !== 'details'\" (click)=\"selectTab('details')\">Ara\u00E7 Hareket T\u00FCrleri Detay</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'tanks'\" [class.btn-outline-secondary]=\"tab !== 'tanks'\" (click)=\"selectTab('tanks')\">Tanklar</button>\n <button class=\"btn\" [class.btn-primary]=\"tab === 'shifts'\" [class.btn-outline-secondary]=\"tab !== 'shifts'\" (click)=\"selectTab('shifts')\">Vardiyalar</button>\n </div><button class=\"btn btn-primary\" *ngIf=\"canEdit\" [disabled]=\"busy\" (click)=\"tab === 'details' ? openDetail() : tab === 'tanks' ? openTank() : openShift()\">+ Yeni Kay\u0131t</button></div>\n <div *ngIf=\"error\" class=\"alert alert-danger\">{{ error }}</div><div *ngIf=\"success\" class=\"alert alert-success\">{{ success }}</div><div *ngIf=\"busy\" class=\"quality-loading\" role=\"status\">Tan\u0131mlar y\u00FCkleniyor\u2026</div>\n <div class=\"table-responsive\" [hidden]=\"busy\">\n <table *ngIf=\"tab === 'details'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Ara\u00E7 Hareket T\u00FCr\u00FC</th><th>Detay Kodu</th><th>Detay Ad\u0131</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let d of details\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openDetail(d)\">D\u00FCzenle</button><a class=\"quality-questions-link\" [routerLink]=\"['/kalite/parameters']\" [queryParams]=\"{type: 'Input', detail: d.code}\">Kalite Sorular\u0131</a></td><td>{{ name(d.movementTypeCode) }}</td><td>{{ d.detailCode || '\u2014' }}</td><td>{{ d.name || '\u2014' }}</td><td>{{ d.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'tanks'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Tip</th><th>Kapasite</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let t of tanks\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openTank(t)\">D\u00FCzenle</button></td><td>{{ t.code }}</td><td>{{ t.name }}</td><td>{{ t.type === 'Raw' ? 'Ham Ya\u011F' : t.type === 'Refined' ? 'Rafine' : t.type === 'Product' ? '\u00DCr\u00FCn' : 'Ara' }}</td><td>{{ t.capacity }}</td><td>{{ t.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n <table *ngIf=\"tab === 'shifts'\" class=\"table table-striped table-bordered\"><thead><tr><th>\u0130\u015Flemler</th><th>Kod</th><th>Ad</th><th>Ba\u015Flang\u0131\u00E7</th><th>Biti\u015F</th><th>Laborant</th><th>Aktif</th></tr></thead><tbody><tr *ngFor=\"let s of shifts\"><td><button *ngIf=\"canEdit\" class=\"btn btn-sm btn-outline-primary\" (click)=\"openShift(s)\">D\u00FCzenle</button></td><td>{{ s.code }}</td><td>{{ s.name }}</td><td>{{ s.startHour | number:'2.0-0' }}:00</td><td>{{ s.endHour | number:'2.0-0' }}:00</td><td>{{ s.analyst }}</td><td>{{ s.active ? 'Evet' : 'Hay\u0131r' }}</td></tr></tbody></table>\n </div><p *ngIf=\"tab === 'details'\" class=\"text-muted\">Etkin tan\u0131mlarda bulunan ara\u00E7 hareket t\u00FCrleri kalite kontrole tabidir. Detay kodu ve ad\u0131 bo\u015F b\u0131rak\u0131larak yaln\u0131z hareket t\u00FCr\u00FC ba\u015Fl\u0131\u011F\u0131 tan\u0131mlanabilir.</p>\n</div></div></div>\n<abp-modal [visible]=\"!!(detail || tank || shift)\" (visibleChange)=\"!$event && close()\" [busy]=\"busy\" [options]=\"{size: 'lg'}\">\n <ng-template #abpHeader><h5>{{ isNew ? 'Yeni Tan\u0131m' : 'Tan\u0131m\u0131 D\u00FCzenle' }}</h5></ng-template>\n <ng-template #abpBody><div *ngIf=\"modalError\" class=\"alert alert-danger\">{{ modalError }}</div>\n <div *ngIf=\"detail as d\" class=\"row\">\n <div class=\"col-md-4\"><label>Kay\u0131t Kodu *</label><input class=\"form-control\" [(ngModel)]=\"d.code\" [disabled]=\"!isNew\" maxlength=\"24\" /></div><div class=\"col-md-8\"><label>Ara\u00E7 Hareket T\u00FCr\u00FC *</label><select class=\"form-control\" [(ngModel)]=\"d.movementTypeCode\" [disabled]=\"!isNew\"><option value=\"\">Se\u00E7in</option><option *ngFor=\"let type of types\" [value]=\"type.code\">{{ type.name }}</option></select></div>\n <div class=\"col-md-4 mt-3\"><label>Detay Kodu</label><input class=\"form-control\" [(ngModel)]=\"d.detailCode\" /></div><div class=\"col-md-8 mt-3\"><label>Detay Ad\u0131</label><input class=\"form-control\" [(ngModel)]=\"d.name\" /></div>\n <div class=\"col-md-12 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Sorular\u0131</label><select class=\"form-control\" [(ngModel)]=\"d.profile\" [disabled]=\"!isNew\"><option *ngFor=\"let p of profiles\" [value]=\"p.code\">{{ p.name }}</option></select><small class=\"text-muted\">Se\u00E7ilen \u015Fablonun sorular\u0131 ve limitleri Kalite Parametreleri ekran\u0131ndan d\u00FCzenlenebilir.</small></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"d.active\" /> Aktif</label></div>\n </div>\n <div *ngIf=\"tank as t\" class=\"row\"><div class=\"col-md-4\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"t.code\" [disabled]=\"!isNew\" /></div><div class=\"col-md-8\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"t.name\" /></div><div class=\"col-md-6 mt-3\"><label>Tip</label><select class=\"form-control\" [(ngModel)]=\"t.type\"><option value=\"Raw\">Ham Ya\u011F</option><option value=\"Refined\">Rafine</option><option value=\"Intermediate\">Ara</option><option value=\"Product\">\u00DCr\u00FCn</option></select></div><div class=\"col-md-6 mt-3\"><label>Kapasite</label><input type=\"number\" min=\"0\" class=\"form-control\" [(ngModel)]=\"t.capacity\" /></div><div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"t.active\" /> Aktif</label></div></div>\n <div *ngIf=\"shift as s\" class=\"row\">\n <div class=\"col-md-3\"><label>Kod *</label><input class=\"form-control\" [(ngModel)]=\"s.code\" [disabled]=\"!isNew\" /></div>\n <div class=\"col-md-9\"><label>Ad *</label><input class=\"form-control\" [(ngModel)]=\"s.name\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Ba\u015Flang\u0131\u00E7 Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.startHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Biti\u015F Saati</label><input type=\"number\" min=\"0\" max=\"23\" class=\"form-control\" [(ngModel)]=\"s.endHour\" /></div>\n <div class=\"col-md-4 mt-3\"><label>Laborant</label>\n <select class=\"form-control\" [(ngModel)]=\"s.analystUserId\" (change)=\"laborantChanged()\" [disabled]=\"busy || laborantsBusy\">\n <option [ngValue]=\"null\">{{ !s.analystUserId && s.analyst ? 'Mevcut: ' + s.analyst + ' (eski kay\u0131t)' : 'Se\u00E7in' }}</option>\n <option *ngIf=\"selectedLaborantMissing\" [ngValue]=\"s.analystUserId\" disabled>{{ s.analyst }} (se\u00E7ilebilir de\u011Fil)</option>\n <option *ngFor=\"let user of laborants\" [ngValue]=\"user.id\">{{ user.userName }}</option>\n </select>\n <small *ngIf=\"laborantsBusy\" class=\"text-muted\">Kullan\u0131c\u0131lar y\u00FCkleniyor\u2026</small>\n <small *ngIf=\"!laborantsBusy && !laborantsError && !laborants.length\" class=\"text-muted\">Bu firmada aktif ve proses veri giri\u015Fi yetkisi olan kullan\u0131c\u0131 bulunamad\u0131.</small>\n <div *ngIf=\"laborantsError\" class=\"text-danger\" role=\"alert\">{{ laborantsError }}</div>\n </div>\n <div class=\"col-md-12 mt-3\"><label><input type=\"checkbox\" [(ngModel)]=\"s.active\" /> Aktif</label></div>\n </div>\n </ng-template><ng-template #abpFooter><button class=\"btn btn-danger mr-auto\" *ngIf=\"canDelete && !isNew\" [disabled]=\"busy\" (click)=\"delete()\">Sil</button><button class=\"btn btn-secondary\" [disabled]=\"busy\" (click)=\"close()\">Vazge\u00E7</button><button class=\"btn btn-primary\" [disabled]=\"busy\" (click)=\"save()\">Kaydet</button></ng-template>\n</abp-modal>\n", styles: [".quality-loading{padding:1.5rem;text-align:center;color:#5b526c}.print-only{display:none}.quality-status{display:inline-flex;align-items:center;gap:.5rem;padding:.55rem .85rem;border:1px solid transparent;border-radius:.4rem;font-size:.9375rem;font-weight:600;line-height:1.4}.quality-status-accepted{color:#166534;background:#dcfce7;border-color:#86efac}.quality-status-rejected{color:#991b1b;background:#fee2e2;border-color:#fca5a5}.quality-status-draft{color:#1e40af;background:#dbeafe;border-color:#93c5fd}.quality-status-waiting{color:#854d0e;background:#fef3c7;border-color:#fcd34d}.vehicle-table{min-width:1950px;white-space:nowrap}.actions{min-width:130px}.quality-questions-link{display:inline-flex;align-items:center;min-height:calc(1.5em + .5rem + 2px);margin-left:.4rem;padding:.25rem .5rem;color:#9a5a00;background:#fff3d6;border:1px solid #edb85b;border-radius:.2rem;font-size:.875rem;line-height:1.5;text-decoration:none}.quality-questions-link:hover,.quality-questions-link:focus{color:#fff;background:#b86b00;border-color:#b86b00;text-decoration:none}.intake-actions-cell{display:flex;align-items:center}:host ::ng-deep .intake-grid .dx-data-row>td{vertical-align:middle}.intake-actions-toggle{display:inline-flex;align-items:center;gap:.5rem;padding:.3rem .65rem;font-family:inherit;font-size:.8125rem;line-height:1.3}.intake-action-menu{min-width:210px;margin-top:.35rem;padding:.3rem;background:#fff;border:1px solid #dee2e6;border-radius:.375rem;box-shadow:0 .25rem .75rem #0000001a}.intake-action-menu .dropdown-item{display:block;text-align:left;border:0;border-radius:.25rem;background:none;color:#343a40;padding:.5rem .65rem;font-family:inherit;font-size:.8125rem;font-weight:400;line-height:1.4;text-decoration:none;white-space:nowrap;cursor:pointer}.intake-action-menu .dropdown-item:hover,.intake-action-menu .dropdown-item:focus-visible{background:#eef2ff;color:#2446b5}.page-size{width:85px}.vehicle-info{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1rem;margin:1rem 0}.vehicle-info label{font-size:.8rem;color:#6c757d;margin-bottom:.2rem}.vehicle-info p{background:#f5f3f8;padding:.55rem;min-height:2.5rem;overflow-wrap:anywhere}.measurement-table{min-width:700px}.measurement-table th{background:#f2edf7}.measurement-table td{vertical-align:middle}.out-of-limit,.rejected-row{background:#ffe6e9!important}.out-of-limit input,.out-of-limit select{border-color:#dc3545}@media (max-width: 900px){.vehicle-info{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width: 550px){.vehicle-info{grid-template-columns:1fr}}\n"] }]
|
|
96
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.PermissionService }]; } });
|
|
97
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1kZWZpbml0aW9ucy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9rYWxpdGUvc3JjL2xpYi9jb21wb25lbnRzL3F1YWxpdHktZGVmaW5pdGlvbnMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMva2FsaXRlL3NyYy9saWIvY29tcG9uZW50cy9xdWFsaXR5LWRlZmluaXRpb25zLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFJbEQsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGtDQUFrQyxDQUFDOzs7Ozs7OztBQUdoRSxNQUFNLE9BQU8sMkJBQTJCO0lBS3RDLFlBQW9CLEdBQXNCLEVBQVUsV0FBOEI7UUFBOUQsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxnQkFBVyxHQUFYLFdBQVcsQ0FBbUI7UUFKbEYsUUFBRyxHQUFtQyxTQUFTLENBQUM7UUFBQyxVQUFLLEdBQW1CLEVBQUUsQ0FBQztRQUFDLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQUMsVUFBSyxHQUFrQixFQUFFLENBQUM7UUFBQyxXQUFNLEdBQW1CLEVBQUUsQ0FBQztRQUNwSyxXQUFNLEdBQTBCLElBQUksQ0FBQztRQUFDLFNBQUksR0FBdUIsSUFBSSxDQUFDO1FBQUMsVUFBSyxHQUF3QixJQUFJLENBQUM7UUFBQyxVQUFLLEdBQUcsSUFBSSxDQUFDO1FBQUMsU0FBSSxHQUFHLEtBQUssQ0FBQztRQUFDLFVBQUssR0FBRyxFQUFFLENBQUM7UUFBQyxlQUFVLEdBQUcsRUFBRSxDQUFDO1FBQUMsWUFBTyxHQUFHLEVBQUUsQ0FBQztRQUNoTCxjQUFTLEdBQXNCLEVBQUUsQ0FBQztRQUFDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBQUMsbUJBQWMsR0FBRyxFQUFFLENBQUM7UUFDOUUsYUFBUSxHQUFHLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxnQ0FBZ0MsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxJQUFJLEVBQUUsa0JBQWtCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsdUJBQXVCLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsZUFBZSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsWUFBWSxFQUFFLElBQUksRUFBRSxlQUFlLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxpQkFBaUIsRUFBRSxDQUFDLENBQUM7SUFDelcsQ0FBQztJQUN0RixJQUFJLE9BQU8sS0FBYyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMseUJBQXlCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDL0YsSUFBSSxTQUFTLEtBQWMsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDLGdCQUFnQixDQUFDLDJCQUEyQixDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ25HLFFBQVEsS0FBVyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ2pDLElBQUk7UUFDRixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2xDLElBQUksSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDNUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1NBQ2pLO2FBQU0sSUFBSSxJQUFJLENBQUMsR0FBRyxLQUFLLE9BQU87WUFBRSxJQUFJLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUM7O1lBQ2hMLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM3SixDQUFDO0lBQ0QsU0FBUyxDQUFDLEdBQW1DLElBQVUsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25HLElBQUksQ0FBQyxJQUFZLElBQVksT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssSUFBSSxDQUFDLEVBQUUsSUFBSSxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUM7SUFDMUYsVUFBVSxDQUFDLEtBQXNCLElBQVUsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLEVBQUUsZ0JBQWdCLEVBQUUsRUFBRSxFQUFFLFVBQVUsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdE8sUUFBUSxDQUFDLEtBQW1CLElBQVUsSUFBSSxDQUFDLEtBQUss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Q0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQUMsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7UUFDL0csTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBTSxDQUFDLENBQUM7UUFDcEssT0FBTyxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsT0FBTyxHQUFHLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQy9LLENBQUM7SUFDRCxNQUFNO1FBQ0osTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDckQsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxJQUFJLElBQUksQ0FBQyxJQUFJO1lBQUUsT0FBTztRQUM5QyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyw0QkFBNEIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUM7UUFDNUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLEtBQUssQ0FBQyxJQUFJLFVBQVUsSUFBSSxnREFBZ0QsQ0FBQztZQUFFLE9BQU87UUFDbEcsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFBQyxJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztRQUN2QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2pKLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUM1SyxDQUFDOzt3SEFoRFUsMkJBQTJCOzRHQUEzQiwyQkFBMkIsK0RDUHhDLGtnUUF5Q0E7MkZEbENhLDJCQUEyQjtrQkFEdkMsU0FBUzsrQkFBYSx5QkFBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgUGVybWlzc2lvblNlcnZpY2UgfSBmcm9tICdAYWJwL25nLmNvcmUnO1xuaW1wb3J0IHsgTW92ZW1lbnREZXRhaWwsIE1vdmVtZW50VHlwZSwgUXVhbGl0eVNoaWZ0LCBRdWFsaXR5VGFuaywgUXVhbGl0eUxhYm9yYW50IH0gZnJvbSAnLi4vbW9kZWxzL2ludGFrZS5tb2RlbHMnO1xuaW1wb3J0IHsgUXVhbGl0eUFwaVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9xdWFsaXR5LWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IGVycm9yTWVzc2FnZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktbWVhc3VyZW1lbnRzJztcblxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLXF1YWxpdHktZGVmaW5pdGlvbnMnLCB0ZW1wbGF0ZVVybDogJy4vcXVhbGl0eS1kZWZpbml0aW9ucy5jb21wb25lbnQuaHRtbCcsIHN0eWxlVXJsczogWycuL2ludGFrZS5jb21wb25lbnQuc2NzcyddIH0pXG5leHBvcnQgY2xhc3MgUXVhbGl0eURlZmluaXRpb25zQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgdGFiOiAnZGV0YWlscycgfCAndGFua3MnIHwgJ3NoaWZ0cycgPSAnZGV0YWlscyc7IHR5cGVzOiBNb3ZlbWVudFR5cGVbXSA9IFtdOyBkZXRhaWxzOiBNb3ZlbWVudERldGFpbFtdID0gW107IHRhbmtzOiBRdWFsaXR5VGFua1tdID0gW107IHNoaWZ0czogUXVhbGl0eVNoaWZ0W10gPSBbXTtcbiAgZGV0YWlsOiBNb3ZlbWVudERldGFpbCB8IG51bGwgPSBudWxsOyB0YW5rOiBRdWFsaXR5VGFuayB8IG51bGwgPSBudWxsOyBzaGlmdDogUXVhbGl0eVNoaWZ0IHwgbnVsbCA9IG51bGw7IGlzTmV3ID0gdHJ1ZTsgYnVzeSA9IGZhbHNlOyBlcnJvciA9ICcnOyBtb2RhbEVycm9yID0gJyc7IHN1Y2Nlc3MgPSAnJztcbiAgbGFib3JhbnRzOiBRdWFsaXR5TGFib3JhbnRbXSA9IFtdOyBsYWJvcmFudHNCdXN5ID0gZmFsc2U7IGxhYm9yYW50c0Vycm9yID0gJyc7XG4gIHByb2ZpbGVzID0gW3sgY29kZTogJycsIG5hbWU6ICdTb3J1bGFyxLEga2VuZGltIHRhbsSxbWxheWFjYcSfxLFtJyB9LCB7IGNvZGU6ICdSQVcnLCBuYW1lOiAnSGFtIEF5w6dpw6dlayBZYcSfxLEnIH0sIHsgY29kZTogJ1JFRklORUQnLCBuYW1lOiAnUmFmaW5lIFlhxJ8nIH0sIHsgY29kZTogJ1BBTE0nLCBuYW1lOiAnUGFsbSBPaWwgLyBQYWxtIE9sZWluJyB9LCB7IGNvZGU6ICdDT0FMJywgbmFtZTogJ0vDtm3DvHInIH0sIHsgY29kZTogJ05BT0gnLCBuYW1lOiAnS29zdGlrIChOYU9IKScgfSwgeyBjb2RlOiAnUEhPU1BIT1JJQycsIG5hbWU6ICdGb3Nmb3JpayBBc2l0JyB9LCB7IGNvZGU6ICdTVUxGVVJJQycsIG5hbWU6ICdTw7xsZsO8cmlrIEFzaXQnIH0sIHsgY29kZTogJ1BFUkxJVEUnLCBuYW1lOiAnUGVybGl0JyB9LCB7IGNvZGU6ICdFQVJUSCcsIG5hbWU6ICdBxJ9hcnRtYSBUb3ByYcSfxLEnIH1dO1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGFwaTogUXVhbGl0eUFwaVNlcnZpY2UsIHByaXZhdGUgcGVybWlzc2lvbnM6IFBlcm1pc3Npb25TZXJ2aWNlKSB7fVxuICBnZXQgY2FuRWRpdCgpOiBib29sZWFuIHsgcmV0dXJuIHRoaXMucGVybWlzc2lvbnMuZ2V0R3JhbnRlZFBvbGljeSgnS2FsaXRlLkRlZmluaXRpb25zLkVkaXQnKTsgfVxuICBnZXQgY2FuRGVsZXRlKCk6IGJvb2xlYW4geyByZXR1cm4gdGhpcy5wZXJtaXNzaW9ucy5nZXRHcmFudGVkUG9saWN5KCdLYWxpdGUuRGVmaW5pdGlvbnMuRGVsZXRlJyk7IH1cbiAgbmdPbkluaXQoKTogdm9pZCB7IHRoaXMubG9hZCgpOyB9XG4gIGxvYWQoKTogdm9pZCB7XG4gICAgdGhpcy5idXN5ID0gdHJ1ZTsgdGhpcy5lcnJvciA9ICcnO1xuICAgIGlmICh0aGlzLnRhYiA9PT0gJ2RldGFpbHMnKSB7XG4gICAgICB0aGlzLmFwaS5tb3ZlbWVudFR5cGVzKCkuc3Vic2NyaWJlKHsgbmV4dDogeCA9PiB0aGlzLnR5cGVzID0geCwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTtcbiAgICAgIHRoaXMuYXBpLm1vdmVtZW50RGV0YWlscygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4geyB0aGlzLmRldGFpbHMgPSB4OyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSwgZXJyb3I6IGUgPT4geyB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSB9KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMudGFiID09PSAndGFua3MnKSB0aGlzLmFwaS50YW5rcygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4geyB0aGlzLnRhbmtzID0geDsgdGhpcy5idXN5ID0gZmFsc2U7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5idXN5ID0gZmFsc2U7IH0gfSk7XG4gICAgZWxzZSB0aGlzLmFwaS5zaGlmdHMoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHsgdGhpcy5zaGlmdHMgPSB4OyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSwgZXJyb3I6IGUgPT4geyB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSB9KTtcbiAgfVxuICBzZWxlY3RUYWIodGFiOiAnZGV0YWlscycgfCAndGFua3MnIHwgJ3NoaWZ0cycpOiB2b2lkIHsgdGhpcy50YWIgPSB0YWI7IHRoaXMuY2xvc2UoKTsgdGhpcy5sb2FkKCk7IH1cbiAgbmFtZShjb2RlOiBzdHJpbmcpOiBzdHJpbmcgeyByZXR1cm4gdGhpcy50eXBlcy5maW5kKHggPT4geC5jb2RlID09PSBjb2RlKT8ubmFtZSB8fCBjb2RlOyB9XG4gIG9wZW5EZXRhaWwodmFsdWU/OiBNb3ZlbWVudERldGFpbCk6IHZvaWQgeyB0aGlzLmVycm9yID0gJyc7IHRoaXMubW9kYWxFcnJvciA9ICcnOyB0aGlzLmlzTmV3ID0gIXZhbHVlOyB0aGlzLmRldGFpbCA9IHZhbHVlID8geyAuLi52YWx1ZSB9IDogeyBjb2RlOiAnJywgbW92ZW1lbnRUeXBlQ29kZTogJycsIGRldGFpbENvZGU6ICcnLCBuYW1lOiAnJywgcHJvZmlsZTogJycsIGFjdGl2ZTogdHJ1ZSB9OyB9XG4gIG9wZW5UYW5rKHZhbHVlPzogUXVhbGl0eVRhbmspOiB2b2lkIHsgdGhpcy5lcnJvciA9ICcnOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgdGhpcy5pc05ldyA9ICF2YWx1ZTsgdGhpcy50YW5rID0gdmFsdWUgPyB7IC4uLnZhbHVlIH0gOiB7IGNvZGU6ICcnLCBuYW1lOiAnJywgdHlwZTogJ1JhdycsIGNhcGFjaXR5OiBudWxsLCBhY3RpdmU6IHRydWUgfTsgfVxuICBvcGVuU2hpZnQodmFsdWU/OiBRdWFsaXR5U2hpZnQpOiB2b2lkIHtcbiAgICB0aGlzLmVycm9yID0gJyc7IHRoaXMubW9kYWxFcnJvciA9ICcnO1xuICAgIHRoaXMuaXNOZXcgPSAhdmFsdWU7XG4gICAgdGhpcy5zaGlmdCA9IHZhbHVlID8geyAuLi52YWx1ZSwgYW5hbHlzdFVzZXJJZDogdmFsdWUuYW5hbHlzdFVzZXJJZCB8fCBudWxsIH0gOiB7IGNvZGU6ICcnLCBuYW1lOiAnJywgc3RhcnRIb3VyOiA3LCBlbmRIb3VyOiAxNSwgYW5hbHlzdDogJycsIGFuYWx5c3RVc2VySWQ6IG51bGwsIGFjdGl2ZTogdHJ1ZSB9O1xuICAgIHRoaXMubGFib3JhbnRzID0gW107IHRoaXMubGFib3JhbnRzQnVzeSA9IHRydWU7IHRoaXMubGFib3JhbnRzRXJyb3IgPSAnJztcbiAgICB0aGlzLmFwaS5sYWJvcmFudHMoKS5zdWJzY3JpYmUoeyBuZXh0OiB4ID0+IHsgdGhpcy5sYWJvcmFudHMgPSB4OyB0aGlzLmxhYm9yYW50c0J1c3kgPSBmYWxzZTsgfSxcbiAgICAgIGVycm9yOiBlID0+IHsgdGhpcy5sYWJvcmFudHNFcnJvciA9IGVycm9yTWVzc2FnZShlKTsgdGhpcy5sYWJvcmFudHNCdXN5ID0gZmFsc2U7IH0gfSk7XG4gIH1cbiAgbGFib3JhbnRDaGFuZ2VkKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLnNoaWZ0KSB0aGlzLnNoaWZ0LmFuYWx5c3QgPSB0aGlzLmxhYm9yYW50cy5maW5kKHggPT4geC5pZCA9PT0gdGhpcy5zaGlmdCEuYW5hbHlzdFVzZXJJZCk/LnVzZXJOYW1lIHx8ICcnO1xuICB9XG4gIGdldCBzZWxlY3RlZExhYm9yYW50TWlzc2luZygpOiBib29sZWFuIHsgcmV0dXJuICEhdGhpcy5zaGlmdD8uYW5hbHlzdFVzZXJJZCAmJiAhdGhpcy5sYWJvcmFudHMuc29tZSh4ID0+IHguaWQgPT09IHRoaXMuc2hpZnQhLmFuYWx5c3RVc2VySWQpOyB9XG4gIGNsb3NlKCk6IHZvaWQgeyB0aGlzLmRldGFpbCA9IG51bGw7IHRoaXMudGFuayA9IG51bGw7IHRoaXMuc2hpZnQgPSBudWxsOyB0aGlzLm1vZGFsRXJyb3IgPSAnJzsgfVxuICBzYXZlKCk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlID0gdGhpcy5kZXRhaWwgfHwgdGhpcy50YW5rIHx8IHRoaXMuc2hpZnQ7IGlmICghdmFsdWUpIHJldHVybjtcbiAgICB2YWx1ZS5jb2RlID0gdGhpcy5pc05ldyA/IHZhbHVlLmNvZGUudHJpbSgpLnRvVXBwZXJDYXNlKCkgOiB2YWx1ZS5jb2RlOyB0aGlzLmJ1c3kgPSB0cnVlOyB0aGlzLm1vZGFsRXJyb3IgPSAnJztcbiAgICBjb25zdCByZXF1ZXN0ID0gdGhpcy5kZXRhaWwgPyB0aGlzLmFwaS5zYXZlRGV0YWlsKHRoaXMuZGV0YWlsLCB0aGlzLmlzTmV3KSA6IHRoaXMudGFuayA/IHRoaXMuYXBpLnNhdmVUYW5rKHRoaXMudGFuaywgdGhpcy5pc05ldykgOiB0aGlzLmFwaS5zYXZlU2hpZnQodGhpcy5zaGlmdCEpO1xuICAgIHJlcXVlc3Quc3Vic2NyaWJlKHsgbmV4dDogKCkgPT4geyB0aGlzLmNsb3NlKCk7IHRoaXMuc3VjY2VzcyA9ICdUYW7EsW0ga2F5ZGVkaWxkaS4nOyB0aGlzLmxvYWQoKTsgfSwgZXJyb3I6IGUgPT4geyB0aGlzLm1vZGFsRXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9IH0pO1xuICB9XG4gIGRlbGV0ZSgpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IHRoaXMuZGV0YWlsIHx8IHRoaXMudGFuayB8fCB0aGlzLnNoaWZ0O1xuICAgIGlmICghdmFsdWUgfHwgdGhpcy5pc05ldyB8fCB0aGlzLmJ1c3kpIHJldHVybjtcbiAgICBjb25zdCB0eXBlID0gdGhpcy5kZXRhaWwgPyAnYXJhw6cgaGFyZWtldCB0w7xyw7wgZGV0YXnEsW7EsScgOiB0aGlzLnRhbmsgPyAndGFua8SxJyA6ICd2YXJkaXlhecSxJztcbiAgICBpZiAoIWNvbmZpcm0oYCR7dmFsdWUuY29kZX0ga29kbHUgJHt0eXBlfSB2ZSBiYcSfbMSxIHRhbsSxbWxhcsSxIGthbMSxY8SxIG9sYXJhayBzaWxpbnNpbiBtaT9gKSkgcmV0dXJuO1xuICAgIHRoaXMuYnVzeSA9IHRydWU7IHRoaXMubW9kYWxFcnJvciA9ICcnO1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmRldGFpbCA/IHRoaXMuYXBpLmRlbGV0ZURldGFpbCh2YWx1ZS5jb2RlKSA6IHRoaXMudGFuayA/IHRoaXMuYXBpLmRlbGV0ZVRhbmsodmFsdWUuY29kZSkgOiB0aGlzLmFwaS5kZWxldGVTaGlmdCh2YWx1ZS5jb2RlKTtcbiAgICByZXF1ZXN0LnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHsgdGhpcy5jbG9zZSgpOyB0aGlzLnN1Y2Nlc3MgPSAnVGFuxLFtIHNpbGluZGkuJzsgdGhpcy5sb2FkKCk7IH0sIGVycm9yOiBlID0+IHsgdGhpcy5tb2RhbEVycm9yID0gZXJyb3JNZXNzYWdlKGUpOyB0aGlzLmJ1c3kgPSBmYWxzZTsgfSB9KTtcbiAgfVxufVxuIiwiPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5LYWxpdGUgVGFuxLFtbGFyxLE8L2gzPjxkaXYgY2xhc3M9XCJjYXJkXCI+PGRpdiBjbGFzcz1cImNhcmQtYm9keVwiPlxuICA8ZGl2IGNsYXNzPVwiZC1mbGV4IGp1c3RpZnktY29udGVudC1iZXR3ZWVuIG1iLTNcIj48ZGl2IGNsYXNzPVwiYnRuLWdyb3VwXCI+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIFtjbGFzcy5idG4tcHJpbWFyeV09XCJ0YWIgPT09ICdkZXRhaWxzJ1wiIFtjbGFzcy5idG4tb3V0bGluZS1zZWNvbmRhcnldPVwidGFiICE9PSAnZGV0YWlscydcIiAoY2xpY2spPVwic2VsZWN0VGFiKCdkZXRhaWxzJylcIj5BcmHDpyBIYXJla2V0IFTDvHJsZXJpIERldGF5PC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIFtjbGFzcy5idG4tcHJpbWFyeV09XCJ0YWIgPT09ICd0YW5rcydcIiBbY2xhc3MuYnRuLW91dGxpbmUtc2Vjb25kYXJ5XT1cInRhYiAhPT0gJ3RhbmtzJ1wiIChjbGljayk9XCJzZWxlY3RUYWIoJ3RhbmtzJylcIj5UYW5rbGFyPC9idXR0b24+XG4gICAgPGJ1dHRvbiBjbGFzcz1cImJ0blwiIFtjbGFzcy5idG4tcHJpbWFyeV09XCJ0YWIgPT09ICdzaGlmdHMnXCIgW2NsYXNzLmJ0bi1vdXRsaW5lLXNlY29uZGFyeV09XCJ0YWIgIT09ICdzaGlmdHMnXCIgKGNsaWNrKT1cInNlbGVjdFRhYignc2hpZnRzJylcIj5WYXJkaXlhbGFyPC9idXR0b24+XG4gIDwvZGl2PjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiAqbmdJZj1cImNhbkVkaXRcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIChjbGljayk9XCJ0YWIgPT09ICdkZXRhaWxzJyA/IG9wZW5EZXRhaWwoKSA6IHRhYiA9PT0gJ3RhbmtzJyA/IG9wZW5UYW5rKCkgOiBvcGVuU2hpZnQoKVwiPisgWWVuaSBLYXnEsXQ8L2J1dHRvbj48L2Rpdj5cbiAgPGRpdiAqbmdJZj1cImVycm9yXCIgY2xhc3M9XCJhbGVydCBhbGVydC1kYW5nZXJcIj57eyBlcnJvciB9fTwvZGl2PjxkaXYgKm5nSWY9XCJzdWNjZXNzXCIgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+e3sgc3VjY2VzcyB9fTwvZGl2PjxkaXYgKm5nSWY9XCJidXN5XCIgY2xhc3M9XCJxdWFsaXR5LWxvYWRpbmdcIiByb2xlPVwic3RhdHVzXCI+VGFuxLFtbGFyIHnDvGtsZW5peW9y4oCmPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ0YWJsZS1yZXNwb25zaXZlXCIgW2hpZGRlbl09XCJidXN5XCI+XG4gICAgPHRhYmxlICpuZ0lmPVwidGFiID09PSAnZGV0YWlscydcIiBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWRcIj48dGhlYWQ+PHRyPjx0aD7EsMWfbGVtbGVyPC90aD48dGg+QXJhw6cgSGFyZWtldCBUw7xyw7w8L3RoPjx0aD5EZXRheSBLb2R1PC90aD48dGg+RGV0YXkgQWTEsTwvdGg+PHRoPkFrdGlmPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0ciAqbmdGb3I9XCJsZXQgZCBvZiBkZXRhaWxzXCI+PHRkPjxidXR0b24gKm5nSWY9XCJjYW5FZGl0XCIgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1vdXRsaW5lLXByaW1hcnlcIiAoY2xpY2spPVwib3BlbkRldGFpbChkKVwiPkTDvHplbmxlPC9idXR0b24+PGEgY2xhc3M9XCJxdWFsaXR5LXF1ZXN0aW9ucy1saW5rXCIgW3JvdXRlckxpbmtdPVwiWycva2FsaXRlL3BhcmFtZXRlcnMnXVwiIFtxdWVyeVBhcmFtc109XCJ7dHlwZTogJ0lucHV0JywgZGV0YWlsOiBkLmNvZGV9XCI+S2FsaXRlIFNvcnVsYXLEsTwvYT48L3RkPjx0ZD57eyBuYW1lKGQubW92ZW1lbnRUeXBlQ29kZSkgfX08L3RkPjx0ZD57eyBkLmRldGFpbENvZGUgfHwgJ+KAlCcgfX08L3RkPjx0ZD57eyBkLm5hbWUgfHwgJ+KAlCcgfX08L3RkPjx0ZD57eyBkLmFjdGl2ZSA/ICdFdmV0JyA6ICdIYXnEsXInIH19PC90ZD48L3RyPjwvdGJvZHk+PC90YWJsZT5cbiAgICA8dGFibGUgKm5nSWY9XCJ0YWIgPT09ICd0YW5rcydcIiBjbGFzcz1cInRhYmxlIHRhYmxlLXN0cmlwZWQgdGFibGUtYm9yZGVyZWRcIj48dGhlYWQ+PHRyPjx0aD7EsMWfbGVtbGVyPC90aD48dGg+S29kPC90aD48dGg+QWQ8L3RoPjx0aD5UaXA8L3RoPjx0aD5LYXBhc2l0ZTwvdGg+PHRoPkFrdGlmPC90aD48L3RyPjwvdGhlYWQ+PHRib2R5Pjx0ciAqbmdGb3I9XCJsZXQgdCBvZiB0YW5rc1wiPjx0ZD48YnV0dG9uICpuZ0lmPVwiY2FuRWRpdFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cIm9wZW5UYW5rKHQpXCI+RMO8emVubGU8L2J1dHRvbj48L3RkPjx0ZD57eyB0LmNvZGUgfX08L3RkPjx0ZD57eyB0Lm5hbWUgfX08L3RkPjx0ZD57eyB0LnR5cGUgPT09ICdSYXcnID8gJ0hhbSBZYcSfJyA6IHQudHlwZSA9PT0gJ1JlZmluZWQnID8gJ1JhZmluZScgOiB0LnR5cGUgPT09ICdQcm9kdWN0JyA/ICfDnHLDvG4nIDogJ0FyYScgfX08L3RkPjx0ZD57eyB0LmNhcGFjaXR5IH19PC90ZD48dGQ+e3sgdC5hY3RpdmUgPyAnRXZldCcgOiAnSGF5xLFyJyB9fTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+XG4gICAgPHRhYmxlICpuZ0lmPVwidGFiID09PSAnc2hpZnRzJ1wiIGNsYXNzPVwidGFibGUgdGFibGUtc3RyaXBlZCB0YWJsZS1ib3JkZXJlZFwiPjx0aGVhZD48dHI+PHRoPsSwxZ9sZW1sZXI8L3RoPjx0aD5Lb2Q8L3RoPjx0aD5BZDwvdGg+PHRoPkJhxZ9sYW5nxLHDpzwvdGg+PHRoPkJpdGnFnzwvdGg+PHRoPkxhYm9yYW50PC90aD48dGg+QWt0aWY8L3RoPjwvdHI+PC90aGVhZD48dGJvZHk+PHRyICpuZ0Zvcj1cImxldCBzIG9mIHNoaWZ0c1wiPjx0ZD48YnV0dG9uICpuZ0lmPVwiY2FuRWRpdFwiIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tb3V0bGluZS1wcmltYXJ5XCIgKGNsaWNrKT1cIm9wZW5TaGlmdChzKVwiPkTDvHplbmxlPC9idXR0b24+PC90ZD48dGQ+e3sgcy5jb2RlIH19PC90ZD48dGQ+e3sgcy5uYW1lIH19PC90ZD48dGQ+e3sgcy5zdGFydEhvdXIgfCBudW1iZXI6JzIuMC0wJyB9fTowMDwvdGQ+PHRkPnt7IHMuZW5kSG91ciB8IG51bWJlcjonMi4wLTAnIH19OjAwPC90ZD48dGQ+e3sgcy5hbmFseXN0IH19PC90ZD48dGQ+e3sgcy5hY3RpdmUgPyAnRXZldCcgOiAnSGF5xLFyJyB9fTwvdGQ+PC90cj48L3Rib2R5PjwvdGFibGU+XG4gIDwvZGl2PjxwICpuZ0lmPVwidGFiID09PSAnZGV0YWlscydcIiBjbGFzcz1cInRleHQtbXV0ZWRcIj5FdGtpbiB0YW7EsW1sYXJkYSBidWx1bmFuIGFyYcOnIGhhcmVrZXQgdMO8cmxlcmkga2FsaXRlIGtvbnRyb2xlIHRhYmlkaXIuIERldGF5IGtvZHUgdmUgYWTEsSBib8WfIGLEsXJha8SxbGFyYWsgeWFsbsSxeiBoYXJla2V0IHTDvHLDvCBiYcWfbMSxxJ/EsSB0YW7EsW1sYW5hYmlsaXIuPC9wPlxuPC9kaXY+PC9kaXY+PC9kaXY+XG48YWJwLW1vZGFsIFt2aXNpYmxlXT1cIiEhKGRldGFpbCB8fCB0YW5rIHx8IHNoaWZ0KVwiICh2aXNpYmxlQ2hhbmdlKT1cIiEkZXZlbnQgJiYgY2xvc2UoKVwiIFtidXN5XT1cImJ1c3lcIiBbb3B0aW9uc109XCJ7c2l6ZTogJ2xnJ31cIj5cbiAgPG5nLXRlbXBsYXRlICNhYnBIZWFkZXI+PGg1Pnt7IGlzTmV3ID8gJ1llbmkgVGFuxLFtJyA6ICdUYW7EsW3EsSBEw7x6ZW5sZScgfX08L2g1PjwvbmctdGVtcGxhdGU+XG4gIDxuZy10ZW1wbGF0ZSAjYWJwQm9keT48ZGl2ICpuZ0lmPVwibW9kYWxFcnJvclwiIGNsYXNzPVwiYWxlcnQgYWxlcnQtZGFuZ2VyXCI+e3sgbW9kYWxFcnJvciB9fTwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJkZXRhaWwgYXMgZFwiIGNsYXNzPVwicm93XCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj48bGFiZWw+S2F5xLF0IEtvZHUgKjwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkLmNvZGVcIiBbZGlzYWJsZWRdPVwiIWlzTmV3XCIgbWF4bGVuZ3RoPVwiMjRcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPjxsYWJlbD5BcmHDpyBIYXJla2V0IFTDvHLDvCAqPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkLm1vdmVtZW50VHlwZUNvZGVcIiBbZGlzYWJsZWRdPVwiIWlzTmV3XCI+PG9wdGlvbiB2YWx1ZT1cIlwiPlNlw6dpbjwvb3B0aW9uPjxvcHRpb24gKm5nRm9yPVwibGV0IHR5cGUgb2YgdHlwZXNcIiBbdmFsdWVdPVwidHlwZS5jb2RlXCI+e3sgdHlwZS5uYW1lIH19PC9vcHRpb24+PC9zZWxlY3Q+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgbXQtM1wiPjxsYWJlbD5EZXRheSBLb2R1PC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImQuZGV0YWlsQ29kZVwiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC04IG10LTNcIj48bGFiZWw+RGV0YXkgQWTEsTwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJkLm5hbWVcIiAvPjwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC0zXCI+PGxhYmVsPkJhxZ9sYW5nxLHDpyBTb3J1bGFyxLE8L2xhYmVsPjxzZWxlY3QgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cImQucHJvZmlsZVwiIFtkaXNhYmxlZF09XCIhaXNOZXdcIj48b3B0aW9uICpuZ0Zvcj1cImxldCBwIG9mIHByb2ZpbGVzXCIgW3ZhbHVlXT1cInAuY29kZVwiPnt7IHAubmFtZSB9fTwvb3B0aW9uPjwvc2VsZWN0PjxzbWFsbCBjbGFzcz1cInRleHQtbXV0ZWRcIj5TZcOnaWxlbiDFn2FibG9udW4gc29ydWxhcsSxIHZlIGxpbWl0bGVyaSBLYWxpdGUgUGFyYW1ldHJlbGVyaSBla3JhbsSxbmRhbiBkw7x6ZW5sZW5lYmlsaXIuPC9zbWFsbD48L2Rpdj48ZGl2IGNsYXNzPVwiY29sLW1kLTEyIG10LTNcIj48bGFiZWw+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwiZC5hY3RpdmVcIiAvPiBBa3RpZjwvbGFiZWw+PC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiAqbmdJZj1cInRhbmsgYXMgdFwiIGNsYXNzPVwicm93XCI+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPktvZCAqPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInQuY29kZVwiIFtkaXNhYmxlZF09XCIhaXNOZXdcIiAvPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtOFwiPjxsYWJlbD5BZCAqPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInQubmFtZVwiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC02IG10LTNcIj48bGFiZWw+VGlwPC9sYWJlbD48c2VsZWN0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJ0LnR5cGVcIj48b3B0aW9uIHZhbHVlPVwiUmF3XCI+SGFtIFlhxJ88L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiUmVmaW5lZFwiPlJhZmluZTwvb3B0aW9uPjxvcHRpb24gdmFsdWU9XCJJbnRlcm1lZGlhdGVcIj5BcmE8L29wdGlvbj48b3B0aW9uIHZhbHVlPVwiUHJvZHVjdFwiPsOccsO8bjwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtNiBtdC0zXCI+PGxhYmVsPkthcGFzaXRlPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjBcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwidC5jYXBhY2l0eVwiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC0zXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInQuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PjwvZGl2PlxuICAgIDxkaXYgKm5nSWY9XCJzaGlmdCBhcyBzXCIgY2xhc3M9XCJyb3dcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtM1wiPjxsYWJlbD5Lb2QgKjwvbGFiZWw+PGlucHV0IGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzLmNvZGVcIiBbZGlzYWJsZWRdPVwiIWlzTmV3XCIgLz48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtOVwiPjxsYWJlbD5BZCAqPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMubmFtZVwiIC8+PC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTQgbXQtM1wiPjxsYWJlbD5CYcWfbGFuZ8Sxw6cgU2FhdGk8L2xhYmVsPjxpbnB1dCB0eXBlPVwibnVtYmVyXCIgbWluPVwiMFwiIG1heD1cIjIzXCIgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMuc3RhcnRIb3VyXCIgLz48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBtdC0zXCI+PGxhYmVsPkJpdGnFnyBTYWF0aTwvbGFiZWw+PGlucHV0IHR5cGU9XCJudW1iZXJcIiBtaW49XCIwXCIgbWF4PVwiMjNcIiBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicy5lbmRIb3VyXCIgLz48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNCBtdC0zXCI+PGxhYmVsPkxhYm9yYW50PC9sYWJlbD5cbiAgICAgICAgPHNlbGVjdCBjbGFzcz1cImZvcm0tY29udHJvbFwiIFsobmdNb2RlbCldPVwicy5hbmFseXN0VXNlcklkXCIgKGNoYW5nZSk9XCJsYWJvcmFudENoYW5nZWQoKVwiIFtkaXNhYmxlZF09XCJidXN5IHx8IGxhYm9yYW50c0J1c3lcIj5cbiAgICAgICAgICA8b3B0aW9uIFtuZ1ZhbHVlXT1cIm51bGxcIj57eyAhcy5hbmFseXN0VXNlcklkICYmIHMuYW5hbHlzdCA/ICdNZXZjdXQ6ICcgKyBzLmFuYWx5c3QgKyAnIChlc2tpIGthecSxdCknIDogJ1Nlw6dpbicgfX08L29wdGlvbj5cbiAgICAgICAgICA8b3B0aW9uICpuZ0lmPVwic2VsZWN0ZWRMYWJvcmFudE1pc3NpbmdcIiBbbmdWYWx1ZV09XCJzLmFuYWx5c3RVc2VySWRcIiBkaXNhYmxlZD57eyBzLmFuYWx5c3QgfX0gKHNlw6dpbGViaWxpciBkZcSfaWwpPC9vcHRpb24+XG4gICAgICAgICAgPG9wdGlvbiAqbmdGb3I9XCJsZXQgdXNlciBvZiBsYWJvcmFudHNcIiBbbmdWYWx1ZV09XCJ1c2VyLmlkXCI+e3sgdXNlci51c2VyTmFtZSB9fTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwibGFib3JhbnRzQnVzeVwiIGNsYXNzPVwidGV4dC1tdXRlZFwiPkt1bGxhbsSxY8SxbGFyIHnDvGtsZW5peW9y4oCmPC9zbWFsbD5cbiAgICAgICAgPHNtYWxsICpuZ0lmPVwiIWxhYm9yYW50c0J1c3kgJiYgIWxhYm9yYW50c0Vycm9yICYmICFsYWJvcmFudHMubGVuZ3RoXCIgY2xhc3M9XCJ0ZXh0LW11dGVkXCI+QnUgZmlybWFkYSBha3RpZiB2ZSBwcm9zZXMgdmVyaSBnaXJpxZ9pIHlldGtpc2kgb2xhbiBrdWxsYW7EsWPEsSBidWx1bmFtYWTEsS48L3NtYWxsPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwibGFib3JhbnRzRXJyb3JcIiBjbGFzcz1cInRleHQtZGFuZ2VyXCIgcm9sZT1cImFsZXJ0XCI+e3sgbGFib3JhbnRzRXJyb3IgfX08L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xMiBtdC0zXCI+PGxhYmVsPjxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBbKG5nTW9kZWwpXT1cInMuYWN0aXZlXCIgLz4gQWt0aWY8L2xhYmVsPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPjxuZy10ZW1wbGF0ZSAjYWJwRm9vdGVyPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRhbmdlciBtci1hdXRvXCIgKm5nSWY9XCJjYW5EZWxldGUgJiYgIWlzTmV3XCIgW2Rpc2FibGVkXT1cImJ1c3lcIiAoY2xpY2spPVwiZGVsZXRlKClcIj5TaWw8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1zZWNvbmRhcnlcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIChjbGljayk9XCJjbG9zZSgpXCI+VmF6Z2XDpzwvYnV0dG9uPjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIiBbZGlzYWJsZWRdPVwiYnVzeVwiIChjbGljayk9XCJzYXZlKClcIj5LYXlkZXQ8L2J1dHRvbj48L25nLXRlbXBsYXRlPlxuPC9hYnAtbW9kYWw+XG4iXX0=
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { Component } from '@angular/core';
|
|
2
|
+
import { errorMessage } from '../services/quality-measurements';
|
|
3
|
+
import { timer, of } from 'rxjs';
|
|
4
|
+
import { switchMap, catchError } from 'rxjs/operators';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/quality-api.service";
|
|
7
|
+
import * as i2 from "@angular/router";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@abp/ng.core";
|
|
10
|
+
import * as i5 from "@angular/forms";
|
|
11
|
+
export class QualityNotificationsComponent {
|
|
12
|
+
constructor(api, router) {
|
|
13
|
+
this.api = api;
|
|
14
|
+
this.router = router;
|
|
15
|
+
this.items = [];
|
|
16
|
+
this.error = '';
|
|
17
|
+
}
|
|
18
|
+
ngOnInit() { this.api.notifications().subscribe({ next: x => this.items = x, error: e => this.error = errorMessage(e) }); }
|
|
19
|
+
read(n) { this.api.readNotification(n.code).subscribe({ next: () => n.isRead = true, error: e => this.error = errorMessage(e) }); }
|
|
20
|
+
open(n) { this.read(n); this.router.navigateByUrl(n.url); }
|
|
21
|
+
}
|
|
22
|
+
QualityNotificationsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationsComponent, deps: [{ token: i1.QualityApiService }, { token: i2.Router }], target: i0.ɵɵFactoryTarget.Component });
|
|
23
|
+
QualityNotificationsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationsComponent, selector: "lib-quality-notifications", ngImport: i0, template: `<div class="container-fluid"><h3>Kalite Bildirimleri</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div class="card mb-2" *ngFor="let n of items"><div class="card-body"><strong>{{n.title}}</strong> <span *ngIf="!n.isRead" class="badge badge-primary">Yeni</span><small class="float-right">{{n.createdAt | date:'dd.MM.yyyy HH:mm'}}</small><div class="mt-2" [innerHTML]="n.body"></div><button class="btn btn-outline-primary mt-2" (click)="open(n)">Kaydı Aç</button><button class="btn btn-outline-secondary mt-2 ml-2" *ngIf="!n.isRead" (click)="read(n)">Okundu İşaretle</button></div></div><p *ngIf="!items.length">Bildirim bulunmuyor.</p></div>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }] });
|
|
24
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationsComponent, decorators: [{
|
|
25
|
+
type: Component,
|
|
26
|
+
args: [{ selector: 'lib-quality-notifications', template: `<div class="container-fluid"><h3>Kalite Bildirimleri</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div class="card mb-2" *ngFor="let n of items"><div class="card-body"><strong>{{n.title}}</strong> <span *ngIf="!n.isRead" class="badge badge-primary">Yeni</span><small class="float-right">{{n.createdAt | date:'dd.MM.yyyy HH:mm'}}</small><div class="mt-2" [innerHTML]="n.body"></div><button class="btn btn-outline-primary mt-2" (click)="open(n)">Kaydı Aç</button><button class="btn btn-outline-secondary mt-2 ml-2" *ngIf="!n.isRead" (click)="read(n)">Okundu İşaretle</button></div></div><p *ngIf="!items.length">Bildirim bulunmuyor.</p></div>` }]
|
|
27
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i2.Router }]; } });
|
|
28
|
+
export class QualityNotificationBellComponent {
|
|
29
|
+
constructor(api, config) {
|
|
30
|
+
this.api = api;
|
|
31
|
+
this.config = config;
|
|
32
|
+
this.count = 0;
|
|
33
|
+
}
|
|
34
|
+
ngOnInit() { this.subscription = this.config.getOne$('currentUser').pipe(switchMap(user => user?.isAuthenticated ? timer(0, 60000).pipe(switchMap(() => this.api.unreadNotifications().pipe(catchError(() => of(0))))) : of(0))).subscribe(count => this.count = count); }
|
|
35
|
+
ngOnDestroy() { this.subscription?.unsubscribe(); }
|
|
36
|
+
}
|
|
37
|
+
QualityNotificationBellComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationBellComponent, deps: [{ token: i1.QualityApiService }, { token: i4.ConfigStateService }], target: i0.ɵɵFactoryTarget.Component });
|
|
38
|
+
QualityNotificationBellComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationBellComponent, selector: "lib-quality-notification-bell", ngImport: i0, template: `<a class="nav-link position-relative" routerLink="/kalite/notifications" aria-label="Kalite bildirimleri"><i class="fas fa-bell" aria-hidden="true"></i><span class="badge badge-danger" *ngIf="count">{{count}}</span></a>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.RouterLinkWithHref, selector: "a[routerLink],area[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }] });
|
|
39
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationBellComponent, decorators: [{
|
|
40
|
+
type: Component,
|
|
41
|
+
args: [{ selector: 'lib-quality-notification-bell', template: `<a class="nav-link position-relative" routerLink="/kalite/notifications" aria-label="Kalite bildirimleri"><i class="fas fa-bell" aria-hidden="true"></i><span class="badge badge-danger" *ngIf="count">{{count}}</span></a>` }]
|
|
42
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }, { type: i4.ConfigStateService }]; } });
|
|
43
|
+
export class QualityNotificationSettingsComponent {
|
|
44
|
+
constructor(api) {
|
|
45
|
+
this.api = api;
|
|
46
|
+
this.settings = null;
|
|
47
|
+
this.failures = [];
|
|
48
|
+
this.qualityRoles = '';
|
|
49
|
+
this.securityRoles = '';
|
|
50
|
+
this.error = '';
|
|
51
|
+
this.success = '';
|
|
52
|
+
this.busy = false;
|
|
53
|
+
}
|
|
54
|
+
ngOnInit() { this.api.notificationFailures().subscribe({ next: x => this.failures = x }); this.api.notificationSettings().subscribe({ next: x => { this.settings = x; this.qualityRoles = x.qualityRoles.join('\n'); this.securityRoles = x.securityRoles.join('\n'); }, error: e => this.error = errorMessage(e) }); }
|
|
55
|
+
save() { if (!this.settings)
|
|
56
|
+
return; this.busy = true; this.settings.qualityRoles = this.qualityRoles.split('\n').map(x => x.trim()).filter(Boolean); this.settings.securityRoles = this.securityRoles.split('\n').map(x => x.trim()).filter(Boolean); this.api.saveNotificationSettings(this.settings).subscribe({ next: () => { this.busy = false; this.success = 'Bildirim ayarları kaydedildi.'; }, error: e => { this.error = errorMessage(e); this.busy = false; } }); }
|
|
57
|
+
}
|
|
58
|
+
QualityNotificationSettingsComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationSettingsComponent, deps: [{ token: i1.QualityApiService }], target: i0.ɵɵFactoryTarget.Component });
|
|
59
|
+
QualityNotificationSettingsComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: QualityNotificationSettingsComponent, selector: "lib-quality-notification-settings", ngImport: i0, template: `<div class="container-fluid"><h3>Kalite Bildirim Ayarları</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div *ngIf="success" class="alert alert-success">{{success}}</div><div class="card" *ngIf="settings as s"><div class="card-body"><label class="d-block"><input type="checkbox" [(ngModel)]="s.portalEnabled" /> Portal içi bildirim</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.emailEnabled" /> E-posta bildirimi</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.reminderEnabled" /> Bekleyen kontrol hatırlatması</label><label class="mt-3">Portal Adresi (e-posta bağlantıları için)</label><input class="form-control" [(ngModel)]="s.portalBaseUrl" placeholder="https://portal.example.com" /><div class="row mt-3"><div class="col-md-4"><label>Hatırlatma Süresi (dakika)</label><input type="number" min="1" max="10080" class="form-control" [(ngModel)]="s.reminderMinutes" /></div><div class="col-md-4"><label>Kalite Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="qualityRoles"></textarea></div><div class="col-md-4"><label>Ret Bildirimi Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="securityRoles"></textarea></div></div><button class="btn btn-primary mt-3" (click)="save()" [disabled]="busy">Kaydet</button><h5 class="mt-4" *ngIf="failures.length">Gönderim Sorunları</h5><div class="alert alert-warning" *ngFor="let failure of failures">{{failure.title || failure.eventType}} · {{failure.error}}</div></div></div></div>`, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { 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.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"] }] });
|
|
60
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: QualityNotificationSettingsComponent, decorators: [{
|
|
61
|
+
type: Component,
|
|
62
|
+
args: [{ selector: 'lib-quality-notification-settings', template: `<div class="container-fluid"><h3>Kalite Bildirim Ayarları</h3><div *ngIf="error" class="alert alert-danger">{{error}}</div><div *ngIf="success" class="alert alert-success">{{success}}</div><div class="card" *ngIf="settings as s"><div class="card-body"><label class="d-block"><input type="checkbox" [(ngModel)]="s.portalEnabled" /> Portal içi bildirim</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.emailEnabled" /> E-posta bildirimi</label><label class="d-block"><input type="checkbox" [(ngModel)]="s.reminderEnabled" /> Bekleyen kontrol hatırlatması</label><label class="mt-3">Portal Adresi (e-posta bağlantıları için)</label><input class="form-control" [(ngModel)]="s.portalBaseUrl" placeholder="https://portal.example.com" /><div class="row mt-3"><div class="col-md-4"><label>Hatırlatma Süresi (dakika)</label><input type="number" min="1" max="10080" class="form-control" [(ngModel)]="s.reminderMinutes" /></div><div class="col-md-4"><label>Kalite Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="qualityRoles"></textarea></div><div class="col-md-4"><label>Ret Bildirimi Alıcı Rolleri (her satır bir rol)</label><textarea class="form-control" rows="4" [(ngModel)]="securityRoles"></textarea></div></div><button class="btn btn-primary mt-3" (click)="save()" [disabled]="busy">Kaydet</button><h5 class="mt-4" *ngIf="failures.length">Gönderim Sorunları</h5><div class="alert alert-warning" *ngFor="let failure of failures">{{failure.title || failure.eventType}} · {{failure.error}}</div></div></div></div>` }]
|
|
63
|
+
}], ctorParameters: function () { return [{ type: i1.QualityApiService }]; } });
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVhbGl0eS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2thbGl0ZS9zcmMvbGliL2NvbXBvbmVudHMvcXVhbGl0eS1ub3RpZmljYXRpb25zLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFxQixNQUFNLGVBQWUsQ0FBQztBQUc3RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFHaEUsT0FBTyxFQUFnQixLQUFLLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7Ozs7Ozs7QUFHdkQsTUFBTSxPQUFPLDZCQUE2QjtJQUV4QyxZQUFvQixHQUFzQixFQUFVLE1BQWM7UUFBOUMsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBRGxFLFVBQUssR0FBMEIsRUFBRSxDQUFDO1FBQUMsVUFBSyxHQUFHLEVBQUUsQ0FBQztJQUN1QixDQUFDO0lBQ3RFLFFBQVEsS0FBVyxJQUFJLENBQUMsR0FBRyxDQUFDLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssRUFBRSxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDakksSUFBSSxDQUFDLENBQXNCLElBQVUsSUFBSSxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxDQUFDLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFD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QUFwQyxvQ0FBb0MseUVBRHFCLHFpREFBcWlEOzJGQUM5bEQsb0NBQW9DO2tCQURoRCxTQUFTO21CQUFDLEVBQUUsUUFBUSxFQUFFLG1DQUFtQyxFQUFFLFFBQVEsRUFBRSxxaURBQXFpRCxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBPbkluaXQsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBRdWFsaXR5QXBpU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3F1YWxpdHktYXBpLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBRdWFsaXR5Tm90aWZpY2F0aW9uLCBOb3RpZmljYXRpb25TZXR0aW5ncyB9IGZyb20gJy4uL21vZGVscy9pbnRha2UubW9kZWxzJztcclxuaW1wb3J0IHsgZXJyb3JNZXNzYWdlIH0gZnJvbSAnLi4vc2VydmljZXMvcXVhbGl0eS1tZWFzdXJlbWVudHMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5pbXBvcnQgeyBDb25maWdTdGF0ZVNlcnZpY2UsIFBlcm1pc3Npb25TZXJ2aWNlIH0gZnJvbSAnQGFicC9uZy5jb3JlJztcclxuaW1wb3J0IHsgU3Vic2NyaXB0aW9uLCB0aW1lciwgb2YgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgc3dpdGNoTWFwLCBjYXRjaEVycm9yIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7IHNlbGVjdG9yOiAnbGliLXF1YWxpdHktbm90aWZpY2F0aW9ucycsIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5LYWxpdGUgQmlsZGlyaW1sZXJpPC9oMz48ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7ZXJyb3J9fTwvZGl2PjxkaXYgY2xhc3M9XCJjYXJkIG1iLTJcIiAqbmdGb3I9XCJsZXQgbiBvZiBpdGVtc1wiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj48c3Ryb25nPnt7bi50aXRsZX19PC9zdHJvbmc+IDxzcGFuICpuZ0lmPVwiIW4uaXNSZWFkXCIgY2xhc3M9XCJiYWRnZSBiYWRnZS1wcmltYXJ5XCI+WWVuaTwvc3Bhbj48c21hbGwgY2xhc3M9XCJmbG9hdC1yaWdodFwiPnt7bi5jcmVhdGVkQXQgfCBkYXRlOidkZC5NTS55eXl5IEhIOm1tJ319PC9zbWFsbD48ZGl2IGNsYXNzPVwibXQtMlwiIFtpbm5lckhUTUxdPVwibi5ib2R5XCI+PC9kaXY+PGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tb3V0bGluZS1wcmltYXJ5IG10LTJcIiAoY2xpY2spPVwib3BlbihuKVwiPktheWTEsSBBw6c8L2J1dHRvbj48YnV0dG9uIGNsYXNzPVwiYnRuIGJ0bi1vdXRsaW5lLXNlY29uZGFyeSBtdC0yIG1sLTJcIiAqbmdJZj1cIiFuLmlzUmVhZFwiIChjbGljayk9XCJyZWFkKG4pXCI+T2t1bmR1IMSwxZ9hcmV0bGU8L2J1dHRvbj48L2Rpdj48L2Rpdj48cCAqbmdJZj1cIiFpdGVtcy5sZW5ndGhcIj5CaWxkaXJpbSBidWx1bm11eW9yLjwvcD48L2Rpdj5gIH0pXHJcbmV4cG9ydCBjbGFzcyBRdWFsaXR5Tm90aWZpY2F0aW9uc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XHJcbiAgaXRlbXM6IFF1YWxpdHlOb3RpZmljYXRpb25bXSA9IFtdOyBlcnJvciA9ICcnO1xyXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgYXBpOiBRdWFsaXR5QXBpU2VydmljZSwgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcikge31cclxuICBuZ09uSW5pdCgpOiB2b2lkIHsgdGhpcy5hcGkubm90aWZpY2F0aW9ucygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4gdGhpcy5pdGVtcyA9IHgsIGVycm9yOiBlID0+IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSkgfSk7IH1cclxuICByZWFkKG46IFF1YWxpdHlOb3RpZmljYXRpb24pOiB2b2lkIHsgdGhpcy5hcGkucmVhZE5vdGlmaWNhdGlvbihuLmNvZGUpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IG4uaXNSZWFkID0gdHJ1ZSwgZXJyb3I6IGUgPT4gdGhpcy5lcnJvciA9IGVycm9yTWVzc2FnZShlKSB9KTsgfVxyXG4gIG9wZW4objogUXVhbGl0eU5vdGlmaWNhdGlvbik6IHZvaWQgeyB0aGlzLnJlYWQobik7IHRoaXMucm91dGVyLm5hdmlnYXRlQnlVcmwobi51cmwpOyB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LW5vdGlmaWNhdGlvbi1iZWxsJywgdGVtcGxhdGU6IGA8YSBjbGFzcz1cIm5hdi1saW5rIHBvc2l0aW9uLXJlbGF0aXZlXCIgcm91dGVyTGluaz1cIi9rYWxpdGUvbm90aWZpY2F0aW9uc1wiIGFyaWEtbGFiZWw9XCJLYWxpdGUgYmlsZGlyaW1sZXJpXCI+PGkgY2xhc3M9XCJmYXMgZmEtYmVsbFwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT48c3BhbiBjbGFzcz1cImJhZGdlIGJhZGdlLWRhbmdlclwiICpuZ0lmPVwiY291bnRcIj57e2NvdW50fX08L3NwYW4+PC9hPmAgfSlcclxuZXhwb3J0IGNsYXNzIFF1YWxpdHlOb3RpZmljYXRpb25CZWxsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG4gIGNvdW50ID0gMDsgcHJpdmF0ZSBzdWJzY3JpcHRpb24/OiBTdWJzY3JpcHRpb247XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGk6IFF1YWxpdHlBcGlTZXJ2aWNlLCBwcml2YXRlIGNvbmZpZzogQ29uZmlnU3RhdGVTZXJ2aWNlKSB7fVxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLnN1YnNjcmlwdGlvbiA9IHRoaXMuY29uZmlnLmdldE9uZSQoJ2N1cnJlbnRVc2VyJykucGlwZShzd2l0Y2hNYXAodXNlciA9PiB1c2VyPy5pc0F1dGhlbnRpY2F0ZWQgPyB0aW1lcigwLCA2MDAwMCkucGlwZShzd2l0Y2hNYXAoKCkgPT4gdGhpcy5hcGkudW5yZWFkTm90aWZpY2F0aW9ucygpLnBpcGUoY2F0Y2hFcnJvcigoKSA9PiBvZigwKSkpKSkgOiBvZigwKSkpLnN1YnNjcmliZShjb3VudCA9PiB0aGlzLmNvdW50ID0gY291bnQpOyB9XHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7IHRoaXMuc3Vic2NyaXB0aW9uPy51bnN1YnNjcmliZSgpOyB9XHJcbn1cclxuXHJcbkBDb21wb25lbnQoeyBzZWxlY3RvcjogJ2xpYi1xdWFsaXR5LW5vdGlmaWNhdGlvbi1zZXR0aW5ncycsIHRlbXBsYXRlOiBgPGRpdiBjbGFzcz1cImNvbnRhaW5lci1mbHVpZFwiPjxoMz5LYWxpdGUgQmlsZGlyaW0gQXlhcmxhcsSxPC9oMz48ZGl2ICpuZ0lmPVwiZXJyb3JcIiBjbGFzcz1cImFsZXJ0IGFsZXJ0LWRhbmdlclwiPnt7ZXJyb3J9fTwvZGl2PjxkaXYgKm5nSWY9XCJzdWNjZXNzXCIgY2xhc3M9XCJhbGVydCBhbGVydC1zdWNjZXNzXCI+e3tzdWNjZXNzfX08L2Rpdj48ZGl2IGNsYXNzPVwiY2FyZFwiICpuZ0lmPVwic2V0dGluZ3MgYXMgc1wiPjxkaXYgY2xhc3M9XCJjYXJkLWJvZHlcIj48bGFiZWwgY2xhc3M9XCJkLWJsb2NrXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicy5wb3J0YWxFbmFibGVkXCIgLz4gUG9ydGFsIGnDp2kgYmlsZGlyaW08L2xhYmVsPjxsYWJlbCBjbGFzcz1cImQtYmxvY2tcIj48aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgWyhuZ01vZGVsKV09XCJzLmVtYWlsRW5hYmxlZFwiIC8+IEUtcG9zdGEgYmlsZGlyaW1pPC9sYWJlbD48bGFiZWwgY2xhc3M9XCJkLWJsb2NrXCI+PGlucHV0IHR5cGU9XCJjaGVja2JveFwiIFsobmdNb2RlbCldPVwicy5yZW1pbmRlckVuYWJsZWRcIiAvPiBCZWtsZXllbiBrb250cm9sIGhhdMSxcmxhdG1hc8SxPC9sYWJlbD48bGFiZWwgY2xhc3M9XCJtdC0zXCI+UG9ydGFsIEFkcmVzaSAoZS1wb3N0YSBiYcSfbGFudMSxbGFyxLEgacOnaW4pPC9sYWJlbD48aW5wdXQgY2xhc3M9XCJmb3JtLWNvbnRyb2xcIiBbKG5nTW9kZWwpXT1cInMucG9ydGFsQmFzZVVybFwiIHBsYWNlaG9sZGVyPVwiaHR0cHM6Ly9wb3J0YWwuZXhhbXBsZS5jb21cIiAvPjxkaXYgY2xhc3M9XCJyb3cgbXQtM1wiPjxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5IYXTEsXJsYXRtYSBTw7xyZXNpIChkYWtpa2EpPC9sYWJlbD48aW5wdXQgdHlwZT1cIm51bWJlclwiIG1pbj1cIjFcIiBtYXg9XCIxMDA4MFwiIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgWyhuZ01vZGVsKV09XCJzLnJlbWluZGVyTWludXRlc1wiIC8+PC9kaXY+PGRpdiBjbGFzcz1cImNvbC1tZC00XCI+PGxhYmVsPkthbGl0ZSBBbMSxY8SxIFJvbGxlcmkgKGhlciBzYXTEsXIgYmlyIHJvbCk8L2xhYmVsPjx0ZXh0YXJlYSBjbGFzcz1cImZvcm0tY29udHJvbFwiIHJvd3M9XCI0XCIgWyhuZ01vZGVsKV09XCJxdWFsaXR5Um9sZXNcIj48L3RleHRhcmVhPjwvZGl2PjxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPjxsYWJlbD5SZXQgQmlsZGlyaW1pIEFsxLFjxLEgUm9sbGVyaSAoaGVyIHNhdMSxciBiaXIgcm9sKTwvbGFiZWw+PHRleHRhcmVhIGNsYXNzPVwiZm9ybS1jb250cm9sXCIgcm93cz1cIjRcIiBbKG5nTW9kZWwpXT1cInNlY3VyaXR5Um9sZXNcIj48L3RleHRhcmVhPjwvZGl2PjwvZGl2PjxidXR0b24gY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgbXQtM1wiIChjbGljayk9XCJzYXZlKClcIiBbZGlzYWJsZWRdPVwiYnVzeVwiPktheWRldDwvYnV0dG9uPjxoNSBjbGFzcz1cIm10LTRcIiAqbmdJZj1cImZhaWx1cmVzLmxlbmd0aFwiPkfDtm5kZXJpbSBTb3J1bmxhcsSxPC9oNT48ZGl2IGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiICpuZ0Zvcj1cImxldCBmYWlsdXJlIG9mIGZhaWx1cmVzXCI+e3tmYWlsdXJlLnRpdGxlIHx8IGZhaWx1cmUuZXZlbnRUeXBlfX0gwrcge3tmYWlsdXJlLmVycm9yfX08L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5gIH0pXHJcbmV4cG9ydCBjbGFzcyBRdWFsaXR5Tm90aWZpY2F0aW9uU2V0dGluZ3NDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIHNldHRpbmdzOiBOb3RpZmljYXRpb25TZXR0aW5ncyB8IG51bGwgPSBudWxsOyBmYWlsdXJlczogYW55W10gPSBbXTsgcXVhbGl0eVJvbGVzID0gJyc7IHNlY3VyaXR5Um9sZXMgPSAnJzsgZXJyb3IgPSAnJzsgc3VjY2VzcyA9ICcnOyBidXN5ID0gZmFsc2U7XHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBhcGk6IFF1YWxpdHlBcGlTZXJ2aWNlKSB7fVxyXG4gIG5nT25Jbml0KCk6IHZvaWQgeyB0aGlzLmFwaS5ub3RpZmljYXRpb25GYWlsdXJlcygpLnN1YnNjcmliZSh7bmV4dDogeCA9PiB0aGlzLmZhaWx1cmVzID0geH0pOyB0aGlzLmFwaS5ub3RpZmljYXRpb25TZXR0aW5ncygpLnN1YnNjcmliZSh7IG5leHQ6IHggPT4geyB0aGlzLnNldHRpbmdzID0geDsgdGhpcy5xdWFsaXR5Um9sZXMgPSB4LnF1YWxpdHlSb2xlcy5qb2luKCdcXG4nKTsgdGhpcy5zZWN1cml0eVJvbGVzID0geC5zZWN1cml0eVJvbGVzLmpvaW4oJ1xcbicpOyB9LCBlcnJvcjogZSA9PiB0aGlzLmVycm9yID0gZXJyb3JNZXNzYWdlKGUpIH0pOyB9XHJcbiAgc2F2ZSgpOiB2b2lkIHsgaWYgKCF0aGlzLnNldHRpbmdzKSByZXR1cm47IHRoaXMuYnVzeSA9IHRydWU7IHRoaXMuc2V0dGluZ3MucXVhbGl0eVJvbGVzID0gdGhpcy5xdWFsaXR5Um9sZXMuc3BsaXQoJ1xcbicpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoQm9vbGVhbik7IHRoaXMuc2V0dGluZ3Muc2VjdXJpdHlSb2xlcyA9IHRoaXMuc2VjdXJpdHlSb2xlcy5zcGxpdCgnXFxuJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcihCb29sZWFuKTsgdGhpcy5hcGkuc2F2ZU5vdGlmaWNhdGlvblNldHRpbmdzKHRoaXMuc2V0dGluZ3MpLnN1YnNjcmliZSh7IG5leHQ6ICgpID0+IHsgdGhpcy5idXN5ID0gZmFsc2U7IHRoaXMuc3VjY2VzcyA9ICdCaWxkaXJpbSBheWFybGFyxLEga2F5ZGVkaWxkaS4nOyB9LCBlcnJvcjogZSA9PiB7IHRoaXMuZXJyb3IgPSBlcnJvck1lc3NhZ2UoZSk7IHRoaXMuYnVzeSA9IGZhbHNlOyB9IH0pOyB9XHJcbn1cclxuIl19
|