@decaf-ts/decorator-validation 1.5.2 → 1.5.5

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.
Files changed (174) hide show
  1. package/LICENSE.md +0 -0
  2. package/README.md +34 -108
  3. package/dist/decorator-validation.js +2 -0
  4. package/dist/decorator-validation.js.LICENSE.txt +14 -0
  5. package/dist/esm/decorator-validation.js +2 -0
  6. package/dist/esm/decorator-validation.js.LICENSE.txt +14 -0
  7. package/lib/esm/index.d.ts +42 -0
  8. package/lib/esm/index.js +44 -0
  9. package/lib/esm/model/Model.d.ts +138 -0
  10. package/lib/esm/model/Model.js +298 -0
  11. package/lib/esm/model/ModelErrorDefinition.d.ts +22 -0
  12. package/lib/esm/model/ModelErrorDefinition.js +54 -0
  13. package/lib/esm/model/Registry.d.ts +59 -0
  14. package/lib/esm/model/Registry.js +75 -0
  15. package/lib/esm/model/constants.d.ts +56 -0
  16. package/lib/esm/model/constants.js +71 -0
  17. package/lib/esm/model/construction.d.ts +29 -0
  18. package/lib/esm/model/construction.js +65 -0
  19. package/lib/esm/model/decorators.d.ts +25 -0
  20. package/lib/esm/model/decorators.js +64 -0
  21. package/lib/esm/model/index.d.ts +9 -0
  22. package/lib/esm/model/index.js +11 -0
  23. package/lib/esm/model/types.d.ts +79 -0
  24. package/lib/esm/model/types.js +3 -0
  25. package/lib/esm/model/utils.d.ts +11 -0
  26. package/lib/esm/model/utils.js +27 -0
  27. package/lib/esm/model/validation.d.ts +14 -0
  28. package/lib/esm/model/validation.js +137 -0
  29. package/lib/esm/utils/constants.d.ts +26 -0
  30. package/lib/esm/utils/constants.js +29 -0
  31. package/lib/esm/utils/dates.d.ts +76 -0
  32. package/lib/esm/utils/dates.js +245 -0
  33. package/lib/esm/utils/decorators.d.ts +2 -0
  34. package/lib/esm/utils/decorators.js +20 -0
  35. package/lib/esm/utils/hashing.d.ts +52 -0
  36. package/lib/esm/utils/hashing.js +101 -0
  37. package/lib/esm/utils/index.d.ts +7 -0
  38. package/lib/esm/utils/index.js +9 -0
  39. package/lib/esm/utils/registry.d.ts +68 -0
  40. package/lib/esm/utils/registry.js +3 -0
  41. package/lib/esm/utils/serialization.d.ts +79 -0
  42. package/lib/esm/utils/serialization.js +90 -0
  43. package/lib/esm/utils/strings.d.ts +25 -0
  44. package/lib/esm/utils/strings.js +33 -0
  45. package/lib/esm/validation/Validation.d.ts +51 -0
  46. package/lib/esm/validation/Validation.js +73 -0
  47. package/lib/esm/validation/Validators/DateValidator.d.ts +28 -0
  48. package/lib/esm/validation/Validators/DateValidator.js +56 -0
  49. package/lib/esm/validation/Validators/EmailValidator.d.ts +28 -0
  50. package/lib/esm/validation/Validators/EmailValidator.js +52 -0
  51. package/lib/esm/validation/Validators/ListValidator.d.ts +28 -0
  52. package/lib/esm/validation/Validators/ListValidator.js +69 -0
  53. package/lib/esm/validation/Validators/MaxLengthValidator.d.ts +29 -0
  54. package/lib/esm/validation/Validators/MaxLengthValidator.js +54 -0
  55. package/lib/esm/validation/Validators/MaxValidator.d.ts +28 -0
  56. package/lib/esm/validation/Validators/MaxValidator.js +59 -0
  57. package/lib/esm/validation/Validators/MinLengthValidator.d.ts +29 -0
  58. package/lib/esm/validation/Validators/MinLengthValidator.js +54 -0
  59. package/lib/esm/validation/Validators/MinValidator.d.ts +28 -0
  60. package/lib/esm/validation/Validators/MinValidator.js +59 -0
  61. package/lib/esm/validation/Validators/PasswordValidator.d.ts +28 -0
  62. package/lib/esm/validation/Validators/PasswordValidator.js +52 -0
  63. package/lib/esm/validation/Validators/PatternValidator.d.ts +37 -0
  64. package/lib/esm/validation/Validators/PatternValidator.js +72 -0
  65. package/lib/esm/validation/Validators/RequiredValidator.d.ts +28 -0
  66. package/lib/esm/validation/Validators/RequiredValidator.js +59 -0
  67. package/lib/esm/validation/Validators/StepValidator.d.ts +29 -0
  68. package/lib/esm/validation/Validators/StepValidator.js +54 -0
  69. package/lib/esm/validation/Validators/TypeValidator.d.ts +25 -0
  70. package/lib/esm/validation/Validators/TypeValidator.js +62 -0
  71. package/lib/esm/validation/Validators/URLValidator.d.ts +27 -0
  72. package/lib/esm/validation/Validators/URLValidator.js +51 -0
  73. package/lib/esm/validation/Validators/Validator.d.ts +41 -0
  74. package/lib/esm/validation/Validators/Validator.js +49 -0
  75. package/lib/esm/validation/Validators/ValidatorRegistry.d.ts +47 -0
  76. package/lib/esm/validation/Validators/ValidatorRegistry.js +82 -0
  77. package/lib/esm/validation/Validators/constants.d.ts +96 -0
  78. package/lib/esm/validation/Validators/constants.js +136 -0
  79. package/lib/esm/validation/Validators/decorators.d.ts +12 -0
  80. package/lib/esm/validation/Validators/decorators.js +27 -0
  81. package/lib/esm/validation/Validators/index.d.ts +52 -0
  82. package/lib/esm/validation/Validators/index.js +54 -0
  83. package/lib/esm/validation/Validators/types.d.ts +88 -0
  84. package/lib/esm/validation/Validators/types.js +3 -0
  85. package/lib/esm/validation/decorators.d.ts +178 -0
  86. package/lib/esm/validation/decorators.js +290 -0
  87. package/lib/esm/validation/index.d.ts +4 -0
  88. package/lib/esm/validation/index.js +6 -0
  89. package/lib/esm/validation/types.d.ts +46 -0
  90. package/lib/esm/validation/types.js +3 -0
  91. package/lib/index.cjs +61 -0
  92. package/lib/index.d.ts +42 -0
  93. package/lib/model/Model.cjs +302 -0
  94. package/lib/model/Model.d.ts +138 -0
  95. package/lib/model/ModelErrorDefinition.cjs +58 -0
  96. package/lib/model/ModelErrorDefinition.d.ts +22 -0
  97. package/lib/model/Registry.cjs +80 -0
  98. package/lib/model/Registry.d.ts +59 -0
  99. package/lib/model/constants.cjs +74 -0
  100. package/lib/model/constants.d.ts +56 -0
  101. package/lib/model/construction.cjs +70 -0
  102. package/lib/model/construction.d.ts +29 -0
  103. package/lib/model/decorators.cjs +69 -0
  104. package/lib/model/decorators.d.ts +25 -0
  105. package/lib/model/index.cjs +27 -0
  106. package/lib/model/index.d.ts +9 -0
  107. package/lib/model/types.cjs +4 -0
  108. package/lib/model/types.d.ts +79 -0
  109. package/lib/model/utils.cjs +31 -0
  110. package/lib/model/utils.d.ts +11 -0
  111. package/lib/model/validation.cjs +140 -0
  112. package/lib/model/validation.d.ts +14 -0
  113. package/lib/utils/constants.cjs +32 -0
  114. package/lib/utils/constants.d.ts +26 -0
  115. package/lib/utils/dates.cjs +253 -0
  116. package/lib/utils/dates.d.ts +76 -0
  117. package/lib/utils/decorators.cjs +24 -0
  118. package/lib/utils/decorators.d.ts +2 -0
  119. package/lib/utils/hashing.cjs +108 -0
  120. package/lib/utils/hashing.d.ts +52 -0
  121. package/lib/utils/index.cjs +25 -0
  122. package/lib/utils/index.d.ts +7 -0
  123. package/lib/utils/registry.cjs +4 -0
  124. package/lib/utils/registry.d.ts +68 -0
  125. package/lib/utils/serialization.cjs +95 -0
  126. package/lib/utils/serialization.d.ts +79 -0
  127. package/lib/utils/strings.cjs +37 -0
  128. package/lib/utils/strings.d.ts +25 -0
  129. package/lib/validation/Validation.cjs +77 -0
  130. package/lib/validation/Validation.d.ts +51 -0
  131. package/lib/validation/Validators/DateValidator.cjs +59 -0
  132. package/lib/validation/Validators/DateValidator.d.ts +28 -0
  133. package/lib/validation/Validators/EmailValidator.cjs +55 -0
  134. package/lib/validation/Validators/EmailValidator.d.ts +28 -0
  135. package/lib/validation/Validators/ListValidator.cjs +72 -0
  136. package/lib/validation/Validators/ListValidator.d.ts +28 -0
  137. package/lib/validation/Validators/MaxLengthValidator.cjs +57 -0
  138. package/lib/validation/Validators/MaxLengthValidator.d.ts +29 -0
  139. package/lib/validation/Validators/MaxValidator.cjs +62 -0
  140. package/lib/validation/Validators/MaxValidator.d.ts +28 -0
  141. package/lib/validation/Validators/MinLengthValidator.cjs +57 -0
  142. package/lib/validation/Validators/MinLengthValidator.d.ts +29 -0
  143. package/lib/validation/Validators/MinValidator.cjs +62 -0
  144. package/lib/validation/Validators/MinValidator.d.ts +28 -0
  145. package/lib/validation/Validators/PasswordValidator.cjs +55 -0
  146. package/lib/validation/Validators/PasswordValidator.d.ts +28 -0
  147. package/lib/validation/Validators/PatternValidator.cjs +75 -0
  148. package/lib/validation/Validators/PatternValidator.d.ts +37 -0
  149. package/lib/validation/Validators/RequiredValidator.cjs +62 -0
  150. package/lib/validation/Validators/RequiredValidator.d.ts +28 -0
  151. package/lib/validation/Validators/StepValidator.cjs +57 -0
  152. package/lib/validation/Validators/StepValidator.d.ts +29 -0
  153. package/lib/validation/Validators/TypeValidator.cjs +65 -0
  154. package/lib/validation/Validators/TypeValidator.d.ts +25 -0
  155. package/lib/validation/Validators/URLValidator.cjs +54 -0
  156. package/lib/validation/Validators/URLValidator.d.ts +27 -0
  157. package/lib/validation/Validators/Validator.cjs +53 -0
  158. package/lib/validation/Validators/Validator.d.ts +41 -0
  159. package/lib/validation/Validators/ValidatorRegistry.cjs +87 -0
  160. package/lib/validation/Validators/ValidatorRegistry.d.ts +47 -0
  161. package/lib/validation/Validators/constants.cjs +139 -0
  162. package/lib/validation/Validators/constants.d.ts +96 -0
  163. package/lib/validation/Validators/decorators.cjs +30 -0
  164. package/lib/validation/Validators/decorators.d.ts +12 -0
  165. package/lib/validation/Validators/index.cjs +71 -0
  166. package/lib/validation/Validators/index.d.ts +52 -0
  167. package/lib/validation/Validators/types.d.ts +88 -0
  168. package/lib/validation/decorators.cjs +306 -0
  169. package/lib/validation/decorators.d.ts +178 -0
  170. package/lib/validation/index.cjs +22 -0
  171. package/lib/validation/index.d.ts +4 -0
  172. package/lib/validation/types.cjs +4 -0
  173. package/lib/validation/types.d.ts +46 -0
  174. package/package.json +18 -13
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isPropertyModel = isPropertyModel;
4
+ exports.isModel = isModel;
5
+ const constants_1 = require("../utils/constants.cjs");
6
+ const Model_1 = require("./Model.cjs");
7
+ function isPropertyModel(target, attribute) {
8
+ if (isModel(target[attribute]))
9
+ return true;
10
+ const metadata = Reflect.getMetadata(constants_1.ModelKeys.TYPE, target, attribute);
11
+ return Model_1.Model.get(metadata.name) ? metadata.name : undefined;
12
+ }
13
+ /**
14
+ * @summary For Serialization/deserialization purposes.
15
+ * @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
16
+ *
17
+ * @function isModel
18
+ * @memberOf module:decorator-validation.Validation
19
+ * @category Validation
20
+ */
21
+ function isModel(target) {
22
+ try {
23
+ return target instanceof Model_1.Model || !!Model_1.Model.getMetadata(target);
24
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
25
+ }
26
+ catch (e) {
27
+ return false;
28
+ }
29
+ }
30
+
31
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy9tb2RlbC91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUdBLDBDQU9DO0FBVUQsMEJBT0M7QUEzQkQsa0RBQStDO0FBQy9DLG1DQUFnQztBQUVoQyxTQUFnQixlQUFlLENBQzdCLE1BQVMsRUFDVCxTQUFpQjtJQUVqQixJQUFJLE9BQU8sQ0FBRSxNQUE4QixDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDckUsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxxQkFBUyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7SUFDeEUsT0FBTyxhQUFLLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzlELENBQUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsT0FBTyxDQUFDLE1BQTJCO0lBQ2pELElBQUksQ0FBQztRQUNILE9BQU8sTUFBTSxZQUFZLGFBQUssSUFBSSxDQUFDLENBQUMsYUFBSyxDQUFDLFdBQVcsQ0FBQyxNQUFhLENBQUMsQ0FBQztRQUNyRSw2REFBNkQ7SUFDL0QsQ0FBQztJQUFDLE9BQU8sQ0FBTSxFQUFFLENBQUM7UUFDaEIsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQyIsImZpbGUiOiJtb2RlbC91dGlscy5qcyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4vTW9kZWxcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGlzUHJvcGVydHlNb2RlbDxNIGV4dGVuZHMgTW9kZWw+KFxuICB0YXJnZXQ6IE0sXG4gIGF0dHJpYnV0ZTogc3RyaW5nXG4pOiBib29sZWFuIHwgc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKGlzTW9kZWwoKHRhcmdldCBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVthdHRyaWJ1dGVdKSkgcmV0dXJuIHRydWU7XG4gIGNvbnN0IG1ldGFkYXRhID0gUmVmbGVjdC5nZXRNZXRhZGF0YShNb2RlbEtleXMuVFlQRSwgdGFyZ2V0LCBhdHRyaWJ1dGUpO1xuICByZXR1cm4gTW9kZWwuZ2V0KG1ldGFkYXRhLm5hbWUpID8gbWV0YWRhdGEubmFtZSA6IHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBGb3IgU2VyaWFsaXphdGlvbi9kZXNlcmlhbGl6YXRpb24gcHVycG9zZXMuXG4gKiBAZGVzY3JpcHRpb24gUmVhZHMgdGhlIHtAbGluayBNb2RlbEtleXMuQU5DSE9SfSBwcm9wZXJ0eSBvZiBhIHtAbGluayBNb2RlbH0gdG8gZGlzY292ZXIgdGhlIGNsYXNzIHRvIGluc3RhbnRpYXRlXG4gKlxuICogQGZ1bmN0aW9uIGlzTW9kZWxcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVmFsaWRhdGlvblxuICogQGNhdGVnb3J5IFZhbGlkYXRpb25cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzTW9kZWwodGFyZ2V0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHRhcmdldCBpbnN0YW5jZW9mIE1vZGVsIHx8ICEhTW9kZWwuZ2V0TWV0YWRhdGEodGFyZ2V0IGFzIGFueSk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,11 @@
1
+ import { Model } from "./Model";
2
+ export declare function isPropertyModel<M extends Model>(target: M, attribute: string): boolean | string | undefined;
3
+ /**
4
+ * @summary For Serialization/deserialization purposes.
5
+ * @description Reads the {@link ModelKeys.ANCHOR} property of a {@link Model} to discover the class to instantiate
6
+ *
7
+ * @function isModel
8
+ * @memberOf module:decorator-validation.Validation
9
+ * @category Validation
10
+ */
11
+ export declare function isModel(target: Record<string, any>): boolean;
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validate = validate;
4
+ const ModelErrorDefinition_1 = require("./ModelErrorDefinition.cjs");
5
+ const reflection_1 = require("@decaf-ts/reflection");
6
+ const constants_1 = require("../utils/constants.cjs");
7
+ const strings_1 = require("../utils/strings.cjs");
8
+ const constants_2 = require("./constants.cjs");
9
+ const Validation_1 = require("../validation/Validation.cjs");
10
+ const constants_3 = require("../validation/Validators/constants.cjs");
11
+ const utils_1 = require("./utils.cjs");
12
+ /**
13
+ * @summary Analyses the decorations of the properties and validates the obj according to them
14
+ *
15
+ * @typedef T extends Model
16
+ * @prop {T} obj Model object to validate
17
+ * @prop {string[]} [propsToIgnore] object properties to ignore in the validation
18
+ *
19
+ * @function validate
20
+ * @memberOf module:decorator-validation.Validation
21
+ * @category Validation
22
+ */
23
+ function validate(obj, ...propsToIgnore) {
24
+ const decoratedProperties = [];
25
+ for (const prop in obj)
26
+ if (Object.prototype.hasOwnProperty.call(obj, prop) &&
27
+ propsToIgnore.indexOf(prop) === -1)
28
+ decoratedProperties.push(reflection_1.Reflection.getPropertyDecorators(constants_3.ValidationKeys.REFLECT, obj, prop));
29
+ let result = undefined;
30
+ for (const decoratedProperty of decoratedProperties) {
31
+ const { prop, decorators } = decoratedProperty;
32
+ if (!decorators || !decorators.length)
33
+ continue;
34
+ const defaultTypeDecorator = decorators[0];
35
+ // tries to find any type decorators or other decorators that already enforce type (the ones with the allowed types property defined). if so, skip the default type verification
36
+ if (decorators.find((d) => {
37
+ if (d.key === constants_3.ValidationKeys.TYPE)
38
+ return true;
39
+ return !!d.props.types?.find((t) => t === defaultTypeDecorator.props.name);
40
+ })) {
41
+ decorators.shift(); // remove the design:type decorator, since the type will already be checked
42
+ }
43
+ let errs = undefined;
44
+ for (const decorator of decorators) {
45
+ const validator = Validation_1.Validation.get(decorator.key);
46
+ if (!validator) {
47
+ throw new Error(`Missing validator for ${decorator.key}`);
48
+ }
49
+ const decoratorProps = decorator.key === constants_1.ModelKeys.TYPE
50
+ ? [decorator.props]
51
+ : (decorator.props || {});
52
+ const err = validator.hasErrors(obj[prop.toString()], decoratorProps);
53
+ if (err) {
54
+ errs = errs || {};
55
+ errs[decorator.key] = err;
56
+ }
57
+ }
58
+ if (errs) {
59
+ result = result || {};
60
+ result[decoratedProperty.prop.toString()] = errs;
61
+ }
62
+ }
63
+ // tests nested classes
64
+ for (const prop of Object.keys(obj).filter((k) => !result || !result[k])) {
65
+ let err;
66
+ // if a nested Model
67
+ const allDecorators = reflection_1.Reflection.getPropertyDecorators(constants_3.ValidationKeys.REFLECT, obj, prop).decorators;
68
+ const decorators = reflection_1.Reflection.getPropertyDecorators(constants_3.ValidationKeys.REFLECT, obj, prop).decorators.filter((d) => [constants_1.ModelKeys.TYPE, constants_3.ValidationKeys.TYPE].indexOf(d.key) !== -1);
69
+ if (!decorators || !decorators.length)
70
+ continue;
71
+ const dec = decorators.pop();
72
+ const clazz = dec.props.name
73
+ ? [dec.props.name]
74
+ : Array.isArray(dec.props.customTypes)
75
+ ? dec.props.customTypes
76
+ : [dec.props.customTypes];
77
+ const reserved = Object.values(constants_2.ReservedModels).map((v) => v.toLowerCase());
78
+ for (const c of clazz) {
79
+ if (reserved.indexOf(c.toLowerCase()) === -1) {
80
+ const typeDecoratorKey = Array.isArray(obj[prop])
81
+ ? constants_3.ValidationKeys.LIST
82
+ : constants_3.ValidationKeys.TYPE;
83
+ const types = allDecorators.find((d) => d.key === typeDecoratorKey) || {};
84
+ let allowedTypes = [];
85
+ if (types && types.props) {
86
+ const customTypes = Array.isArray(obj[prop])
87
+ ? types.props.class
88
+ : types.props.customTypes;
89
+ if (customTypes)
90
+ allowedTypes = Array.isArray(customTypes)
91
+ ? customTypes.map((t) => `${t}`.toLowerCase())
92
+ : [customTypes.toLowerCase()];
93
+ }
94
+ const validate = (prop, value) => {
95
+ if (typeof value === "object" || typeof value === "function")
96
+ return (0, utils_1.isModel)(value)
97
+ ? value.hasErrors()
98
+ : allowedTypes.includes(typeof value)
99
+ ? undefined
100
+ : "Value has no validatable type";
101
+ };
102
+ switch (c) {
103
+ case Array.name:
104
+ case Set.name:
105
+ if (allDecorators.length) {
106
+ const listDec = allDecorators.find((d) => d.key === constants_3.ValidationKeys.LIST);
107
+ if (listDec) {
108
+ err = (c === Array.name
109
+ ? obj[prop]
110
+ : // If it's a Set
111
+ obj[prop].values())
112
+ .map((v) => validate(prop, v))
113
+ .filter((e) => !!e);
114
+ if (!err?.length) {
115
+ // if the result is an empty list...
116
+ err = undefined;
117
+ }
118
+ }
119
+ }
120
+ break;
121
+ default:
122
+ try {
123
+ if (obj[prop])
124
+ err = validate(prop, obj[prop]);
125
+ }
126
+ catch (e) {
127
+ console.warn((0, strings_1.sf)("Model should be validatable but its not: " + e));
128
+ }
129
+ }
130
+ }
131
+ if (err) {
132
+ result = result || {};
133
+ result[prop] = err;
134
+ }
135
+ }
136
+ }
137
+ return result ? new ModelErrorDefinition_1.ModelErrorDefinition(result) : undefined;
138
+ }
139
+
140
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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cUNBQ0UsR0FBRyxDQUFDLENBQUMsQ0FBYyxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO3FDQUMxQyxNQUFNLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQVEsQ0FBQztnQ0FDbEMsSUFBSSxDQUFDLEdBQUcsRUFBRSxNQUFNLEVBQUUsQ0FBQztvQ0FDakIsb0NBQW9DO29DQUNwQyxHQUFHLEdBQUcsU0FBUyxDQUFDO2dDQUNsQixDQUFDOzRCQUNILENBQUM7d0JBQ0gsQ0FBQzt3QkFDRCxNQUFNO29CQUNSO3dCQUNFLElBQUksQ0FBQzs0QkFDSCxJQUFLLEdBQTJCLENBQUMsSUFBSSxDQUFDO2dDQUNwQyxHQUFHLEdBQUcsUUFBUSxDQUFDLElBQUksRUFBRyxHQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQzt3QkFDN0MsQ0FBQzt3QkFBQyxPQUFPLENBQU0sRUFBRSxDQUFDOzRCQUNoQixPQUFPLENBQUMsSUFBSSxDQUFDLElBQUEsWUFBRSxFQUFDLDJDQUEyQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQ3BFLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO2dCQUN0QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBVSxDQUFDO1lBQzVCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFJLDJDQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7QUFDL0QsQ0FBQyIsImZpbGUiOiJtb2RlbC92YWxpZGF0aW9uLmpzIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTW9kZWxFcnJvckRlZmluaXRpb24gfSBmcm9tIFwiLi9Nb2RlbEVycm9yRGVmaW5pdGlvblwiO1xuaW1wb3J0IHsgRGVjb3JhdG9yTWV0YWRhdGEsIFJlZmxlY3Rpb24gfSBmcm9tIFwiQGRlY2FmLXRzL3JlZmxlY3Rpb25cIjtcbmltcG9ydCB7IE1vZGVsS2V5cyB9IGZyb20gXCIuLi91dGlscy9jb25zdGFudHNcIjtcbmltcG9ydCB7IHNmIH0gZnJvbSBcIi4uL3V0aWxzL3N0cmluZ3NcIjtcbmltcG9ydCB7IFJlc2VydmVkTW9kZWxzIH0gZnJvbSBcIi4vY29uc3RhbnRzXCI7XG5pbXBvcnQgeyBWYWxpZGF0YWJsZSB9IGZyb20gXCIuL3R5cGVzXCI7XG5pbXBvcnQgeyBNb2RlbCB9IGZyb20gXCIuL01vZGVsXCI7XG5pbXBvcnQgeyBWYWxpZGF0aW9uIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb24vVmFsaWRhdGlvblwiO1xuaW1wb3J0IHsgVmFsaWRhdGlvbktleXMgfSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHtcbiAgTW9kZWxFcnJvcnMsXG4gIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb24sXG59IGZyb20gXCIuLi92YWxpZGF0aW9uL3R5cGVzXCI7XG5pbXBvcnQgeyBpc01vZGVsIH0gZnJvbSBcIi4vdXRpbHNcIjtcbmltcG9ydCB0eXBlIHsgVmFsaWRhdG9yT3B0aW9ucyB9IGZyb20gXCIuLi92YWxpZGF0aW9uXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgQW5hbHlzZXMgdGhlIGRlY29yYXRpb25zIG9mIHRoZSBwcm9wZXJ0aWVzIGFuZCB2YWxpZGF0ZXMgdGhlIG9iaiBhY2NvcmRpbmcgdG8gdGhlbVxuICpcbiAqIEB0eXBlZGVmIFQgZXh0ZW5kcyBNb2RlbFxuICogQHByb3Age1R9IG9iaiBNb2RlbCBvYmplY3QgdG8gdmFsaWRhdGVcbiAqIEBwcm9wIHtzdHJpbmdbXX0gW3Byb3BzVG9JZ25vcmVdIG9iamVjdCBwcm9wZXJ0aWVzIHRvIGlnbm9yZSBpbiB0aGUgdmFsaWRhdGlvblxuICpcbiAqIEBmdW5jdGlvbiB2YWxpZGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5WYWxpZGF0aW9uXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gdmFsaWRhdGU8VCBleHRlbmRzIE1vZGVsPihcbiAgb2JqOiBULFxuICAuLi5wcm9wc1RvSWdub3JlOiBzdHJpbmdbXVxuKTogTW9kZWxFcnJvckRlZmluaXRpb24gfCB1bmRlZmluZWQge1xuICBjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0aWVzOiBWYWxpZGF0aW9uUHJvcGVydHlEZWNvcmF0b3JEZWZpbml0aW9uW10gPSBbXTtcbiAgZm9yIChjb25zdCBwcm9wIGluIG9iailcbiAgICBpZiAoXG4gICAgICBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKSAmJlxuICAgICAgcHJvcHNUb0lnbm9yZS5pbmRleE9mKHByb3ApID09PSAtMVxuICAgIClcbiAgICAgIGRlY29yYXRlZFByb3BlcnRpZXMucHVzaChcbiAgICAgICAgUmVmbGVjdGlvbi5nZXRQcm9wZXJ0eURlY29yYXRvcnMoXG4gICAgICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgICAgICBvYmosXG4gICAgICAgICAgcHJvcFxuICAgICAgICApIGFzIFZhbGlkYXRpb25Qcm9wZXJ0eURlY29yYXRvckRlZmluaXRpb25cbiAgICAgICk7XG5cbiAgbGV0IHJlc3VsdDogTW9kZWxFcnJvcnMgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgZm9yIChjb25zdCBkZWNvcmF0ZWRQcm9wZXJ0eSBvZiBkZWNvcmF0ZWRQcm9wZXJ0aWVzKSB7XG4gICAgY29uc3QgeyBwcm9wLCBkZWNvcmF0b3JzIH0gPSBkZWNvcmF0ZWRQcm9wZXJ0eTtcblxuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgZGVmYXVsdFR5cGVEZWNvcmF0b3I6IERlY29yYXRvck1ldGFkYXRhID0gZGVjb3JhdG9yc1swXTtcblxuICAgIC8vIHRyaWVzIHRvIGZpbmQgYW55IHR5cGUgZGVjb3JhdG9ycyBvciBvdGhlciBkZWNvcmF0b3JzIHRoYXQgYWxyZWFkeSBlbmZvcmNlIHR5cGUgKHRoZSBvbmVzIHdpdGggdGhlIGFsbG93ZWQgdHlwZXMgcHJvcGVydHkgZGVmaW5lZCkuIGlmIHNvLCBza2lwIHRoZSBkZWZhdWx0IHR5cGUgdmVyaWZpY2F0aW9uXG4gICAgaWYgKFxuICAgICAgZGVjb3JhdG9ycy5maW5kKChkKSA9PiB7XG4gICAgICAgIGlmIChkLmtleSA9PT0gVmFsaWRhdGlvbktleXMuVFlQRSkgcmV0dXJuIHRydWU7XG4gICAgICAgIHJldHVybiAhIWQucHJvcHMudHlwZXM/LmZpbmQoXG4gICAgICAgICAgKHQpID0+IHQgPT09IGRlZmF1bHRUeXBlRGVjb3JhdG9yLnByb3BzLm5hbWVcbiAgICAgICAgKTtcbiAgICAgIH0pXG4gICAgKSB7XG4gICAgICBkZWNvcmF0b3JzLnNoaWZ0KCk7IC8vIHJlbW92ZSB0aGUgZGVzaWduOnR5cGUgZGVjb3JhdG9yLCBzaW5jZSB0aGUgdHlwZSB3aWxsIGFscmVhZHkgYmUgY2hlY2tlZFxuICAgIH1cblxuICAgIGxldCBlcnJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+IHwgdW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuXG4gICAgZm9yIChjb25zdCBkZWNvcmF0b3Igb2YgZGVjb3JhdG9ycykge1xuICAgICAgY29uc3QgdmFsaWRhdG9yID0gVmFsaWRhdGlvbi5nZXQoZGVjb3JhdG9yLmtleSk7XG4gICAgICBpZiAoIXZhbGlkYXRvcikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgdmFsaWRhdG9yIGZvciAke2RlY29yYXRvci5rZXl9YCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGRlY29yYXRvclByb3BzID0gZGVjb3JhdG9yLmtleSA9PT0gTW9kZWxLZXlzLlRZUEVcbiAgICAgICAgPyBbZGVjb3JhdG9yLnByb3BzXVxuICAgICAgICA6IChkZWNvcmF0b3IucHJvcHMgfHwge30pO1xuXG4gICAgICBjb25zdCBlcnI6IHN0cmluZyB8IHVuZGVmaW5lZCA9IHZhbGlkYXRvci5oYXNFcnJvcnMoXG4gICAgICAgIChvYmogYXMgYW55KVtwcm9wLnRvU3RyaW5nKCldLFxuICAgICAgICBkZWNvcmF0b3JQcm9wcyBhcyBWYWxpZGF0b3JPcHRpb25zXG4gICAgICApO1xuXG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIGVycnMgPSBlcnJzIHx8IHt9O1xuICAgICAgICBlcnJzW2RlY29yYXRvci5rZXldID0gZXJyO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJzKSB7XG4gICAgICByZXN1bHQgPSByZXN1bHQgfHwge307XG4gICAgICByZXN1bHRbZGVjb3JhdGVkUHJvcGVydHkucHJvcC50b1N0cmluZygpXSA9IGVycnM7XG4gICAgfVxuICB9XG5cbiAgLy8gdGVzdHMgbmVzdGVkIGNsYXNzZXNcbiAgZm9yIChjb25zdCBwcm9wIG9mIE9iamVjdC5rZXlzKG9iaikuZmlsdGVyKChrKSA9PiAhcmVzdWx0IHx8ICFyZXN1bHRba10pKSB7XG4gICAgbGV0IGVycjogc3RyaW5nIHwgdW5kZWZpbmVkO1xuICAgIC8vIGlmIGEgbmVzdGVkIE1vZGVsXG4gICAgY29uc3QgYWxsRGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnM7XG4gICAgY29uc3QgZGVjb3JhdG9ycyA9IFJlZmxlY3Rpb24uZ2V0UHJvcGVydHlEZWNvcmF0b3JzKFxuICAgICAgVmFsaWRhdGlvbktleXMuUkVGTEVDVCxcbiAgICAgIG9iaixcbiAgICAgIHByb3BcbiAgICApLmRlY29yYXRvcnMuZmlsdGVyKFxuICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT5cbiAgICAgICAgW01vZGVsS2V5cy5UWVBFLCBWYWxpZGF0aW9uS2V5cy5UWVBFXS5pbmRleE9mKGQua2V5KSAhPT0gLTFcbiAgICApO1xuICAgIGlmICghZGVjb3JhdG9ycyB8fCAhZGVjb3JhdG9ycy5sZW5ndGgpIGNvbnRpbnVlO1xuICAgIGNvbnN0IGRlYyA9IGRlY29yYXRvcnMucG9wKCkgYXMgRGVjb3JhdG9yTWV0YWRhdGE7XG4gICAgY29uc3QgY2xhenogPSBkZWMucHJvcHMubmFtZVxuICAgICAgPyBbZGVjLnByb3BzLm5hbWVdXG4gICAgICA6IEFycmF5LmlzQXJyYXkoZGVjLnByb3BzLmN1c3RvbVR5cGVzKVxuICAgICAgICA/IGRlYy5wcm9wcy5jdXN0b21UeXBlc1xuICAgICAgICA6IFtkZWMucHJvcHMuY3VzdG9tVHlwZXNdO1xuICAgIGNvbnN0IHJlc2VydmVkID0gT2JqZWN0LnZhbHVlcyhSZXNlcnZlZE1vZGVscykubWFwKCh2KSA9PlxuICAgICAgdi50b0xvd2VyQ2FzZSgpXG4gICAgKSBhcyBzdHJpbmdbXTtcblxuICAgIGZvciAoY29uc3QgYyBvZiBjbGF6eikge1xuICAgICAgaWYgKHJlc2VydmVkLmluZGV4T2YoYy50b0xvd2VyQ2FzZSgpKSA9PT0gLTEpIHtcbiAgICAgICAgY29uc3QgdHlwZURlY29yYXRvcktleSA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgID8gVmFsaWRhdGlvbktleXMuTElTVFxuICAgICAgICAgIDogVmFsaWRhdGlvbktleXMuVFlQRTtcbiAgICAgICAgY29uc3QgdHlwZXM6IGFueSA9XG4gICAgICAgICAgYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgKGQ6IHsga2V5OiBzdHJpbmcgfSkgPT4gZC5rZXkgPT09IHR5cGVEZWNvcmF0b3JLZXlcbiAgICAgICAgICApIHx8IHt9O1xuICAgICAgICBsZXQgYWxsb3dlZFR5cGVzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBpZiAodHlwZXMgJiYgdHlwZXMucHJvcHMpIHtcbiAgICAgICAgICBjb25zdCBjdXN0b21UeXBlcyA9IEFycmF5LmlzQXJyYXkoKG9iaiBhcyBhbnkpW3Byb3BdKVxuICAgICAgICAgICAgPyB0eXBlcy5wcm9wcy5jbGFzc1xuICAgICAgICAgICAgOiB0eXBlcy5wcm9wcy5jdXN0b21UeXBlcztcbiAgICAgICAgICBpZiAoY3VzdG9tVHlwZXMpXG4gICAgICAgICAgICBhbGxvd2VkVHlwZXMgPSBBcnJheS5pc0FycmF5KGN1c3RvbVR5cGVzKVxuICAgICAgICAgICAgICA/IGN1c3RvbVR5cGVzLm1hcCgodCkgPT4gYCR7dH1gLnRvTG93ZXJDYXNlKCkpXG4gICAgICAgICAgICAgIDogW2N1c3RvbVR5cGVzLnRvTG93ZXJDYXNlKCldO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgdmFsaWRhdGUgPSAocHJvcDogc3RyaW5nLCB2YWx1ZTogYW55KTogYW55ID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSBcIm9iamVjdFwiIHx8IHR5cGVvZiB2YWx1ZSA9PT0gXCJmdW5jdGlvblwiKVxuICAgICAgICAgICAgcmV0dXJuIGlzTW9kZWwodmFsdWUpXG4gICAgICAgICAgICAgID8gKHZhbHVlIGFzIE1vZGVsKS5oYXNFcnJvcnMoKVxuICAgICAgICAgICAgICA6IGFsbG93ZWRUeXBlcy5pbmNsdWRlcyh0eXBlb2YgdmFsdWUpXG4gICAgICAgICAgICAgICAgPyB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA6IFwiVmFsdWUgaGFzIG5vIHZhbGlkYXRhYmxlIHR5cGVcIjtcbiAgICAgICAgfTtcblxuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlIEFycmF5Lm5hbWU6XG4gICAgICAgICAgY2FzZSBTZXQubmFtZTpcbiAgICAgICAgICAgIGlmIChhbGxEZWNvcmF0b3JzLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb25zdCBsaXN0RGVjID0gYWxsRGVjb3JhdG9ycy5maW5kKFxuICAgICAgICAgICAgICAgIChkOiB7IGtleTogc3RyaW5nIH0pID0+IGQua2V5ID09PSBWYWxpZGF0aW9uS2V5cy5MSVNUXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIGlmIChsaXN0RGVjKSB7XG4gICAgICAgICAgICAgICAgZXJyID0gKFxuICAgICAgICAgICAgICAgICAgYyA9PT0gQXJyYXkubmFtZVxuICAgICAgICAgICAgICAgICAgICA/IChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF1cbiAgICAgICAgICAgICAgICAgICAgOiAvLyBJZiBpdCdzIGEgU2V0XG4gICAgICAgICAgICAgICAgICAgICAgKG9iaiBhcyBSZWNvcmQ8c3RyaW5nLCBhbnk+KVtwcm9wXS52YWx1ZXMoKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgIC5tYXAoKHY6IFZhbGlkYXRhYmxlKSA9PiB2YWxpZGF0ZShwcm9wLCB2KSlcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGU6IGFueSkgPT4gISFlKSBhcyBhbnk7XG4gICAgICAgICAgICAgICAgaWYgKCFlcnI/Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHJlc3VsdCBpcyBhbiBlbXB0eSBsaXN0Li4uXG4gICAgICAgICAgICAgICAgICBlcnIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgaWYgKChvYmogYXMgUmVjb3JkPHN0cmluZywgYW55PilbcHJvcF0pXG4gICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdGUocHJvcCwgKG9iaiBhcyBhbnkpW3Byb3BdKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGU6IGFueSkge1xuICAgICAgICAgICAgICBjb25zb2xlLndhcm4oc2YoXCJNb2RlbCBzaG91bGQgYmUgdmFsaWRhdGFibGUgYnV0IGl0cyBub3Q6IFwiICsgZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdCB8fCB7fTtcbiAgICAgICAgcmVzdWx0W3Byb3BdID0gZXJyIGFzIGFueTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcmVzdWx0ID8gbmV3IE1vZGVsRXJyb3JEZWZpbml0aW9uKHJlc3VsdCkgOiB1bmRlZmluZWQ7XG59XG4iXX0=
@@ -0,0 +1,14 @@
1
+ import { ModelErrorDefinition } from "./ModelErrorDefinition";
2
+ import { Model } from "./Model";
3
+ /**
4
+ * @summary Analyses the decorations of the properties and validates the obj according to them
5
+ *
6
+ * @typedef T extends Model
7
+ * @prop {T} obj Model object to validate
8
+ * @prop {string[]} [propsToIgnore] object properties to ignore in the validation
9
+ *
10
+ * @function validate
11
+ * @memberOf module:decorator-validation.Validation
12
+ * @category Validation
13
+ */
14
+ export declare function validate<T extends Model>(obj: T, ...propsToIgnore: string[]): ModelErrorDefinition | undefined;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ModelKeys = void 0;
4
+ /**
5
+ * @summary Defines the various Model keys used for reflection
6
+ *
7
+ * @property {string} REFLECT prefix to all other keys
8
+ * @property {string} TYPE type key
9
+ * @property {string} PARAMS method params key
10
+ * @property {string} RETURN method return key
11
+ * @property {string} MODEL model key
12
+ * @property {string} ANCHOR anchor key. will serve as a ghost property in the model
13
+ *
14
+ * @constant ModelKeys
15
+ * @memberOf module:decorator-validation.Model
16
+ * @category Model
17
+ */
18
+ var ModelKeys;
19
+ (function (ModelKeys) {
20
+ ModelKeys["REFLECT"] = "decaf.model.";
21
+ ModelKeys["TYPE"] = "design:type";
22
+ ModelKeys["PARAMS"] = "design:paramtypes";
23
+ ModelKeys["RETURN"] = "design:returntype";
24
+ ModelKeys["MODEL"] = "model";
25
+ ModelKeys["ANCHOR"] = "__model";
26
+ ModelKeys["CONSTRUCTION"] = "constructed-by";
27
+ ModelKeys["ATTRIBUTE"] = "__attributes";
28
+ ModelKeys["HASHING"] = "hashing";
29
+ ModelKeys["SERIALIZATION"] = "serialization";
30
+ })(ModelKeys || (exports.ModelKeys = ModelKeys = {}));
31
+
32
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbInNyYy91dGlscy9jb25zdGFudHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUE7Ozs7Ozs7Ozs7Ozs7R0FhRztBQUNILElBQVksU0FXWDtBQVhELFdBQVksU0FBUztJQUNuQixxQ0FBd0IsQ0FBQTtJQUN4QixpQ0FBb0IsQ0FBQTtJQUNwQix5Q0FBNEIsQ0FBQTtJQUM1Qix5Q0FBNEIsQ0FBQTtJQUM1Qiw0QkFBZSxDQUFBO0lBQ2YsK0JBQWtCLENBQUE7SUFDbEIsNENBQStCLENBQUE7SUFDL0IsdUNBQTBCLENBQUE7SUFDMUIsZ0NBQW1CLENBQUE7SUFDbkIsNENBQStCLENBQUE7QUFDakMsQ0FBQyxFQVhXLFNBQVMseUJBQVQsU0FBUyxRQVdwQiIsImZpbGUiOiJ1dGlscy9jb25zdGFudHMuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBzdW1tYXJ5IERlZmluZXMgdGhlIHZhcmlvdXMgTW9kZWwga2V5cyB1c2VkIGZvciByZWZsZWN0aW9uXG4gKlxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFRkxFQ1QgcHJlZml4IHRvIGFsbCBvdGhlciBrZXlzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gVFlQRSB0eXBlIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFBBUkFNUyBtZXRob2QgcGFyYW1zIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFJFVFVSTiBtZXRob2QgcmV0dXJuIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IE1PREVMIG1vZGVsIGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IEFOQ0hPUiBhbmNob3Iga2V5LiB3aWxsIHNlcnZlIGFzIGEgZ2hvc3QgcHJvcGVydHkgaW4gdGhlIG1vZGVsXG4gKlxuICogQGNvbnN0YW50IE1vZGVsS2V5c1xuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5Nb2RlbFxuICogQGNhdGVnb3J5IE1vZGVsXG4gKi9cbmV4cG9ydCBlbnVtIE1vZGVsS2V5cyB7XG4gIFJFRkxFQ1QgPSBcImRlY2FmLm1vZGVsLlwiLFxuICBUWVBFID0gXCJkZXNpZ246dHlwZVwiLFxuICBQQVJBTVMgPSBcImRlc2lnbjpwYXJhbXR5cGVzXCIsXG4gIFJFVFVSTiA9IFwiZGVzaWduOnJldHVybnR5cGVcIixcbiAgTU9ERUwgPSBcIm1vZGVsXCIsXG4gIEFOQ0hPUiA9IFwiX19tb2RlbFwiLFxuICBDT05TVFJVQ1RJT04gPSBcImNvbnN0cnVjdGVkLWJ5XCIsXG4gIEFUVFJJQlVURSA9IFwiX19hdHRyaWJ1dGVzXCIsXG4gIEhBU0hJTkcgPSBcImhhc2hpbmdcIixcbiAgU0VSSUFMSVpBVElPTiA9IFwic2VyaWFsaXphdGlvblwiLFxufVxuIl19
@@ -0,0 +1,26 @@
1
+ /**
2
+ * @summary Defines the various Model keys used for reflection
3
+ *
4
+ * @property {string} REFLECT prefix to all other keys
5
+ * @property {string} TYPE type key
6
+ * @property {string} PARAMS method params key
7
+ * @property {string} RETURN method return key
8
+ * @property {string} MODEL model key
9
+ * @property {string} ANCHOR anchor key. will serve as a ghost property in the model
10
+ *
11
+ * @constant ModelKeys
12
+ * @memberOf module:decorator-validation.Model
13
+ * @category Model
14
+ */
15
+ export declare enum ModelKeys {
16
+ REFLECT = "decaf.model.",
17
+ TYPE = "design:type",
18
+ PARAMS = "design:paramtypes",
19
+ RETURN = "design:returntype",
20
+ MODEL = "model",
21
+ ANCHOR = "__model",
22
+ CONSTRUCTION = "constructed-by",
23
+ ATTRIBUTE = "__attributes",
24
+ HASHING = "hashing",
25
+ SERIALIZATION = "serialization"
26
+ }
@@ -0,0 +1,253 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.dateFromFormat = dateFromFormat;
4
+ exports.bindDateToString = bindDateToString;
5
+ exports.isValidDate = isValidDate;
6
+ exports.twoDigitPad = twoDigitPad;
7
+ exports.formatDate = formatDate;
8
+ exports.parseDate = parseDate;
9
+ require("reflect-metadata");
10
+ const constants_1 = require("../validation/Validators/constants.cjs");
11
+ const strings_1 = require("./strings.cjs");
12
+ /**
13
+ * @summary Reverses the process from {@link formatDate}
14
+ *
15
+ * @param {string} date the date string to be converted back into date
16
+ * @param {string} format the date format
17
+ * @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?)
18
+ *
19
+ * @function dateFromFormat
20
+ * @memberOf module:decorator-validation.Utils.Dates
21
+ * @category Format
22
+ */
23
+ function dateFromFormat(date, format) {
24
+ let formatRegexp = format;
25
+ // Hour
26
+ if (formatRegexp.match(/hh/))
27
+ formatRegexp = formatRegexp.replace("hh", "(?<hour>\\d{2})");
28
+ else if (formatRegexp.match(/h/))
29
+ formatRegexp = formatRegexp.replace("h", "(?<hour>\\d{1,2})");
30
+ else if (formatRegexp.match(/HH/))
31
+ formatRegexp = formatRegexp.replace("HH", "(?<hour>\\d{2})");
32
+ else if (formatRegexp.match(/H/))
33
+ formatRegexp = formatRegexp.replace("H", "(?<hour>\\d{1,2})");
34
+ // Minutes
35
+ if (formatRegexp.match(/mm/))
36
+ formatRegexp = formatRegexp.replace("mm", "(?<minutes>\\d{2})");
37
+ else if (formatRegexp.match(/m/))
38
+ formatRegexp = formatRegexp.replace("m", "(?<minutes>\\d{1,2})");
39
+ // Seconds
40
+ if (formatRegexp.match(/ss/))
41
+ formatRegexp = formatRegexp.replace("ss", "(?<seconds>\\d{2})");
42
+ else if (formatRegexp.match(/s/))
43
+ formatRegexp = formatRegexp.replace("s", "(?<seconds>\\d{1,2})");
44
+ // Day
45
+ if (formatRegexp.match(/dd/))
46
+ formatRegexp = formatRegexp.replace("dd", "(?<day>\\d{2})");
47
+ else if (formatRegexp.match(/d/))
48
+ formatRegexp = formatRegexp.replace("d", "(?<day>\\d{1,2})");
49
+ // Day Of Week
50
+ if (formatRegexp.match(/EEEE/))
51
+ formatRegexp = formatRegexp.replace("EEEE", "(?<dayofweek>\\w+)");
52
+ // eslint-disable-next-line no-dupe-else-if
53
+ else if (formatRegexp.match(/EEEE/))
54
+ formatRegexp = formatRegexp.replace("EEE", "(?<dayofweek>\\w+)");
55
+ // Year
56
+ if (formatRegexp.match(/yyyy/))
57
+ formatRegexp = formatRegexp.replace("yyyy", "(?<year>\\d{4})");
58
+ else if (formatRegexp.match(/yy/))
59
+ formatRegexp = formatRegexp.replace("yy", "(?<year>\\d{2})");
60
+ // Month
61
+ if (formatRegexp.match(/MMMM/))
62
+ formatRegexp = formatRegexp.replace("MMMM", "(?<monthname>\\w+)");
63
+ else if (formatRegexp.match(/MMM/))
64
+ formatRegexp = formatRegexp.replace("MMM", "(?<monthnamesmall>\\w+)");
65
+ if (formatRegexp.match(/MM/))
66
+ formatRegexp = formatRegexp.replace("MM", "(?<month>\\d{2})");
67
+ else if (formatRegexp.match(/M/))
68
+ formatRegexp = formatRegexp.replace("M", "(?<month>\\d{1,2})");
69
+ // Milis and Am Pm
70
+ formatRegexp = formatRegexp
71
+ .replace("S", "(?<milis>\\d{1,3})")
72
+ .replace("aaa", "(?<ampm>\\w{2})");
73
+ const regexp = new RegExp(formatRegexp, "g");
74
+ const match = regexp.exec(date);
75
+ if (!match || !match.groups)
76
+ return new Date(date);
77
+ const safeParseInt = function (n) {
78
+ if (!n)
79
+ return 0;
80
+ const result = parseInt(n);
81
+ return isNaN(result) ? 0 : result;
82
+ };
83
+ const year = safeParseInt(match.groups.year);
84
+ const day = safeParseInt(match.groups.day);
85
+ const amPm = match.groups.ampm;
86
+ let hour = safeParseInt(match.groups.hour);
87
+ if (amPm)
88
+ hour = amPm === "PM" ? hour + 12 : hour;
89
+ const minutes = safeParseInt(match.groups.minutes);
90
+ const seconds = safeParseInt(match.groups.seconds);
91
+ const ms = safeParseInt(match.groups.milis);
92
+ const monthName = match.groups.monthname;
93
+ const monthNameSmall = match.groups.monthnamesmall;
94
+ let month = match.groups.month;
95
+ if (monthName)
96
+ month = constants_1.MONTH_NAMES.indexOf(monthName);
97
+ else if (monthNameSmall) {
98
+ const m = constants_1.MONTH_NAMES.find((m) => m.toLowerCase().startsWith(monthNameSmall.toLowerCase()));
99
+ if (!m)
100
+ return new Date(date);
101
+ month = constants_1.MONTH_NAMES.indexOf(m);
102
+ }
103
+ else
104
+ month = safeParseInt(`${month}`);
105
+ return new Date(year, month - 1, day, hour, minutes, seconds, ms);
106
+ }
107
+ /**
108
+ * @summary Binds a date format to a string
109
+ * @param {Date} [date]
110
+ * @param {string} [format]
111
+ * @memberOf module:decorator-validation.Utils.Format
112
+ * @category Utilities
113
+ */
114
+ function bindDateToString(date, format) {
115
+ if (!date)
116
+ return;
117
+ const func = () => formatDate(date, format);
118
+ Object.defineProperty(date, "toISOString", {
119
+ enumerable: false,
120
+ configurable: false,
121
+ value: func,
122
+ });
123
+ Object.defineProperty(date, "toString", {
124
+ enumerable: false,
125
+ configurable: false,
126
+ value: func,
127
+ });
128
+ // Object.setPrototypeOf(date, Date.prototype);
129
+ return date;
130
+ }
131
+ /**
132
+ * @summary Helper function to be used instead of instanceOf Date
133
+ * @param date
134
+ * @memberOf module:decorator-validation.Utils.Dates
135
+ * @category Validation
136
+ */
137
+ function isValidDate(date) {
138
+ return (date &&
139
+ Object.prototype.toString.call(date) === "[object Date]" &&
140
+ !Number.isNaN(date));
141
+ }
142
+ /**
143
+ * @summary Util function to pad numbers
144
+ * @param {number} num
145
+ *
146
+ * @return {string}
147
+ *
148
+ * @function twoDigitPad
149
+ * @memberOf module:decorator-validation.Utils.Format
150
+ * @category Format
151
+ */
152
+ function twoDigitPad(num) {
153
+ return num < 10 ? "0" + num : num.toString();
154
+ }
155
+ /**
156
+ * @summary Date Format Handling
157
+ * @description Code from {@link https://stackoverflow.com/questions/3552461/how-to-format-a-javascript-date}
158
+ *
159
+ * <pre>
160
+ * Using similar formatting as Moment.js, Class DateTimeFormatter (Java), and Class SimpleDateFormat (Java),
161
+ * I implemented a comprehensive solution formatDate(date, patternStr) where the code is easy to read and modify.
162
+ * You can display date, time, AM/PM, etc.
163
+ *
164
+ * Date and Time Patterns
165
+ * yy = 2-digit year; yyyy = full year
166
+ * M = digit month; MM = 2-digit month; MMM = short month name; MMMM = full month name
167
+ * EEEE = full weekday name; EEE = short weekday name
168
+ * d = digit day; dd = 2-digit day
169
+ * h = hours am/pm; hh = 2-digit hours am/pm; H = hours; HH = 2-digit hours
170
+ * m = minutes; mm = 2-digit minutes; aaa = AM/PM
171
+ * s = seconds; ss = 2-digit seconds
172
+ * S = miliseconds
173
+ * </pre>
174
+ *
175
+ * @param {Date} date
176
+ * @param {string} [patternStr] defaults to 'yyyy/MM/dd'
177
+ * @return {string} the formatted date
178
+ *
179
+ * @function formatDate
180
+ * @memberOf module:decorator-validation.Utils.Dates
181
+ * @category Format
182
+ */
183
+ function formatDate(date, patternStr = "yyyy/MM/dd") {
184
+ 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 = constants_1.DAYS_OF_WEEK_NAMES[date.getDay()], EEE = EEEE.substr(0, 3), dd = twoDigitPad(day), M = month + 1, MM = twoDigitPad(M), MMMM = constants_1.MONTH_NAMES[month], MMM = MMMM.substr(0, 3), yyyy = year + "", yy = yyyy.substr(2, 2);
185
+ // checks to see if month name will be used
186
+ patternStr = patternStr
187
+ .replace("hh", hh)
188
+ .replace("h", h.toString())
189
+ .replace("HH", HH)
190
+ .replace("H", hour.toString())
191
+ .replace("mm", mm)
192
+ .replace("m", minute.toString())
193
+ .replace("ss", ss)
194
+ .replace("s", second.toString())
195
+ .replace("S", miliseconds.toString())
196
+ .replace("dd", dd)
197
+ .replace("d", day.toString())
198
+ .replace("EEEE", EEEE)
199
+ .replace("EEE", EEE)
200
+ .replace("yyyy", yyyy)
201
+ .replace("yy", yy)
202
+ .replace("aaa", aaa);
203
+ if (patternStr.indexOf("MMM") > -1) {
204
+ patternStr = patternStr.replace("MMMM", MMMM).replace("MMM", MMM);
205
+ }
206
+ else {
207
+ patternStr = patternStr.replace("MM", MM).replace("M", M.toString());
208
+ }
209
+ return patternStr;
210
+ }
211
+ /**
212
+ * @summary Parses a date from a specified format
213
+ * @param {string} format
214
+ * @param {string | Date | number} [v]
215
+ * @memberOf module:decorator-validation.Utils.Dates
216
+ * @category Format
217
+ */
218
+ function parseDate(format, v) {
219
+ let value = undefined;
220
+ if (!v)
221
+ return undefined;
222
+ if (v instanceof Date)
223
+ try {
224
+ value = dateFromFormat(formatDate(v, format), format);
225
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
226
+ }
227
+ catch (e) {
228
+ throw new Error((0, strings_1.sf)("Could not convert date {0} to format: {1}", v.toString(), format));
229
+ }
230
+ else if (typeof v === "string") {
231
+ value = dateFromFormat(v, format);
232
+ }
233
+ else if (typeof v === "number") {
234
+ const d = new Date(v);
235
+ value = dateFromFormat(formatDate(d, format), format);
236
+ }
237
+ else if (isValidDate(v)) {
238
+ try {
239
+ const d = new Date(v);
240
+ value = dateFromFormat(formatDate(d, format), format);
241
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
242
+ }
243
+ catch (e) {
244
+ throw new Error((0, strings_1.sf)("Could not convert date {0} to format: {1}", v, format));
245
+ }
246
+ }
247
+ else {
248
+ throw new Error(`Invalid value provided ${v}`);
249
+ }
250
+ return bindDateToString(value, format);
251
+ }
252
+
253
+ //# sourceMappingURL=data:application/json;charset=utf8;base64,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RUFDaEQsR0FBRyxHQUFXLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxFQUMvQixFQUFFLEdBQVcsV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUM3QixDQUFDLEdBQVcsS0FBSyxHQUFHLENBQUMsRUFDckIsRUFBRSxHQUFXLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFDM0IsSUFBSSxHQUFXLHVCQUFXLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsRUFDL0IsSUFBSSxHQUFXLElBQUksR0FBRyxFQUFFLEVBQ3hCLEVBQUUsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNqQywyQ0FBMkM7SUFDM0MsVUFBVSxHQUFHLFVBQVU7U0FDcEIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDMUIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDN0IsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0IsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDL0IsT0FBTyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsUUFBUSxFQUFFLENBQUM7U0FDcEMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLENBQUM7U0FFNUIsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDckIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUM7U0FDbkIsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUM7U0FDckIsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUM7U0FDakIsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLFVBQVUsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNuQyxVQUFVLEdBQUcsVUFBVSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRSxDQUFDO1NBQU0sQ0FBQztRQUNOLFVBQVUsR0FBRyxVQUFVLENBQUMsT0FBTyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLENBQUM7SUFDRCxPQUFPLFVBQVUsQ0FBQztBQUNwQixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsU0FBUyxDQUFDLE1BQWMsRUFBRSxDQUEwQjtJQUNsRSxJQUFJLEtBQUssR0FBcUIsU0FBUyxDQUFDO0lBRXhDLElBQUksQ0FBQyxDQUFDO1FBQUUsT0FBTyxTQUFTLENBQUM7SUFFekIsSUFBSSxDQUFDLFlBQVksSUFBSTtRQUNuQixJQUFJLENBQUM7WUFDSCxLQUFLLEdBQUcsY0FBYyxDQUFDLFVBQVUsQ0FBQyxDQUFTLEVBQUUsTUFBTSxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDOUQsNkRBQTZEO1FBQy9ELENBQUM7UUFBQyxPQUFPLENBQU0sRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQ2IsSUFBQSxZQUFFLEVBQUMsMkNBQTJDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sQ0FBQyxDQUN0RSxDQUFDO1FBQ0osQ0FBQztTQUNFLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDL0IsS0FBSyxHQUFHLGNBQWMsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDcEMsQ0FBQztTQUFNLElBQUksT0FBTyxDQUFDLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDakMsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDdEIsS0FBSyxHQUFHLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0lBQ3hELENBQUM7U0FBTSxJQUFJLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQztZQUNILE1BQU0sQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ3RCLEtBQUssR0FBRyxjQUFjLENBQUMsVUFBVSxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUN0RCw2REFBNkQ7UUFDL0QsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDWCxNQUFNLElBQUksS0FBSyxDQUNiLElBQUEsWUFBRSxFQUFDLDJDQUEyQyxFQUFFLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FDM0QsQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUNELE9BQU8sZ0JBQWdCLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBQ3pDLENBQUMiLCJmaWxlIjoidXRpbHMvZGF0ZXMuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgXCJyZWZsZWN0LW1ldGFkYXRhXCI7XG5pbXBvcnQge1xuICBEQVlTX09GX1dFRUtfTkFNRVMsXG4gIE1PTlRIX05BTUVTLFxufSBmcm9tIFwiLi4vdmFsaWRhdGlvbi9WYWxpZGF0b3JzL2NvbnN0YW50c1wiO1xuaW1wb3J0IHsgc2YgfSBmcm9tIFwiLi9zdHJpbmdzXCI7XG5cbi8qKlxuICogQHN1bW1hcnkgUmV2ZXJzZXMgdGhlIHByb2Nlc3MgZnJvbSB7QGxpbmsgZm9ybWF0RGF0ZX1cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZGF0ZSB0aGUgZGF0ZSBzdHJpbmcgdG8gYmUgY29udmVydGVkIGJhY2sgaW50byBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0IHRoZSBkYXRlIGZvcm1hdFxuICogQHJldHVybiB7RGF0ZX0gdGhlIGRhdGUgZnJvbSB0aGUgZm9ybWF0IG9yIHRoZSBzdGFuZGFyZCBuZXcgRGF0ZSh7QHByb3AgZGF0ZX0pIGlmIHRoZSBzdHJpbmcgY291bGRuJ3QgYmUgcGFyc2VkIChhcmUgeW91IHN1cmUgdGhlIGZvcm1hdCBtYXRjaGVzIHRoZSBzdHJpbmc/KVxuICpcbiAqIEBmdW5jdGlvbiBkYXRlRnJvbUZvcm1hdFxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZGF0ZUZyb21Gb3JtYXQoZGF0ZTogc3RyaW5nLCBmb3JtYXQ6IHN0cmluZykge1xuICBsZXQgZm9ybWF0UmVnZXhwOiBzdHJpbmcgPSBmb3JtYXQ7XG5cbiAgLy8gSG91clxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oaC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiaGhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9oLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJoXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ISC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiSEhcIiwgXCIoPzxob3VyPlxcXFxkezJ9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9ILykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJIXCIsIFwiKD88aG91cj5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBNaW51dGVzXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL21tLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJtbVwiLCBcIig/PG1pbnV0ZXM+XFxcXGR7Mn0pXCIpO1xuICBlbHNlIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL20vKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcIm1cIiwgXCIoPzxtaW51dGVzPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIFNlY29uZHNcbiAgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvc3MvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInNzXCIsIFwiKD88c2Vjb25kcz5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvcy8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwic1wiLCBcIig/PHNlY29uZHM+XFxcXGR7MSwyfSlcIik7XG5cbiAgLy8gRGF5XG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL2RkLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJkZFwiLCBcIig/PGRheT5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvZC8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiZFwiLCBcIig/PGRheT5cXFxcZHsxLDJ9KVwiKTtcblxuICAvLyBEYXkgT2YgV2Vla1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVFXCIsIFwiKD88ZGF5b2Z3ZWVrPlxcXFx3KylcIik7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kdXBlLWVsc2UtaWZcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9FRUVFLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJFRUVcIiwgXCIoPzxkYXlvZndlZWs+XFxcXHcrKVwiKTtcblxuICAvLyBZZWFyXG4gIGlmIChmb3JtYXRSZWdleHAubWF0Y2goL3l5eXkvKSlcbiAgICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHAucmVwbGFjZShcInl5eXlcIiwgXCIoPzx5ZWFyPlxcXFxkezR9KVwiKTtcbiAgZWxzZSBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC95eS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwieXlcIiwgXCIoPzx5ZWFyPlxcXFxkezJ9KVwiKTtcblxuICAvLyBNb250aFxuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1NXCIsIFwiKD88bW9udGhuYW1lPlxcXFx3KylcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTU1NLykpXG4gICAgZm9ybWF0UmVnZXhwID0gZm9ybWF0UmVnZXhwLnJlcGxhY2UoXCJNTU1cIiwgXCIoPzxtb250aG5hbWVzbWFsbD5cXFxcdyspXCIpO1xuICBpZiAoZm9ybWF0UmVnZXhwLm1hdGNoKC9NTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTU1cIiwgXCIoPzxtb250aD5cXFxcZHsyfSlcIik7XG4gIGVsc2UgaWYgKGZvcm1hdFJlZ2V4cC5tYXRjaCgvTS8pKVxuICAgIGZvcm1hdFJlZ2V4cCA9IGZvcm1hdFJlZ2V4cC5yZXBsYWNlKFwiTVwiLCBcIig/PG1vbnRoPlxcXFxkezEsMn0pXCIpO1xuXG4gIC8vIE1pbGlzIGFuZCBBbSBQbVxuICBmb3JtYXRSZWdleHAgPSBmb3JtYXRSZWdleHBcbiAgICAucmVwbGFjZShcIlNcIiwgXCIoPzxtaWxpcz5cXFxcZHsxLDN9KVwiKVxuICAgIC5yZXBsYWNlKFwiYWFhXCIsIFwiKD88YW1wbT5cXFxcd3syfSlcIik7XG5cbiAgY29uc3QgcmVnZXhwID0gbmV3IFJlZ0V4cChmb3JtYXRSZWdleHAsIFwiZ1wiKTtcblxuICBjb25zdCBtYXRjaDoge1xuICAgIGdyb3Vwczoge1xuICAgICAgeWVhcj86IHN0cmluZztcbiAgICAgIGRheT86IHN0cmluZztcbiAgICAgIGFtcG0/OiBzdHJpbmc7XG4gICAgICBob3VyPzogc3RyaW5nO1xuICAgICAgbWludXRlcz86IHN0cmluZztcbiAgICAgIHNlY29uZHM/OiBzdHJpbmc7XG4gICAgICBtaWxpcz86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZT86IHN0cmluZztcbiAgICAgIG1vbnRobmFtZXNtYWxsPzogc3RyaW5nO1xuICAgICAgbW9udGg/OiBzdHJpbmc7XG4gICAgfTtcbiAgfSA9IHJlZ2V4cC5leGVjKGRhdGUpIGFzIGFueTtcblxuICBpZiAoIW1hdGNoIHx8ICFtYXRjaC5ncm91cHMpIHJldHVybiBuZXcgRGF0ZShkYXRlKTtcblxuICBjb25zdCBzYWZlUGFyc2VJbnQgPSBmdW5jdGlvbiAobj86IHN0cmluZykge1xuICAgIGlmICghbikgcmV0dXJuIDA7XG4gICAgY29uc3QgcmVzdWx0ID0gcGFyc2VJbnQobik7XG5cbiAgICByZXR1cm4gaXNOYU4ocmVzdWx0KSA/IDAgOiByZXN1bHQ7XG4gIH07XG5cbiAgY29uc3QgeWVhciA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMueWVhcik7XG4gIGNvbnN0IGRheSA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMuZGF5KTtcblxuICBjb25zdCBhbVBtID0gbWF0Y2guZ3JvdXBzLmFtcG07XG4gIGxldCBob3VyID0gc2FmZVBhcnNlSW50KG1hdGNoLmdyb3Vwcy5ob3VyKTtcblxuICBpZiAoYW1QbSkgaG91ciA9IGFtUG0gPT09IFwiUE1cIiA/IGhvdXIgKyAxMiA6IGhvdXI7XG5cbiAgY29uc3QgbWludXRlcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWludXRlcyk7XG4gIGNvbnN0IHNlY29uZHMgPSBzYWZlUGFyc2VJbnQobWF0Y2guZ3JvdXBzLnNlY29uZHMpO1xuICBjb25zdCBtcyA9IHNhZmVQYXJzZUludChtYXRjaC5ncm91cHMubWlsaXMpO1xuXG4gIGNvbnN0IG1vbnRoTmFtZSA9IG1hdGNoLmdyb3Vwcy5tb250aG5hbWU7XG4gIGNvbnN0IG1vbnRoTmFtZVNtYWxsID0gbWF0Y2guZ3JvdXBzLm1vbnRobmFtZXNtYWxsO1xuICBsZXQgbW9udGg6IG51bWJlciB8IHN0cmluZyA9IG1hdGNoLmdyb3Vwcy5tb250aCBhcyBzdHJpbmc7XG4gIGlmIChtb250aE5hbWUpIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtb250aE5hbWUpO1xuICBlbHNlIGlmIChtb250aE5hbWVTbWFsbCkge1xuICAgIGNvbnN0IG0gPSBNT05USF9OQU1FUy5maW5kKChtKSA9PlxuICAgICAgbS50b0xvd2VyQ2FzZSgpLnN0YXJ0c1dpdGgobW9udGhOYW1lU21hbGwudG9Mb3dlckNhc2UoKSlcbiAgICApO1xuICAgIGlmICghbSkgcmV0dXJuIG5ldyBEYXRlKGRhdGUpO1xuICAgIG1vbnRoID0gTU9OVEhfTkFNRVMuaW5kZXhPZihtKTtcbiAgfSBlbHNlIG1vbnRoID0gc2FmZVBhcnNlSW50KGAke21vbnRofWApO1xuXG4gIHJldHVybiBuZXcgRGF0ZSh5ZWFyLCBtb250aCAtIDEsIGRheSwgaG91ciwgbWludXRlcywgc2Vjb25kcywgbXMpO1xufVxuXG4vKipcbiAqIEBzdW1tYXJ5IEJpbmRzIGEgZGF0ZSBmb3JtYXQgdG8gYSBzdHJpbmdcbiAqIEBwYXJhbSB7RGF0ZX0gW2RhdGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2Zvcm1hdF1cbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgVXRpbGl0aWVzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBiaW5kRGF0ZVRvU3RyaW5nKGRhdGU6IERhdGUgfCB1bmRlZmluZWQsIGZvcm1hdDogc3RyaW5nKSB7XG4gIGlmICghZGF0ZSkgcmV0dXJuO1xuICBjb25zdCBmdW5jID0gKCkgPT4gZm9ybWF0RGF0ZShkYXRlLCBmb3JtYXQpO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZGF0ZSwgXCJ0b0lTT1N0cmluZ1wiLCB7XG4gICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICB2YWx1ZTogZnVuYyxcbiAgfSk7XG4gIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkYXRlLCBcInRvU3RyaW5nXCIsIHtcbiAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIHZhbHVlOiBmdW5jLFxuICB9KTtcbiAgLy8gT2JqZWN0LnNldFByb3RvdHlwZU9mKGRhdGUsIERhdGUucHJvdG90eXBlKTtcbiAgcmV0dXJuIGRhdGU7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgSGVscGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiBpbnN0YW5jZU9mIERhdGVcbiAqIEBwYXJhbSBkYXRlXG4gKiBAbWVtYmVyT2YgbW9kdWxlOmRlY29yYXRvci12YWxpZGF0aW9uLlV0aWxzLkRhdGVzXG4gKiBAY2F0ZWdvcnkgVmFsaWRhdGlvblxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZERhdGUoZGF0ZTogYW55KTogYm9vbGVhbiB7XG4gIHJldHVybiAoXG4gICAgZGF0ZSAmJlxuICAgIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChkYXRlKSA9PT0gXCJbb2JqZWN0IERhdGVdXCIgJiZcbiAgICAhTnVtYmVyLmlzTmFOKGRhdGUpXG4gICk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgVXRpbCBmdW5jdGlvbiB0byBwYWQgbnVtYmVyc1xuICogQHBhcmFtIHtudW1iZXJ9IG51bVxuICpcbiAqIEByZXR1cm4ge3N0cmluZ31cbiAqXG4gKiBAZnVuY3Rpb24gdHdvRGlnaXRQYWRcbiAqIEBtZW1iZXJPZiBtb2R1bGU6ZGVjb3JhdG9yLXZhbGlkYXRpb24uVXRpbHMuRm9ybWF0XG4gKiBAY2F0ZWdvcnkgRm9ybWF0XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0d29EaWdpdFBhZChudW06IG51bWJlcik6IHN0cmluZyB7XG4gIHJldHVybiBudW0gPCAxMCA/IFwiMFwiICsgbnVtIDogbnVtLnRvU3RyaW5nKCk7XG59XG5cbi8qKlxuICogQHN1bW1hcnkgRGF0ZSBGb3JtYXQgSGFuZGxpbmdcbiAqIEBkZXNjcmlwdGlvbiBDb2RlIGZyb20ge0BsaW5rIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzM1NTI0NjEvaG93LXRvLWZvcm1hdC1hLWphdmFzY3JpcHQtZGF0ZX1cbiAqXG4gKiA8cHJlPlxuICogICAgICBVc2luZyBzaW1pbGFyIGZvcm1hdHRpbmcgYXMgTW9tZW50LmpzLCBDbGFzcyBEYXRlVGltZUZvcm1hdHRlciAoSmF2YSksIGFuZCBDbGFzcyBTaW1wbGVEYXRlRm9ybWF0IChKYXZhKSxcbiAqICAgICAgSSBpbXBsZW1lbnRlZCBhIGNvbXByZWhlbnNpdmUgc29sdXRpb24gZm9ybWF0RGF0ZShkYXRlLCBwYXR0ZXJuU3RyKSB3aGVyZSB0aGUgY29kZSBpcyBlYXN5IHRvIHJlYWQgYW5kIG1vZGlmeS5cbiAqICAgICAgWW91IGNhbiBkaXNwbGF5IGRhdGUsIHRpbWUsIEFNL1BNLCBldGMuXG4gKlxuICogICAgICBEYXRlIGFuZCBUaW1lIFBhdHRlcm5zXG4gKiAgICAgIHl5ID0gMi1kaWdpdCB5ZWFyOyB5eXl5ID0gZnVsbCB5ZWFyXG4gKiAgICAgIE0gPSBkaWdpdCBtb250aDsgTU0gPSAyLWRpZ2l0IG1vbnRoOyBNTU0gPSBzaG9ydCBtb250aCBuYW1lOyBNTU1NID0gZnVsbCBtb250aCBuYW1lXG4gKiAgICAgIEVFRUUgPSBmdWxsIHdlZWtkYXkgbmFtZTsgRUVFID0gc2hvcnQgd2Vla2RheSBuYW1lXG4gKiAgICAgIGQgPSBkaWdpdCBkYXk7IGRkID0gMi1kaWdpdCBkYXlcbiAqICAgICAgaCA9IGhvdXJzIGFtL3BtOyBoaCA9IDItZGlnaXQgaG91cnMgYW0vcG07IEggPSBob3VyczsgSEggPSAyLWRpZ2l0IGhvdXJzXG4gKiAgICAgIG0gPSBtaW51dGVzOyBtbSA9IDItZGlnaXQgbWludXRlczsgYWFhID0gQU0vUE1cbiAqICAgICAgcyA9IHNlY29uZHM7IHNzID0gMi1kaWdpdCBzZWNvbmRzXG4gKiAgICAgIFMgPSBtaWxpc2Vjb25kc1xuICogPC9wcmU+XG4gKlxuICogQHBhcmFtIHtEYXRlfSBkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gW3BhdHRlcm5TdHJdIGRlZmF1bHRzIHRvICd5eXl5L01NL2RkJ1xuICogQHJldHVybiB7c3RyaW5nfSB0aGUgZm9ybWF0dGVkIGRhdGVcbiAqXG4gKiBAZnVuY3Rpb24gZm9ybWF0RGF0ZVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0RGF0ZShkYXRlOiBEYXRlLCBwYXR0ZXJuU3RyOiBzdHJpbmcgPSBcInl5eXkvTU0vZGRcIikge1xuICBjb25zdCBkYXk6IG51bWJlciA9IGRhdGUuZ2V0RGF0ZSgpLFxuICAgIG1vbnRoOiBudW1iZXIgPSBkYXRlLmdldE1vbnRoKCksXG4gICAgeWVhcjogbnVtYmVyID0gZGF0ZS5nZXRGdWxsWWVhcigpLFxuICAgIGhvdXI6IG51bWJlciA9IGRhdGUuZ2V0SG91cnMoKSxcbiAgICBtaW51dGU6IG51bWJlciA9IGRhdGUuZ2V0TWludXRlcygpLFxuICAgIHNlY29uZDogbnVtYmVyID0gZGF0ZS5nZXRTZWNvbmRzKCksXG4gICAgbWlsaXNlY29uZHM6IG51bWJlciA9IGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCksXG4gICAgaDogbnVtYmVyID0gaG91ciAlIDEyLFxuICAgIGhoOiBzdHJpbmcgPSB0d29EaWdpdFBhZChoKSxcbiAgICBISDogc3RyaW5nID0gdHdvRGlnaXRQYWQoaG91ciksXG4gICAgbW06IHN0cmluZyA9IHR3b0RpZ2l0UGFkKG1pbnV0ZSksXG4gICAgc3M6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKHNlY29uZCksXG4gICAgYWFhOiBzdHJpbmcgPSBob3VyIDwgMTIgPyBcIkFNXCIgOiBcIlBNXCIsXG4gICAgRUVFRTogc3RyaW5nID0gREFZU19PRl9XRUVLX05BTUVTW2RhdGUuZ2V0RGF5KCldLFxuICAgIEVFRTogc3RyaW5nID0gRUVFRS5zdWJzdHIoMCwgMyksXG4gICAgZGQ6IHN0cmluZyA9IHR3b0RpZ2l0UGFkKGRheSksXG4gICAgTTogbnVtYmVyID0gbW9udGggKyAxLFxuICAgIE1NOiBzdHJpbmcgPSB0d29EaWdpdFBhZChNKSxcbiAgICBNTU1NOiBzdHJpbmcgPSBNT05USF9OQU1FU1ttb250aF0sXG4gICAgTU1NOiBzdHJpbmcgPSBNTU1NLnN1YnN0cigwLCAzKSxcbiAgICB5eXl5OiBzdHJpbmcgPSB5ZWFyICsgXCJcIixcbiAgICB5eTogc3RyaW5nID0geXl5eS5zdWJzdHIoMiwgMik7XG4gIC8vIGNoZWNrcyB0byBzZWUgaWYgbW9udGggbmFtZSB3aWxsIGJlIHVzZWRcbiAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHJcbiAgICAucmVwbGFjZShcImhoXCIsIGhoKVxuICAgIC5yZXBsYWNlKFwiaFwiLCBoLnRvU3RyaW5nKCkpXG4gICAgLnJlcGxhY2UoXCJISFwiLCBISClcbiAgICAucmVwbGFjZShcIkhcIiwgaG91ci50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwibW1cIiwgbW0pXG4gICAgLnJlcGxhY2UoXCJtXCIsIG1pbnV0ZS50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwic3NcIiwgc3MpXG4gICAgLnJlcGxhY2UoXCJzXCIsIHNlY29uZC50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiU1wiLCBtaWxpc2Vjb25kcy50b1N0cmluZygpKVxuICAgIC5yZXBsYWNlKFwiZGRcIiwgZGQpXG4gICAgLnJlcGxhY2UoXCJkXCIsIGRheS50b1N0cmluZygpKVxuXG4gICAgLnJlcGxhY2UoXCJFRUVFXCIsIEVFRUUpXG4gICAgLnJlcGxhY2UoXCJFRUVcIiwgRUVFKVxuICAgIC5yZXBsYWNlKFwieXl5eVwiLCB5eXl5KVxuICAgIC5yZXBsYWNlKFwieXlcIiwgeXkpXG4gICAgLnJlcGxhY2UoXCJhYWFcIiwgYWFhKTtcbiAgaWYgKHBhdHRlcm5TdHIuaW5kZXhPZihcIk1NTVwiKSA+IC0xKSB7XG4gICAgcGF0dGVyblN0ciA9IHBhdHRlcm5TdHIucmVwbGFjZShcIk1NTU1cIiwgTU1NTSkucmVwbGFjZShcIk1NTVwiLCBNTU0pO1xuICB9IGVsc2Uge1xuICAgIHBhdHRlcm5TdHIgPSBwYXR0ZXJuU3RyLnJlcGxhY2UoXCJNTVwiLCBNTSkucmVwbGFjZShcIk1cIiwgTS50b1N0cmluZygpKTtcbiAgfVxuICByZXR1cm4gcGF0dGVyblN0cjtcbn1cblxuLyoqXG4gKiBAc3VtbWFyeSBQYXJzZXMgYSBkYXRlIGZyb20gYSBzcGVjaWZpZWQgZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZ30gZm9ybWF0XG4gKiBAcGFyYW0ge3N0cmluZyB8IERhdGUgfCBudW1iZXJ9IFt2XVxuICogQG1lbWJlck9mIG1vZHVsZTpkZWNvcmF0b3ItdmFsaWRhdGlvbi5VdGlscy5EYXRlc1xuICogQGNhdGVnb3J5IEZvcm1hdFxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VEYXRlKGZvcm1hdDogc3RyaW5nLCB2Pzogc3RyaW5nIHwgRGF0ZSB8IG51bWJlcikge1xuICBsZXQgdmFsdWU6IERhdGUgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XG5cbiAgaWYgKCF2KSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gIGlmICh2IGluc3RhbmNlb2YgRGF0ZSlcbiAgICB0cnkge1xuICAgICAgdmFsdWUgPSBkYXRlRnJvbUZvcm1hdChmb3JtYXREYXRlKHYgYXMgRGF0ZSwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlOiBhbnkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgc2YoXCJDb3VsZCBub3QgY29udmVydCBkYXRlIHswfSB0byBmb3JtYXQ6IHsxfVwiLCB2LnRvU3RyaW5nKCksIGZvcm1hdClcbiAgICAgICk7XG4gICAgfVxuICBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJzdHJpbmdcIikge1xuICAgIHZhbHVlID0gZGF0ZUZyb21Gb3JtYXQodiwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdiA9PT0gXCJudW1iZXJcIikge1xuICAgIGNvbnN0IGQgPSBuZXcgRGF0ZSh2KTtcbiAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgfSBlbHNlIGlmIChpc1ZhbGlkRGF0ZSh2KSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBkID0gbmV3IERhdGUodik7XG4gICAgICB2YWx1ZSA9IGRhdGVGcm9tRm9ybWF0KGZvcm1hdERhdGUoZCwgZm9ybWF0KSwgZm9ybWF0KTtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tdW51c2VkLXZhcnNcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIHNmKFwiQ291bGQgbm90IGNvbnZlcnQgZGF0ZSB7MH0gdG8gZm9ybWF0OiB7MX1cIiwgdiwgZm9ybWF0KVxuICAgICAgKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHZhbHVlIHByb3ZpZGVkICR7dn1gKTtcbiAgfVxuICByZXR1cm4gYmluZERhdGVUb1N0cmluZyh2YWx1ZSwgZm9ybWF0KTtcbn1cbiJdfQ==