@decaf-ts/decorator-validation 1.6.1 → 1.6.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +8 -2
- package/dist/decorator-validation.cjs +1154 -352
- package/dist/decorator-validation.esm.cjs +1124 -320
- package/lib/esm/index.d.ts +5 -36
- package/lib/esm/index.js +6 -37
- package/lib/esm/model/Model.d.ts +100 -29
- package/lib/esm/model/Model.js +103 -36
- package/lib/esm/model/constants.d.ts +3 -3
- package/lib/esm/model/constants.js +4 -4
- package/lib/esm/model/construction.d.ts +3 -3
- package/lib/esm/model/construction.js +4 -4
- package/lib/esm/model/decorators.d.ts +4 -4
- package/lib/esm/model/decorators.js +6 -5
- package/lib/esm/model/types.d.ts +30 -11
- package/lib/esm/model/types.js +1 -1
- package/lib/esm/model/validation.d.ts +2 -2
- package/lib/esm/model/validation.js +5 -5
- package/lib/esm/utils/Decoration.d.ts +123 -0
- package/lib/esm/utils/Decoration.js +188 -0
- package/lib/esm/utils/constants.d.ts +27 -9
- package/lib/esm/utils/constants.js +28 -10
- package/lib/esm/utils/dates.d.ts +26 -16
- package/lib/esm/utils/dates.js +27 -17
- package/lib/esm/utils/decorators.d.ts +41 -0
- package/lib/esm/utils/decorators.js +42 -1
- package/lib/esm/utils/hashing.d.ts +50 -6
- package/lib/esm/utils/hashing.js +49 -5
- package/lib/esm/utils/index.d.ts +1 -0
- package/lib/esm/utils/index.js +2 -1
- package/lib/esm/utils/registry.d.ts +2 -2
- package/lib/esm/utils/registry.js +1 -1
- package/lib/esm/utils/serialization.d.ts +1 -1
- package/lib/esm/utils/serialization.js +2 -2
- package/lib/esm/utils/strings.d.ts +4 -4
- package/lib/esm/utils/strings.js +5 -5
- package/lib/esm/utils/types.d.ts +123 -16
- package/lib/esm/utils/types.js +1 -1
- package/lib/esm/validation/Validators/DateValidator.d.ts +40 -8
- package/lib/esm/validation/Validators/DateValidator.js +41 -9
- package/lib/esm/validation/Validators/EmailValidator.d.ts +39 -7
- package/lib/esm/validation/Validators/EmailValidator.js +40 -8
- package/lib/esm/validation/Validators/ListValidator.d.ts +44 -6
- package/lib/esm/validation/Validators/ListValidator.js +45 -7
- package/lib/esm/validation/Validators/MaxValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/MaxValidator.js +53 -7
- package/lib/esm/validation/Validators/MinValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/MinValidator.js +53 -7
- package/lib/esm/validation/Validators/PatternValidator.d.ts +75 -9
- package/lib/esm/validation/Validators/PatternValidator.js +76 -10
- package/lib/esm/validation/Validators/RequiredValidator.d.ts +52 -6
- package/lib/esm/validation/Validators/RequiredValidator.js +53 -7
- package/lib/esm/validation/Validators/TypeValidator.d.ts +60 -6
- package/lib/esm/validation/Validators/TypeValidator.js +69 -7
- package/lib/esm/validation/Validators/URLValidator.d.ts +41 -7
- package/lib/esm/validation/Validators/URLValidator.js +42 -8
- package/lib/esm/validation/Validators/Validator.d.ts +77 -14
- package/lib/esm/validation/Validators/Validator.js +68 -11
- package/lib/esm/validation/Validators/ValidatorRegistry.d.ts +1 -7
- package/lib/esm/validation/Validators/ValidatorRegistry.js +4 -11
- package/lib/esm/validation/decorators.d.ts +50 -40
- package/lib/esm/validation/decorators.js +102 -53
- package/lib/esm/validation/types.d.ts +146 -28
- package/lib/esm/validation/types.js +1 -1
- package/lib/index.cjs +7 -38
- package/lib/index.d.ts +5 -36
- package/lib/model/Model.cjs +103 -38
- package/lib/model/Model.d.ts +100 -29
- package/lib/model/constants.cjs +4 -4
- package/lib/model/constants.d.ts +3 -3
- package/lib/model/construction.cjs +4 -4
- package/lib/model/construction.d.ts +3 -3
- package/lib/model/decorators.cjs +6 -5
- package/lib/model/decorators.d.ts +4 -4
- package/lib/model/types.cjs +1 -1
- package/lib/model/types.d.ts +30 -11
- package/lib/model/validation.cjs +4 -4
- package/lib/model/validation.d.ts +2 -2
- package/lib/utils/Decoration.cjs +192 -0
- package/lib/utils/Decoration.d.ts +123 -0
- package/lib/utils/constants.cjs +29 -11
- package/lib/utils/constants.d.ts +27 -9
- package/lib/utils/dates.cjs +27 -17
- package/lib/utils/dates.d.ts +26 -16
- package/lib/utils/decorators.cjs +42 -1
- package/lib/utils/decorators.d.ts +41 -0
- package/lib/utils/hashing.cjs +49 -5
- package/lib/utils/hashing.d.ts +50 -6
- package/lib/utils/index.cjs +2 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/registry.cjs +1 -1
- package/lib/utils/registry.d.ts +2 -2
- package/lib/utils/serialization.cjs +2 -2
- package/lib/utils/serialization.d.ts +1 -1
- package/lib/utils/strings.cjs +5 -5
- package/lib/utils/strings.d.ts +4 -4
- package/lib/utils/types.cjs +1 -1
- package/lib/utils/types.d.ts +123 -16
- package/lib/validation/Validators/DateValidator.cjs +41 -9
- package/lib/validation/Validators/DateValidator.d.ts +40 -8
- package/lib/validation/Validators/EmailValidator.cjs +40 -8
- package/lib/validation/Validators/EmailValidator.d.ts +39 -7
- package/lib/validation/Validators/ListValidator.cjs +45 -7
- package/lib/validation/Validators/ListValidator.d.ts +44 -6
- package/lib/validation/Validators/MaxValidator.cjs +53 -7
- package/lib/validation/Validators/MaxValidator.d.ts +52 -6
- package/lib/validation/Validators/MinValidator.cjs +53 -7
- package/lib/validation/Validators/MinValidator.d.ts +52 -6
- package/lib/validation/Validators/PatternValidator.cjs +76 -10
- package/lib/validation/Validators/PatternValidator.d.ts +75 -9
- package/lib/validation/Validators/RequiredValidator.cjs +53 -7
- package/lib/validation/Validators/RequiredValidator.d.ts +52 -6
- package/lib/validation/Validators/TypeValidator.cjs +69 -7
- package/lib/validation/Validators/TypeValidator.d.ts +60 -6
- package/lib/validation/Validators/URLValidator.cjs +42 -8
- package/lib/validation/Validators/URLValidator.d.ts +41 -7
- package/lib/validation/Validators/Validator.cjs +68 -11
- package/lib/validation/Validators/Validator.d.ts +77 -14
- package/lib/validation/Validators/ValidatorRegistry.cjs +4 -12
- package/lib/validation/Validators/ValidatorRegistry.d.ts +1 -7
- package/lib/validation/decorators.cjs +102 -53
- package/lib/validation/decorators.d.ts +50 -40
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +146 -28
- package/package.json +2 -2
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import { DefaultFlavour } from "./constants";
|
|
2
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
3
|
+
function defaultFlavourResolver(target) {
|
|
4
|
+
return DefaultFlavour;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @description A decorator management class that handles flavoured decorators
|
|
8
|
+
* @summary The Decoration class provides a builder pattern for creating and managing decorators with different flavours.
|
|
9
|
+
* It supports registering, extending, and applying decorators with context-aware flavour resolution.
|
|
10
|
+
* The class implements a fluent interface for defining, extending, and applying decorators with different flavours,
|
|
11
|
+
* allowing for framework-specific decorator implementations while maintaining a consistent API.
|
|
12
|
+
* @template T Type of the decorator (ClassDecorator | PropertyDecorator | MethodDecorator)
|
|
13
|
+
* @param {string} [flavour] Optional flavour parameter for the decorator context
|
|
14
|
+
* @class
|
|
15
|
+
* @category Model
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* // Create a new decoration for 'component' with default flavour
|
|
19
|
+
* const componentDecorator = new Decoration()
|
|
20
|
+
* .for('component')
|
|
21
|
+
* .define(customComponentDecorator);
|
|
22
|
+
*
|
|
23
|
+
* // Create a flavoured decoration
|
|
24
|
+
* const vueComponent = new Decoration('vue')
|
|
25
|
+
* .for('component')
|
|
26
|
+
* .define(vueComponentDecorator);
|
|
27
|
+
*
|
|
28
|
+
* // Apply the decoration
|
|
29
|
+
* @componentDecorator
|
|
30
|
+
* class MyComponent {}
|
|
31
|
+
* ```
|
|
32
|
+
* @mermaid
|
|
33
|
+
* sequenceDiagram
|
|
34
|
+
* participant C as Client
|
|
35
|
+
* participant D as Decoration
|
|
36
|
+
* participant R as FlavourResolver
|
|
37
|
+
* participant F as DecoratorFactory
|
|
38
|
+
*
|
|
39
|
+
* C->>D: new Decoration(flavour)
|
|
40
|
+
* C->>D: for(key)
|
|
41
|
+
* C->>D: define(decorators)
|
|
42
|
+
* D->>D: register(key, flavour, decorators)
|
|
43
|
+
* D->>F: decoratorFactory(key, flavour)
|
|
44
|
+
* F->>R: resolve(target)
|
|
45
|
+
* R-->>F: resolved flavour
|
|
46
|
+
* F->>F: apply decorators
|
|
47
|
+
* F-->>C: decorated target
|
|
48
|
+
*/
|
|
49
|
+
export class Decoration {
|
|
50
|
+
/**
|
|
51
|
+
* @description Static map of registered decorators
|
|
52
|
+
* @summary Stores all registered decorators organized by key and flavour
|
|
53
|
+
*/
|
|
54
|
+
static { this.decorators = {}; }
|
|
55
|
+
/**
|
|
56
|
+
* @description Function to resolve flavour from a target
|
|
57
|
+
* @summary Resolver function that determines the appropriate flavour for a given target
|
|
58
|
+
*/
|
|
59
|
+
static { this.flavourResolver = defaultFlavourResolver; }
|
|
60
|
+
constructor(flavour = DefaultFlavour) {
|
|
61
|
+
this.flavour = flavour;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* @description Sets the key for the decoration builder
|
|
65
|
+
* @summary Initializes a new decoration chain with the specified key
|
|
66
|
+
* @param {string} key The identifier for the decorator
|
|
67
|
+
* @return {DecorationBuilderMid} Builder instance for method chaining
|
|
68
|
+
*/
|
|
69
|
+
for(key) {
|
|
70
|
+
this.key = key;
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @description Adds decorators to the current context
|
|
75
|
+
* @summary Internal method to add decorators with addon support
|
|
76
|
+
* @param {boolean} [addon=false] Whether the decorators are addons
|
|
77
|
+
* @param decorators Array of decorators
|
|
78
|
+
* @return {this} Current instance for chaining
|
|
79
|
+
*/
|
|
80
|
+
decorate(addon = false, ...decorators) {
|
|
81
|
+
if (!this.key)
|
|
82
|
+
throw new Error("key must be provided before decorators can be added");
|
|
83
|
+
if (!addon && !this.decorators && this.flavour !== DefaultFlavour)
|
|
84
|
+
throw new Error("Must provide overrides or addons to override or extend decaf's decorators");
|
|
85
|
+
if (this.flavour === DefaultFlavour && addon)
|
|
86
|
+
throw new Error("Default flavour cannot be extended");
|
|
87
|
+
this[addon ? "extras" : "decorators"] = new Set([
|
|
88
|
+
...(this[addon ? "extras" : "decorators"] || new Set()).values(),
|
|
89
|
+
...decorators,
|
|
90
|
+
]);
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @description Defines the base decorators
|
|
95
|
+
* @summary Sets the primary decorators for the current context
|
|
96
|
+
* @param decorators Decorators to define
|
|
97
|
+
* @return Builder instance for finishing the chain
|
|
98
|
+
*/
|
|
99
|
+
define(...decorators) {
|
|
100
|
+
return this.decorate(false, ...decorators);
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* @description Extends existing decorators
|
|
104
|
+
* @summary Adds additional decorators to the current context
|
|
105
|
+
* @param decorators Additional decorators
|
|
106
|
+
* @return {DecorationBuilderBuild} Builder instance for building the decorator
|
|
107
|
+
*/
|
|
108
|
+
extend(...decorators) {
|
|
109
|
+
return this.decorate(true, ...decorators);
|
|
110
|
+
}
|
|
111
|
+
decoratorFactory(key, f = DefaultFlavour) {
|
|
112
|
+
const contextDecorator = function contextDecorator(target, propertyKey, descriptor) {
|
|
113
|
+
const flavour = Decoration.flavourResolver(target);
|
|
114
|
+
let decorators;
|
|
115
|
+
const extras = Decoration.decorators[key][flavour].extras;
|
|
116
|
+
if (Decoration.decorators[key] &&
|
|
117
|
+
Decoration.decorators[key][flavour] &&
|
|
118
|
+
Decoration.decorators[key][flavour].decorators) {
|
|
119
|
+
decorators = Decoration.decorators[key][flavour].decorators;
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
decorators = Decoration.decorators[key][DefaultFlavour].decorators;
|
|
123
|
+
}
|
|
124
|
+
[
|
|
125
|
+
...(decorators ? decorators.values() : []),
|
|
126
|
+
...(extras ? extras.values() : []),
|
|
127
|
+
].forEach((d) => d(target, propertyKey, descriptor, descriptor));
|
|
128
|
+
// return apply(
|
|
129
|
+
//
|
|
130
|
+
// )(target, propertyKey, descriptor);
|
|
131
|
+
};
|
|
132
|
+
Object.defineProperty(contextDecorator, "name", {
|
|
133
|
+
value: [f, key].join("_decorator_for_"),
|
|
134
|
+
writable: false,
|
|
135
|
+
});
|
|
136
|
+
return contextDecorator;
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* @description Creates the final decorator function
|
|
140
|
+
* @summary Builds and returns the decorator factory function
|
|
141
|
+
* @return {function(object, any?, TypedPropertyDescriptor?): any} The generated decorator function
|
|
142
|
+
*/
|
|
143
|
+
apply() {
|
|
144
|
+
if (!this.key)
|
|
145
|
+
throw new Error("No key provided for the decoration builder");
|
|
146
|
+
Decoration.register(this.key, this.flavour, this.decorators, this.extras);
|
|
147
|
+
return this.decoratorFactory(this.key, this.flavour);
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* @description Registers decorators for a specific key and flavour
|
|
151
|
+
* @summary Internal method to store decorators in the static registry
|
|
152
|
+
* @param {string} key Decorator key
|
|
153
|
+
* @param {string} flavour Decorator flavour
|
|
154
|
+
* @param [decorators] Primary decorators
|
|
155
|
+
* @param [extras] Additional decorators
|
|
156
|
+
*/
|
|
157
|
+
static register(key, flavour, decorators, extras) {
|
|
158
|
+
if (!key)
|
|
159
|
+
throw new Error("No key provided for the decoration builder");
|
|
160
|
+
if (!decorators)
|
|
161
|
+
throw new Error("No decorators provided for the decoration builder");
|
|
162
|
+
if (!flavour)
|
|
163
|
+
throw new Error("No flavour provided for the decoration builder");
|
|
164
|
+
if (!Decoration.decorators[key])
|
|
165
|
+
Decoration.decorators[key] = {};
|
|
166
|
+
if (!Decoration.decorators[key][flavour])
|
|
167
|
+
Decoration.decorators[key][flavour] = {};
|
|
168
|
+
if (decorators)
|
|
169
|
+
Decoration.decorators[key][flavour].decorators = decorators;
|
|
170
|
+
if (extras)
|
|
171
|
+
Decoration.decorators[key][flavour].extras = extras;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* @description Sets the global flavour resolver
|
|
175
|
+
* @summary Configures the function used to determine decorator flavours
|
|
176
|
+
* @param {FlavourResolver} resolver Function to resolve flavours
|
|
177
|
+
*/
|
|
178
|
+
static setFlavourResolver(resolver) {
|
|
179
|
+
Decoration.flavourResolver = resolver;
|
|
180
|
+
}
|
|
181
|
+
static for(key) {
|
|
182
|
+
return new Decoration().for(key);
|
|
183
|
+
}
|
|
184
|
+
static flavouredAs(flavour) {
|
|
185
|
+
return new Decoration(flavour);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRGVjb3JhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy91dGlscy9EZWNvcmF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVFBLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFFN0MsNkRBQTZEO0FBQzdELFNBQVMsc0JBQXNCLENBQUMsTUFBYztJQUM1QyxPQUFPLGNBQWMsQ0FBQztBQUN4QixDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTBDRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBQ3JCOzs7T0FHRzthQUNZLGVBQVUsR0FTckIsRUFBRSxDQUFDO0lBRVA7OztPQUdHO2FBQ1ksb0JBQWUsR0FBb0Isc0JBQXNCLENBQUM7SUFtQnpFLFlBQW9CLFVBQWtCLGNBQWM7UUFBaEMsWUFBTyxHQUFQLE9BQU8sQ0FBeUI7SUFBRyxDQUFDO0lBRXhEOzs7OztPQUtHO0lBQ0gsR0FBRyxDQUFDLEdBQVc7UUFDYixJQUFJLENBQUMsR0FBRyxHQUFHLEdBQUcsQ0FBQztRQUNmLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNLLFFBQVEsQ0FDZCxRQUFpQixLQUFLLEVBQ3RCLEdBQUcsVUFBb0U7UUFFdkUsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxxREFBcUQsQ0FBQyxDQUFDO1FBQ3pFLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxPQUFPLEtBQUssY0FBYztZQUMvRCxNQUFNLElBQUksS0FBSyxDQUNiLDJFQUEyRSxDQUM1RSxDQUFDO1FBQ0osSUFBSSxJQUFJLENBQUMsT0FBTyxLQUFLLGNBQWMsSUFBSSxLQUFLO1lBQzFDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztRQUV4RCxJQUFJLENB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VztRQUNwQixPQUFPLElBQUksVUFBVSxFQUFFLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQWU7UUFDaEMsT0FBTyxJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNqQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVjb3JhdGlvbkJ1aWxkZXJCdWlsZCxcbiAgRGVjb3JhdGlvbkJ1aWxkZXJFbmQsXG4gIERlY29yYXRpb25CdWlsZGVyTWlkLFxuICBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0LFxuICBGbGF2b3VyUmVzb2x2ZXIsXG4gIElEZWNvcmF0aW9uQnVpbGRlcixcbn0gZnJvbSBcIi4vdHlwZXNcIjtcbmltcG9ydCB7IERlZmF1bHRGbGF2b3VyIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbmZ1bmN0aW9uIGRlZmF1bHRGbGF2b3VyUmVzb2x2ZXIodGFyZ2V0OiBvYmplY3QpIHtcbiAgcmV0dXJuIERlZmF1bHRGbGF2b3VyO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBBIGRlY29yYXRvciBtYW5hZ2VtZW50IGNsYXNzIHRoYXQgaGFuZGxlcyBmbGF2b3VyZWQgZGVjb3JhdG9yc1xuICogQHN1bW1hcnkgVGhlIERlY29yYXRpb24gY2xhc3MgcHJvdmlkZXMgYSBidWlsZGVyIHBhdHRlcm4gZm9yIGNyZWF0aW5nIGFuZCBtYW5hZ2luZyBkZWNvcmF0b3JzIHdpdGggZGlmZmVyZW50IGZsYXZvdXJzLlxuICogSXQgc3VwcG9ydHMgcmVnaXN0ZXJpbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBjb250ZXh0LWF3YXJlIGZsYXZvdXIgcmVzb2x1dGlvbi5cbiAqIFRoZSBjbGFzcyBpbXBsZW1lbnRzIGEgZmx1ZW50IGludGVyZmFjZSBmb3IgZGVmaW5pbmcsIGV4dGVuZGluZywgYW5kIGFwcGx5aW5nIGRlY29yYXRvcnMgd2l0aCBkaWZmZXJlbnQgZmxhdm91cnMsXG4gKiBhbGxvd2luZyBmb3IgZnJhbWV3b3JrLXNwZWNpZmljIGRlY29yYXRvciBpbXBsZW1lbnRhdGlvbnMgd2hpbGUgbWFpbnRhaW5pbmcgYSBjb25zaXN0ZW50IEFQSS5cbiAqIEB0ZW1wbGF0ZSBUIFR5cGUgb2YgdGhlIGRlY29yYXRvciAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilcbiAqIEBwYXJhbSB7c3RyaW5nfSBbZmxhdm91cl0gT3B0aW9uYWwgZmxhdm91ciBwYXJhbWV0ZXIgZm9yIHRoZSBkZWNvcmF0b3IgY29udGV4dFxuICogQGNsYXNzXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqIEBleGFtcGxlXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiAvLyBDcmVhdGUgYSBuZXcgZGVjb3JhdGlvbiBmb3IgJ2NvbXBvbmVudCcgd2l0aCBkZWZhdWx0IGZsYXZvdXJcbiAqIGNvbnN0IGNvbXBvbmVudERlY29yYXRvciA9IG5ldyBEZWNvcmF0aW9uKClcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZShjdXN0b21Db21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIENyZWF0ZSBhIGZsYXZvdXJlZCBkZWNvcmF0aW9uXG4gKiBjb25zdCB2dWVDb21wb25lbnQgPSBuZXcgRGVjb3JhdGlvbigndnVlJylcbiAqICAgLmZvcignY29tcG9uZW50JylcbiAqICAgLmRlZmluZSh2dWVDb21wb25lbnREZWNvcmF0b3IpO1xuICpcbiAqIC8vIEFwcGx5IHRoZSBkZWNvcmF0aW9uXG4gKiBAY29tcG9uZW50RGVjb3JhdG9yXG4gKiBjbGFzcyBNeUNvbXBvbmVudCB7fVxuICogYGBgXG4gKiBAbWVybWFpZFxuICogc2VxdWVuY2VEaWFncmFtXG4gKiAgIHBhcnRpY2lwYW50IEMgYXMgQ2xpZW50XG4gKiAgIHBhcnRpY2lwYW50IEQgYXMgRGVjb3JhdGlvblxuICogICBwYXJ0aWNpcGFudCBSIGFzIEZsYXZvdXJSZXNvbHZlclxuICogICBwYXJ0aWNpcGFudCBGIGFzIERlY29yYXRvckZhY3RvcnlcbiAqXG4gKiAgIEMtPj5EOiBuZXcgRGVjb3JhdGlvbihmbGF2b3VyKVxuICogICBDLT4+RDogZm9yKGtleSlcbiAqICAgQy0+PkQ6IGRlZmluZShkZWNvcmF0b3JzKVxuICogICBELT4+RDogcmVnaXN0ZXIoa2V5LCBmbGF2b3VyLCBkZWNvcmF0b3JzKVxuICogICBELT4+RjogZGVjb3JhdG9yRmFjdG9yeShrZXksIGZsYXZvdXIpXG4gKiAgIEYtPj5SOiByZXNvbHZlKHRhcmdldClcbiAqICAgUi0tPj5GOiByZXNvbHZlZCBmbGF2b3VyXG4gKiAgIEYtPj5GOiBhcHBseSBkZWNvcmF0b3JzXG4gKiAgIEYtLT4+QzogZGVjb3JhdGVkIHRhcmdldFxuICovXG5leHBvcnQgY2xhc3MgRGVjb3JhdGlvbiBpbXBsZW1lbnRzIElEZWNvcmF0aW9uQnVpbGRlciB7XG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU3RhdGljIG1hcCBvZiByZWdpc3RlcmVkIGRlY29yYXRvcnNcbiAgICogQHN1bW1hcnkgU3RvcmVzIGFsbCByZWdpc3RlcmVkIGRlY29yYXRvcnMgb3JnYW5pemVkIGJ5IGtleSBhbmQgZmxhdm91clxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgZGVjb3JhdG9yczogUmVjb3JkPFxuICAgIHN0cmluZyxcbiAgICBSZWNvcmQ8XG4gICAgICBzdHJpbmcsXG4gICAgICB7XG4gICAgICAgIGRlY29yYXRvcnM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj47XG4gICAgICAgIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPjtcbiAgICAgIH1cbiAgICA+XG4gID4gPSB7fTtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIEZ1bmN0aW9uIHRvIHJlc29sdmUgZmxhdm91ciBmcm9tIGEgdGFyZ2V0XG4gICAqIEBzdW1tYXJ5IFJlc29sdmVyIGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyB0aGUgYXBwcm9wcmlhdGUgZmxhdm91ciBmb3IgYSBnaXZlbiB0YXJnZXRcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIGZsYXZvdXJSZXNvbHZlcjogRmxhdm91clJlc29sdmVyID0gZGVmYXVsdEZsYXZvdXJSZXNvbHZlcjtcblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIFNldCBvZiBkZWNvcmF0b3JzIGZvciB0aGUgY3VycmVudCBjb250ZXh0XG4gICAqL1xuICBwcml2YXRlIGRlY29yYXRvcnM/OiBTZXQ8XG4gICAgQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvclxuICA+O1xuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0IG9mIGFkZGl0aW9uYWwgZGVjb3JhdG9yc1xuICAgKi9cbiAgcHJpdmF0ZSBleHRyYXM/OiBTZXQ8Q2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcj47XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBDdXJyZW50IGRlY29yYXRvciBrZXlcbiAgICovXG4gIHByaXZhdGUga2V5Pzogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZmxhdm91cjogc3RyaW5nID0gRGVmYXVsdEZsYXZvdXIpIHt9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBTZXRzIHRoZSBrZXkgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcbiAgICogQHN1bW1hcnkgSW5pdGlhbGl6ZXMgYSBuZXcgZGVjb3JhdGlvbiBjaGFpbiB3aXRoIHRoZSBzcGVjaWZpZWQga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGlkZW50aWZpZXIgZm9yIHRoZSBkZWNvcmF0b3JcbiAgICogQHJldHVybiB7RGVjb3JhdGlvbkJ1aWxkZXJNaWR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIG1ldGhvZCBjaGFpbmluZ1xuICAgKi9cbiAgZm9yKGtleTogc3RyaW5nKTogRGVjb3JhdGlvbkJ1aWxkZXJNaWQge1xuICAgIHRoaXMua2V5ID0ga2V5O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXNjcmlwdGlvbiBBZGRzIGRlY29yYXRvcnMgdG8gdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAc3VtbWFyeSBJbnRlcm5hbCBtZXRob2QgdG8gYWRkIGRlY29yYXRvcnMgd2l0aCBhZGRvbiBzdXBwb3J0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2FkZG9uPWZhbHNlXSBXaGV0aGVyIHRoZSBkZWNvcmF0b3JzIGFyZSBhZGRvbnNcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQXJyYXkgb2YgZGVjb3JhdG9yc1xuICAgKiBAcmV0dXJuIHt0aGlzfSBDdXJyZW50IGluc3RhbmNlIGZvciBjaGFpbmluZ1xuICAgKi9cbiAgcHJpdmF0ZSBkZWNvcmF0ZShcbiAgICBhZGRvbjogYm9vbGVhbiA9IGZhbHNlLFxuICAgIC4uLmRlY29yYXRvcnM6IChDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yKVtdXG4gICk6IHRoaXMge1xuICAgIGlmICghdGhpcy5rZXkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXCJrZXkgbXVzdCBiZSBwcm92aWRlZCBiZWZvcmUgZGVjb3JhdG9ycyBjYW4gYmUgYWRkZWRcIik7XG4gICAgaWYgKCFhZGRvbiAmJiAhdGhpcy5kZWNvcmF0b3JzICYmIHRoaXMuZmxhdm91ciAhPT0gRGVmYXVsdEZsYXZvdXIpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIFwiTXVzdCBwcm92aWRlIG92ZXJyaWRlcyBvciBhZGRvbnMgdG8gb3ZlcnJpZGUgb3IgZXh0ZW5kIGRlY2FmJ3MgZGVjb3JhdG9yc1wiXG4gICAgICApO1xuICAgIGlmICh0aGlzLmZsYXZvdXIgPT09IERlZmF1bHRGbGF2b3VyICYmIGFkZG9uKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRGVmYXVsdCBmbGF2b3VyIGNhbm5vdCBiZSBleHRlbmRlZFwiKTtcblxuICAgIHRoaXNbYWRkb24gPyBcImV4dHJhc1wiIDogXCJkZWNvcmF0b3JzXCJdID0gbmV3IFNldChbXG4gICAgICAuLi4odGhpc1thZGRvbiA/IFwiZXh0cmFzXCIgOiBcImRlY29yYXRvcnNcIl0gfHwgbmV3IFNldCgpKS52YWx1ZXMoKSxcbiAgICAgIC4uLmRlY29yYXRvcnMsXG4gICAgXSk7XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRGVmaW5lcyB0aGUgYmFzZSBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IFNldHMgdGhlIHByaW1hcnkgZGVjb3JhdG9ycyBmb3IgdGhlIGN1cnJlbnQgY29udGV4dFxuICAgKiBAcGFyYW0gZGVjb3JhdG9ycyBEZWNvcmF0b3JzIHRvIGRlZmluZVxuICAgKiBAcmV0dXJuIEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGZpbmlzaGluZyB0aGUgY2hhaW5cbiAgICovXG4gIGRlZmluZShcbiAgICAuLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckVuZCAmIERlY29yYXRpb25CdWlsZGVyQnVpbGQge1xuICAgIHJldHVybiB0aGlzLmRlY29yYXRlKGZhbHNlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gRXh0ZW5kcyBleGlzdGluZyBkZWNvcmF0b3JzXG4gICAqIEBzdW1tYXJ5IEFkZHMgYWRkaXRpb25hbCBkZWNvcmF0b3JzIHRvIHRoZSBjdXJyZW50IGNvbnRleHRcbiAgICogQHBhcmFtIGRlY29yYXRvcnMgQWRkaXRpb25hbCBkZWNvcmF0b3JzXG4gICAqIEByZXR1cm4ge0RlY29yYXRpb25CdWlsZGVyQnVpbGR9IEJ1aWxkZXIgaW5zdGFuY2UgZm9yIGJ1aWxkaW5nIHRoZSBkZWNvcmF0b3JcbiAgICovXG4gIGV4dGVuZChcbiAgICAuLi5kZWNvcmF0b3JzOiAoQ2xhc3NEZWNvcmF0b3IgfCBQcm9wZXJ0eURlY29yYXRvciB8IE1ldGhvZERlY29yYXRvcilbXVxuICApOiBEZWNvcmF0aW9uQnVpbGRlckJ1aWxkIHtcbiAgICByZXR1cm4gdGhpcy5kZWNvcmF0ZSh0cnVlLCAuLi5kZWNvcmF0b3JzKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBkZWNvcmF0b3JGYWN0b3J5KGtleTogc3RyaW5nLCBmOiBzdHJpbmcgPSBEZWZhdWx0Rmxhdm91cikge1xuICAgIGNvbnN0IGNvbnRleHREZWNvcmF0b3IgPSBmdW5jdGlvbiBjb250ZXh0RGVjb3JhdG9yKFxuICAgICAgdGFyZ2V0OiBvYmplY3QsXG4gICAgICBwcm9wZXJ0eUtleT86IGFueSxcbiAgICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICAgKSB7XG4gICAgICBjb25zdCBmbGF2b3VyID0gRGVjb3JhdGlvbi5mbGF2b3VyUmVzb2x2ZXIodGFyZ2V0KTtcbiAgICAgIGxldCBkZWNvcmF0b3JzO1xuICAgICAgY29uc3QgZXh0cmFzID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bZmxhdm91cl0uZXh0cmFzO1xuICAgICAgaWYgKFxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XSAmJlxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSAmJlxuICAgICAgICBEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXS5kZWNvcmF0b3JzXG4gICAgICApIHtcbiAgICAgICAgZGVjb3JhdG9ycyA9IERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkZWNvcmF0b3JzID0gRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV1bRGVmYXVsdEZsYXZvdXJdLmRlY29yYXRvcnM7XG4gICAgICB9XG4gICAgICBbXG4gICAgICAgIC4uLihkZWNvcmF0b3JzID8gZGVjb3JhdG9ycy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgICAgLi4uKGV4dHJhcyA/IGV4dHJhcy52YWx1ZXMoKSA6IFtdKSxcbiAgICAgIF0uZm9yRWFjaCgoZCkgPT4gKGQgYXMgYW55KSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yLCBkZXNjcmlwdG9yKSk7XG4gICAgICAvLyByZXR1cm4gYXBwbHkoXG4gICAgICAvL1xuICAgICAgLy8gKSh0YXJnZXQsIHByb3BlcnR5S2V5LCBkZXNjcmlwdG9yKTtcbiAgICB9O1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjb250ZXh0RGVjb3JhdG9yLCBcIm5hbWVcIiwge1xuICAgICAgdmFsdWU6IFtmLCBrZXldLmpvaW4oXCJfZGVjb3JhdG9yX2Zvcl9cIiksXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbnRleHREZWNvcmF0b3I7XG4gIH1cblxuICAvKipcbiAgICogQGRlc2NyaXB0aW9uIENyZWF0ZXMgdGhlIGZpbmFsIGRlY29yYXRvciBmdW5jdGlvblxuICAgKiBAc3VtbWFyeSBCdWlsZHMgYW5kIHJldHVybnMgdGhlIGRlY29yYXRvciBmYWN0b3J5IGZ1bmN0aW9uXG4gICAqIEByZXR1cm4ge2Z1bmN0aW9uKG9iamVjdCwgYW55PywgVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I/KTogYW55fSBUaGUgZ2VuZXJhdGVkIGRlY29yYXRvciBmdW5jdGlvblxuICAgKi9cbiAgYXBwbHkoKTogKFxuICAgIHRhcmdldDogb2JqZWN0LFxuICAgIHByb3BlcnR5S2V5PzogYW55LFxuICAgIGRlc2NyaXB0b3I/OiBUeXBlZFByb3BlcnR5RGVzY3JpcHRvcjxhbnk+XG4gICkgPT4gYW55IHtcbiAgICBpZiAoIXRoaXMua2V5KVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIERlY29yYXRpb24ucmVnaXN0ZXIodGhpcy5rZXksIHRoaXMuZmxhdm91ciwgdGhpcy5kZWNvcmF0b3JzLCB0aGlzLmV4dHJhcyk7XG4gICAgcmV0dXJuIHRoaXMuZGVjb3JhdG9yRmFjdG9yeSh0aGlzLmtleSwgdGhpcy5mbGF2b3VyKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gUmVnaXN0ZXJzIGRlY29yYXRvcnMgZm9yIGEgc3BlY2lmaWMga2V5IGFuZCBmbGF2b3VyXG4gICAqIEBzdW1tYXJ5IEludGVybmFsIG1ldGhvZCB0byBzdG9yZSBkZWNvcmF0b3JzIGluIHRoZSBzdGF0aWMgcmVnaXN0cnlcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBEZWNvcmF0b3Iga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmbGF2b3VyIERlY29yYXRvciBmbGF2b3VyXG4gICAqIEBwYXJhbSBbZGVjb3JhdG9yc10gUHJpbWFyeSBkZWNvcmF0b3JzXG4gICAqIEBwYXJhbSBbZXh0cmFzXSBBZGRpdGlvbmFsIGRlY29yYXRvcnNcbiAgICovXG4gIHByaXZhdGUgc3RhdGljIHJlZ2lzdGVyKFxuICAgIGtleTogc3RyaW5nLFxuICAgIGZsYXZvdXI6IHN0cmluZyxcbiAgICBkZWNvcmF0b3JzPzogU2V0PENsYXNzRGVjb3JhdG9yIHwgUHJvcGVydHlEZWNvcmF0b3IgfCBNZXRob2REZWNvcmF0b3I+LFxuICAgIGV4dHJhcz86IFNldDxDbGFzc0RlY29yYXRvciB8IFByb3BlcnR5RGVjb3JhdG9yIHwgTWV0aG9kRGVjb3JhdG9yPlxuICApIHtcbiAgICBpZiAoIWtleSkgdGhyb3cgbmV3IEVycm9yKFwiTm8ga2V5IHByb3ZpZGVkIGZvciB0aGUgZGVjb3JhdGlvbiBidWlsZGVyXCIpO1xuICAgIGlmICghZGVjb3JhdG9ycylcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIk5vIGRlY29yYXRvcnMgcHJvdmlkZWQgZm9yIHRoZSBkZWNvcmF0aW9uIGJ1aWxkZXJcIik7XG4gICAgaWYgKCFmbGF2b3VyKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiTm8gZmxhdm91ciBwcm92aWRlZCBmb3IgdGhlIGRlY29yYXRpb24gYnVpbGRlclwiKTtcblxuICAgIGlmICghRGVjb3JhdGlvbi5kZWNvcmF0b3JzW2tleV0pIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldID0ge307XG4gICAgaWYgKCFEZWNvcmF0aW9uLmRlY29yYXRvcnNba2V5XVtmbGF2b3VyXSlcbiAgICAgIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdID0ge307XG4gICAgaWYgKGRlY29yYXRvcnMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmRlY29yYXRvcnMgPSBkZWNvcmF0b3JzO1xuICAgIGlmIChleHRyYXMpIERlY29yYXRpb24uZGVjb3JhdG9yc1trZXldW2ZsYXZvdXJdLmV4dHJhcyA9IGV4dHJhcztcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzY3JpcHRpb24gU2V0cyB0aGUgZ2xvYmFsIGZsYXZvdXIgcmVzb2x2ZXJcbiAgICogQHN1bW1hcnkgQ29uZmlndXJlcyB0aGUgZnVuY3Rpb24gdXNlZCB0byBkZXRlcm1pbmUgZGVjb3JhdG9yIGZsYXZvdXJzXG4gICAqIEBwYXJhbSB7Rmxhdm91clJlc29sdmVyfSByZXNvbHZlciBGdW5jdGlvbiB0byByZXNvbHZlIGZsYXZvdXJzXG4gICAqL1xuICBzdGF0aWMgc2V0Rmxhdm91clJlc29sdmVyKHJlc29sdmVyOiBGbGF2b3VyUmVzb2x2ZXIpIHtcbiAgICBEZWNvcmF0aW9uLmZsYXZvdXJSZXNvbHZlciA9IHJlc29sdmVyO1xuICB9XG5cbiAgc3RhdGljIGZvcihrZXk6IHN0cmluZyk6IERlY29yYXRpb25CdWlsZGVyTWlkIHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oKS5mb3Ioa2V5KTtcbiAgfVxuXG4gIHN0YXRpYyBmbGF2b3VyZWRBcyhmbGF2b3VyOiBzdHJpbmcpOiBEZWNvcmF0aW9uQnVpbGRlclN0YXJ0IHtcbiAgICByZXR1cm4gbmV3IERlY29yYXRpb24oZmxhdm91cik7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
2
|
+
* @description Enum containing metadata keys used for reflection in the model system
|
|
3
|
+
* @summary Defines the various Model keys used for reflection and metadata storage.
|
|
4
|
+
* These keys are used throughout the library to store and retrieve metadata about models,
|
|
5
|
+
* their properties, and their behavior.
|
|
3
6
|
*
|
|
4
|
-
* @property {string} REFLECT
|
|
5
|
-
* @property {string} TYPE type
|
|
6
|
-
* @property {string} PARAMS method
|
|
7
|
-
* @property {string} RETURN method return
|
|
8
|
-
* @property {string} MODEL model
|
|
9
|
-
* @property {string} ANCHOR
|
|
7
|
+
* @property {string} REFLECT - Prefix to all other keys, used as a namespace
|
|
8
|
+
* @property {string} TYPE - Key for storing design type information
|
|
9
|
+
* @property {string} PARAMS - Key for storing method parameter types
|
|
10
|
+
* @property {string} RETURN - Key for storing method return type
|
|
11
|
+
* @property {string} MODEL - Key for identifying model metadata
|
|
12
|
+
* @property {string} ANCHOR - Anchor key that serves as a ghost property in the model
|
|
13
|
+
* @property {string} CONSTRUCTION - Key for storing construction information
|
|
14
|
+
* @property {string} ATTRIBUTE - Key for storing attribute metadata
|
|
15
|
+
* @property {string} HASHING - Key for storing hashing configuration
|
|
16
|
+
* @property {string} SERIALIZATION - Key for storing serialization configuration
|
|
10
17
|
*
|
|
11
|
-
* @
|
|
12
|
-
* @
|
|
18
|
+
* @readonly
|
|
19
|
+
* @enum {string}
|
|
20
|
+
* @memberOf module:decorator-validation
|
|
13
21
|
* @category Model
|
|
14
22
|
*/
|
|
15
23
|
export declare enum ModelKeys {
|
|
@@ -24,3 +32,13 @@ export declare enum ModelKeys {
|
|
|
24
32
|
HASHING = "hashing",
|
|
25
33
|
SERIALIZATION = "serialization"
|
|
26
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* @description Default flavour identifier for the decorator system
|
|
37
|
+
* @summary Defines the default flavour used by the Decoration class when no specific flavour is provided.
|
|
38
|
+
* This constant is used throughout the library as the fallback flavour for decorators.
|
|
39
|
+
*
|
|
40
|
+
* @const {string}
|
|
41
|
+
* @memberOf module:decorator-validation
|
|
42
|
+
* @category Model
|
|
43
|
+
*/
|
|
44
|
+
export declare const DefaultFlavour = "decaf";
|
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @
|
|
2
|
+
* @description Enum containing metadata keys used for reflection in the model system
|
|
3
|
+
* @summary Defines the various Model keys used for reflection and metadata storage.
|
|
4
|
+
* These keys are used throughout the library to store and retrieve metadata about models,
|
|
5
|
+
* their properties, and their behavior.
|
|
3
6
|
*
|
|
4
|
-
* @property {string} REFLECT
|
|
5
|
-
* @property {string} TYPE type
|
|
6
|
-
* @property {string} PARAMS method
|
|
7
|
-
* @property {string} RETURN method return
|
|
8
|
-
* @property {string} MODEL model
|
|
9
|
-
* @property {string} ANCHOR
|
|
7
|
+
* @property {string} REFLECT - Prefix to all other keys, used as a namespace
|
|
8
|
+
* @property {string} TYPE - Key for storing design type information
|
|
9
|
+
* @property {string} PARAMS - Key for storing method parameter types
|
|
10
|
+
* @property {string} RETURN - Key for storing method return type
|
|
11
|
+
* @property {string} MODEL - Key for identifying model metadata
|
|
12
|
+
* @property {string} ANCHOR - Anchor key that serves as a ghost property in the model
|
|
13
|
+
* @property {string} CONSTRUCTION - Key for storing construction information
|
|
14
|
+
* @property {string} ATTRIBUTE - Key for storing attribute metadata
|
|
15
|
+
* @property {string} HASHING - Key for storing hashing configuration
|
|
16
|
+
* @property {string} SERIALIZATION - Key for storing serialization configuration
|
|
10
17
|
*
|
|
11
|
-
* @
|
|
12
|
-
* @
|
|
18
|
+
* @readonly
|
|
19
|
+
* @enum {string}
|
|
20
|
+
* @memberOf module:decorator-validation
|
|
13
21
|
* @category Model
|
|
14
22
|
*/
|
|
15
23
|
export var ModelKeys;
|
|
@@ -25,4 +33,14 @@ export var ModelKeys;
|
|
|
25
33
|
ModelKeys["HASHING"] = "hashing";
|
|
26
34
|
ModelKeys["SERIALIZATION"] = "serialization";
|
|
27
35
|
})(ModelKeys || (ModelKeys = {}));
|
|
28
|
-
|
|
36
|
+
/**
|
|
37
|
+
* @description Default flavour identifier for the decorator system
|
|
38
|
+
* @summary Defines the default flavour used by the Decoration class when no specific flavour is provided.
|
|
39
|
+
* This constant is used throughout the library as the fallback flavour for decorators.
|
|
40
|
+
*
|
|
41
|
+
* @const {string}
|
|
42
|
+
* @memberOf module:decorator-validation
|
|
43
|
+
* @category Model
|
|
44
|
+
*/
|
|
45
|
+
export const DefaultFlavour = "decaf";
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uc3RhbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3V0aWxzL2NvbnN0YW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxDQUFOLElBQVksU0FXWDtBQVhELFdBQVksU0FBUztJQUNuQixxQ0FBd0IsQ0FBQTtJQUN4QixpQ0FBb0IsQ0FBQTtJQUNwQix5Q0FBNEIsQ0FBQTtJQUM1Qix5Q0FBNEIsQ0FBQTtJQUM1Qiw0QkFBZSxDQUFBO0lBQ2YsK0JBQWtCLENBQUE7SUFDbEIsNENBQStCLENBQUE7SUFDL0IsdUNBQTBCLENBQUE7SUFDMUIsZ0NBQW1CLENBQUE7SUFDbkIsNENBQStCLENBQUE7QUFDakMsQ0FBQyxFQVhXLFNBQVMsS0FBVCxTQUFTLFFBV3BCO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAZGVzY3JpcHRpb24gRW51bSBjb250YWluaW5nIG1ldGFkYXRhIGtleXMgdXNlZCBmb3IgcmVmbGVjdGlvbiBpbiB0aGUgbW9kZWwgc3lzdGVtXG4gKiBAc3VtbWFyeSBEZWZpbmVzIHRoZSB2YXJpb3VzIE1vZGVsIGtleXMgdXNlZCBmb3IgcmVmbGVjdGlvbiBhbmQgbWV0YWRhdGEgc3RvcmFnZS5cbiAqIFRoZXNlIGtleXMgYXJlIHVzZWQgdGhyb3VnaG91dCB0aGUgbGlicmFyeSB0byBzdG9yZSBhbmQgcmV0cmlldmUgbWV0YWRhdGEgYWJvdXQgbW9kZWxzLFxuICogdGhlaXIgcHJvcGVydGllcywgYW5kIHRoZWlyIGJlaGF2aW9yLlxuICpcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBSRUZMRUNUIC0gUHJlZml4IHRvIGFsbCBvdGhlciBrZXlzLCB1c2VkIGFzIGEgbmFtZXNwYWNlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSAtIEtleSBmb3Igc3RvcmluZyBkZXNpZ24gdHlwZSBpbmZvcm1hdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBUkFNUyAtIEtleSBmb3Igc3RvcmluZyBtZXRob2QgcGFyYW1ldGVyIHR5cGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gUkVUVVJOIC0gS2V5IGZvciBzdG9yaW5nIG1ldGhvZCByZXR1cm4gdHlwZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMIC0gS2V5IGZvciBpZGVudGlmeWluZyBtb2RlbCBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFOQ0hPUiAtIEFuY2hvciBrZXkgdGhhdCBzZXJ2ZXMgYXMgYSBnaG9zdCBwcm9wZXJ0eSBpbiB0aGUgbW9kZWxcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBDT05TVFJVQ1RJT04gLSBLZXkgZm9yIHN0b3JpbmcgY29uc3RydWN0aW9uIGluZm9ybWF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gQVRUUklCVVRFIC0gS2V5IGZvciBzdG9yaW5nIGF0dHJpYnV0ZSBtZXRhZGF0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhBU0hJTkcgLSBLZXkgZm9yIHN0b3JpbmcgaGFzaGluZyBjb25maWd1cmF0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gU0VSSUFMSVpBVElPTiAtIEtleSBmb3Igc3RvcmluZyBzZXJpYWxpemF0aW9uIGNvbmZpZ3VyYXRpb25cbiAqXG4gKiBAcmVhZG9ubHlcbiAqIEBlbnVtIHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGVudW0gTW9kZWxLZXlzIHtcbiAgUkVGTEVDVCA9IFwiZGVjYWYubW9kZWwuXCIsXG4gIFRZUEUgPSBcImRlc2lnbjp0eXBlXCIsXG4gIFBBUkFNUyA9IFwiZGVzaWduOnBhcmFtdHlwZXNcIixcbiAgUkVUVVJOID0gXCJkZXNpZ246cmV0dXJudHlwZVwiLFxuICBNT0RFTCA9IFwibW9kZWxcIixcbiAgQU5DSE9SID0gXCJfX21vZGVsXCIsXG4gIENPTlNUUlVDVElPTiA9IFwiY29uc3RydWN0ZWQtYnlcIixcbiAgQVRUUklCVVRFID0gXCJfX2F0dHJpYnV0ZXNcIixcbiAgSEFTSElORyA9IFwiaGFzaGluZ1wiLFxuICBTRVJJQUxJWkFUSU9OID0gXCJzZXJpYWxpemF0aW9uXCIsXG59XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uIERlZmF1bHQgZmxhdm91ciBpZGVudGlmaWVyIGZvciB0aGUgZGVjb3JhdG9yIHN5c3RlbVxuICogQHN1bW1hcnkgRGVmaW5lcyB0aGUgZGVmYXVsdCBmbGF2b3VyIHVzZWQgYnkgdGhlIERlY29yYXRpb24gY2xhc3Mgd2hlbiBubyBzcGVjaWZpYyBmbGF2b3VyIGlzIHByb3ZpZGVkLlxuICogVGhpcyBjb25zdGFudCBpcyB1c2VkIHRocm91Z2hvdXQgdGhlIGxpYnJhcnkgYXMgdGhlIGZhbGxiYWNrIGZsYXZvdXIgZm9yIGRlY29yYXRvcnMuXG4gKlxuICogQGNvbnN0IHtzdHJpbmd9XG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGNvbnN0IERlZmF1bHRGbGF2b3VyID0gXCJkZWNhZlwiO1xuIl19
|
package/lib/esm/utils/dates.d.ts
CHANGED
|
@@ -7,22 +7,32 @@ import "reflect-metadata";
|
|
|
7
7
|
* @return {Date} the date from the format or the standard new Date({@prop date}) if the string couldn't be parsed (are you sure the format matches the string?)
|
|
8
8
|
*
|
|
9
9
|
* @function dateFromFormat
|
|
10
|
-
* @memberOf module:decorator-validation
|
|
11
|
-
* @category
|
|
10
|
+
* @memberOf module:decorator-validation
|
|
11
|
+
* @category Model
|
|
12
12
|
*/
|
|
13
13
|
export declare function dateFromFormat(date: string, format: string): Date;
|
|
14
14
|
/**
|
|
15
|
-
* @
|
|
16
|
-
* @
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
* @
|
|
15
|
+
* @description Binds a specific date format to a Date object's toString and toISOString methods
|
|
16
|
+
* @summary Modifies a Date object to return a formatted string when toString or toISOString is called.
|
|
17
|
+
* This function overrides the default toString and toISOString methods of the Date object to return
|
|
18
|
+
* the date formatted according to the specified format string.
|
|
19
|
+
* @param {Date} [date] The Date object to modify
|
|
20
|
+
* @param {string} [format] The format string to use for formatting the date
|
|
21
|
+
* @return {Date|undefined} The modified Date object or undefined if no date was provided
|
|
22
|
+
* @function bindDateToString
|
|
23
|
+
* @memberOf module:decorator-validation
|
|
24
|
+
* @category Model
|
|
20
25
|
*/
|
|
21
26
|
export declare function bindDateToString(date: Date | undefined, format: string): Date | undefined;
|
|
22
27
|
/**
|
|
23
|
-
* @
|
|
24
|
-
* @
|
|
25
|
-
*
|
|
28
|
+
* @description Safely checks if a value is a valid Date object
|
|
29
|
+
* @summary A utility function that determines if a value is a valid Date object.
|
|
30
|
+
* This function is more reliable than using instanceof Date as it also checks
|
|
31
|
+
* that the date is not NaN, which can happen with invalid date strings.
|
|
32
|
+
* @param {any} date The value to check
|
|
33
|
+
* @return {boolean} True if the value is a valid Date object, false otherwise
|
|
34
|
+
* @function isValidDate
|
|
35
|
+
* @memberOf module:decorator-validation
|
|
26
36
|
* @category Validation
|
|
27
37
|
*/
|
|
28
38
|
export declare function isValidDate(date: any): boolean;
|
|
@@ -33,8 +43,8 @@ export declare function isValidDate(date: any): boolean;
|
|
|
33
43
|
* @return {string}
|
|
34
44
|
*
|
|
35
45
|
* @function twoDigitPad
|
|
36
|
-
* @memberOf module:decorator-validation
|
|
37
|
-
* @category
|
|
46
|
+
* @memberOf module:decorator-validation
|
|
47
|
+
* @category Model
|
|
38
48
|
*/
|
|
39
49
|
export declare function twoDigitPad(num: number): string;
|
|
40
50
|
/**
|
|
@@ -62,15 +72,15 @@ export declare function twoDigitPad(num: number): string;
|
|
|
62
72
|
* @return {string} the formatted date
|
|
63
73
|
*
|
|
64
74
|
* @function formatDate
|
|
65
|
-
* @memberOf module:decorator-validation
|
|
66
|
-
* @category
|
|
75
|
+
* @memberOf module:decorator-validation
|
|
76
|
+
* @category Model
|
|
67
77
|
*/
|
|
68
78
|
export declare function formatDate(date: Date, patternStr?: string): string;
|
|
69
79
|
/**
|
|
70
80
|
* @summary Parses a date from a specified format
|
|
71
81
|
* @param {string} format
|
|
72
82
|
* @param {string | Date | number} [v]
|
|
73
|
-
* @memberOf module:decorator-validation
|
|
74
|
-
* @category
|
|
83
|
+
* @memberOf module:decorator-validation
|
|
84
|
+
* @category Model
|
|
75
85
|
*/
|
|
76
86
|
export declare function parseDate(format: string, v?: string | Date | number): Date | undefined;
|
package/lib/esm/utils/dates.js
CHANGED
|
@@ -9,8 +9,8 @@ import { sf } from "./strings";
|
|
|
9
9
|
* @return {Date} the date from the format or the standard new Date({@prop date}) if the string couldn't be parsed (are you sure the format matches the string?)
|
|
10
10
|
*
|
|
11
11
|
* @function dateFromFormat
|
|
12
|
-
* @memberOf module:decorator-validation
|
|
13
|
-
* @category
|
|
12
|
+
* @memberOf module:decorator-validation
|
|
13
|
+
* @category Model
|
|
14
14
|
*/
|
|
15
15
|
export function dateFromFormat(date, format) {
|
|
16
16
|
let formatRegexp = format;
|
|
@@ -97,11 +97,16 @@ export function dateFromFormat(date, format) {
|
|
|
97
97
|
return new Date(year, month - 1, day, hour, minutes, seconds, ms);
|
|
98
98
|
}
|
|
99
99
|
/**
|
|
100
|
-
* @
|
|
101
|
-
* @
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* @
|
|
100
|
+
* @description Binds a specific date format to a Date object's toString and toISOString methods
|
|
101
|
+
* @summary Modifies a Date object to return a formatted string when toString or toISOString is called.
|
|
102
|
+
* This function overrides the default toString and toISOString methods of the Date object to return
|
|
103
|
+
* the date formatted according to the specified format string.
|
|
104
|
+
* @param {Date} [date] The Date object to modify
|
|
105
|
+
* @param {string} [format] The format string to use for formatting the date
|
|
106
|
+
* @return {Date|undefined} The modified Date object or undefined if no date was provided
|
|
107
|
+
* @function bindDateToString
|
|
108
|
+
* @memberOf module:decorator-validation
|
|
109
|
+
* @category Model
|
|
105
110
|
*/
|
|
106
111
|
export function bindDateToString(date, format) {
|
|
107
112
|
if (!date)
|
|
@@ -121,9 +126,14 @@ export function bindDateToString(date, format) {
|
|
|
121
126
|
return date;
|
|
122
127
|
}
|
|
123
128
|
/**
|
|
124
|
-
* @
|
|
125
|
-
* @
|
|
126
|
-
*
|
|
129
|
+
* @description Safely checks if a value is a valid Date object
|
|
130
|
+
* @summary A utility function that determines if a value is a valid Date object.
|
|
131
|
+
* This function is more reliable than using instanceof Date as it also checks
|
|
132
|
+
* that the date is not NaN, which can happen with invalid date strings.
|
|
133
|
+
* @param {any} date The value to check
|
|
134
|
+
* @return {boolean} True if the value is a valid Date object, false otherwise
|
|
135
|
+
* @function isValidDate
|
|
136
|
+
* @memberOf module:decorator-validation
|
|
127
137
|
* @category Validation
|
|
128
138
|
*/
|
|
129
139
|
export function isValidDate(date) {
|
|
@@ -138,8 +148,8 @@ export function isValidDate(date) {
|
|
|
138
148
|
* @return {string}
|
|
139
149
|
*
|
|
140
150
|
* @function twoDigitPad
|
|
141
|
-
* @memberOf module:decorator-validation
|
|
142
|
-
* @category
|
|
151
|
+
* @memberOf module:decorator-validation
|
|
152
|
+
* @category Model
|
|
143
153
|
*/
|
|
144
154
|
export function twoDigitPad(num) {
|
|
145
155
|
return num < 10 ? "0" + num : num.toString();
|
|
@@ -169,8 +179,8 @@ export function twoDigitPad(num) {
|
|
|
169
179
|
* @return {string} the formatted date
|
|
170
180
|
*
|
|
171
181
|
* @function formatDate
|
|
172
|
-
* @memberOf module:decorator-validation
|
|
173
|
-
* @category
|
|
182
|
+
* @memberOf module:decorator-validation
|
|
183
|
+
* @category Model
|
|
174
184
|
*/
|
|
175
185
|
export function formatDate(date, patternStr = "yyyy/MM/dd") {
|
|
176
186
|
const day = date.getDate(), month = date.getMonth(), year = date.getFullYear(), hour = date.getHours(), minute = date.getMinutes(), second = date.getSeconds(), miliseconds = date.getMilliseconds(), h = hour % 12, hh = twoDigitPad(h), HH = twoDigitPad(hour), mm = twoDigitPad(minute), ss = twoDigitPad(second), aaa = hour < 12 ? "AM" : "PM", EEEE = DAYS_OF_WEEK_NAMES[date.getDay()], EEE = EEEE.substr(0, 3), dd = twoDigitPad(day), M = month + 1, MM = twoDigitPad(M), MMMM = MONTH_NAMES[month], MMM = MMMM.substr(0, 3), yyyy = year + "", yy = yyyy.substr(2, 2);
|
|
@@ -204,8 +214,8 @@ export function formatDate(date, patternStr = "yyyy/MM/dd") {
|
|
|
204
214
|
* @summary Parses a date from a specified format
|
|
205
215
|
* @param {string} format
|
|
206
216
|
* @param {string | Date | number} [v]
|
|
207
|
-
* @memberOf module:decorator-validation
|
|
208
|
-
* @category
|
|
217
|
+
* @memberOf module:decorator-validation
|
|
218
|
+
* @category Model
|
|
209
219
|
*/
|
|
210
220
|
export function parseDate(format, v) {
|
|
211
221
|
let value = undefined;
|
|
@@ -241,4 +251,4 @@ export function parseDate(format, v) {
|
|
|
241
251
|
}
|
|
242
252
|
return bindDateToString(value, format);
|
|
243
253
|
}
|
|
244
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFdBQVcsR0FDWixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBWSxFQUFFLE1BQWM7SUFDekQsSUFBSSxZQUFZLEdBQVcsTUFBTSxDQUFDO0lBRWxDLE9BQU87SUFDUCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQzFELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7U0FDM0QsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUMxRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzlCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRWhFLFVBQVU7SUFDVixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1NBQzdELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENB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QUFDLENBQUMsSUFBSSxFQUNyQyxJQUFJLEdBQVcsa0JBQWtCLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQ2hELEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDL0IsRUFBRSxHQUFXLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFDN0IsQ0FBQyxHQUFXLEtBQUssR0FBRyxDQUFDLEVBQ3JCLEVBQUUsR0FBVyxXQUFXLENBQUMsQ0FBQyxDQUFDLEVBQzNCLElBQUksR0FBVyxXQUFXLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDL0IsSUFBSSxHQUFXLElBQUksR0FBRyxFQUFFLEVBQ3hCLEVBQUUsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQywyQ0FBMkM7SUFDM0MsVUFBVSxHQUFHLFVBQVU7U0FDcEIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDN0IsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0IsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDcEMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7U0FFNUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDckIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDbkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRSxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLFNBQVMsQ0FBQyxNQUFjLEVBQUUsQ0FBMEI7SUFDbEUsSUFBSSxLQUFLLEdBQXFCLFNBQVMsQ0FBQztJQUV4QyxJQUFJLENBQUMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRXpCLElBQUksQ0FBQyxZQUFZLElBQUk7UUFDbkIsSUFBSSxDQUFDO1lBQ0gsS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBUyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQzlELDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFNLEVBQUUsQ0FBQztZQUNoQixNQUFNLElBQUksS0FBSyxDQUNiLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQ3RFLENBQUM7UUFDSixDQUFDO1NBQ0UsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUMvQixLQUFLLEdBQUcsY0FBYyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO1NBQU0sSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxNQUFNLENBQUMsR0FBRyxJQUFJLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUN0QixLQUFLLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDeEQsQ0FBQztTQUFNLElBQUksV0FBVyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7UUFDMUIsSUFBSSxDQUFDO1lBQ0gsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDdEIsS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO1lBQ3RELDZEQUE2RDtRQUMvRCxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE1BQU0sSUFBSSxLQUFLLENBQ2IsRUFBRSxDQUFDLDJDQUEyQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDM0QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEQVlTX09GX1dFRUtfTkFNRVMsXG4gIE1PTlRIX05BTUVTLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV2ZXJzZXMgdGhlIHByb2Nlc3MgZnJvbSB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZSB0aGUgZGF0ZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIGJhY2sgaW50byBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IHRoZSBkYXRlIGZvcm1hdFxuICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUgZnJvbSB0aGUgZm9ybWF0IG9yIHRoZSBzdGFuZGFyZCBuZXcgRGF0ZSh7QHByb3AgZGF0ZX0pIGlmIHRoZSBzdHJpbmcgY291bGRuJ3QgYmUgcGFyc2VkIChhcmUgeW91IHN1cmUgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBzdHJpbmc/KVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Gb3JtYXQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZykge1xuICBsZXQgZm9ybWF0UmVnZXhwOiBzdHJpbmcgPSBmb3JtYXQ7XG5cbiAgLy8gSG91clxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaGhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ISC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSEhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJIXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaW51dGVzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL21tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtbVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL20vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIFNlY29uZHNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvc3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic1wiLCBcIig/PHNlY29uZHM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2RkLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkZFwiLCBcIig/PGRheT5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZFwiLCBcIig/PGRheT5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXkgT2YgV2Vla1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWVsc2UtaWZcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcblxuICAvLyBZZWFyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5eXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5eXlcIiwgXCIoPzx5ZWFyPlxcXFxkezR9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXlcIiwgXCIoPzx5ZWFyPlxcXFxkezJ9KVwiKTtcblxuICAvLyBNb250aFxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1NXCIsIFwiKD88bW9udGhuYW1lPlxcXFx3KylcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1cIiwgXCIoPzxtb250aG5hbWVzbWFsbD5cXFxcdyspXCIpO1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1cIiwgXCIoPzxtb250aD5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTVwiLCBcIig/PG1vbnRoPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbGlzIGFuZCBBbSBQbVxuICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHBcbiAgICAucmVwbGFjZShcIlNcIiwgXCIoPzxtaWxpcz5cXFxcZHsxLDN9KVwiKVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIFwiKD88YW1wbT5cXFxcd3syfSlcIik7XG5cbiAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChmb3JtYXRSZWdleHAsIFwiZ1wiKTtcblxuICBjb25zdCBtYXRjaDoge1xuICAgIGdyb3Vwczoge1xuICAgICAgeWVhcj86IHN0cmluZztcbiAgICAgIGRheT86IHN0cmluZztcbiAgICAgIGFtcG0/OiBzdHJpbmc7XG4gICAgICBob3VyPzogc3RyaW5nO1xuICAgICAgbWludXRlcz86IHN0cmluZztcbiAgICAgIHNlY29uZHM/OiBzdHJpbmc7XG4gICAgICBtaWxpcz86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZT86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZXNtYWxsPzogc3RyaW5nO1xuICAgICAgbW9udGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSA9IHJlZ2V4cC5leGVjKGRhdGUpIGFzIGFueTtcblxuICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5ncm91cHMpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblxuICBjb25zdCBzYWZlUGFyc2VJbnQgPSBmdW5jdGlvbiAobj86IHN0cmluZykge1xuICAgIGlmICghbikgcmV0dXJuIDA7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VJbnQobik7XG5cbiAgICByZXR1cm4gaXNOYU4ocmVzdWx0KSA/IDAgOiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgeWVhciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMueWVhcik7XG4gIGNvbnN0IGRheSA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuZGF5KTtcblxuICBjb25zdCBhbVBtID0gbWF0Y2guZ3JvdXBzLmFtcG07XG4gIGxldCBob3VyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5ob3VyKTtcblxuICBpZiAoYW1QbSkgaG91ciA9IGFtUG0gPT09IFwiUE1cIiA/IGhvdXIgKyAxMiA6IGhvdXI7XG5cbiAgY29uc3QgbWludXRlcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWludXRlcyk7XG4gIGNvbnN0IHNlY29uZHMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnNlY29uZHMpO1xuICBjb25zdCBtcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWlsaXMpO1xuXG4gIGNvbnN0IG1vbnRoTmFtZSA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWU7XG4gIGNvbnN0IG1vbnRoTmFtZVNtYWxsID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZXNtYWxsO1xuICBsZXQgbW9udGg6IG51bWJlciB8IHN0cmluZyA9IG1hdGNoLmdyb3Vwcy5tb250aCBhcyBzdHJpbmc7XG4gIGlmIChtb250aE5hbWUpIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtb250aE5hbWUpO1xuICBlbHNlIGlmIChtb250aE5hbWVTbWFsbCkge1xuICAgIGNvbnN0IG0gPSBNT05USF9OQU1FUy5maW5kKChtKSA9PlxuICAgICAgbS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobW9udGhOYW1lU21hbGwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGlmICghbSkgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtKTtcbiAgfSBlbHNlIG1vbnRoID0gc2FmZVBhcnNlSW50KGAke21vbnRofWApO1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlcywgc2Vjb25kcywgbXMpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJpbmRzIGEgZGF0ZSBmb3JtYXQgdG8gYSBzdHJpbmdcbiAqIEBwYXJhbSB7RGF0ZX0gW2RhdGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nKGRhdGU6IERhdGUgfCB1bmRlZmluZWQsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGlmICghZGF0ZSkgcmV0dXJuO1xuICBjb25zdCBmdW5jID0gKCkgPT4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgXCJ0b0lTT1N0cmluZ1wiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuYyxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgLy8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGRhdGUsIERhdGUucHJvdG90eXBlKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBpbnN0YW5jZU9mIERhdGVcbiAqIEBwYXJhbSBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZGF0ZSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIgJiZcbiAgICAhTnVtYmVyLmlzTmFOKGRhdGUpXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwYWQgbnVtYmVyc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqXG4gKiBAZnVuY3Rpb24gdHdvRGlnaXRQYWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBwYXR0ZXJuU3RyOiBzdHJpbmcgPSBcInl5eXkvTU0vZGRcIikge1xuICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpLFxuICAgIG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldE1vbnRoKCksXG4gICAgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGhvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICBtaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpLFxuICAgIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgbWlsaXNlY29uZHM6IG51bWJlciA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgaDogbnVtYmVyID0gaG91ciAlIDEyLFxuICAgIGhoOiBzdHJpbmcgPSB0d29EaWdpdFBhZChoKSxcbiAgICBISDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaG91ciksXG4gICAgbW06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKG1pbnV0ZSksXG4gICAgc3M6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKHNlY29uZCksXG4gICAgYWFhOiBzdHJpbmcgPSBob3VyIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCIsXG4gICAgRUVFRTogc3RyaW5nID0gREFZU19PRl9XRUVLX05BTUVTW2RhdGUuZ2V0RGF5KCldLFxuICAgIEVFRTogc3RyaW5nID0gRUVFRS5zdWJzdHIoMCwgMyksXG4gICAgZGQ6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGRheSksXG4gICAgTTogbnVtYmVyID0gbW9udGggKyAxLFxuICAgIE1NOiBzdHJpbmcgPSB0d29EaWdpdFBhZChNKSxcbiAgICBNTU1NOiBzdHJpbmcgPSBNT05USF9OQU1FU1ttb250aF0sXG4gICAgTU1NOiBzdHJpbmcgPSBNTU1NLnN1YnN0cigwLCAzKSxcbiAgICB5eXl5OiBzdHJpbmcgPSB5ZWFyICsgXCJcIixcbiAgICB5eTogc3RyaW5nID0geXl5eS5zdWJzdHIoMiwgMik7XG4gIC8vIGNoZWNrcyB0byBzZWUgaWYgbW9udGggbmFtZSB3aWxsIGJlIHVzZWRcbiAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHJcbiAgICAucmVwbGFjZShcImhoXCIsIGhoKVxuICAgIC5yZXBsYWNlKFwiaFwiLCBoLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJISFwiLCBISClcbiAgICAucmVwbGFjZShcIkhcIiwgaG91ci50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwibW1cIiwgbW0pXG4gICAgLnJlcGxhY2UoXCJtXCIsIG1pbnV0ZS50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwic3NcIiwgc3MpXG4gICAgLnJlcGxhY2UoXCJzXCIsIHNlY29uZC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiU1wiLCBtaWxpc2Vjb25kcy50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiZGRcIiwgZGQpXG4gICAgLnJlcGxhY2UoXCJkXCIsIGRheS50b1N0cmluZygpKVxuXG4gICAgLnJlcGxhY2UoXCJFRUVFXCIsIEVFRUUpXG4gICAgLnJlcGxhY2UoXCJFRUVcIiwgRUVFKVxuICAgIC5yZXBsYWNlKFwieXl5eVwiLCB5eXl5KVxuICAgIC5yZXBsYWNlKFwieXlcIiwgeXkpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgYWFhKTtcbiAgaWYgKHBhdHRlcm5TdHIuaW5kZXhPZihcIk1NTVwiKSA+IC0xKSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NTU1cIiwgTU1NTSkucmVwbGFjZShcIk1NTVwiLCBNTU0pO1xuICB9IGVsc2Uge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTVwiLCBNTSkucmVwbGFjZShcIk1cIiwgTS50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gcGF0dGVyblN0cjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXJzZXMgYSBkYXRlIGZyb20gYSBzcGVjaWZpZWQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZyB8IERhdGUgfCBudW1iZXJ9IFt2XVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGZvcm1hdDogc3RyaW5nLCB2Pzogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKHYgYXMgRGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LnRvU3RyaW5nKCksIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQodiwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkRGF0ZSh2KSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdiwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkICR7dn1gKTtcbiAgfVxuICByZXR1cm4gYmluZERhdGVUb1N0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbn1cbiJdfQ==
|
|
254
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvdXRpbHMvZGF0ZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxrQkFBa0IsQ0FBQztBQUMxQixPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLFdBQVcsR0FDWixNQUFNLG9DQUFvQyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFFL0I7Ozs7Ozs7Ozs7R0FVRztBQUNILE1BQU0sVUFBVSxjQUFjLENBQUMsSUFBWSxFQUFFLE1BQWM7SUFDekQsSUFBSSxZQUFZLEdBQVcsTUFBTSxDQUFDO0lBRWxDLE9BQU87SUFDUCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1NBQzFELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUM7UUFDOUIsWUFBWSxHQUFHLFlBQVksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLG1CQUFtQixDQUFDLENBQUM7U0FDM0QsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQztRQUMvQixZQUFZLEdBQUcsWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztTQUMxRCxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO1FBQzlCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBRWhFLFVBQVU7SUFDVixJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDO1FBQzFCLFlBQVksR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO1NBQzdELElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxHQUFHLENB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QUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUN0RSxDQUFDO1FBQ0osQ0FBQztTQUNFLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0IsS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN0RCw2REFBNkQ7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUNiLEVBQUUsQ0FBQywyQ0FBMkMsRUFBRSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQzNELENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztTQUFNLENBQUM7UUFDTixNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixDQUFDLEVBQUUsQ0FBQyxDQUFDO0lBQ2pELENBQUM7SUFDRCxPQUFPLGdCQUFnQixDQUFDLEtBQUssRUFBRSxNQUFNLENBQUMsQ0FBQztBQUN6QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IFwicmVmbGVjdC1tZXRhZGF0YVwiO1xuaW1wb3J0IHtcbiAgREFZU19PRl9XRUVLX05BTUVTLFxuICBNT05USF9OQU1FUyxcbn0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdG9ycy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4vc3RyaW5nc1wiO1xuXG4vKipcbiAqIEBzdW1tYXJ5IFJldmVyc2VzIHRoZSBwcm9jZXNzIGZyb20ge0BsaW5rIGZvcm1hdERhdGV9XG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGRhdGUgdGhlIGRhdGUgc3RyaW5nIHRvIGJlIGNvbnZlcnRlZCBiYWNrIGludG8gZGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdCB0aGUgZGF0ZSBmb3JtYXRcbiAqIEByZXR1cm4ge0RhdGV9IHRoZSBkYXRlIGZyb20gdGhlIGZvcm1hdCBvciB0aGUgc3RhbmRhcmQgbmV3IERhdGUoe0Bwcm9wIGRhdGV9KSBpZiB0aGUgc3RyaW5nIGNvdWxkbid0IGJlIHBhcnNlZCAoYXJlIHlvdSBzdXJlIHRoZSBmb3JtYXQgbWF0Y2hlcyB0aGUgc3RyaW5nPylcbiAqXG4gKiBAZnVuY3Rpb24gZGF0ZUZyb21Gb3JtYXRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Gb3JtYXQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZykge1xuICBsZXQgZm9ybWF0UmVnZXhwOiBzdHJpbmcgPSBmb3JtYXQ7XG5cbiAgLy8gSG91clxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaGhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ISC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSEhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJIXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaW51dGVzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL21tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtbVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL20vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIFNlY29uZHNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvc3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic1wiLCBcIig/PHNlY29uZHM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2RkLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkZFwiLCBcIig/PGRheT5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZFwiLCBcIig/PGRheT5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXkgT2YgV2Vla1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWVsc2UtaWZcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcblxuICAvLyBZZWFyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5eXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5eXlcIiwgXCIoPzx5ZWFyPlxcXFxkezR9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXlcIiwgXCIoPzx5ZWFyPlxcXFxkezJ9KVwiKTtcblxuICAvLyBNb250aFxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1NXCIsIFwiKD88bW9udGhuYW1lPlxcXFx3KylcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1cIiwgXCIoPzxtb250aG5hbWVzbWFsbD5cXFxcdyspXCIpO1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1cIiwgXCIoPzxtb250aD5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTVwiLCBcIig/PG1vbnRoPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbGlzIGFuZCBBbSBQbVxuICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHBcbiAgICAucmVwbGFjZShcIlNcIiwgXCIoPzxtaWxpcz5cXFxcZHsxLDN9KVwiKVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIFwiKD88YW1wbT5cXFxcd3syfSlcIik7XG5cbiAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChmb3JtYXRSZWdleHAsIFwiZ1wiKTtcblxuICBjb25zdCBtYXRjaDoge1xuICAgIGdyb3Vwczoge1xuICAgICAgeWVhcj86IHN0cmluZztcbiAgICAgIGRheT86IHN0cmluZztcbiAgICAgIGFtcG0/OiBzdHJpbmc7XG4gICAgICBob3VyPzogc3RyaW5nO1xuICAgICAgbWludXRlcz86IHN0cmluZztcbiAgICAgIHNlY29uZHM/OiBzdHJpbmc7XG4gICAgICBtaWxpcz86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZT86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZXNtYWxsPzogc3RyaW5nO1xuICAgICAgbW9udGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSA9IHJlZ2V4cC5leGVjKGRhdGUpIGFzIGFueTtcblxuICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5ncm91cHMpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblxuICBjb25zdCBzYWZlUGFyc2VJbnQgPSBmdW5jdGlvbiAobj86IHN0cmluZykge1xuICAgIGlmICghbikgcmV0dXJuIDA7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VJbnQobik7XG5cbiAgICByZXR1cm4gaXNOYU4ocmVzdWx0KSA/IDAgOiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgeWVhciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMueWVhcik7XG4gIGNvbnN0IGRheSA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuZGF5KTtcblxuICBjb25zdCBhbVBtID0gbWF0Y2guZ3JvdXBzLmFtcG07XG4gIGxldCBob3VyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5ob3VyKTtcblxuICBpZiAoYW1QbSkgaG91ciA9IGFtUG0gPT09IFwiUE1cIiA/IGhvdXIgKyAxMiA6IGhvdXI7XG5cbiAgY29uc3QgbWludXRlcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWludXRlcyk7XG4gIGNvbnN0IHNlY29uZHMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnNlY29uZHMpO1xuICBjb25zdCBtcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWlsaXMpO1xuXG4gIGNvbnN0IG1vbnRoTmFtZSA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWU7XG4gIGNvbnN0IG1vbnRoTmFtZVNtYWxsID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZXNtYWxsO1xuICBsZXQgbW9udGg6IG51bWJlciB8IHN0cmluZyA9IG1hdGNoLmdyb3Vwcy5tb250aCBhcyBzdHJpbmc7XG4gIGlmIChtb250aE5hbWUpIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtb250aE5hbWUpO1xuICBlbHNlIGlmIChtb250aE5hbWVTbWFsbCkge1xuICAgIGNvbnN0IG0gPSBNT05USF9OQU1FUy5maW5kKChtKSA9PlxuICAgICAgbS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobW9udGhOYW1lU21hbGwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGlmICghbSkgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtKTtcbiAgfSBlbHNlIG1vbnRoID0gc2FmZVBhcnNlSW50KGAke21vbnRofWApO1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlcywgc2Vjb25kcywgbXMpO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBCaW5kcyBhIHNwZWNpZmljIGRhdGUgZm9ybWF0IHRvIGEgRGF0ZSBvYmplY3QncyB0b1N0cmluZyBhbmQgdG9JU09TdHJpbmcgbWV0aG9kc1xuICogQHN1bW1hcnkgTW9kaWZpZXMgYSBEYXRlIG9iamVjdCB0byByZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIHdoZW4gdG9TdHJpbmcgb3IgdG9JU09TdHJpbmcgaXMgY2FsbGVkLlxuICogVGhpcyBmdW5jdGlvbiBvdmVycmlkZXMgdGhlIGRlZmF1bHQgdG9TdHJpbmcgYW5kIHRvSVNPU3RyaW5nIG1ldGhvZHMgb2YgdGhlIERhdGUgb2JqZWN0IHRvIHJldHVyblxuICogdGhlIGRhdGUgZm9ybWF0dGVkIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGZvcm1hdCBzdHJpbmcuXG4gKiBAcGFyYW0ge0RhdGV9IFtkYXRlXSBUaGUgRGF0ZSBvYmplY3QgdG8gbW9kaWZ5XG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF0gVGhlIGZvcm1hdCBzdHJpbmcgdG8gdXNlIGZvciBmb3JtYXR0aW5nIHRoZSBkYXRlXG4gKiBAcmV0dXJuIHtEYXRlfHVuZGVmaW5lZH0gVGhlIG1vZGlmaWVkIERhdGUgb2JqZWN0IG9yIHVuZGVmaW5lZCBpZiBubyBkYXRlIHdhcyBwcm92aWRlZFxuICogQGZ1bmN0aW9uIGJpbmREYXRlVG9TdHJpbmdcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gYmluZERhdGVUb1N0cmluZyhkYXRlOiBEYXRlIHwgdW5kZWZpbmVkLCBmb3JtYXQ6IHN0cmluZykge1xuICBpZiAoIWRhdGUpIHJldHVybjtcbiAgY29uc3QgZnVuYyA9ICgpID0+IGZvcm1hdERhdGUoZGF0ZSwgZm9ybWF0KTtcbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGRhdGUsIFwidG9JU09TdHJpbmdcIiwge1xuICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgdmFsdWU6IGZ1bmMsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgXCJ0b1N0cmluZ1wiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuYyxcbiAgfSk7XG4gIC8vIE9iamVjdC5zZXRQcm90b3R5cGVPZihkYXRlLCBEYXRlLnByb3RvdHlwZSk7XG4gIHJldHVybiBkYXRlO1xufVxuXG4vKipcbiAqIEBkZXNjcmlwdGlvbiBTYWZlbHkgY2hlY2tzIGlmIGEgdmFsdWUgaXMgYSB2YWxpZCBEYXRlIG9iamVjdFxuICogQHN1bW1hcnkgQSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgZGV0ZXJtaW5lcyBpZiBhIHZhbHVlIGlzIGEgdmFsaWQgRGF0ZSBvYmplY3QuXG4gKiBUaGlzIGZ1bmN0aW9uIGlzIG1vcmUgcmVsaWFibGUgdGhhbiB1c2luZyBpbnN0YW5jZW9mIERhdGUgYXMgaXQgYWxzbyBjaGVja3NcbiAqIHRoYXQgdGhlIGRhdGUgaXMgbm90IE5hTiwgd2hpY2ggY2FuIGhhcHBlbiB3aXRoIGludmFsaWQgZGF0ZSBzdHJpbmdzLlxuICogQHBhcmFtIHthbnl9IGRhdGUgVGhlIHZhbHVlIHRvIGNoZWNrXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyBhIHZhbGlkIERhdGUgb2JqZWN0LCBmYWxzZSBvdGhlcndpc2VcbiAqIEBmdW5jdGlvbiBpc1ZhbGlkRGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVmFsaWREYXRlKGRhdGU6IGFueSk6IGJvb2xlYW4ge1xuICByZXR1cm4gKFxuICAgIGRhdGUgJiZcbiAgICBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZGF0ZSkgPT09IFwiW29iamVjdCBEYXRlXVwiICYmXG4gICAgIU51bWJlci5pc05hTihkYXRlKVxuICApO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IFV0aWwgZnVuY3Rpb24gdG8gcGFkIG51bWJlcnNcbiAqIEBwYXJhbSB7bnVtYmVyfSBudW1cbiAqXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKlxuICogQGZ1bmN0aW9uIHR3b0RpZ2l0UGFkXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHR3b0RpZ2l0UGFkKG51bTogbnVtYmVyKTogc3RyaW5nIHtcbiAgcmV0dXJuIG51bSA8IDEwID8gXCIwXCIgKyBudW0gOiBudW0udG9TdHJpbmcoKTtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBEYXRlIEZvcm1hdCBIYW5kbGluZ1xuICogQGRlc2NyaXB0aW9uIENvZGUgZnJvbSB7QGxpbmsgaHR0cHM6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMzU1MjQ2MS9ob3ctdG8tZm9ybWF0LWEtamF2YXNjcmlwdC1kYXRlfVxuICpcbiAqIDxwcmU+XG4gKiAgICAgIFVzaW5nIHNpbWlsYXIgZm9ybWF0dGluZyBhcyBNb21lbnQuanMsIENsYXNzIERhdGVUaW1lRm9ybWF0dGVyIChKYXZhKSwgYW5kIENsYXNzIFNpbXBsZURhdGVGb3JtYXQgKEphdmEpLFxuICogICAgICBJIGltcGxlbWVudGVkIGEgY29tcHJlaGVuc2l2ZSBzb2x1dGlvbiBmb3JtYXREYXRlKGRhdGUsIHBhdHRlcm5TdHIpIHdoZXJlIHRoZSBjb2RlIGlzIGVhc3kgdG8gcmVhZCBhbmQgbW9kaWZ5LlxuICogICAgICBZb3UgY2FuIGRpc3BsYXkgZGF0ZSwgdGltZSwgQU0vUE0sIGV0Yy5cbiAqXG4gKiAgICAgIERhdGUgYW5kIFRpbWUgUGF0dGVybnNcbiAqICAgICAgeXkgPSAyLWRpZ2l0IHllYXI7IHl5eXkgPSBmdWxsIHllYXJcbiAqICAgICAgTSA9IGRpZ2l0IG1vbnRoOyBNTSA9IDItZGlnaXQgbW9udGg7IE1NTSA9IHNob3J0IG1vbnRoIG5hbWU7IE1NTU0gPSBmdWxsIG1vbnRoIG5hbWVcbiAqICAgICAgRUVFRSA9IGZ1bGwgd2Vla2RheSBuYW1lOyBFRUUgPSBzaG9ydCB3ZWVrZGF5IG5hbWVcbiAqICAgICAgZCA9IGRpZ2l0IGRheTsgZGQgPSAyLWRpZ2l0IGRheVxuICogICAgICBoID0gaG91cnMgYW0vcG07IGhoID0gMi1kaWdpdCBob3VycyBhbS9wbTsgSCA9IGhvdXJzOyBISCA9IDItZGlnaXQgaG91cnNcbiAqICAgICAgbSA9IG1pbnV0ZXM7IG1tID0gMi1kaWdpdCBtaW51dGVzOyBhYWEgPSBBTS9QTVxuICogICAgICBzID0gc2Vjb25kczsgc3MgPSAyLWRpZ2l0IHNlY29uZHNcbiAqICAgICAgUyA9IG1pbGlzZWNvbmRzXG4gKiA8L3ByZT5cbiAqXG4gKiBAcGFyYW0ge0RhdGV9IGRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfSBbcGF0dGVyblN0cl0gZGVmYXVsdHMgdG8gJ3l5eXkvTU0vZGQnXG4gKiBAcmV0dXJuIHtzdHJpbmd9IHRoZSBmb3JtYXR0ZWQgZGF0ZVxuICpcbiAqIEBmdW5jdGlvbiBmb3JtYXREYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgTW9kZWxcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZTogRGF0ZSwgcGF0dGVyblN0cjogc3RyaW5nID0gXCJ5eXl5L01NL2RkXCIpIHtcbiAgY29uc3QgZGF5OiBudW1iZXIgPSBkYXRlLmdldERhdGUoKSxcbiAgICBtb250aDogbnVtYmVyID0gZGF0ZS5nZXRNb250aCgpLFxuICAgIHllYXI6IG51bWJlciA9IGRhdGUuZ2V0RnVsbFllYXIoKSxcbiAgICBob3VyOiBudW1iZXIgPSBkYXRlLmdldEhvdXJzKCksXG4gICAgbWludXRlOiBudW1iZXIgPSBkYXRlLmdldE1pbnV0ZXMoKSxcbiAgICBzZWNvbmQ6IG51bWJlciA9IGRhdGUuZ2V0U2Vjb25kcygpLFxuICAgIG1pbGlzZWNvbmRzOiBudW1iZXIgPSBkYXRlLmdldE1pbGxpc2Vjb25kcygpLFxuICAgIGg6IG51bWJlciA9IGhvdXIgJSAxMixcbiAgICBoaDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaCksXG4gICAgSEg6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGhvdXIpLFxuICAgIG1tOiBzdHJpbmcgPSB0d29EaWdpdFBhZChtaW51dGUpLFxuICAgIHNzOiBzdHJpbmcgPSB0d29EaWdpdFBhZChzZWNvbmQpLFxuICAgIGFhYTogc3RyaW5nID0gaG91ciA8IDEyID8gXCJBTVwiIDogXCJQTVwiLFxuICAgIEVFRUU6IHN0cmluZyA9IERBWVNfT0ZfV0VFS19OQU1FU1tkYXRlLmdldERheSgpXSxcbiAgICBFRUU6IHN0cmluZyA9IEVFRUUuc3Vic3RyKDAsIDMpLFxuICAgIGRkOiBzdHJpbmcgPSB0d29EaWdpdFBhZChkYXkpLFxuICAgIE06IG51bWJlciA9IG1vbnRoICsgMSxcbiAgICBNTTogc3RyaW5nID0gdHdvRGlnaXRQYWQoTSksXG4gICAgTU1NTTogc3RyaW5nID0gTU9OVEhfTkFNRVNbbW9udGhdLFxuICAgIE1NTTogc3RyaW5nID0gTU1NTS5zdWJzdHIoMCwgMyksXG4gICAgeXl5eTogc3RyaW5nID0geWVhciArIFwiXCIsXG4gICAgeXk6IHN0cmluZyA9IHl5eXkuc3Vic3RyKDIsIDIpO1xuICAvLyBjaGVja3MgdG8gc2VlIGlmIG1vbnRoIG5hbWUgd2lsbCBiZSB1c2VkXG4gIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyXG4gICAgLnJlcGxhY2UoXCJoaFwiLCBoaClcbiAgICAucmVwbGFjZShcImhcIiwgaC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiSEhcIiwgSEgpXG4gICAgLnJlcGxhY2UoXCJIXCIsIGhvdXIudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIm1tXCIsIG1tKVxuICAgIC5yZXBsYWNlKFwibVwiLCBtaW51dGUudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcInNzXCIsIHNzKVxuICAgIC5yZXBsYWNlKFwic1wiLCBzZWNvbmQudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcIlNcIiwgbWlsaXNlY29uZHMudG9TdHJpbmcoKSlcbiAgICAucmVwbGFjZShcImRkXCIsIGRkKVxuICAgIC5yZXBsYWNlKFwiZFwiLCBkYXkudG9TdHJpbmcoKSlcblxuICAgIC5yZXBsYWNlKFwiRUVFRVwiLCBFRUVFKVxuICAgIC5yZXBsYWNlKFwiRUVFXCIsIEVFRSlcbiAgICAucmVwbGFjZShcInl5eXlcIiwgeXl5eSlcbiAgICAucmVwbGFjZShcInl5XCIsIHl5KVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIGFhYSk7XG4gIGlmIChwYXR0ZXJuU3RyLmluZGV4T2YoXCJNTU1cIikgPiAtMSkge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTU1NXCIsIE1NTU0pLnJlcGxhY2UoXCJNTU1cIiwgTU1NKTtcbiAgfSBlbHNlIHtcbiAgICBwYXR0ZXJuU3RyID0gcGF0dGVyblN0ci5yZXBsYWNlKFwiTU1cIiwgTU0pLnJlcGxhY2UoXCJNXCIsIE0udG9TdHJpbmcoKSk7XG4gIH1cbiAgcmV0dXJuIHBhdHRlcm5TdHI7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgUGFyc2VzIGEgZGF0ZSBmcm9tIGEgc3BlY2lmaWVkIGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd9IGZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmcgfCBEYXRlIHwgbnVtYmVyfSBbdl1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb25cbiAqIEBjYXRlZ29yeSBNb2RlbFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGZvcm1hdDogc3RyaW5nLCB2Pzogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKHYgYXMgRGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LnRvU3RyaW5nKCksIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQodiwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkRGF0ZSh2KSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdiwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkICR7dn1gKTtcbiAgfVxuICByZXR1cm4gYmluZERhdGVUb1N0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbn1cbiJdfQ==
|