@mediusinc/mng-commons-data-api 5.2.0-rc.0 → 5.2.0-rc.2
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/esm2022/index.mjs +3 -1
- package/esm2022/lib/models/api-version.model.mjs +2 -0
- package/esm2022/lib/models/schema.model.mjs +2 -0
- package/esm2022/tableview/index.mjs +5 -1
- package/esm2022/tableview/schema/columns-from-schema.mjs +173 -0
- package/esm2022/tableview/schema/enum-from-schema.mjs +23 -0
- package/esm2022/tableview/schema/fields-from-schema.mjs +470 -0
- package/esm2022/tableview/schema/internal/common-from-schema.mjs +14 -0
- package/fesm2022/mediusinc-mng-commons-data-api-tableview.mjs +676 -2
- package/fesm2022/mediusinc-mng-commons-data-api-tableview.mjs.map +1 -1
- package/fesm2022/mediusinc-mng-commons-data-api.mjs.map +1 -1
- package/index.d.ts +2 -0
- package/lib/models/api-version.model.d.ts +9 -0
- package/lib/models/schema.model.d.ts +31 -0
- package/openapi/config.yaml +0 -3
- package/openapi/custom/modelSchema.mustache +80 -44
- package/openapi/custom/version.mustache +2 -10
- package/package.json +2 -2
- package/tableview/index.d.ts +3 -0
- package/tableview/schema/columns-from-schema.d.ts +118 -0
- package/tableview/schema/enum-from-schema.d.ts +12 -0
- package/tableview/schema/fields-from-schema.d.ts +321 -0
- package/tableview/schema/internal/common-from-schema.d.ts +11 -0
- package/version-info.json +6 -6
- package/openapi/custom/schema.mustache +0 -18
|
@@ -0,0 +1,470 @@
|
|
|
1
|
+
import { CommonsInternalError, fromAngularDateFormatToPrime } from '@mediusinc/mng-commons/core';
|
|
2
|
+
import { EnumDescriptor } from '@mediusinc/mng-commons/model';
|
|
3
|
+
import { FieldInputDescriptor, TableviewDescriptorInst } from '@mediusinc/mng-commons/tableview/api';
|
|
4
|
+
import { enumModelFromSchema } from './enum-from-schema';
|
|
5
|
+
import { fromSchemaCurrencyOptsToCurrency, fromSchemaFilterNonArrayProperties } from './internal/common-from-schema';
|
|
6
|
+
/**
|
|
7
|
+
* <em>Experimental:</em> Builder for adding fields to editor.
|
|
8
|
+
*
|
|
9
|
+
* @experimental
|
|
10
|
+
*/
|
|
11
|
+
export class SchemaFieldsBuilder {
|
|
12
|
+
constructor(descriptor, schema, opts) {
|
|
13
|
+
this.descriptor = descriptor;
|
|
14
|
+
this.schema = schema;
|
|
15
|
+
this.opts = opts;
|
|
16
|
+
}
|
|
17
|
+
mergeFieldsInputOpts(property, opts) {
|
|
18
|
+
return {
|
|
19
|
+
...this.opts,
|
|
20
|
+
fieldType: opts?.fieldTypes?.[property] ?? this.opts?.fieldTypes?.[property],
|
|
21
|
+
enumModel: opts?.enumModels?.[property] ?? this.opts?.enumModels?.[property],
|
|
22
|
+
enumSchema: opts?.enumSchemas?.[property] ?? this.opts?.enumSchemas?.[property],
|
|
23
|
+
...opts
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
mergeFieldInputOpts(property, opts) {
|
|
27
|
+
return {
|
|
28
|
+
...this.opts,
|
|
29
|
+
fieldType: this.opts?.fieldTypes?.[property],
|
|
30
|
+
enumModel: this.opts?.enumModels?.[property],
|
|
31
|
+
enumSchema: this.opts?.enumSchemas?.[property],
|
|
32
|
+
...opts
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema}.
|
|
37
|
+
*
|
|
38
|
+
* @experimental
|
|
39
|
+
*
|
|
40
|
+
* @param {Property} property - The property to add the field for.
|
|
41
|
+
* @param {FieldInputFromSchemaOptsType<SchModel>} opts - Additional options.
|
|
42
|
+
*
|
|
43
|
+
* @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
|
|
44
|
+
*/
|
|
45
|
+
add(property, opts) {
|
|
46
|
+
return addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldInputOpts(property, opts));
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* <em>Experimental:</em> Adds all input fields for the non-array properties via {addFieldInputFromSchema}.
|
|
50
|
+
*
|
|
51
|
+
* @experimental
|
|
52
|
+
*
|
|
53
|
+
* @param {FieldsFromSchemaOptsType<SchModel>} opts - Additional options.
|
|
54
|
+
*
|
|
55
|
+
* @return {this} - The current instance of the builder.
|
|
56
|
+
*/
|
|
57
|
+
withAddAll(opts) {
|
|
58
|
+
this.addFields(undefined, opts);
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
withAdd(propOrOpts, ...properties) {
|
|
62
|
+
if (typeof propOrOpts === 'object') {
|
|
63
|
+
this.addFields(properties.length === 0 ? undefined : properties, propOrOpts);
|
|
64
|
+
}
|
|
65
|
+
else {
|
|
66
|
+
this.addFields(propOrOpts === undefined ? properties : [propOrOpts, ...properties]);
|
|
67
|
+
}
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
addFields(properties, opts) {
|
|
71
|
+
const addProperties = properties ?? fromSchemaFilterNonArrayProperties(this.schema.properties);
|
|
72
|
+
addProperties.forEach(property => {
|
|
73
|
+
addFieldInputFromSchema(this.descriptor, property, this.schema.properties[property], this.mergeFieldsInputOpts(property, opts));
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* <em>Experimental:</em> Adds a single input field via {addFieldInputFromSchema} where property schema is manually provided.
|
|
78
|
+
*
|
|
79
|
+
* @experimental
|
|
80
|
+
*
|
|
81
|
+
* @param {Property} property - The property to add the field for.
|
|
82
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
83
|
+
* @param {FieldInputFromSchemaOptsType<Model>} opts - Additional options.
|
|
84
|
+
*
|
|
85
|
+
* @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} The added field descriptor.
|
|
86
|
+
*/
|
|
87
|
+
addFromSchema(property, schemaProperty, opts) {
|
|
88
|
+
return addFieldInputFromSchema(this.descriptor, property, schemaProperty, this.mergeFieldInputOpts(property, opts));
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema}.
|
|
92
|
+
*
|
|
93
|
+
* @experimental
|
|
94
|
+
*
|
|
95
|
+
* @param {Property} property - The property to add the enum lookup field for.
|
|
96
|
+
* @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
|
|
97
|
+
*
|
|
98
|
+
* @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
|
|
99
|
+
*
|
|
100
|
+
* @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
|
|
101
|
+
*/
|
|
102
|
+
addEnum(property, enumOpt) {
|
|
103
|
+
if (!enumOpt) {
|
|
104
|
+
enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
|
|
105
|
+
}
|
|
106
|
+
if (!enumOpt) {
|
|
107
|
+
throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
|
|
108
|
+
}
|
|
109
|
+
return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, this.schema.properties[property]);
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* <em>Experimental:</em> Adds an enum lookup field via {addFieldEnumLookupFromSchema} where property schema is manually provided.
|
|
113
|
+
*
|
|
114
|
+
* @experimental
|
|
115
|
+
*
|
|
116
|
+
* @param {Property} property - The property to add the enum lookup field for.
|
|
117
|
+
* @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} [enumOpt] - The enum schema or the enum model descriptor. If non provided, builder opts will be checked.
|
|
118
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
119
|
+
*
|
|
120
|
+
* @returns {FieldLookupEnumDescriptor<Enum, Model, Parent>} - The added field descriptor.
|
|
121
|
+
*
|
|
122
|
+
* @throws {CommonsInternalError} - If no enum metadata is found for the property either from parameter or from builder's opts.
|
|
123
|
+
*/
|
|
124
|
+
addEnumFromSchema(property, enumOpt, schemaProperty) {
|
|
125
|
+
if (!enumOpt) {
|
|
126
|
+
enumOpt = this.opts?.enumModels?.[property] ?? this.opts?.enumSchemas?.[property];
|
|
127
|
+
}
|
|
128
|
+
if (!enumOpt) {
|
|
129
|
+
throw new CommonsInternalError(`Enum lookup field for property ${property} cannot be added because enum metadata was not provided.`);
|
|
130
|
+
}
|
|
131
|
+
return addFieldEnumLookupFromSchema(this.descriptor, property, enumOpt, schemaProperty);
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* <em>Experimental:</em> Adds a lookup field.
|
|
135
|
+
* {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
136
|
+
*
|
|
137
|
+
* @experimental
|
|
138
|
+
*
|
|
139
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
140
|
+
*
|
|
141
|
+
* @return The created lookup field.
|
|
142
|
+
*/
|
|
143
|
+
addLookup(property) {
|
|
144
|
+
const field = this.descriptor.addFieldLookup(property);
|
|
145
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
146
|
+
return field;
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
|
|
150
|
+
* {EditorDescriptorInt.addFieldLookup} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
151
|
+
*
|
|
152
|
+
* @experimental
|
|
153
|
+
*
|
|
154
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
155
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
156
|
+
*
|
|
157
|
+
* @return The created lookup field.
|
|
158
|
+
*/
|
|
159
|
+
addLookupFromSchema(property, schemaProperty) {
|
|
160
|
+
const field = this.descriptor.addFieldLookup(property);
|
|
161
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
162
|
+
return field;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* <em>Experimental:</em> Adds a lookup field.
|
|
166
|
+
* {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
167
|
+
*
|
|
168
|
+
* @experimental
|
|
169
|
+
*
|
|
170
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
171
|
+
* @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
|
|
172
|
+
* @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
|
|
173
|
+
*
|
|
174
|
+
* @return The created lookup field.
|
|
175
|
+
*/
|
|
176
|
+
addLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty) {
|
|
177
|
+
const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
|
|
178
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
179
|
+
return field;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
|
|
183
|
+
* {EditorDescriptorInt.addFieldLookupWithOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
184
|
+
*
|
|
185
|
+
* @experimental
|
|
186
|
+
*
|
|
187
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
188
|
+
* @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
|
|
189
|
+
* @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
|
|
190
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
191
|
+
*
|
|
192
|
+
* @return The created lookup field.
|
|
193
|
+
*/
|
|
194
|
+
addLookupWithOptionsValuePropertyFromSchema(property, type, lookupOptionsValueProperty, schemaProperty) {
|
|
195
|
+
const field = this.descriptor.addFieldLookupWithOptionsValueProperty(property, type, lookupOptionsValueProperty);
|
|
196
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
197
|
+
return field;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* <em>Experimental:</em> Adds a lookup field.
|
|
201
|
+
* {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
202
|
+
*
|
|
203
|
+
* @experimental
|
|
204
|
+
*
|
|
205
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
206
|
+
* @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
|
|
207
|
+
*
|
|
208
|
+
* @return The created lookup field.
|
|
209
|
+
*/
|
|
210
|
+
addLookupWithProvider(property, provider) {
|
|
211
|
+
const field = this.descriptor.addFieldLookupWithProvider(property, provider);
|
|
212
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
213
|
+
return field;
|
|
214
|
+
}
|
|
215
|
+
/**
|
|
216
|
+
* <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
|
|
217
|
+
* {EditorDescriptorInt.addFieldLookupWithProvider} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
218
|
+
*
|
|
219
|
+
* @experimental
|
|
220
|
+
*
|
|
221
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
222
|
+
* @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
|
|
223
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
224
|
+
*
|
|
225
|
+
* @return The created lookup field.
|
|
226
|
+
*/
|
|
227
|
+
addLookupWithProviderFromSchema(property, provider, schemaProperty) {
|
|
228
|
+
const field = this.descriptor.addFieldLookupWithProvider(property, provider);
|
|
229
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
230
|
+
return field;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* <em>Experimental:</em> Adds a lookup field.
|
|
234
|
+
* {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
235
|
+
*
|
|
236
|
+
* @experimental
|
|
237
|
+
*
|
|
238
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
239
|
+
* @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
|
|
240
|
+
* @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
|
|
241
|
+
* @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
|
|
242
|
+
*
|
|
243
|
+
* @return The created lookup field.
|
|
244
|
+
*/
|
|
245
|
+
addLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty) {
|
|
246
|
+
const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
|
|
247
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
248
|
+
return field;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* <em>Experimental:</em> Adds a lookup field where property schema is manually provided.
|
|
252
|
+
* {EditorDescriptorInt.addFieldLookupWithProviderAndOptionsValueProperty} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
253
|
+
*
|
|
254
|
+
* @experimental
|
|
255
|
+
*
|
|
256
|
+
* @param {Property} property - The property to create the lookup field for.
|
|
257
|
+
* @param {FieldLookupProviderType<LookupModel, Service>} provider - Lookup provider.
|
|
258
|
+
* @param {TypeDescriptor<LookupModel>} type - Type of lookup model.
|
|
259
|
+
* @param {LookupValueProperty} lookupOptionsValueProperty - Value property from lookup model.
|
|
260
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
261
|
+
*
|
|
262
|
+
* @return The created lookup field.
|
|
263
|
+
*/
|
|
264
|
+
addLookupWithProviderAndOptionsValuePropertyFromSchema(property, provider, type, lookupOptionsValueProperty, schemaProperty) {
|
|
265
|
+
const field = this.descriptor.addFieldLookupWithProviderAndOptionsValueProperty(property, provider, type, lookupOptionsValueProperty);
|
|
266
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
267
|
+
return field;
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* <em>Experimental:</em> Adds a one-to-many editor field.
|
|
271
|
+
* {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
272
|
+
*
|
|
273
|
+
* @experimental
|
|
274
|
+
*
|
|
275
|
+
* @param {Property} property - The property to create the many editor field for.
|
|
276
|
+
* @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
|
|
277
|
+
*
|
|
278
|
+
* @return The created one-to-many editor field.
|
|
279
|
+
*/
|
|
280
|
+
addManyEditor(property, tableviewDescriptor) {
|
|
281
|
+
const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
|
|
282
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
283
|
+
return field;
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* <em>Experimental:</em> Adds an one-to-many editor field where property schema is manually provided.
|
|
287
|
+
* {EditorDescriptorInt.addFieldManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
288
|
+
*
|
|
289
|
+
* @experimental
|
|
290
|
+
*
|
|
291
|
+
* @param {Property} property - The property to create the many editor field for.
|
|
292
|
+
* @param {TableviewDescriptorInst<FieldModel, any, any, Model>} tableviewDescriptor - Tableview descriptor.
|
|
293
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
294
|
+
*
|
|
295
|
+
* @return The created one-to-many editor field.
|
|
296
|
+
*/
|
|
297
|
+
addManyEditorFromSchema(property, tableviewDescriptor, schemaProperty) {
|
|
298
|
+
const field = this.descriptor.addFieldManyEditor(property, tableviewDescriptor);
|
|
299
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
300
|
+
return field;
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* <em>Experimental:</em> Adds a many-to-many editor field.
|
|
304
|
+
* {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
305
|
+
*
|
|
306
|
+
* @experimental
|
|
307
|
+
*
|
|
308
|
+
* @param {Property} property - The property to create the many editor field for.
|
|
309
|
+
* @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
|
|
310
|
+
* @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
|
|
311
|
+
* @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
|
|
312
|
+
*
|
|
313
|
+
* @return The created many-to-many editor field.
|
|
314
|
+
*/
|
|
315
|
+
addManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider) {
|
|
316
|
+
const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
|
|
317
|
+
setFieldBasicOptionsFromSchema(field, this.schema.properties[property]);
|
|
318
|
+
return field;
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* <em>Experimental:</em> Adds a many-to-many editor field where property schema is manually provided.
|
|
322
|
+
* {EditorDescriptorInt.addFieldManyToManyEditor} is used to create field and ${setFieldBasicOptionsFromSchema} to add basic field's options from schema.
|
|
323
|
+
*
|
|
324
|
+
* @experimental
|
|
325
|
+
*
|
|
326
|
+
* @param {Property} property - The property to create the many editor field for.
|
|
327
|
+
* @param {TableDescriptorInst<FieldModel>} mainTableDescriptor - Main table descriptor.
|
|
328
|
+
* @param {TableDescriptorInst<FieldModel>} lookupTableDescriptor - Lookup table descriptor.
|
|
329
|
+
* @param {ITableDataProvider<FieldModel, ServiceType>} lookupDataProvider - Lookup data provider.
|
|
330
|
+
* @param {SchemaProperty} schemaProperty - Manually provided schema property.
|
|
331
|
+
*
|
|
332
|
+
* @return The created many-to-many editor field.
|
|
333
|
+
*/
|
|
334
|
+
addManyToManyEditorFromSchema(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider, schemaProperty) {
|
|
335
|
+
const field = this.descriptor.addFieldManyToManyEditor(property, mainTableDescriptor, lookupTableDescriptor, lookupDataProvider);
|
|
336
|
+
setFieldBasicOptionsFromSchema(field, schemaProperty);
|
|
337
|
+
return field;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* <em>Experimental:</em> Creates builder for adding fields to descriptor based on provided model schema.
|
|
342
|
+
*
|
|
343
|
+
* @experimental
|
|
344
|
+
*
|
|
345
|
+
* @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model>} descriptor - Descriptor to add fields to.
|
|
346
|
+
* @param {SchemaModel<SchModel>} schema - The schema with metadata about properties for fields.
|
|
347
|
+
* @param {FieldsFromSchemaOptsType<SchModel>} [opts] - Additional options.
|
|
348
|
+
*
|
|
349
|
+
* @return {SchemaFieldsBuilder<Model, Parent, SchModel>} - The SchemaFieldsBuilder object containing the extracted fields.
|
|
350
|
+
*/
|
|
351
|
+
export function fieldsFromSchema(descriptor, schema, opts) {
|
|
352
|
+
return new SchemaFieldsBuilder(descriptor, schema, opts);
|
|
353
|
+
}
|
|
354
|
+
/**
|
|
355
|
+
* <em>Experimental:</em> Adds a field input to editor descriptor based on the given schema property and options.
|
|
356
|
+
*
|
|
357
|
+
* @experimental
|
|
358
|
+
*
|
|
359
|
+
* @param {TableviewDescriptorInst | EditorDescriptorInst} descriptor - Descriptor to add field to.
|
|
360
|
+
* @param {keyof Model} property - The property of the model.
|
|
361
|
+
* @param {SchemaProperty} propertySchema - The property's schema for the field.
|
|
362
|
+
* @param {FieldInputFromSchemaOptsType<Model>} [opts] - Additional options.
|
|
363
|
+
*
|
|
364
|
+
* @return {FieldInputDescriptor<Model, NonNullable<Model[Property]>, Model[Property], Parent>} - The generated field input descriptor.
|
|
365
|
+
*/
|
|
366
|
+
export function addFieldInputFromSchema(descriptor, property, propertySchema, opts) {
|
|
367
|
+
const propertyType = opts?.fieldType ?? propertySchema.type;
|
|
368
|
+
const field = new FieldInputDescriptor(descriptor instanceof TableviewDescriptorInst ? descriptor.detailsEditor : descriptor, property);
|
|
369
|
+
if (descriptor instanceof TableviewDescriptorInst) {
|
|
370
|
+
descriptor.detailsEditor.addFieldDescriptor(field);
|
|
371
|
+
descriptor.editEditor.addFieldDescriptor(field);
|
|
372
|
+
descriptor.addEditor.addFieldDescriptor(field);
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
descriptor.addFieldDescriptor(field);
|
|
376
|
+
}
|
|
377
|
+
// Handle different property types
|
|
378
|
+
switch (propertyType) {
|
|
379
|
+
case 'number':
|
|
380
|
+
if (opts?.currency) {
|
|
381
|
+
field.asCurrency(fromSchemaCurrencyOptsToCurrency(opts.currency));
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
field.asNumber();
|
|
385
|
+
}
|
|
386
|
+
break;
|
|
387
|
+
case 'currency':
|
|
388
|
+
field.asCurrency(opts?.currency ? fromSchemaCurrencyOptsToCurrency(opts.currency) : undefined);
|
|
389
|
+
break;
|
|
390
|
+
case 'boolean':
|
|
391
|
+
field.asSwitch();
|
|
392
|
+
break;
|
|
393
|
+
case 'text':
|
|
394
|
+
case 'string':
|
|
395
|
+
field.asText();
|
|
396
|
+
break;
|
|
397
|
+
case 'textarea':
|
|
398
|
+
field.asTextarea();
|
|
399
|
+
break;
|
|
400
|
+
case 'date':
|
|
401
|
+
field.asDatePicker({ format: opts?.dateFormat ? fromAngularDateFormatToPrime(opts.dateFormat) : undefined });
|
|
402
|
+
break;
|
|
403
|
+
case 'date-time':
|
|
404
|
+
field.asDatePicker({ showTime: true, format: opts?.dateTimeFormat ? fromAngularDateFormatToPrime(opts.dateTimeFormat) : undefined });
|
|
405
|
+
break;
|
|
406
|
+
case 'enum':
|
|
407
|
+
// eslint-disable-next-line no-case-declarations
|
|
408
|
+
const enumModel = opts?.enumSchema ? enumModelFromSchema(opts.enumSchema) : opts?.enumModel;
|
|
409
|
+
if (enumModel) {
|
|
410
|
+
field.asRadioFromEnum(enumModel);
|
|
411
|
+
}
|
|
412
|
+
else {
|
|
413
|
+
field.asText();
|
|
414
|
+
}
|
|
415
|
+
break;
|
|
416
|
+
case 'hidden':
|
|
417
|
+
field.asHidden();
|
|
418
|
+
break;
|
|
419
|
+
}
|
|
420
|
+
// Handle different property validations
|
|
421
|
+
if (propertyType === 'number' || propertyType === 'currency') {
|
|
422
|
+
field.withNumberValidation({
|
|
423
|
+
min: propertySchema.exclusiveMinimum && propertySchema.minimum != undefined ? propertySchema.minimum + (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.minimum,
|
|
424
|
+
max: propertySchema.exclusiveMaximum && propertySchema.maximum != undefined ? propertySchema.maximum - (propertySchema.isInteger ? 1 : 0.0001) : propertySchema.maximum
|
|
425
|
+
});
|
|
426
|
+
}
|
|
427
|
+
if (propertyType === 'string' || propertyType === 'textarea' || propertyType === 'text') {
|
|
428
|
+
field.withTextValidation({
|
|
429
|
+
minLength: propertySchema.minLength,
|
|
430
|
+
maxLength: propertySchema.maxLength,
|
|
431
|
+
pattern: propertySchema.pattern ? new RegExp(propertySchema.pattern.slice(1, -1)) : undefined
|
|
432
|
+
});
|
|
433
|
+
if (propertyType !== 'textarea' && propertySchema.isEmail) {
|
|
434
|
+
field.withTextValidationEmail();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
setFieldBasicOptionsFromSchema(field, propertySchema);
|
|
438
|
+
return field;
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* <em>Experimental:</em> Adds a field enum lookup to editor descriptor based on the given schema property and options.
|
|
442
|
+
*
|
|
443
|
+
* @experimental
|
|
444
|
+
*
|
|
445
|
+
* @param {TableviewDescriptorInst<Model, any, any, Parent> | EditorDescriptorInst<Model>} descriptor - Descriptor to add field to.
|
|
446
|
+
* @param {keyof Model} property - The property of the model.
|
|
447
|
+
* @param {SchemaEnum<Enum> | EnumDescriptor<Enum>} enumOpt - The enum schema or enum model descriptor.
|
|
448
|
+
* @param {SchemaProperty} propertySchema - The property's schema for the field.
|
|
449
|
+
*
|
|
450
|
+
* @returns {FieldLookupEnum<Enum>} - The field with enumeration values.
|
|
451
|
+
*/
|
|
452
|
+
export function addFieldEnumLookupFromSchema(descriptor, property, enumOpt, propertySchema) {
|
|
453
|
+
const enumDescriptor = enumOpt instanceof EnumDescriptor ? enumOpt : enumModelFromSchema(enumOpt);
|
|
454
|
+
const field = descriptor.addFieldLookupEnumUnsafe(property, enumDescriptor);
|
|
455
|
+
setFieldBasicOptionsFromSchema(field, propertySchema);
|
|
456
|
+
return field;
|
|
457
|
+
}
|
|
458
|
+
/**
|
|
459
|
+
* <em>Experimental:</em> Sets basic options for a field based on a given property schema.
|
|
460
|
+
*
|
|
461
|
+
* @param {AFieldDescriptor<FieldModel, EditorModel, FieldValue, ParentEditorModel>} field - The field to set options for.
|
|
462
|
+
* @param {SchemaProperty} propertySchema - The property schema to base the options on.
|
|
463
|
+
*/
|
|
464
|
+
export function setFieldBasicOptionsFromSchema(field, propertySchema) {
|
|
465
|
+
if (propertySchema.required)
|
|
466
|
+
field.withRequired();
|
|
467
|
+
if (propertySchema.isReadOnly)
|
|
468
|
+
field.withDisabled();
|
|
469
|
+
}
|
|
470
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGRzLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvZmllbGRzLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBZ0Isb0JBQW9CLEVBQWtCLDRCQUE0QixFQUFDLE1BQU0sNkJBQTZCLENBQUM7QUFDOUgsT0FBTyxFQUFDLGNBQWMsRUFBaUIsTUFBTSw4QkFBOEIsQ0FBQztBQUU1RSxPQUFPLEVBR0gsb0JBQW9CLEVBTXBCLHVCQUF1QixFQUMxQixNQUFNLHNDQUFzQyxDQUFDO0FBRTlDLE9BQU8sRUFBQyxtQkFBbUIsRUFBQyxNQUFNLG9CQUFvQixDQUFDO0FBQ3ZELE9BQU8sRUFBNkIsZ0NBQWdDLEVBQUUsa0NBQWtDLEVBQUMsTUFBTSwrQkFBK0IsQ0FBQztBQXFCL0k7Ozs7R0FJRztBQUNILE1BQU0sT0FBTyxtQkFBbUI7SUFDNUIsWUFDcUIsVUFBMEYsRUFDMUYsTUFBNkIsRUFDdEMsSUFBeUM7UUFGaEMsZUFBVSxHQUFWLFVBQVUsQ0FBZ0Y7UUFDMUYsV0FBTSxHQUFOLE1BQU0sQ0FBdUI7UUFDdEMsU0FBSSxHQUFKLElBQUksQ0FBcUM7SUFDbEQsQ0FBQztJQUVJLG9CQUFvQixDQUFDLFFBQXFCLEVBQUUsSUFBK0I7UUFDL0UsT0FBcUM7WUFDakMsR0FBRyxJQUFJLENBQUMsSUFBSTtZQUNaLFNBQVMsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUksSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUM7WUFDNUUsU0FBUyxFQUFFLElBQUksRUFBRSxVQUFVLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFLFVBQVUsRUFBRSxDQUFDLFFBQVEsQ0FBQztZQUM1RSxVQUFVLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRSxDQUFD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b2RlbCwgU2NoZW1hUHJvcGVydHl9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMtZGF0YS1hcGknO1xuaW1wb3J0IHtBcnJheUl0ZW1UeXBlLCBDb21tb25zSW50ZXJuYWxFcnJvciwgS2V5b2ZBbmRPZlR5cGUsIGZyb21Bbmd1bGFyRGF0ZUZvcm1hdFRvUHJpbWV9IGZyb20gJ0BtZWRpdXNpbmMvbW5nLWNvbW1vbnMvY29yZSc7XG5pbXBvcnQge0VudW1EZXNjcmlwdG9yLCBUeXBlRGVzY3JpcHRvcn0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy9tb2RlbCc7XG5pbXBvcnQge0lUYWJsZURhdGFQcm92aWRlciwgVGFibGVEZXNjcmlwdG9ySW5zdH0gZnJvbSAnQG1lZGl1c2luYy9tbmctY29tbW9ucy90YWJsZS9hcGknO1xuaW1wb3J0IHtcbiAgICBBRmllbGREZXNjcmlwdG9yLFxuICAgIEVkaXRvckRlc2NyaXB0b3JJbnN0LFxuICAgIEZpZWxkSW5wdXREZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwRGVzY3JpcHRvcixcbiAgICBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yLFxuICAgIEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlLFxuICAgIEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3IsXG4gICAgRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcixcbiAgICBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdFxufSBmcm9tICdAbWVkaXVzaW5jL21uZy1jb21tb25zL3RhYmxldmlldy9hcGknO1xuXG5pbXBvcnQge2VudW1Nb2RlbEZyb21TY2hlbWF9IGZyb20gJy4vZW51bS1mcm9tLXNjaGVtYSc7XG5pbXBvcnQge0Zyb21TY2hlbWFDdXJyZW5jeU9wdHNUeXBlLCBmcm9tU2NoZW1hQ3VycmVuY3lPcHRzVG9DdXJyZW5jeSwgZnJvbVNjaGVtYUZpbHRlck5vbkFycmF5UHJvcGVydGllc30gZnJvbSAnLi9pbnRlcm5hbC9jb21tb24tZnJvbS1zY2hlbWEnO1xuXG50eXBlIEZpZWxkSW5wdXRUeXBlID0gJ251bWJlcicgfCAnY3VycmVuY3knIHwgJ2Jvb2xlYW4nIHwgJ3N0cmluZycgfCAndGV4dCcgfCAndGV4dGFyZWEnIHwgJ2RhdGUnIHwgJ2RhdGUtdGltZScgfCAnZW51bScgfCAnaGlkZGVuJztcblxudHlwZSBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWwgPSBhbnk+ID0ge1xuICAgIGZpZWxkVHlwZXM/OiBQYXJ0aWFsPFJlY29yZDxrZXlvZiBNb2RlbCwgRmllbGRJbnB1dFR5cGU+PjtcbiAgICBlbnVtTW9kZWxzPzogUGFydGlhbDxSZWNvcmQ8a2V5b2YgTW9kZWwsIEVudW1EZXNjcmlwdG9yPGFueT4+PjtcbiAgICBlbnVtU2NoZW1hcz86IFBhcnRpYWw8UmVjb3JkPGtleW9mIE1vZGVsLCBTY2hlbWFFbnVtPGFueT4+PjtcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAgIGRhdGVUaW1lRm9ybWF0Pzogc3RyaW5nO1xufTtcblxudHlwZSBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlPE1vZGVsID0gYW55LCBFbnVtID0gYW55PiA9IHtcbiAgICBmaWVsZFR5cGU/OiBGaWVsZElucHV0VHlwZTtcbiAgICBlbnVtU2NoZW1hPzogU2NoZW1hRW51bTxFbnVtPjtcbiAgICBlbnVtTW9kZWw/OiBFbnVtRGVzY3JpcHRvcjxFbnVtPjtcbiAgICBjdXJyZW5jeT86IEZyb21TY2hlbWFDdXJyZW5jeU9wdHNUeXBlPE1vZGVsPjtcbiAgICBkYXRlRm9ybWF0Pzogc3RyaW5nO1xuICAgIGRhdGVUaW1lRm9ybWF0Pzogc3RyaW5nO1xufTtcblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEJ1aWxkZXIgZm9yIGFkZGluZyBmaWVsZHMgdG8gZWRpdG9yLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqL1xuZXhwb3J0IGNsYXNzIFNjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCA9IHVua25vd24sIFNjaE1vZGVsID0gTW9kZWw+IHtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSByZWFkb25seSBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD4sXG4gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc2NoZW1hOiBTY2hlbWFNb2RlbDxTY2hNb2RlbD4sXG4gICAgICAgIHByaXZhdGUgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD5cbiAgICApIHt9XG5cbiAgICBwcml2YXRlIG1lcmdlRmllbGRzSW5wdXRPcHRzKHByb3BlcnR5OiBrZXlvZiBNb2RlbCwgb3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZSkge1xuICAgICAgICByZXR1cm4gPEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU+e1xuICAgICAgICAgICAgLi4udGhpcy5vcHRzLFxuICAgICAgICAgICAgZmllbGRUeXBlOiBvcHRzPy5maWVsZFR5cGVzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZmllbGRUeXBlcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogb3B0cz8uZW51bU1vZGVscz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0sXG4gICAgICAgICAgICBlbnVtU2NoZW1hOiBvcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XSA/PyB0aGlzLm9wdHM/LmVudW1TY2hlbWFzPy5bcHJvcGVydHldLFxuICAgICAgICAgICAgLi4ub3B0c1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIHByaXZhdGUgbWVyZ2VGaWVsZElucHV0T3B0cyhwcm9wZXJ0eToga2V5b2YgTW9kZWwsIG9wdHM/OiBGaWVsZElucHV0RnJvbVNjaGVtYU9wdHNUeXBlKSB7XG4gICAgICAgIHJldHVybiA8RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZT57XG4gICAgICAgICAgICAuLi50aGlzLm9wdHMsXG4gICAgICAgICAgICBmaWVsZFR5cGU6IHRoaXMub3B0cz8uZmllbGRUeXBlcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIGVudW1Nb2RlbDogdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldLFxuICAgICAgICAgICAgZW51bVNjaGVtYTogdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XSxcbiAgICAgICAgICAgIC4uLm9wdHNcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBzaW5nbGUgaW5wdXQgZmllbGQgdmlhIHthZGRGaWVsZElucHV0RnJvbVNjaGVtYX0uXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZDxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgb3B0cz86IEZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4gICAgKTogRmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50PiB7XG4gICAgICAgIHJldHVybiBhZGRGaWVsZElucHV0RnJvbVNjaGVtYSh0aGlzLmRlc2NyaXB0b3IsIHByb3BlcnR5LCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSwgdGhpcy5tZXJnZUZpZWxkSW5wdXRPcHRzKHByb3BlcnR5LCBvcHRzKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFsbCBpbnB1dCBmaWVsZHMgZm9yIHRoZSBub24tYXJyYXkgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKlxuICAgICAqIEByZXR1cm4ge3RoaXN9IC0gVGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGJ1aWxkZXIuXG4gICAgICovXG4gICAgcHVibGljIHdpdGhBZGRBbGwob3B0cz86IEZpZWxkc0Zyb21TY2hlbWFPcHRzVHlwZTxTY2hNb2RlbD4pOiB0aGlzIHtcbiAgICAgICAgdGhpcy5hZGRGaWVsZHModW5kZWZpbmVkLCBvcHRzKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGlucHV0IGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gb3B0cyAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAgICAgKiBAcGFyYW0gey4uLlByb3BlcnR5W119IHByb3BlcnRpZXMgLSBQcm9wZXJ0aWVzIHRvIGFkZCBmaWVsZHMgZm9yLiBJZiBub24gcHJvdmlkZWQsIGFsbCBub24tYXJyYXkgcHJvcGVydGllcyBmcm9tIHNjaGVtYSB3aWxsIGJlIGFkZGVkLlxuICAgICAqXG4gICAgICogQHJldHVybiB7dGhpc30gLSBUaGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgYnVpbGRlci5cbiAgICAgKi9cbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ob3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiwgLi4ucHJvcGVydGllczogUHJvcGVydHlLZXlbXSk6IHRoaXM7XG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGZpZWxkcyBmb3IgcHJvcGVydGllcyB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7Li4uUHJvcGVydHlbXX0gcHJvcGVydGllcyAtIFByb3BlcnRpZXMgdG8gYWRkIGZpZWxkcyBmb3IuIElmIG5vbiBwcm92aWRlZCwgYWxsIG5vbi1hcnJheSBwcm9wZXJ0aWVzIGZyb20gc2NoZW1hIHdpbGwgYmUgYWRkZWQuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIHt0aGlzfSAtIFRoZSBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSBidWlsZGVyLlxuICAgICAqL1xuICAgIHB1YmxpYyB3aXRoQWRkPFByb3BlcnR5S2V5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+PiguLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcztcbiAgICBwdWJsaWMgd2l0aEFkZDxQcm9wZXJ0eUtleSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcE9yT3B0czogRmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPiB8IFByb3BlcnR5S2V5LCAuLi5wcm9wZXJ0aWVzOiBQcm9wZXJ0eUtleVtdKTogdGhpcyB7XG4gICAgICAgIGlmICh0eXBlb2YgcHJvcE9yT3B0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIHRoaXMuYWRkRmllbGRzKHByb3BlcnRpZXMubGVuZ3RoID09PSAwID8gdW5kZWZpbmVkIDogcHJvcGVydGllcywgcHJvcE9yT3B0cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEZpZWxkcyhwcm9wT3JPcHRzID09PSB1bmRlZmluZWQgPyBwcm9wZXJ0aWVzIDogW3Byb3BPck9wdHMsIC4uLnByb3BlcnRpZXNdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwcml2YXRlIGFkZEZpZWxkczxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPj4ocHJvcGVydGllcz86IFByb3BlcnR5W10sIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+KSB7XG4gICAgICAgIGNvbnN0IGFkZFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzID8/IGZyb21TY2hlbWFGaWx0ZXJOb25BcnJheVByb3BlcnRpZXModGhpcy5zY2hlbWEucHJvcGVydGllcyk7XG5cbiAgICAgICAgYWRkUHJvcGVydGllcy5mb3JFYWNoKHByb3BlcnR5ID0+IHtcbiAgICAgICAgICAgIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKFxuICAgICAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvcixcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eSBhcyB1bmtub3duIGFzIGtleW9mIE1vZGVsLFxuICAgICAgICAgICAgICAgIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldLFxuICAgICAgICAgICAgICAgIHRoaXMubWVyZ2VGaWVsZHNJbnB1dE9wdHMocHJvcGVydHkgYXMgdW5rbm93biBhcyBrZXlvZiBNb2RlbCwgb3B0cylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIHNpbmdsZSBpbnB1dCBmaWVsZCB2aWEge2FkZEZpZWxkSW5wdXRGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkSW5wdXRGcm9tU2NoZW1hT3B0c1R5cGU8TW9kZWw+fSBvcHRzIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICAgICAqXG4gICAgICogQHJldHVybiB7RmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50Pn0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICovXG4gICAgcHVibGljIGFkZEZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbD4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5LFxuICAgICAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbiAgICApOiBGaWVsZElucHV0RGVzY3JpcHRvcjxNb2RlbCwgTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+IHtcbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hKHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIHNjaGVtYVByb3BlcnR5LCB0aGlzLm1lcmdlRmllbGRJbnB1dE9wdHMocHJvcGVydHksIG9wdHMpKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGFkZCB0aGUgZW51bSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+fSBbZW51bU9wdF0gLSBUaGUgZW51bSBzY2hlbWEgb3IgdGhlIGVudW0gbW9kZWwgZGVzY3JpcHRvci4gSWYgbm9uIHByb3ZpZGVkLCBidWlsZGVyIG9wdHMgd2lsbCBiZSBjaGVja2VkLlxuICAgICAqXG4gICAgICogQHJldHVybnMge0ZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD59IC0gVGhlIGFkZGVkIGZpZWxkIGRlc2NyaXB0b3IuXG4gICAgICpcbiAgICAgKiBAdGhyb3dzIHtDb21tb25zSW50ZXJuYWxFcnJvcn0gLSBJZiBubyBlbnVtIG1ldGFkYXRhIGlzIGZvdW5kIGZvciB0aGUgcHJvcGVydHkgZWl0aGVyIGZyb20gcGFyYW1ldGVyIG9yIGZyb20gYnVpbGRlcidzIG9wdHMuXG4gICAgICovXG4gICAgcHVibGljIGFkZEVudW08UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIEVudW0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIGVudW1PcHQ/OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT5cbiAgICApOiBGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+IHtcbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICBlbnVtT3B0ID0gdGhpcy5vcHRzPy5lbnVtTW9kZWxzPy5bcHJvcGVydHldID8/IHRoaXMub3B0cz8uZW51bVNjaGVtYXM/Lltwcm9wZXJ0eV07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFlbnVtT3B0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgQ29tbW9uc0ludGVybmFsRXJyb3IoYEVudW0gbG9va3VwIGZpZWxkIGZvciBwcm9wZXJ0eSAke3Byb3BlcnR5IGFzIHN0cmluZ30gY2Fubm90IGJlIGFkZGVkIGJlY2F1c2UgZW51bSBtZXRhZGF0YSB3YXMgbm90IHByb3ZpZGVkLmApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBhZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hPE1vZGVsLCBQYXJlbnQsIEVudW0+KHRoaXMuZGVzY3JpcHRvciwgcHJvcGVydHksIGVudW1PcHQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYW4gZW51bSBsb29rdXAgZmllbGQgdmlhIHthZGRGaWVsZEVudW1Mb29rdXBGcm9tU2NoZW1hfSB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBhZGQgdGhlIGVudW0gbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYUVudW08RW51bT4gfCBFbnVtRGVzY3JpcHRvcjxFbnVtPn0gW2VudW1PcHRdIC0gVGhlIGVudW0gc2NoZW1hIG9yIHRoZSBlbnVtIG1vZGVsIGRlc2NyaXB0b3IuIElmIG5vbiBwcm92aWRlZCwgYnVpbGRlciBvcHRzIHdpbGwgYmUgY2hlY2tlZC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm5zIHtGaWVsZExvb2t1cEVudW1EZXNjcmlwdG9yPEVudW0sIE1vZGVsLCBQYXJlbnQ+fSAtIFRoZSBhZGRlZCBmaWVsZCBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHRocm93cyB7Q29tbW9uc0ludGVybmFsRXJyb3J9IC0gSWYgbm8gZW51bSBtZXRhZGF0YSBpcyBmb3VuZCBmb3IgdGhlIHByb3BlcnR5IGVpdGhlciBmcm9tIHBhcmFtZXRlciBvciBmcm9tIGJ1aWxkZXIncyBvcHRzLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRFbnVtRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLCBFbnVtPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBlbnVtT3B0OiBTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT4gfCB1bmRlZmluZWQsXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTG9va3VwRW51bURlc2NyaXB0b3I8RW51bSwgTW9kZWwsIFBhcmVudD4ge1xuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIGVudW1PcHQgPSB0aGlzLm9wdHM/LmVudW1Nb2RlbHM/Lltwcm9wZXJ0eV0gPz8gdGhpcy5vcHRzPy5lbnVtU2NoZW1hcz8uW3Byb3BlcnR5XTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWVudW1PcHQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb21tb25zSW50ZXJuYWxFcnJvcihgRW51bSBsb29rdXAgZmllbGQgZm9yIHByb3BlcnR5ICR7cHJvcGVydHkgYXMgc3RyaW5nfSBjYW5ub3QgYmUgYWRkZWQgYmVjYXVzZSBlbnVtIG1ldGFkYXRhIHdhcyBub3QgcHJvdmlkZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWEodGhpcy5kZXNjcmlwdG9yLCBwcm9wZXJ0eSwgZW51bU9wdCwgc2NoZW1hUHJvcGVydHkpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cDxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldPihwcm9wZXJ0eTogUHJvcGVydHkpIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXA8UHJvcGVydHksIExvb2t1cE1vZGVsPihwcm9wZXJ0eSk7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbG9va3VwIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cH0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7U2NoZW1hUHJvcGVydHl9IHNjaGVtYVByb3BlcnR5IC0gTWFudWFsbHkgcHJvdmlkZWQgc2NoZW1hIHByb3BlcnR5LlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cEZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCwgTG9va3VwTW9kZWwgPSBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApIHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXAocHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSB0eXBlIC0gVHlwZSBvZiBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFZhbHVlIHByb3BlcnR5IGZyb20gbG9va3VwIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgcHVibGljIGFkZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sXG4gICAgICAgIExvb2t1cE1vZGVsLFxuICAgICAgICBMb29rdXBWYWx1ZVByb3BlcnR5IGV4dGVuZHMgS2V5b2ZBbmRPZlR5cGU8TG9va3VwTW9kZWwsIE1vZGVsW1Byb3BlcnR5XT4sXG4gICAgICAgIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV1cbiAgICA+KHByb3BlcnR5OiBQcm9wZXJ0eSwgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LCBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eShwcm9wZXJ0eSwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHl9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPn0gdHlwZSAtIFR5cGUgb2YgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBWYWx1ZSBwcm9wZXJ0eSBmcm9tIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb29rdXBXaXRoT3B0aW9uc1ZhbHVlUHJvcGVydHlGcm9tU2NoZW1hPFxuICAgICAgICBQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLFxuICAgICAgICBMb29rdXBNb2RlbCxcbiAgICAgICAgTG9va3VwVmFsdWVQcm9wZXJ0eSBleHRlbmRzIEtleW9mQW5kT2ZUeXBlPExvb2t1cE1vZGVsLCBNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldXG4gICAgPihwcm9wZXJ0eTogUHJvcGVydHksIHR5cGU6IFR5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPiwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHk6IExvb2t1cFZhbHVlUHJvcGVydHksIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eSkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhPcHRpb25zVmFsdWVQcm9wZXJ0eShwcm9wZXJ0eSwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcn0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIHB1YmxpYyBhZGRMb29rdXBXaXRoUHJvdmlkZXI8UHJvcGVydHkgZXh0ZW5kcyBFeHRyYWN0PGtleW9mIE1vZGVsLCBrZXlvZiBTY2hNb2RlbD4sIFNlcnZpY2UsIExvb2t1cE1vZGVsID0gTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPlxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcihwcm9wZXJ0eSwgcHJvdmlkZXIpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJ9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbG9va3VwIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge0ZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPn0gcHJvdmlkZXIgLSBMb29rdXAgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIGxvb2t1cCBmaWVsZC5cbiAgICAgKi9cbiAgICBwdWJsaWMgYWRkTG9va3VwV2l0aFByb3ZpZGVyRnJvbVNjaGVtYTxQcm9wZXJ0eSBleHRlbmRzIGtleW9mIE1vZGVsLCBTZXJ2aWNlLCBMb29rdXBNb2RlbCA9IE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHByb3ZpZGVyOiBGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT4sXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICkge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlcihwcm9wZXJ0eSwgcHJvdmlkZXIpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5fSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIGxvb2t1cCBmaWVsZCBmb3IuXG4gICAgICogQHBhcmFtIHtGaWVsZExvb2t1cFByb3ZpZGVyVHlwZTxMb29rdXBNb2RlbCwgU2VydmljZT59IHByb3ZpZGVyIC0gTG9va3VwIHByb3ZpZGVyLlxuICAgICAqIEBwYXJhbSB7VHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+fSB0eXBlIC0gVHlwZSBvZiBsb29rdXAgbW9kZWwuXG4gICAgICogQHBhcmFtIHtMb29rdXBWYWx1ZVByb3BlcnR5fSBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eSAtIFZhbHVlIHByb3BlcnR5IGZyb20gbG9va3VwIG1vZGVsLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBsb29rdXAgZmllbGQuXG4gICAgICovXG4gICAgYWRkTG9va3VwV2l0aFByb3ZpZGVyQW5kT3B0aW9uc1ZhbHVlUHJvcGVydHk8XG4gICAgICAgIFByb3BlcnR5IGV4dGVuZHMgRXh0cmFjdDxrZXlvZiBNb2RlbCwga2V5b2YgU2NoTW9kZWw+LFxuICAgICAgICBTZXJ2aWNlLFxuICAgICAgICBMb29rdXBNb2RlbCxcbiAgICAgICAgTG9va3VwVmFsdWVQcm9wZXJ0eSBleHRlbmRzIEtleW9mQW5kT2ZUeXBlPExvb2t1cE1vZGVsLCBNb2RlbFtQcm9wZXJ0eV0+LFxuICAgICAgICBGaWVsZFZhbHVlID0gTW9kZWxbUHJvcGVydHldXG4gICAgPihcbiAgICAgICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgICAgICBwcm92aWRlcjogRmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+LFxuICAgICAgICB0eXBlOiBUeXBlRGVzY3JpcHRvcjxMb29rdXBNb2RlbD4sXG4gICAgICAgIGxvb2t1cE9wdGlvbnNWYWx1ZVByb3BlcnR5OiBMb29rdXBWYWx1ZVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCBwcm92aWRlciwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHRoaXMuc2NoZW1hLnByb3BlcnRpZXNbcHJvcGVydHldKTtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGFzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGxvb2t1cCBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRMb29rdXBXaXRoUHJvdmlkZXJBbmRPcHRpb25zVmFsdWVQcm9wZXJ0eX0gaXMgdXNlZCB0byBjcmVhdGUgZmllbGQgYW5kICR7c2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hfSB0byBhZGQgYmFzaWMgZmllbGQncyBvcHRpb25zIGZyb20gc2NoZW1hLlxuICAgICAqXG4gICAgICogQGV4cGVyaW1lbnRhbFxuICAgICAqXG4gICAgICogQHBhcmFtIHtQcm9wZXJ0eX0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgdG8gY3JlYXRlIHRoZSBsb29rdXAgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7RmllbGRMb29rdXBQcm92aWRlclR5cGU8TG9va3VwTW9kZWwsIFNlcnZpY2U+fSBwcm92aWRlciAtIExvb2t1cCBwcm92aWRlci5cbiAgICAgKiBAcGFyYW0ge1R5cGVEZXNjcmlwdG9yPExvb2t1cE1vZGVsPn0gdHlwZSAtIFR5cGUgb2YgbG9va3VwIG1vZGVsLlxuICAgICAqIEBwYXJhbSB7TG9va3VwVmFsdWVQcm9wZXJ0eX0gbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkgLSBWYWx1ZSBwcm9wZXJ0eSBmcm9tIGxvb2t1cCBtb2RlbC5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgbG9va3VwIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5RnJvbVNjaGVtYTxcbiAgICAgICAgUHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCxcbiAgICAgICAgU2VydmljZSxcbiAgICAgICAgTG9va3VwTW9kZWwsXG4gICAgICAgIExvb2t1cFZhbHVlUHJvcGVydHkgZXh0ZW5kcyBLZXlvZkFuZE9mVHlwZTxMb29rdXBNb2RlbCwgTW9kZWxbUHJvcGVydHldPixcbiAgICAgICAgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XVxuICAgID4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgcHJvdmlkZXI6IEZpZWxkTG9va3VwUHJvdmlkZXJUeXBlPExvb2t1cE1vZGVsLCBTZXJ2aWNlPixcbiAgICAgICAgdHlwZTogVHlwZURlc2NyaXB0b3I8TG9va3VwTW9kZWw+LFxuICAgICAgICBsb29rdXBPcHRpb25zVmFsdWVQcm9wZXJ0eTogTG9va3VwVmFsdWVQcm9wZXJ0eSxcbiAgICAgICAgc2NoZW1hUHJvcGVydHk6IFNjaGVtYVByb3BlcnR5XG4gICAgKTogRmllbGRMb29rdXBEZXNjcmlwdG9yPExvb2t1cE1vZGVsLCBNb2RlbCwgU2VydmljZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZExvb2t1cFdpdGhQcm92aWRlckFuZE9wdGlvbnNWYWx1ZVByb3BlcnR5KHByb3BlcnR5LCBwcm92aWRlciwgdHlwZSwgbG9va3VwT3B0aW9uc1ZhbHVlUHJvcGVydHkpO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkIGFzIEZpZWxkTG9va3VwRGVzY3JpcHRvcjxMb29rdXBNb2RlbCwgTW9kZWwsIFNlcnZpY2UsIEZpZWxkVmFsdWU+O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIG9uZS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIE1vZGVsPn0gdGFibGV2aWV3RGVzY3JpcHRvciAtIFRhYmxldmlldyBkZXNjcmlwdG9yLlxuICAgICAqXG4gICAgICogQHJldHVybiBUaGUgY3JlYXRlZCBvbmUtdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgRmllbGRNb2RlbCA9IEFycmF5SXRlbVR5cGU8TW9kZWxbUHJvcGVydHldPiwgRmllbGRWYWx1ZSA9IE1vZGVsW1Byb3BlcnR5XT4oXG4gICAgICAgIHByb3BlcnR5OiBQcm9wZXJ0eSxcbiAgICAgICAgdGFibGV2aWV3RGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbCwgYW55LCBhbnksIE1vZGVsPlxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgTW9kZWwsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgdGhpcy5zY2hlbWEucHJvcGVydGllc1twcm9wZXJ0eV0pO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGFuIG9uZS10by1tYW55IGVkaXRvciBmaWVsZCB3aGVyZSBwcm9wZXJ0eSBzY2hlbWEgaXMgbWFudWFsbHkgcHJvdmlkZWQuXG4gICAgICoge0VkaXRvckRlc2NyaXB0b3JJbnQuYWRkRmllbGRNYW55RWRpdG9yfSBpcyB1c2VkIHRvIGNyZWF0ZSBmaWVsZCBhbmQgJHtzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWF9IHRvIGFkZCBiYXNpYyBmaWVsZCdzIG9wdGlvbnMgZnJvbSBzY2hlbWEuXG4gICAgICpcbiAgICAgKiBAZXhwZXJpbWVudGFsXG4gICAgICpcbiAgICAgKiBAcGFyYW0ge1Byb3BlcnR5fSBwcm9wZXJ0eSAtIFRoZSBwcm9wZXJ0eSB0byBjcmVhdGUgdGhlIG1hbnkgZWRpdG9yIGZpZWxkIGZvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD59IHRhYmxldmlld0Rlc2NyaXB0b3IgLSBUYWJsZXZpZXcgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1NjaGVtYVByb3BlcnR5fSBzY2hlbWFQcm9wZXJ0eSAtIE1hbnVhbGx5IHByb3ZpZGVkIHNjaGVtYSBwcm9wZXJ0eS5cbiAgICAgKlxuICAgICAqIEByZXR1cm4gVGhlIGNyZWF0ZWQgb25lLXRvLW1hbnkgZWRpdG9yIGZpZWxkLlxuICAgICAqL1xuICAgIGFkZE1hbnlFZGl0b3JGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIHRhYmxldmlld0Rlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PEZpZWxkTW9kZWwsIGFueSwgYW55LCBNb2RlbD4sXG4gICAgICAgIHNjaGVtYVByb3BlcnR5OiBTY2hlbWFQcm9wZXJ0eVxuICAgICk6IEZpZWxkTWFueUVkaXRvckRlc2NyaXB0b3I8RmllbGRNb2RlbCwgTW9kZWwsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55RWRpdG9yPFByb3BlcnR5LCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihwcm9wZXJ0eSwgdGFibGV2aWV3RGVzY3JpcHRvcik7XG4gICAgICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgc2NoZW1hUHJvcGVydHkpO1xuICAgICAgICByZXR1cm4gZmllbGQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogPGVtPkV4cGVyaW1lbnRhbDo8L2VtPiBBZGRzIGEgbWFueS10by1tYW55IGVkaXRvciBmaWVsZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvcjxQcm9wZXJ0eSBleHRlbmRzIEV4dHJhY3Q8a2V5b2YgTW9kZWwsIGtleW9mIFNjaE1vZGVsPiwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+XG4gICAgKTogRmllbGRNYW55VG9NYW55RWRpdG9yRGVzY3JpcHRvcjxGaWVsZE1vZGVsLCBNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkVmFsdWU+IHtcbiAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLmRlc2NyaXB0b3IuYWRkRmllbGRNYW55VG9NYW55RWRpdG9yPFByb3BlcnR5LCBTZXJ2aWNlVHlwZSwgRmllbGRNb2RlbCwgRmllbGRWYWx1ZT4oXG4gICAgICAgICAgICBwcm9wZXJ0eSxcbiAgICAgICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBUYWJsZURlc2NyaXB0b3IsXG4gICAgICAgICAgICBsb29rdXBEYXRhUHJvdmlkZXJcbiAgICAgICAgKTtcbiAgICAgICAgc2V0RmllbGRCYXNpY09wdGlvbnNGcm9tU2NoZW1hKGZpZWxkLCB0aGlzLnNjaGVtYS5wcm9wZXJ0aWVzW3Byb3BlcnR5XSk7XG4gICAgICAgIHJldHVybiBmaWVsZDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBtYW55LXRvLW1hbnkgZWRpdG9yIGZpZWxkIHdoZXJlIHByb3BlcnR5IHNjaGVtYSBpcyBtYW51YWxseSBwcm92aWRlZC5cbiAgICAgKiB7RWRpdG9yRGVzY3JpcHRvckludC5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3J9IGlzIHVzZWQgdG8gY3JlYXRlIGZpZWxkIGFuZCAke3NldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYX0gdG8gYWRkIGJhc2ljIGZpZWxkJ3Mgb3B0aW9ucyBmcm9tIHNjaGVtYS5cbiAgICAgKlxuICAgICAqIEBleHBlcmltZW50YWxcbiAgICAgKlxuICAgICAqIEBwYXJhbSB7UHJvcGVydHl9IHByb3BlcnR5IC0gVGhlIHByb3BlcnR5IHRvIGNyZWF0ZSB0aGUgbWFueSBlZGl0b3IgZmllbGQgZm9yLlxuICAgICAqIEBwYXJhbSB7VGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPn0gbWFpblRhYmxlRGVzY3JpcHRvciAtIE1haW4gdGFibGUgZGVzY3JpcHRvci5cbiAgICAgKiBAcGFyYW0ge1RhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD59IGxvb2t1cFRhYmxlRGVzY3JpcHRvciAtIExvb2t1cCB0YWJsZSBkZXNjcmlwdG9yLlxuICAgICAqIEBwYXJhbSB7SVRhYmxlRGF0YVByb3ZpZGVyPEZpZWxkTW9kZWwsIFNlcnZpY2VUeXBlPn0gbG9va3VwRGF0YVByb3ZpZGVyIC0gTG9va3VwIGRhdGEgcHJvdmlkZXIuXG4gICAgICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gc2NoZW1hUHJvcGVydHkgLSBNYW51YWxseSBwcm92aWRlZCBzY2hlbWEgcHJvcGVydHkuXG4gICAgICpcbiAgICAgKiBAcmV0dXJuIFRoZSBjcmVhdGVkIG1hbnktdG8tbWFueSBlZGl0b3IgZmllbGQuXG4gICAgICovXG4gICAgYWRkTWFueVRvTWFueUVkaXRvckZyb21TY2hlbWE8UHJvcGVydHkgZXh0ZW5kcyBrZXlvZiBNb2RlbCwgU2VydmljZVR5cGUsIEZpZWxkTW9kZWwgPSBBcnJheUl0ZW1UeXBlPE1vZGVsW1Byb3BlcnR5XT4sIEZpZWxkVmFsdWUgPSBNb2RlbFtQcm9wZXJ0eV0+KFxuICAgICAgICBwcm9wZXJ0eTogUHJvcGVydHksXG4gICAgICAgIG1haW5UYWJsZURlc2NyaXB0b3I6IFRhYmxlRGVzY3JpcHRvckluc3Q8RmllbGRNb2RlbD4sXG4gICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcjogVGFibGVEZXNjcmlwdG9ySW5zdDxGaWVsZE1vZGVsPixcbiAgICAgICAgbG9va3VwRGF0YVByb3ZpZGVyOiBJVGFibGVEYXRhUHJvdmlkZXI8RmllbGRNb2RlbCwgU2VydmljZVR5cGU+LFxuICAgICAgICBzY2hlbWFQcm9wZXJ0eTogU2NoZW1hUHJvcGVydHlcbiAgICApOiBGaWVsZE1hbnlUb01hbnlFZGl0b3JEZXNjcmlwdG9yPEZpZWxkTW9kZWwsIE1vZGVsLCBTZXJ2aWNlVHlwZSwgRmllbGRWYWx1ZT4ge1xuICAgICAgICBjb25zdCBmaWVsZCA9IHRoaXMuZGVzY3JpcHRvci5hZGRGaWVsZE1hbnlUb01hbnlFZGl0b3I8UHJvcGVydHksIFNlcnZpY2VUeXBlLCBGaWVsZE1vZGVsLCBGaWVsZFZhbHVlPihcbiAgICAgICAgICAgIHByb3BlcnR5LFxuICAgICAgICAgICAgbWFpblRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cFRhYmxlRGVzY3JpcHRvcixcbiAgICAgICAgICAgIGxvb2t1cERhdGFQcm92aWRlclxuICAgICAgICApO1xuICAgICAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHNjaGVtYVByb3BlcnR5KTtcbiAgICAgICAgcmV0dXJuIGZpZWxkO1xuICAgIH1cbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IENyZWF0ZXMgYnVpbGRlciBmb3IgYWRkaW5nIGZpZWxkcyB0byBkZXNjcmlwdG9yIGJhc2VkIG9uIHByb3ZpZGVkIG1vZGVsIHNjaGVtYS5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKlxuICogQHBhcmFtIHtUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD59IGRlc2NyaXB0b3IgLSBEZXNjcmlwdG9yIHRvIGFkZCBmaWVsZHMgdG8uXG4gKiBAcGFyYW0ge1NjaGVtYU1vZGVsPFNjaE1vZGVsPn0gc2NoZW1hIC0gVGhlIHNjaGVtYSB3aXRoIG1ldGFkYXRhIGFib3V0IHByb3BlcnRpZXMgZm9yIGZpZWxkcy5cbiAqIEBwYXJhbSB7RmllbGRzRnJvbVNjaGVtYU9wdHNUeXBlPFNjaE1vZGVsPn0gW29wdHNdIC0gQWRkaXRpb25hbCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm4ge1NjaGVtYUZpZWxkc0J1aWxkZXI8TW9kZWwsIFBhcmVudCwgU2NoTW9kZWw+fSAtIFRoZSBTY2hlbWFGaWVsZHNCdWlsZGVyIG9iamVjdCBjb250YWluaW5nIHRoZSBleHRyYWN0ZWQgZmllbGRzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZmllbGRzRnJvbVNjaGVtYTxNb2RlbCwgUGFyZW50ID0gdW5rbm93biwgU2NoTW9kZWwgPSBNb2RlbD4oXG4gICAgZGVzY3JpcHRvcjogVGFibGV2aWV3RGVzY3JpcHRvckluc3Q8TW9kZWwsIGFueSwgYW55LCBQYXJlbnQ+IHwgRWRpdG9yRGVzY3JpcHRvckluc3Q8TW9kZWw+LFxuICAgIHNjaGVtYTogU2NoZW1hTW9kZWw8U2NoTW9kZWw+LFxuICAgIG9wdHM/OiBGaWVsZHNGcm9tU2NoZW1hT3B0c1R5cGU8U2NoTW9kZWw+XG4pOiBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIFNjaE1vZGVsPiB7XG4gICAgcmV0dXJuIG5ldyBTY2hlbWFGaWVsZHNCdWlsZGVyPE1vZGVsLCBQYXJlbnQsIFNjaE1vZGVsPihkZXNjcmlwdG9yLCBzY2hlbWEsIG9wdHMpO1xufVxuXG4vKipcbiAqIDxlbT5FeHBlcmltZW50YWw6PC9lbT4gQWRkcyBhIGZpZWxkIGlucHV0IHRvIGVkaXRvciBkZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBnaXZlbiBzY2hlbWEgcHJvcGVydHkgYW5kIG9wdGlvbnMuXG4gKlxuICogQGV4cGVyaW1lbnRhbFxuICpcbiAqIEBwYXJhbSB7VGFibGV2aWV3RGVzY3JpcHRvckluc3QgfCBFZGl0b3JEZXNjcmlwdG9ySW5zdH0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqIEBwYXJhbSB7RmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD59IFtvcHRzXSAtIEFkZGl0aW9uYWwgb3B0aW9ucy5cbiAqXG4gKiBAcmV0dXJuIHtGaWVsZElucHV0RGVzY3JpcHRvcjxNb2RlbCwgTm9uTnVsbGFibGU8TW9kZWxbUHJvcGVydHldPiwgTW9kZWxbUHJvcGVydHldLCBQYXJlbnQ+fSAtIFRoZSBnZW5lcmF0ZWQgZmllbGQgaW5wdXQgZGVzY3JpcHRvci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkSW5wdXRGcm9tU2NoZW1hPFByb3BlcnR5IGV4dGVuZHMga2V5b2YgTW9kZWwsIE1vZGVsLCBQYXJlbnQgPSB1bmtub3duPihcbiAgICBkZXNjcmlwdG9yOiBUYWJsZXZpZXdEZXNjcmlwdG9ySW5zdDxNb2RlbCwgYW55LCBhbnksIFBhcmVudD4gfCBFZGl0b3JEZXNjcmlwdG9ySW5zdDxNb2RlbD4sXG4gICAgcHJvcGVydHk6IFByb3BlcnR5LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eSxcbiAgICBvcHRzPzogRmllbGRJbnB1dEZyb21TY2hlbWFPcHRzVHlwZTxNb2RlbD5cbik6IEZpZWxkSW5wdXREZXNjcmlwdG9yPE1vZGVsLCBOb25OdWxsYWJsZTxNb2RlbFtQcm9wZXJ0eV0+LCBNb2RlbFtQcm9wZXJ0eV0sIFBhcmVudD4ge1xuICAgIGNvbnN0IHByb3BlcnR5VHlwZSA9IG9wdHM/LmZpZWxkVHlwZSA/PyBwcm9wZXJ0eVNjaGVtYS50eXBlO1xuXG4gICAgY29uc3QgZmllbGQgPSBuZXcgRmllbGRJbnB1dERlc2NyaXB0b3I8TW9kZWwsIE5vbk51bGxhYmxlPE1vZGVsW1Byb3BlcnR5XT4sIE1vZGVsW1Byb3BlcnR5XSwgUGFyZW50PihcbiAgICAgICAgZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0ID8gZGVzY3JpcHRvci5kZXRhaWxzRWRpdG9yIDogZGVzY3JpcHRvcixcbiAgICAgICAgcHJvcGVydHkgYXMgc3RyaW5nXG4gICAgKTtcbiAgICBpZiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0KSB7XG4gICAgICAgIGRlc2NyaXB0b3IuZGV0YWlsc0VkaXRvci5hZGRGaWVsZERlc2NyaXB0b3IoZmllbGQpO1xuICAgICAgICBkZXNjcmlwdG9yLmVkaXRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICAgICAgZGVzY3JpcHRvci5hZGRFZGl0b3IuYWRkRmllbGREZXNjcmlwdG9yKGZpZWxkKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkRGVzY3JpcHRvcihmaWVsZCk7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB0eXBlc1xuICAgIHN3aXRjaCAocHJvcGVydHlUeXBlIGFzIEZpZWxkSW5wdXRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgICAgICBpZiAob3B0cz8uY3VycmVuY3kpIHtcbiAgICAgICAgICAgICAgICBmaWVsZC5hc0N1cnJlbmN5KGZyb21TY2hlbWFDdXJyZW5jeU9wdHNUb0N1cnJlbmN5KG9wdHMuY3VycmVuY3kpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNOdW1iZXIoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdjdXJyZW5jeSc6XG4gICAgICAgICAgICBmaWVsZC5hc0N1cnJlbmN5KG9wdHM/LmN1cnJlbmN5ID8gZnJvbVNjaGVtYUN1cnJlbmN5T3B0c1RvQ3VycmVuY3kob3B0cy5jdXJyZW5jeSkgOiB1bmRlZmluZWQpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICAgICAgZmllbGQuYXNTd2l0Y2goKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICd0ZXh0JzpcbiAgICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHRhcmVhJzpcbiAgICAgICAgICAgIGZpZWxkLmFzVGV4dGFyZWEoKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlICdkYXRlJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7Zm9ybWF0OiBvcHRzPy5kYXRlRm9ybWF0ID8gZnJvbUFuZ3VsYXJEYXRlRm9ybWF0VG9QcmltZShvcHRzLmRhdGVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZGF0ZS10aW1lJzpcbiAgICAgICAgICAgIGZpZWxkLmFzRGF0ZVBpY2tlcih7c2hvd1RpbWU6IHRydWUsIGZvcm1hdDogb3B0cz8uZGF0ZVRpbWVGb3JtYXQgPyBmcm9tQW5ndWxhckRhdGVGb3JtYXRUb1ByaW1lKG9wdHMuZGF0ZVRpbWVGb3JtYXQpIDogdW5kZWZpbmVkfSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAnZW51bSc6XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tY2FzZS1kZWNsYXJhdGlvbnNcbiAgICAgICAgICAgIGNvbnN0IGVudW1Nb2RlbCA9IG9wdHM/LmVudW1TY2hlbWEgPyBlbnVtTW9kZWxGcm9tU2NoZW1hKG9wdHMuZW51bVNjaGVtYSkgOiBvcHRzPy5lbnVtTW9kZWw7XG4gICAgICAgICAgICBpZiAoZW51bU1vZGVsKSB7XG4gICAgICAgICAgICAgICAgZmllbGQuYXNSYWRpb0Zyb21FbnVtKGVudW1Nb2RlbCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpZWxkLmFzVGV4dCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ2hpZGRlbic6XG4gICAgICAgICAgICBmaWVsZC5hc0hpZGRlbigpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgLy8gSGFuZGxlIGRpZmZlcmVudCBwcm9wZXJ0eSB2YWxpZGF0aW9uc1xuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdudW1iZXInIHx8IHByb3BlcnR5VHlwZSA9PT0gJ2N1cnJlbmN5Jykge1xuICAgICAgICBmaWVsZC53aXRoTnVtYmVyVmFsaWRhdGlvbih7XG4gICAgICAgICAgICBtaW46IHByb3BlcnR5U2NoZW1hLmV4Y2x1c2l2ZU1pbmltdW0gJiYgcHJvcGVydHlTY2hlbWEubWluaW11bSAhPSB1bmRlZmluZWQgPyBwcm9wZXJ0eVNjaGVtYS5taW5pbXVtICsgKHByb3BlcnR5U2NoZW1hLmlzSW50ZWdlciA/IDEgOiAwLjAwMDEpIDogcHJvcGVydHlTY2hlbWEubWluaW11bSxcbiAgICAgICAgICAgIG1heDogcHJvcGVydHlTY2hlbWEuZXhjbHVzaXZlTWF4aW11bSAmJiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtICE9IHVuZGVmaW5lZCA/IHByb3BlcnR5U2NoZW1hLm1heGltdW0gLSAocHJvcGVydHlTY2hlbWEuaXNJbnRlZ2VyID8gMSA6IDAuMDAwMSkgOiBwcm9wZXJ0eVNjaGVtYS5tYXhpbXVtXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChwcm9wZXJ0eVR5cGUgPT09ICdzdHJpbmcnIHx8IHByb3BlcnR5VHlwZSA9PT0gJ3RleHRhcmVhJyB8fCBwcm9wZXJ0eVR5cGUgPT09ICd0ZXh0Jykge1xuICAgICAgICBmaWVsZC53aXRoVGV4dFZhbGlkYXRpb24oe1xuICAgICAgICAgICAgbWluTGVuZ3RoOiBwcm9wZXJ0eVNjaGVtYS5taW5MZW5ndGgsXG4gICAgICAgICAgICBtYXhMZW5ndGg6IHByb3BlcnR5U2NoZW1hLm1heExlbmd0aCxcbiAgICAgICAgICAgIHBhdHRlcm46IHByb3BlcnR5U2NoZW1hLnBhdHRlcm4gPyBuZXcgUmVnRXhwKHByb3BlcnR5U2NoZW1hLnBhdHRlcm4uc2xpY2UoMSwgLTEpKSA6IHVuZGVmaW5lZFxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAocHJvcGVydHlUeXBlICE9PSAndGV4dGFyZWEnICYmIHByb3BlcnR5U2NoZW1hLmlzRW1haWwpIHtcbiAgICAgICAgICAgIGZpZWxkLndpdGhUZXh0VmFsaWRhdGlvbkVtYWlsKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWEoZmllbGQsIHByb3BlcnR5U2NoZW1hKTtcblxuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IEFkZHMgYSBmaWVsZCBlbnVtIGxvb2t1cCB0byBlZGl0b3IgZGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgZ2l2ZW4gc2NoZW1hIHByb3BlcnR5IGFuZCBvcHRpb25zLlxuICpcbiAqIEBleHBlcmltZW50YWxcbiAqXG4gKiBAcGFyYW0ge1RhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50PiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsPn0gZGVzY3JpcHRvciAtIERlc2NyaXB0b3IgdG8gYWRkIGZpZWxkIHRvLlxuICogQHBhcmFtIHtrZXlvZiBNb2RlbH0gcHJvcGVydHkgLSBUaGUgcHJvcGVydHkgb2YgdGhlIG1vZGVsLlxuICogQHBhcmFtIHtTY2hlbWFFbnVtPEVudW0+IHwgRW51bURlc2NyaXB0b3I8RW51bT59IGVudW1PcHQgLSBUaGUgZW51bSBzY2hlbWEgb3IgZW51bSBtb2RlbCBkZXNjcmlwdG9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkncyBzY2hlbWEgZm9yIHRoZSBmaWVsZC5cbiAqXG4gKiBAcmV0dXJucyB7RmllbGRMb29rdXBFbnVtPEVudW0+fSAtIFRoZSBmaWVsZCB3aXRoIGVudW1lcmF0aW9uIHZhbHVlcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGFkZEZpZWxkRW51bUxvb2t1cEZyb21TY2hlbWE8TW9kZWwsIFBhcmVudCA9IHVua25vd24sIEVudW0gPSBhbnk+KFxuICAgIGRlc2NyaXB0b3I6IFRhYmxldmlld0Rlc2NyaXB0b3JJbnN0PE1vZGVsLCBhbnksIGFueSwgUGFyZW50PiB8IEVkaXRvckRlc2NyaXB0b3JJbnN0PE1vZGVsPixcbiAgICBwcm9wZXJ0eToga2V5b2YgTW9kZWwsXG4gICAgZW51bU9wdDogU2NoZW1hRW51bTxFbnVtPiB8IEVudW1EZXNjcmlwdG9yPEVudW0+LFxuICAgIHByb3BlcnR5U2NoZW1hOiBTY2hlbWFQcm9wZXJ0eVxuKSB7XG4gICAgY29uc3QgZW51bURlc2NyaXB0b3IgPSBlbnVtT3B0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgPyBlbnVtT3B0IDogZW51bU1vZGVsRnJvbVNjaGVtYShlbnVtT3B0KTtcbiAgICBjb25zdCBmaWVsZCA9IGRlc2NyaXB0b3IuYWRkRmllbGRMb29rdXBFbnVtVW5zYWZlPEVudW0+KHByb3BlcnR5IGFzIHN0cmluZywgZW51bURlc2NyaXB0b3IpO1xuICAgIHNldEZpZWxkQmFzaWNPcHRpb25zRnJvbVNjaGVtYShmaWVsZCwgcHJvcGVydHlTY2hlbWEpO1xuICAgIHJldHVybiBmaWVsZDtcbn1cblxuLyoqXG4gKiA8ZW0+RXhwZXJpbWVudGFsOjwvZW0+IFNldHMgYmFzaWMgb3B0aW9ucyBmb3IgYSBmaWVsZCBiYXNlZCBvbiBhIGdpdmVuIHByb3BlcnR5IHNjaGVtYS5cbiAqXG4gKiBAcGFyYW0ge0FGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPn0gZmllbGQgLSBUaGUgZmllbGQgdG8gc2V0IG9wdGlvbnMgZm9yLlxuICogQHBhcmFtIHtTY2hlbWFQcm9wZXJ0eX0gcHJvcGVydHlTY2hlbWEgLSBUaGUgcHJvcGVydHkgc2NoZW1hIHRvIGJhc2UgdGhlIG9wdGlvbnMgb24uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBzZXRGaWVsZEJhc2ljT3B0aW9uc0Zyb21TY2hlbWE8RmllbGRNb2RlbCA9IGFueSwgRWRpdG9yTW9kZWwgPSBhbnksIEZpZWxkVmFsdWUgPSBGaWVsZE1vZGVsLCBQYXJlbnRFZGl0b3JNb2RlbCA9IHVuZGVmaW5lZD4oXG4gICAgZmllbGQ6IEFGaWVsZERlc2NyaXB0b3I8RmllbGRNb2RlbCwgRWRpdG9yTW9kZWwsIEZpZWxkVmFsdWUsIFBhcmVudEVkaXRvck1vZGVsPixcbiAgICBwcm9wZXJ0eVNjaGVtYTogU2NoZW1hUHJvcGVydHlcbik6IHZvaWQge1xuICAgIGlmIChwcm9wZXJ0eVNjaGVtYS5yZXF1aXJlZCkgZmllbGQud2l0aFJlcXVpcmVkKCk7XG4gICAgaWYgKHByb3BlcnR5U2NoZW1hLmlzUmVhZE9ubHkpIGZpZWxkLndpdGhEaXNhYmxlZCgpO1xufVxuIl19
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export function fromSchemaCurrencyOptsToCurrency(opts) {
|
|
2
|
+
return {
|
|
3
|
+
currency: typeof opts === 'string' ? opts : opts.currency,
|
|
4
|
+
currencyDisplay: typeof opts === 'object' ? opts.currencyDisplay : undefined,
|
|
5
|
+
currencyProperty: typeof opts === 'object' ? opts.currencyProperty : undefined
|
|
6
|
+
};
|
|
7
|
+
}
|
|
8
|
+
export function fromSchemaFilterNonArrayProperties(propertySchemas) {
|
|
9
|
+
return Object.keys(propertySchemas).filter(key => {
|
|
10
|
+
const propertySchema = propertySchemas[key];
|
|
11
|
+
return ['number', 'string', 'boolean', 'date', 'date-time', 'enum', 'object'].includes(propertySchema.type);
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLWZyb20tc2NoZW1hLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vdGFibGV2aWV3L3NyYy9zY2hlbWEvaW50ZXJuYWwvY29tbW9uLWZyb20tc2NoZW1hLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE1BQU0sVUFBVSxnQ0FBZ0MsQ0FBUSxJQUF1QztJQUMzRixPQUFPO1FBQ0gsUUFBUSxFQUFFLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUTtRQUN6RCxlQUFlLEVBQUUsT0FBTyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxTQUFTO1FBQzVFLGdCQUFnQixFQUFFLE9BQU8sSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxTQUFTO0tBQ2pGLENBQUM7QUFDTixDQUFDO0FBRUQsTUFBTSxVQUFVLGtDQUFrQyxDQUFRLGVBQXlDO0lBQy9GLE9BQVEsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQXFCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ2xFLE1BQU0sY0FBYyxHQUFHLGVBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM1QyxPQUFPLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUMsUUFBUSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoSCxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBGcm9tU2NoZW1hQ3VycmVuY3lPcHRzVHlwZTxNb2RlbD4gPVxuICAgIHwgc3RyaW5nXG4gICAgfCB7XG4gICAgICAgICAgY3VycmVuY3lQcm9wZXJ0eT86IGtleW9mIE1vZGVsO1xuICAgICAgICAgIGN1cnJlbmN5Pzogc3RyaW5nO1xuICAgICAgICAgIGN1cnJlbmN5RGlzcGxheT86ICdzeW1ib2wnIHwgJ2NvZGUnIHwgJ25hbWUnO1xuICAgICAgfTtcblxuZXhwb3J0IGZ1bmN0aW9uIGZyb21TY2hlbWFDdXJyZW5jeU9wdHNUb0N1cnJlbmN5PE1vZGVsPihvcHRzOiBGcm9tU2NoZW1hQ3VycmVuY3lPcHRzVHlwZTxNb2RlbD4pIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBjdXJyZW5jeTogdHlwZW9mIG9wdHMgPT09ICdzdHJpbmcnID8gb3B0cyA6IG9wdHMuY3VycmVuY3ksXG4gICAgICAgIGN1cnJlbmN5RGlzcGxheTogdHlwZW9mIG9wdHMgPT09ICdvYmplY3QnID8gb3B0cy5jdXJyZW5jeURpc3BsYXkgOiB1bmRlZmluZWQsXG4gICAgICAgIGN1cnJlbmN5UHJvcGVydHk6IHR5cGVvZiBvcHRzID09PSAnb2JqZWN0JyA/IG9wdHMuY3VycmVuY3lQcm9wZXJ0eSA6IHVuZGVmaW5lZFxuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmcm9tU2NoZW1hRmlsdGVyTm9uQXJyYXlQcm9wZXJ0aWVzPE1vZGVsPihwcm9wZXJ0eVNjaGVtYXM6IFJlY29yZDxrZXlvZiBNb2RlbCwgYW55Pik6IChrZXlvZiBNb2RlbClbXSB7XG4gICAgcmV0dXJuIChPYmplY3Qua2V5cyhwcm9wZXJ0eVNjaGVtYXMpIGFzIChrZXlvZiBNb2RlbClbXSkuZmlsdGVyKGtleSA9PiB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5U2NoZW1hID0gcHJvcGVydHlTY2hlbWFzW2tleV07XG4gICAgICAgIHJldHVybiBbJ251bWJlcicsICdzdHJpbmcnLCAnYm9vbGVhbicsICdkYXRlJywgJ2RhdGUtdGltZScsICdlbnVtJywgJ29iamVjdCddLmluY2x1ZGVzKHByb3BlcnR5U2NoZW1hLnR5cGUpO1xuICAgIH0pO1xufVxuIl19
|