@fgv/ts-utils 1.2.1 → 1.3.0

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 (77) hide show
  1. package/LICENSE +0 -0
  2. package/README.md +4 -0
  3. package/brand.d.ts +8 -0
  4. package/brand.d.ts.map +1 -0
  5. package/brand.js +24 -0
  6. package/converter.d.ts +149 -105
  7. package/converter.d.ts.map +1 -0
  8. package/converter.js +46 -59
  9. package/converters.d.ts +432 -194
  10. package/converters.d.ts.map +1 -0
  11. package/converters.js +262 -151
  12. package/csvHelpers.d.ts +7 -0
  13. package/csvHelpers.d.ts.map +1 -0
  14. package/csvHelpers.js +12 -2
  15. package/extendedArray.d.ts +46 -0
  16. package/extendedArray.d.ts.map +1 -0
  17. package/extendedArray.js +46 -1
  18. package/formatter.d.ts +53 -0
  19. package/formatter.d.ts.map +1 -0
  20. package/formatter.js +24 -1
  21. package/hash.d.ts +31 -3
  22. package/hash.d.ts.map +1 -0
  23. package/hash.js +36 -5
  24. package/index.d.ts +7 -3
  25. package/index.d.ts.map +1 -0
  26. package/index.js +16 -6
  27. package/logger.d.ts +3 -2
  28. package/logger.d.ts.map +1 -0
  29. package/logger.js +1 -1
  30. package/package.json +13 -9
  31. package/rangeOf.d.ts +96 -0
  32. package/rangeOf.d.ts.map +1 -0
  33. package/rangeOf.js +80 -1
  34. package/result.d.ts +393 -39
  35. package/result.d.ts.map +1 -0
  36. package/result.js +259 -49
  37. package/ts-utils.d.ts +2451 -0
  38. package/tsdoc-metadata.json +11 -0
  39. package/utils.d.ts +49 -27
  40. package/utils.d.ts.map +1 -0
  41. package/utils.js +45 -28
  42. package/validation/boolean.d.ts +27 -0
  43. package/validation/boolean.d.ts.map +1 -0
  44. package/validation/boolean.js +59 -0
  45. package/validation/classes.d.ts +5 -0
  46. package/validation/classes.d.ts.map +1 -0
  47. package/validation/classes.js +34 -0
  48. package/validation/field.d.ts +43 -0
  49. package/validation/field.d.ts.map +1 -0
  50. package/validation/field.js +72 -0
  51. package/validation/genericValidator.d.ts +84 -0
  52. package/validation/genericValidator.d.ts.map +1 -0
  53. package/validation/genericValidator.js +138 -0
  54. package/validation/index.d.ts +7 -0
  55. package/validation/index.d.ts.map +1 -0
  56. package/validation/index.js +59 -0
  57. package/validation/number.d.ts +27 -0
  58. package/validation/number.d.ts.map +1 -0
  59. package/validation/number.js +57 -0
  60. package/validation/object.d.ts +115 -0
  61. package/validation/object.d.ts.map +1 -0
  62. package/validation/object.js +143 -0
  63. package/validation/string.d.ts +27 -0
  64. package/validation/string.d.ts.map +1 -0
  65. package/validation/string.js +57 -0
  66. package/validation/traits.d.ts +68 -0
  67. package/validation/traits.d.ts.map +1 -0
  68. package/validation/traits.js +58 -0
  69. package/validation/validator.d.ts +82 -0
  70. package/validation/validator.d.ts.map +1 -0
  71. package/validation/validator.js +24 -0
  72. package/validation/validatorBase.d.ts +25 -0
  73. package/validation/validatorBase.d.ts.map +1 -0
  74. package/validation/validatorBase.js +44 -0
  75. package/validation/validators.d.ts +32 -0
  76. package/validation/validators.d.ts.map +1 -0
  77. package/validation/validators.js +59 -0
@@ -0,0 +1,11 @@
1
+ // This file is read by tools that parse documentation comments conforming to the TSDoc standard.
2
+ // It should be published with your NPM package. It should not be tracked by Git.
3
+ {
4
+ "tsdocVersion": "0.12",
5
+ "toolPackages": [
6
+ {
7
+ "packageName": "@microsoft/api-extractor",
8
+ "packageVersion": "7.19.5"
9
+ }
10
+ ]
11
+ }
package/utils.d.ts CHANGED
@@ -1,49 +1,71 @@
1
1
  import { Result } from './result';
2
+ /**
3
+ * Helper type-guard function to report whether a specified key is present in
4
+ * a supplied object.
5
+ * @param key - The key to be tested.
6
+ * @param item - The object to be tested.
7
+ * @returns Returns `true` if the key is present, `false` otherwise.
8
+ * @public
9
+ */
2
10
  export declare function isKeyOf<T extends object>(key: string | number | symbol, item: T): key is keyof T;
11
+ /**
12
+ * Type for factory methods which convert a key-value pair to a new unique value.
13
+ * @public
14
+ */
3
15
  declare type KeyedThingFactory<TS, TD, TK extends string = string> = (key: TK, thing: TS) => Result<TD>;
4
16
  /**
5
- * Applies a factory method to convert a Record<TK, TS> into a Map<TK, TD>
6
- * @param src The Record object to be converted
7
- * @param factory The factory method used to convert elements
8
- * @returns Success with the resulting map, or Failure if an error occurs
17
+ * Applies a factory method to convert a `Record<TK, TS>` into a `Map<TK, TD>`.
18
+ * @param src - The `Record` to be converted.
19
+ * @param factory - The factory method used to convert elements.
20
+ * @returns {@link Success} with the resulting map on success, or {@link Failure} with a
21
+ * message if an error occurs.
22
+ * @public
9
23
  */
10
24
  export declare function recordToMap<TS, TD, TK extends string = string>(src: Record<TK, TS>, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD>>;
11
25
  /**
12
- * Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD> or undefined
13
- * @param src The Record object to be converted or undefined
14
- * @param factory The factory method used to convert elements
15
- * @returns Success with the resulting map if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
16
- * a message if an error occurs.
26
+ * Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`, or `undefined`.
27
+ * @param src - The `Record` to be converted, or undefined.
28
+ * @param factory - The factory method used to convert elements.
29
+ * @returns {@link Success} with the resulting map if conversion succeeds, or {@link Success} with `undefined`
30
+ * if `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
31
+ * @public
17
32
  */
18
33
  export declare function optionalRecordToMap<TS, TD, TK extends string = string>(src: Record<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD> | undefined>;
19
34
  /**
20
- * Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD>
21
- * @param src The Record object to be converted or undefined
22
- * @param factory The factory method used to convert elements
23
- * @returns Success with the resulting map (empty if src is undefined) if conversion succeeds. Returns Failure with
24
- * a message if an error occurs.
35
+ * Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`
36
+ * @param src - The `Record` to be converted, or `undefined`.
37
+ * @param factory - The factory method used to convert elements.
38
+ * @returns {@link Success} with the resulting map (empty if `src` is `undefined`) if conversion succeeds.
39
+ * Returns {@link Failure} with a message if an error occurs.
40
+ * @public
25
41
  */
26
42
  export declare function optionalRecordToPossiblyEmptyMap<TS, TD, TK extends string = string>(src: Record<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Map<TK, TD>>;
27
43
  /**
28
- * Applies a factory method to convert a Map<TK, TS> into a Record<TK, TD>
29
- * @param src The Map object to be converted
30
- * @param factory The factory method used to convert elements
44
+ * Applies a factory method to convert a `Map<TK, TS>` into a `Record<TK, TD>`.
45
+ * @param src - The `Map` object to be converted.
46
+ * @param factory - The factory method used to convert elements.
47
+ * @returns {@link Success} with the resulting `Record<TK, TD>` if conversion succeeds, or
48
+ * {@link Failure} with an error message if an error occurs.
49
+ * @public
31
50
  */
32
51
  export declare function mapToRecord<TS, TD, TK extends string = string>(src: Map<TK, TS>, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD>>;
33
52
  /**
34
- * Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD> or undefined
35
- * @param src The Map object to be converted or undefined
36
- * @param factory The factory method used to convert elements
37
- * @returns Success with the resulting record if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
38
- * a message if an error occurs.
53
+ * Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>` or `undefined`.
54
+ * @param src - The `Map` object to be converted, or `undefined`.
55
+ * @param factory - The factory method used to convert elements.
56
+ * @returns {@link Success} with the resulting record if conversion succeeds, or {@link Success} with `undefined` if
57
+ * `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
58
+ * @public
39
59
  */
40
60
  export declare function optionalMapToRecord<TS, TD, TK extends string = string>(src: Map<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD> | undefined>;
41
61
  /**
42
- * Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD>
43
- * @param src The Map object to be converted or undefined
44
- * @param factory The factory method used to convert elements
45
- * @returns Success with the resulting record (empty if src is undefined) if conversion succeeds. Returns Failure with
46
- * a message if an error occurs.
62
+ * Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>`
63
+ * @param src - The `Map` object to be converted, or `undefined`.
64
+ * @param factory - The factory method used to convert elements.
65
+ * @returns {@link Success} with the resulting record (empty if `src` is `undefined`) if conversion succeeds.
66
+ * Returns {@link Failure} with a message if an error occurs.
67
+ * @public
47
68
  */
48
69
  export declare function optionalMapToPossiblyEmptyRecord<TS, TD, TK extends string = string>(src: Map<TK, TS> | undefined, factory: KeyedThingFactory<TS, TD, TK>): Result<Record<TK, TD>>;
49
70
  export {};
71
+ //# sourceMappingURL=utils.d.ts.map
package/utils.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,MAAM,EAAiB,MAAM,UAAU,CAAC;AAEjD;;;;;;;GAOG;AAEH,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,MAAM,GAAC,MAAM,GAAC,MAAM,EAAE,IAAI,EAAE,CAAC,GAAG,GAAG,IAAI,MAAM,CAAC,CAE5F;AAED;;;GAGG;AACH,aAAK,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,MAAM,CAAC,EAAE,CAAC,CAAC;AAEhG;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAchJ;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,CAAC,CAE5K;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAE/K;AAED;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAchJ;AAED;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,CAAC,CAE5K;AAED;;;;;;;GAOG;AACH,wBAAgB,gCAAgC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,SAAS,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,EAAE,CAAC,GAAC,SAAS,EAAE,OAAO,EAAE,iBAAiB,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,CAE/K"}
package/utils.js CHANGED
@@ -23,16 +23,26 @@
23
23
  Object.defineProperty(exports, "__esModule", { value: true });
24
24
  exports.optionalMapToPossiblyEmptyRecord = exports.optionalMapToRecord = exports.mapToRecord = exports.optionalRecordToPossiblyEmptyMap = exports.optionalRecordToMap = exports.recordToMap = exports.isKeyOf = void 0;
25
25
  const result_1 = require("./result");
26
+ /**
27
+ * Helper type-guard function to report whether a specified key is present in
28
+ * a supplied object.
29
+ * @param key - The key to be tested.
30
+ * @param item - The object to be tested.
31
+ * @returns Returns `true` if the key is present, `false` otherwise.
32
+ * @public
33
+ */
26
34
  // eslint-disable-next-line @typescript-eslint/ban-types
27
35
  function isKeyOf(key, item) {
28
36
  return item.hasOwnProperty(key);
29
37
  }
30
38
  exports.isKeyOf = isKeyOf;
31
39
  /**
32
- * Applies a factory method to convert a Record<TK, TS> into a Map<TK, TD>
33
- * @param src The Record object to be converted
34
- * @param factory The factory method used to convert elements
35
- * @returns Success with the resulting map, or Failure if an error occurs
40
+ * Applies a factory method to convert a `Record<TK, TS>` into a `Map<TK, TD>`.
41
+ * @param src - The `Record` to be converted.
42
+ * @param factory - The factory method used to convert elements.
43
+ * @returns {@link Success} with the resulting map on success, or {@link Failure} with a
44
+ * message if an error occurs.
45
+ * @public
36
46
  */
37
47
  function recordToMap(src, factory) {
38
48
  const map = new Map();
@@ -51,31 +61,36 @@ function recordToMap(src, factory) {
51
61
  }
52
62
  exports.recordToMap = recordToMap;
53
63
  /**
54
- * Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD> or undefined
55
- * @param src The Record object to be converted or undefined
56
- * @param factory The factory method used to convert elements
57
- * @returns Success with the resulting map if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
58
- * a message if an error occurs.
64
+ * Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`, or `undefined`.
65
+ * @param src - The `Record` to be converted, or undefined.
66
+ * @param factory - The factory method used to convert elements.
67
+ * @returns {@link Success} with the resulting map if conversion succeeds, or {@link Success} with `undefined`
68
+ * if `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
69
+ * @public
59
70
  */
60
71
  function optionalRecordToMap(src, factory) {
61
72
  return (src === undefined) ? (0, result_1.succeed)(undefined) : recordToMap(src, factory);
62
73
  }
63
74
  exports.optionalRecordToMap = optionalRecordToMap;
64
75
  /**
65
- * Applies a factory method to convert an optional Record<TK, TS> into a Map<TK, TD>
66
- * @param src The Record object to be converted or undefined
67
- * @param factory The factory method used to convert elements
68
- * @returns Success with the resulting map (empty if src is undefined) if conversion succeeds. Returns Failure with
69
- * a message if an error occurs.
76
+ * Applies a factory method to convert an optional `Record<TK, TS>` into a `Map<TK, TD>`
77
+ * @param src - The `Record` to be converted, or `undefined`.
78
+ * @param factory - The factory method used to convert elements.
79
+ * @returns {@link Success} with the resulting map (empty if `src` is `undefined`) if conversion succeeds.
80
+ * Returns {@link Failure} with a message if an error occurs.
81
+ * @public
70
82
  */
71
83
  function optionalRecordToPossiblyEmptyMap(src, factory) {
72
84
  return (src === undefined) ? (0, result_1.succeed)(new Map()) : recordToMap(src, factory);
73
85
  }
74
86
  exports.optionalRecordToPossiblyEmptyMap = optionalRecordToPossiblyEmptyMap;
75
87
  /**
76
- * Applies a factory method to convert a Map<TK, TS> into a Record<TK, TD>
77
- * @param src The Map object to be converted
78
- * @param factory The factory method used to convert elements
88
+ * Applies a factory method to convert a `Map<TK, TS>` into a `Record<TK, TD>`.
89
+ * @param src - The `Map` object to be converted.
90
+ * @param factory - The factory method used to convert elements.
91
+ * @returns {@link Success} with the resulting `Record<TK, TD>` if conversion succeeds, or
92
+ * {@link Failure} with an error message if an error occurs.
93
+ * @public
79
94
  */
80
95
  function mapToRecord(src, factory) {
81
96
  const record = {};
@@ -94,25 +109,27 @@ function mapToRecord(src, factory) {
94
109
  }
95
110
  exports.mapToRecord = mapToRecord;
96
111
  /**
97
- * Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD> or undefined
98
- * @param src The Map object to be converted or undefined
99
- * @param factory The factory method used to convert elements
100
- * @returns Success with the resulting record if conversion succeeds, or success with undefined if src is undefined. Returns Failure with
101
- * a message if an error occurs.
112
+ * Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>` or `undefined`.
113
+ * @param src - The `Map` object to be converted, or `undefined`.
114
+ * @param factory - The factory method used to convert elements.
115
+ * @returns {@link Success} with the resulting record if conversion succeeds, or {@link Success} with `undefined` if
116
+ * `src` is `undefined`. Returns {@link Failure} with a message if an error occurs.
117
+ * @public
102
118
  */
103
119
  function optionalMapToRecord(src, factory) {
104
120
  return (src === undefined) ? (0, result_1.succeed)(undefined) : mapToRecord(src, factory);
105
121
  }
106
122
  exports.optionalMapToRecord = optionalMapToRecord;
107
123
  /**
108
- * Applies a factory method to convert an optional Map<string, TS> into a Record<string, TD>
109
- * @param src The Map object to be converted or undefined
110
- * @param factory The factory method used to convert elements
111
- * @returns Success with the resulting record (empty if src is undefined) if conversion succeeds. Returns Failure with
112
- * a message if an error occurs.
124
+ * Applies a factory method to convert an optional `Map<string, TS>` into a `Record<string, TD>`
125
+ * @param src - The `Map` object to be converted, or `undefined`.
126
+ * @param factory - The factory method used to convert elements.
127
+ * @returns {@link Success} with the resulting record (empty if `src` is `undefined`) if conversion succeeds.
128
+ * Returns {@link Failure} with a message if an error occurs.
129
+ * @public
113
130
  */
114
131
  function optionalMapToPossiblyEmptyRecord(src, factory) {
115
132
  return (src === undefined) ? (0, result_1.succeed)({}) : mapToRecord(src, factory);
116
133
  }
117
134
  exports.optionalMapToPossiblyEmptyRecord = optionalMapToPossiblyEmptyRecord;
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpELHdEQUF3RDtBQUN4RCxTQUFnQixPQUFPLENBQW1CLEdBQXlCLEVBQUUsSUFBTztJQUN4RSxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDcEMsQ0FBQztBQUZELDBCQUVDO0FBSUQ7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQXFDLEdBQW1CLEVBQUUsT0FBc0M7SUFDdkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO2lCQUNJO2dCQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDaEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQWRELGtDQWNDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsbUJBQW1CLENBQXFDLEdBQTZCLEVBQUUsT0FBc0M7SUFDekksT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0FBQ2hGLENBQUM7QUFGRCxrREFFQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQWdCLGdDQUFnQyxDQUFxQyxHQUE2QixFQUFFLE9BQXNDO0lBQ3RKLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxJQUFJLEdBQUcsRUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDeEYsQ0FBQztBQUZELDRFQUVDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLFdBQVcsQ0FBcUMsR0FBZ0IsRUFBRSxPQUFzQztJQUNwSCxNQUFNLE1BQU0sR0FBbUIsRUFBb0IsQ0FBQztJQUNwRCxLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDdEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMzQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUM7YUFDckM7aUJBQ0k7Z0JBQ0QsT0FBTyxJQUFBLGFBQUksRUFBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsS0FBSyxVQUFVLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQzthQUNuRDtTQUNKO0tBQ0o7SUFDRCxPQUFPLElBQUEsZ0JBQU8sRUFBQyxNQUFNLENBQUMsQ0FBQztBQUMzQixDQUFDO0FBZEQsa0NBY0M7QUFFRDs7Ozs7O0dBTUc7QUFDSCxTQUFnQixtQkFBbUIsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUN0SSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQXFDLEdBQTBCLEVBQUUsT0FBc0M7SUFDbkosT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLEVBQW9CLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUMzRixDQUFDO0FBRkQsNEVBRUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxyXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjAgRXJpayBGb3J0dW5lXHJcbiAqXHJcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcclxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxyXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXHJcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcclxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXHJcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XHJcbiAqXHJcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxyXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxyXG4gKlxyXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXHJcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxyXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcclxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxyXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxyXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxyXG4gKiBTT0ZUV0FSRS5cclxuICovXHJcblxyXG5pbXBvcnQgeyBSZXN1bHQsIGZhaWwsIHN1Y2NlZWQgfSBmcm9tICcuL3Jlc3VsdCc7XHJcblxyXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10eXBlc1xyXG5leHBvcnQgZnVuY3Rpb24gaXNLZXlPZjxUIGV4dGVuZHMgb2JqZWN0PihrZXk6IHN0cmluZ3xudW1iZXJ8c3ltYm9sLCBpdGVtOiBUKToga2V5IGlzIGtleW9mIFQge1xyXG4gICAgcmV0dXJuIGl0ZW0uaGFzT3duUHJvcGVydHkoa2V5KTtcclxufVxyXG5cclxudHlwZSBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPiA9IChrZXk6IFRLLCB0aGluZzogVFMpID0+IFJlc3VsdDxURD47XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD5cclxuICogQHBhcmFtIHNyYyBUaGUgUmVjb3JkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWRcclxuICogQHBhcmFtIGZhY3RvcnkgVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50c1xyXG4gKiBAcmV0dXJucyBTdWNjZXNzIHdpdGggdGhlIHJlc3VsdGluZyBtYXAsIG9yIEZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gcmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8VEssIFREPigpO1xyXG4gICAgZm9yIChjb25zdCBrZXkgaW4gc3JjKSB7XHJcbiAgICAgICAgaWYgKHNyY1trZXldICE9PSB1bmRlZmluZWQpIHtcclxuICAgICAgICAgICAgY29uc3QgaXRlbVJlc3VsdCA9IGZhY3Rvcnkoa2V5LCBzcmNba2V5XSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgaXRlbVJlc3VsdC52YWx1ZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrZXl9OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKG1hcCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD4gb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBzcmMgVGhlIFJlY29yZCBvYmplY3QgdG8gYmUgY29udmVydGVkIG9yIHVuZGVmaW5lZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgcmVzdWx0aW5nIG1hcCBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLCBvciBzdWNjZXNzIHdpdGggdW5kZWZpbmVkIGlmIHNyYyBpcyB1bmRlZmluZWQuIFJldHVybnMgRmFpbHVyZSB3aXRoXHJcbiAqIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gb3B0aW9uYWxSZWNvcmRUb01hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD58dW5kZWZpbmVkPiB7XHJcbiAgICByZXR1cm4gKHNyYyA9PT0gdW5kZWZpbmVkKSA/IHN1Y2NlZWQodW5kZWZpbmVkKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBSZWNvcmQ8VEssIFRTPiBpbnRvIGEgTWFwPFRLLCBURD5cclxuICogQHBhcmFtIHNyYyBUaGUgUmVjb3JkIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgZWxlbWVudHNcclxuICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSByZXN1bHRpbmcgbWFwIChlbXB0eSBpZiBzcmMgaXMgdW5kZWZpbmVkKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLiBSZXR1cm5zIEZhaWx1cmUgd2l0aFxyXG4gKiBhIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9Qb3NzaWJseUVtcHR5TWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxNYXA8VEssIFREPj4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKG5ldyBNYXA8VEssIFREPigpKSA6IHJlY29yZFRvTWFwKHNyYywgZmFjdG9yeSk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhIE1hcDxUSywgVFM+IGludG8gYSBSZWNvcmQ8VEssIFREPlxyXG4gKiBAcGFyYW0gc3JjIFRoZSBNYXAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPFRLLCBURD4gPSB7fSBhcyBSZWNvcmQ8VEssIFREPjtcclxuICAgIGZvciAoY29uc3Qga3ZwIG9mIHNyYykge1xyXG4gICAgICAgIGlmIChrdnBbMV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gZmFjdG9yeShrdnBbMF0sIGt2cFsxXSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRba3ZwWzBdXSA9IGl0ZW1SZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrdnBbMF19OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKHJlY29yZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBNYXA8c3RyaW5nLCBUUz4gaW50byBhIFJlY29yZDxzdHJpbmcsIFREPiBvciB1bmRlZmluZWRcclxuICogQHBhcmFtIHNyYyBUaGUgTWFwIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQgb3IgdW5kZWZpbmVkXHJcbiAqIEBwYXJhbSBmYWN0b3J5IFRoZSBmYWN0b3J5IG1ldGhvZCB1c2VkIHRvIGNvbnZlcnQgZWxlbWVudHNcclxuICogQHJldHVybnMgU3VjY2VzcyB3aXRoIHRoZSByZXN1bHRpbmcgcmVjb3JkIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMsIG9yIHN1Y2Nlc3Mgd2l0aCB1bmRlZmluZWQgaWYgc3JjIGlzIHVuZGVmaW5lZC4gUmV0dXJucyBGYWlsdXJlIHdpdGhcclxuICogYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUmVjb3JkPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogTWFwPFRLLCBUUz58dW5kZWZpbmVkLCBmYWN0b3J5OiBLZXllZFRoaW5nRmFjdG9yeTxUUywgVEQsIFRLPik6IFJlc3VsdDxSZWNvcmQ8VEssIFREPnx1bmRlZmluZWQ+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh1bmRlZmluZWQpIDogbWFwVG9SZWNvcmQoc3JjLCBmYWN0b3J5KTtcclxufVxyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGFuIG9wdGlvbmFsIE1hcDxzdHJpbmcsIFRTPiBpbnRvIGEgUmVjb3JkPHN0cmluZywgVEQ+XHJcbiAqIEBwYXJhbSBzcmMgVGhlIE1hcCBvYmplY3QgdG8gYmUgY29udmVydGVkIG9yIHVuZGVmaW5lZFxyXG4gKiBAcGFyYW0gZmFjdG9yeSBUaGUgZmFjdG9yeSBtZXRob2QgdXNlZCB0byBjb252ZXJ0IGVsZW1lbnRzXHJcbiAqIEByZXR1cm5zIFN1Y2Nlc3Mgd2l0aCB0aGUgcmVzdWx0aW5nIHJlY29yZCAoZW1wdHkgaWYgc3JjIGlzIHVuZGVmaW5lZCkgaWYgY29udmVyc2lvbiBzdWNjZWVkcy4gUmV0dXJucyBGYWlsdXJlIHdpdGhcclxuICogYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUG9zc2libHlFbXB0eVJlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh7fSBhcyBSZWNvcmQ8VEssIFREPikgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcbiJdfQ==
135
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgscUNBQWlEO0FBRWpEOzs7Ozs7O0dBT0c7QUFDSCx3REFBd0Q7QUFDeEQsU0FBZ0IsT0FBTyxDQUFtQixHQUF5QixFQUFFLElBQU87SUFDeEUsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ3BDLENBQUM7QUFGRCwwQkFFQztBQVFEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixXQUFXLENBQXFDLEdBQW1CLEVBQUUsT0FBc0M7SUFDdkgsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQVUsQ0FBQztJQUM5QixLQUFLLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFBRTtRQUNuQixJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxTQUFTLEVBQUU7WUFDeEIsTUFBTSxVQUFVLEdBQUcsT0FBTyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztZQUMxQyxJQUFJLFVBQVUsQ0FBQyxTQUFTLEVBQUUsRUFBRTtnQkFDeEIsR0FBRyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ2xDO2lCQUNJO2dCQUNELE9BQU8sSUFBQSxhQUFJLEVBQUMsR0FBRyxHQUFHLEtBQUssVUFBVSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7YUFDaEQ7U0FDSjtLQUNKO0lBQ0QsT0FBTyxJQUFBLGdCQUFPLEVBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEIsQ0FBQztBQWRELGtDQWNDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLG1CQUFtQixDQUFxQyxHQUE2QixFQUFFLE9BQXNDO0lBQ3pJLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUNoRixDQUFDO0FBRkQsa0RBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsZ0NBQWdDLENBQXFDLEdBQTZCLEVBQUUsT0FBc0M7SUFDdEosT0FBTyxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBQSxnQkFBTyxFQUFDLElBQUksR0FBRyxFQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxPQUFPLENBQUMsQ0FBQztBQUN4RixDQUFDO0FBRkQsNEVBRUM7QUFFRDs7Ozs7OztHQU9HO0FBQ0gsU0FBZ0IsV0FBVyxDQUFxQyxHQUFnQixFQUFFLE9BQXNDO0lBQ3BILE1BQU0sTUFBTSxHQUFtQixFQUFvQixDQUFDO0lBQ3BELEtBQUssTUFBTSxHQUFHLElBQUksR0FBRyxFQUFFO1FBQ25CLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFNBQVMsRUFBRTtZQUN0QixNQUFNLFVBQVUsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQzNDLElBQUksVUFBVSxDQUFDLFNBQVMsRUFBRSxFQUFFO2dCQUN4QixNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQzthQUNyQztpQkFDSTtnQkFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxLQUFLLFVBQVUsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO2FBQ25EO1NBQ0o7S0FDSjtJQUNELE9BQU8sSUFBQSxnQkFBTyxFQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQzNCLENBQUM7QUFkRCxrQ0FjQztBQUVEOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixtQkFBbUIsQ0FBcUMsR0FBMEIsRUFBRSxPQUFzQztJQUN0SSxPQUFPLENBQUMsR0FBRyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFBLGdCQUFPLEVBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDaEYsQ0FBQztBQUZELGtEQUVDO0FBRUQ7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLGdDQUFnQyxDQUFxQyxHQUEwQixFQUFFLE9BQXNDO0lBQ25KLE9BQU8sQ0FBQyxHQUFHLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUEsZ0JBQU8sRUFBQyxFQUFvQixDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsT0FBTyxDQUFDLENBQUM7QUFDM0YsQ0FBQztBQUZELDRFQUVDIiwic291cmNlc0NvbnRlbnQiOlsiLypcclxuICogQ29weXJpZ2h0IChjKSAyMDIwIEVyaWsgRm9ydHVuZVxyXG4gKlxyXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XHJcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcclxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xyXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXHJcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xyXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxyXG4gKlxyXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcclxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cclxuICpcclxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxyXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcclxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXHJcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcclxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcclxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcclxuICogU09GVFdBUkUuXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgUmVzdWx0LCBmYWlsLCBzdWNjZWVkIH0gZnJvbSAnLi9yZXN1bHQnO1xyXG5cclxuLyoqXHJcbiAqIEhlbHBlciB0eXBlLWd1YXJkIGZ1bmN0aW9uIHRvIHJlcG9ydCB3aGV0aGVyIGEgc3BlY2lmaWVkIGtleSBpcyBwcmVzZW50IGluXHJcbiAqIGEgc3VwcGxpZWQgb2JqZWN0LlxyXG4gKiBAcGFyYW0ga2V5IC0gVGhlIGtleSB0byBiZSB0ZXN0ZWQuXHJcbiAqIEBwYXJhbSBpdGVtIC0gVGhlIG9iamVjdCB0byBiZSB0ZXN0ZWQuXHJcbiAqIEByZXR1cm5zIFJldHVybnMgYHRydWVgIGlmIHRoZSBrZXkgaXMgcHJlc2VudCwgYGZhbHNlYCBvdGhlcndpc2UuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXR5cGVzXHJcbmV4cG9ydCBmdW5jdGlvbiBpc0tleU9mPFQgZXh0ZW5kcyBvYmplY3Q+KGtleTogc3RyaW5nfG51bWJlcnxzeW1ib2wsIGl0ZW06IFQpOiBrZXkgaXMga2V5b2YgVCB7XHJcbiAgICByZXR1cm4gaXRlbS5oYXNPd25Qcm9wZXJ0eShrZXkpO1xyXG59XHJcblxyXG4vKipcclxuICogVHlwZSBmb3IgZmFjdG9yeSBtZXRob2RzIHdoaWNoIGNvbnZlcnQgYSBrZXktdmFsdWUgcGFpciB0byBhIG5ldyB1bmlxdWUgdmFsdWUuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbnR5cGUgS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSAoa2V5OiBUSywgdGhpbmc6IFRTKSA9PiBSZXN1bHQ8VEQ+O1xyXG5cclxuLyoqXHJcbiAqIEFwcGxpZXMgYSBmYWN0b3J5IG1ldGhvZCB0byBjb252ZXJ0IGEgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YC5cclxuICogQHBhcmFtIHNyYyAtIFRoZSBgUmVjb3JkYCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgb24gc3VjY2Vzcywgb3Ige0BsaW5rIEZhaWx1cmV9IHdpdGggYVxyXG4gKiBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIHJlY29yZFRvTWFwPFRTLCBURCwgVEsgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmc+KHNyYzogUmVjb3JkPFRLLCBUUz4sIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+PiB7XHJcbiAgICBjb25zdCBtYXAgPSBuZXcgTWFwPFRLLCBURD4oKTtcclxuICAgIGZvciAoY29uc3Qga2V5IGluIHNyYykge1xyXG4gICAgICAgIGlmIChzcmNba2V5XSAhPT0gdW5kZWZpbmVkKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1SZXN1bHQgPSBmYWN0b3J5KGtleSwgc3JjW2tleV0pO1xyXG4gICAgICAgICAgICBpZiAoaXRlbVJlc3VsdC5pc1N1Y2Nlc3MoKSkge1xyXG4gICAgICAgICAgICAgICAgbWFwLnNldChrZXksIGl0ZW1SZXN1bHQudmFsdWUpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7a2V5fTogJHtpdGVtUmVzdWx0Lm1lc3NhZ2V9YCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICByZXR1cm4gc3VjY2VlZChtYXApO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYFJlY29yZGAgdG8gYmUgY29udmVydGVkLCBvciB1bmRlZmluZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGBcclxuICogaWYgYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsUmVjb3JkVG9NYXA8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBSZWNvcmQ8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PE1hcDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYFJlY29yZDxUSywgVFM+YCBpbnRvIGEgYE1hcDxUSywgVEQ+YFxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBSZWNvcmRgIHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBtYXAgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbFJlY29yZFRvUG9zc2libHlFbXB0eU1hcDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IFJlY29yZDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8TWFwPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZChuZXcgTWFwPFRLLCBURD4oKSkgOiByZWNvcmRUb01hcChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYSBgTWFwPFRLLCBUUz5gIGludG8gYSBgUmVjb3JkPFRLLCBURD5gLlxyXG4gKiBAcGFyYW0gc3JjIC0gVGhlIGBNYXBgIG9iamVjdCB0byBiZSBjb252ZXJ0ZWQuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyBgUmVjb3JkPFRLLCBURD5gIGlmIGNvbnZlcnNpb24gc3VjY2VlZHMsIG9yXHJcbiAqIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yIG1lc3NhZ2UgaWYgYW4gZXJyb3Igb2NjdXJzLlxyXG4gKiBAcHVibGljXHJcbiAqL1xyXG5leHBvcnQgZnVuY3Rpb24gbWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPiwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIGNvbnN0IHJlY29yZDogUmVjb3JkPFRLLCBURD4gPSB7fSBhcyBSZWNvcmQ8VEssIFREPjtcclxuICAgIGZvciAoY29uc3Qga3ZwIG9mIHNyYykge1xyXG4gICAgICAgIGlmIChrdnBbMV0gIT09IHVuZGVmaW5lZCkge1xyXG4gICAgICAgICAgICBjb25zdCBpdGVtUmVzdWx0ID0gZmFjdG9yeShrdnBbMF0sIGt2cFsxXSk7XHJcbiAgICAgICAgICAgIGlmIChpdGVtUmVzdWx0LmlzU3VjY2VzcygpKSB7XHJcbiAgICAgICAgICAgICAgICByZWNvcmRba3ZwWzBdXSA9IGl0ZW1SZXN1bHQudmFsdWU7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgZWxzZSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFpbChgJHtrdnBbMF19OiAke2l0ZW1SZXN1bHQubWVzc2FnZX1gKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIHJldHVybiBzdWNjZWVkKHJlY29yZCk7XHJcbn1cclxuXHJcbi8qKlxyXG4gKiBBcHBsaWVzIGEgZmFjdG9yeSBtZXRob2QgdG8gY29udmVydCBhbiBvcHRpb25hbCBgTWFwPHN0cmluZywgVFM+YCBpbnRvIGEgYFJlY29yZDxzdHJpbmcsIFREPmAgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgaWYgY29udmVyc2lvbiBzdWNjZWVkcywgb3Ige0BsaW5rIFN1Y2Nlc3N9IHdpdGggYHVuZGVmaW5lZGAgaWZcclxuICogYHNyY2AgaXMgYHVuZGVmaW5lZGAuIFJldHVybnMge0BsaW5rIEZhaWx1cmV9IHdpdGggYSBtZXNzYWdlIGlmIGFuIGVycm9yIG9jY3Vycy5cclxuICogQHB1YmxpY1xyXG4gKi9cclxuZXhwb3J0IGZ1bmN0aW9uIG9wdGlvbmFsTWFwVG9SZWNvcmQ8VFMsIFRELCBUSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4oc3JjOiBNYXA8VEssIFRTPnx1bmRlZmluZWQsIGZhY3Rvcnk6IEtleWVkVGhpbmdGYWN0b3J5PFRTLCBURCwgVEs+KTogUmVzdWx0PFJlY29yZDxUSywgVEQ+fHVuZGVmaW5lZD4ge1xyXG4gICAgcmV0dXJuIChzcmMgPT09IHVuZGVmaW5lZCkgPyBzdWNjZWVkKHVuZGVmaW5lZCkgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcblxyXG4vKipcclxuICogQXBwbGllcyBhIGZhY3RvcnkgbWV0aG9kIHRvIGNvbnZlcnQgYW4gb3B0aW9uYWwgYE1hcDxzdHJpbmcsIFRTPmAgaW50byBhIGBSZWNvcmQ8c3RyaW5nLCBURD5gXHJcbiAqIEBwYXJhbSBzcmMgLSBUaGUgYE1hcGAgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCwgb3IgYHVuZGVmaW5lZGAuXHJcbiAqIEBwYXJhbSBmYWN0b3J5IC0gVGhlIGZhY3RvcnkgbWV0aG9kIHVzZWQgdG8gY29udmVydCBlbGVtZW50cy5cclxuICogQHJldHVybnMge0BsaW5rIFN1Y2Nlc3N9IHdpdGggdGhlIHJlc3VsdGluZyByZWNvcmQgKGVtcHR5IGlmIGBzcmNgIGlzIGB1bmRlZmluZWRgKSBpZiBjb252ZXJzaW9uIHN1Y2NlZWRzLlxyXG4gKiBSZXR1cm5zIHtAbGluayBGYWlsdXJlfSB3aXRoIGEgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMuXHJcbiAqIEBwdWJsaWNcclxuICovXHJcbmV4cG9ydCBmdW5jdGlvbiBvcHRpb25hbE1hcFRvUG9zc2libHlFbXB0eVJlY29yZDxUUywgVEQsIFRLIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPihzcmM6IE1hcDxUSywgVFM+fHVuZGVmaW5lZCwgZmFjdG9yeTogS2V5ZWRUaGluZ0ZhY3Rvcnk8VFMsIFRELCBUSz4pOiBSZXN1bHQ8UmVjb3JkPFRLLCBURD4+IHtcclxuICAgIHJldHVybiAoc3JjID09PSB1bmRlZmluZWQpID8gc3VjY2VlZCh7fSBhcyBSZWNvcmQ8VEssIFREPikgOiBtYXBUb1JlY29yZChzcmMsIGZhY3RvcnkpO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,27 @@
1
+ import { Failure } from '../result';
2
+ import { GenericValidator, GenericValidatorConstructorParams } from './genericValidator';
3
+ /**
4
+ * Parameters used to construct a {@link Validation.Classes.BooleanValidator | BooleanValidator}.
5
+ * @public
6
+ */
7
+ export declare type BooleanValidatorConstructorParams<TC = unknown> = GenericValidatorConstructorParams<boolean, TC>;
8
+ /**
9
+ * An in-place {@link Validation.Validator | Validator} for `boolean` values.
10
+ * @public
11
+ */
12
+ export declare class BooleanValidator<TC = unknown> extends GenericValidator<boolean, TC> {
13
+ /**
14
+ * Constructs a new {@link Validation.Classes.BooleanValidator | BooleanValidator}.
15
+ * @param params - Optional {@link Validation.Classes.BooleanValidatorConstructorParams | init params} for the
16
+ * new {@link Validation.Classes.BooleanValidator | BooleanValidator}.
17
+ */
18
+ constructor(params?: BooleanValidatorConstructorParams<TC>);
19
+ /**
20
+ * Static method which validates that a supplied `unknown` value is a `boolean`.
21
+ * @param from - The `unknown` value to be tested.
22
+ * @returns Returns `true` if `from` is a `boolean`, or {@link Failure} with an error
23
+ * message if not.
24
+ */
25
+ static validateBoolean(from: unknown): boolean | Failure<boolean>;
26
+ }
27
+ //# sourceMappingURL=boolean.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/validation/boolean.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,oBAAoB,CAAC;AAEzF;;;GAGG;AACH,oBAAY,iCAAiC,CAAC,EAAE,GAAG,OAAO,IAAI,iCAAiC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AAE7G;;;GAGG;AACH,qBAAa,gBAAgB,CAAC,EAAE,GAAG,OAAO,CAAE,SAAQ,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;IAC7E;;;;OAIG;gBACgB,MAAM,CAAC,EAAE,iCAAiC,CAAC,EAAE,CAAC;IASjE;;;;;OAKG;WACW,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;CAM3E"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2021 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.BooleanValidator = void 0;
25
+ const result_1 = require("../result");
26
+ const genericValidator_1 = require("./genericValidator");
27
+ /**
28
+ * An in-place {@link Validation.Validator | Validator} for `boolean` values.
29
+ * @public
30
+ */
31
+ class BooleanValidator extends genericValidator_1.GenericValidator {
32
+ /**
33
+ * Constructs a new {@link Validation.Classes.BooleanValidator | BooleanValidator}.
34
+ * @param params - Optional {@link Validation.Classes.BooleanValidatorConstructorParams | init params} for the
35
+ * new {@link Validation.Classes.BooleanValidator | BooleanValidator}.
36
+ */
37
+ constructor(params) {
38
+ // istanbul ignore next
39
+ params = params !== null && params !== void 0 ? params : {};
40
+ super({
41
+ validator: BooleanValidator.validateBoolean,
42
+ ...params,
43
+ });
44
+ }
45
+ /**
46
+ * Static method which validates that a supplied `unknown` value is a `boolean`.
47
+ * @param from - The `unknown` value to be tested.
48
+ * @returns Returns `true` if `from` is a `boolean`, or {@link Failure} with an error
49
+ * message if not.
50
+ */
51
+ static validateBoolean(from) {
52
+ if (typeof from === 'boolean') {
53
+ return true;
54
+ }
55
+ return (0, result_1.fail)(`"${from}": not a boolean`);
56
+ }
57
+ }
58
+ exports.BooleanValidator = BooleanValidator;
59
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm9vbGVhbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2Jvb2xlYW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsc0NBQTBDO0FBQzFDLHlEQUF5RjtBQVF6Rjs7O0dBR0c7QUFDSCxNQUFhLGdCQUErQixTQUFRLG1DQUE2QjtJQUM3RTs7OztPQUlHO0lBQ0gsWUFBbUIsTUFBOEM7UUFDN0QsdUJBQXVCO1FBQ3ZCLE1BQU0sR0FBRyxNQUFNLGFBQU4sTUFBTSxjQUFOLE1BQU0sR0FBSSxFQUFFLENBQUM7UUFDdEIsS0FBSyxDQUFDO1lBQ0YsU0FBUyxFQUFFLGdCQUFnQixDQUFDLGVBQWU7WUFDM0MsR0FBRyxNQUFNO1NBQ1osQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGVBQWUsQ0FBQyxJQUFhO1FBQ3ZDLElBQUksT0FBTyxJQUFJLEtBQUssU0FBUyxFQUFFO1lBQzNCLE9BQU8sSUFBSSxDQUFDO1NBQ2Y7UUFDRCxPQUFPLElBQUEsYUFBSSxFQUFDLElBQUksSUFBSSxrQkFBa0IsQ0FBQyxDQUFDO0lBQzVDLENBQUM7Q0FDSjtBQTNCRCw0Q0EyQkMiLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuICogQ29weXJpZ2h0IChjKSAyMDIxIEVyaWsgRm9ydHVuZVxuICpcbiAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbiAqIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvIGRlYWxcbiAqIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHNcbiAqIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGxcbiAqIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuICogZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbiAqXG4gKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbiBhbGxcbiAqIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4gKlxuICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuICogSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4gKiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbiAqIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbiAqIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4gKiBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRVxuICogU09GVFdBUkUuXG4gKi9cblxuaW1wb3J0IHsgRmFpbHVyZSwgZmFpbCB9IGZyb20gJy4uL3Jlc3VsdCc7XG5pbXBvcnQgeyBHZW5lcmljVmFsaWRhdG9yLCBHZW5lcmljVmFsaWRhdG9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL2dlbmVyaWNWYWxpZGF0b3InO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgdXNlZCB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgVmFsaWRhdGlvbi5DbGFzc2VzLkJvb2xlYW5WYWxpZGF0b3IgfCBCb29sZWFuVmFsaWRhdG9yfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQm9vbGVhblZhbGlkYXRvckNvbnN0cnVjdG9yUGFyYW1zPFRDID0gdW5rbm93bj4gPSBHZW5lcmljVmFsaWRhdG9yQ29uc3RydWN0b3JQYXJhbXM8Ym9vbGVhbiwgVEM+O1xuXG4vKipcbiAqIEFuIGluLXBsYWNlIHtAbGluayBWYWxpZGF0aW9uLlZhbGlkYXRvciB8IFZhbGlkYXRvcn0gZm9yIGBib29sZWFuYCB2YWx1ZXMuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBCb29sZWFuVmFsaWRhdG9yPFRDID0gdW5rbm93bj4gZXh0ZW5kcyBHZW5lcmljVmFsaWRhdG9yPGJvb2xlYW4sIFRDPiB7XG4gICAgLyoqXG4gICAgICogQ29uc3RydWN0cyBhIG5ldyB7QGxpbmsgVmFsaWRhdGlvbi5DbGFzc2VzLkJvb2xlYW5WYWxpZGF0b3IgfCBCb29sZWFuVmFsaWRhdG9yfS5cbiAgICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9uYWwge0BsaW5rIFZhbGlkYXRpb24uQ2xhc3Nlcy5Cb29sZWFuVmFsaWRhdG9yQ29uc3RydWN0b3JQYXJhbXMgfCBpbml0IHBhcmFtc30gZm9yIHRoZVxuICAgICAqIG5ldyB7QGxpbmsgVmFsaWRhdGlvbi5DbGFzc2VzLkJvb2xlYW5WYWxpZGF0b3IgfCBCb29sZWFuVmFsaWRhdG9yfS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zPzogQm9vbGVhblZhbGlkYXRvckNvbnN0cnVjdG9yUGFyYW1zPFRDPikge1xuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dFxuICAgICAgICBwYXJhbXMgPSBwYXJhbXMgPz8ge307XG4gICAgICAgIHN1cGVyKHtcbiAgICAgICAgICAgIHZhbGlkYXRvcjogQm9vbGVhblZhbGlkYXRvci52YWxpZGF0ZUJvb2xlYW4sXG4gICAgICAgICAgICAuLi5wYXJhbXMsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFN0YXRpYyBtZXRob2Qgd2hpY2ggdmFsaWRhdGVzIHRoYXQgYSBzdXBwbGllZCBgdW5rbm93bmAgdmFsdWUgaXMgYSBgYm9vbGVhbmAuXG4gICAgICogQHBhcmFtIGZyb20gLSBUaGUgYHVua25vd25gIHZhbHVlIHRvIGJlIHRlc3RlZC5cbiAgICAgKiBAcmV0dXJucyBSZXR1cm5zIGB0cnVlYCBpZiBgZnJvbWAgaXMgYSBgYm9vbGVhbmAsIG9yIHtAbGluayBGYWlsdXJlfSB3aXRoIGFuIGVycm9yXG4gICAgICogbWVzc2FnZSBpZiBub3QuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyB2YWxpZGF0ZUJvb2xlYW4oZnJvbTogdW5rbm93bik6IGJvb2xlYW4gfCBGYWlsdXJlPGJvb2xlYW4+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWlsKGBcIiR7ZnJvbX1cIjogbm90IGEgYm9vbGVhbmApO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,5 @@
1
+ export { StringValidator, StringValidatorConstructorParams } from './string';
2
+ export { BooleanValidator, BooleanValidatorConstructorParams } from './boolean';
3
+ export { NumberValidator, NumberValidatorConstructorParams } from './number';
4
+ export { FieldValidators, ObjectValidator, ObjectValidatorConstructorParams, ObjectValidatorOptions } from './object';
5
+ //# sourceMappingURL=classes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"classes.d.ts","sourceRoot":"","sources":["../../src/validation/classes.ts"],"names":[],"mappings":"AAwBA,OAAO,EAAE,eAAe,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,iCAAiC,EAAE,MAAM,WAAW,CAAC;AAChF,OAAO,EAAE,eAAe,EAAE,gCAAgC,EAAE,MAAM,UAAU,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,eAAe,EAAE,gCAAgC,EAAE,sBAAsB,EAAE,MAAM,UAAU,CAAC"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2021 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.ObjectValidator = exports.NumberValidator = exports.BooleanValidator = exports.StringValidator = void 0;
25
+ /* istanbul ignore file */
26
+ var string_1 = require("./string");
27
+ Object.defineProperty(exports, "StringValidator", { enumerable: true, get: function () { return string_1.StringValidator; } });
28
+ var boolean_1 = require("./boolean");
29
+ Object.defineProperty(exports, "BooleanValidator", { enumerable: true, get: function () { return boolean_1.BooleanValidator; } });
30
+ var number_1 = require("./number");
31
+ Object.defineProperty(exports, "NumberValidator", { enumerable: true, get: function () { return number_1.NumberValidator; } });
32
+ var object_1 = require("./object");
33
+ Object.defineProperty(exports, "ObjectValidator", { enumerable: true, get: function () { return object_1.ObjectValidator; } });
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy92YWxpZGF0aW9uL2NsYXNzZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW9CRzs7O0FBRUgsMEJBQTBCO0FBRTFCLG1DQUE2RTtBQUFwRSx5R0FBQSxlQUFlLE9BQUE7QUFDeEIscUNBQWdGO0FBQXZFLDJHQUFBLGdCQUFnQixPQUFBO0FBQ3pCLG1DQUE2RTtBQUFwRSx5R0FBQSxlQUFlLE9BQUE7QUFDeEIsbUNBQXNIO0FBQTVGLHlHQUFBLGVBQWUsT0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjEgRXJpayBGb3J0dW5lXG4gKlxuICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuICogb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbFxuICogaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0c1xuICogdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbFxuICogY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4gKiBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuICpcbiAqIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluIGFsbFxuICogY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbiAqXG4gKiBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4gKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbiAqIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFXG4gKiBTT0ZUV0FSRS5cbiAqL1xuXG4vKiBpc3RhbmJ1bCBpZ25vcmUgZmlsZSAqL1xuXG5leHBvcnQgeyBTdHJpbmdWYWxpZGF0b3IsIFN0cmluZ1ZhbGlkYXRvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9zdHJpbmcnO1xuZXhwb3J0IHsgQm9vbGVhblZhbGlkYXRvciwgQm9vbGVhblZhbGlkYXRvckNvbnN0cnVjdG9yUGFyYW1zIH0gZnJvbSAnLi9ib29sZWFuJztcbmV4cG9ydCB7IE51bWJlclZhbGlkYXRvciwgTnVtYmVyVmFsaWRhdG9yQ29uc3RydWN0b3JQYXJhbXMgfSBmcm9tICcuL251bWJlcic7XG5leHBvcnQgeyBGaWVsZFZhbGlkYXRvcnMsIE9iamVjdFZhbGlkYXRvciwgT2JqZWN0VmFsaWRhdG9yQ29uc3RydWN0b3JQYXJhbXMsIE9iamVjdFZhbGlkYXRvck9wdGlvbnMgfSBmcm9tICcuL29iamVjdCc7XG4iXX0=
@@ -0,0 +1,43 @@
1
+ import { Failure } from '../result';
2
+ import { Validator, ValidatorOptions } from './validator';
3
+ import { ValidatorBase } from './validatorBase';
4
+ /**
5
+ * Parameters used to construct a {@link Validation.FieldValidator | FieldValidator}.
6
+ * @public
7
+ */
8
+ export interface FieldValidatorOptions<TC> extends ValidatorOptions<TC> {
9
+ optional?: boolean;
10
+ }
11
+ /**
12
+ * An in-place {@link Validation.Validator | Validator} for properties
13
+ * an an object.
14
+ * @public
15
+ */
16
+ export declare class FieldValidator<T, TC = undefined> extends ValidatorBase<T, TC> {
17
+ /**
18
+ * The name of the property that this validator should validate.
19
+ */
20
+ readonly fieldName: string;
21
+ /**
22
+ * The {@link Validation.Validator | Validator} to be applied against the named property.
23
+ */
24
+ readonly fieldValidator: Validator<T, TC>;
25
+ /**
26
+ * @internal
27
+ */
28
+ protected readonly _fieldOptions: FieldValidatorOptions<TC>;
29
+ /**
30
+ * Constructs a new {@link Validation.FieldValidator | FieldValidator.}.
31
+ * @param fieldName - The name of the property that this validator should validate.
32
+ * @param fieldValidator - The {@link Validation.Validator | Validator} to be applied
33
+ * against the named property.
34
+ * @param options - Additional {@link Validation.FieldValidatorOptions | options} to be
35
+ * applied to this validation.
36
+ */
37
+ constructor(fieldName: string, fieldValidator: Validator<T, TC>, options?: FieldValidatorOptions<TC>);
38
+ /**
39
+ * {@inheritdoc Validation.ValidatorBase._validate}
40
+ */
41
+ protected _validate(from: unknown, context?: TC): boolean | Failure<T>;
42
+ }
43
+ //# sourceMappingURL=field.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field.d.ts","sourceRoot":"","sources":["../../src/validation/field.ts"],"names":[],"mappings":"AAuBA,OAAO,EAAE,OAAO,EAAQ,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAGhD;;;GAGG;AACH,MAAM,WAAW,qBAAqB,CAAC,EAAE,CAAE,SAAQ,gBAAgB,CAAC,EAAE,CAAC;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;;GAIG;AACH,qBAAa,cAAc,CAAC,CAAC,EAAE,EAAE,GAAC,SAAS,CAAE,SAAQ,aAAa,CAAC,CAAC,EAAE,EAAE,CAAC;IACrE;;OAEG;IACH,SAAgB,SAAS,EAAE,MAAM,CAAC;IAClC;;OAEG;IACH,SAAgB,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD;;OAEG;IACH,SAAS,CAAC,QAAQ,CAAC,aAAa,EAAE,qBAAqB,CAAC,EAAE,CAAC,CAAC;IAE5D;;;;;;;OAOG;gBAEC,SAAS,EAAE,MAAM,EACjB,cAAc,EAAE,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,EAChC,OAAO,CAAC,EAAE,qBAAqB,CAAC,EAAE,CAAC;IASvC;;OAEG;IACH,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,GAAG,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC;CAqBzE"}
@@ -0,0 +1,72 @@
1
+ "use strict";
2
+ /*
3
+ * Copyright (c) 2020 Erik Fortune
4
+ *
5
+ * Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ * of this software and associated documentation files (the "Software"), to deal
7
+ * in the Software without restriction, including without limitation the rights
8
+ * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ * copies of the Software, and to permit persons to whom the Software is
10
+ * furnished to do so, subject to the following conditions:
11
+ *
12
+ * The above copyright notice and this permission notice shall be included in all
13
+ * copies or substantial portions of the Software.
14
+ *
15
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ * SOFTWARE.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.FieldValidator = void 0;
25
+ const result_1 = require("../result");
26
+ const validatorBase_1 = require("./validatorBase");
27
+ const utils_1 = require("../utils");
28
+ /**
29
+ * An in-place {@link Validation.Validator | Validator} for properties
30
+ * an an object.
31
+ * @public
32
+ */
33
+ class FieldValidator extends validatorBase_1.ValidatorBase {
34
+ /**
35
+ * Constructs a new {@link Validation.FieldValidator | FieldValidator.}.
36
+ * @param fieldName - The name of the property that this validator should validate.
37
+ * @param fieldValidator - The {@link Validation.Validator | Validator} to be applied
38
+ * against the named property.
39
+ * @param options - Additional {@link Validation.FieldValidatorOptions | options} to be
40
+ * applied to this validation.
41
+ */
42
+ constructor(fieldName, fieldValidator, options) {
43
+ super({ options });
44
+ this.fieldName = fieldName;
45
+ this.fieldValidator = fieldValidator;
46
+ // istanbul ignore next
47
+ this._fieldOptions = options !== null && options !== void 0 ? options : {};
48
+ }
49
+ /**
50
+ * {@inheritdoc Validation.ValidatorBase._validate}
51
+ */
52
+ _validate(from, context) {
53
+ if (typeof from === 'object' && !Array.isArray(from) && from !== null) {
54
+ const optional = this._fieldOptions.optional === true;
55
+ if ((0, utils_1.isKeyOf)(this.fieldName, from)) {
56
+ if ((!optional) || (from[this.fieldName] !== undefined)) {
57
+ const result = this.fieldValidator.validate(from[this.fieldName], context).onFailure((message) => {
58
+ return (0, result_1.fail)(`${this.fieldName}: ${message}`);
59
+ });
60
+ return result.success ? true : result;
61
+ }
62
+ }
63
+ return optional
64
+ ? true
65
+ : (0, result_1.fail)(`"${this.fieldName}": Field not found in "${JSON.stringify(from)}`);
66
+ }
67
+ // istanbul ignore next -- defense in depth
68
+ return (0, result_1.fail)(`Cannot validate field '${this.fieldName}' from non-object "${JSON.stringify(from)}"`);
69
+ }
70
+ }
71
+ exports.FieldValidator = FieldValidator;
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmllbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdmFsaWRhdGlvbi9maWVsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQ0E7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBb0JHOzs7QUFFSCxzQ0FBMEM7QUFFMUMsbURBQWdEO0FBQ2hELG9DQUFtQztBQVVuQzs7OztHQUlHO0FBQ0gsTUFBYSxjQUFnQyxTQUFRLDZCQUFvQjtJQWNyRTs7Ozs7OztPQU9HO0lBQ0gsWUFDSSxTQUFpQixFQUNqQixjQUFnQyxFQUNoQyxPQUFtQztRQUVuQyxLQUFLLENBQUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ25CLElBQUksQ0FBQyxTQUFTLEdBQUcsU0FBUyxDQUFDO1FBQzNCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLHVCQUF1QjtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLE9BQU8sYUFBUCxPQUFPLGNBQVAsT0FBTyxHQUFJLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0lBRUQ7O09BRUc7SUFDTyxTQUFTLENBQUMsSUFBYSxFQUFFLE9BQVk7UUFDM0MsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDbkUsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDO1lBRXRELElBQUksSUFBQSxlQUFPLEVBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLFNBQVMsQ0FBQyxFQUFFO29CQUNyRCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE9BQWUsRUFBRSxFQUFFO3dCQUNyRyxPQUFPLElBQUEsYUFBSSxFQUFDLEdBQUcsSUFBSSxDQUFDLFNBQVMsS0FBSyxPQUFPLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxDQUFDLENBQUMsQ0FBQztvQkFFSCxPQUFPLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO2lCQUN6QzthQUNKO1lBRUQsT0FBTyxRQUFRO2dCQUNYLENBQUMsQ0FBQyxJQUFJO2dCQUNOLENBQUMsQ0FBQyxJQUFBLGFBQUksRUFBQyxJQUFJLElBQUksQ0FBQyxTQUFTLDBCQUEwQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUNsRjtRQUNELDJDQUEyQztRQUMzQyxPQUFPLElBQUEsYUFBSSxFQUFDLDBCQUEwQixJQUFJLENBQUMsU0FBUyxzQkFBc0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDdkcsQ0FBQztDQUNKO0FBMURELHdDQTBEQyIsInNvdXJjZXNDb250ZW50IjpbIlxuLypcbiAqIENvcHlyaWdodCAoYykgMjAyMCBFcmlrIEZvcnR1bmVcbiAqXG4gKiBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4gKiBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0byBkZWFsXG4gKiBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzXG4gKiB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsXG4gKiBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbiAqIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4gKlxuICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4gYWxsXG4gKiBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuICpcbiAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1JcbiAqIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4gKiBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4gKiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuICogT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEVcbiAqIFNPRlRXQVJFLlxuICovXG5cbmltcG9ydCB7IEZhaWx1cmUsIGZhaWwgfSBmcm9tICcuLi9yZXN1bHQnO1xuaW1wb3J0IHsgVmFsaWRhdG9yLCBWYWxpZGF0b3JPcHRpb25zIH0gZnJvbSAnLi92YWxpZGF0b3InO1xuaW1wb3J0IHsgVmFsaWRhdG9yQmFzZSB9IGZyb20gJy4vdmFsaWRhdG9yQmFzZSc7XG5pbXBvcnQgeyBpc0tleU9mIH0gZnJvbSAnLi4vdXRpbHMnO1xuXG4vKipcbiAqIFBhcmFtZXRlcnMgdXNlZCB0byBjb25zdHJ1Y3QgYSB7QGxpbmsgVmFsaWRhdGlvbi5GaWVsZFZhbGlkYXRvciB8IEZpZWxkVmFsaWRhdG9yfS5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBGaWVsZFZhbGlkYXRvck9wdGlvbnM8VEM+IGV4dGVuZHMgVmFsaWRhdG9yT3B0aW9uczxUQz4ge1xuICAgIG9wdGlvbmFsPzogYm9vbGVhbjtcbn1cblxuLyoqXG4gKiBBbiBpbi1wbGFjZSB7QGxpbmsgVmFsaWRhdGlvbi5WYWxpZGF0b3IgfCBWYWxpZGF0b3J9IGZvciBwcm9wZXJ0aWVzXG4gKiBhbiBhbiBvYmplY3QuXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBjbGFzcyBGaWVsZFZhbGlkYXRvcjxULCBUQz11bmRlZmluZWQ+IGV4dGVuZHMgVmFsaWRhdG9yQmFzZTxULCBUQz4ge1xuICAgIC8qKlxuICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IHRoaXMgdmFsaWRhdG9yIHNob3VsZCB2YWxpZGF0ZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGROYW1lOiBzdHJpbmc7XG4gICAgLyoqXG4gICAgICogVGhlIHtAbGluayBWYWxpZGF0aW9uLlZhbGlkYXRvciB8IFZhbGlkYXRvcn0gdG8gYmUgYXBwbGllZCBhZ2FpbnN0IHRoZSBuYW1lZCBwcm9wZXJ0eS5cbiAgICAgKi9cbiAgICBwdWJsaWMgcmVhZG9ubHkgZmllbGRWYWxpZGF0b3I6IFZhbGlkYXRvcjxULCBUQz47XG4gICAgLyoqXG4gICAgICogQGludGVybmFsXG4gICAgICovXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IF9maWVsZE9wdGlvbnM6IEZpZWxkVmFsaWRhdG9yT3B0aW9uczxUQz47XG5cbiAgICAvKipcbiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAbGluayBWYWxpZGF0aW9uLkZpZWxkVmFsaWRhdG9yIHwgRmllbGRWYWxpZGF0b3IufS5cbiAgICAgKiBAcGFyYW0gZmllbGROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRoYXQgdGhpcyB2YWxpZGF0b3Igc2hvdWxkIHZhbGlkYXRlLlxuICAgICAqIEBwYXJhbSBmaWVsZFZhbGlkYXRvciAtIFRoZSB7QGxpbmsgVmFsaWRhdGlvbi5WYWxpZGF0b3IgfCBWYWxpZGF0b3J9IHRvIGJlIGFwcGxpZWRcbiAgICAgKiBhZ2FpbnN0IHRoZSBuYW1lZCBwcm9wZXJ0eS5cbiAgICAgKiBAcGFyYW0gb3B0aW9ucyAtIEFkZGl0aW9uYWwge0BsaW5rIFZhbGlkYXRpb24uRmllbGRWYWxpZGF0b3JPcHRpb25zIHwgb3B0aW9uc30gdG8gYmVcbiAgICAgKiBhcHBsaWVkIHRvIHRoaXMgdmFsaWRhdGlvbi5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoXG4gICAgICAgIGZpZWxkTmFtZTogc3RyaW5nLFxuICAgICAgICBmaWVsZFZhbGlkYXRvcjogVmFsaWRhdG9yPFQsIFRDPixcbiAgICAgICAgb3B0aW9ucz86IEZpZWxkVmFsaWRhdG9yT3B0aW9uczxUQz4sXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKHsgb3B0aW9ucyB9KTtcbiAgICAgICAgdGhpcy5maWVsZE5hbWUgPSBmaWVsZE5hbWU7XG4gICAgICAgIHRoaXMuZmllbGRWYWxpZGF0b3IgPSBmaWVsZFZhbGlkYXRvcjtcbiAgICAgICAgLy8gaXN0YW5idWwgaWdub3JlIG5leHRcbiAgICAgICAgdGhpcy5fZmllbGRPcHRpb25zID0gb3B0aW9ucyA/PyB7fTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiB7QGluaGVyaXRkb2MgVmFsaWRhdGlvbi5WYWxpZGF0b3JCYXNlLl92YWxpZGF0ZX1cbiAgICAgKi9cbiAgICBwcm90ZWN0ZWQgX3ZhbGlkYXRlKGZyb206IHVua25vd24sIGNvbnRleHQ/OiBUQyk6IGJvb2xlYW4gfCBGYWlsdXJlPFQ+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBmcm9tID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShmcm9tKSAmJiBmcm9tICE9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBvcHRpb25hbCA9IHRoaXMuX2ZpZWxkT3B0aW9ucy5vcHRpb25hbCA9PT0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKGlzS2V5T2YodGhpcy5maWVsZE5hbWUsIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgaWYgKCghb3B0aW9uYWwpIHx8IChmcm9tW3RoaXMuZmllbGROYW1lXSAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmZpZWxkVmFsaWRhdG9yLnZhbGlkYXRlKGZyb21bdGhpcy5maWVsZE5hbWVdLCBjb250ZXh0KS5vbkZhaWx1cmUoKG1lc3NhZ2U6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhaWwoYCR7dGhpcy5maWVsZE5hbWV9OiAke21lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuc3VjY2VzcyA/IHRydWUgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gb3B0aW9uYWxcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGZhaWwoYFwiJHt0aGlzLmZpZWxkTmFtZX1cIjogRmllbGQgbm90IGZvdW5kIGluIFwiJHtKU09OLnN0cmluZ2lmeShmcm9tKX1gKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAtLSBkZWZlbnNlIGluIGRlcHRoXG4gICAgICAgIHJldHVybiBmYWlsKGBDYW5ub3QgdmFsaWRhdGUgZmllbGQgJyR7dGhpcy5maWVsZE5hbWV9JyBmcm9tIG5vbi1vYmplY3QgXCIke0pTT04uc3RyaW5naWZ5KGZyb20pfVwiYCk7XG4gICAgfVxufVxuIl19