@researchdatabox/sails-ng-common 0.0.1-beta.9604 → 0.0.1-beta.9873
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/dist/src/config/component/publish-data-location-refresh.model.d.ts +1 -0
- package/dist/src/config/component/publish-data-location-refresh.model.js +2 -1
- package/dist/src/config/component/publish-data-location-refresh.outline.d.ts +5 -0
- package/dist/src/config/component/publish-data-location-selector.model.d.ts +6 -2
- package/dist/src/config/component/publish-data-location-selector.model.js +7 -3
- package/dist/src/config/component/publish-data-location-selector.outline.d.ts +8 -3
- package/dist/src/config/component/publish-data-location-selector.outline.js +1 -1
- package/dist/src/config/component/question-tree.helper.d.ts +21 -24
- package/dist/src/config/component/question-tree.helper.js +125 -132
- package/dist/src/config/component/question-tree.outline.d.ts +6 -3
- package/dist/src/config/component/question-tree.outline.js +1 -1
- package/dist/src/config/component/save-button.model.d.ts +4 -0
- package/dist/src/config/component/save-button.model.js +5 -1
- package/dist/src/config/component/save-button.outline.d.ts +17 -0
- package/dist/src/config/form-component.outline.d.ts +1 -1
- package/dist/src/config/form-config.outline.d.ts +2 -4
- package/dist/src/config/form-override.model.d.ts +2 -1
- package/dist/src/config/form-override.model.js +7 -3
- package/dist/src/config/names/naming-helpers.d.ts +34 -0
- package/dist/src/config/names/naming-helpers.js +78 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +2 -1
- package/dist/src/report.model.d.ts +43 -0
- package/dist/src/validation/form.model.d.ts +41 -4
- package/dist/src/validation/form.model.js +1 -1
- package/dist/src/validation/helpers.d.ts +3 -1
- package/dist/src/validation/helpers.js +38 -2
- package/dist/src/validation/validators-support.d.ts +2 -2
- package/dist/src/validation/validators-support.js +35 -6
- package/dist/src/validation/validators.js +103 -167
- package/package.json +9 -9
|
@@ -13,6 +13,49 @@ export declare class ReportDto {
|
|
|
13
13
|
columns: RecordPropViewMetaDto[];
|
|
14
14
|
constructor();
|
|
15
15
|
}
|
|
16
|
+
export interface ReportConfigFilterDatabaseDto {
|
|
17
|
+
fromProperty: string;
|
|
18
|
+
toProperty: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ReportConfigFilterDto {
|
|
21
|
+
type: string;
|
|
22
|
+
paramName: string;
|
|
23
|
+
message: string;
|
|
24
|
+
property: string;
|
|
25
|
+
database?: ReportConfigFilterDatabaseDto | null;
|
|
26
|
+
}
|
|
27
|
+
export interface ReportConfigColumnDto {
|
|
28
|
+
label: string;
|
|
29
|
+
property: string;
|
|
30
|
+
hide?: boolean;
|
|
31
|
+
exportTemplate?: string;
|
|
32
|
+
template?: string;
|
|
33
|
+
multivalue?: boolean;
|
|
34
|
+
}
|
|
35
|
+
export interface ReportConfigDatabaseQueryDto {
|
|
36
|
+
queryName: string;
|
|
37
|
+
}
|
|
38
|
+
export interface ReportConfigSolrQueryDto {
|
|
39
|
+
baseQuery: string;
|
|
40
|
+
searchCore: string;
|
|
41
|
+
}
|
|
42
|
+
export interface ReportConfigDto {
|
|
43
|
+
name: string;
|
|
44
|
+
title: string;
|
|
45
|
+
reportSource: 'database' | 'solr';
|
|
46
|
+
databaseQuery: ReportConfigDatabaseQueryDto | null;
|
|
47
|
+
solrQuery: ReportConfigSolrQueryDto | null;
|
|
48
|
+
filter: ReportConfigFilterDto[];
|
|
49
|
+
columns: ReportConfigColumnDto[];
|
|
50
|
+
readOnly: boolean;
|
|
51
|
+
readOnlyReason?: string;
|
|
52
|
+
canEdit: boolean;
|
|
53
|
+
canDelete: boolean;
|
|
54
|
+
canPreview: boolean;
|
|
55
|
+
}
|
|
56
|
+
export interface ReportConfigPreviewDto extends ReportResultDto {
|
|
57
|
+
success: boolean;
|
|
58
|
+
}
|
|
16
59
|
/**
|
|
17
60
|
* Users of Record Table must extend RecordPage model
|
|
18
61
|
*/
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { LineagePath, LineagePaths } from "../config/names/naming-helpers";
|
|
1
|
+
import { LineagePath, LineagePaths, LineagePathsPartial } from "../config/names/naming-helpers";
|
|
2
2
|
/**
|
|
3
3
|
* The parameters for a validator error.
|
|
4
4
|
* The parameters are different for each validator.
|
|
@@ -26,15 +26,38 @@ export type FormValidatorErrors = {
|
|
|
26
26
|
[key: string]: {
|
|
27
27
|
message: string;
|
|
28
28
|
params: FormValidatorErrorParams;
|
|
29
|
-
|
|
29
|
+
/**
|
|
30
|
+
* The validator class.
|
|
31
|
+
*
|
|
32
|
+
* Only set when the error key differs from the class, which happens when the same
|
|
33
|
+
* validator class is used more than once on a control. In that case the key is made
|
|
34
|
+
* unique so Angular's error merging keeps every instance, while this property carries
|
|
35
|
+
* the real class for display.
|
|
36
|
+
*/
|
|
37
|
+
class?: string;
|
|
38
|
+
} & FormValidatorTargetField;
|
|
30
39
|
};
|
|
31
40
|
/**
|
|
32
41
|
* The map of validator config.
|
|
33
42
|
* The config is different for each validator.
|
|
34
43
|
*/
|
|
35
44
|
export type FormValidatorCreateConfig = {
|
|
45
|
+
class?: string;
|
|
46
|
+
message?: string;
|
|
47
|
+
/**
|
|
48
|
+
* The key to use for this validator's entry in the merged errors object.
|
|
49
|
+
*
|
|
50
|
+
* Defaults to the class. Set to a unique value when the same class is used more than
|
|
51
|
+
* once on a control, so Angular's error merging does not overwrite earlier instances.
|
|
52
|
+
*
|
|
53
|
+
* @internal - This field is managed automatically by the framework. Do not set it
|
|
54
|
+
* manually in form configuration; doing so will produce an error key that does not
|
|
55
|
+
* match the validator class, breaking the display recovery in
|
|
56
|
+
* `getFormValidatorComponentErrors`.
|
|
57
|
+
*/
|
|
58
|
+
errorKey?: string;
|
|
36
59
|
[key: string]: unknown;
|
|
37
|
-
};
|
|
60
|
+
} & FormValidatorTargetField;
|
|
38
61
|
/**
|
|
39
62
|
* The interface that a form control must implement to be validated by a validator function.
|
|
40
63
|
* Some form controls are a collection of controls, these must provide a way to access the controls they contain.
|
|
@@ -171,10 +194,24 @@ export interface FormValidatorConfig {
|
|
|
171
194
|
*/
|
|
172
195
|
groups?: FormFieldValidationGroup;
|
|
173
196
|
}
|
|
197
|
+
/**
|
|
198
|
+
* Allows specifying a field to 'own' any validation failures.
|
|
199
|
+
*/
|
|
200
|
+
export interface FormValidatorTargetField {
|
|
201
|
+
/**
|
|
202
|
+
* Lineage paths to a target field that will 'own' any validation failures.
|
|
203
|
+
*/
|
|
204
|
+
targetField?: LineagePathsPartial;
|
|
205
|
+
}
|
|
206
|
+
/**
|
|
207
|
+
* Form-level validator config that allows specifying a field to 'own' any validation failures.
|
|
208
|
+
*/
|
|
209
|
+
export interface FormValidatorTargetFieldConfig extends FormValidatorConfig, FormValidatorTargetField {
|
|
210
|
+
}
|
|
174
211
|
/**
|
|
175
212
|
* One validator error.
|
|
176
213
|
*/
|
|
177
|
-
export interface FormValidatorComponentErrors {
|
|
214
|
+
export interface FormValidatorComponentErrors extends FormValidatorTargetField {
|
|
178
215
|
/**
|
|
179
216
|
* The message id for the validator.
|
|
180
217
|
*/
|
|
@@ -28,4 +28,4 @@ exports.SimpleServerFormValidatorControl = SimpleServerFormValidatorControl;
|
|
|
28
28
|
* - 'none': An empty array / no validators.
|
|
29
29
|
*/
|
|
30
30
|
exports.formValidationGroupMembership = ["all", "none"];
|
|
31
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2Zvcm0ubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbUNBQXFDO0FBdUZyQzs7OztHQUlHO0FBQ0gsTUFBYSxnQ0FBZ0M7SUFDekMsS0FBSyxDQUFVO0lBRWYsWUFBWSxLQUFjO1FBQ3RCLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxHQUFHLENBQWlDLElBQU87UUFDdkMsTUFBTSxNQUFNLEdBQUcsSUFBQSxZQUFJLEVBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUM7UUFFOUMsaUJBQWlCO1FBQ2pCLHFLQUFxSztRQUVySyxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0NBQ0o7QUFmRCw0RUFlQztBQXNORDs7Ozs7O0dBTUc7QUFDVSxRQUFBLDZCQUE2QixHQUFHLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBVSxDQUFDIn0=
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FormValidatorCreateConfig } from "./form.model";
|
|
1
|
+
import { FormValidatorCreateConfig, FormValidatorErrorParams, FormValidatorErrors } from "./form.model";
|
|
2
2
|
/**
|
|
3
3
|
* Extract the length property in case it's an array or a string.
|
|
4
4
|
* Extract the size property in case it's a set.
|
|
@@ -12,3 +12,5 @@ export declare function formValidatorGetDefinitionNumber(config: FormValidatorCr
|
|
|
12
12
|
export declare function formValidatorGetDefinitionBoolean(config: FormValidatorCreateConfig | null | undefined, key: string, defaultValue?: boolean | undefined): boolean;
|
|
13
13
|
export declare function formValidatorGetDefinitionRegexp(config: FormValidatorCreateConfig | null | undefined, key: string, defaultValue?: RegExp | undefined): RegExp;
|
|
14
14
|
export declare function formValidatorGetDefinitionArray(config: FormValidatorCreateConfig | null | undefined, key: string, defaultValue?: unknown[] | undefined): unknown[];
|
|
15
|
+
export declare function formValidatorGetDefinitionObject(config: FormValidatorCreateConfig | null | undefined, key: string, defaultValue?: Record<string, unknown> | undefined): Record<string, unknown>;
|
|
16
|
+
export declare function formValidatorBuildError(config: FormValidatorCreateConfig | null | undefined, params?: FormValidatorErrorParams): FormValidatorErrors;
|
|
@@ -7,6 +7,8 @@ exports.formValidatorGetDefinitionNumber = formValidatorGetDefinitionNumber;
|
|
|
7
7
|
exports.formValidatorGetDefinitionBoolean = formValidatorGetDefinitionBoolean;
|
|
8
8
|
exports.formValidatorGetDefinitionRegexp = formValidatorGetDefinitionRegexp;
|
|
9
9
|
exports.formValidatorGetDefinitionArray = formValidatorGetDefinitionArray;
|
|
10
|
+
exports.formValidatorGetDefinitionObject = formValidatorGetDefinitionObject;
|
|
11
|
+
exports.formValidatorBuildError = formValidatorBuildError;
|
|
10
12
|
const lodash_1 = require("lodash");
|
|
11
13
|
const helpers_1 = require("../config/helpers");
|
|
12
14
|
/**
|
|
@@ -42,7 +44,7 @@ function formValidatorGetDefinitionNumber(config, key, defaultValue = undefined)
|
|
|
42
44
|
const value = formValidatorGetDefinitionItem(config, key, defaultValue);
|
|
43
45
|
const valueString = value?.toString() ?? "";
|
|
44
46
|
const valueNumber = parseFloat(valueString);
|
|
45
|
-
if (
|
|
47
|
+
if (!Number.isFinite(valueNumber)) {
|
|
46
48
|
throw new Error(`Invalid numeric value '${value}' for key '${key}' in validator config.`);
|
|
47
49
|
}
|
|
48
50
|
return valueNumber;
|
|
@@ -65,4 +67,38 @@ function formValidatorGetDefinitionArray(config, key, defaultValue = undefined)
|
|
|
65
67
|
}
|
|
66
68
|
throw new Error(`Invalid array value '${value}' for key '${key}' in validator config.`);
|
|
67
69
|
}
|
|
68
|
-
|
|
70
|
+
function formValidatorGetDefinitionObject(config, key, defaultValue = undefined) {
|
|
71
|
+
const value = formValidatorGetDefinitionItem(config, key, defaultValue);
|
|
72
|
+
if ((0, helpers_1.guessType)(value) === "object") {
|
|
73
|
+
return value;
|
|
74
|
+
}
|
|
75
|
+
throw new Error(`Invalid object value '${value}' for key '${key}' in validator config.`);
|
|
76
|
+
}
|
|
77
|
+
function formValidatorBuildError(config, params) {
|
|
78
|
+
const optionNameKey = "class";
|
|
79
|
+
const optionNameValue = formValidatorGetDefinitionString(config, optionNameKey);
|
|
80
|
+
const optionMessageKey = "message";
|
|
81
|
+
const optionMessageValue = formValidatorGetDefinitionString(config, optionMessageKey);
|
|
82
|
+
const optionTargetFieldKey = "targetField";
|
|
83
|
+
const optionTargetFieldValue = formValidatorGetDefinitionObject(config, optionTargetFieldKey, {});
|
|
84
|
+
// The error key is the validator class, unless a unique error key was assigned because the
|
|
85
|
+
// same class is used more than once on a control. Keying by a unique value lets Angular's
|
|
86
|
+
// error merging keep every instance instead of overwriting earlier ones.
|
|
87
|
+
const optionErrorKeyKey = "errorKey";
|
|
88
|
+
const optionErrorKeyValue = formValidatorGetDefinitionString(config, optionErrorKeyKey, optionNameValue);
|
|
89
|
+
const result = {
|
|
90
|
+
[optionErrorKeyValue]: {
|
|
91
|
+
[optionMessageKey]: optionMessageValue,
|
|
92
|
+
params: { ...params },
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
// Preserve the real class when the key differs, so the class can be recovered for display.
|
|
96
|
+
if (optionErrorKeyValue !== optionNameValue) {
|
|
97
|
+
result[optionErrorKeyValue][optionNameKey] = optionNameValue;
|
|
98
|
+
}
|
|
99
|
+
if (Object.keys(optionTargetFieldValue).length > 0) {
|
|
100
|
+
result[optionErrorKeyValue][optionTargetFieldKey] = optionTargetFieldValue;
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy92YWxpZGF0aW9uL2hlbHBlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFXQSw4REFVQztBQUVELHdFQVVDO0FBRUQsNEVBT0M7QUFFRCw0RUFZQztBQUVELDhFQU9DO0FBRUQsNEVBVUM7QUFFRCwwRUFVQztBQUVELDRFQVVDO0FBRUQsMERBNkJDO0FBcElELG1DQUFtQztBQUVuQywrQ0FBdUQ7QUFHdkQ7Ozs7O0dBS0c7QUFDSCxTQUFnQix5QkFBeUIsQ0FBQyxLQUF5RDtJQUNqRyxJQUFJLEtBQUssS0FBSyxJQUFJLElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQzFDLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztTQUFNLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM3RCxPQUFPLEtBQUssQ0FBQyxNQUFNLENBQUM7SUFDdEIsQ0FBQztTQUFNLElBQUksS0FBSyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ2hDLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQztJQUNwQixDQUFDO0lBRUQsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDO0FBRUQsU0FBZ0IsOEJBQThCLENBQzVDLE1BQW9ELEVBQ3BELEdBQVcsRUFDWCxlQUF3QixTQUFTO0lBRWpDLE1BQU0sS0FBSyxHQUFHLElBQUEsWUFBSSxFQUFDLE1BQU0sSUFBSSxFQUFFLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO0lBQ3BELElBQUksS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ3hCLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0JBQWdCLEdBQUcsd0JBQXdCLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBZ0IsZ0NBQWdDLENBQzlDLE1B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
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { FormValidationGroups, FormValidatorComponentErrors, FormValidatorConfig, FormValidatorDefinition, FormValidatorErrors, FormValidatorFns } from "./form.model";
|
|
1
|
+
import { FormValidationGroups, FormValidatorComponentErrors, FormValidatorConfig, FormValidatorDefinition, FormValidatorErrors, FormValidatorFns, FormValidatorTargetFieldConfig } from "./form.model";
|
|
2
2
|
export declare class ValidatorsSupport {
|
|
3
3
|
/**
|
|
4
4
|
* Create validator definition mapping from the validator definitions.
|
|
@@ -10,7 +10,7 @@ export declare class ValidatorsSupport {
|
|
|
10
10
|
* @param defMap The validator definition mapping.
|
|
11
11
|
* @param config The form validator config blocks.
|
|
12
12
|
*/
|
|
13
|
-
createFormValidatorInstancesFromMapping(defMap: Map<string, FormValidatorDefinition>, config: FormValidatorConfig[] | null | undefined): FormValidatorFns;
|
|
13
|
+
createFormValidatorInstancesFromMapping(defMap: Map<string, FormValidatorDefinition>, config: (FormValidatorConfig | FormValidatorTargetFieldConfig)[] | null | undefined): FormValidatorFns;
|
|
14
14
|
/**
|
|
15
15
|
* Get the form validator errors for a component's control.
|
|
16
16
|
* @param errors The control's errors.
|
|
@@ -31,6 +31,15 @@ class ValidatorsSupport {
|
|
|
31
31
|
*/
|
|
32
32
|
createFormValidatorInstancesFromMapping(defMap, config) {
|
|
33
33
|
const result = { syncDefs: [], asyncDefs: [] };
|
|
34
|
+
// Count how many times each class is used so we know which ones are duplicated.
|
|
35
|
+
// Duplicated classes need a unique error key so Angular's error merging keeps every
|
|
36
|
+
// instance instead of overwriting earlier ones (the merge key would otherwise collide).
|
|
37
|
+
const classCounts = new Map();
|
|
38
|
+
for (const validatorConfigItem of (config ?? [])) {
|
|
39
|
+
const validatorClass = validatorConfigItem?.class;
|
|
40
|
+
classCounts.set(validatorClass, (classCounts.get(validatorClass) ?? 0) + 1);
|
|
41
|
+
}
|
|
42
|
+
const classOccurrences = new Map();
|
|
34
43
|
for (const validatorConfigItem of (config ?? [])) {
|
|
35
44
|
const validatorClass = validatorConfigItem?.class;
|
|
36
45
|
const def = defMap.get(validatorClass);
|
|
@@ -44,6 +53,16 @@ class ValidatorsSupport {
|
|
|
44
53
|
class: validatorClass,
|
|
45
54
|
message: message,
|
|
46
55
|
};
|
|
56
|
+
// Only assign a unique error key when the class is used more than once on this control.
|
|
57
|
+
// Single-use classes keep the class as the error key, so the error shape is unchanged.
|
|
58
|
+
const occurrence = (classOccurrences.get(validatorClass) ?? 0);
|
|
59
|
+
classOccurrences.set(validatorClass, occurrence + 1);
|
|
60
|
+
if ((classCounts.get(validatorClass) ?? 0) > 1) {
|
|
61
|
+
createConfig.errorKey = `${validatorClass}#${occurrence}`;
|
|
62
|
+
}
|
|
63
|
+
if ('targetField' in validatorConfigItem && validatorConfigItem.targetField !== undefined) {
|
|
64
|
+
createConfig.targetField = validatorConfigItem.targetField;
|
|
65
|
+
}
|
|
47
66
|
if ('create' in def) {
|
|
48
67
|
result.syncDefs.push(def.create(createConfig));
|
|
49
68
|
}
|
|
@@ -61,11 +80,21 @@ class ValidatorsSupport {
|
|
|
61
80
|
* @param errors The control's errors.
|
|
62
81
|
*/
|
|
63
82
|
getFormValidatorComponentErrors(errors) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
83
|
+
const result = [];
|
|
84
|
+
for (const [key, value] of Object.entries(errors ?? {})) {
|
|
85
|
+
const item = {
|
|
86
|
+
// The error key matches the class unless the class was duplicated on a control, in
|
|
87
|
+
// which case the real class is carried on the value so it can be recovered here.
|
|
88
|
+
class: value.class ?? key,
|
|
89
|
+
message: value.message ?? null,
|
|
90
|
+
params: { ...value.params },
|
|
91
|
+
};
|
|
92
|
+
if (value.targetField !== undefined) {
|
|
93
|
+
item.targetField = value.targetField;
|
|
94
|
+
}
|
|
95
|
+
result.push(item);
|
|
96
|
+
}
|
|
97
|
+
return result;
|
|
69
98
|
}
|
|
70
99
|
checkValidationGroups(availableGroups, enabledGroupNames) {
|
|
71
100
|
const availableGroupNames = Object.keys(availableGroups);
|
|
@@ -151,4 +180,4 @@ class ValidatorsSupport {
|
|
|
151
180
|
}
|
|
152
181
|
}
|
|
153
182
|
exports.ValidatorsSupport = ValidatorsSupport;
|
|
154
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
183
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9ycy1zdXBwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3ZhbGlkYXRpb24vdmFsaWRhdG9ycy1zdXBwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQU1BLGlFQUEyRTtBQUczRSxNQUFhLGlCQUFpQjtJQUM1Qjs7O09BR0c7SUFDSSxnQ0FBZ0MsQ0FDckMsVUFBd0Q7UUFFeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQW1DLENBQUM7UUFDMUQsS0FBSyxNQUFNLGNBQWMsSUFBSSxDQUFDLFVBQVUsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDO1lBQ2hELElBQUksQ0FBQyxJQUFBLGdEQUE2QixFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQ25ELE1BQU0sSUFBSSxLQUFLLENBQUMseUZBQXlGLElBQUksQ0FBQyxTQUFTLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdJLENBQUM7WUFDRCxNQUFNLGNBQWMsR0FBRyxjQUFjLEVBQUUsS0FBSyxDQUFDO1lBQzdDLE1BQU0sT0FBTyxHQUFHLGNBQWMsRUFBRSxPQUFPLENBQUM7WUFDeEMsSUFBSSxNQUFNLENBQUMsR0FBRyxDQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUM7Z0JBQ2hFLE1BQU0sSUFBSSxLQUFLLENBQUMsOEJBQThCLGNBQWMsNENBQTRDO3NCQUNwRywrRUFBK0UsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDOUcsQ0FBQztZQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLGNBQWMsQ0FBQyxDQUFDO1FBQzdDLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7T0FJRztJ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
|