@datagrok-libraries/statistics 1.10.0 → 1.12.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.
@@ -1,13 +1,49 @@
1
1
  import * as DG from 'datagrok-api/dg';
2
- import { DesirabilityProfile } from './mpo';
3
2
  import { Subject } from 'rxjs';
3
+ import { DesirabilityProfile, WeightedAggregation } from './mpo';
4
+ import '../../css/styles.css';
4
5
  export declare class MpoProfileEditor {
5
- root: HTMLDivElement;
6
- dataFrame?: DG.DataFrame;
7
- onChanged: Subject<unknown>;
6
+ readonly root: HTMLDivElement;
7
+ readonly onChanged: Subject<void>;
8
+ readonly aggregationInput: DG.ChoiceInput<WeightedAggregation | null>;
8
9
  profile?: DesirabilityProfile;
9
- constructor(dataFrame?: DG.DataFrame);
10
- getProfile(): DesirabilityProfile | undefined;
10
+ dataFrame?: DG.DataFrame;
11
+ design: boolean;
12
+ preview: boolean;
13
+ private rows;
14
+ private rowIds;
15
+ private rowSubs;
16
+ private propertyOrder;
17
+ columnMapping: Record<string, string | null>;
18
+ constructor(dataFrame?: DG.DataFrame, design?: boolean, preview?: boolean);
19
+ private newRowId;
11
20
  setProfile(profile?: DesirabilityProfile): void;
21
+ getProfile(): DesirabilityProfile | undefined;
22
+ setDesignMode(on: boolean): void;
23
+ setPreviewMode(on: boolean): void;
24
+ private render;
25
+ private renderEmpty;
26
+ private renderDesignEmpty;
27
+ addProperty(): void;
28
+ private buildHeader;
29
+ private buildRow;
30
+ private buildPropertyCell;
31
+ private buildWeightCell;
32
+ private buildColumnSelector;
33
+ private getEligibleColumnNames;
34
+ private getNumericalColumnNames;
35
+ private resolveColumn;
36
+ private correctPropertyType;
37
+ private switchPropertyType;
38
+ private rebuildRow;
39
+ private buildModeGear;
40
+ private buildRowControls;
41
+ private openModeDialog;
42
+ private getPropertyNameByRowId;
43
+ private renameProperty;
44
+ private deleteRow;
45
+ private insertRowAfterRow;
46
+ private mutateProperty;
47
+ private emitChange;
12
48
  }
13
49
  //# sourceMappingURL=mpo-profile-editor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAGtC,OAAO,EAAC,mBAAmB,EAAC,MAAM,OAAO,CAAC;AAE1C,OAAO,EAAC,OAAO,EAAC,MAAM,MAAM,CAAC;AAG7B,qBAAa,gBAAgB;IAC3B,IAAI,iBAAc;IAClB,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACzB,SAAS,mBAAiB;IAC1B,OAAO,CAAC,EAAE,mBAAmB,CAAC;gBAElB,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS;IAKpC,UAAU,IAAI,mBAAmB,GAAG,SAAS;IAI7C,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB;CAsEzC"}
1
+ {"version":3,"file":"mpo-profile-editor.d.ts","sourceRoot":"","sources":["mpo-profile-editor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAItC,OAAO,EAAC,OAAO,EAAe,MAAM,MAAM,CAAC;AAC3C,OAAO,EAEL,mBAAmB,EAAwB,mBAAmB,EAE/D,MAAM,OAAO,CAAC;AAIf,OAAO,sBAAsB,CAAC;AAM9B,qBAAa,gBAAgB;IAC3B,QAAQ,CAAC,IAAI,iBAAc;IAC3B,QAAQ,CAAC,SAAS,gBAAuB;IACzC,QAAQ,CAAC,gBAAgB,EAAE,EAAE,CAAC,WAAW,CAAC,mBAAmB,GAAG,IAAI,CAAC,CAAC;IAEtE,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC;IACzB,MAAM,UAAS;IACf,OAAO,UAAS;IAEhB,OAAO,CAAC,IAAI,CAAmC;IAC/C,OAAO,CAAC,MAAM,CAA8B;IAC5C,OAAO,CAAC,OAAO,CAAmC;IAElD,OAAO,CAAC,aAAa,CAAgB;IACrC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAM;gBAEtC,SAAS,CAAC,EAAE,EAAE,CAAC,SAAS,EAAE,MAAM,UAAQ,EAAE,OAAO,UAAQ;IAiBrE,OAAO,CAAC,QAAQ;IAIhB,UAAU,CAAC,OAAO,CAAC,EAAE,mBAAmB,GAAG,IAAI;IA2B/C,UAAU,IAAI,mBAAmB,GAAG,SAAS;IAI7C,aAAa,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQhC,cAAc,CAAC,EAAE,EAAE,OAAO,GAAG,IAAI;IAQjC,OAAO,CAAC,MAAM;IA0Bd,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,iBAAiB;IASzB,WAAW,IAAI,IAAI;IAgBnB,OAAO,CAAC,WAAW;IAQnB,OAAO,CAAC,QAAQ;IA4ChB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;IAmDvB,OAAO,CAAC,mBAAmB;IA2B3B,OAAO,CAAC,sBAAsB;IAQ9B,OAAO,CAAC,uBAAuB;IAM/B,OAAO,CAAC,aAAa;IAUrB,OAAO,CAAC,mBAAmB;IAY3B,OAAO,CAAC,kBAAkB;IAiB1B,OAAO,CAAC,UAAU;IAWlB,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,cAAc;IA0BtB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,cAAc;IAqBtB,OAAO,CAAC,SAAS;IA0BjB,OAAO,CAAC,iBAAiB;IAyBzB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,UAAU;CAInB"}
@@ -1,79 +1,389 @@
1
1
  import * as ui from 'datagrok-api/ui';
2
- import { MpoDesirabilityLineEditor } from './mpo-line-editor';
2
+ import * as grok from 'datagrok-api/grok';
3
3
  import { Subject } from 'rxjs';
4
+ import { DEFAULT_AGGREGATION, WEIGHTED_AGGREGATIONS_LIST, createDefaultCategorical, createDefaultNumerical, isNumerical, migrateDesirability, } from './mpo';
5
+ import { DesirabilityEditorFactory } from './editors/desirability-editor-factory';
6
+ import { DesirabilityModeDialog } from './dialogs/desirability-mode-dialog';
7
+ import '../../css/styles.css';
8
+ import { MPO_SCORE_CHANGED_EVENT } from './utils';
9
+ const MAX_CATEGORICAL_CATEGORIES = 20;
4
10
  export class MpoProfileEditor {
5
- constructor(dataFrame) {
11
+ constructor(dataFrame, design = false, preview = false) {
6
12
  this.root = ui.div([]);
7
13
  this.onChanged = new Subject();
14
+ this.design = false;
15
+ this.preview = false;
16
+ this.rows = {};
17
+ this.rowIds = {};
18
+ this.rowSubs = new Map();
19
+ this.propertyOrder = [];
20
+ this.columnMapping = {};
8
21
  this.dataFrame = dataFrame;
9
- this.setProfile();
22
+ this.design = design;
23
+ this.preview = preview;
24
+ this.aggregationInput = ui.input.choice('Aggregation', {
25
+ items: WEIGHTED_AGGREGATIONS_LIST,
26
+ value: DEFAULT_AGGREGATION,
27
+ nullable: false,
28
+ onValueChanged: (v) => {
29
+ if (this.profile)
30
+ this.profile.aggregation = v;
31
+ this.emitChange();
32
+ },
33
+ });
34
+ this.aggregationInput.setTooltip('Score aggregation method');
10
35
  }
11
- getProfile() {
12
- return this.profile;
36
+ newRowId() {
37
+ return crypto.randomUUID();
13
38
  }
14
39
  setProfile(profile) {
40
+ var _a, _b;
41
+ if (profile) {
42
+ for (const key of Object.keys(profile.properties)) {
43
+ const prop = migrateDesirability(profile.properties[key]);
44
+ if (isNumerical(prop))
45
+ (_a = prop.mode) !== null && _a !== void 0 ? _a : (prop.mode = 'freeform');
46
+ profile.properties[key] = prop;
47
+ }
48
+ }
49
+ for (const sub of this.rowSubs.values())
50
+ sub.unsubscribe();
51
+ this.rowSubs.clear();
15
52
  this.profile = profile;
53
+ this.aggregationInput.value = (_b = profile === null || profile === void 0 ? void 0 : profile.aggregation) !== null && _b !== void 0 ? _b : DEFAULT_AGGREGATION;
54
+ this.columnMapping = {};
55
+ this.rows = {};
56
+ this.rowIds = {};
57
+ this.propertyOrder = profile ? Object.keys(profile.properties) : [];
58
+ for (const name of this.propertyOrder)
59
+ this.rowIds[name] = this.newRowId();
60
+ this.render();
61
+ }
62
+ getProfile() {
63
+ return this.profile;
64
+ }
65
+ setDesignMode(on) {
66
+ if (this.design === on)
67
+ return;
68
+ this.design = on;
69
+ this.rows = {};
70
+ this.render();
71
+ }
72
+ setPreviewMode(on) {
73
+ if (this.preview === on)
74
+ return;
75
+ this.preview = on;
76
+ this.rows = {};
77
+ this.render();
78
+ }
79
+ render() {
16
80
  ui.empty(this.root);
17
- if (!profile) {
18
- this.root.append(ui.divText('No profile specified.'));
81
+ if (!this.profile)
82
+ return this.renderEmpty('No profile specified.');
83
+ const rows = this.propertyOrder.map((name) => {
84
+ const rowId = this.rowIds[name];
85
+ if (!this.rows[rowId])
86
+ this.rows[rowId] = this.buildRow(name, rowId, this.profile.properties[name]);
87
+ return this.rows[rowId];
88
+ });
89
+ if (!rows.length) {
90
+ if (!this.preview)
91
+ this.root.append(this.buildHeader());
92
+ if (this.design)
93
+ return this.renderDesignEmpty();
94
+ return this.renderEmpty('No properties defined.');
95
+ }
96
+ if (!this.preview)
97
+ this.root.append(this.buildHeader());
98
+ this.root.append(ui.divV(rows));
99
+ }
100
+ renderEmpty(text) {
101
+ this.root.append(ui.divText(text));
102
+ }
103
+ renderDesignEmpty() {
104
+ const icon = ui.iconFA('chart-line');
105
+ const heading = ui.h3('No properties yet');
106
+ const msg = ui.p('Select a dataset to auto-populate properties from its numerical columns, or add them manually.');
107
+ const addBtn = ui.link('+ Add Property', () => this.addProperty());
108
+ const container = ui.divV([icon, heading, msg, addBtn], 'statistics-mpo-empty-state');
109
+ this.root.append(container);
110
+ }
111
+ addProperty() {
112
+ if (!this.profile)
19
113
  return;
114
+ const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
115
+ const newRowId = this.newRowId();
116
+ this.profile.properties[newName] = createDefaultNumerical();
117
+ this.rowIds[newName] = newRowId;
118
+ this.propertyOrder.push(newName);
119
+ this.rows = {};
120
+ this.render();
121
+ this.emitChange();
122
+ }
123
+ buildHeader() {
124
+ return ui.divH([
125
+ ui.divText('Property', 'statistics-mpo-header-property'),
126
+ ui.divText('Weight', 'statistics-mpo-header-weight'),
127
+ ui.divText('Desirability', 'statistics-mpo-header-desirability'),
128
+ ], 'statistics-mpo-header');
129
+ }
130
+ buildRow(name, rowId, prop) {
131
+ var _a;
132
+ const row = ui.divH([], 'statistics-mpo-row');
133
+ row.dataset.rowId = rowId;
134
+ const col = this.resolveColumn(name);
135
+ if (col) {
136
+ const corrected = this.correctPropertyType(prop, col);
137
+ if (corrected) {
138
+ prop = corrected;
139
+ this.profile.properties[name] = prop;
140
+ }
141
+ }
142
+ const editor = DesirabilityEditorFactory.create(prop, 300, 80, this.design);
143
+ editor.root.classList.add('statistics-mpo-editor-fill');
144
+ (_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
145
+ this.rowSubs.set(rowId, editor.onChanged.subscribe(() => this.emitChange()));
146
+ const propertyCell = this.buildPropertyCell(rowId, name);
147
+ const weightCell = this.buildWeightCell(rowId, prop);
148
+ const columnCell = this.buildColumnSelector(rowId, name, editor);
149
+ const modeGear = this.design ?
150
+ this.buildModeGear(rowId, prop, editor) :
151
+ null;
152
+ const controls = this.design ? this.buildRowControls(rowId) : null;
153
+ row.append(ui.divV([propertyCell, columnCell].filter(Boolean), 'statistics-mpo-property-cell'), weightCell, ui.divH([editor.root, modeGear].filter(Boolean)));
154
+ if (controls)
155
+ row.append(controls);
156
+ return row;
157
+ }
158
+ buildPropertyCell(rowId, name) {
159
+ if (this.dataFrame) {
160
+ const el = ui.divText(name);
161
+ ui.tooltip.bind(el, () => name);
162
+ return el;
20
163
  }
21
- // Create header row for the table
22
- const header = ui.divH([
23
- ui.divText('Property', { style: { fontWeight: 'bold', width: '150px' } }),
24
- ui.divText('Weight', { style: { fontWeight: 'bold', width: '60px' } }),
25
- ui.divText('Desirability', { style: { fontWeight: 'bold', flexGrow: '1' } }), // Let editor take space
26
- ], { style: {
27
- marginTop: '10px',
28
- paddingBottom: '5px',
29
- borderBottom: '1px solid #ccc',
164
+ let currentName = name;
165
+ const propNameInp = ui.input.string('', { value: name, onValueChanged: (v) => {
166
+ if (!v || v === currentName)
167
+ return;
168
+ this.renameProperty(currentName, v);
169
+ currentName = v;
170
+ } });
171
+ ui.tooltip.bind(propNameInp.input, () => currentName);
172
+ return propNameInp.root;
173
+ }
174
+ buildWeightCell(rowId, prop) {
175
+ var _a;
176
+ const name = this.getPropertyNameByRowId(rowId);
177
+ const children = [];
178
+ const weightInput = ui.input.float('', { value: prop.weight, min: 0, max: 1, format: '#0.000',
179
+ onValueChanged: (v) => {
180
+ if (name)
181
+ this.mutateProperty(name, (p) => p.weight = Math.max(0, Math.min(1, v !== null && v !== void 0 ? v : 0)));
30
182
  },
31
183
  });
32
- const propertyRows = Object.entries(profile.properties).map(([propertyName, prop]) => {
33
- var _a, _b, _c;
34
- const lineEditor = new MpoDesirabilityLineEditor(prop, 300, 80);
35
- lineEditor.onChanged.subscribe((_) => this.onChanged.next());
36
- // Input for weight - updates the *copy* of the template data
37
- const weightInput = ui.input.float('', {
38
- value: prop.weight, min: 0, max: 1,
39
- onValueChanged: (newValue) => {
40
- if (profile && profile.properties[propertyName]) {
41
- // Update the weight in the temporary template object
42
- let clampedWeight = newValue !== null && newValue !== void 0 ? newValue : 0;
43
- clampedWeight = Math.max(0, Math.min(1, clampedWeight)); // Clamp 0-1
44
- profile.properties[propertyName].weight = clampedWeight;
45
- }
46
- },
47
- });
48
- weightInput.root.style.width = '60px';
49
- weightInput.root.style.marginTop = '21px';
50
- const matchedColumnName = this.dataFrame ?
51
- this.dataFrame.columns.names().find((name) => name.toLowerCase() == propertyName.toLowerCase()) :
52
- null;
53
- const columnInput = ui.input.choice('', {
54
- nullable: true,
55
- items: (_c = (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.columns) === null || _b === void 0 ? void 0 : _b.names()) !== null && _c !== void 0 ? _c : [''],
56
- value: matchedColumnName !== null && matchedColumnName !== void 0 ? matchedColumnName : ''
184
+ weightInput.root.classList.add('statistics-mpo-weight-input');
185
+ children.push(weightInput.root);
186
+ if (this.dataFrame) {
187
+ const numCols = this.getNumericalColumnNames();
188
+ let isColumn = !!prop.weightColumn && numCols.includes(prop.weightColumn);
189
+ const colInput = ui.input.choice('', { items: numCols, nullable: true, value: (_a = prop.weightColumn) !== null && _a !== void 0 ? _a : '',
190
+ onValueChanged: (v) => {
191
+ if (name)
192
+ this.mutateProperty(name, (p) => p.weightColumn = v || undefined);
193
+ }, });
194
+ const syncToggle = () => {
195
+ weightInput.root.classList.toggle('statistics-mpo-hidden', isColumn);
196
+ colInput.root.classList.toggle('statistics-mpo-hidden', !isColumn);
197
+ toggle.classList.toggle('statistics-mpo-weight-toggle-active', isColumn);
198
+ };
199
+ const toggle = ui.iconFA('columns', () => {
200
+ isColumn = !isColumn;
201
+ syncToggle();
202
+ if (!isColumn && name)
203
+ this.mutateProperty(name, (p) => { delete p.weightColumn; });
204
+ else if (isColumn && name && colInput.value)
205
+ this.mutateProperty(name, (p) => p.weightColumn = colInput.value || undefined);
57
206
  });
58
- const rowDiv = ui.divH([
59
- ui.divV([
60
- ui.divText(propertyName, { style: { width: '150px', paddingTop: '5px', marginLeft: '4px' } }),
61
- this.dataFrame ? columnInput.root : null,
62
- ]),
63
- weightInput.root,
64
- lineEditor.root, // Add the Konva container div
65
- ]);
66
- rowDiv.style.alignItems = 'center'; // Vertically align items in the row
67
- rowDiv.style.marginBottom = '5px'; // Space between rows
68
- rowDiv.style.minHeight = '70px'; // Ensure consistent row height even if editor takes time
69
- return rowDiv;
70
- }).filter((el) => el !== null); // Filter out skipped properties
71
- if (propertyRows.length > 0) {
72
- this.root.append(header);
73
- this.root.append(ui.divV(propertyRows)); // Cast needed after filter
207
+ toggle.classList.add('statistics-mpo-weight-toggle');
208
+ ui.tooltip.bind(toggle, () => isColumn ? 'Switch to manual weight' : 'Use weight from column');
209
+ syncToggle();
210
+ children.push(colInput.root, toggle);
74
211
  }
212
+ return ui.divH(children, 'statistics-mpo-weight-cell');
213
+ }
214
+ buildColumnSelector(rowId, name, editor) {
215
+ var _a, _b;
216
+ if (!this.dataFrame)
217
+ return null;
218
+ const items = this.getEligibleColumnNames();
219
+ const matched = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : null;
220
+ if (matched) {
221
+ const col = this.dataFrame.col(matched);
222
+ (_b = editor.setColumn) === null || _b === void 0 ? void 0 : _b.call(editor, col);
223
+ }
224
+ const input = ui.input.choice('', { items, nullable: true, value: matched !== null && matched !== void 0 ? matched : '', onValueChanged: (v) => {
225
+ var _a;
226
+ this.columnMapping[name] = v !== null && v !== void 0 ? v : null;
227
+ const col = v ? this.dataFrame.col(v) : null;
228
+ if (col && this.switchPropertyType(name, rowId, col))
229
+ return;
230
+ (_a = editor.setColumn) === null || _a === void 0 ? void 0 : _a.call(editor, col);
231
+ this.emitChange();
232
+ } });
233
+ return input.root;
234
+ }
235
+ getEligibleColumnNames() {
236
+ if (!this.dataFrame)
237
+ return [];
238
+ return Array.from(this.dataFrame.columns)
239
+ .filter((c) => !c.isCategorical || c.categories.length <= MAX_CATEGORICAL_CATEGORIES)
240
+ .map((c) => c.name);
241
+ }
242
+ getNumericalColumnNames() {
243
+ if (!this.dataFrame)
244
+ return [];
245
+ return Array.from(this.dataFrame.columns.numerical).map((c) => c.name);
246
+ }
247
+ resolveColumn(name) {
248
+ var _a, _b, _c;
249
+ if (!this.dataFrame)
250
+ return null;
251
+ const eligible = this.getEligibleColumnNames();
252
+ const colName = (_b = (_a = this.columnMapping[name]) !== null && _a !== void 0 ? _a : eligible.find((c) => c.toLowerCase() === name.toLowerCase())) !== null && _b !== void 0 ? _b : null;
253
+ if (colName)
254
+ this.columnMapping[name] = colName;
255
+ return colName ? (_c = this.dataFrame.col(colName)) !== null && _c !== void 0 ? _c : null : null;
256
+ }
257
+ correctPropertyType(prop, col) {
258
+ if (isNumerical(prop) && col.isCategorical) {
259
+ const categories = col.categories.map((c) => ({ name: c, desirability: 1 }));
260
+ return createDefaultCategorical(prop.weight, categories);
261
+ }
262
+ if (!isNumerical(prop) && col.isNumerical)
263
+ return createDefaultNumerical(prop.weight, col.min, col.max);
264
+ return null;
265
+ }
266
+ switchPropertyType(name, rowId, col) {
267
+ if (!this.profile)
268
+ return false;
269
+ const corrected = this.correctPropertyType(this.profile.properties[name], col);
270
+ if (!corrected)
271
+ return false;
272
+ this.profile.properties[name] = corrected;
273
+ this.rebuildRow(name, rowId);
274
+ return true;
275
+ }
276
+ rebuildRow(name, rowId) {
277
+ const oldRow = this.rows[rowId];
278
+ const newRow = this.buildRow(name, rowId, this.profile.properties[name]);
279
+ this.rows[rowId] = newRow;
280
+ if (oldRow === null || oldRow === void 0 ? void 0 : oldRow.parentNode)
281
+ oldRow.replaceWith(newRow);
282
+ this.emitChange();
283
+ }
284
+ buildModeGear(rowId, prop, editor) {
285
+ const gear = ui.icons.settings(() => {
286
+ var _a, _b;
287
+ const name = this.getPropertyNameByRowId(rowId);
288
+ if (!name)
289
+ return;
290
+ const colName = this.columnMapping[name];
291
+ const col = colName ? (_b = (_a = this.dataFrame) === null || _a === void 0 ? void 0 : _a.col(colName)) !== null && _b !== void 0 ? _b : null : null;
292
+ this.openModeDialog(name, rowId, prop, editor, col);
293
+ });
294
+ gear.classList.add('statistics-mpo-gear');
295
+ return gear;
296
+ }
297
+ buildRowControls(rowId) {
298
+ const add = ui.icons.add(() => this.insertRowAfterRow(rowId));
299
+ const del = ui.icons.delete(() => this.deleteRow(rowId));
300
+ return ui.divH([add, del], 'statistics-mpo-control-buttons');
301
+ }
302
+ openModeDialog(name, rowId, prop, editor, mappedCol = null) {
303
+ new DesirabilityModeDialog(name, prop, (patch) => {
304
+ var _a;
305
+ const p = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
306
+ if (p)
307
+ Object.assign(p, patch);
308
+ editor.redrawAll();
309
+ }, (newProp) => {
310
+ if (!this.profile)
311
+ return;
312
+ this.profile.properties[name] = newProp;
313
+ this.rebuildRow(name, rowId);
314
+ }, mappedCol).show();
315
+ }
316
+ getPropertyNameByRowId(rowId) {
317
+ var _a;
318
+ return (_a = Object.entries(this.rowIds)
319
+ .find(([, id]) => id === rowId)) === null || _a === void 0 ? void 0 : _a[0];
320
+ }
321
+ renameProperty(oldName, newName) {
322
+ var _a;
323
+ if (!this.profile || this.profile.properties[newName])
324
+ return;
325
+ const rowId = this.rowIds[oldName];
326
+ this.profile.properties[newName] = this.profile.properties[oldName];
327
+ delete this.profile.properties[oldName];
328
+ this.columnMapping[newName] = (_a = this.columnMapping[oldName]) !== null && _a !== void 0 ? _a : null;
329
+ delete this.columnMapping[oldName];
330
+ const idx = this.propertyOrder.indexOf(oldName);
331
+ if (idx >= 0)
332
+ this.propertyOrder[idx] = newName;
333
+ delete this.rowIds[oldName];
334
+ this.rowIds[newName] = rowId;
335
+ this.emitChange();
336
+ }
337
+ deleteRow(rowId) {
338
+ var _a;
339
+ const name = this.getPropertyNameByRowId(rowId);
340
+ if (!name || !this.profile)
341
+ return;
342
+ delete this.profile.properties[name];
343
+ delete this.columnMapping[name];
344
+ delete this.rowIds[name];
345
+ (_a = this.rowSubs.get(rowId)) === null || _a === void 0 ? void 0 : _a.unsubscribe();
346
+ this.rowSubs.delete(rowId);
347
+ const idx = this.propertyOrder.indexOf(name);
348
+ if (idx >= 0)
349
+ this.propertyOrder.splice(idx, 1);
350
+ const rowEl = this.rows[rowId];
351
+ delete this.rows[rowId];
352
+ if (this.propertyOrder.length === 0)
353
+ this.render();
75
354
  else
76
- this.root.append(ui.divText('No matching properties found in the table for this template.'));
355
+ rowEl === null || rowEl === void 0 ? void 0 : rowEl.remove();
356
+ this.emitChange();
357
+ }
358
+ insertRowAfterRow(rowId) {
359
+ var _a;
360
+ if (!this.profile)
361
+ return;
362
+ const afterName = this.getPropertyNameByRowId(rowId);
363
+ if (!afterName)
364
+ return;
365
+ const newName = `NewProperty${Object.keys(this.profile.properties).length + 1}`;
366
+ const newRowId = this.newRowId();
367
+ this.profile.properties[newName] = createDefaultNumerical();
368
+ this.rowIds[newName] = newRowId;
369
+ const idx = this.propertyOrder.indexOf(afterName);
370
+ this.propertyOrder.splice(idx + 1, 0, newName);
371
+ const newRow = this.buildRow(newName, newRowId, this.profile.properties[newName]);
372
+ this.rows[newRowId] = newRow;
373
+ (_a = this.rows[rowId]) === null || _a === void 0 ? void 0 : _a.after(newRow);
374
+ this.emitChange();
375
+ }
376
+ mutateProperty(name, updater) {
377
+ var _a;
378
+ const prop = (_a = this.profile) === null || _a === void 0 ? void 0 : _a.properties[name];
379
+ if (!prop)
380
+ return;
381
+ updater(prop);
382
+ this.emitChange();
383
+ }
384
+ emitChange() {
385
+ this.onChanged.next();
386
+ grok.events.fireCustomEvent(MPO_SCORE_CHANGED_EVENT, {});
77
387
  }
78
388
  }
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFHdEMsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sbUJBQW1CLENBQUM7QUFDNUQsT0FBTyxFQUFDLE9BQU8sRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUc3QixNQUFNLE9BQU8sZ0JBQWdCO0lBTTNCLFlBQVksU0FBd0I7UUFMcEMsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFJeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDM0IsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO0lBQ3BCLENBQUM7SUFFRCxVQUFVO1FBQ1IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDO0lBQ3RCLENBQUM7SUFFRCxVQUFVLENBQUMsT0FBNkI7UUFDdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEIsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsdUJBQXVCLENBQUMsQ0FBQyxDQUFDO1lBQ3RELE9BQU87U0FDUjtRQUVELGtDQUFrQztRQUNsQyxNQUFNLE1BQU0sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDO1lBQ3JCLEVBQUUsQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEVBQUMsS0FBSyxFQUFFLEVBQUMsVUFBVSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFDLEVBQUMsQ0FBQztZQUNyRSxFQUFFLENBQUMs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QVksRUFBRSxFQUFDLEtBQUssRUFBRSxFQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLEVBQUMsQ0FBQztvQkFDekYsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSTtpQkFDekMsQ0FBQztnQkFDRixXQUFXLENBQUMsSUFBSTtnQkFDaEIsVUFBVSxDQUFDLElBQUksRUFBRSw4QkFBOEI7YUFDaEQsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVLEdBQUcsUUFBUSxDQUFDLENBQUMsb0NBQW9DO1lBQ3hFLE1BQU0sQ0FBQyxLQUFLLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxDQUFDLHFCQUFxQjtZQUN4RCxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsQ0FBQyx5REFBeUQ7WUFFMUYsT0FBTyxNQUFNLENBQUM7UUFDaEIsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEtBQUssSUFBSSxDQUFDLENBQUMsQ0FBQyxnQ0FBZ0M7UUFFaEUsSUFBSSxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTtZQUMzQixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUN6QixJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLFlBQTZCLENBQUMsQ0FBQyxDQUFDLENBQUMsMkJBQTJCO1NBQ3RGOztZQUNDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsOERBQThELENBQUMsQ0FBQyxDQUFDO0lBQ2pHLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuXG5pbXBvcnQge0Rlc2lyYWJpbGl0eVByb2ZpbGV9IGZyb20gJy4vbXBvJztcbmltcG9ydCB7TXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcn0gZnJvbSAnLi9tcG8tbGluZS1lZGl0b3InO1xuaW1wb3J0IHtTdWJqZWN0fSBmcm9tICdyeGpzJztcblxuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJvb3QgPSB1aS5kaXYoW10pO1xuICBkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWU7XG4gIG9uQ2hhbmdlZCA9IG5ldyBTdWJqZWN0KCk7XG4gIHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlO1xuXG4gIGNvbnN0cnVjdG9yKGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZSkge1xuICAgIHRoaXMuZGF0YUZyYW1lID0gZGF0YUZyYW1lO1xuICAgIHRoaXMuc2V0UHJvZmlsZSgpO1xuICB9XG5cbiAgZ2V0UHJvZmlsZSgpOiBEZXNpcmFiaWxpdHlQcm9maWxlIHwgdW5kZWZpbmVkIHtcbiAgICByZXR1cm4gdGhpcy5wcm9maWxlO1xuICB9XG5cbiAgc2V0UHJvZmlsZShwcm9maWxlPzogRGVzaXJhYmlsaXR5UHJvZmlsZSkge1xuICAgIHRoaXMucHJvZmlsZSA9IHByb2ZpbGU7XG4gICAgdWkuZW1wdHkodGhpcy5yb290KTtcbiAgICBpZiAoIXByb2ZpbGUpIHtcbiAgICAgIHRoaXMucm9vdC5hcHBlbmQodWkuZGl2VGV4dCgnTm8gcHJvZmlsZSBzcGVjaWZpZWQuJykpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBoZWFkZXIgcm93IGZvciB0aGUgdGFibGVcbiAgICBjb25zdCBoZWFkZXIgPSB1aS5kaXZIKFtcbiAgICAgIHVpLmRpdlRleHQoJ1Byb3BlcnR5Jywge3N0eWxlOiB7Zm9udFdlaWdodDogJ2JvbGQnLCB3aWR0aDogJzE1MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgd2lkdGg6ICc2MHB4J319KSxcbiAgICAgIHVpLmRpdlRleHQoJ0Rlc2lyYWJpbGl0eScsIHtzdHlsZToge2ZvbnRXZWlnaHQ6ICdib2xkJywgZmxleEdyb3c6ICcxJ319KSwgLy8gTGV0IGVkaXRvciB0YWtlIHNwYWNlXG4gICAgXSwge3N0eWxlOiB7XG4gICAgICBtYXJnaW5Ub3A6ICcxMHB4JyxcbiAgICAgIHBhZGRpbmdCb3R0b206ICc1cHgnLFxuICAgICAgYm9yZGVyQm90dG9tOiAnMXB4IHNvbGlkICNjY2MnLFxuICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBwcm9wZXJ0eVJvd3MgPSBPYmplY3QuZW50cmllcyhwcm9maWxlLnByb3BlcnRpZXMpLm1hcCgoW3Byb3BlcnR5TmFtZSwgcHJvcF0pID0+IHtcbiAgICAgIGNvbnN0IGxpbmVFZGl0b3IgPSBuZXcgTXBvRGVzaXJhYmlsaXR5TGluZUVkaXRvcihwcm9wLCAzMDAsIDgwKTtcbiAgICAgIGxpbmVFZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoXykgPT4gdGhpcy5vbkNoYW5nZWQubmV4dCgpKTtcblxuICAgICAgLy8gSW5wdXQgZm9yIHdlaWdodCAtIHVwZGF0ZXMgdGhlICpjb3B5KiBvZiB0aGUgdGVtcGxhdGUgZGF0YVxuICAgICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywgeyAvLyBObyBsYWJlbCBuZWVkZWQgaGVyZVxuICAgICAgICB2YWx1ZTogcHJvcC53ZWlnaHQsIG1pbjogMCwgbWF4OiAxLFxuICAgICAgICBvblZhbHVlQ2hhbmdlZDogKG5ld1ZhbHVlKSA9PiB7IC8vIENoYW5nZWQgcGFyYW1ldGVyIG5hbWUgZm9yIGNsYXJpdHlcbiAgICAgICAgICBpZiAocHJvZmlsZSAmJiBwcm9maWxlLnByb3BlcnRpZXNbcHJvcGVydHlOYW1lXSkge1xuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB3ZWlnaHQgaW4gdGhlIHRlbXBvcmFyeSB0ZW1wbGF0ZSBvYmplY3RcbiAgICAgICAgICAgIGxldCBjbGFtcGVkV2VpZ2h0ID0gbmV3VmFsdWUgPz8gMDtcbiAgICAgICAgICAgIGNsYW1wZWRXZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBjbGFtcGVkV2VpZ2h0KSk7IC8vIENsYW1wIDAtMVxuICAgICAgICAgICAgcHJvZmlsZS5wcm9wZXJ0aWVzW3Byb3BlcnR5TmFtZV0ud2VpZ2h0ID0gY2xhbXBlZFdlaWdodDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgd2VpZ2h0SW5wdXQucm9vdC5zdHlsZS53aWR0aCA9ICc2MHB4JztcbiAgICAgIHdlaWdodElucHV0LnJvb3Quc3R5bGUubWFyZ2luVG9wID0gJzIxcHgnO1xuXG4gICAgICBjb25zdCBtYXRjaGVkQ29sdW1uTmFtZSA9IHRoaXMuZGF0YUZyYW1lID9cbiAgICAgICAgdGhpcy5kYXRhRnJhbWUuY29sdW1ucy5uYW1lcygpLmZpbmQoKG5hbWUpID0+IG5hbWUudG9Mb3dlckNhc2UoKSA9PSBwcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSkgOlxuICAgICAgICBudWxsO1xuXG4gICAgICBjb25zdCBjb2x1bW5JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnJywge1xuICAgICAgICBudWxsYWJsZTogdHJ1ZSxcbiAgICAgICAgaXRlbXM6IHRoaXMuZGF0YUZyYW1lPy5jb2x1bW5zPy5uYW1lcygpID8/IFsnJ10sXG4gICAgICAgIHZhbHVlOiBtYXRjaGVkQ29sdW1uTmFtZSA/PyAnJ30pO1xuXG4gICAgICBjb25zdCByb3dEaXYgPSB1aS5kaXZIKFtcbiAgICAgICAgdWkuZGl2VihbXG4gICAgICAgICAgdWkuZGl2VGV4dChwcm9wZXJ0eU5hbWUsIHtzdHlsZToge3dpZHRoOiAnMTUwcHgnLCBwYWRkaW5nVG9wOiAnNXB4JywgbWFyZ2luTGVmdDogJzRweCd9fSksXG4gICAgICAgICAgdGhpcy5kYXRhRnJhbWUgPyBjb2x1bW5JbnB1dC5yb290IDogbnVsbCxcbiAgICAgICAgXSksXG4gICAgICAgIHdlaWdodElucHV0LnJvb3QsXG4gICAgICAgIGxpbmVFZGl0b3Iucm9vdCwgLy8gQWRkIHRoZSBLb252YSBjb250YWluZXIgZGl2XG4gICAgICBdKTtcbiAgICAgIHJvd0Rpdi5zdHlsZS5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7IC8vIFZlcnRpY2FsbHkgYWxpZ24gaXRlbXMgaW4gdGhlIHJvd1xuICAgICAgcm93RGl2LnN0eWxlLm1hcmdpbkJvdHRvbSA9ICc1cHgnOyAvLyBTcGFjZSBiZXR3ZWVuIHJvd3NcbiAgICAgIHJvd0Rpdi5zdHlsZS5taW5IZWlnaHQgPSAnNzBweCc7IC8vIEVuc3VyZSBjb25zaXN0ZW50IHJvdyBoZWlnaHQgZXZlbiBpZiBlZGl0b3IgdGFrZXMgdGltZVxuXG4gICAgICByZXR1cm4gcm93RGl2O1xuICAgIH0pLmZpbHRlcigoZWwpID0+IGVsICE9PSBudWxsKTsgLy8gRmlsdGVyIG91dCBza2lwcGVkIHByb3BlcnRpZXNcblxuICAgIGlmIChwcm9wZXJ0eVJvd3MubGVuZ3RoID4gMCkge1xuICAgICAgdGhpcy5yb290LmFwcGVuZChoZWFkZXIpO1xuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHByb3BlcnR5Um93cyBhcyBIVE1MRWxlbWVudFtdKSk7IC8vIENhc3QgbmVlZGVkIGFmdGVyIGZpbHRlclxuICAgIH0gZWxzZVxuICAgICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KCdObyBtYXRjaGluZyBwcm9wZXJ0aWVzIGZvdW5kIGluIHRoZSB0YWJsZSBmb3IgdGhpcyB0ZW1wbGF0ZS4nKSk7XG4gIH1cbn1cbiJdfQ==
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXBvLXByb2ZpbGUtZWRpdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsibXBvLXByb2ZpbGUtZWRpdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDdEMsT0FBTyxLQUFLLElBQUksTUFBTSxtQkFBbUIsQ0FBQztBQUUxQyxPQUFPLEVBQUMsT0FBTyxFQUFlLE1BQU0sTUFBTSxDQUFDO0FBQzNDLE9BQU8sRUFDTCxtQkFBbUIsRUFBRSwwQkFBMEIsRUFFL0Msd0JBQXdCLEVBQUUsc0JBQXNCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixHQUNuRixNQUFNLE9BQU8sQ0FBQztBQUNmLE9BQU8sRUFBcUIseUJBQXlCLEVBQUMsTUFBTSx1Q0FBdUMsQ0FBQztBQUNwRyxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQztBQUUxRSxPQUFPLHNCQUFzQixDQUFDO0FBRTlCLE9BQU8sRUFBQyx1QkFBdUIsRUFBQyxNQUFNLFNBQVMsQ0FBQztBQUVoRCxNQUFNLDBCQUEwQixHQUFHLEVBQUUsQ0FBQztBQUV0QyxNQUFNLE9BQU8sZ0JBQWdCO0lBaUIzQixZQUFZLFNBQXdCLEVBQUUsTUFBTSxHQUFHLEtBQUssRUFBRSxPQUFPLEdBQUcsS0FBSztRQWhCNUQsU0FBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEIsY0FBUyxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7UUFLekMsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUNmLFlBQU8sR0FBRyxLQUFLLENBQUM7UUFFUixTQUFJLEdBQWdDLEVBQUUsQ0FBQztRQUN2QyxXQUFNLEdBQTJCLEVBQUUsQ0FBQztRQUNwQyxZQUFPLEdBQUcsSUFBSSxHQUFHLEVBQXdCLENBQUM7UUFFMUMsa0JBQWEsR0FBYSxFQUFFLENBQUM7UUFDckMsa0JBQWEsR0FBa0MsRUFBRSxDQUFDO1FBR2hELElB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LE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBRS9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2xGLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsTUFBTSxDQUFDO1FBRTdCLE1BQUEsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsMENBQUUsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2hDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sY0FBYyxDQUNwQixJQUFZLEVBQ1osT0FBMEM7O1FBRTFDLE1BQU0sSUFBSSxHQUFHLE1BQUEsSUFBSSxDQUFDLE9BQU8sMENBQUUsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLElBQUksQ0FBQyxJQUFJO1lBQ1AsT0FBTztRQUVULE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUNwQixDQUFDO0lBRU8sVUFBVTtRQUNoQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxNQUFNLENBQUMsZUFBZSxDQUFDLHVCQUF1QixFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNELENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIERHIGZyb20gJ2RhdGFncm9rLWFwaS9kZyc7XG5pbXBvcnQgKiBhcyB1aSBmcm9tICdkYXRhZ3Jvay1hcGkvdWknO1xuaW1wb3J0ICogYXMgZ3JvayBmcm9tICdkYXRhZ3Jvay1hcGkvZ3Jvayc7XG5cbmltcG9ydCB7U3ViamVjdCwgU3Vic2NyaXB0aW9ufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIERFRkFVTFRfQUdHUkVHQVRJT04sIFdFSUdIVEVEX0FHR1JFR0FUSU9OU19MSVNULFxuICBEZXNpcmFiaWxpdHlQcm9maWxlLCBQcm9wZXJ0eURlc2lyYWJpbGl0eSwgV2VpZ2h0ZWRBZ2dyZWdhdGlvbixcbiAgY3JlYXRlRGVmYXVsdENhdGVnb3JpY2FsLCBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsLCBpc051bWVyaWNhbCwgbWlncmF0ZURlc2lyYWJpbGl0eSxcbn0gZnJvbSAnLi9tcG8nO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlFZGl0b3IsIERlc2lyYWJpbGl0eUVkaXRvckZhY3Rvcnl9IGZyb20gJy4vZWRpdG9ycy9kZXNpcmFiaWxpdHktZWRpdG9yLWZhY3RvcnknO1xuaW1wb3J0IHtEZXNpcmFiaWxpdHlNb2RlRGlhbG9nfSBmcm9tICcuL2RpYWxvZ3MvZGVzaXJhYmlsaXR5LW1vZGUtZGlhbG9nJztcblxuaW1wb3J0ICcuLi8uLi9jc3Mvc3R5bGVzLmNzcyc7XG5cbmltcG9ydCB7TVBPX1NDT1JFX0NIQU5HRURfRVZFTlR9IGZyb20gJy4vdXRpbHMnO1xuXG5jb25zdCBNQVhfQ0FURUdPUklDQUxfQ0FURUdPUklFUyA9IDIwO1xuXG5leHBvcnQgY2xhc3MgTXBvUHJvZmlsZUVkaXRvciB7XG4gIHJlYWRvbmx5IHJvb3QgPSB1aS5kaXYoW10pO1xuICByZWFkb25seSBvbkNoYW5nZWQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICByZWFkb25seSBhZ2dyZWdhdGlvbklucHV0OiBERy5DaG9pY2VJbnB1dDxXZWlnaHRlZEFnZ3JlZ2F0aW9uIHwgbnVsbD47XG5cbiAgcHJvZmlsZT86IERlc2lyYWJpbGl0eVByb2ZpbGU7XG4gIGRhdGFGcmFtZT86IERHLkRhdGFGcmFtZTtcbiAgZGVzaWduID0gZmFsc2U7XG4gIHByZXZpZXcgPSBmYWxzZTtcblxuICBwcml2YXRlIHJvd3M6IFJlY29yZDxzdHJpbmcsIEhUTUxFbGVtZW50PiA9IHt9O1xuICBwcml2YXRlIHJvd0lkczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICBwcml2YXRlIHJvd1N1YnMgPSBuZXcgTWFwPHN0cmluZywgU3Vic2NyaXB0aW9uPigpO1xuXG4gIHByaXZhdGUgcHJvcGVydHlPcmRlcjogc3RyaW5nW10gPSBbXTtcbiAgY29sdW1uTWFwcGluZzogUmVjb3JkPHN0cmluZywgc3RyaW5nIHwgbnVsbD4gPSB7fTtcblxuICBjb25zdHJ1Y3RvcihkYXRhRnJhbWU/OiBERy5EYXRhRnJhbWUsIGRlc2lnbiA9IGZhbHNlLCBwcmV2aWV3ID0gZmFsc2UpIHtcbiAgICB0aGlzLmRhdGFGcmFtZSA9IGRhdGFGcmFtZTtcbiAgICB0aGlzLmRlc2lnbiA9IGRlc2lnbjtcbiAgICB0aGlzLnByZXZpZXcgPSBwcmV2aWV3O1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dCA9IHVpLmlucHV0LmNob2ljZSgnQWdncmVnYXRpb24nLCB7XG4gICAgICBpdGVtczogV0VJR0hURURfQUdHUkVHQVRJT05TX0xJU1QsXG4gICAgICB2YWx1ZTogREVGQVVMVF9BR0dSRUdBVElPTixcbiAgICAgIG51bGxhYmxlOiBmYWxzZSxcbiAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICBpZiAodGhpcy5wcm9maWxlKVxuICAgICAgICAgIHRoaXMucHJvZmlsZS5hZ2dyZWdhdGlvbiA9IHY7XG4gICAgICAgIHRoaXMuZW1pdENoYW5nZSgpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICB0aGlzLmFnZ3JlZ2F0aW9uSW5wdXQuc2V0VG9vbHRpcCgnU2NvcmUgYWdncmVnYXRpb24gbWV0aG9kJyk7XG4gIH1cblxuICBwcml2YXRlIG5ld1Jvd0lkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIGNyeXB0by5yYW5kb21VVUlEKCk7XG4gIH1cblxuICBzZXRQcm9maWxlKHByb2ZpbGU/OiBEZXNpcmFiaWxpdHlQcm9maWxlKTogdm9pZCB7XG4gICAgaWYgKHByb2ZpbGUpIHtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHByb2ZpbGUucHJvcGVydGllcykpIHtcbiAgICAgICAgY29uc3QgcHJvcCA9IG1pZ3JhdGVEZXNpcmFiaWxpdHkocHJvZmlsZS5wcm9wZXJ0aWVzW2tleV0pO1xuICAgICAgICBpZiAoaXNOdW1lcmljYWwocHJvcCkpXG4gICAgICAgICAgcHJvcC5tb2RlID8/PSAnZnJlZWZvcm0nO1xuICAgICAgICBwcm9maWxlLnByb3BlcnRpZXNba2V5XSA9IHByb3A7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZm9yIChjb25zdCBzdWIgb2YgdGhpcy5yb3dTdWJzLnZhbHVlcygpKVxuICAgICAgc3ViLnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5yb3dTdWJzLmNsZWFyKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUgPSBwcm9maWxlO1xuICAgIHRoaXMuYWdncmVnYXRpb25JbnB1dC52YWx1ZSA9IHByb2ZpbGU/LmFnZ3JlZ2F0aW9uID8/IERFRkFVTFRfQUdHUkVHQVRJT047XG4gICAgdGhpcy5jb2x1bW5NYXBwaW5nID0ge307XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yb3dJZHMgPSB7fTtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIgPSBwcm9maWxlID8gT2JqZWN0LmtleXMocHJvZmlsZS5wcm9wZXJ0aWVzKSA6IFtdO1xuXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIHRoaXMucHJvcGVydHlPcmRlcilcbiAgICAgIHRoaXMucm93SWRzW25hbWVdID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIGdldFByb2ZpbGUoKTogRGVzaXJhYmlsaXR5UHJvZmlsZSB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMucHJvZmlsZTtcbiAgfVxuXG4gIHNldERlc2lnbk1vZGUob246IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5kZXNpZ24gPT09IG9uKVxuICAgICAgcmV0dXJuO1xuICAgIHRoaXMuZGVzaWduID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHNldFByZXZpZXdNb2RlKG9uOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucHJldmlldyA9PT0gb24pXG4gICAgICByZXR1cm47XG4gICAgdGhpcy5wcmV2aWV3ID0gb247XG4gICAgdGhpcy5yb3dzID0ge307XG4gICAgdGhpcy5yZW5kZXIoKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyKCk6IHZvaWQge1xuICAgIHVpLmVtcHR5KHRoaXMucm9vdCk7XG5cbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9maWxlIHNwZWNpZmllZC4nKTtcblxuICAgIGNvbnN0IHJvd3MgPSB0aGlzLnByb3BlcnR5T3JkZXIubWFwKChuYW1lKSA9PiB7XG4gICAgICBjb25zdCByb3dJZCA9IHRoaXMucm93SWRzW25hbWVdO1xuICAgICAgaWYgKCF0aGlzLnJvd3Nbcm93SWRdKVxuICAgICAgICB0aGlzLnJvd3Nbcm93SWRdID0gdGhpcy5idWlsZFJvdyhuYW1lLCByb3dJZCwgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdKTtcbiAgICAgIHJldHVybiB0aGlzLnJvd3Nbcm93SWRdO1xuICAgIH0pO1xuXG4gICAgaWYgKCFyb3dzLmxlbmd0aCkge1xuICAgICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICAgIHRoaXMucm9vdC5hcHBlbmQodGhpcy5idWlsZEhlYWRlcigpKTtcbiAgICAgIGlmICh0aGlzLmRlc2lnbilcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRGVzaWduRW1wdHkoKTtcbiAgICAgIHJldHVybiB0aGlzLnJlbmRlckVtcHR5KCdObyBwcm9wZXJ0aWVzIGRlZmluZWQuJyk7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnByZXZpZXcpXG4gICAgICB0aGlzLnJvb3QuYXBwZW5kKHRoaXMuYnVpbGRIZWFkZXIoKSk7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZWKHJvd3MpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRW1wdHkodGV4dDogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhpcy5yb290LmFwcGVuZCh1aS5kaXZUZXh0KHRleHQpKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuZGVyRGVzaWduRW1wdHkoKTogdm9pZCB7XG4gICAgY29uc3QgaWNvbiA9IHVpLmljb25GQSgnY2hhcnQtbGluZScpO1xuICAgIGNvbnN0IGhlYWRpbmcgPSB1aS5oMygnTm8gcHJvcGVydGllcyB5ZXQnKTtcbiAgICBjb25zdCBtc2cgPSB1aS5wKCdTZWxlY3QgYSBkYXRhc2V0IHRvIGF1dG8tcG9wdWxhdGUgcHJvcGVydGllcyBmcm9tIGl0cyBudW1lcmljYWwgY29sdW1ucywgb3IgYWRkIHRoZW0gbWFudWFsbHkuJyk7XG4gICAgY29uc3QgYWRkQnRuID0gdWkubGluaygnKyBBZGQgUHJvcGVydHknLCAoKSA9PiB0aGlzLmFkZFByb3BlcnR5KCkpO1xuICAgIGNvbnN0IGNvbnRhaW5lciA9IHVpLmRpdlYoW2ljb24sIGhlYWRpbmcsIG1zZywgYWRkQnRuXSwgJ3N0YXRpc3RpY3MtbXBvLWVtcHR5LXN0YXRlJyk7XG4gICAgdGhpcy5yb290LmFwcGVuZChjb250YWluZXIpO1xuICB9XG5cbiAgYWRkUHJvcGVydHkoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICByZXR1cm47XG5cbiAgICBjb25zdCBuZXdOYW1lID0gYE5ld1Byb3BlcnR5JHtPYmplY3Qua2V5cyh0aGlzLnByb2ZpbGUucHJvcGVydGllcykubGVuZ3RoICsgMX1gO1xuICAgIGNvbnN0IG5ld1Jvd0lkID0gdGhpcy5uZXdSb3dJZCgpO1xuXG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSBjcmVhdGVEZWZhdWx0TnVtZXJpY2FsKCk7XG4gICAgdGhpcy5yb3dJZHNbbmV3TmFtZV0gPSBuZXdSb3dJZDtcbiAgICB0aGlzLnByb3BlcnR5T3JkZXIucHVzaChuZXdOYW1lKTtcblxuICAgIHRoaXMucm93cyA9IHt9O1xuICAgIHRoaXMucmVuZGVyKCk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkSGVhZGVyKCk6IEhUTUxFbGVtZW50IHtcbiAgICByZXR1cm4gdWkuZGl2SChbXG4gICAgICB1aS5kaXZUZXh0KCdQcm9wZXJ0eScsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItcHJvcGVydHknKSxcbiAgICAgIHVpLmRpdlRleHQoJ1dlaWdodCcsICdzdGF0aXN0aWNzLW1wby1oZWFkZXItd2VpZ2h0JyksXG4gICAgICB1aS5kaXZUZXh0KCdEZXNpcmFiaWxpdHknLCAnc3RhdGlzdGljcy1tcG8taGVhZGVyLWRlc2lyYWJpbGl0eScpLFxuICAgIF0sICdzdGF0aXN0aWNzLW1wby1oZWFkZXInKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3coXG4gICAgbmFtZTogc3RyaW5nLFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCByb3cgPSB1aS5kaXZIKFtdLCAnc3RhdGlzdGljcy1tcG8tcm93Jyk7XG4gICAgcm93LmRhdGFzZXQucm93SWQgPSByb3dJZDtcblxuICAgIGNvbnN0IGNvbCA9IHRoaXMucmVzb2x2ZUNvbHVtbihuYW1lKTtcbiAgICBpZiAoY29sKSB7XG4gICAgICBjb25zdCBjb3JyZWN0ZWQgPSB0aGlzLmNvcnJlY3RQcm9wZXJ0eVR5cGUocHJvcCwgY29sKTtcbiAgICAgIGlmIChjb3JyZWN0ZWQpIHtcbiAgICAgICAgcHJvcCA9IGNvcnJlY3RlZDtcbiAgICAgICAgdGhpcy5wcm9maWxlIS5wcm9wZXJ0aWVzW25hbWVdID0gcHJvcDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBlZGl0b3IgPSBEZXNpcmFiaWxpdHlFZGl0b3JGYWN0b3J5LmNyZWF0ZShwcm9wLCAzMDAsIDgwLCB0aGlzLmRlc2lnbik7XG4gICAgZWRpdG9yLnJvb3QuY2xhc3NMaXN0LmFkZCgnc3RhdGlzdGljcy1tcG8tZWRpdG9yLWZpbGwnKTtcbiAgICB0aGlzLnJvd1N1YnMuZ2V0KHJvd0lkKT8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJvd1N1YnMuc2V0KHJvd0lkLCBlZGl0b3Iub25DaGFuZ2VkLnN1YnNjcmliZSgoKSA9PiB0aGlzLmVtaXRDaGFuZ2UoKSkpO1xuXG4gICAgY29uc3QgcHJvcGVydHlDZWxsID0gdGhpcy5idWlsZFByb3BlcnR5Q2VsbChyb3dJZCwgbmFtZSk7XG4gICAgY29uc3Qgd2VpZ2h0Q2VsbCA9IHRoaXMuYnVpbGRXZWlnaHRDZWxsKHJvd0lkLCBwcm9wKTtcbiAgICBjb25zdCBjb2x1bW5DZWxsID0gdGhpcy5idWlsZENvbHVtblNlbGVjdG9yKHJvd0lkLCBuYW1lLCBlZGl0b3IpO1xuXG4gICAgY29uc3QgbW9kZUdlYXIgPSB0aGlzLmRlc2lnbiA/XG4gICAgICB0aGlzLmJ1aWxkTW9kZUdlYXIocm93SWQsIHByb3AsIGVkaXRvcikgOlxuICAgICAgbnVsbDtcblxuICAgIGNvbnN0IGNvbnRyb2xzID0gdGhpcy5kZXNpZ24gPyB0aGlzLmJ1aWxkUm93Q29udHJvbHMocm93SWQpIDogbnVsbDtcblxuICAgIHJvdy5hcHBlbmQoXG4gICAgICB1aS5kaXZWKFtwcm9wZXJ0eUNlbGwsIGNvbHVtbkNlbGxdLmZpbHRlcihCb29sZWFuKSwgJ3N0YXRpc3RpY3MtbXBvLXByb3BlcnR5LWNlbGwnKSxcbiAgICAgIHdlaWdodENlbGwsXG4gICAgICB1aS5kaXZIKFtlZGl0b3Iucm9vdCwgbW9kZUdlYXJdLmZpbHRlcihCb29sZWFuKSksXG4gICAgKTtcblxuICAgIGlmIChjb250cm9scylcbiAgICAgIHJvdy5hcHBlbmQoY29udHJvbHMpO1xuXG4gICAgcmV0dXJuIHJvdztcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRQcm9wZXJ0eUNlbGwocm93SWQ6IHN0cmluZywgbmFtZTogc3RyaW5nKTogSFRNTEVsZW1lbnQgfCBudWxsIHtcbiAgICBpZiAodGhpcy5kYXRhRnJhbWUpIHtcbiAgICAgIGNvbnN0IGVsID0gdWkuZGl2VGV4dChuYW1lKTtcbiAgICAgIHVpLnRvb2x0aXAuYmluZChlbCwgKCkgPT4gbmFtZSk7XG4gICAgICByZXR1cm4gZWw7XG4gICAgfVxuXG4gICAgbGV0IGN1cnJlbnROYW1lID0gbmFtZTtcblxuICAgIGNvbnN0IHByb3BOYW1lSW5wID0gdWkuaW5wdXQuc3RyaW5nKCcnLCB7dmFsdWU6IG5hbWUsIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgaWYgKCF2IHx8IHYgPT09IGN1cnJlbnROYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgICB0aGlzLnJlbmFtZVByb3BlcnR5KGN1cnJlbnROYW1lLCB2KTtcbiAgICAgIGN1cnJlbnROYW1lID0gdjtcbiAgICB9fSk7XG5cbiAgICB1aS50b29sdGlwLmJpbmQocHJvcE5hbWVJbnAuaW5wdXQsICgpID0+IGN1cnJlbnROYW1lKTtcbiAgICByZXR1cm4gcHJvcE5hbWVJbnAucm9vdDtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRXZWlnaHRDZWxsKFxuICAgIHJvd0lkOiBzdHJpbmcsXG4gICAgcHJvcDogUHJvcGVydHlEZXNpcmFiaWxpdHksXG4gICk6IEhUTUxFbGVtZW50IHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBjb25zdCBjaGlsZHJlbjogSFRNTEVsZW1lbnRbXSA9IFtdO1xuXG4gICAgY29uc3Qgd2VpZ2h0SW5wdXQgPSB1aS5pbnB1dC5mbG9hdCgnJywge3ZhbHVlOiBwcm9wLndlaWdodCwgbWluOiAwLCBtYXg6IDEsIGZvcm1hdDogJyMwLjAwMCcsXG4gICAgICBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgICAgaWYgKG5hbWUpXG4gICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4gcC53ZWlnaHQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCB2ID8/IDApKSk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHdlaWdodElucHV0LnJvb3QuY2xhc3NMaXN0LmFkZCgnc3RhdGlzdGljcy1tcG8td2VpZ2h0LWlucHV0Jyk7XG4gICAgY2hpbGRyZW4ucHVzaCh3ZWlnaHRJbnB1dC5yb290KTtcblxuICAgIGlmICh0aGlzLmRhdGFGcmFtZSkge1xuICAgICAgY29uc3QgbnVtQ29scyA9IHRoaXMuZ2V0TnVtZXJpY2FsQ29sdW1uTmFtZXMoKTtcbiAgICAgIGxldCBpc0NvbHVtbiA9ICEhcHJvcC53ZWlnaHRDb2x1bW4gJiYgbnVtQ29scy5pbmNsdWRlcyhwcm9wLndlaWdodENvbHVtbik7XG5cbiAgICAgIGNvbnN0IGNvbElucHV0ID0gdWkuaW5wdXQuY2hvaWNlKCcnLCB7aXRlbXM6IG51bUNvbHMsIG51bGxhYmxlOiB0cnVlLCB2YWx1ZTogcHJvcC53ZWlnaHRDb2x1bW4gPz8gJycsXG4gICAgICAgIG9uVmFsdWVDaGFuZ2VkOiAodikgPT4ge1xuICAgICAgICAgIGlmIChuYW1lKVxuICAgICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4gcC53ZWlnaHRDb2x1bW4gPSB2IHx8IHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgY29uc3Qgc3luY1RvZ2dsZSA9ICgpID0+IHtcbiAgICAgICAgd2VpZ2h0SW5wdXQucm9vdC5jbGFzc0xpc3QudG9nZ2xlKCdzdGF0aXN0aWNzLW1wby1oaWRkZW4nLCBpc0NvbHVtbik7XG4gICAgICAgIGNvbElucHV0LnJvb3QuY2xhc3NMaXN0LnRvZ2dsZSgnc3RhdGlzdGljcy1tcG8taGlkZGVuJywgIWlzQ29sdW1uKTtcbiAgICAgICAgdG9nZ2xlLmNsYXNzTGlzdC50b2dnbGUoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC10b2dnbGUtYWN0aXZlJywgaXNDb2x1bW4pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgdG9nZ2xlID0gdWkuaWNvbkZBKCdjb2x1bW5zJywgKCkgPT4ge1xuICAgICAgICBpc0NvbHVtbiA9ICFpc0NvbHVtbjtcbiAgICAgICAgc3luY1RvZ2dsZSgpO1xuICAgICAgICBpZiAoIWlzQ29sdW1uICYmIG5hbWUpXG4gICAgICAgICAgdGhpcy5tdXRhdGVQcm9wZXJ0eShuYW1lLCAocCkgPT4geyBkZWxldGUgcC53ZWlnaHRDb2x1bW47IH0pO1xuICAgICAgICBlbHNlIGlmIChpc0NvbHVtbiAmJiBuYW1lICYmIGNvbElucHV0LnZhbHVlKVxuICAgICAgICAgIHRoaXMubXV0YXRlUHJvcGVydHkobmFtZSwgKHApID0+IHAud2VpZ2h0Q29sdW1uID0gY29sSW5wdXQudmFsdWUgfHwgdW5kZWZpbmVkKTtcbiAgICAgIH0pO1xuICAgICAgdG9nZ2xlLmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC10b2dnbGUnKTtcbiAgICAgIHVpLnRvb2x0aXAuYmluZCh0b2dnbGUsICgpID0+IGlzQ29sdW1uID8gJ1N3aXRjaCB0byBtYW51YWwgd2VpZ2h0JyA6ICdVc2Ugd2VpZ2h0IGZyb20gY29sdW1uJyk7XG4gICAgICBzeW5jVG9nZ2xlKCk7XG5cbiAgICAgIGNoaWxkcmVuLnB1c2goY29sSW5wdXQucm9vdCwgdG9nZ2xlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdWkuZGl2SChjaGlsZHJlbiwgJ3N0YXRpc3RpY3MtbXBvLXdlaWdodC1jZWxsJyk7XG4gIH1cblxuICBwcml2YXRlIGJ1aWxkQ29sdW1uU2VsZWN0b3IoXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgZWRpdG9yOiBEZXNpcmFiaWxpdHlFZGl0b3IsXG4gICk6IEhUTUxFbGVtZW50IHwgbnVsbCB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBudWxsO1xuXG4gICAgY29uc3QgaXRlbXMgPSB0aGlzLmdldEVsaWdpYmxlQ29sdW1uTmFtZXMoKTtcbiAgICBjb25zdCBtYXRjaGVkID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdID8/IG51bGw7XG5cbiAgICBpZiAobWF0Y2hlZCkge1xuICAgICAgY29uc3QgY29sID0gdGhpcy5kYXRhRnJhbWUuY29sKG1hdGNoZWQpO1xuICAgICAgZWRpdG9yLnNldENvbHVtbj8uKGNvbCk7XG4gICAgfVxuXG4gICAgY29uc3QgaW5wdXQgPSB1aS5pbnB1dC5jaG9pY2UoJycsIHtpdGVtcywgbnVsbGFibGU6IHRydWUsIHZhbHVlOiBtYXRjaGVkID8/ICcnLCBvblZhbHVlQ2hhbmdlZDogKHYpID0+IHtcbiAgICAgIHRoaXMuY29sdW1uTWFwcGluZ1tuYW1lXSA9IHYgPz8gbnVsbDtcbiAgICAgIGNvbnN0IGNvbCA9IHYgPyB0aGlzLmRhdGFGcmFtZSEuY29sKHYpIDogbnVsbDtcbiAgICAgIGlmIChjb2wgJiYgdGhpcy5zd2l0Y2hQcm9wZXJ0eVR5cGUobmFtZSwgcm93SWQsIGNvbCkpXG4gICAgICAgIHJldHVybjtcbiAgICAgIGVkaXRvci5zZXRDb2x1bW4/Lihjb2wpO1xuICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gICAgfX0pO1xuICAgIHJldHVybiBpbnB1dC5yb290O1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRFbGlnaWJsZUNvbHVtbk5hbWVzKCk6IHN0cmluZ1tdIHtcbiAgICBpZiAoIXRoaXMuZGF0YUZyYW1lKVxuICAgICAgcmV0dXJuIFtdO1xuICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuZGF0YUZyYW1lLmNvbHVtbnMpXG4gICAgICAuZmlsdGVyKChjKSA9PiAhYy5pc0NhdGVnb3JpY2FsIHx8IGMuY2F0ZWdvcmllcy5sZW5ndGggPD0gTUFYX0NBVEVHT1JJQ0FMX0NBVEVHT1JJRVMpXG4gICAgICAubWFwKChjKSA9PiBjLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXROdW1lcmljYWxDb2x1bW5OYW1lcygpOiBzdHJpbmdbXSB7XG4gICAgaWYgKCF0aGlzLmRhdGFGcmFtZSlcbiAgICAgIHJldHVybiBbXTtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLmRhdGFGcmFtZS5jb2x1bW5zLm51bWVyaWNhbCkubWFwKChjKSA9PiBjLm5hbWUpO1xuICB9XG5cbiAgcHJpdmF0ZSByZXNvbHZlQ29sdW1uKG5hbWU6IHN0cmluZyk6IERHLkNvbHVtbiB8IG51bGwge1xuICAgIGlmICghdGhpcy5kYXRhRnJhbWUpXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBlbGlnaWJsZSA9IHRoaXMuZ2V0RWxpZ2libGVDb2x1bW5OYW1lcygpO1xuICAgIGNvbnN0IGNvbE5hbWUgPSB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPz8gZWxpZ2libGUuZmluZCgoYykgPT4gYy50b0xvd2VyQ2FzZSgpID09PSBuYW1lLnRvTG93ZXJDYXNlKCkpID8/IG51bGw7XG4gICAgaWYgKGNvbE5hbWUpXG4gICAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmFtZV0gPSBjb2xOYW1lO1xuICAgIHJldHVybiBjb2xOYW1lID8gdGhpcy5kYXRhRnJhbWUuY29sKGNvbE5hbWUpID8/IG51bGwgOiBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBjb3JyZWN0UHJvcGVydHlUeXBlKHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LCBjb2w6IERHLkNvbHVtbik6IFByb3BlcnR5RGVzaXJhYmlsaXR5IHwgbnVsbCB7XG4gICAgaWYgKGlzTnVtZXJpY2FsKHByb3ApICYmIGNvbC5pc0NhdGVnb3JpY2FsKSB7XG4gICAgICBjb25zdCBjYXRlZ29yaWVzID0gY29sLmNhdGVnb3JpZXMubWFwKChjOiBzdHJpbmcpID0+ICh7bmFtZTogYywgZGVzaXJhYmlsaXR5OiAxfSkpO1xuICAgICAgcmV0dXJuIGNyZWF0ZURlZmF1bHRDYXRlZ29yaWNhbChwcm9wLndlaWdodCwgY2F0ZWdvcmllcyk7XG4gICAgfVxuXG4gICAgaWYgKCFpc051bWVyaWNhbChwcm9wKSAmJiBjb2wuaXNOdW1lcmljYWwpXG4gICAgICByZXR1cm4gY3JlYXRlRGVmYXVsdE51bWVyaWNhbChwcm9wLndlaWdodCwgY29sLm1pbiwgY29sLm1heCk7XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHByaXZhdGUgc3dpdGNoUHJvcGVydHlUeXBlKFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIGNvbDogREcuQ29sdW1uLFxuICApOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIGNvbnN0IGNvcnJlY3RlZCA9IHRoaXMuY29ycmVjdFByb3BlcnR5VHlwZSh0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSwgY29sKTtcbiAgICBpZiAoIWNvcnJlY3RlZClcbiAgICAgIHJldHVybiBmYWxzZTtcblxuICAgIHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzW25hbWVdID0gY29ycmVjdGVkO1xuICAgIHRoaXMucmVidWlsZFJvdyhuYW1lLCByb3dJZCk7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBwcml2YXRlIHJlYnVpbGRSb3cobmFtZTogc3RyaW5nLCByb3dJZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3Qgb2xkUm93ID0gdGhpcy5yb3dzW3Jvd0lkXTtcbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmJ1aWxkUm93KG5hbWUsIHJvd0lkLCB0aGlzLnByb2ZpbGUhLnByb3BlcnRpZXNbbmFtZV0pO1xuICAgIHRoaXMucm93c1tyb3dJZF0gPSBuZXdSb3c7XG5cbiAgICBpZiAob2xkUm93Py5wYXJlbnROb2RlKVxuICAgICAgb2xkUm93LnJlcGxhY2VXaXRoKG5ld1Jvdyk7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRNb2RlR2VhcihcbiAgICByb3dJZDogc3RyaW5nLFxuICAgIHByb3A6IFByb3BlcnR5RGVzaXJhYmlsaXR5LFxuICAgIGVkaXRvcjogRGVzaXJhYmlsaXR5RWRpdG9yLFxuICApOiBIVE1MRWxlbWVudCB7XG4gICAgY29uc3QgZ2VhciA9IHVpLmljb25zLnNldHRpbmdzKCgpID0+IHtcbiAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldFByb3BlcnR5TmFtZUJ5Um93SWQocm93SWQpO1xuICAgICAgaWYgKCFuYW1lKVxuICAgICAgICByZXR1cm47XG4gICAgICBjb25zdCBjb2xOYW1lID0gdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdO1xuICAgICAgY29uc3QgY29sID0gY29sTmFtZSA/IHRoaXMuZGF0YUZyYW1lPy5jb2woY29sTmFtZSkgPz8gbnVsbCA6IG51bGw7XG4gICAgICB0aGlzLm9wZW5Nb2RlRGlhbG9nKG5hbWUsIHJvd0lkLCBwcm9wLCBlZGl0b3IsIGNvbCk7XG4gICAgfSk7XG5cbiAgICBnZWFyLmNsYXNzTGlzdC5hZGQoJ3N0YXRpc3RpY3MtbXBvLWdlYXInKTtcbiAgICByZXR1cm4gZ2VhcjtcbiAgfVxuXG4gIHByaXZhdGUgYnVpbGRSb3dDb250cm9scyhyb3dJZDogc3RyaW5nKTogSFRNTEVsZW1lbnQge1xuICAgIGNvbnN0IGFkZCA9IHVpLmljb25zLmFkZCgoKSA9PiB0aGlzLmluc2VydFJvd0FmdGVyUm93KHJvd0lkKSk7XG4gICAgY29uc3QgZGVsID0gdWkuaWNvbnMuZGVsZXRlKCgpID0+IHRoaXMuZGVsZXRlUm93KHJvd0lkKSk7XG4gICAgcmV0dXJuIHVpLmRpdkgoW2FkZCwgZGVsXSwgJ3N0YXRpc3RpY3MtbXBvLWNvbnRyb2wtYnV0dG9ucycpO1xuICB9XG5cbiAgcHJpdmF0ZSBvcGVuTW9kZURpYWxvZyhcbiAgICBuYW1lOiBzdHJpbmcsXG4gICAgcm93SWQ6IHN0cmluZyxcbiAgICBwcm9wOiBQcm9wZXJ0eURlc2lyYWJpbGl0eSxcbiAgICBlZGl0b3I6IERlc2lyYWJpbGl0eUVkaXRvcixcbiAgICBtYXBwZWRDb2w6IERHLkNvbHVtbiB8IG51bGwgPSBudWxsLFxuICApOiB2b2lkIHtcbiAgICBuZXcgRGVzaXJhYmlsaXR5TW9kZURpYWxvZyhcbiAgICAgIG5hbWUsXG4gICAgICBwcm9wLFxuICAgICAgKHBhdGNoKSA9PiB7XG4gICAgICAgIGNvbnN0IHAgPSB0aGlzLnByb2ZpbGU/LnByb3BlcnRpZXNbbmFtZV07XG4gICAgICAgIGlmIChwKVxuICAgICAgICAgIE9iamVjdC5hc3NpZ24ocCwgcGF0Y2gpO1xuICAgICAgICBlZGl0b3IucmVkcmF3QWxsKCk7XG4gICAgICB9LFxuICAgICAgKG5ld1Byb3ApID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLnByb2ZpbGUpXG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXSA9IG5ld1Byb3A7XG4gICAgICAgIHRoaXMucmVidWlsZFJvdyhuYW1lLCByb3dJZCk7XG4gICAgICB9LFxuICAgICAgbWFwcGVkQ29sLFxuICAgICkuc2hvdygpO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLnJvd0lkcylcbiAgICAgIC5maW5kKChbLCBpZF0pID0+IGlkID09PSByb3dJZCk/LlswXTtcbiAgfVxuXG4gIHByaXZhdGUgcmVuYW1lUHJvcGVydHkob2xkTmFtZTogc3RyaW5nLCBuZXdOYW1lOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucHJvZmlsZSB8fCB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IHJvd0lkID0gdGhpcy5yb3dJZHNbb2xkTmFtZV07XG4gICAgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbbmV3TmFtZV0gPSB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tvbGROYW1lXTtcbiAgICBkZWxldGUgdGhpcy5wcm9maWxlLnByb3BlcnRpZXNbb2xkTmFtZV07XG5cbiAgICB0aGlzLmNvbHVtbk1hcHBpbmdbbmV3TmFtZV0gPSB0aGlzLmNvbHVtbk1hcHBpbmdbb2xkTmFtZV0gPz8gbnVsbDtcbiAgICBkZWxldGUgdGhpcy5jb2x1bW5NYXBwaW5nW29sZE5hbWVdO1xuXG4gICAgY29uc3QgaWR4ID0gdGhpcy5wcm9wZXJ0eU9yZGVyLmluZGV4T2Yob2xkTmFtZSk7XG4gICAgaWYgKGlkeCA+PSAwKVxuICAgICAgdGhpcy5wcm9wZXJ0eU9yZGVyW2lkeF0gPSBuZXdOYW1lO1xuXG4gICAgZGVsZXRlIHRoaXMucm93SWRzW29sZE5hbWVdO1xuICAgIHRoaXMucm93SWRzW25ld05hbWVdID0gcm93SWQ7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZGVsZXRlUm93KHJvd0lkOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBjb25zdCBuYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBpZiAoIW5hbWUgfHwgIXRoaXMucHJvZmlsZSlcbiAgICAgIHJldHVybjtcblxuICAgIGRlbGV0ZSB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuYW1lXTtcbiAgICBkZWxldGUgdGhpcy5jb2x1bW5NYXBwaW5nW25hbWVdO1xuICAgIGRlbGV0ZSB0aGlzLnJvd0lkc1tuYW1lXTtcbiAgICB0aGlzLnJvd1N1YnMuZ2V0KHJvd0lkKT8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLnJvd1N1YnMuZGVsZXRlKHJvd0lkKTtcblxuICAgIGNvbnN0IGlkeCA9IHRoaXMucHJvcGVydHlPcmRlci5pbmRleE9mKG5hbWUpO1xuICAgIGlmIChpZHggPj0gMClcbiAgICAgIHRoaXMucHJvcGVydHlPcmRlci5zcGxpY2UoaWR4LCAxKTtcblxuICAgIGNvbnN0IHJvd0VsID0gdGhpcy5yb3dzW3Jvd0lkXTtcbiAgICBkZWxldGUgdGhpcy5yb3dzW3Jvd0lkXTtcblxuICAgIGlmICh0aGlzLnByb3BlcnR5T3JkZXIubGVuZ3RoID09PSAwKVxuICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICBlbHNlXG4gICAgICByb3dFbD8ucmVtb3ZlKCk7XG5cbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5zZXJ0Um93QWZ0ZXJSb3cocm93SWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmICghdGhpcy5wcm9maWxlKVxuICAgICAgcmV0dXJuO1xuXG4gICAgY29uc3QgYWZ0ZXJOYW1lID0gdGhpcy5nZXRQcm9wZXJ0eU5hbWVCeVJvd0lkKHJvd0lkKTtcbiAgICBpZiAoIWFmdGVyTmFtZSlcbiAgICAgIHJldHVybjtcblxuICAgIGNvbnN0IG5ld05hbWUgPSBgTmV3UHJvcGVydHkke09iamVjdC5rZXlzKHRoaXMucHJvZmlsZS5wcm9wZXJ0aWVzKS5sZW5ndGggKyAxfWA7XG4gICAgY29uc3QgbmV3Um93SWQgPSB0aGlzLm5ld1Jvd0lkKCk7XG5cbiAgICB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSA9IGNyZWF0ZURlZmF1bHROdW1lcmljYWwoKTtcblxuICAgIHRoaXMucm93SWRzW25ld05hbWVdID0gbmV3Um93SWQ7XG5cbiAgICBjb25zdCBpZHggPSB0aGlzLnByb3BlcnR5T3JkZXIuaW5kZXhPZihhZnRlck5hbWUpO1xuICAgIHRoaXMucHJvcGVydHlPcmRlci5zcGxpY2UoaWR4ICsgMSwgMCwgbmV3TmFtZSk7XG5cbiAgICBjb25zdCBuZXdSb3cgPSB0aGlzLmJ1aWxkUm93KG5ld05hbWUsIG5ld1Jvd0lkLCB0aGlzLnByb2ZpbGUucHJvcGVydGllc1tuZXdOYW1lXSk7XG4gICAgdGhpcy5yb3dzW25ld1Jvd0lkXSA9IG5ld1JvdztcblxuICAgIHRoaXMucm93c1tyb3dJZF0/LmFmdGVyKG5ld1Jvdyk7XG4gICAgdGhpcy5lbWl0Q2hhbmdlKCk7XG4gIH1cblxuICBwcml2YXRlIG11dGF0ZVByb3BlcnR5KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICB1cGRhdGVyOiAocDogUHJvcGVydHlEZXNpcmFiaWxpdHkpID0+IHZvaWQsXG4gICk6IHZvaWQge1xuICAgIGNvbnN0IHByb3AgPSB0aGlzLnByb2ZpbGU/LnByb3BlcnRpZXNbbmFtZV07XG4gICAgaWYgKCFwcm9wKVxuICAgICAgcmV0dXJuO1xuXG4gICAgdXBkYXRlcihwcm9wKTtcbiAgICB0aGlzLmVtaXRDaGFuZ2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdENoYW5nZSgpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlZC5uZXh0KCk7XG4gICAgZ3Jvay5ldmVudHMuZmlyZUN1c3RvbUV2ZW50KE1QT19TQ09SRV9DSEFOR0VEX0VWRU5ULCB7fSk7XG4gIH1cbn1cbiJdfQ==