@sachin9822/reports-lib 0.0.210 → 0.0.212
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/karma.conf.js +44 -0
- package/ng-package.json +17 -0
- package/package.json +16 -31
- package/src/assets/images/BreadcrumbArrow.png +0 -0
- package/src/lib/assets/images/Search.svg +10 -0
- package/src/lib/assets/images/XMLogo.png +0 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.html +27 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.scss +46 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.spec.ts +23 -0
- package/src/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.ts +292 -0
- package/src/lib/components/accounting-report/accounting-report.component.html +64 -0
- package/src/lib/components/accounting-report/accounting-report.component.scss +24 -0
- package/src/lib/components/accounting-report/accounting-report.component.spec.ts +23 -0
- package/src/lib/components/accounting-report/accounting-report.component.ts +738 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.html +46 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.scss +2 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.ts +247 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.html +46 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.scss +3 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-send-report/branch-activity-send-report.component.ts +276 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.html +51 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.scss +7 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.spec.ts +23 -0
- package/src/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.ts +840 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.html +68 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.scss +65 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.spec.ts +23 -0
- package/src/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.ts +290 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.html +25 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.scss +1 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.spec.ts +23 -0
- package/src/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.ts +213 -0
- package/src/lib/components/funding-report/funding-report.component.html +49 -0
- package/src/lib/components/funding-report/funding-report.component.scss +1 -0
- package/src/lib/components/funding-report/funding-report.component.spec.ts +23 -0
- package/src/lib/components/funding-report/funding-report.component.ts +221 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.html +26 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.scss +1 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.spec.ts +23 -0
- package/src/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.ts +267 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.html +95 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.scss +54 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.spec.ts +23 -0
- package/src/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.ts +904 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.html +49 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.scss +2 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.spec.ts +32 -0
- package/src/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.ts +304 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.html +46 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.scss +7 -0
- package/src/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.ts +343 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.html +25 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.scss +23 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.spec.ts +23 -0
- package/src/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.ts +745 -0
- package/src/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.ts +10 -0
- package/src/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.ts +20 -0
- package/src/lib/models/accounting-report/accounting-report-branch-group.ts +7 -0
- package/src/lib/models/accounting-report/accounting-report-entry-model.ts +25 -0
- package/src/lib/models/accounting-report/accounting-report-model.ts +7 -0
- package/{lib/models/accounting-report/accounting-report-sub-group.d.ts → src/lib/models/accounting-report/accounting-report-sub-group.ts} +3 -2
- package/{lib/models/app-config.model.d.ts → src/lib/models/app-config.model.ts} +8 -7
- package/src/lib/models/branch-activity-receive-report/branch-activity-receive.model.ts +18 -0
- package/src/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.ts +16 -0
- package/src/lib/models/branch-activity-report/branch-activity-send-report.ts +26 -0
- package/src/lib/models/cancellation-transaction-report/cancellation-transaction.model.ts +65 -0
- package/src/lib/models/component-loading-states.ts +5 -0
- package/src/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.ts +28 -0
- package/{lib/models/revenue-per-transaction-report/revenue-per-transaction.model.d.ts → src/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.ts} +1 -1
- package/src/lib/models/statement-of-account-report/statement-of-accounts.model.ts +21 -0
- package/src/lib/models/transaction-enquiry-report/transaction-enquiry.model.ts +127 -0
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.ts +16 -0
- package/src/lib/models/transaction-monitoring-report/transaction-monitoring-report.ts +29 -0
- package/src/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.ts +46 -0
- package/src/lib/reports-lib-routing.module.ts +20 -0
- package/src/lib/reports-lib.component.spec.ts +23 -0
- package/src/lib/reports-lib.component.ts +20 -0
- package/src/lib/reports-lib.module.ts +102 -0
- package/src/lib/reports-lib.service.spec.ts +16 -0
- package/src/lib/reports-lib.service.ts +9 -0
- package/src/lib/services/config.service.ts +43 -0
- package/src/lib/services/report.service.spec.ts +16 -0
- package/src/lib/services/report.service.ts +463 -0
- package/src/lib/shared/export-generic.service.ts +557 -0
- package/src/lib/shared/export.service.spec.ts +16 -0
- package/src/lib/shared/export.service.ts +457 -0
- package/src/lib/shared/loader/loader.component.html +8 -0
- package/src/lib/shared/loader/loader.component.scss +52 -0
- package/src/lib/shared/loader/loader.component.ts +10 -0
- package/src/lib/shared/metadata/metadata.component.html +42 -0
- package/src/lib/shared/metadata/metadata.component.scss +95 -0
- package/src/lib/shared/metadata/metadata.component.spec.ts +23 -0
- package/src/lib/shared/metadata/metadata.component.ts +38 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.html +7 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.scss +42 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.spec.ts +23 -0
- package/src/lib/shared/page-size-selector/page-size-selector.component.ts +38 -0
- package/src/lib/shared/search-filter/search-filter.component.html +601 -0
- package/src/lib/shared/search-filter/search-filter.component.scss +203 -0
- package/src/lib/shared/search-filter/search-filter.component.spec.ts +23 -0
- package/src/lib/shared/search-filter/search-filter.component.ts +2387 -0
- package/src/lib/shared/shared.module.ts +13 -0
- package/{public-api.d.ts → src/public-api.ts} +17 -7
- package/src/styles/ag-grid-report-style.scss +71 -0
- package/src/styles/common-ag-grid-style.scss +146 -0
- package/src/styles/common-report-style.scss +395 -0
- package/src/styles/common-style.scss +615 -0
- package/src/test.ts +27 -0
- package/tsconfig.lib.json +15 -0
- package/tsconfig.lib.prod.json +10 -0
- package/tsconfig.spec.json +17 -0
- package/esm2020/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.mjs +0 -240
- package/esm2020/lib/components/accounting-report/accounting-report.component.mjs +0 -596
- package/esm2020/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.mjs +0 -218
- package/esm2020/lib/components/branch-activity-send-report/branch-activity-send-report.component.mjs +0 -243
- package/esm2020/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.mjs +0 -700
- package/esm2020/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.mjs +0 -255
- package/esm2020/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.mjs +0 -192
- package/esm2020/lib/components/funding-report/funding-report.component.mjs +0 -198
- package/esm2020/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.mjs +0 -244
- package/esm2020/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.mjs +0 -776
- package/esm2020/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.mjs +0 -266
- package/esm2020/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.mjs +0 -311
- package/esm2020/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.mjs +0 -631
- package/esm2020/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.mjs +0 -2
- package/esm2020/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-branch-group.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-entry-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-model.mjs +0 -2
- package/esm2020/lib/models/accounting-report/accounting-report-sub-group.mjs +0 -2
- package/esm2020/lib/models/app-config.model.mjs +0 -2
- package/esm2020/lib/models/branch-activity-receive-report/branch-activity-receive.model.mjs +0 -2
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.mjs +0 -6
- package/esm2020/lib/models/branch-activity-report/branch-activity-send-report.mjs +0 -3
- package/esm2020/lib/models/cancellation-transaction-report/cancellation-transaction.model.mjs +0 -10
- package/esm2020/lib/models/component-loading-states.mjs +0 -7
- package/esm2020/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.mjs +0 -5
- package/esm2020/lib/models/revenue-per-transaction-report/revenue-per-transaction.model.mjs +0 -2
- package/esm2020/lib/models/statement-of-account-report/statement-of-accounts.model.mjs +0 -2
- package/esm2020/lib/models/transaction-enquiry-report/transaction-enquiry.model.mjs +0 -8
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.mjs +0 -6
- package/esm2020/lib/models/transaction-monitoring-report/transaction-monitoring-report.mjs +0 -5
- package/esm2020/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.mjs +0 -3
- package/esm2020/lib/reports-lib-routing.module.mjs +0 -24
- package/esm2020/lib/reports-lib.component.mjs +0 -22
- package/esm2020/lib/reports-lib.module.mjs +0 -172
- package/esm2020/lib/reports-lib.service.mjs +0 -14
- package/esm2020/lib/services/config.service.mjs +0 -39
- package/esm2020/lib/services/report.service.mjs +0 -374
- package/esm2020/lib/shared/export-generic.service.mjs +0 -443
- package/esm2020/lib/shared/export.service.mjs +0 -379
- package/esm2020/lib/shared/loader/loader.component.mjs +0 -11
- package/esm2020/lib/shared/metadata/metadata.component.mjs +0 -51
- package/esm2020/lib/shared/page-size-selector/page-size-selector.component.mjs +0 -44
- package/esm2020/lib/shared/search-filter/search-filter.component.mjs +0 -2134
- package/esm2020/lib/shared/shared.module.mjs +0 -21
- package/esm2020/public-api.mjs +0 -41
- package/esm2020/sachin9822-reports-lib.mjs +0 -5
- package/fesm2015/sachin9822-reports-lib.mjs +0 -8402
- package/fesm2015/sachin9822-reports-lib.mjs.map +0 -1
- package/fesm2020/sachin9822-reports-lib.mjs +0 -8384
- package/fesm2020/sachin9822-reports-lib.mjs.map +0 -1
- package/index.d.ts +0 -5
- package/lib/components/acc-gl-details-enquiry-report/acc-gl-details-enquiry-report.component.d.ts +0 -70
- package/lib/components/accounting-report/accounting-report.component.d.ts +0 -76
- package/lib/components/branch-activity-receive-report/branch-activity-receive-report.component.d.ts +0 -58
- package/lib/components/branch-activity-send-report/branch-activity-send-report.component.d.ts +0 -69
- package/lib/components/branch-activity-send-summary-report/branch-activity-send-summary-report.component.d.ts +0 -78
- package/lib/components/cancellation-transaction-report/cancellation-transaction-report.component.d.ts +0 -95
- package/lib/components/credit-limit-status-enquiry-report/credit-limit-status-enquiry-report.component.d.ts +0 -55
- package/lib/components/funding-report/funding-report.component.d.ts +0 -55
- package/lib/components/revenue-per-transaction-report/revenue-per-transaction-report.component.d.ts +0 -57
- package/lib/components/statement-of-accounts-report/statement-of-accounts-report.component.d.ts +0 -109
- package/lib/components/transaction-enquiry-report/transaction-enquiry-report.component.d.ts +0 -76
- package/lib/components/transaction-monitoring-report/transaction-monitoring-report.component.d.ts +0 -68
- package/lib/components/trial-balance-accounts-report/trial-balance-accounts-report.component.d.ts +0 -71
- package/lib/models/acc-gl-details-enquiry-report/accgl-details-enquiry-reportmodel.d.ts +0 -8
- package/lib/models/acc-gl-details-enquiry-report/journal-voucher-entry-model.d.ts +0 -18
- package/lib/models/accounting-report/accounting-report-branch-group.d.ts +0 -6
- package/lib/models/accounting-report/accounting-report-entry-model.d.ts +0 -24
- package/lib/models/accounting-report/accounting-report-model.d.ts +0 -6
- package/lib/models/branch-activity-receive-report/branch-activity-receive.model.d.ts +0 -18
- package/lib/models/branch-activity-report/branch-activity-send-report-request-domain-model.d.ts +0 -13
- package/lib/models/branch-activity-report/branch-activity-send-report.d.ts +0 -24
- package/lib/models/cancellation-transaction-report/cancellation-transaction.model.d.ts +0 -44
- package/lib/models/component-loading-states.d.ts +0 -5
- package/lib/models/credit-limit-status-enquiry-report/credit-limit-status-enquiry.model.d.ts +0 -26
- package/lib/models/statement-of-account-report/statement-of-accounts.model.d.ts +0 -18
- package/lib/models/transaction-enquiry-report/transaction-enquiry.model.d.ts +0 -113
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report-request-domain-model.d.ts +0 -13
- package/lib/models/transaction-monitoring-report/transaction-monitoring-report.d.ts +0 -23
- package/lib/models/trial-balance-accounts-report/trial-balance-accounts.models.d.ts +0 -38
- package/lib/reports-lib-routing.module.d.ts +0 -7
- package/lib/reports-lib.component.d.ts +0 -8
- package/lib/reports-lib.module.d.ts +0 -33
- package/lib/reports-lib.service.d.ts +0 -6
- package/lib/services/config.service.d.ts +0 -20
- package/lib/services/report.service.d.ts +0 -80
- package/lib/shared/export-generic.service.d.ts +0 -50
- package/lib/shared/export.service.d.ts +0 -32
- package/lib/shared/loader/loader.component.d.ts +0 -5
- package/lib/shared/metadata/metadata.component.d.ts +0 -24
- package/lib/shared/page-size-selector/page-size-selector.component.d.ts +0 -15
- package/lib/shared/search-filter/search-filter.component.d.ts +0 -127
- package/lib/shared/shared.module.d.ts +0 -11
- /package/{lib → src}/assets/images/Search.svg +0 -0
- /package/{lib/assets/images/XMLogo.png → src/assets/images/XMCoral.png} +0 -0
- /package/{lib → src/lib}/assets/config/app-config.json +0 -0
- /package/{lib → src/lib}/assets/svg-loaders/blue-tail-spin.svg +0 -0
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
import { Injectable } from '@angular/core';
|
|
2
|
-
import jsPDF from 'jspdf';
|
|
3
|
-
import 'jspdf-autotable';
|
|
4
|
-
import * as ExcelJS from 'exceljs';
|
|
5
|
-
import * as FileSaver from 'file-saver';
|
|
6
|
-
import { formatDate } from '@angular/common';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export class ExportService {
|
|
9
|
-
constructor() {
|
|
10
|
-
this.pdfFontSize = 10;
|
|
11
|
-
this.pdfLineHeight = 7;
|
|
12
|
-
this.pdfLeftMargin = 15;
|
|
13
|
-
this.loadImageAsBase64('assets/reports-lib/assets/images/XMLogo.png').then(base64 => {
|
|
14
|
-
this.logoBase64 = base64;
|
|
15
|
-
});
|
|
16
|
-
}
|
|
17
|
-
// ------------------------ Utility ------------------------
|
|
18
|
-
loadImageAsBase64(imagePath) {
|
|
19
|
-
return new Promise((resolve, reject) => {
|
|
20
|
-
const img = new Image();
|
|
21
|
-
img.crossOrigin = 'anonymous';
|
|
22
|
-
img.src = imagePath;
|
|
23
|
-
img.onload = () => {
|
|
24
|
-
const scale = 6;
|
|
25
|
-
const canvas = document.createElement('canvas');
|
|
26
|
-
canvas.width = img.width * scale;
|
|
27
|
-
canvas.height = img.height * scale;
|
|
28
|
-
const ctx = canvas.getContext('2d');
|
|
29
|
-
if (ctx) {
|
|
30
|
-
ctx.scale(scale, scale);
|
|
31
|
-
ctx.drawImage(img, 0, 0);
|
|
32
|
-
const base64 = canvas.toDataURL('image/png', 1.0); // 1.0 = highest quality
|
|
33
|
-
resolve(base64);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
reject('Failed to get canvas context.');
|
|
37
|
-
}
|
|
38
|
-
};
|
|
39
|
-
img.onerror = () => reject('Failed to load image: ' + imagePath);
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
formatDate(value) {
|
|
43
|
-
const date = new Date(value);
|
|
44
|
-
return isNaN(date.getTime()) ? '' :
|
|
45
|
-
`${date.getDate().toString().padStart(2, '0')}/${(date.getMonth() + 1).toString().padStart(2, '0')}/${date.getFullYear()}`;
|
|
46
|
-
}
|
|
47
|
-
formatDateTime(date) {
|
|
48
|
-
const day = date.getDate().toString().padStart(2, '0');
|
|
49
|
-
const month = (date.getMonth() + 1).toString().padStart(2, '0');
|
|
50
|
-
const year = date.getFullYear();
|
|
51
|
-
// 12-hour format
|
|
52
|
-
let hours = date.getHours();
|
|
53
|
-
const minutes = date.getMinutes().toString().padStart(2, '0');
|
|
54
|
-
const ampm = hours >= 12 ? 'PM' : 'AM';
|
|
55
|
-
hours = hours % 12;
|
|
56
|
-
hours = hours ? hours : 12; // the hour '0' should be '12'
|
|
57
|
-
const hoursStr = hours.toString().padStart(2, '0');
|
|
58
|
-
return `${day}/${month}/${year} ${hoursStr}:${minutes} ${ampm}`;
|
|
59
|
-
}
|
|
60
|
-
generateReportMetadata(metadata) {
|
|
61
|
-
return metadata.filter(([_, value]) => value !== undefined && value !== null);
|
|
62
|
-
}
|
|
63
|
-
prepareExportTable(data, columnDefs, options = {}) {
|
|
64
|
-
const { excludeFields = ['srno'], currencyFields = [], rateFields = [] } = options;
|
|
65
|
-
const filteredColumns = columnDefs.filter(col => col.field &&
|
|
66
|
-
!excludeFields.some(ex => col.field.toLowerCase().includes(ex)) &&
|
|
67
|
-
!excludeFields.some(ex => col.headerName?.toLowerCase().includes(ex)));
|
|
68
|
-
const headers = ['Sr No', ...filteredColumns.map(col => col.headerName || col.field)];
|
|
69
|
-
const rows = data.map((row, index) => {
|
|
70
|
-
const rowData = filteredColumns.map(col => {
|
|
71
|
-
let value = row[col.field];
|
|
72
|
-
const fieldName = col.field?.toLowerCase() || '';
|
|
73
|
-
// Handle various date field names
|
|
74
|
-
if (fieldName.includes('transactiondateandtime') && value) {
|
|
75
|
-
value = formatDate(value, 'dd/MM/yyyy hh:mm a', 'en-US');
|
|
76
|
-
}
|
|
77
|
-
else if ((fieldName.includes('date') || fieldName.includes('businessdate')) && value) {
|
|
78
|
-
// value = this.formatDate(value);
|
|
79
|
-
if (value instanceof Date || !/^\d{2}\/\d{2}\/\d{4}/.test(value)) {
|
|
80
|
-
value = this.formatDate(value);
|
|
81
|
-
}
|
|
82
|
-
}
|
|
83
|
-
// Format currency fields
|
|
84
|
-
if (currencyFields.includes(col.field) && value != null) {
|
|
85
|
-
value = parseFloat(value).toFixed(3);
|
|
86
|
-
}
|
|
87
|
-
if (rateFields.includes(col.field) && value != null) {
|
|
88
|
-
value = parseFloat(value).toFixed(8);
|
|
89
|
-
}
|
|
90
|
-
return value ?? '';
|
|
91
|
-
});
|
|
92
|
-
return [index + 1, ...rowData];
|
|
93
|
-
});
|
|
94
|
-
return { headers, rows };
|
|
95
|
-
}
|
|
96
|
-
// ------------------------ PDF Universal ------------------------
|
|
97
|
-
async exportToPdfUniversal(title, metadata, searchCriteria, headers, rows, fileName) {
|
|
98
|
-
let doc;
|
|
99
|
-
doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: [400, 210] });
|
|
100
|
-
const logoWidth = 38.4, logoHeight = 17.5, logoX = 15, logoY = 10;
|
|
101
|
-
const pageWidth = doc.internal.pageSize.width;
|
|
102
|
-
const titleY = 18;
|
|
103
|
-
const marginLeft = 15;
|
|
104
|
-
if (this.logoBase64) {
|
|
105
|
-
doc.addImage(this.logoBase64, 'PNG', logoX, logoY, logoWidth, logoHeight);
|
|
106
|
-
}
|
|
107
|
-
doc.setFontSize(15);
|
|
108
|
-
doc.setFont('helvetica', 'bold');
|
|
109
|
-
doc.text(title, pageWidth / 2, titleY, { align: 'center' });
|
|
110
|
-
let currentY = titleY + 14;
|
|
111
|
-
doc.setFontSize(this.pdfFontSize);
|
|
112
|
-
metadata.forEach(([label, value], i) => {
|
|
113
|
-
const y = currentY + i * this.pdfLineHeight;
|
|
114
|
-
doc.setFont('helvetica', 'bold');
|
|
115
|
-
doc.text(label, this.pdfLeftMargin, y);
|
|
116
|
-
const labelWidth = doc.getTextWidth(label + ' ');
|
|
117
|
-
doc.setFont('helvetica', 'normal');
|
|
118
|
-
doc.text(value, this.pdfLeftMargin + labelWidth, y);
|
|
119
|
-
});
|
|
120
|
-
currentY += metadata.length * this.pdfLineHeight + 5;
|
|
121
|
-
// --- draw search criteria heading ---
|
|
122
|
-
doc.setFont('helvetica', 'bold');
|
|
123
|
-
doc.text('Search Criteria:-', marginLeft, currentY);
|
|
124
|
-
currentY += 8;
|
|
125
|
-
const rowHeightPerLine = 6;
|
|
126
|
-
const minGap = 2; // gap between key and value
|
|
127
|
-
const betweenColumnsGap = 15; // gap between left and right columns (you can tune this)
|
|
128
|
-
const pageContentWidth = doc.internal.pageSize.width - 2 * marginLeft;
|
|
129
|
-
// --- helper function to measure total width of a key-value pair ---
|
|
130
|
-
const measurePairWidth = (key, value) => {
|
|
131
|
-
doc.setFont('helvetica', 'bold');
|
|
132
|
-
const keyWidth = doc.getTextWidth(key + ' ');
|
|
133
|
-
doc.setFont('helvetica', 'normal');
|
|
134
|
-
const valueWidth = doc.getTextWidth(value);
|
|
135
|
-
return keyWidth + minGap + valueWidth;
|
|
136
|
-
};
|
|
137
|
-
// --- calculate max width of left column pairs dynamically ---
|
|
138
|
-
let maxLeftPairWidth = 0;
|
|
139
|
-
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
140
|
-
if (searchCriteria[i]) {
|
|
141
|
-
const [key, value] = searchCriteria[i];
|
|
142
|
-
const width = measurePairWidth(key, value);
|
|
143
|
-
if (width > maxLeftPairWidth)
|
|
144
|
-
maxLeftPairWidth = width;
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
// --- compute where right column should start ---
|
|
148
|
-
const leftColumnStart = marginLeft;
|
|
149
|
-
const rightColumnStart = leftColumnStart + maxLeftPairWidth + betweenColumnsGap;
|
|
150
|
-
// --- print search criteria dynamically ---
|
|
151
|
-
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
152
|
-
let maxLineCount = 1;
|
|
153
|
-
// Left column
|
|
154
|
-
if (searchCriteria[i]) {
|
|
155
|
-
const [key, value] = searchCriteria[i];
|
|
156
|
-
doc.setFont('helvetica', 'bold');
|
|
157
|
-
doc.text(key, leftColumnStart, currentY);
|
|
158
|
-
doc.setFont('helvetica', 'normal');
|
|
159
|
-
const keyWidth = doc.getTextWidth(key + ' ');
|
|
160
|
-
const valueX = leftColumnStart + keyWidth + minGap;
|
|
161
|
-
doc.text(value, valueX, currentY);
|
|
162
|
-
}
|
|
163
|
-
// Right column
|
|
164
|
-
if (searchCriteria[i + 1]) {
|
|
165
|
-
const [key, value] = searchCriteria[i + 1];
|
|
166
|
-
doc.setFont('helvetica', 'bold');
|
|
167
|
-
doc.text(key, rightColumnStart, currentY);
|
|
168
|
-
doc.setFont('helvetica', 'normal');
|
|
169
|
-
const keyWidth = doc.getTextWidth(key + ' ');
|
|
170
|
-
const valueX = rightColumnStart + keyWidth + minGap;
|
|
171
|
-
doc.text(value, valueX, currentY);
|
|
172
|
-
}
|
|
173
|
-
currentY += rowHeightPerLine;
|
|
174
|
-
}
|
|
175
|
-
const columnCount = headers.length;
|
|
176
|
-
const tableWidth = pageWidth - (this.pdfLeftMargin * 2);
|
|
177
|
-
const equalWidth = tableWidth / columnCount;
|
|
178
|
-
const columnStyles = {};
|
|
179
|
-
headers.forEach((_, i) => {
|
|
180
|
-
columnStyles[i] = { cellWidth: equalWidth };
|
|
181
|
-
});
|
|
182
|
-
doc.autoTable({
|
|
183
|
-
head: [headers],
|
|
184
|
-
body: rows,
|
|
185
|
-
startY: currentY,
|
|
186
|
-
theme: 'grid',
|
|
187
|
-
headStyles: {
|
|
188
|
-
fillColor: [220, 220, 220], textColor: 0,
|
|
189
|
-
fontStyle: 'bold', fontSize: 9, halign: 'center',
|
|
190
|
-
},
|
|
191
|
-
bodyStyles: { fontSize: 8, fillColor: [255, 255, 255], textColor: [0, 0, 0] },
|
|
192
|
-
styles: { cellPadding: 2, overflow: 'linebreak', minCellHeight: 6 },
|
|
193
|
-
columnStyles
|
|
194
|
-
});
|
|
195
|
-
const pageCount = doc.internal.getNumberOfPages();
|
|
196
|
-
for (let i = 1; i <= pageCount; i++) {
|
|
197
|
-
doc.setFont("helvetica", "bold");
|
|
198
|
-
doc.setPage(i);
|
|
199
|
-
doc.setFontSize(9);
|
|
200
|
-
doc.setTextColor(100);
|
|
201
|
-
const footerY = doc.internal.pageSize.height - 6;
|
|
202
|
-
doc.text(`Page ${i} of ${pageCount}`, pageWidth - 15, footerY, { align: 'right' });
|
|
203
|
-
}
|
|
204
|
-
doc.save(fileName);
|
|
205
|
-
}
|
|
206
|
-
// ------------------------ Excel Universal ------------------------
|
|
207
|
-
exportToExcelUniversal(title, metadata, searchCriteria, headers, rows, fileName) {
|
|
208
|
-
const workbook = new ExcelJS.Workbook();
|
|
209
|
-
const worksheet = workbook.addWorksheet(title);
|
|
210
|
-
let currentRow = 1;
|
|
211
|
-
// Add image if available
|
|
212
|
-
if (this.logoBase64) {
|
|
213
|
-
const base64Data = this.logoBase64.replace(/^data:image\/\w+;base64,/, '');
|
|
214
|
-
const imageId = workbook.addImage({
|
|
215
|
-
base64: base64Data,
|
|
216
|
-
extension: 'png',
|
|
217
|
-
});
|
|
218
|
-
// Place image at top-left (e.g., A1:C4)
|
|
219
|
-
worksheet.addImage(imageId, {
|
|
220
|
-
tl: { col: 0, row: 0 },
|
|
221
|
-
ext: { width: 145, height: 66 },
|
|
222
|
-
editAs: 'oneCell'
|
|
223
|
-
});
|
|
224
|
-
}
|
|
225
|
-
// Add title aligned in middle horizontally (merged across all columns)
|
|
226
|
-
const titleRow = worksheet.getRow(currentRow);
|
|
227
|
-
titleRow.getCell(4).value = title;
|
|
228
|
-
titleRow.getCell(4).font = { bold: true, size: 16 };
|
|
229
|
-
titleRow.getCell(4).alignment = { vertical: 'middle', horizontal: 'left' };
|
|
230
|
-
const titleMergeEnd = String.fromCharCode(64 + headers.length);
|
|
231
|
-
worksheet.mergeCells(`D${currentRow}:${titleMergeEnd}${currentRow}`);
|
|
232
|
-
currentRow += 3; // Move past image space
|
|
233
|
-
// Add metadata
|
|
234
|
-
metadata.forEach(([label, value]) => {
|
|
235
|
-
const row = worksheet.getRow(currentRow++);
|
|
236
|
-
const cell = row.getCell(1);
|
|
237
|
-
cell.value = {
|
|
238
|
-
richText: [
|
|
239
|
-
{ text: `${label}: `, font: { bold: true } },
|
|
240
|
-
{ text: value ?? '', font: { bold: false } }
|
|
241
|
-
]
|
|
242
|
-
};
|
|
243
|
-
worksheet.mergeCells(`A${row.number}:${String.fromCharCode(64 + headers.length)}${row.number}`);
|
|
244
|
-
});
|
|
245
|
-
worksheet.addRow([]);
|
|
246
|
-
currentRow++;
|
|
247
|
-
//=========================================================
|
|
248
|
-
// --- search criteria heading ---
|
|
249
|
-
worksheet.mergeCells(currentRow, 1, currentRow, 6);
|
|
250
|
-
worksheet.getCell(currentRow, 1).value = 'Search Criteria:-';
|
|
251
|
-
worksheet.getCell(currentRow, 1).font = { bold: true };
|
|
252
|
-
currentRow += 2;
|
|
253
|
-
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
254
|
-
const left = searchCriteria[i];
|
|
255
|
-
const right = searchCriteria[i + 1]; // may be undefined
|
|
256
|
-
const row = worksheet.getRow(currentRow++);
|
|
257
|
-
// Left cell
|
|
258
|
-
worksheet.mergeCells(row.number, 1, row.number, 3);
|
|
259
|
-
row.getCell(1).value = {
|
|
260
|
-
richText: [
|
|
261
|
-
{ text: (left?.[0] ?? '') + ' ', font: { bold: true } },
|
|
262
|
-
{ text: left?.[1] ?? '' }
|
|
263
|
-
]
|
|
264
|
-
};
|
|
265
|
-
row.getCell(1).alignment = { wrapText: true, vertical: 'middle' };
|
|
266
|
-
// Right cell (only if present)
|
|
267
|
-
if (right) {
|
|
268
|
-
worksheet.mergeCells(row.number, 4, row.number, 6);
|
|
269
|
-
row.getCell(4).value = {
|
|
270
|
-
richText: [
|
|
271
|
-
{ text: (right?.[0] ?? '') + ' ', font: { bold: true } },
|
|
272
|
-
{ text: right?.[1] ?? '' }
|
|
273
|
-
]
|
|
274
|
-
};
|
|
275
|
-
row.getCell(4).alignment = { wrapText: true, vertical: 'middle' };
|
|
276
|
-
}
|
|
277
|
-
}
|
|
278
|
-
currentRow++;
|
|
279
|
-
//============================================================
|
|
280
|
-
// Add table header row
|
|
281
|
-
const headerRow = worksheet.getRow(currentRow++);
|
|
282
|
-
headers.forEach((header, i) => {
|
|
283
|
-
const cell = headerRow.getCell(i + 1);
|
|
284
|
-
cell.value = header;
|
|
285
|
-
cell.font = { bold: true };
|
|
286
|
-
cell.fill = { type: 'pattern', pattern: 'solid', fgColor: { argb: 'D9D9D9' } };
|
|
287
|
-
cell.alignment = { vertical: 'middle', horizontal: 'center' };
|
|
288
|
-
cell.border = {
|
|
289
|
-
top: { style: 'thin' },
|
|
290
|
-
bottom: { style: 'thin' },
|
|
291
|
-
left: { style: 'thin' },
|
|
292
|
-
right: { style: 'thin' }
|
|
293
|
-
};
|
|
294
|
-
});
|
|
295
|
-
const dataStartRow = currentRow;
|
|
296
|
-
rows.forEach(rowData => {
|
|
297
|
-
const row = worksheet.getRow(currentRow++);
|
|
298
|
-
rowData.forEach((value, i) => {
|
|
299
|
-
const cell = row.getCell(i + 1);
|
|
300
|
-
cell.value = value;
|
|
301
|
-
cell.border = {
|
|
302
|
-
top: { style: 'thin' },
|
|
303
|
-
bottom: { style: 'thin' },
|
|
304
|
-
left: { style: 'thin' },
|
|
305
|
-
right: { style: 'thin' }
|
|
306
|
-
};
|
|
307
|
-
});
|
|
308
|
-
});
|
|
309
|
-
// Auto column widths
|
|
310
|
-
for (let i = 1; i <= headers.length; i++) {
|
|
311
|
-
let maxLength = headers[i - 1].length;
|
|
312
|
-
for (let rowNum = dataStartRow; rowNum <= worksheet.lastRow.number; rowNum++) {
|
|
313
|
-
const val = worksheet.getRow(rowNum).getCell(i).value?.toString() || '';
|
|
314
|
-
maxLength = Math.max(maxLength, val.length);
|
|
315
|
-
}
|
|
316
|
-
worksheet.getColumn(i).width = maxLength + 2;
|
|
317
|
-
}
|
|
318
|
-
workbook.xlsx.writeBuffer().then(buffer => {
|
|
319
|
-
const blob = new Blob([buffer], {
|
|
320
|
-
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
|
|
321
|
-
});
|
|
322
|
-
FileSaver.saveAs(blob, fileName);
|
|
323
|
-
});
|
|
324
|
-
}
|
|
325
|
-
// ------------------------ CSV Universal ------------------------
|
|
326
|
-
exportToCsvUniversal(title, metadata, searchCriteria, headers, rows, fileName) {
|
|
327
|
-
const escapeCsv = (value) => {
|
|
328
|
-
if (value === null || value === undefined)
|
|
329
|
-
return '';
|
|
330
|
-
const str = value.toString();
|
|
331
|
-
return str.includes(',') || str.includes('"') || str.includes('\n')
|
|
332
|
-
? `"${str.replace(/"/g, '""')}"`
|
|
333
|
-
: str;
|
|
334
|
-
};
|
|
335
|
-
const metaRows = metadata.map(([k, v]) => [`${k} ${v}`]);
|
|
336
|
-
// --- Build search criteria section ---
|
|
337
|
-
const searchLines = [];
|
|
338
|
-
if (searchCriteria?.length) {
|
|
339
|
-
searchLines.push('Search Criteria:-');
|
|
340
|
-
const maxLeftLength = Math.max(...searchCriteria.map(([k, v]) => (k + ' ' + v).length));
|
|
341
|
-
for (let i = 0; i < searchCriteria.length; i += 2) {
|
|
342
|
-
const left = searchCriteria[i];
|
|
343
|
-
const right = searchCriteria[i + 1];
|
|
344
|
-
const leftText = left ? `${left[0]} ${left[1]}`.padEnd(maxLeftLength + 5, ' ') : '';
|
|
345
|
-
const rightText = right ? `${right[0]} ${right[1]}` : '';
|
|
346
|
-
searchLines.push(`"${leftText}${rightText}"`); // wrap in quotes for single CSV cell
|
|
347
|
-
}
|
|
348
|
-
searchLines.push(''); // blank line after criteria
|
|
349
|
-
}
|
|
350
|
-
// --- Combine all parts ---
|
|
351
|
-
const csvContent = [
|
|
352
|
-
[title].join(','),
|
|
353
|
-
...metaRows.map(e => e.join(',')),
|
|
354
|
-
'',
|
|
355
|
-
...searchLines,
|
|
356
|
-
headers.join(','),
|
|
357
|
-
...rows.map(row => row.map(value => escapeCsv(value)).join(','))
|
|
358
|
-
].join('\n');
|
|
359
|
-
this.downloadFile(csvContent, fileName, 'text/csv');
|
|
360
|
-
}
|
|
361
|
-
downloadFile(data, filename, type) {
|
|
362
|
-
const blob = new Blob([data], { type });
|
|
363
|
-
const link = document.createElement('a');
|
|
364
|
-
link.href = URL.createObjectURL(blob);
|
|
365
|
-
link.setAttribute('download', filename);
|
|
366
|
-
document.body.appendChild(link);
|
|
367
|
-
link.click();
|
|
368
|
-
document.body.removeChild(link);
|
|
369
|
-
}
|
|
370
|
-
}
|
|
371
|
-
ExportService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExportService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
372
|
-
ExportService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExportService, providedIn: 'root' });
|
|
373
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ExportService, decorators: [{
|
|
374
|
-
type: Injectable,
|
|
375
|
-
args: [{
|
|
376
|
-
providedIn: 'root'
|
|
377
|
-
}]
|
|
378
|
-
}], ctorParameters: function () { return []; } });
|
|
379
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhwb3J0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXBvcnRzLWxpYi9zcmMvbGliL3NoYXJlZC9leHBvcnQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8sS0FBSyxPQUFPLE1BQU0sU0FBUyxDQUFDO0FBQ25DLE9BQU8sS0FBSyxTQUFTLE1BQU0sWUFBWSxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7QUFXN0MsTUFBTSxPQUFPLGFBQWE7SUFPeEI7UUFMaUIsZ0JBQVcsR0FBRyxFQUFFLENBQUM7UUFDakIsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFDbEIsa0JBQWEsR0FBRyxFQUFFLENBQUM7UUFJbEMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLDZDQUE2QyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xGLElBQUksQ0FBQyxVQUFVLEdBQUcsTUFBTSxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELDREQUE0RDtJQUNwRCxpQkFBaUIsQ0FBQyxTQUFpQjtRQUN6QyxPQUFPLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1lBQ3JDLE1BQU0sR0FBRyxHQUFHLElBQUksS0FBSyxFQUFFLENBQUM7WUFDeEIsR0FBRyxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDOUIsR0FBRyxDQUFDLEdBQUcsR0FBRyxTQUFTLENBQUM7WUFFcEIsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLEVBQUU7Z0JBQ2hCLE1BQU0sS0FBSyxHQUFHLENBQUMsQ0FBQztnQkFDaEIsTUFB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QUFHLElBQUksSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDekMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ3hDLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNiLFFBQVEsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2xDLENBQUM7OzBHQXJiVSxhQUFhOzhHQUFiLGFBQWEsY0FGWixNQUFNOzJGQUVQLGFBQWE7a0JBSHpCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQganNQREYgZnJvbSAnanNwZGYnO1xyXG5pbXBvcnQgJ2pzcGRmLWF1dG90YWJsZSc7XHJcbmltcG9ydCAqIGFzIEV4Y2VsSlMgZnJvbSAnZXhjZWxqcyc7XHJcbmltcG9ydCAqIGFzIEZpbGVTYXZlciBmcm9tICdmaWxlLXNhdmVyJztcclxuaW1wb3J0IHsgZm9ybWF0RGF0ZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcblxyXG5kZWNsYXJlIG1vZHVsZSAnanNwZGYnIHtcclxuICBpbnRlcmZhY2UganNQREYge1xyXG4gICAgYXV0b1RhYmxlOiAob3B0aW9uczogYW55KSA9PiBqc1BERjtcclxuICB9XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuICBwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEV4cG9ydFNlcnZpY2Uge1xyXG5cclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZkZvbnRTaXplID0gMTA7XHJcbiAgcHJpdmF0ZSByZWFkb25seSBwZGZMaW5lSGVpZ2h0ID0gNztcclxuICBwcml2YXRlIHJlYWRvbmx5IHBkZkxlZnRNYXJnaW4gPSAxNTtcclxuICBwdWJsaWMgbG9nb0Jhc2U2NDogc3RyaW5nIHwgdW5kZWZpbmVkO1xyXG5cclxuICBjb25zdHJ1Y3RvcigpIHtcclxuICAgIHRoaXMubG9hZEltYWdlQXNCYXNlNjQoJ2Fzc2V0cy9yZXBvcnRzLWxpYi9hc3NldHMvaW1hZ2VzL1hNTG9nby5wbmcnKS50aGVuKGJhc2U2NCA9PiB7XHJcbiAgICAgIHRoaXMubG9nb0Jhc2U2NCA9IGJhc2U2NDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFV0aWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgcHJpdmF0ZSBsb2FkSW1hZ2VBc0Jhc2U2NChpbWFnZVBhdGg6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XHJcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xyXG4gICAgICBjb25zdCBpbWcgPSBuZXcgSW1hZ2UoKTtcclxuICAgICAgaW1nLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7XHJcbiAgICAgIGltZy5zcmMgPSBpbWFnZVBhdGg7XHJcblxyXG4gICAgICBpbWcub25sb2FkID0gKCkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHNjYWxlID0gNjtcclxuICAgICAgICBjb25zdCBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcclxuICAgICAgICBjYW52YXMud2lkdGggPSBpbWcud2lkdGggKiBzY2FsZTtcclxuICAgICAgICBjYW52YXMuaGVpZ2h0ID0gaW1nLmhlaWdodCAqIHNjYWxlO1xyXG5cclxuICAgICAgICBjb25zdCBjdHggPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcclxuICAgICAgICBpZiAoY3R4KSB7XHJcbiAgICAgICAgICBjdHguc2NhbGUoc2NhbGUsIHNjYWxlKTtcclxuICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoaW1nLCAwLCAwKTtcclxuICAgICAgICAgIGNvbnN0IGJhc2U2NCA9IGNhbnZhcy50b0RhdGFVUkwoJ2ltYWdlL3BuZycsIDEuMCk7IC8vIDEuMCA9IGhpZ2hlc3QgcXVhbGl0eVxyXG4gICAgICAgICAgcmVzb2x2ZShiYXNlNjQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICByZWplY3QoJ0ZhaWxlZCB0byBnZXQgY2FudmFzIGNvbnRleHQuJyk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9O1xyXG5cclxuICAgICAgaW1nLm9uZXJyb3IgPSAoKSA9PiByZWplY3QoJ0ZhaWxlZCB0byBsb2FkIGltYWdlOiAnICsgaW1hZ2VQYXRoKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgZm9ybWF0RGF0ZSh2YWx1ZTogYW55KTogc3RyaW5nIHtcclxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICByZXR1cm4gaXNOYU4oZGF0ZS5nZXRUaW1lKCkpID8gJycgOlxyXG4gICAgICBgJHtkYXRlLmdldERhdGUoKS50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyl9LyR7KGRhdGUuZ2V0TW9udGgoKSArIDEpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKX0vJHtkYXRlLmdldEZ1bGxZZWFyKCl9YDtcclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGVUaW1lKGRhdGU6IERhdGUpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgZGF5ID0gZGF0ZS5nZXREYXRlKCkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgbW9udGggPSAoZGF0ZS5nZXRNb250aCgpICsgMSkudG9TdHJpbmcoKS5wYWRTdGFydCgyLCAnMCcpO1xyXG4gICAgY29uc3QgeWVhciA9IGRhdGUuZ2V0RnVsbFllYXIoKTtcclxuXHJcbiAgICAvLyAxMi1ob3VyIGZvcm1hdFxyXG4gICAgbGV0IGhvdXJzID0gZGF0ZS5nZXRIb3VycygpO1xyXG4gICAgY29uc3QgbWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgIGNvbnN0IGFtcG0gPSBob3VycyA+PSAxMiA/ICdQTScgOiAnQU0nO1xyXG4gICAgaG91cnMgPSBob3VycyAlIDEyO1xyXG4gICAgaG91cnMgPSBob3VycyA/IGhvdXJzIDogMTI7IC8vIHRoZSBob3VyICcwJyBzaG91bGQgYmUgJzEyJ1xyXG4gICAgY29uc3QgaG91cnNTdHIgPSBob3Vycy50b1N0cmluZygpLnBhZFN0YXJ0KDIsICcwJyk7XHJcblxyXG4gICAgcmV0dXJuIGAke2RheX0vJHttb250aH0vJHt5ZWFyfSAke2hvdXJzU3RyfToke21pbnV0ZXN9ICR7YW1wbX1gO1xyXG4gIH1cclxuXHJcbiAgZ2VuZXJhdGVSZXBvcnRNZXRhZGF0YShtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdKTogW3N0cmluZywgc3RyaW5nXVtdIHtcclxuICAgIHJldHVybiBtZXRhZGF0YS5maWx0ZXIoKFtfLCB2YWx1ZV0pID0+IHZhbHVlICE9PSB1bmRlZmluZWQgJiYgdmFsdWUgIT09IG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJlcGFyZUV4cG9ydFRhYmxlKGRhdGE6IGFueVtdLCBjb2x1bW5EZWZzOiBhbnlbXSwgb3B0aW9uczoge1xyXG4gICAgZXhjbHVkZUZpZWxkcz86IHN0cmluZ1tdLFxyXG4gICAgY3VycmVuY3lGaWVsZHM/OiBzdHJpbmdbXSxcclxuICAgIHJhdGVGaWVsZHM/OiBzdHJpbmdbXSxcclxuICB9ID0ge30pOiB7IGhlYWRlcnM6IHN0cmluZ1tdLCByb3dzOiBhbnlbXVtdIH0ge1xyXG4gICAgY29uc3QgeyBleGNsdWRlRmllbGRzID0gWydzcm5vJ10sIGN1cnJlbmN5RmllbGRzID0gW10sIHJhdGVGaWVsZHMgPSBbXSB9ID0gb3B0aW9ucztcclxuXHJcbiAgICBjb25zdCBmaWx0ZXJlZENvbHVtbnMgPSBjb2x1bW5EZWZzLmZpbHRlcihjb2wgPT5cclxuICAgICAgY29sLmZpZWxkICYmXHJcbiAgICAgICFleGNsdWRlRmllbGRzLnNvbWUoZXggPT4gY29sLmZpZWxkLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoZXgpKSAmJlxyXG4gICAgICAhZXhjbHVkZUZpZWxkcy5zb21lKGV4ID0+IGNvbC5oZWFkZXJOYW1lPy50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGV4KSlcclxuICAgICk7XHJcblxyXG4gICAgY29uc3QgaGVhZGVycyA9IFsnU3IgTm8nLCAuLi5maWx0ZXJlZENvbHVtbnMubWFwKGNvbCA9PiBjb2wuaGVhZGVyTmFtZSB8fCBjb2wuZmllbGQpXTtcclxuXHJcbiAgICBjb25zdCByb3dzID0gZGF0YS5tYXAoKHJvdywgaW5kZXgpID0+IHtcclxuICAgICAgY29uc3Qgcm93RGF0YSA9IGZpbHRlcmVkQ29sdW1ucy5tYXAoY29sID0+IHtcclxuICAgICAgICBsZXQgdmFsdWUgPSByb3dbY29sLmZpZWxkXTtcclxuICAgICAgICBjb25zdCBmaWVsZE5hbWUgPSBjb2wuZmllbGQ/LnRvTG93ZXJDYXNlKCkgfHwgJyc7XHJcblxyXG4gICAgICAgIC8vIEhhbmRsZSB2YXJpb3VzIGRhdGUgZmllbGQgbmFtZXNcclxuICAgICAgICBpZiAoZmllbGROYW1lLmluY2x1ZGVzKCd0cmFuc2FjdGlvbmRhdGVhbmR0aW1lJykgJiYgdmFsdWUpIHtcclxuICAgICAgICAgIHZhbHVlID0gZm9ybWF0RGF0ZSh2YWx1ZSwgJ2RkL01NL3l5eXkgaGg6bW0gYScsICdlbi1VUycpO1xyXG4gICAgICAgIH0gZWxzZSBpZiAoKGZpZWxkTmFtZS5pbmNsdWRlcygnZGF0ZScpIHx8IGZpZWxkTmFtZS5pbmNsdWRlcygnYnVzaW5lc3NkYXRlJykpICYmIHZhbHVlKSB7XHJcbiAgICAgICAgICAvLyB2YWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlIHx8ICEvXlxcZHsyfVxcL1xcZHsyfVxcL1xcZHs0fS8udGVzdCh2YWx1ZSkpIHtcclxuICAgICAgICAgICAgdmFsdWUgPSB0aGlzLmZvcm1hdERhdGUodmFsdWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8gRm9ybWF0IGN1cnJlbmN5IGZpZWxkc1xyXG4gICAgICAgIGlmIChjdXJyZW5jeUZpZWxkcy5pbmNsdWRlcyhjb2wuZmllbGQpICYmIHZhbHVlICE9IG51bGwpIHtcclxuICAgICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSkudG9GaXhlZCgzKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGlmIChyYXRlRmllbGRzLmluY2x1ZGVzKGNvbC5maWVsZCkgJiYgdmFsdWUgIT0gbnVsbCkge1xyXG4gICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlKS50b0ZpeGVkKDgpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgcmV0dXJuIHZhbHVlID8/ICcnO1xyXG4gICAgICB9KTtcclxuICAgICAgcmV0dXJuIFtpbmRleCArIDEsIC4uLnJvd0RhdGFdO1xyXG4gICAgfSk7XHJcbiAgICByZXR1cm4geyBoZWFkZXJzLCByb3dzIH07XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUERGIFVuaXZlcnNhbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuICBhc3luYyBleHBvcnRUb1BkZlVuaXZlcnNhbCh0aXRsZTogc3RyaW5nLCBtZXRhZGF0YTogW3N0cmluZywgc3RyaW5nXVtdLCBzZWFyY2hDcml0ZXJpYTogW3N0cmluZywgc3RyaW5nXVtdLCBoZWFkZXJzOiBzdHJpbmdbXSwgcm93czogYW55W11bXSwgZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgbGV0IGRvYztcclxuICAgIGRvYyA9IG5ldyBqc1BERih7IG9yaWVudGF0aW9uOiAnbGFuZHNjYXBlJywgdW5pdDogJ21tJywgZm9ybWF0OiBbNDAwLCAyMTBdIH0pO1xyXG5cclxuICAgIGNvbnN0IGxvZ29XaWR0aCA9IDM4LjQsIGxvZ29IZWlnaHQgPSAxNy41LCBsb2dvWCA9IDE1LCBsb2dvWSA9IDEwO1xyXG4gICAgY29uc3QgcGFnZVdpZHRoID0gZG9jLmludGVybmFsLnBhZ2VTaXplLndpZHRoO1xyXG4gICAgY29uc3QgdGl0bGVZID0gMTg7XHJcbiAgICBjb25zdCBtYXJnaW5MZWZ0ID0gMTU7XHJcblxyXG4gICAgaWYgKHRoaXMubG9nb0Jhc2U2NCkge1xyXG4gICAgICBkb2MuYWRkSW1hZ2UodGhpcy5sb2dvQmFzZTY0LCAnUE5HJywgbG9nb1gsIGxvZ29ZLCBsb2dvV2lkdGgsIGxvZ29IZWlnaHQpO1xyXG4gICAgfVxyXG5cclxuICAgIGRvYy5zZXRGb250U2l6ZSgxNSk7XHJcbiAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgIGRvYy50ZXh0KHRpdGxlLCBwYWdlV2lkdGggLyAyLCB0aXRsZVksIHsgYWxpZ246ICdjZW50ZXInIH0pO1xyXG5cclxuICAgIGxldCBjdXJyZW50WSA9IHRpdGxlWSArIDE0O1xyXG4gICAgZG9jLnNldEZvbnRTaXplKHRoaXMucGRmRm9udFNpemUpO1xyXG4gICAgbWV0YWRhdGEuZm9yRWFjaCgoW2xhYmVsLCB2YWx1ZV0sIGkpID0+IHtcclxuICAgICAgY29uc3QgeSA9IGN1cnJlbnRZICsgaSAqIHRoaXMucGRmTGluZUhlaWdodDtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdib2xkJyk7XHJcbiAgICAgIGRvYy50ZXh0KGxhYmVsLCB0aGlzLnBkZkxlZnRNYXJnaW4sIHkpO1xyXG4gICAgICBjb25zdCBsYWJlbFdpZHRoID0gZG9jLmdldFRleHRXaWR0aChsYWJlbCArICcgJyk7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgIGRvYy50ZXh0KHZhbHVlLCB0aGlzLnBkZkxlZnRNYXJnaW4gKyBsYWJlbFdpZHRoLCB5KTtcclxuICAgIH0pO1xyXG4gICAgY3VycmVudFkgKz0gbWV0YWRhdGEubGVuZ3RoICogdGhpcy5wZGZMaW5lSGVpZ2h0ICsgNTtcclxuXHJcbiAgICAvLyAtLS0gZHJhdyBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgZG9jLnRleHQoJ1NlYXJjaCBDcml0ZXJpYTotJywgbWFyZ2luTGVmdCwgY3VycmVudFkpO1xyXG4gICAgY3VycmVudFkgKz0gODtcclxuXHJcbiAgICBjb25zdCByb3dIZWlnaHRQZXJMaW5lID0gNjtcclxuICAgIGNvbnN0IG1pbkdhcCA9IDI7IC8vIGdhcCBiZXR3ZWVuIGtleSBhbmQgdmFsdWVcclxuICAgIGNvbnN0IGJldHdlZW5Db2x1bW5zR2FwID0gMTU7IC8vIGdhcCBiZXR3ZWVuIGxlZnQgYW5kIHJpZ2h0IGNvbHVtbnMgKHlvdSBjYW4gdHVuZSB0aGlzKVxyXG4gICAgY29uc3QgcGFnZUNvbnRlbnRXaWR0aCA9IGRvYy5pbnRlcm5hbC5wYWdlU2l6ZS53aWR0aCAtIDIgKiBtYXJnaW5MZWZ0O1xyXG5cclxuICAgIC8vIC0tLSBoZWxwZXIgZnVuY3Rpb24gdG8gbWVhc3VyZSB0b3RhbCB3aWR0aCBvZiBhIGtleS12YWx1ZSBwYWlyIC0tLVxyXG4gICAgY29uc3QgbWVhc3VyZVBhaXJXaWR0aCA9IChrZXk6IHN0cmluZywgdmFsdWU6IHN0cmluZyk6IG51bWJlciA9PiB7XHJcbiAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgY29uc3QgdmFsdWVXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgodmFsdWUpO1xyXG4gICAgICByZXR1cm4ga2V5V2lkdGggKyBtaW5HYXAgKyB2YWx1ZVdpZHRoO1xyXG4gICAgfTtcclxuXHJcbiAgICAvLyAtLS0gY2FsY3VsYXRlIG1heCB3aWR0aCBvZiBsZWZ0IGNvbHVtbiBwYWlycyBkeW5hbWljYWxseSAtLS1cclxuICAgIGxldCBtYXhMZWZ0UGFpcldpZHRoID0gMDtcclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgaWYgKHNlYXJjaENyaXRlcmlhW2ldKSB7XHJcbiAgICAgICAgY29uc3QgW2tleSwgdmFsdWVdID0gc2VhcmNoQ3JpdGVyaWFbaV07XHJcbiAgICAgICAgY29uc3Qgd2lkdGggPSBtZWFzdXJlUGFpcldpZHRoKGtleSwgdmFsdWUpO1xyXG4gICAgICAgIGlmICh3aWR0aCA+IG1heExlZnRQYWlyV2lkdGgpIG1heExlZnRQYWlyV2lkdGggPSB3aWR0aDtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIC8vIC0tLSBjb21wdXRlIHdoZXJlIHJpZ2h0IGNvbHVtbiBzaG91bGQgc3RhcnQgLS0tXHJcbiAgICBjb25zdCBsZWZ0Q29sdW1uU3RhcnQgPSBtYXJnaW5MZWZ0O1xyXG4gICAgY29uc3QgcmlnaHRDb2x1bW5TdGFydCA9IGxlZnRDb2x1bW5TdGFydCArIG1heExlZnRQYWlyV2lkdGggKyBiZXR3ZWVuQ29sdW1uc0dhcDtcclxuXHJcbiAgICAvLyAtLS0gcHJpbnQgc2VhcmNoIGNyaXRlcmlhIGR5bmFtaWNhbGx5IC0tLVxyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICBsZXQgbWF4TGluZUNvdW50ID0gMTtcclxuXHJcbiAgICAgIC8vIExlZnQgY29sdW1uXHJcbiAgICAgIGlmIChzZWFyY2hDcml0ZXJpYVtpXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnYm9sZCcpO1xyXG4gICAgICAgIGRvYy50ZXh0KGtleSwgbGVmdENvbHVtblN0YXJ0LCBjdXJyZW50WSk7XHJcblxyXG4gICAgICAgIGRvYy5zZXRGb250KCdoZWx2ZXRpY2EnLCAnbm9ybWFsJyk7XHJcbiAgICAgICAgY29uc3Qga2V5V2lkdGggPSBkb2MuZ2V0VGV4dFdpZHRoKGtleSArICcgJyk7XHJcbiAgICAgICAgY29uc3QgdmFsdWVYID0gbGVmdENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICAvLyBSaWdodCBjb2x1bW5cclxuICAgICAgaWYgKHNlYXJjaENyaXRlcmlhW2kgKyAxXSkge1xyXG4gICAgICAgIGNvbnN0IFtrZXksIHZhbHVlXSA9IHNlYXJjaENyaXRlcmlhW2kgKyAxXTtcclxuICAgICAgICBkb2Muc2V0Rm9udCgnaGVsdmV0aWNhJywgJ2JvbGQnKTtcclxuICAgICAgICBkb2MudGV4dChrZXksIHJpZ2h0Q29sdW1uU3RhcnQsIGN1cnJlbnRZKTtcclxuXHJcbiAgICAgICAgZG9jLnNldEZvbnQoJ2hlbHZldGljYScsICdub3JtYWwnKTtcclxuICAgICAgICBjb25zdCBrZXlXaWR0aCA9IGRvYy5nZXRUZXh0V2lkdGgoa2V5ICsgJyAnKTtcclxuICAgICAgICBjb25zdCB2YWx1ZVggPSByaWdodENvbHVtblN0YXJ0ICsga2V5V2lkdGggKyBtaW5HYXA7XHJcbiAgICAgICAgZG9jLnRleHQodmFsdWUsIHZhbHVlWCwgY3VycmVudFkpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBjdXJyZW50WSArPSByb3dIZWlnaHRQZXJMaW5lO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IGNvbHVtbkNvdW50ID0gaGVhZGVycy5sZW5ndGg7XHJcbiAgICBjb25zdCB0YWJsZVdpZHRoID0gcGFnZVdpZHRoIC0gKHRoaXMucGRmTGVmdE1hcmdpbiAqIDIpO1xyXG4gICAgY29uc3QgZXF1YWxXaWR0aCA9IHRhYmxlV2lkdGggLyBjb2x1bW5Db3VudDtcclxuXHJcbiAgICBjb25zdCBjb2x1bW5TdHlsZXM6IHsgW2tleTogbnVtYmVyXTogYW55IH0gPSB7fTtcclxuICAgIGhlYWRlcnMuZm9yRWFjaCgoXywgaSkgPT4ge1xyXG4gICAgICBjb2x1bW5TdHlsZXNbaV0gPSB7IGNlbGxXaWR0aDogZXF1YWxXaWR0aCB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgZG9jLmF1dG9UYWJsZSh7XHJcbiAgICAgIGhlYWQ6IFtoZWFkZXJzXSxcclxuICAgICAgYm9keTogcm93cyxcclxuICAgICAgc3RhcnRZOiBjdXJyZW50WSxcclxuICAgICAgdGhlbWU6ICdncmlkJyxcclxuICAgICAgaGVhZFN0eWxlczoge1xyXG4gICAgICAgIGZpbGxDb2xvcjogWzIyMCwgMjIwLCAyMjBdLCB0ZXh0Q29sb3I6IDAsXHJcbiAgICAgICAgZm9udFN0eWxlOiAnYm9sZCcsIGZvbnRTaXplOiA5LCBoYWxpZ246ICdjZW50ZXInLFxyXG4gICAgICB9LFxyXG4gICAgICBib2R5U3R5bGVzOiB7IGZvbnRTaXplOiA4LCBmaWxsQ29sb3I6IFsyNTUsIDI1NSwgMjU1XSwgdGV4dENvbG9yOiBbMCwgMCwgMF0gfSxcclxuICAgICAgc3R5bGVzOiB7IGNlbGxQYWRkaW5nOiAyLCBvdmVyZmxvdzogJ2xpbmVicmVhaycsIG1pbkNlbGxIZWlnaHQ6IDYgfSxcclxuICAgICAgY29sdW1uU3R5bGVzXHJcbiAgICB9KTtcclxuXHJcbiAgICBjb25zdCBwYWdlQ291bnQgPSBkb2MuaW50ZXJuYWwuZ2V0TnVtYmVyT2ZQYWdlcygpO1xyXG4gICAgZm9yIChsZXQgaSA9IDE7IGkgPD0gcGFnZUNvdW50OyBpKyspIHtcclxuICAgICAgZG9jLnNldEZvbnQoXCJoZWx2ZXRpY2FcIiwgXCJib2xkXCIpO1xyXG4gICAgICBkb2Muc2V0UGFnZShpKTtcclxuICAgICAgZG9jLnNldEZvbnRTaXplKDkpO1xyXG4gICAgICBkb2Muc2V0VGV4dENvbG9yKDEwMCk7XHJcblxyXG4gICAgICBjb25zdCBmb290ZXJZID0gZG9jLmludGVybmFsLnBhZ2VTaXplLmhlaWdodCAtIDY7XHJcblxyXG4gICAgICBkb2MudGV4dChcclxuICAgICAgICBgUGFnZSAke2l9IG9mICR7cGFnZUNvdW50fWAsXHJcbiAgICAgICAgcGFnZVdpZHRoIC0gMTUsXHJcbiAgICAgICAgZm9vdGVyWSxcclxuICAgICAgICB7IGFsaWduOiAncmlnaHQnIH1cclxuICAgICAgKTtcclxuICAgIH1cclxuXHJcbiAgICBkb2Muc2F2ZShmaWxlTmFtZSk7XHJcbiAgfVxyXG5cclxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXhjZWwgVW5pdmVyc2FsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxyXG4gIGV4cG9ydFRvRXhjZWxVbml2ZXJzYWwodGl0bGU6IHN0cmluZywgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXSwgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSwgaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IGFueVtdW10sIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IHdvcmtib29rID0gbmV3IEV4Y2VsSlMuV29ya2Jvb2soKTtcclxuICAgIGNvbnN0IHdvcmtzaGVldCA9IHdvcmtib29rLmFkZFdvcmtzaGVldCh0aXRsZSk7XHJcblxyXG4gICAgbGV0IGN1cnJlbnRSb3cgPSAxO1xyXG5cclxuICAgIC8vIEFkZCBpbWFnZSBpZiBhdmFpbGFibGVcclxuICAgIGlmICh0aGlzLmxvZ29CYXNlNjQpIHtcclxuICAgICAgY29uc3QgYmFzZTY0RGF0YSA9IHRoaXMubG9nb0Jhc2U2NC5yZXBsYWNlKC9eZGF0YTppbWFnZVxcL1xcdys7YmFzZTY0LC8sICcnKTtcclxuICAgICAgY29uc3QgaW1hZ2VJZCA9IHdvcmtib29rLmFkZEltYWdlKHtcclxuICAgICAgICBiYXNlNjQ6IGJhc2U2NERhdGEsXHJcbiAgICAgICAgZXh0ZW5zaW9uOiAncG5nJyxcclxuICAgICAgfSk7XHJcblxyXG4gICAgICAvLyBQbGFjZSBpbWFnZSBhdCB0b3AtbGVmdCAoZS5nLiwgQTE6QzQpXHJcbiAgICAgIHdvcmtzaGVldC5hZGRJbWFnZShpbWFnZUlkLCB7XHJcbiAgICAgICAgdGw6IHsgY29sOiAwLCByb3c6IDAgfSxcclxuICAgICAgICBleHQ6IHsgd2lkdGg6IDE0NSwgaGVpZ2h0OiA2NiB9LFxyXG4gICAgICAgIGVkaXRBczogJ29uZUNlbGwnXHJcbiAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIC8vIEFkZCB0aXRsZSBhbGlnbmVkIGluIG1pZGRsZSBob3Jpem9udGFsbHkgKG1lcmdlZCBhY3Jvc3MgYWxsIGNvbHVtbnMpXHJcbiAgICBjb25zdCB0aXRsZVJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdyk7XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDQpLnZhbHVlID0gdGl0bGU7XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDQpLmZvbnQgPSB7IGJvbGQ6IHRydWUsIHNpemU6IDE2IH07XHJcbiAgICB0aXRsZVJvdy5nZXRDZWxsKDQpLmFsaWdubWVudCA9IHsgdmVydGljYWw6ICdtaWRkbGUnLCBob3Jpem9udGFsOiAnbGVmdCcgfTtcclxuXHJcbiAgICBjb25zdCB0aXRsZU1lcmdlRW5kID0gU3RyaW5nLmZyb21DaGFyQ29kZSg2NCArIGhlYWRlcnMubGVuZ3RoKTtcclxuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGBEJHtjdXJyZW50Um93fToke3RpdGxlTWVyZ2VFbmR9JHtjdXJyZW50Um93fWApO1xyXG4gICAgY3VycmVudFJvdyArPSAzOyAvLyBNb3ZlIHBhc3QgaW1hZ2Ugc3BhY2VcclxuXHJcbiAgICAvLyBBZGQgbWV0YWRhdGFcclxuICAgIG1ldGFkYXRhLmZvckVhY2goKFtsYWJlbCwgdmFsdWVdKSA9PiB7XHJcbiAgICAgIGNvbnN0IHJvdyA9IHdvcmtzaGVldC5nZXRSb3coY3VycmVudFJvdysrKTtcclxuICAgICAgY29uc3QgY2VsbCA9IHJvdy5nZXRDZWxsKDEpO1xyXG4gICAgICBjZWxsLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IGAke2xhYmVsfTogYCwgZm9udDogeyBib2xkOiB0cnVlIH0gfSxcclxuICAgICAgICAgIHsgdGV4dDogdmFsdWUgPz8gJycsIGZvbnQ6IHsgYm9sZDogZmFsc2UgfSB9XHJcbiAgICAgICAgXVxyXG4gICAgICB9O1xyXG4gICAgICB3b3Jrc2hlZXQubWVyZ2VDZWxscyhgQSR7cm93Lm51bWJlcn06JHtTdHJpbmcuZnJvbUNoYXJDb2RlKDY0ICsgaGVhZGVycy5sZW5ndGgpfSR7cm93Lm51bWJlcn1gKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHdvcmtzaGVldC5hZGRSb3coW10pO1xyXG4gICAgY3VycmVudFJvdysrO1xyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuICAgIC8vIC0tLSBzZWFyY2ggY3JpdGVyaWEgaGVhZGluZyAtLS1cclxuICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKGN1cnJlbnRSb3csIDEsIGN1cnJlbnRSb3csIDYpO1xyXG4gICAgd29ya3NoZWV0LmdldENlbGwoY3VycmVudFJvdywgMSkudmFsdWUgPSAnU2VhcmNoIENyaXRlcmlhOi0nO1xyXG4gICAgd29ya3NoZWV0LmdldENlbGwoY3VycmVudFJvdywgMSkuZm9udCA9IHsgYm9sZDogdHJ1ZSB9O1xyXG4gICAgY3VycmVudFJvdyArPSAyO1xyXG5cclxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoQ3JpdGVyaWEubGVuZ3RoOyBpICs9IDIpIHtcclxuICAgICAgY29uc3QgbGVmdCA9IHNlYXJjaENyaXRlcmlhW2ldO1xyXG4gICAgICBjb25zdCByaWdodCA9IHNlYXJjaENyaXRlcmlhW2kgKyAxXTsgLy8gbWF5IGJlIHVuZGVmaW5lZFxyXG4gICAgICBjb25zdCByb3cgPSB3b3Jrc2hlZXQuZ2V0Um93KGN1cnJlbnRSb3crKyk7XHJcblxyXG4gICAgICAvLyBMZWZ0IGNlbGxcclxuICAgICAgd29ya3NoZWV0Lm1lcmdlQ2VsbHMocm93Lm51bWJlciwgMSwgcm93Lm51bWJlciwgMyk7XHJcbiAgICAgIHJvdy5nZXRDZWxsKDEpLnZhbHVlID0ge1xyXG4gICAgICAgIHJpY2hUZXh0OiBbXHJcbiAgICAgICAgICB7IHRleHQ6IChsZWZ0Py5bMF0gPz8gJycpICsgJyAnLCBmb250OiB7IGJvbGQ6IHRydWUgfSB9LFxyXG4gICAgICAgICAgeyB0ZXh0OiBsZWZ0Py5bMV0gPz8gJycgfVxyXG4gICAgICAgIF1cclxuICAgICAgfTtcclxuICAgICAgcm93LmdldENlbGwoMSkuYWxpZ25tZW50ID0geyB3cmFwVGV4dDogdHJ1ZSwgdmVydGljYWw6ICdtaWRkbGUnIH07XHJcblxyXG4gICAgICAvLyBSaWdodCBjZWxsIChvbmx5IGlmIHByZXNlbnQpXHJcbiAgICAgIGlmIChyaWdodCkge1xyXG4gICAgICAgIHdvcmtzaGVldC5tZXJnZUNlbGxzKHJvdy5udW1iZXIsIDQsIHJvdy5udW1iZXIsIDYpO1xyXG4gICAgICAgIHJvdy5nZXRDZWxsKDQpLnZhbHVlID0ge1xyXG4gICAgICAgICAgcmljaFRleHQ6IFtcclxuICAgICAgICAgICAgeyB0ZXh0OiAocmlnaHQ/LlswXSA/PyAnJykgKyAnICcsIGZvbnQ6IHsgYm9sZDogdHJ1ZSB9IH0sXHJcbiAgICAgICAgICAgIHsgdGV4dDogcmlnaHQ/LlsxXSA/PyAnJyB9XHJcbiAgICAgICAgICBdXHJcbiAgICAgICAgfTtcclxuICAgICAgICByb3cuZ2V0Q2VsbCg0KS5hbGlnbm1lbnQgPSB7IHdyYXBUZXh0OiB0cnVlLCB2ZXJ0aWNhbDogJ21pZGRsZScgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgY3VycmVudFJvdysrO1xyXG4gICAgLy89PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cclxuXHJcbiAgICAvLyBBZGQgdGFibGUgaGVhZGVyIHJvd1xyXG4gICAgY29uc3QgaGVhZGVyUm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgaGVhZGVycy5mb3JFYWNoKChoZWFkZXIsIGkpID0+IHtcclxuICAgICAgY29uc3QgY2VsbCA9IGhlYWRlclJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgY2VsbC52YWx1ZSA9IGhlYWRlcjtcclxuICAgICAgY2VsbC5mb250ID0geyBib2xkOiB0cnVlIH07XHJcbiAgICAgIGNlbGwuZmlsbCA9IHsgdHlwZTogJ3BhdHRlcm4nLCBwYXR0ZXJuOiAnc29saWQnLCBmZ0NvbG9yOiB7IGFyZ2I6ICdEOUQ5RDknIH0gfTtcclxuICAgICAgY2VsbC5hbGlnbm1lbnQgPSB7IHZlcnRpY2FsOiAnbWlkZGxlJywgaG9yaXpvbnRhbDogJ2NlbnRlcicgfTtcclxuICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgdG9wOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICBib3R0b206IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgIHJpZ2h0OiB7IHN0eWxlOiAndGhpbicgfVxyXG4gICAgICB9O1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc3QgZGF0YVN0YXJ0Um93ID0gY3VycmVudFJvdztcclxuICAgIHJvd3MuZm9yRWFjaChyb3dEYXRhID0+IHtcclxuICAgICAgY29uc3Qgcm93ID0gd29ya3NoZWV0LmdldFJvdyhjdXJyZW50Um93KyspO1xyXG4gICAgICByb3dEYXRhLmZvckVhY2goKHZhbHVlLCBpKSA9PiB7XHJcbiAgICAgICAgY29uc3QgY2VsbCA9IHJvdy5nZXRDZWxsKGkgKyAxKTtcclxuICAgICAgICBjZWxsLnZhbHVlID0gdmFsdWU7XHJcbiAgICAgICAgY2VsbC5ib3JkZXIgPSB7XHJcbiAgICAgICAgICB0b3A6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgYm90dG9tOiB7IHN0eWxlOiAndGhpbicgfSxcclxuICAgICAgICAgIGxlZnQ6IHsgc3R5bGU6ICd0aGluJyB9LFxyXG4gICAgICAgICAgcmlnaHQ6IHsgc3R5bGU6ICd0aGluJyB9XHJcbiAgICAgICAgfTtcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBBdXRvIGNvbHVtbiB3aWR0aHNcclxuICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGhlYWRlcnMubGVuZ3RoOyBpKyspIHtcclxuICAgICAgbGV0IG1heExlbmd0aCA9IGhlYWRlcnNbaSAtIDFdLmxlbmd0aDtcclxuICAgICAgZm9yIChsZXQgcm93TnVtID0gZGF0YVN0YXJ0Um93OyByb3dOdW0gPD0gd29ya3NoZWV0Lmxhc3RSb3chLm51bWJlcjsgcm93TnVtKyspIHtcclxuICAgICAgICBjb25zdCB2YWwgPSB3b3Jrc2hlZXQuZ2V0Um93KHJvd051bSkuZ2V0Q2VsbChpKS52YWx1ZT8udG9TdHJpbmcoKSB8fCAnJztcclxuICAgICAgICBtYXhMZW5ndGggPSBNYXRoLm1heChtYXhMZW5ndGgsIHZhbC5sZW5ndGgpO1xyXG4gICAgICB9XHJcbiAgICAgIHdvcmtzaGVldC5nZXRDb2x1bW4oaSkud2lkdGggPSBtYXhMZW5ndGggKyAyO1xyXG4gICAgfVxyXG5cclxuICAgIHdvcmtib29rLnhsc3gud3JpdGVCdWZmZXIoKS50aGVuKGJ1ZmZlciA9PiB7XHJcbiAgICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xyXG4gICAgICAgIHR5cGU6ICdhcHBsaWNhdGlvbi92bmQub3BlbnhtbGZvcm1hdHMtb2ZmaWNlZG9jdW1lbnQuc3ByZWFkc2hlZXRtbC5zaGVldCdcclxuICAgICAgfSk7XHJcbiAgICAgIEZpbGVTYXZlci5zYXZlQXMoYmxvYiwgZmlsZU5hbWUpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuXHJcbiAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENTViBVbml2ZXJzYWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXHJcbiAgZXhwb3J0VG9Dc3ZVbml2ZXJzYWwodGl0bGU6IHN0cmluZywgbWV0YWRhdGE6IFtzdHJpbmcsIHN0cmluZ11bXSwgc2VhcmNoQ3JpdGVyaWE6IFtzdHJpbmcsIHN0cmluZ11bXSwgaGVhZGVyczogc3RyaW5nW10sIHJvd3M6IGFueVtdW10sIGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVzY2FwZUNzdiA9ICh2YWx1ZTogYW55KSA9PiB7XHJcbiAgICAgIGlmICh2YWx1ZSA9PT0gbnVsbCB8fCB2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gJyc7XHJcbiAgICAgIGNvbnN0IHN0ciA9IHZhbHVlLnRvU3RyaW5nKCk7XHJcbiAgICAgIHJldHVybiBzdHIuaW5jbHVkZXMoJywnKSB8fCBzdHIuaW5jbHVkZXMoJ1wiJykgfHwgc3RyLmluY2x1ZGVzKCdcXG4nKVxyXG4gICAgICAgID8gYFwiJHtzdHIucmVwbGFjZSgvXCIvZywgJ1wiXCInKX1cImBcclxuICAgICAgICA6IHN0cjtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgbWV0YVJvd3MgPSBtZXRhZGF0YS5tYXAoKFtrLCB2XSkgPT4gW2Ake2t9ICR7dn1gXSk7XHJcblxyXG4gICAgLy8gLS0tIEJ1aWxkIHNlYXJjaCBjcml0ZXJpYSBzZWN0aW9uIC0tLVxyXG4gICAgY29uc3Qgc2VhcmNoTGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBpZiAoc2VhcmNoQ3JpdGVyaWE/Lmxlbmd0aCkge1xyXG4gICAgICBzZWFyY2hMaW5lcy5wdXNoKCdTZWFyY2ggQ3JpdGVyaWE6LScpO1xyXG5cclxuICAgICAgY29uc3QgbWF4TGVmdExlbmd0aCA9IE1hdGgubWF4KC4uLnNlYXJjaENyaXRlcmlhLm1hcCgoW2ssIHZdKSA9PiAoayArICcgJyArIHYpLmxlbmd0aCkpO1xyXG5cclxuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hDcml0ZXJpYS5sZW5ndGg7IGkgKz0gMikge1xyXG4gICAgICAgIGNvbnN0IGxlZnQgPSBzZWFyY2hDcml0ZXJpYVtpXTtcclxuICAgICAgICBjb25zdCByaWdodCA9IHNlYXJjaENyaXRlcmlhW2kgKyAxXTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVmdFRleHQgPSBsZWZ0ID8gYCR7bGVmdFswXX0gJHtsZWZ0WzFdfWAucGFkRW5kKG1heExlZnRMZW5ndGggKyA1LCAnICcpIDogJyc7XHJcbiAgICAgICAgY29uc3QgcmlnaHRUZXh0ID0gcmlnaHQgPyBgJHtyaWdodFswXX0gJHtyaWdodFsxXX1gIDogJyc7XHJcblxyXG4gICAgICAgIHNlYXJjaExpbmVzLnB1c2goYFwiJHtsZWZ0VGV4dH0ke3JpZ2h0VGV4dH1cImApOyAvLyB3cmFwIGluIHF1b3RlcyBmb3Igc2luZ2xlIENTViBjZWxsXHJcbiAgICAgIH1cclxuICAgICAgc2VhcmNoTGluZXMucHVzaCgnJyk7IC8vIGJsYW5rIGxpbmUgYWZ0ZXIgY3JpdGVyaWFcclxuICAgIH1cclxuXHJcbiAgICAvLyAtLS0gQ29tYmluZSBhbGwgcGFydHMgLS0tXHJcbiAgICBjb25zdCBjc3ZDb250ZW50ID0gW1xyXG4gICAgICBbdGl0bGVdLmpvaW4oJywnKSxcclxuICAgICAgLi4ubWV0YVJvd3MubWFwKGUgPT4gZS5qb2luKCcsJykpLFxyXG4gICAgICAnJyxcclxuICAgICAgLi4uc2VhcmNoTGluZXMsIC8vIOKchSB0aGlzIGJsb2NrIGlzIGNvbHVtbi1pbmRlcGVuZGVudFxyXG4gICAgICBoZWFkZXJzLmpvaW4oJywnKSxcclxuICAgICAgLi4ucm93cy5tYXAocm93ID0+IHJvdy5tYXAodmFsdWUgPT4gZXNjYXBlQ3N2KHZhbHVlKSkuam9pbignLCcpKVxyXG4gICAgXS5qb2luKCdcXG4nKTtcclxuXHJcbiAgICB0aGlzLmRvd25sb2FkRmlsZShjc3ZDb250ZW50LCBmaWxlTmFtZSwgJ3RleHQvY3N2Jyk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGRvd25sb2FkRmlsZShkYXRhOiBzdHJpbmcsIGZpbGVuYW1lOiBzdHJpbmcsIHR5cGU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtkYXRhXSwgeyB0eXBlIH0pO1xyXG4gICAgY29uc3QgbGluayA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcclxuICAgIGxpbmsuaHJlZiA9IFVSTC5jcmVhdGVPYmplY3RVUkwoYmxvYik7XHJcbiAgICBsaW5rLnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBmaWxlbmFtZSk7XHJcbiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGxpbmspO1xyXG4gICAgbGluay5jbGljaygpO1xyXG4gICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChsaW5rKTtcclxuICB9XHJcblxyXG59XHJcblxyXG4iXX0=
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export class LoaderComponent {
|
|
4
|
-
}
|
|
5
|
-
LoaderComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LoaderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
6
|
-
LoaderComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: LoaderComponent, selector: "app-loader", ngImport: i0, template: "<div class=\"loaderContainer\">\r\n <div class=\"loading\">\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n </div>\r\n</div>", styles: [".loaderContainer{width:100%;height:100%;display:block;position:absolute;background:rgba(255,255,255,.75);top:0;left:0;z-index:10}.loaderContainer .loading{position:absolute;top:50%;left:50%;width:30px}.loaderContainer .loading .loading-bar{display:inline-block;width:3px;margin-right:2px;height:18px;animation:loading 1s ease-in-out infinite}.loaderContainer .loading .loading-bar:nth-child(1){background-color:#8091a5;animation-delay:0}.loaderContainer .loading .loading-bar:nth-child(2){background-color:#8091a5;animation-delay:.09s}.loaderContainer .loading .loading-bar:nth-child(3){background-color:#8091a5;animation-delay:.18s}.loaderContainer .loading .loading-bar:nth-child(4){background-color:#8091a5;animation-delay:.27s}@keyframes loading{0%{transform:scale(1)}20%{transform:scaleY(2.2)}40%{transform:scale(1)}}\n"] });
|
|
7
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: LoaderComponent, decorators: [{
|
|
8
|
-
type: Component,
|
|
9
|
-
args: [{ selector: 'app-loader', template: "<div class=\"loaderContainer\">\r\n <div class=\"loading\">\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n <div class=\"loading-bar\"></div>\r\n </div>\r\n</div>", styles: [".loaderContainer{width:100%;height:100%;display:block;position:absolute;background:rgba(255,255,255,.75);top:0;left:0;z-index:10}.loaderContainer .loading{position:absolute;top:50%;left:50%;width:30px}.loaderContainer .loading .loading-bar{display:inline-block;width:3px;margin-right:2px;height:18px;animation:loading 1s ease-in-out infinite}.loaderContainer .loading .loading-bar:nth-child(1){background-color:#8091a5;animation-delay:0}.loaderContainer .loading .loading-bar:nth-child(2){background-color:#8091a5;animation-delay:.09s}.loaderContainer .loading .loading-bar:nth-child(3){background-color:#8091a5;animation-delay:.18s}.loaderContainer .loading .loading-bar:nth-child(4){background-color:#8091a5;animation-delay:.27s}@keyframes loading{0%{transform:scale(1)}20%{transform:scaleY(2.2)}40%{transform:scale(1)}}\n"] }]
|
|
10
|
-
}] });
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JlcG9ydHMtbGliL3NyYy9saWIvc2hhcmVkL2xvYWRlci9sb2FkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvbG9hZGVyL2xvYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFTLE1BQU0sZUFBZSxDQUFDOztBQVFqRCxNQUFNLE9BQU8sZUFBZTs7NEdBQWYsZUFBZTtnR0FBZixlQUFlLGtEQ1I1Qiw0UUFPTTsyRkRDTyxlQUFlO2tCQU4zQixTQUFTOytCQUNJLFlBQVkiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIElucHV0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnYXBwLWxvYWRlcicsXHJcbiAgICB0ZW1wbGF0ZVVybDogJy4vbG9hZGVyLmNvbXBvbmVudC5odG1sJyxcclxuICAgIHN0eWxlVXJsczogWycuL2xvYWRlci5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcblxyXG5leHBvcnQgY2xhc3MgTG9hZGVyQ29tcG9uZW50IHtcclxufVxyXG4iLCI8ZGl2IGNsYXNzPVwibG9hZGVyQ29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwibG9hZGluZ1wiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWJhclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWJhclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWJhclwiPjwvZGl2PlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkaW5nLWJhclwiPjwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbjwvZGl2PiJdfQ==
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
import * as i1 from "@angular/common";
|
|
4
|
-
import * as i2 from "@angular/forms";
|
|
5
|
-
import * as i3 from "@ng-select/ng-select";
|
|
6
|
-
export class MetadataComponent {
|
|
7
|
-
constructor() {
|
|
8
|
-
this.metaDataOne = {};
|
|
9
|
-
this.metaDataTwo = {};
|
|
10
|
-
this.showmetaDataOne = true;
|
|
11
|
-
this.showmetaDataTwo = false;
|
|
12
|
-
this.searchEvent = new EventEmitter();
|
|
13
|
-
this.exportEvent = new EventEmitter();
|
|
14
|
-
this.searchText = "";
|
|
15
|
-
this.exportFormats = [{ formatName: "Excel", code: 'excel' }, { formatName: "PDF", code: 'pdf' }, { formatName: "CSV", code: 'csv' }];
|
|
16
|
-
this.selectedExportOption = 'excel';
|
|
17
|
-
this.preserveOrder = (_a, _b) => 0;
|
|
18
|
-
}
|
|
19
|
-
ngOnInit() {
|
|
20
|
-
console.log("Meta Data");
|
|
21
|
-
console.log(this.showmetaDataOne);
|
|
22
|
-
console.log(this.showmetaDataTwo);
|
|
23
|
-
}
|
|
24
|
-
onSearch() {
|
|
25
|
-
this.searchEvent.emit(this.searchText?.trim());
|
|
26
|
-
}
|
|
27
|
-
handleExport() {
|
|
28
|
-
this.exportEvent.emit(this.selectedExportOption);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
MetadataComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MetadataComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
32
|
-
MetadataComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: MetadataComponent, selector: "lib-metadata", inputs: { metaDataOne: "metaDataOne", metaDataTwo: "metaDataTwo", showmetaDataOne: "showmetaDataOne", showmetaDataTwo: "showmetaDataTwo", reportName: "reportName" }, outputs: { searchEvent: "searchEvent", exportEvent: "exportEvent" }, ngImport: i0, template: "<section class=\"my-2\">\r\n <div class=\"title mb-3\">\r\n {{reportName}}\r\n </div>\r\n <div class=\"meta mb-2\">\r\n <div *ngIf=\"showmetaDataOne\" class=\"data-holder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of metaDataOne | keyvalue:preserveOrder\">\r\n <td class=\"labl meta-td\">{{item.key}}</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">: {{item.value}}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n <div *ngIf=\"showmetaDataTwo\" class=\"data-holder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of metaDataTwo | keyvalue:preserveOrder\">\r\n <td class=\"labl meta-td\">{{item.key}}</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">: {{item.value}}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n </div>\r\n <div class=\"search-export\">\r\n <div class=\"searchBox\">\r\n <input type=\"text\" [(ngModel)]=\"searchText\" name=\"searchText\" class=\"search-input\"\r\n (ngModelChange)=\"onSearch()\" placeholder=\"Search...\" autocomplete=\"off\" />\r\n\r\n <button type=\"button\" class=\"btn btn-sm search-btn\" (click)=\"onSearch()\">\r\n <img src=\"assets/images/Search.svg\" alt=\"Search\" class=\"search-icon\" />\r\n </button>\r\n </div>\r\n\r\n <div class=\"export\">\r\n <div class=\"exp-options\">\r\n <ng-select [items]=\"exportFormats\" bindLabel=\"formatName\" bindValue=\"code\" placeholder=\"Select Format\"\r\n [(ngModel)]=\"selectedExportOption\" [clearable]=\"false\" class=\"export-selector\" required>\r\n </ng-select>\r\n </div>\r\n <button class=\"btn btn-report\" (click)=\"handleExport()\">Export</button>\r\n </div>\r\n </div>\r\n</section>", styles: [".title{text-align:center;font-size:18px;font-weight:700!important}.meta{position:relative;display:flex;justify-content:space-between;align-items:center}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.meta-td{padding:0!important}.search-export{position:relative;display:flex;justify-content:space-between}.searchBox{display:inline-flex}.search-btn{height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.export{display:flex}.exp-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important}:host ::ng-deep .exp-options .ng-select{width:100%}.btn-report{border-radius:3px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:103px;margin:0 0 0 20px!important;padding:4px 15px!important}\n"], dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i3.NgSelectComponent, selector: "ng-select", inputs: ["bindLabel", "bindValue", "markFirst", "placeholder", "notFoundText", "typeToSearchText", "addTagText", "loadingText", "clearAllText", "appearance", "dropdownPosition", "appendTo", "loading", "closeOnSelect", "hideSelected", "selectOnTab", "openOnEnter", "maxSelectedItems", "groupBy", "groupValue", "bufferAmount", "virtualScroll", "selectableGroup", "selectableGroupAsModel", "searchFn", "trackByFn", "clearOnBackspace", "labelForId", "inputAttrs", "tabIndex", "readonly", "searchWhileComposing", "minTermLength", "editableSearchTerm", "keyDownFn", "typeahead", "multiple", "addTag", "searchable", "clearable", "isOpen", "items", "compareWith", "clearSearchOnAdd"], outputs: ["blur", "focus", "change", "open", "close", "search", "clear", "add", "remove", "scroll", "scrollToEnd"] }, { kind: "pipe", type: i1.KeyValuePipe, name: "keyvalue" }] });
|
|
33
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MetadataComponent, decorators: [{
|
|
34
|
-
type: Component,
|
|
35
|
-
args: [{ selector: 'lib-metadata', template: "<section class=\"my-2\">\r\n <div class=\"title mb-3\">\r\n {{reportName}}\r\n </div>\r\n <div class=\"meta mb-2\">\r\n <div *ngIf=\"showmetaDataOne\" class=\"data-holder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of metaDataOne | keyvalue:preserveOrder\">\r\n <td class=\"labl meta-td\">{{item.key}}</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">: {{item.value}}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n <div *ngIf=\"showmetaDataTwo\" class=\"data-holder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of metaDataTwo | keyvalue:preserveOrder\">\r\n <td class=\"labl meta-td\">{{item.key}}</td>\r\n <td class=\"px-3 meta-td\"><span class=\"info\">: {{item.value}}</span></td>\r\n </tr>\r\n </tbody>\r\n </div>\r\n </div>\r\n <div class=\"search-export\">\r\n <div class=\"searchBox\">\r\n <input type=\"text\" [(ngModel)]=\"searchText\" name=\"searchText\" class=\"search-input\"\r\n (ngModelChange)=\"onSearch()\" placeholder=\"Search...\" autocomplete=\"off\" />\r\n\r\n <button type=\"button\" class=\"btn btn-sm search-btn\" (click)=\"onSearch()\">\r\n <img src=\"assets/images/Search.svg\" alt=\"Search\" class=\"search-icon\" />\r\n </button>\r\n </div>\r\n\r\n <div class=\"export\">\r\n <div class=\"exp-options\">\r\n <ng-select [items]=\"exportFormats\" bindLabel=\"formatName\" bindValue=\"code\" placeholder=\"Select Format\"\r\n [(ngModel)]=\"selectedExportOption\" [clearable]=\"false\" class=\"export-selector\" required>\r\n </ng-select>\r\n </div>\r\n <button class=\"btn btn-report\" (click)=\"handleExport()\">Export</button>\r\n </div>\r\n </div>\r\n</section>", styles: [".title{text-align:center;font-size:18px;font-weight:700!important}.meta{position:relative;display:flex;justify-content:space-between;align-items:center}.labl{font-size:11.2px;font-weight:700!important}.info{font-size:12px!important;font-weight:400;padding-left:.5rem}.meta-td{padding:0!important}.search-export{position:relative;display:flex;justify-content:space-between}.searchBox{display:inline-flex}.search-btn{height:32px;width:36px;background-color:#8091a5;border:none;border-radius:0 4px 4px 0;display:flex;justify-content:center;align-items:center}.search-input{outline:none!important;border:1px solid #ccc!important;width:190px;height:32px!important;font-size:.75rem;padding:.25rem .5rem;border-top-left-radius:4px;border-bottom-left-radius:4px;border-top-right-radius:0!important;border-bottom-right-radius:0!important;text-transform:uppercase}.search-input:focus{box-shadow:0 0 5px 3px #1877f2!important}.export{display:flex}.exp-options{display:inline-flex;font-size:.75rem;height:2rem!important;width:5rem!important}:host ::ng-deep .exp-options .ng-select{width:100%}.btn-report{border-radius:3px;background-color:#8091a5;color:#fff!important;font-size:14px!important;height:32px!important;height:32px;min-width:103px;margin:0 0 0 20px!important;padding:4px 15px!important}\n"] }]
|
|
36
|
-
}], ctorParameters: function () { return []; }, propDecorators: { metaDataOne: [{
|
|
37
|
-
type: Input
|
|
38
|
-
}], metaDataTwo: [{
|
|
39
|
-
type: Input
|
|
40
|
-
}], showmetaDataOne: [{
|
|
41
|
-
type: Input
|
|
42
|
-
}], showmetaDataTwo: [{
|
|
43
|
-
type: Input
|
|
44
|
-
}], reportName: [{
|
|
45
|
-
type: Input
|
|
46
|
-
}], searchEvent: [{
|
|
47
|
-
type: Output
|
|
48
|
-
}], exportEvent: [{
|
|
49
|
-
type: Output
|
|
50
|
-
}] } });
|
|
51
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvbWV0YWRhdGEvbWV0YWRhdGEuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmVwb3J0cy1saWIvc3JjL2xpYi9zaGFyZWQvbWV0YWRhdGEvbWV0YWRhdGEuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQVUsTUFBTSxFQUFFLFlBQVksRUFBQyxNQUFNLGVBQWUsQ0FBQzs7Ozs7QUFPOUUsTUFBTSxPQUFPLGlCQUFpQjtJQVk1QjtRQVhTLGdCQUFXLEdBQXdCLEVBQUUsQ0FBQztRQUN0QyxnQkFBVyxHQUF5QixFQUFFLENBQUM7UUFDeEMsb0JBQWUsR0FBRyxJQUFJLENBQUM7UUFDdkIsb0JBQWUsR0FBRyxLQUFLLENBQUM7UUFFdEIsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO1FBQ3pDLGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUNuRCxlQUFVLEdBQU8sRUFBRSxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsQ0FBQyxFQUFDLFVBQVUsRUFBQyxPQUFPLEVBQUMsSUFBSSxFQUFDLE9BQU8sRUFBQyxFQUFDLEVBQUMsVUFBVSxFQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsS0FBSyxFQUFDLEVBQUMsRUFBQyxVQUFVLEVBQUMsS0FBSyxFQUFDLElBQUksRUFBQyxLQUFLLEVBQUMsQ0FBQyxDQUFBO1FBQy9HLHlCQUFvQixHQUFHLE9BQU8sQ0FBQztRQUMvQixrQkFBYSxHQUFHLENBQUMsRUFBTyxFQUFFLEVBQU8sRUFBVSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRy9DLENBQUM7SUFFRixRQUFRO1FBQ04sT0FBTyxDQUFDLEdBQUcsQ0FBQyxXQUFXLENBQUMsQ0FBQTtRQUN4QixPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNsQyxPQUFPLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQsUUFBUTtRQUNOLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO0lBRUQsWUFBWTtRQUNWLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBQ25ELENBQUM7OzhHQTVCVSxpQkFBaUI7a0dBQWpCLGlCQUFpQiwrUkNQOUIsZzlEQXlDVTsyRkRsQ0csaUJBQWlCO2tCQUw3QixTQUFTOytCQUNFLGNBQWM7MEVBS2YsV0FBVztzQkFBbkIsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNFLGVBQWU7c0JBQXRCLEtBQUs7Z0JBQ0UsZUFBZTtzQkFBdEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNJLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIE9uSW5pdCwgT3V0cHV0LCBFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdsaWItbWV0YWRhdGEnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9tZXRhZGF0YS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vbWV0YWRhdGEuY29tcG9uZW50LnNjc3MnXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgTWV0YWRhdGFDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xyXG4gIEBJbnB1dCgpIG1ldGFEYXRhT25lOlJlY29yZDxzdHJpbmcsc3RyaW5nPiA9e307XHJcbiAgQElucHV0KCkgbWV0YURhdGFUd286UmVjb3JkPHN0cmluZyxzdHJpbmc+ID0ge307XHJcbiAgQElucHV0KClzaG93bWV0YURhdGFPbmUgPSB0cnVlO1xyXG4gIEBJbnB1dCgpc2hvd21ldGFEYXRhVHdvID0gZmFsc2U7XHJcbiAgQElucHV0KCkgcmVwb3J0TmFtZTpzdHJpbmc7XHJcbiAgQE91dHB1dCgpIHNlYXJjaEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgQE91dHB1dCgpIGV4cG9ydEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxzdHJpbmc+KCk7XHJcbiAgc2VhcmNoVGV4dDphbnkgPSBcIlwiO1xyXG4gIGV4cG9ydEZvcm1hdHMgPSBbe2Zvcm1hdE5hbWU6XCJFeGNlbFwiLGNvZGU6J2V4Y2VsJ30se2Zvcm1hdE5hbWU6XCJQREZcIixjb2RlOidwZGYnfSx7Zm9ybWF0TmFtZTpcIkNTVlwiLGNvZGU6J2Nzdid9XVxyXG4gIHNlbGVjdGVkRXhwb3J0T3B0aW9uID0gJ2V4Y2VsJztcclxuICBwcmVzZXJ2ZU9yZGVyID0gKF9hOiBhbnksIF9iOiBhbnkpOiBudW1iZXIgPT4gMDtcclxuICBjb25zdHJ1Y3RvcigpIHtcclxuXHJcbiAgIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICBjb25zb2xlLmxvZyhcIk1ldGEgRGF0YVwiKVxyXG4gICAgY29uc29sZS5sb2codGhpcy5zaG93bWV0YURhdGFPbmUpO1xyXG4gICAgY29uc29sZS5sb2codGhpcy5zaG93bWV0YURhdGFUd28pO1xyXG4gIH1cclxuXHJcbiAgb25TZWFyY2goKXtcclxuICAgIHRoaXMuc2VhcmNoRXZlbnQuZW1pdCh0aGlzLnNlYXJjaFRleHQ/LnRyaW0oKSk7XHJcbiAgfVxyXG5cclxuICBoYW5kbGVFeHBvcnQoKXtcclxuICAgIHRoaXMuZXhwb3J0RXZlbnQuZW1pdCh0aGlzLnNlbGVjdGVkRXhwb3J0T3B0aW9uKTtcclxuICB9XHJcblxyXG59XHJcbiIsIjxzZWN0aW9uIGNsYXNzPVwibXktMlwiPlxyXG4gICAgPGRpdiBjbGFzcz1cInRpdGxlIG1iLTNcIj5cclxuICAgICAgICB7e3JlcG9ydE5hbWV9fVxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwibWV0YSBtYi0yXCI+XHJcbiAgICAgICAgPGRpdiAqbmdJZj1cInNob3dtZXRhRGF0YU9uZVwiIGNsYXNzPVwiZGF0YS1ob2xkZXJcIj5cclxuICAgICAgICAgICAgPHRib2R5PlxyXG4gICAgICAgICAgICAgICAgPHRyICpuZ0Zvcj1cImxldCBpdGVtIG9mIG1ldGFEYXRhT25lIHwga2V5dmFsdWU6cHJlc2VydmVPcmRlclwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz1cImxhYmwgbWV0YS10ZFwiPnt7aXRlbS5rZXl9fTwvdGQ+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwicHgtMyBtZXRhLXRkXCI+PHNwYW4gY2xhc3M9XCJpbmZvXCI+OiB7e2l0ZW0udmFsdWV9fTwvc3Bhbj48L3RkPlxyXG4gICAgICAgICAgICAgICAgPC90cj5cclxuICAgICAgICAgICAgPC90Ym9keT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd21ldGFEYXRhVHdvXCIgY2xhc3M9XCJkYXRhLWhvbGRlclwiPlxyXG4gICAgICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgICAgICA8dHIgKm5nRm9yPVwibGV0IGl0ZW0gb2YgbWV0YURhdGFUd28gfCBrZXl2YWx1ZTpwcmVzZXJ2ZU9yZGVyXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPVwibGFibCBtZXRhLXRkXCI+e3tpdGVtLmtleX19PC90ZD5cclxuICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9XCJweC0zIG1ldGEtdGRcIj48c3BhbiBjbGFzcz1cImluZm9cIj46IHt7aXRlbS52YWx1ZX19PC9zcGFuPjwvdGQ+XHJcbiAgICAgICAgICAgICAgICA8L3RyPlxyXG4gICAgICAgICAgICA8L3Rib2R5PlxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgPC9kaXY+XHJcbiAgICA8ZGl2IGNsYXNzPVwic2VhcmNoLWV4cG9ydFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2hCb3hcIj5cclxuICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgWyhuZ01vZGVsKV09XCJzZWFyY2hUZXh0XCIgbmFtZT1cInNlYXJjaFRleHRcIiBjbGFzcz1cInNlYXJjaC1pbnB1dFwiXHJcbiAgICAgICAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJvblNlYXJjaCgpXCIgcGxhY2Vob2xkZXI9XCJTZWFyY2guLi5cIiBhdXRvY29tcGxldGU9XCJvZmZcIiAvPlxyXG5cclxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLXNtIHNlYXJjaC1idG5cIiAoY2xpY2spPVwib25TZWFyY2goKVwiPlxyXG4gICAgICAgICAgICAgICAgPGltZyBzcmM9XCJhc3NldHMvaW1hZ2VzL1NlYXJjaC5zdmdcIiBhbHQ9XCJTZWFyY2hcIiBjbGFzcz1cInNlYXJjaC1pY29uXCIgLz5cclxuICAgICAgICAgICAgPC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcblxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJleHBvcnRcIj5cclxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV4cC1vcHRpb25zXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctc2VsZWN0IFtpdGVtc109XCJleHBvcnRGb3JtYXRzXCIgYmluZExhYmVsPVwiZm9ybWF0TmFtZVwiIGJpbmRWYWx1ZT1cImNvZGVcIiBwbGFjZWhvbGRlcj1cIlNlbGVjdCBGb3JtYXRcIlxyXG4gICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2VsZWN0ZWRFeHBvcnRPcHRpb25cIiBbY2xlYXJhYmxlXT1cImZhbHNlXCIgY2xhc3M9XCJleHBvcnQtc2VsZWN0b3JcIiByZXF1aXJlZD5cclxuICAgICAgICAgICAgICAgIDwvbmctc2VsZWN0PlxyXG4gICAgICAgICAgICA8L2Rpdj5cclxuICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tcmVwb3J0XCIgKGNsaWNrKT1cImhhbmRsZUV4cG9ydCgpXCI+RXhwb3J0PC9idXR0b24+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICA8L2Rpdj5cclxuPC9zZWN0aW9uPiJdfQ==
|