@gnwebsoft/ui 4.0.1 → 4.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,140 +0,0 @@
1
- // src/hooks/useTransform/index.ts
2
- function useTransform(options) {
3
- const value = typeof options.transform?.input === "function" ? options.transform.input(options.value) : options.value;
4
- const onChange = (eventOrValue, value2) => {
5
- if (typeof options.transform?.output === "function") {
6
- options.onChange(options.transform.output(eventOrValue, value2));
7
- } else {
8
- options.onChange(eventOrValue);
9
- }
10
- };
11
- return {
12
- value,
13
- onChange
14
- };
15
- }
16
-
17
- // src/hooks/useTransform/enhanced.ts
18
- import { useCallback, useMemo } from "react";
19
- var transformFactories = {
20
- number: () => ({
21
- input: (value) => {
22
- if (value == null) return "";
23
- return String(value);
24
- },
25
- output: (eventOrValue, _value) => {
26
- let rawValue;
27
- if (typeof eventOrValue === "object" && eventOrValue !== null && "target" in eventOrValue && typeof eventOrValue.target === "object" && eventOrValue.target !== null && "value" in eventOrValue.target) {
28
- rawValue = String(eventOrValue.target.value);
29
- } else {
30
- rawValue = String(eventOrValue);
31
- }
32
- if (rawValue === "") return null;
33
- const numValue = Number(rawValue);
34
- return isNaN(numValue) ? null : numValue;
35
- }
36
- }),
37
- text: () => ({
38
- input: (value) => {
39
- return value ?? "";
40
- },
41
- output: (eventOrValue, _value) => {
42
- if (typeof eventOrValue === "object" && eventOrValue !== null && "target" in eventOrValue && typeof eventOrValue.target === "object" && eventOrValue.target !== null && "value" in eventOrValue.target) {
43
- return eventOrValue.target.value;
44
- }
45
- return eventOrValue;
46
- }
47
- }),
48
- select: () => ({
49
- input: (value) => {
50
- return value ?? "";
51
- },
52
- output: (eventOrValue, value) => {
53
- if (value !== void 0) {
54
- return value;
55
- }
56
- if (typeof eventOrValue === "object" && eventOrValue !== null && "target" in eventOrValue && typeof eventOrValue.target === "object" && eventOrValue.target !== null && "value" in eventOrValue.target) {
57
- return eventOrValue.target.value;
58
- }
59
- return eventOrValue;
60
- }
61
- })
62
- };
63
- function getBuiltInTransform(fieldType) {
64
- switch (fieldType) {
65
- case "number":
66
- return transformFactories.number();
67
- case "text":
68
- return transformFactories.text();
69
- case "select":
70
- case "radio":
71
- return transformFactories.select();
72
- default:
73
- return void 0;
74
- }
75
- }
76
- function useEnhancedTransform(options) {
77
- const {
78
- value: fieldValue,
79
- onChange: fieldOnChange,
80
- transform,
81
- fieldType,
82
- defaultValue,
83
- enableWarnings
84
- } = options;
85
- const builtInTransform = useMemo(
86
- () => fieldType ? getBuiltInTransform(fieldType) : void 0,
87
- [fieldType]
88
- );
89
- if (enableWarnings && process.env.NODE_ENV === "development") {
90
- if (transform && fieldType) {
91
- console.warn(
92
- "useEnhancedTransform: Both custom transform and fieldType provided. Custom transform will take precedence."
93
- );
94
- }
95
- }
96
- const transformedValue = useMemo(() => {
97
- const inputTransform = transform?.input || builtInTransform?.input;
98
- if (typeof inputTransform === "function") {
99
- return inputTransform(fieldValue);
100
- }
101
- if (fieldValue == null && defaultValue !== void 0) {
102
- return defaultValue;
103
- }
104
- return fieldValue;
105
- }, [fieldValue, transform?.input, builtInTransform?.input, defaultValue]);
106
- const enhancedOnChange = useCallback(
107
- (eventOrValue, value) => {
108
- const outputTransform = transform?.output || builtInTransform?.output;
109
- if (typeof outputTransform === "function") {
110
- try {
111
- const transformedValue2 = outputTransform(eventOrValue, value);
112
- fieldOnChange(transformedValue2);
113
- } catch (error) {
114
- if (enableWarnings && process.env.NODE_ENV === "development") {
115
- console.error("useEnhancedTransform: Error in output transformation:", error);
116
- }
117
- fieldOnChange(
118
- value !== void 0 ? value : eventOrValue
119
- );
120
- }
121
- } else {
122
- fieldOnChange(
123
- value !== void 0 ? value : eventOrValue
124
- );
125
- }
126
- },
127
- [fieldOnChange, transform?.output, builtInTransform?.output, enableWarnings]
128
- );
129
- return {
130
- value: transformedValue,
131
- onChange: enhancedOnChange
132
- };
133
- }
134
-
135
- export {
136
- useTransform,
137
- transformFactories,
138
- useEnhancedTransform
139
- };
140
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2hvb2tzL3VzZVRyYW5zZm9ybS9pbmRleC50cyIsICIuLi9zcmMvaG9va3MvdXNlVHJhbnNmb3JtL2VuaGFuY2VkLnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJpbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSB9IGZyb20gXCIuLi8uLi90eXBlcy9ldmVudHNcIjtcblxuLyoqXG4gKiBPcHRpb25zIGZvciB0aGUgdXNlVHJhbnNmb3JtIGhvb2suXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlXG4gKiBAdGVtcGxhdGUgVFZhbHVlIC0gVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHR5cGVcbiAqXG4gKiBAcHVibGljXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgVXNlVHJhbnNmb3JtT3B0aW9uczxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duLFxuPiB7XG4gIC8qKiBUaGUgY3VycmVudCBmaWVsZCB2YWx1ZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICB2YWx1ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1widmFsdWVcIl07XG4gIC8qKiBUaGUgb25DaGFuZ2UgaGFuZGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBvbkNoYW5nZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1wib25DaGFuZ2VcIl07XG4gIC8qKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgZmllbGQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIGlucHV0XG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGN1cnJlbnQgZmllbGQgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdG8gZGlzcGxheVxuICAgICAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gdGhlIGlucHV0IGV2ZW50IGJhY2sgdG8gdGhlIGZpZWxkIHZhbHVlXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IHBhcmFtZXRlcnNcbiAgICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdG8gc3RvcmUgaW4gdGhlIGZvcm1cbiAgICAgKi9cbiAgICBvdXRwdXQ/OiAoXG4gICAgICBldmVudE9yVmFsdWU6IEV2ZW50T3JWYWx1ZTxQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4+LFxuICAgICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgfTtcbn1cblxuLyoqXG4gKiBSZXR1cm4gdHlwZSBmb3IgdGhlIHVzZVRyYW5zZm9ybSBob29rLlxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgaW50ZXJmYWNlIFVzZVRyYW5zZm9ybVJldHVybjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSB1bmtub3duLFxuPiB7XG4gIC8qKiBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdG8gZGlzcGxheSBpbiB0aGUgaW5wdXQgKi9cbiAgdmFsdWU6IFRWYWx1ZTtcbiAgLyoqIFRoZSBlbmhhbmNlZCBvbkNoYW5nZSBoYW5kbGVyIHdpdGggdHJhbnNmb3JtYXRpb24gYXBwbGllZCAqL1xuICBvbkNoYW5nZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1wib25DaGFuZ2VcIl07XG59XG5cbi8qKlxuICogQSBob29rIGZvciB0cmFuc2Zvcm1pbmcgZm9ybSBmaWVsZCB2YWx1ZXMgYmV0d2VlbiBkaXNwbGF5IGFuZCBzdG9yYWdlIGZvcm1hdHMuXG4gKlxuICogVGhpcyBob29rIHByb3ZpZGVzIGEgd2F5IHRvIHRyYW5zZm9ybSB2YWx1ZXMgYXMgdGhleSBmbG93IGJldHdlZW4gdGhlIGZvcm0gZmllbGRcbiAqIGFuZCB0aGUgZGlzcGxheSBjb21wb25lbnQuIEl0J3MgcGFydGljdWxhcmx5IHVzZWZ1bCBmb3IgZm9ybWF0dGluZyBkYXRhIGZvciBkaXNwbGF5XG4gKiAobGlrZSBkYXRlcywgbnVtYmVycywgb3IgY29tcGxleCBvYmplY3RzKSB3aGlsZSBtYWludGFpbmluZyBhIGRpZmZlcmVudCBpbnRlcm5hbFxuICogcmVwcmVzZW50YXRpb24gaW4gdGhlIGZvcm0gc3RhdGUuXG4gKlxuICogQGV4YW1wbGVcbiAqIFRyYW5zZm9ybSBhIGRhdGUgZm9yIGRpc3BsYXk6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm0oe1xuICogICB2YWx1ZTogZmllbGQudmFsdWUsXG4gKiAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChkYXRlKSA9PiBkYXRlID8gZm9ybWF0KGRhdGUsICd5eXl5LU1NLWRkJykgOiAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gbmV3IERhdGUoZXZlbnQudGFyZ2V0LnZhbHVlKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEBleGFtcGxlXG4gKiBUcmFuc2Zvcm0gbnVtYmVycyB3aXRoIGZvcm1hdHRpbmc6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VUcmFuc2Zvcm0oe1xuICogICB2YWx1ZTogZmllbGQudmFsdWUsXG4gKiAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAqICAgdHJhbnNmb3JtOiB7XG4gKiAgICAgaW5wdXQ6IChudW0pID0+IG51bSA/IG51bS50b0xvY2FsZVN0cmluZygpIDogJycsXG4gKiAgICAgb3V0cHV0OiAoZXZlbnQpID0+IHBhcnNlRmxvYXQoZXZlbnQudGFyZ2V0LnZhbHVlLnJlcGxhY2UoLywvZywgJycpKVxuICogICB9XG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHZhbHVlLCBvbkNoYW5nZSwgYW5kIHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYW5zZm9ybWVkIHZhbHVlIGFuZCBlbmhhbmNlZCBvbkNoYW5nZSBoYW5kbGVyXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gdXNlVHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IHVua25vd24sXG4+KFxuICBvcHRpb25zOiBVc2VUcmFuc2Zvcm1PcHRpb25zPFRGaWVsZFZhbHVlcywgVE5hbWUsIFRWYWx1ZT5cbik6IFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgdmFsdWUgPVxuICAgIHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8uaW5wdXQgPT09IFwiZnVuY3Rpb25cIlxuICAgICAgPyBvcHRpb25zLnRyYW5zZm9ybS5pbnB1dChvcHRpb25zLnZhbHVlKVxuICAgICAgOiBvcHRpb25zLnZhbHVlO1xuXG4gIGNvbnN0IG9uQ2hhbmdlID0gKFxuICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgKTogdm9pZCA9PiB7XG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLnRyYW5zZm9ybT8ub3V0cHV0ID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgIG9wdGlvbnMub25DaGFuZ2Uob3B0aW9ucy50cmFuc2Zvcm0ub3V0cHV0KGV2ZW50T3JWYWx1ZSwgdmFsdWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gUGFzcyB0aHJvdWdoIHRoZSBldmVudCBvciB2YWx1ZSBkaXJlY3RseVxuICAgICAgb3B0aW9ucy5vbkNoYW5nZShldmVudE9yVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZSxcbiAgICBvbkNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlVHJhbnNmb3JtO1xuIiwgImltcG9ydCB7IHVzZUNhbGxiYWNrLCB1c2VNZW1vIH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7IENoYW5nZUV2ZW50IH0gZnJvbSBcInJlYWN0XCI7XG5pbXBvcnQgdHlwZSB7XG4gIEZpZWxkUGF0aCxcbiAgRmllbGRWYWx1ZXMsXG4gIFBhdGhWYWx1ZSxcbiAgVXNlQ29udHJvbGxlclJldHVybixcbn0gZnJvbSBcInJlYWN0LWhvb2stZm9ybVwiO1xuXG5pbXBvcnQgdHlwZSB7IEV2ZW50T3JWYWx1ZSwgSW5wdXRFbGVtZW50IH0gZnJvbSBcIi4uLy4uL3R5cGVzL2V2ZW50c1wiO1xuXG4vKipcbiAqIEZpZWxkIHR5cGVzIGZvciBidWlsdC1pbiB0cmFuc2Zvcm1hdGlvbiBwYXR0ZXJuc1xuICovXG5leHBvcnQgdHlwZSBGaWVsZFR5cGUgPSAndGV4dCcgfCAnbnVtYmVyJyB8ICdkYXRlJyB8ICd0aW1lJyB8ICdzZWxlY3QnIHwgJ3JhZGlvJztcblxuLyoqXG4gKiBFbmhhbmNlZCBvcHRpb25zIGZvciB0aGUgdXNlVHJhbnNmb3JtIGhvb2sgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gKiBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBAdGVtcGxhdGUgVEZpZWxkVmFsdWVzIC0gVGhlIGZvcm0gdmFsdWVzIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUTmFtZSAtIFRoZSBmaWVsZCBuYW1lIHR5cGVcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFVzZVRyYW5zZm9ybU9wdGlvbnM8XG4gIFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzID0gRmllbGRWYWx1ZXMsXG4gIFROYW1lIGV4dGVuZHMgRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4gPSBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbiAgVFZhbHVlID0gUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+LFxuPiB7XG4gIC8qKiBUaGUgY3VycmVudCBmaWVsZCB2YWx1ZSBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICB2YWx1ZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1widmFsdWVcIl07XG4gIC8qKiBUaGUgb25DaGFuZ2UgaGFuZGxlciBmcm9tIHJlYWN0LWhvb2stZm9ybSAqL1xuICBvbkNoYW5nZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1wib25DaGFuZ2VcIl07XG4gIC8qKiBPcHRpb25hbCB0cmFuc2Zvcm1hdGlvbiBmdW5jdGlvbnMgKi9cbiAgdHJhbnNmb3JtPzoge1xuICAgIC8qKlxuICAgICAqIFRyYW5zZm9ybSB0aGUgZmllbGQgdmFsdWUgZm9yIGRpc3BsYXkgaW4gdGhlIGlucHV0XG4gICAgICogQHBhcmFtIHZhbHVlIC0gVGhlIGN1cnJlbnQgZmllbGQgdmFsdWVcbiAgICAgKiBAcmV0dXJucyBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdG8gZGlzcGxheVxuICAgICAqL1xuICAgIGlucHV0PzogKHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFRWYWx1ZTtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gdGhlIGlucHV0IGV2ZW50IGJhY2sgdG8gdGhlIGZpZWxkIHZhbHVlXG4gICAgICogQHBhcmFtIGV2ZW50IC0gVGhlIGlucHV0IGV2ZW50IG9yIHZhbHVlXG4gICAgICogQHJldHVybnMgVGhlIHRyYW5zZm9ybWVkIHZhbHVlIHRvIHN0b3JlIGluIHRoZSBmb3JtXG4gICAgICovXG4gICAgb3V0cHV0PzogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gIH07XG4gIC8qKiBCdWlsdC1pbiBmaWVsZCB0eXBlIGZvciBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb24gKi9cbiAgZmllbGRUeXBlPzogRmllbGRUeXBlO1xuICAvKiogRGVmYXVsdCB2YWx1ZSB0byB1c2Ugd2hlbiBmaWVsZCB2YWx1ZSBpcyBudWxsL3VuZGVmaW5lZCAqL1xuICBkZWZhdWx0VmFsdWU/OiBUVmFsdWU7XG4gIC8qKiBFbmFibGUgZGV2ZWxvcG1lbnQgd2FybmluZ3MgZm9yIGRlYnVnZ2luZyAqL1xuICBlbmFibGVXYXJuaW5ncz86IGJvb2xlYW47XG59XG5cbi8qKlxuICogRW5oYW5jZWQgcmV0dXJuIHR5cGUgZm9yIHRoZSB1c2VUcmFuc2Zvcm0gaG9vayB3aXRoIHN0YWJsZSByZWZlcmVuY2VzXG4gKlxuICogQHRlbXBsYXRlIFRGaWVsZFZhbHVlcyAtIFRoZSBmb3JtIHZhbHVlcyB0eXBlXG4gKiBAdGVtcGxhdGUgVE5hbWUgLSBUaGUgZmllbGQgbmFtZSB0eXBlICBcbiAqIEB0ZW1wbGF0ZSBUVmFsdWUgLSBUaGUgdHJhbnNmb3JtZWQgdmFsdWUgdHlwZVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBFbmhhbmNlZFVzZVRyYW5zZm9ybVJldHVybjxcbiAgVEZpZWxkVmFsdWVzIGV4dGVuZHMgRmllbGRWYWx1ZXMgPSBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPiA9IEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+LFxuICBUVmFsdWUgPSBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4sXG4+IHtcbiAgLyoqIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0byBkaXNwbGF5IGluIHRoZSBpbnB1dCAobWVtb2l6ZWQpICovXG4gIHZhbHVlOiBUVmFsdWU7XG4gIC8qKiBUaGUgZW5oYW5jZWQgb25DaGFuZ2UgaGFuZGxlciB3aXRoIHRyYW5zZm9ybWF0aW9uIGFwcGxpZWQgKG1lbW9pemVkKSAqL1xuICBvbkNoYW5nZTogVXNlQ29udHJvbGxlclJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lPltcImZpZWxkXCJdW1wib25DaGFuZ2VcIl07XG59XG5cbi8qKlxuICogVHJhbnNmb3JtIGZhY3RvcmllcyBmb3IgY29tbW9uIGZpZWxkIHR5cGVzXG4gKi9cbmV4cG9ydCBjb25zdCB0cmFuc2Zvcm1GYWN0b3JpZXMgPSB7XG4gIG51bWJlcjogPFRGaWVsZFZhbHVlcyBleHRlbmRzIEZpZWxkVmFsdWVzLCBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+PigpID0+ICh7XG4gICAgaW5wdXQ6ICh2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+KSA9PiB7XG4gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIFwiXCIgYXMgc3RyaW5nO1xuXG4gICAgICByZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiAgICB9LFxuICAgIG91dHB1dDogKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIF92YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4ge1xuICAgICAgbGV0IHJhd1ZhbHVlOiBzdHJpbmc7XG4gICAgICBcbiAgICAgIC8vIEV4dHJhY3Qgc3RyaW5nIHZhbHVlIGZyb20gZXZlbnQgb3IgZGlyZWN0IHZhbHVlXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGV2ZW50T3JWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAndGFyZ2V0JyBpbiBldmVudE9yVmFsdWUgJiZcbiAgICAgICAgdHlwZW9mIGV2ZW50T3JWYWx1ZS50YXJnZXQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGV2ZW50T3JWYWx1ZS50YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgJ3ZhbHVlJyBpbiBldmVudE9yVmFsdWUudGFyZ2V0XG4gICAgICApIHtcbiAgICAgICAgcmF3VmFsdWUgPSBTdHJpbmcoKGV2ZW50T3JWYWx1ZS50YXJnZXQgYXMgdW5rbm93biBhcyB7IHZhbHVlOiB1bmtub3duIH0pLnZhbHVlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1ZhbHVlID0gU3RyaW5nKGV2ZW50T3JWYWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChyYXdWYWx1ZSA9PT0gXCJcIikgcmV0dXJuIG51bGwgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgICAgY29uc3QgbnVtVmFsdWUgPSBOdW1iZXIocmF3VmFsdWUpO1xuXG4gICAgICByZXR1cm4gKGlzTmFOKG51bVZhbHVlKSA/IG51bGwgOiBudW1WYWx1ZSkgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+O1xuICAgIH0sXG4gIH0pLFxuXG4gIHRleHQ6IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcywgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPj4oKSA9PiAoe1xuICAgIGlucHV0OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICAgICAgcmV0dXJuICh2YWx1ZSA/PyBcIlwiKSBhcyBzdHJpbmc7XG4gICAgfSxcbiAgICBvdXRwdXQ6IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICBfdmFsdWU/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT5cbiAgICApID0+IHtcbiAgICAgIC8vIEV4dHJhY3Qgc3RyaW5nIHZhbHVlIGZyb20gZXZlbnQgb3IgZGlyZWN0IHZhbHVlXG4gICAgICBpZiAoXG4gICAgICAgIHR5cGVvZiBldmVudE9yVmFsdWUgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGV2ZW50T3JWYWx1ZSAhPT0gbnVsbCAmJlxuICAgICAgICAndGFyZ2V0JyBpbiBldmVudE9yVmFsdWUgJiZcbiAgICAgICAgdHlwZW9mIGV2ZW50T3JWYWx1ZS50YXJnZXQgPT09ICdvYmplY3QnICYmXG4gICAgICAgIGV2ZW50T3JWYWx1ZS50YXJnZXQgIT09IG51bGwgJiZcbiAgICAgICAgJ3ZhbHVlJyBpbiBldmVudE9yVmFsdWUudGFyZ2V0XG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIChldmVudE9yVmFsdWUudGFyZ2V0IGFzIHVua25vd24gYXMgeyB2YWx1ZTogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+IH0pLnZhbHVlO1xuICAgICAgfVxuICAgICAgXG4gICAgICByZXR1cm4gZXZlbnRPclZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPjtcbiAgICB9LFxuICB9KSxcblxuICBzZWxlY3Q6IDxURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcywgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPj4oKSA9PiAoe1xuICAgIGlucHV0OiAodmFsdWU6IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikgPT4ge1xuICAgICAgcmV0dXJuIHZhbHVlID8/IChcIlwiIGFzIHN0cmluZyk7XG4gICAgfSxcbiAgICBvdXRwdXQ6IChcbiAgICAgIGV2ZW50T3JWYWx1ZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sXG4gICAgICB2YWx1ZT86IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICkgPT4ge1xuICAgICAgLy8gTVVJIHBhdHRlcm46IChldmVudCwgdmFsdWUpIHdoZXJlIHZhbHVlIGlzIHRoZSBhY3R1YWwgc2VsZWN0ZWQgdmFsdWVcbiAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIFN0YW5kYXJkIGV2ZW50IHBhdHRlcm46IGV4dHJhY3QgZnJvbSBldmVudC50YXJnZXQudmFsdWVcbiAgICAgIGlmIChcbiAgICAgICAgdHlwZW9mIGV2ZW50T3JWYWx1ZSA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgZXZlbnRPclZhbHVlICE9PSBudWxsICYmXG4gICAgICAgICd0YXJnZXQnIGluIGV2ZW50T3JWYWx1ZSAmJlxuICAgICAgICB0eXBlb2YgZXZlbnRPclZhbHVlLnRhcmdldCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgZXZlbnRPclZhbHVlLnRhcmdldCAhPT0gbnVsbCAmJlxuICAgICAgICAndmFsdWUnIGluIGV2ZW50T3JWYWx1ZS50YXJnZXRcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gKGV2ZW50T3JWYWx1ZS50YXJnZXQgYXMgdW5rbm93biBhcyB7IHZhbHVlOiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4gfSkudmFsdWU7XG4gICAgICB9XG4gICAgICBcbiAgICAgIC8vIERpcmVjdCB2YWx1ZVxuICAgICAgcmV0dXJuIGV2ZW50T3JWYWx1ZSBhcyBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT47XG4gICAgfSxcbiAgfSksXG59IGFzIGNvbnN0OztcblxuLyoqXG4gKiBHZXQgYnVpbHQtaW4gdHJhbnNmb3JtYXRpb24gZm9yIGEgZmllbGQgdHlwZVxuICovXG5mdW5jdGlvbiBnZXRCdWlsdEluVHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyxcbiAgVE5hbWUgZXh0ZW5kcyBGaWVsZFBhdGg8VEZpZWxkVmFsdWVzPixcbj4oZmllbGRUeXBlPzogRmllbGRUeXBlKSB7XG4gIHN3aXRjaCAoZmllbGRUeXBlKSB7XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1GYWN0b3JpZXMubnVtYmVyPFRGaWVsZFZhbHVlcywgVE5hbWU+KCk7XG4gICAgY2FzZSAndGV4dCc6XG4gICAgICByZXR1cm4gdHJhbnNmb3JtRmFjdG9yaWVzLnRleHQ8VEZpZWxkVmFsdWVzLCBUTmFtZT4oKTtcbiAgICBjYXNlICdzZWxlY3QnOlxuICAgIGNhc2UgJ3JhZGlvJzpcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1GYWN0b3JpZXMuc2VsZWN0PFRGaWVsZFZhbHVlcywgVE5hbWU+KCk7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbn1cblxuLyoqXG4gKiBBbiBlbmhhbmNlZCBob29rIGZvciB0cmFuc2Zvcm1pbmcgZm9ybSBmaWVsZCB2YWx1ZXMgd2l0aCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zXG4gKiBhbmQgYnVpbHQtaW4gZmllbGQgdHlwZSBoYW5kbGluZy5cbiAqXG4gKiBUaGlzIGVuaGFuY2VkIHZlcnNpb24gcHJvdmlkZXM6XG4gKiAtIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgd2l0aCB1c2VNZW1vIGFuZCB1c2VDYWxsYmFja1xuICogLSBCdWlsdC1pbiB0cmFuc2Zvcm1hdGlvbnMgZm9yIGNvbW1vbiBmaWVsZCB0eXBlc1xuICogLSBCZXR0ZXIgVHlwZVNjcmlwdCBpbmZlcmVuY2VcbiAqIC0gRGV2ZWxvcG1lbnQgd2FybmluZ3NcbiAqIC0gU3RhYmxlIHJlZmVyZW5jZXMgdG8gcHJldmVudCB1bm5lY2Vzc2FyeSByZS1yZW5kZXJzXG4gKlxuICogQGV4YW1wbGVcbiAqIEJhc2ljIHVzYWdlIHdpdGggYnVpbHQtaW4gbnVtYmVyIGhhbmRsaW5nOlxuICogYGBgdHN4XG4gKiBjb25zdCB7IHZhbHVlLCBvbkNoYW5nZSB9ID0gdXNlRW5oYW5jZWRUcmFuc2Zvcm0oe1xuICogICB2YWx1ZTogZmllbGQudmFsdWUsXG4gKiAgIG9uQ2hhbmdlOiBmaWVsZC5vbkNoYW5nZSxcbiAqICAgZmllbGRUeXBlOiAnbnVtYmVyJ1xuICogfSk7XG4gKiBgYGBcbiAqXG4gKiBAZXhhbXBsZVxuICogQ3VzdG9tIHRyYW5zZm9ybWF0aW9ucyAoc2FtZSBhcyBvcmlnaW5hbCk6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybSh7XG4gKiAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAqICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICogICB0cmFuc2Zvcm06IHtcbiAqICAgICBpbnB1dDogKHZhbHVlKSA9PiB2YWx1ZT8udG9TdHJpbmcoKSB8fCAnJyxcbiAqICAgICBvdXRwdXQ6IChldmVudCkgPT4gcGFyc2VJbnQoZXZlbnQudGFyZ2V0LnZhbHVlKSB8fCBudWxsXG4gKiAgIH1cbiAqIH0pO1xuICogYGBgXG4gKlxuICogQGV4YW1wbGVcbiAqIFdpdGggZGVmYXVsdCB2YWx1ZSBhbmQgd2FybmluZ3M6XG4gKiBgYGB0c3hcbiAqIGNvbnN0IHsgdmFsdWUsIG9uQ2hhbmdlIH0gPSB1c2VFbmhhbmNlZFRyYW5zZm9ybSh7XG4gKiAgIHZhbHVlOiBmaWVsZC52YWx1ZSxcbiAqICAgb25DaGFuZ2U6IGZpZWxkLm9uQ2hhbmdlLFxuICogICBmaWVsZFR5cGU6ICd0ZXh0JyxcbiAqICAgZGVmYXVsdFZhbHVlOiAnJyxcbiAqICAgZW5hYmxlV2FybmluZ3M6IHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnXG4gKiB9KTtcbiAqIGBgYFxuICpcbiAqIEB0ZW1wbGF0ZSBURmllbGRWYWx1ZXMgLSBUaGUgZm9ybSB2YWx1ZXMgdHlwZVxuICogQHRlbXBsYXRlIFROYW1lIC0gVGhlIGZpZWxkIG5hbWUgdHlwZVxuICogQHRlbXBsYXRlIFRWYWx1ZSAtIFRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSB0eXBlXG4gKlxuICogQHBhcmFtIG9wdGlvbnMgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgaW5jbHVkaW5nIHZhbHVlLCBvbkNoYW5nZSwgYW5kIHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAqIEByZXR1cm5zIE9iamVjdCB3aXRoIHRyYW5zZm9ybWVkIHZhbHVlIGFuZCBlbmhhbmNlZCBvbkNoYW5nZSBoYW5kbGVyIChib3RoIG1lbW9pemVkKVxuICpcbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHVzZUVuaGFuY2VkVHJhbnNmb3JtPFxuICBURmllbGRWYWx1ZXMgZXh0ZW5kcyBGaWVsZFZhbHVlcyA9IEZpZWxkVmFsdWVzLFxuICBUTmFtZSBleHRlbmRzIEZpZWxkUGF0aDxURmllbGRWYWx1ZXM+ID0gRmllbGRQYXRoPFRGaWVsZFZhbHVlcz4sXG4gIFRWYWx1ZSA9IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPixcbj4oXG4gIG9wdGlvbnM6IEVuaGFuY2VkVXNlVHJhbnNmb3JtT3B0aW9uczxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+XG4pOiBFbmhhbmNlZFVzZVRyYW5zZm9ybVJldHVybjxURmllbGRWYWx1ZXMsIFROYW1lLCBUVmFsdWU+IHtcbiAgY29uc3QgeyBcbiAgICB2YWx1ZTogZmllbGRWYWx1ZSwgXG4gICAgb25DaGFuZ2U6IGZpZWxkT25DaGFuZ2UsIFxuICAgIHRyYW5zZm9ybSwgXG4gICAgZmllbGRUeXBlLCBcbiAgICBkZWZhdWx0VmFsdWUsXG4gICAgZW5hYmxlV2FybmluZ3MgXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8vIEdldCBidWlsdC1pbiB0cmFuc2Zvcm0gaWYgZmllbGRUeXBlIGlzIHNwZWNpZmllZFxuICBjb25zdCBidWlsdEluVHJhbnNmb3JtID0gdXNlTWVtbygoKSA9PiBcbiAgICBmaWVsZFR5cGUgPyBnZXRCdWlsdEluVHJhbnNmb3JtPFRGaWVsZFZhbHVlcywgVE5hbWU+KGZpZWxkVHlwZSkgOiB1bmRlZmluZWQsIFxuICAgIFtmaWVsZFR5cGVdXG4gICk7XG5cbiAgLy8gRGV2ZWxvcG1lbnQgd2FybmluZ3NcbiAgaWYgKGVuYWJsZVdhcm5pbmdzICYmIHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSAnZGV2ZWxvcG1lbnQnKSB7XG4gICAgaWYgKHRyYW5zZm9ybSAmJiBmaWVsZFR5cGUpIHtcbiAgICAgIGNvbnNvbGUud2FybihcbiAgICAgICAgJ3VzZUVuaGFuY2VkVHJhbnNmb3JtOiBCb3RoIGN1c3RvbSB0cmFuc2Zvcm0gYW5kIGZpZWxkVHlwZSBwcm92aWRlZC4gQ3VzdG9tIHRyYW5zZm9ybSB3aWxsIHRha2UgcHJlY2VkZW5jZS4nXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE1lbW9pemUgdGhlIHRyYW5zZm9ybWVkIGRpc3BsYXkgdmFsdWVcbiAgY29uc3QgdHJhbnNmb3JtZWRWYWx1ZSA9IHVzZU1lbW8oKCk6IFRWYWx1ZSA9PiB7XG4gICAgY29uc3QgaW5wdXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm0/LmlucHV0IHx8IGJ1aWx0SW5UcmFuc2Zvcm0/LmlucHV0O1xuICAgIFxuICAgIGlmICh0eXBlb2YgaW5wdXRUcmFuc2Zvcm0gPT09IFwiZnVuY3Rpb25cIikge1xuICAgICAgcmV0dXJuIGlucHV0VHJhbnNmb3JtKGZpZWxkVmFsdWUpIGFzIFRWYWx1ZTtcbiAgICB9XG4gICAgXG4gICAgLy8gRmFsbGJhY2sgd2l0aCBkZWZhdWx0IHZhbHVlIHN1cHBvcnRcbiAgICBpZiAoZmllbGRWYWx1ZSA9PSBudWxsICYmIGRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgIH1cbiAgICBcbiAgICByZXR1cm4gZmllbGRWYWx1ZSBhcyBUVmFsdWU7XG4gIH0sIFtmaWVsZFZhbHVlLCB0cmFuc2Zvcm0/LmlucHV0LCBidWlsdEluVHJhbnNmb3JtPy5pbnB1dCwgZGVmYXVsdFZhbHVlXSk7XG5cbiAgLy8gTWVtb2l6ZSB0aGUgZW5oYW5jZWQgb25DaGFuZ2UgaGFuZGxlclxuICBjb25zdCBlbmhhbmNlZE9uQ2hhbmdlID0gdXNlQ2FsbGJhY2soXG4gICAgKFxuICAgICAgZXZlbnRPclZhbHVlOiBFdmVudE9yVmFsdWU8UGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+PixcbiAgICAgIHZhbHVlPzogUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBvdXRwdXRUcmFuc2Zvcm0gPSB0cmFuc2Zvcm0/Lm91dHB1dCB8fCBidWlsdEluVHJhbnNmb3JtPy5vdXRwdXQ7XG4gICAgICBcbiAgICAgIGlmICh0eXBlb2Ygb3V0cHV0VHJhbnNmb3JtID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAvLyBIYW5kbGUgYm90aCBzaWduYXR1cmVzOiBvbGQgKGV2ZW50IG9ubHkpIGFuZCBuZXcgKGV2ZW50LCB2YWx1ZSlcbiAgICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZFZhbHVlID0gKG91dHB1dFRyYW5zZm9ybSBhcyAoZTogRXZlbnRPclZhbHVlPFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPj4sIHY/OiBQYXRoVmFsdWU8VEZpZWxkVmFsdWVzLCBUTmFtZT4pID0+IFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPikoZXZlbnRPclZhbHVlLCB2YWx1ZSk7XG5cbiAgICAgICAgICBmaWVsZE9uQ2hhbmdlKHRyYW5zZm9ybWVkVmFsdWUpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGlmIChlbmFibGVXYXJuaW5ncyAmJiBwcm9jZXNzLmVudi5OT0RFX0VOViA9PT0gJ2RldmVsb3BtZW50Jykge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcigndXNlRW5oYW5jZWRUcmFuc2Zvcm06IEVycm9yIGluIG91dHB1dCB0cmFuc2Zvcm1hdGlvbjonLCBlcnJvcik7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmFsbGJhY2sgdG8gZGlyZWN0IHZhbHVlIG9yIGZpcnN0IGFyZ3VtZW50XG4gICAgICAgICAgZmllbGRPbkNoYW5nZShcbiAgICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgXG4gICAgICAgICAgICAgID8gdmFsdWUgXG4gICAgICAgICAgICAgIDogZXZlbnRPclZhbHVlIGFzIFBhdGhWYWx1ZTxURmllbGRWYWx1ZXMsIFROYW1lPlxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIE5vIHRyYW5zZm9ybSwgcGFzcyB0aHJvdWdoIHRoZSB2YWx1ZSBvciBldmVudFxuICAgICAgICBmaWVsZE9uQ2hhbmdlKFxuICAgICAgICAgIHZhbHVlICE9PSB1bmRlZmluZWQgXG4gICAgICAgICAgICA/IHZhbHVlIFxuICAgICAgICAgICAgOiBldmVudE9yVmFsdWUgYXMgUGF0aFZhbHVlPFRGaWVsZFZhbHVlcywgVE5hbWU+XG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfSxcbiAgICBbZmllbGRPbkNoYW5nZSwgdHJhbnNmb3JtPy5vdXRwdXQsIGJ1aWx0SW5UcmFuc2Zvcm0/Lm91dHB1dCwgZW5hYmxlV2FybmluZ3NdXG4gICk7XG5cbiAgcmV0dXJuIHtcbiAgICB2YWx1ZTogdHJhbnNmb3JtZWRWYWx1ZSxcbiAgICBvbkNoYW5nZTogZW5oYW5jZWRPbkNoYW5nZSxcbiAgfTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgdXNlRW5oYW5jZWRUcmFuc2Zvcm07Il0sCiAgIm1hcHBpbmdzIjogIjtBQThHTyxTQUFTLGFBS2QsU0FDaUQ7QUFDakQsUUFBTSxRQUNKLE9BQU8sUUFBUSxXQUFXLFVBQVUsYUFDaEMsUUFBUSxVQUFVLE1BQU0sUUFBUSxLQUFLLElBQ3JDLFFBQVE7QUFFZCxRQUFNLFdBQVcsQ0FDZixjQUNBQSxXQUNTO0FBQ1QsUUFBSSxPQUFPLFFBQVEsV0FBVyxXQUFXLFlBQVk7QUFDbkQsY0FBUSxTQUFTLFFBQVEsVUFBVSxPQUFPLGNBQWNBLE1BQUssQ0FBQztBQUFBLElBQ2hFLE9BQU87QUFFTCxjQUFRLFNB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