@wavemaker/app-ng-runtime 11.14.1-3.6306 → 11.14.1-32.647748
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/components/base/bundles/index.umd.js +6 -22
- package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
- package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -24
- package/components/base/fesm2022/index.mjs +7 -23
- package/components/base/fesm2022/index.mjs.map +1 -1
- package/components/chart/bundles/index.umd.js +2 -2
- package/components/chart/esm2022/chart.utils.mjs +3 -3
- package/components/chart/fesm2022/index.mjs +2 -2
- package/components/chart/fesm2022/index.mjs.map +1 -1
- package/components/containers/wizard/bundles/index.umd.js +21 -2
- package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +3 -1
- package/components/containers/wizard/esm2022/wizard.component.mjs +20 -3
- package/components/containers/wizard/fesm2022/index.mjs +21 -2
- package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
- package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +2 -0
- package/components/data/pagination/bundles/index.umd.js +6 -1
- package/components/data/pagination/esm2022/pagination.component.mjs +7 -2
- package/components/data/pagination/fesm2022/index.mjs +6 -1
- package/components/data/pagination/fesm2022/index.mjs.map +1 -1
- package/components/data/table/bundles/index.umd.js +331 -23
- package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table-column/table-column.directive.mjs +108 -4
- package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
- package/components/data/table/esm2022/table-cud.directive.mjs +22 -5
- package/components/data/table/esm2022/table-filter.directive.mjs +43 -4
- package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
- package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
- package/components/data/table/esm2022/table.component.mjs +134 -15
- package/components/data/table/fesm2022/index.mjs +333 -25
- package/components/data/table/fesm2022/index.mjs.map +1 -1
- package/components/data/table/table-action/table-action.directive.d.ts +3 -2
- package/components/data/table/table-column/table-column.directive.d.ts +3 -2
- package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
- package/components/data/table/table-cud.directive.d.ts +3 -1
- package/components/data/table/table-filter.directive.d.ts +3 -1
- package/components/data/table/table-row/table-row.directive.d.ts +3 -2
- package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
- package/components/data/table/table.component.d.ts +10 -0
- package/components/page/default/bundles/index.umd.js +1 -0
- package/components/page/default/esm2022/page.directive.mjs +2 -1
- package/components/page/default/fesm2022/index.mjs +1 -0
- package/components/page/default/fesm2022/index.mjs.map +1 -1
- package/core/bundles/index.umd.js +185 -330
- package/core/esm2022/public_api.mjs +2 -2
- package/core/esm2022/utils/watcher.mjs +189 -328
- package/core/fesm2022/index.mjs +192 -330
- package/core/fesm2022/index.mjs.map +1 -1
- package/core/public_api.d.ts +1 -1
- package/core/utils/watcher.d.ts +5 -26
- package/locales/moment-timezone/moment-timezone-with-data.js +179 -27
- package/npm-shrinkwrap.json +2 -2
- package/package-lock.json +2 -2
- package/package.json +1 -1
- package/runtime/base/bundles/index.umd.js +20 -46
- package/runtime/base/components/base-prefab.component.d.ts +6 -4
- package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -7
- package/runtime/base/esm2022/components/base-page.component.mjs +2 -8
- package/runtime/base/esm2022/components/base-partial.component.mjs +3 -11
- package/runtime/base/esm2022/components/base-prefab.component.mjs +21 -21
- package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -9
- package/runtime/base/fesm2022/index.mjs +21 -47
- package/runtime/base/fesm2022/index.mjs.map +1 -1
- package/runtime/dynamic/bundles/index.umd.js +4 -0
- package/runtime/dynamic/esm2022/app/app.config.mjs +6 -2
- package/runtime/dynamic/fesm2022/index.mjs +5 -1
- package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
- package/scripts/datatable/datatable.js +336 -33
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
import { IDGenerator } from './id-generator';
|
|
2
2
|
import { $parseExpr } from './expression-parser';
|
|
3
3
|
import { findValueOf } from './utils';
|
|
4
|
-
import { clone, flatten, isArray, isEqual, isObject } from "lodash-es";
|
|
5
|
-
// Constants
|
|
6
|
-
const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
|
|
7
|
-
const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
|
|
8
|
-
const ARRAY_INDEX_PLACEHOLDER = '[$i]';
|
|
9
|
-
const ARRAY_INDEX_ZERO = '[0]';
|
|
10
|
-
const DEBOUNCE_WAIT = 100;
|
|
11
|
-
const MAX_WATCH_CYCLES = 5;
|
|
12
4
|
const registry = new Map();
|
|
13
5
|
const watchIdGenerator = new IDGenerator('watch-id-');
|
|
14
|
-
export const FIRST_TIME_WATCH =
|
|
15
|
-
|
|
6
|
+
export const FIRST_TIME_WATCH = {};
|
|
7
|
+
Object.freeze(FIRST_TIME_WATCH);
|
|
8
|
+
export const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
|
|
16
9
|
let muted = false;
|
|
17
|
-
let changedByWatch = false;
|
|
18
|
-
let skipWatchers = false;
|
|
19
|
-
let ngZone;
|
|
20
10
|
let appRef;
|
|
21
|
-
|
|
22
|
-
export const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
|
|
23
|
-
export const debounce = (fn, wait = DEBOUNCE_WAIT) => {
|
|
11
|
+
export const debounce = (fn, wait = 50) => {
|
|
24
12
|
let timeout;
|
|
25
13
|
return (...args) => {
|
|
26
14
|
window['__zone_symbol__clearTimeout'](timeout);
|
|
@@ -32,362 +20,230 @@ export const muteWatchers = () => {
|
|
|
32
20
|
};
|
|
33
21
|
export const unMuteWatchers = () => {
|
|
34
22
|
muted = false;
|
|
35
|
-
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
|
|
39
|
-
*/
|
|
40
|
-
const getWidgetId = (identifier) => {
|
|
41
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
42
|
-
return null;
|
|
43
|
-
}
|
|
44
|
-
const match = identifier.match(WIDGET_ID_REGEX);
|
|
45
|
-
return match ? match[1] : null;
|
|
23
|
+
$invokeWatchers(true);
|
|
46
24
|
};
|
|
47
|
-
/**
|
|
48
|
-
* Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
|
|
49
|
-
*/
|
|
50
|
-
const getPropertyName = (identifier) => {
|
|
51
|
-
if (!identifier || typeof identifier !== 'string') {
|
|
52
|
-
return identifier;
|
|
53
|
-
}
|
|
54
|
-
const match = identifier.match(WIDGET_PROPERTY_REGEX);
|
|
55
|
-
return match ? match[1] : identifier;
|
|
56
|
-
};
|
|
57
|
-
/**
|
|
58
|
-
* Array consumer wrapper for array-based expressions
|
|
59
|
-
*/
|
|
60
25
|
const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
26
|
+
let data = newVal, formattedData;
|
|
27
|
+
if (_.isArray(data)) {
|
|
28
|
+
formattedData = data.map(function (datum) {
|
|
29
|
+
return findValueOf(datum, restExpr);
|
|
30
|
+
});
|
|
31
|
+
// If resulting structure is an array of array, flatten it
|
|
32
|
+
if (_.isArray(formattedData[0])) {
|
|
33
|
+
formattedData = _.flatten(formattedData);
|
|
34
|
+
}
|
|
35
|
+
listenerFn(formattedData, oldVal);
|
|
68
36
|
}
|
|
69
|
-
listenerFn(formattedData, oldVal);
|
|
70
37
|
};
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
const regex = /\[\$i\]/g;
|
|
38
|
+
const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
|
|
39
|
+
// listener doesn't accept array
|
|
40
|
+
// replace all `[$i]` with `[0]` and return the expression
|
|
41
|
+
let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
|
|
76
42
|
if (!acceptsArray) {
|
|
77
43
|
return {
|
|
78
|
-
expr: expr.replace(regex,
|
|
79
|
-
listener
|
|
44
|
+
'expr': expr.replace(regex, $0),
|
|
45
|
+
'listener': listener
|
|
80
46
|
};
|
|
81
47
|
}
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
48
|
+
// listener accepts array
|
|
49
|
+
// replace all except the last `[$i]` with `[0]` and return the expression.
|
|
50
|
+
var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
|
|
51
|
+
if (restExpr) {
|
|
52
|
+
arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
|
|
53
|
+
}
|
|
88
54
|
return {
|
|
89
|
-
expr:
|
|
90
|
-
listener: arrayConsumerFn
|
|
55
|
+
'expr': _expr,
|
|
56
|
+
'listener': arrayConsumerFn
|
|
91
57
|
};
|
|
92
58
|
};
|
|
93
|
-
/**
|
|
94
|
-
* Determines if an expression is static (doesn't need to be watched)
|
|
95
|
-
*/
|
|
96
|
-
const STATIC_EXPRESSION_NAMES = [
|
|
97
|
-
"row.getProperty('investment')",
|
|
98
|
-
"row.getProperty('factsheetLink')",
|
|
99
|
-
"row.getProperty('isRebalanceEligible')"
|
|
100
|
-
];
|
|
101
|
-
const isStaticExpression = (expr) => {
|
|
102
|
-
if (typeof expr !== 'string') {
|
|
103
|
-
return false;
|
|
104
|
-
}
|
|
105
|
-
const trimmedExpr = expr.trim();
|
|
106
|
-
// Expressions that always evaluate to localization strings
|
|
107
|
-
if (trimmedExpr.includes('appLocale')) {
|
|
108
|
-
return true;
|
|
109
|
-
}
|
|
110
|
-
// Hard-coded static expression names
|
|
111
|
-
if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
|
|
112
|
-
return true;
|
|
113
|
-
}
|
|
114
|
-
return false;
|
|
115
|
-
};
|
|
116
|
-
/**
|
|
117
|
-
* Gets the scope type from the scope object
|
|
118
|
-
*/
|
|
119
|
-
const getScopeType = ($scope) => {
|
|
120
|
-
if (!$scope) {
|
|
121
|
-
return null;
|
|
122
|
-
}
|
|
123
|
-
if ($scope.pageName)
|
|
124
|
-
return 'Page';
|
|
125
|
-
if ($scope.prefabName)
|
|
126
|
-
return 'Prefab';
|
|
127
|
-
if ($scope.partialName)
|
|
128
|
-
return 'Partial';
|
|
129
|
-
// Check for App scope
|
|
130
|
-
if ($scope.Variables !== undefined &&
|
|
131
|
-
$scope.Actions !== undefined &&
|
|
132
|
-
!$scope.pageName &&
|
|
133
|
-
!$scope.prefabName &&
|
|
134
|
-
!$scope.partialName) {
|
|
135
|
-
return 'App';
|
|
136
|
-
}
|
|
137
|
-
if ($scope.constructor?.name === 'AppRef') {
|
|
138
|
-
return 'App';
|
|
139
|
-
}
|
|
140
|
-
return null;
|
|
141
|
-
};
|
|
142
|
-
/**
|
|
143
|
-
* Gets scope name based on scope type
|
|
144
|
-
*/
|
|
145
|
-
const getScopeName = ($scope, scopeType) => {
|
|
146
|
-
if (!scopeType || !$scope) {
|
|
147
|
-
return null;
|
|
148
|
-
}
|
|
149
|
-
switch (scopeType) {
|
|
150
|
-
case 'Prefab': return $scope.prefabName || null;
|
|
151
|
-
case 'Partial': return $scope.partialName || null;
|
|
152
|
-
case 'Page': return $scope.pageName || null;
|
|
153
|
-
default: return null;
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
/**
|
|
157
|
-
* Main watch function
|
|
158
|
-
*/
|
|
159
59
|
export const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
|
|
60
|
+
if (expr.indexOf('[$i]') !== -1) {
|
|
61
|
+
let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
|
|
163
62
|
expr = watchInfo.expr;
|
|
164
63
|
listener = watchInfo.listener;
|
|
165
64
|
}
|
|
166
|
-
// Handle static expressions
|
|
167
|
-
if (isStaticExpression(expr)) {
|
|
168
|
-
try {
|
|
169
|
-
const fn = $parseExpr(expr);
|
|
170
|
-
const staticValue = fn($scope, $locals);
|
|
171
|
-
listener(staticValue, FIRST_TIME_WATCH);
|
|
172
|
-
}
|
|
173
|
-
catch (e) {
|
|
174
|
-
console.warn(`Error evaluating static expression '${expr}':`, e);
|
|
175
|
-
listener(undefined, FIRST_TIME_WATCH);
|
|
176
|
-
}
|
|
177
|
-
return () => { }; // No-op unsubscribe
|
|
178
|
-
}
|
|
179
65
|
const fn = $parseExpr(expr);
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
const watchInfo = {
|
|
183
|
-
fn: fn.bind(null, $scope, $locals),
|
|
66
|
+
registry.set(identifier, {
|
|
67
|
+
fn: fn.bind(expr, $scope, $locals),
|
|
184
68
|
listener,
|
|
185
69
|
expr,
|
|
186
70
|
last: FIRST_TIME_WATCH,
|
|
187
71
|
doNotClone,
|
|
188
|
-
isMuted
|
|
189
|
-
scopeType,
|
|
190
|
-
scopeName
|
|
191
|
-
};
|
|
192
|
-
// Store in registry
|
|
193
|
-
const widgetId = getWidgetId(identifier);
|
|
194
|
-
if (widgetId) {
|
|
195
|
-
const propertyName = getPropertyName(identifier);
|
|
196
|
-
if (!registry.has(widgetId)) {
|
|
197
|
-
registry.set(widgetId, {});
|
|
198
|
-
}
|
|
199
|
-
const widgetGroup = registry.get(widgetId);
|
|
200
|
-
widgetGroup[propertyName] = watchInfo;
|
|
201
|
-
}
|
|
202
|
-
else {
|
|
203
|
-
registry.set(identifier, watchInfo);
|
|
204
|
-
}
|
|
205
|
-
return () => $unwatch(identifier);
|
|
206
|
-
};
|
|
207
|
-
/**
|
|
208
|
-
* Unwatches a single identifier
|
|
209
|
-
*/
|
|
210
|
-
export const $unwatch = (identifier) => {
|
|
211
|
-
const widgetId = getWidgetId(identifier);
|
|
212
|
-
if (widgetId) {
|
|
213
|
-
const propertyName = getPropertyName(identifier);
|
|
214
|
-
const widgetGroup = registry.get(widgetId);
|
|
215
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
216
|
-
const watchInfo = widgetGroup[propertyName];
|
|
217
|
-
if (watchInfo) {
|
|
218
|
-
delete widgetGroup[propertyName];
|
|
219
|
-
// Clean up empty widget groups
|
|
220
|
-
if (Object.keys(widgetGroup).length === 0) {
|
|
221
|
-
registry.delete(widgetId);
|
|
222
|
-
}
|
|
223
|
-
return true;
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
}
|
|
227
|
-
// Fallback to direct lookup
|
|
228
|
-
if (registry.has(identifier)) {
|
|
229
|
-
registry.delete(identifier);
|
|
230
|
-
return true;
|
|
231
|
-
}
|
|
232
|
-
return false;
|
|
233
|
-
};
|
|
234
|
-
/**
|
|
235
|
-
* Unwatches all watchers for a specific widget ID
|
|
236
|
-
*/
|
|
237
|
-
export const $unwatchAll = (widgetId) => {
|
|
238
|
-
if (!widgetId || typeof widgetId !== 'string') {
|
|
239
|
-
return 0;
|
|
240
|
-
}
|
|
241
|
-
const widgetGroup = registry.get(widgetId);
|
|
242
|
-
if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
|
|
243
|
-
const count = Object.keys(widgetGroup).length;
|
|
244
|
-
registry.delete(widgetId);
|
|
245
|
-
return count;
|
|
246
|
-
}
|
|
247
|
-
// Fallback: find all identifiers starting with this widget ID
|
|
248
|
-
let removedCount = 0;
|
|
249
|
-
const identifiersToRemove = [];
|
|
250
|
-
registry.forEach((_, key) => {
|
|
251
|
-
if (key.startsWith(widgetId + '_')) {
|
|
252
|
-
identifiersToRemove.push(key);
|
|
253
|
-
}
|
|
254
|
-
});
|
|
255
|
-
identifiersToRemove.forEach(identifier => {
|
|
256
|
-
if ($unwatch(identifier)) {
|
|
257
|
-
removedCount++;
|
|
258
|
-
}
|
|
259
|
-
});
|
|
260
|
-
return removedCount;
|
|
261
|
-
};
|
|
262
|
-
/**
|
|
263
|
-
* Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
|
|
264
|
-
* Now works directly with the main registry instead of separate scoped registries
|
|
265
|
-
*/
|
|
266
|
-
export const $unwatchAllByScope = (scopeType, scopeName) => {
|
|
267
|
-
if (!scopeType) {
|
|
268
|
-
return 0;
|
|
269
|
-
}
|
|
270
|
-
let removedCount = 0;
|
|
271
|
-
const identifiersToRemove = [];
|
|
272
|
-
registry.forEach((value, key) => {
|
|
273
|
-
// Handle grouped structure (widget groups)
|
|
274
|
-
if (value && typeof value === 'object' && !value.fn) {
|
|
275
|
-
Object.entries(value).forEach(([propertyName, watchInfo]) => {
|
|
276
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
277
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
278
|
-
identifiersToRemove.push(`${key}_${propertyName}`);
|
|
279
|
-
}
|
|
280
|
-
});
|
|
281
|
-
}
|
|
282
|
-
else {
|
|
283
|
-
// Direct watchInfo
|
|
284
|
-
const watchInfo = value;
|
|
285
|
-
if (watchInfo?.scopeType === scopeType &&
|
|
286
|
-
(!scopeName || watchInfo.scopeName === scopeName)) {
|
|
287
|
-
identifiersToRemove.push(key);
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
});
|
|
291
|
-
// Unwatch all collected identifiers
|
|
292
|
-
identifiersToRemove.forEach(identifier => {
|
|
293
|
-
if ($unwatch(identifier)) {
|
|
294
|
-
removedCount++;
|
|
295
|
-
}
|
|
72
|
+
isMuted: isMuted
|
|
296
73
|
});
|
|
297
|
-
return
|
|
298
|
-
};
|
|
299
|
-
/**
|
|
300
|
-
* Processes a single watch info during trigger cycle
|
|
301
|
-
*/
|
|
302
|
-
const processWatchInfo = (watchInfo) => {
|
|
303
|
-
if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
|
|
304
|
-
return false;
|
|
305
|
-
}
|
|
306
|
-
let newValue;
|
|
307
|
-
try {
|
|
308
|
-
newValue = watchInfo.fn();
|
|
309
|
-
}
|
|
310
|
-
catch (e) {
|
|
311
|
-
console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
|
|
312
|
-
return false;
|
|
313
|
-
}
|
|
314
|
-
if (isEqual(newValue, watchInfo.last)) {
|
|
315
|
-
return false;
|
|
316
|
-
}
|
|
317
|
-
// Change detected
|
|
318
|
-
changedByWatch = true;
|
|
319
|
-
watchInfo.last = isObject(newValue) && !watchInfo.doNotClone
|
|
320
|
-
? clone(newValue)
|
|
321
|
-
: newValue;
|
|
322
|
-
watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
|
|
323
|
-
changedByWatch = false;
|
|
324
|
-
return true;
|
|
74
|
+
return () => $unwatch(identifier);
|
|
325
75
|
};
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
76
|
+
export const $unwatch = identifier => registry.delete(identifier);
|
|
77
|
+
let changedByWatch = false;
|
|
78
|
+
const $RAF = window.requestAnimationFrame;
|
|
79
|
+
let ngZone;
|
|
80
|
+
const triggerWatchers = (ignoreMuted) => {
|
|
330
81
|
if (muted && !ignoreMuted) {
|
|
331
82
|
return;
|
|
332
83
|
}
|
|
84
|
+
log(".......................triggerWatchers.................................");
|
|
85
|
+
const limit = 5;
|
|
333
86
|
let pass = 1;
|
|
334
87
|
let changeDetected;
|
|
335
88
|
do {
|
|
336
89
|
changeDetected = false;
|
|
337
|
-
registry.forEach(
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
Object.values(value).forEach((watchInfo) => {
|
|
341
|
-
if (processWatchInfo(watchInfo)) {
|
|
342
|
-
changeDetected = true;
|
|
343
|
-
}
|
|
344
|
-
});
|
|
90
|
+
registry.forEach(watchInfo => {
|
|
91
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
92
|
+
return;
|
|
345
93
|
}
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
94
|
+
const fn = watchInfo.fn;
|
|
95
|
+
const listener = watchInfo.listener;
|
|
96
|
+
const ov = watchInfo.last;
|
|
97
|
+
let nv;
|
|
98
|
+
try {
|
|
99
|
+
nv = fn();
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
103
|
+
}
|
|
104
|
+
if (!_.isEqual(nv, ov)) {
|
|
105
|
+
changeDetected = true;
|
|
106
|
+
changedByWatch = true;
|
|
107
|
+
watchInfo.last = nv;
|
|
108
|
+
if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
109
|
+
watchInfo.last = _.clone(nv);
|
|
350
110
|
}
|
|
111
|
+
listener(nv, ov);
|
|
112
|
+
resetChangeFromWatch();
|
|
351
113
|
}
|
|
352
114
|
});
|
|
353
115
|
pass++;
|
|
354
|
-
} while (changeDetected && pass <
|
|
355
|
-
if (changeDetected && pass ===
|
|
356
|
-
console.warn(`
|
|
116
|
+
} while (changeDetected && pass < limit);
|
|
117
|
+
if (changeDetected && pass === limit) {
|
|
118
|
+
console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
|
|
357
119
|
}
|
|
358
120
|
};
|
|
359
|
-
|
|
360
|
-
export const
|
|
361
|
-
ngZone = zone;
|
|
362
|
-
};
|
|
363
|
-
export const setAppRef = (ref) => {
|
|
121
|
+
export const setNgZone = zone => ngZone = zone;
|
|
122
|
+
export const setAppRef = ref => {
|
|
364
123
|
appRef = ref;
|
|
365
124
|
};
|
|
366
125
|
export const isChangeFromWatch = () => changedByWatch;
|
|
367
|
-
export const resetChangeFromWatch = () =>
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
const
|
|
372
|
-
|
|
373
|
-
ngZone.run(() => triggerWatchers());
|
|
374
|
-
}, DEBOUNCE_WAIT);
|
|
126
|
+
export const resetChangeFromWatch = () => changedByWatch = false;
|
|
127
|
+
window.watchRegistry = registry;
|
|
128
|
+
let skipWatchers;
|
|
129
|
+
let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
|
|
130
|
+
const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
|
|
131
|
+
window.__WM_DEBUG_WATCHERS__ = false;
|
|
375
132
|
export const $invokeWatchers = (force = false, ignoreMuted = false) => {
|
|
376
133
|
if (force) {
|
|
377
134
|
triggerWatchers(ignoreMuted);
|
|
378
135
|
}
|
|
379
136
|
else {
|
|
137
|
+
scheduleExecution(ignoreMuted);
|
|
138
|
+
}
|
|
139
|
+
};
|
|
140
|
+
function scheduleExecution(ignoreMuted) {
|
|
141
|
+
if (scheduled) {
|
|
142
|
+
rerunRequested = true;
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
scheduled = true;
|
|
146
|
+
// Reset consecutive rerun counter when scheduling from outside
|
|
147
|
+
// (not from within executeWatchers rerun logic)
|
|
148
|
+
if (!isRunning) {
|
|
149
|
+
consecutiveReruns = 0;
|
|
150
|
+
}
|
|
151
|
+
debouncedExecute(ignoreMuted);
|
|
152
|
+
}
|
|
153
|
+
const debouncedExecute = debounce((ignoreMuted) => {
|
|
154
|
+
scheduled = false;
|
|
155
|
+
executeWatchers(ignoreMuted);
|
|
156
|
+
}, DEBOUNCE_TIME);
|
|
157
|
+
function executeWatchers(ignoreMuted) {
|
|
158
|
+
if (isRunning) {
|
|
159
|
+
rerunRequested = true;
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
isRunning = true;
|
|
163
|
+
let actuallyChanged = false;
|
|
164
|
+
ngZone.runOutsideAngular(() => {
|
|
165
|
+
let pass = 1;
|
|
166
|
+
let changeDetected;
|
|
167
|
+
do {
|
|
168
|
+
changeDetected = false;
|
|
169
|
+
log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
|
|
170
|
+
registry.forEach(watchInfo => {
|
|
171
|
+
if (watchInfo.isMuted && watchInfo.isMuted()) {
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const fn = watchInfo.fn;
|
|
175
|
+
const listener = watchInfo.listener;
|
|
176
|
+
const ov = watchInfo.last;
|
|
177
|
+
let nv;
|
|
178
|
+
try {
|
|
179
|
+
nv = fn();
|
|
180
|
+
}
|
|
181
|
+
catch (e) {
|
|
182
|
+
console.warn(`error in executing expression: '${watchInfo.expr}'`);
|
|
183
|
+
}
|
|
184
|
+
if (!_.isEqual(nv, ov)) {
|
|
185
|
+
changeDetected = true;
|
|
186
|
+
actuallyChanged = true;
|
|
187
|
+
changedByWatch = true;
|
|
188
|
+
watchInfo.last = nv;
|
|
189
|
+
if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
|
|
190
|
+
watchInfo.last = _.clone(nv);
|
|
191
|
+
}
|
|
192
|
+
listener(nv, ov);
|
|
193
|
+
resetChangeFromWatch();
|
|
194
|
+
}
|
|
195
|
+
});
|
|
196
|
+
pass++;
|
|
197
|
+
} while (changeDetected && pass < MAX_PASSES);
|
|
198
|
+
});
|
|
199
|
+
isRunning = false;
|
|
200
|
+
// Trigger Angular change detection if watchers actually changed values
|
|
201
|
+
if (actuallyChanged) {
|
|
202
|
+
ngZone.run(() => {
|
|
203
|
+
log(`-------DONE (changes detected)--------- `);
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
log(`-------DONE (no changes)--------- `);
|
|
208
|
+
}
|
|
209
|
+
// 🔥 collapse ALL mid-run triggers into ONE rerun
|
|
210
|
+
// BUT limit consecutive reruns to prevent infinite loops
|
|
211
|
+
if (rerunRequested) {
|
|
212
|
+
rerunRequested = false;
|
|
213
|
+
if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
|
|
214
|
+
consecutiveReruns++;
|
|
215
|
+
log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
|
|
216
|
+
scheduleExecution(ignoreMuted);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
consecutiveReruns = 0;
|
|
220
|
+
log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
else {
|
|
224
|
+
// No rerun requested - reset counter
|
|
225
|
+
consecutiveReruns = 0;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const debouncedTriggerWatchers = debounce(() => {
|
|
229
|
+
skipWatchers = true;
|
|
230
|
+
ngZone.runOutsideAngular(() => triggerWatchers());
|
|
231
|
+
}, 100);
|
|
232
|
+
/*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
|
|
233
|
+
if (force) {
|
|
234
|
+
triggerWatchers(ignoreMuted);
|
|
235
|
+
} else {
|
|
236
|
+
|
|
380
237
|
if (skipWatchers) {
|
|
381
238
|
skipWatchers = false;
|
|
382
239
|
return;
|
|
383
240
|
}
|
|
384
241
|
debouncedTriggerWatchers();
|
|
385
242
|
}
|
|
386
|
-
}
|
|
243
|
+
};*/
|
|
387
244
|
export const $appDigest = (() => {
|
|
388
245
|
let queued = false;
|
|
389
|
-
|
|
390
|
-
return (force = false) => {
|
|
246
|
+
return (force) => {
|
|
391
247
|
if (!appRef) {
|
|
392
248
|
return;
|
|
393
249
|
}
|
|
@@ -399,14 +255,19 @@ export const $appDigest = (() => {
|
|
|
399
255
|
if (queued) {
|
|
400
256
|
return;
|
|
401
257
|
}
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
258
|
+
else {
|
|
259
|
+
queued = true;
|
|
260
|
+
$RAF(() => {
|
|
261
|
+
ngZone.run(() => appRef.tick());
|
|
262
|
+
queued = false;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
407
265
|
}
|
|
408
266
|
};
|
|
409
267
|
})();
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBRXZFLFlBQVk7QUFDWixNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQztBQUMxQyxNQUFNLHFCQUFxQixHQUFHLHFCQUFxQixDQUFDO0FBQ3BELE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDO0FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsS0FBSyxDQUFDO0FBQy9CLE1BQU0sYUFBYSxHQUFHLEdBQUcsQ0FBQztBQUMxQixNQUFNLGdCQUFnQixHQUFHLENBQUMsQ0FBQztBQUUzQixNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0FBQ3hDLE1BQU0sZ0JBQWdCLEdBQUcsSUFBSSxXQUFXLENBQUMsV0FBVyxDQUFDLENBQUM7QUFFdEQsTUFBTSxDQUFDLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztBQXFCbEQsUUFBUTtBQUNSLElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLGNBQWMsR0FBRyxLQUFLLENBQUM7QUFDM0IsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO0FBQ3pCLElBQUksTUFBVyxDQUFDO0FBQ2hCLElBQUksTUFBVyxDQUFDO0FBRWhCLG9CQUFvQjtBQUNwQixNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FB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RyxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDaEMsTUFBTSxHQUFHLEtBQUssQ0FBQztRQUNuQixDQUFDO2FBQU0sQ0FBQztZQUNKLElBQUksTUFBTSxFQUFFLENBQUM7Z0JBQ1QsT0FBTztZQUNYLENBQUM7WUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDO1lBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO2dCQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO1lBQ25CLENBQUMsQ0FBQyxDQUFDO1FBQ1AsQ0FBQztJQUNMLENBQUMsQ0FBQztBQUNOLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFFTCxnQ0FBZ0M7QUFDaEMsNENBQTRDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5pbXBvcnQgeyAkcGFyc2VFeHByIH0gZnJvbSAnLi9leHByZXNzaW9uLXBhcnNlcic7XG5pbXBvcnQgeyBmaW5kVmFsdWVPZiB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgY2xvbmUsIGZsYXR0ZW4sIGlzQXJyYXksIGlzRXF1YWwsIGlzT2JqZWN0IH0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG4vLyBDb25zdGFudHNcbmNvbnN0IFdJREdFVF9JRF9SRUdFWCA9IC9eKHdpZGdldC1bXl9dKykvO1xuY29uc3QgV0lER0VUX1BST1BFUlRZX1JFR0VYID0gL153aWRnZXQtW15fXStfKC4rKSQvO1xuY29uc3QgQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIgPSAnWyRpXSc7XG5jb25zdCBBUlJBWV9JTkRFWF9aRVJPID0gJ1swXSc7XG5jb25zdCBERUJPVU5DRV9XQUlUID0gMTAwO1xuY29uc3QgTUFYX1dBVENIX0NZQ0xFUyA9IDU7XG5cbmNvbnN0IHJlZ2lzdHJ5ID0gbmV3IE1hcDxzdHJpbmcsIGFueT4oKTtcbmNvbnN0IHdhdGNoSWRHZW5lcmF0b3IgPSBuZXcgSURHZW5lcmF0b3IoJ3dhdGNoLWlkLScpO1xuXG5leHBvcnQgY29uc3QgRklSU1RfVElNRV9XQVRDSCA9IE9iamVjdC5mcmVlemUoe30pO1xuXG4vLyBUeXBlIGRlZmluaXRpb25zXG5pbnRlcmZhY2UgV2F0Y2hJbmZvIHtcbiAgICBmbjogKCkgPT4gYW55O1xuICAgIGxpc3RlbmVyOiAobmV3VmFsOiBhbnksIG9sZFZhbDogYW55KSA9PiB2b2lkO1xuICAgIGV4cHI6IHN0cmluZztcbiAgICBsYXN0OiBhbnk7XG4gICAgZG9Ob3RDbG9uZTogYm9vbGVhbjtcbiAgICBpc011dGVkPzogKCkgPT4gYm9vbGVhbjtcbiAgICBzY29wZVR5cGU6IFNjb3BlVHlwZSB8IG51bGw7XG4gICAgc2NvcGVOYW1lOiBzdHJpbmcgfCBudWxsO1xufVxuXG50eXBlIFNjb3BlVHlwZSA9ICdQYWdlJyB8ICdQcmVmYWInIHwgJ1BhcnRpYWwnIHwgJ0FwcCc7XG5cbmludGVyZmFjZSBXYXRjaENvbmZpZyB7XG4gICAgYXJyYXlUeXBlPzogYm9vbGVhbjtcbiAgICBpc0xpc3Q/OiBib29sZWFuO1xufVxuXG4vLyBTdGF0ZVxubGV0IG11dGVkID0gZmFsc2U7XG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcbmxldCBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbmxldCBuZ1pvbmU6IGFueTtcbmxldCBhcHBSZWY6IGFueTtcblxuLy8gVXRpbGl0eSBmdW5jdGlvbnNcbmV4cG9ydCBjb25zdCBpc0ZpcnN0VGltZUNoYW5nZSA9ICh2OiBhbnkpOiBib29sZWFuID0+IHYgPT09IEZJUlNUX1RJTUVfV0FUQ0g7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IERFQk9VTkNFX1dBSVQpID0+IHtcbiAgICBsZXQgdGltZW91dDogYW55O1xuICAgIHJldHVybiAoLi4uYXJnczogYW55W10pID0+IHtcbiAgICAgICAgd2luZG93WydfX3pvbmVfc3ltYm9sX19jbGVhclRpbWVvdXQnXSh0aW1lb3V0KTtcbiAgICAgICAgdGltZW91dCA9IHdpbmRvd1snX196b25lX3N5bWJvbF9fc2V0VGltZW91dCddKCgpID0+IGZuKC4uLmFyZ3MpLCB3YWl0KTtcbiAgICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IG11dGVXYXRjaGVycyA9ICgpOiB2b2lkID0+IHtcbiAgICBtdXRlZCA9IHRydWU7XG59O1xuXG5leHBvcnQgY29uc3QgdW5NdXRlV2F0Y2hlcnMgPSAoKTogdm9pZCA9PiB7XG4gICAgbXV0ZWQgPSBmYWxzZTtcbiAgICB0cmlnZ2VyV2F0Y2hlcnMoKTtcbn07XG5cbi8qKlxuICogRXh0cmFjdHMgd2lkZ2V0IElEIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwid2lkZ2V0LWlkMjNcIilcbiAqL1xuY29uc3QgZ2V0V2lkZ2V0SWQgPSAoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9JRF9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBudWxsO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyBwcm9wZXJ0eSBuYW1lIGZyb20gaWRlbnRpZmllciAoZS5nLiwgXCJ3aWRnZXQtaWQyM19ldmVudHNvdXJjZVwiIC0+IFwiZXZlbnRzb3VyY2VcIilcbiAqL1xuY29uc3QgZ2V0UHJvcGVydHlOYW1lID0gKGlkZW50aWZpZXI6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gICAgaWYgKCFpZGVudGlmaWVyIHx8IHR5cGVvZiBpZGVudGlmaWVyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gaWRlbnRpZmllcjtcbiAgICB9XG4gICAgY29uc3QgbWF0Y2ggPSBpZGVudGlmaWVyLm1hdGNoKFdJREdFVF9QUk9QRVJUWV9SRUdFWCk7XG4gICAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMV0gOiBpZGVudGlmaWVyO1xufTtcblxuLyoqXG4gKiBBcnJheSBjb25zdW1lciB3cmFwcGVyIGZvciBhcnJheS1iYXNlZCBleHByZXNzaW9uc1xuICovXG5jb25zdCBhcnJheUNvbnN1bWVyID0gKGxpc3RlbmVyRm46IGFueSwgcmVzdEV4cHI6IHN0cmluZywgbmV3VmFsOiBhbnksIG9sZFZhbDogYW55KTogdm9pZCA9PiB7XG4gICAgaWYgKCFpc0FycmF5KG5ld1ZhbCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGxldCBmb3JtYXR0ZWREYXRhID0gbmV3VmFsLm1hcChkYXR1bSA9PiBmaW5kVmFsdWVPZihkYXR1bSwgcmVzdEV4cHIpKTtcblxuICAgIC8vIEZsYXR0ZW4gaWYgcmVzdWx0IGlzIGFycmF5IG9mIGFycmF5c1xuICAgIGlmIChpc0FycmF5KGZvcm1hdHRlZERhdGFbMF0pKSB7XG4gICAgICAgIGZvcm1hdHRlZERhdGEgPSBmbGF0dGVuKGZvcm1hdHRlZERhdGEpO1xuICAgIH1cblxuICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbn07XG5cbi8qKlxuICogVXBkYXRlcyB3YXRjaCBpbmZvIGZvciBhcnJheSBleHByZXNzaW9uc1xuICovXG5jb25zdCBnZXRVcGRhdGVkV2F0Y2hJbmZvID0gKGV4cHI6IHN0cmluZywgYWNjZXB0c0FycmF5OiBib29sZWFuLCBsaXN0ZW5lcjogYW55KSA9PiB7XG4gICAgY29uc3QgcmVnZXggPSAvXFxbXFwkaVxcXS9nO1xuXG4gICAgaWYgKCFhY2NlcHRzQXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGV4cHI6IGV4cHIucmVwbGFjZShyZWdleCwgQVJSQVlfSU5ERVhfWkVSTyksXG4gICAgICAgICAgICBsaXN0ZW5lclxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0IGxhc3RJbmRleCA9IGV4cHIubGFzdEluZGV4T2YoQVJSQVlfSU5ERVhfUExBQ0VIT0xERVIpO1xuICAgIGNvbnN0IGJhc2VFeHByID0gZXhwci5zdWJzdHJpbmcoMCwgbGFzdEluZGV4KS5yZXBsYWNlKEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLCBBUlJBWV9JTkRFWF9aRVJPKTtcbiAgICBjb25zdCByZXN0RXhwciA9IGV4cHIuc3Vic3RyaW5nKGxhc3RJbmRleCArIEFSUkFZX0lOREVYX1BMQUNFSE9MREVSLmxlbmd0aCk7XG5cbiAgICBjb25zdCBhcnJheUNvbnN1bWVyRm4gPSByZXN0RXhwclxuICAgICAgICA/IGFycmF5Q29uc3VtZXIuYmluZCh1bmRlZmluZWQsIGxpc3RlbmVyLCByZXN0RXhwcilcbiAgICAgICAgOiBsaXN0ZW5lcjtcblxuICAgIHJldHVybiB7XG4gICAgICAgIGV4cHI6IGJhc2VFeHByLFxuICAgICAgICBsaXN0ZW5lcjogYXJyYXlDb25zdW1lckZuXG4gICAgfTtcbn07XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhbiBleHByZXNzaW9uIGlzIHN0YXRpYyAoZG9lc24ndCBuZWVkIHRvIGJlIHdhdGNoZWQpXG4gKi9cbmNvbnN0IFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTID0gW1xuICAgIFwicm93LmdldFByb3BlcnR5KCdpbnZlc3RtZW50JylcIixcbiAgICBcInJvdy5nZXRQcm9wZXJ0eSgnZmFjdHNoZWV0TGluaycpXCIsXG4gICAgXCJyb3cuZ2V0UHJvcGVydHkoJ2lzUmViYWxhbmNlRWxpZ2libGUnKVwiXG5dO1xuXG5jb25zdCBpc1N0YXRpY0V4cHJlc3Npb24gPSAoZXhwcjogYW55KTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKHR5cGVvZiBleHByICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgdHJpbW1lZEV4cHIgPSBleHByLnRyaW0oKTtcblxuICAgIC8vIEV4cHJlc3Npb25zIHRoYXQgYWx3YXlzIGV2YWx1YXRlIHRvIGxvY2FsaXphdGlvbiBzdHJpbmdzXG4gICAgaWYgKHRyaW1tZWRFeHByLmluY2x1ZGVzKCdhcHBMb2NhbGUnKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBIYXJkLWNvZGVkIHN0YXRpYyBleHByZXNzaW9uIG5hbWVzXG4gICAgaWYgKFNUQVRJQ19FWFBSRVNTSU9OX05BTUVTLmluY2x1ZGVzKHRyaW1tZWRFeHByKSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAqIEdldHMgdGhlIHNjb3BlIHR5cGUgZnJvbSB0aGUgc2NvcGUgb2JqZWN0XG4gKi9cbmNvbnN0IGdldFNjb3BlVHlwZSA9ICgkc2NvcGU6IGFueSk6IFNjb3BlVHlwZSB8IG51bGwgPT4ge1xuICAgIGlmICghJHNjb3BlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGlmICgkc2NvcGUucGFnZU5hbWUpIHJldHVybiAnUGFnZSc7XG4gICAgaWYgKCRzY29wZS5wcmVmYWJOYW1lKSByZXR1cm4gJ1ByZWZhYic7XG4gICAgaWYgKCRzY29wZS5wYXJ0aWFsTmFtZSkgcmV0dXJuICdQYXJ0aWFsJztcblxuICAgIC8vIENoZWNrIGZvciBBcHAgc2NvcGVcbiAgICBpZiAoJHNjb3BlLlZhcmlhYmxlcyAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICRzY29wZS5BY3Rpb25zICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgISRzY29wZS5wYWdlTmFtZSAmJlxuICAgICAgICAhJHNjb3BlLnByZWZhYk5hbWUgJiZcbiAgICAgICAgISRzY29wZS5wYXJ0aWFsTmFtZSkge1xuICAgICAgICByZXR1cm4gJ0FwcCc7XG4gICAgfVxuXG4gICAgaWYgKCRzY29wZS5jb25zdHJ1Y3Rvcj8ubmFtZSA9PT0gJ0FwcFJlZicpIHtcbiAgICAgICAgcmV0dXJuICdBcHAnO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xufTtcblxuLyoqXG4gKiBHZXRzIHNjb3BlIG5hbWUgYmFzZWQgb24gc2NvcGUgdHlwZVxuICovXG5jb25zdCBnZXRTY29wZU5hbWUgPSAoJHNjb3BlOiBhbnksIHNjb3BlVHlwZTogU2NvcGVUeXBlIHwgbnVsbCk6IHN0cmluZyB8IG51bGwgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlIHx8ICEkc2NvcGUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgc3dpdGNoIChzY29wZVR5cGUpIHtcbiAgICAgICAgY2FzZSAnUHJlZmFiJzogcmV0dXJuICRzY29wZS5wcmVmYWJOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhcnRpYWwnOiByZXR1cm4gJHNjb3BlLnBhcnRpYWxOYW1lIHx8IG51bGw7XG4gICAgICAgIGNhc2UgJ1BhZ2UnOiByZXR1cm4gJHNjb3BlLnBhZ2VOYW1lIHx8IG51bGw7XG4gICAgICAgIGRlZmF1bHQ6IHJldHVybiBudWxsO1xuICAgIH1cbn07XG5cbi8qKlxuICogTWFpbiB3YXRjaCBmdW5jdGlvblxuICovXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKFxuICAgIGV4cHI6IHN0cmluZyxcbiAgICAkc2NvcGU6IGFueSxcbiAgICAkbG9jYWxzOiBhbnksXG4gICAgbGlzdGVuZXI6IGFueSxcbiAgICBpZGVudGlmaWVyOiBzdHJpbmcgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSxcbiAgICBkb05vdENsb25lOiBib29sZWFuID0gZmFsc2UsXG4gICAgY29uZmlnOiBXYXRjaENvbmZpZyA9IHt9LFxuICAgIGlzTXV0ZWQ/OiAoKSA9PiBib29sZWFuXG4pID0+IHtcbiAgICAvLyBIYW5kbGUgYXJyYXkgZXhwcmVzc2lvbnNcbiAgICBpZiAoZXhwci5pbmNsdWRlcyhBUlJBWV9JTkRFWF9QTEFDRUhPTERFUikpIHtcbiAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gZ2V0VXBkYXRlZFdhdGNoSW5mbyhleHByLCBjb25maWcuYXJyYXlUeXBlIHx8IGNvbmZpZy5pc0xpc3QgfHwgZmFsc2UsIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3RhdGljIGV4cHJlc3Npb25zXG4gICAgaWYgKGlzU3RhdGljRXhwcmVzc2lvbihleHByKSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuICAgICAgICAgICAgY29uc3Qgc3RhdGljVmFsdWUgPSBmbigkc2NvcGUsICRsb2NhbHMpO1xuICAgICAgICAgICAgbGlzdGVuZXIoc3RhdGljVmFsdWUsIEZJUlNUX1RJTUVfV0FUQ0gpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oYEVycm9yIGV2YWx1YXRpbmcgc3RhdGljIGV4cHJlc3Npb24gJyR7ZXhwcn0nOmAsIGUpO1xuICAgICAgICAgICAgbGlzdGVuZXIodW5kZWZpbmVkLCBGSVJTVF9USU1FX1dBVENIKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKCkgPT4geyB9OyAvLyBOby1vcCB1bnN1YnNjcmliZVxuICAgIH1cblxuICAgIGNvbnN0IGZuID0gJHBhcnNlRXhwcihleHByKTtcbiAgICBjb25zdCBzY29wZVR5cGUgPSBnZXRTY29wZVR5cGUoJHNjb3BlKTtcbiAgICBjb25zdCBzY29wZU5hbWUgPSBnZXRTY29wZU5hbWUoJHNjb3BlLCBzY29wZVR5cGUpO1xuXG4gICAgY29uc3Qgd2F0Y2hJbmZvOiBXYXRjaEluZm8gPSB7XG4gICAgICAgIGZuOiBmbi5iaW5kKG51bGwsICRzY29wZSwgJGxvY2FscyksXG4gICAgICAgIGxpc3RlbmVyLFxuICAgICAgICBleHByLFxuICAgICAgICBsYXN0OiBGSVJTVF9USU1FX1dBVENILFxuICAgICAgICBkb05vdENsb25lLFxuICAgICAgICBpc011dGVkLFxuICAgICAgICBzY29wZVR5cGUsXG4gICAgICAgIHNjb3BlTmFtZVxuICAgIH07XG5cbiAgICAvLyBTdG9yZSBpbiByZWdpc3RyeVxuICAgIGNvbnN0IHdpZGdldElkID0gZ2V0V2lkZ2V0SWQoaWRlbnRpZmllcik7XG5cbiAgICBpZiAod2lkZ2V0SWQpIHtcbiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lID0gZ2V0UHJvcGVydHlOYW1lKGlkZW50aWZpZXIpO1xuICAgICAgICBpZiAoIXJlZ2lzdHJ5Lmhhcyh3aWRnZXRJZCkpIHtcbiAgICAgICAgICAgIHJlZ2lzdHJ5LnNldCh3aWRnZXRJZCwge30pO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHdpZGdldEdyb3VwID0gcmVnaXN0cnkuZ2V0KHdpZGdldElkKTtcbiAgICAgICAgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXSA9IHdhdGNoSW5mbztcbiAgICB9IGVsc2Uge1xuICAgICAgICByZWdpc3RyeS5zZXQoaWRlbnRpZmllciwgd2F0Y2hJbmZvKTtcbiAgICB9XG5cbiAgICByZXR1cm4gKCkgPT4gJHVud2F0Y2goaWRlbnRpZmllcik7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhIHNpbmdsZSBpZGVudGlmaWVyXG4gKi9cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IChpZGVudGlmaWVyOiBzdHJpbmcpOiBib29sZWFuID0+IHtcbiAgICBjb25zdCB3aWRnZXRJZCA9IGdldFdpZGdldElkKGlkZW50aWZpZXIpO1xuXG4gICAgaWYgKHdpZGdldElkKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5TmFtZSA9IGdldFByb3BlcnR5TmFtZShpZGVudGlmaWVyKTtcbiAgICAgICAgY29uc3Qgd2lkZ2V0R3JvdXAgPSByZWdpc3RyeS5nZXQod2lkZ2V0SWQpO1xuXG4gICAgICAgIGlmICh3aWRnZXRHcm91cCAmJiB0eXBlb2Ygd2lkZ2V0R3JvdXAgPT09ICdvYmplY3QnICYmICF3aWRnZXRHcm91cC5mbikge1xuICAgICAgICAgICAgY29uc3Qgd2F0Y2hJbmZvID0gd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgIGlmICh3YXRjaEluZm8pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgd2lkZ2V0R3JvdXBbcHJvcGVydHlOYW1lXTtcbiAgICAgICAgICAgICAgICAvLyBDbGVhbiB1cCBlbXB0eSB3aWRnZXQgZ3JvdXBzXG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHdpZGdldEdyb3VwKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmVnaXN0cnkuZGVsZXRlKHdpZGdldElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBGYWxsYmFjayB0byBkaXJlY3QgbG9va3VwXG4gICAgaWYgKHJlZ2lzdHJ5LmhhcyhpZGVudGlmaWVyKSkge1xuICAgICAgICByZWdpc3RyeS5kZWxldGUoaWRlbnRpZmllcik7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICogVW53YXRjaGVzIGFsbCB3YXRjaGVycyBmb3IgYSBzcGVjaWZpYyB3aWRnZXQgSURcbiAqL1xuZXhwb3J0IGNvbnN0ICR1bndhdGNoQWxsID0gKHdpZGdldElkOiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghd2lkZ2V0SWQgfHwgdHlwZW9mIHdpZGdldElkICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICBjb25zdCB3aWRnZXRHcm91cCA9IHJlZ2lzdHJ5LmdldCh3aWRnZXRJZCk7XG5cbiAgICBpZiAod2lkZ2V0R3JvdXAgJiYgdHlwZW9mIHdpZGdldEdyb3VwID09PSAnb2JqZWN0JyAmJiAhd2lkZ2V0R3JvdXAuZm4pIHtcbiAgICAgICAgY29uc3QgY291bnQgPSBPYmplY3Qua2V5cyh3aWRnZXRHcm91cCkubGVuZ3RoO1xuICAgICAgICByZWdpc3RyeS5kZWxldGUod2lkZ2V0SWQpO1xuICAgICAgICByZXR1cm4gY291bnQ7XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2s6IGZpbmQgYWxsIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGggdGhpcyB3aWRnZXQgSURcbiAgICBsZXQgcmVtb3ZlZENvdW50ID0gMDtcbiAgICBjb25zdCBpZGVudGlmaWVyc1RvUmVtb3ZlOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgcmVnaXN0cnkuZm9yRWFjaCgoXywga2V5KSA9PiB7XG4gICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCh3aWRnZXRJZCArICdfJykpIHtcbiAgICAgICAgICAgIGlkZW50aWZpZXJzVG9SZW1vdmUucHVzaChrZXkpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLmZvckVhY2goaWRlbnRpZmllciA9PiB7XG4gICAgICAgIGlmICgkdW53YXRjaChpZGVudGlmaWVyKSkge1xuICAgICAgICAgICAgcmVtb3ZlZENvdW50Kys7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiByZW1vdmVkQ291bnQ7XG59O1xuXG4vKipcbiAqIFVud2F0Y2hlcyBhbGwgd2F0Y2hlcnMgZm9yIGEgc3BlY2lmaWMgc2NvcGUgKFBhZ2UsIFByZWZhYiwgUGFydGlhbCwgb3IgQXBwKVxuICogTm93IHdvcmtzIGRpcmVjdGx5IHdpdGggdGhlIG1haW4gcmVnaXN0cnkgaW5zdGVhZCBvZiBzZXBhcmF0ZSBzY29wZWQgcmVnaXN0cmllc1xuICovXG5leHBvcnQgY29uc3QgJHVud2F0Y2hBbGxCeVNjb3BlID0gKHNjb3BlVHlwZTogU2NvcGVUeXBlLCBzY29wZU5hbWU/OiBzdHJpbmcpOiBudW1iZXIgPT4ge1xuICAgIGlmICghc2NvcGVUeXBlKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIGxldCByZW1vdmVkQ291bnQgPSAwO1xuICAgIGNvbnN0IGlkZW50aWZpZXJzVG9SZW1vdmU6IHN0cmluZ1tdID0gW107XG5cbiAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSwga2V5KSA9PiB7XG4gICAgICAgIC8vIEhhbmRsZSBncm91cGVkIHN0cnVjdHVyZSAod2lkZ2V0IGdyb3VwcylcbiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgIXZhbHVlLmZuKSB7XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyh2YWx1ZSkuZm9yRWFjaCgoW3Byb3BlcnR5TmFtZSwgd2F0Y2hJbmZvXTogW3N0cmluZywgYW55XSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh3YXRjaEluZm8/LnNjb3BlVHlwZSA9PT0gc2NvcGVUeXBlICYmXG4gICAgICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcnNUb1JlbW92ZS5wdXNoKGAke2tleX1fJHtwcm9wZXJ0eU5hbWV9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBEaXJlY3Qgd2F0Y2hJbmZvXG4gICAgICAgICAgICBjb25zdCB3YXRjaEluZm8gPSB2YWx1ZSBhcyBXYXRjaEluZm87XG4gICAgICAgICAgICBpZiAod2F0Y2hJbmZvPy5zY29wZVR5cGUgPT09IHNjb3BlVHlwZSAmJlxuICAgICAgICAgICAgICAgICghc2NvcGVOYW1lIHx8IHdhdGNoSW5mby5zY29wZU5hbWUgPT09IHNjb3BlTmFtZSkpIHtcbiAgICAgICAgICAgICAgICBpZGVudGlmaWVyc1RvUmVtb3ZlLnB1c2goa2V5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gVW53YXRjaCBhbGwgY29sbGVjdGVkIGlkZW50aWZpZXJzXG4gICAgaWRlbnRpZmllcnNUb1JlbW92ZS5mb3JFYWNoKGlkZW50aWZpZXIgPT4ge1xuICAgICAgICBpZiAoJHVud2F0Y2goaWRlbnRpZmllcikpIHtcbiAgICAgICAgICAgIHJlbW92ZWRDb3VudCsrO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICByZXR1cm4gcmVtb3ZlZENvdW50O1xufTtcblxuLyoqXG4gKiBQcm9jZXNzZXMgYSBzaW5nbGUgd2F0Y2ggaW5mbyBkdXJpbmcgdHJpZ2dlciBjeWNsZVxuICovXG5jb25zdCBwcm9jZXNzV2F0Y2hJbmZvID0gKHdhdGNoSW5mbzogV2F0Y2hJbmZvKTogYm9vbGVhbiA9PiB7XG4gICAgaWYgKCF3YXRjaEluZm8/LmZuIHx8ICh3YXRjaEluZm8uaXNNdXRlZD8uKCkgPz8gZmFsc2UpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBsZXQgbmV3VmFsdWU6IGFueTtcbiAgICB0cnkge1xuICAgICAgICBuZXdWYWx1ZSA9IHdhdGNoSW5mby5mbigpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBFcnJvciBleGVjdXRpbmcgZXhwcmVzc2lvbjogJyR7d2F0Y2hJbmZvLmV4cHJ9J2AsIGUpO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKGlzRXF1YWwobmV3VmFsdWUsIHdhdGNoSW5mby5sYXN0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2hhbmdlIGRldGVjdGVkXG4gICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgIHdhdGNoSW5mby5sYXN0ID0gaXNPYmplY3QobmV3VmFsdWUpICYmICF3YXRjaEluZm8uZG9Ob3RDbG9uZVxuICAgICAgICA/IGNsb25lKG5ld1ZhbHVlKVxuICAgICAgICA6IG5ld1ZhbHVlO1xuXG4gICAgd2F0Y2hJbmZvLmxpc3RlbmVyKG5ld1ZhbHVlLCB3YXRjaEluZm8ubGFzdCA9PT0gbmV3VmFsdWUgPyBGSVJTVF9USU1FX1dBVENIIDogd2F0Y2hJbmZvLmxhc3QpO1xuICAgIGNoYW5nZWRCeVdhdGNoID0gZmFsc2U7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogVHJpZ2dlcnMgYWxsIHdhdGNoZXJzXG4gKi9cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZDogYm9vbGVhbiA9IGZhbHNlKTogdm9pZCA9PiB7XG4gICAgaWYgKG11dGVkICYmICFpZ25vcmVNdXRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDogYm9vbGVhbjtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcblxuICAgICAgICByZWdpc3RyeS5mb3JFYWNoKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gSGFuZGxlIGdyb3VwZWQgc3RydWN0dXJlXG4gICAgICAgICAgICBpZiAodmFsdWUgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhdmFsdWUuZm4pIHtcbiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKHZhbHVlKS5mb3JFYWNoKCh3YXRjaEluZm86IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocHJvY2Vzc1dhdGNoSW5mbyh3YXRjaEluZm8pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gRGlyZWN0IHdhdGNoSW5mb1xuICAgICAgICAgICAgICAgIGlmIChwcm9jZXNzV2F0Y2hJbmZvKHZhbHVlIGFzIFdhdGNoSW5mbykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcGFzcysrO1xuICAgIH0gd2hpbGUgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPCBNQVhfV0FUQ0hfQ1lDTEVTKTtcblxuICAgIGlmIChjaGFuZ2VEZXRlY3RlZCAmJiBwYXNzID09PSBNQVhfV0FUQ0hfQ1lDTEVTKSB7XG4gICAgICAgIGNvbnNvbGUud2FybihgV2F0Y2ggY3ljbGVzIGV4Y2VlZGVkIGxpbWl0IG9mICR7TUFYX1dBVENIX0NZQ0xFU31gKTtcbiAgICB9XG59O1xuXG4vLyBBbmd1bGFyIHpvbmUgaW50ZWdyYXRpb25cbmV4cG9ydCBjb25zdCBzZXROZ1pvbmUgPSAoem9uZTogYW55KTogdm9pZCA9PiB7XG4gICAgbmdab25lID0gem9uZTtcbn07XG5cbmV4cG9ydCBjb25zdCBzZXRBcHBSZWYgPSAocmVmOiBhbnkpOiB2b2lkID0+IHtcbiAgICBhcHBSZWYgPSByZWY7XG59O1xuXG5leHBvcnQgY29uc3QgaXNDaGFuZ2VGcm9tV2F0Y2ggPSAoKTogYm9vbGVhbiA9PiBjaGFuZ2VkQnlXYXRjaDtcbmV4cG9ydCBjb25zdCByZXNldENoYW5nZUZyb21XYXRjaCA9ICgpOiB2b2lkID0+IHtcbiAgICBjaGFuZ2VkQnlXYXRjaCA9IGZhbHNlO1xufTtcblxuLy8gRGVib3VuY2VkIHRyaWdnZXJcbmNvbnN0IGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycyA9IGRlYm91bmNlKCgpID0+IHtcbiAgICBza2lwV2F0Y2hlcnMgPSB0cnVlO1xuICAgIG5nWm9uZS5ydW4oKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgREVCT1VOQ0VfV0FJVCk7XG5cbmV4cG9ydCBjb25zdCAkaW52b2tlV2F0Y2hlcnMgPSAoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSwgaWdub3JlTXV0ZWQ6IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQgPT4ge1xuICAgIGlmIChmb3JjZSkge1xuICAgICAgICB0cmlnZ2VyV2F0Y2hlcnMoaWdub3JlTXV0ZWQpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChza2lwV2F0Y2hlcnMpIHtcbiAgICAgICAgICAgIHNraXBXYXRjaGVycyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGRlYm91bmNlZFRyaWdnZXJXYXRjaGVycygpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbiAgICByZXR1cm4gKGZvcmNlOiBib29sZWFuID0gZmFsc2UpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmb3JjZSkge1xuICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiBhcHBSZWYudGljaygpKTtcbiAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaWYgKHF1ZXVlZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAkUkFGKCgpID0+IHtcbiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IGFwcFJlZi50aWNrKCkpO1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9O1xufSkoKTtcblxuLy8gRXhwb3J0IHJlZ2lzdHJ5IGZvciBkZWJ1Z2dpbmdcbi8vICh3aW5kb3cgYXMgYW55KS53YXRjaFJlZ2lzdHJ5ID0gcmVnaXN0cnk7Il19
|
|
268
|
+
function log(message) {
|
|
269
|
+
if (window.__WM_DEBUG_WATCHERS__) {
|
|
270
|
+
console.log(message);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2F0Y2hlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3V0aWxzL3dhdGNoZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSXRDLE1BQU0sUUFBUSxHQUFHLElBQUksR0FBRyxFQUFlLENBQUM7QUFFeEMsTUFBTSxnQkFBZ0IsR0FBRyxJQUFJLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUV0RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxFQUFFLENBQUM7QUFFbkMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBRWhDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLGdCQUFnQixDQUFDO0FBRTdELElBQUksS0FBSyxHQUFHLEtBQUssQ0FBQztBQUNsQixJQUFJLE1BQU0sQ0FBQztBQUVYLE1BQU0sQ0FBQyxNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVksRUFBRSxPQUFlLEVBQUUsRUFBRSxFQUFFO0lBQ3hELElBQUksT0FBTyxDQUFDO0lBQ1osT0FBTyxDQUFDLEdBQUcsSUFBSSxFQUFFLEVBQUU7UUFDZixNQUFNLENBQUMsNkJBQTZCLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUMvQyxPQUFPLEdBQUcsTUFBTSxDQUFDLDJCQUEyQixDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDM0UsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDO0FBRUYsTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLEdB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QUFNLEVBQUUsQ0FBQztnQkFDVCxPQUFPO1lBQ1gsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLE1BQU0sR0FBRyxJQUFJLENBQUM7Z0JBQ2QsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDTixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUNoQyxNQUFNLEdBQUcsS0FBSyxDQUFDO2dCQUNuQixDQUFDLENBQUMsQ0FBQztZQUNQLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQyxDQUFDO0FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUVMLFNBQVMsR0FBRyxDQUFDLE9BQWU7SUFDeEIsSUFBSyxNQUFjLENBQUMscUJBQXFCLEVBQUUsQ0FBQztRQUN4QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3pCLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSURHZW5lcmF0b3IgfSBmcm9tICcuL2lkLWdlbmVyYXRvcic7XG5cbmltcG9ydCB7ICRwYXJzZUV4cHIgfSBmcm9tICcuL2V4cHJlc3Npb24tcGFyc2VyJztcbmltcG9ydCB7IGZpbmRWYWx1ZU9mIH0gZnJvbSAnLi91dGlscyc7XG5cbmRlY2xhcmUgY29uc3QgXztcblxuY29uc3QgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuXG5jb25zdCB3YXRjaElkR2VuZXJhdG9yID0gbmV3IElER2VuZXJhdG9yKCd3YXRjaC1pZC0nKTtcblxuZXhwb3J0IGNvbnN0IEZJUlNUX1RJTUVfV0FUQ0ggPSB7fTtcblxuT2JqZWN0LmZyZWV6ZShGSVJTVF9USU1FX1dBVENIKTtcblxuZXhwb3J0IGNvbnN0IGlzRmlyc3RUaW1lQ2hhbmdlID0gdiA9PiB2ID09PSBGSVJTVF9USU1FX1dBVENIO1xuXG5sZXQgbXV0ZWQgPSBmYWxzZTtcbmxldCBhcHBSZWY7XG5cbmV4cG9ydCBjb25zdCBkZWJvdW5jZSA9IChmbjogRnVuY3Rpb24sIHdhaXQ6IG51bWJlciA9IDUwKSA9PiB7XG4gICAgbGV0IHRpbWVvdXQ7XG4gICAgcmV0dXJuICguLi5hcmdzKSA9PiB7XG4gICAgICAgIHdpbmRvd1snX196b25lX3N5bWJvbF9fY2xlYXJUaW1lb3V0J10odGltZW91dCk7XG4gICAgICAgIHRpbWVvdXQgPSB3aW5kb3dbJ19fem9uZV9zeW1ib2xfX3NldFRpbWVvdXQnXSgoKSA9PiBmbiguLi5hcmdzKSwgd2FpdCk7XG4gICAgfTtcbn07XG5cbmV4cG9ydCBjb25zdCBtdXRlV2F0Y2hlcnMgPSAoKSA9PiB7XG4gICAgbXV0ZWQgPSB0cnVlO1xufTtcblxuZXhwb3J0IGNvbnN0IHVuTXV0ZVdhdGNoZXJzID0gKCkgPT4ge1xuICAgIG11dGVkID0gZmFsc2U7XG4gICAgJGludm9rZVdhdGNoZXJzKHRydWUpO1xufTtcblxuY29uc3QgYXJyYXlDb25zdW1lciA9IChsaXN0ZW5lckZuLCByZXN0RXhwciwgbmV3VmFsLCBvbGRWYWwpID0+IHtcbiAgICBsZXQgZGF0YSA9IG5ld1ZhbCxcbiAgICAgICAgZm9ybWF0dGVkRGF0YTtcblxuICAgIGlmIChfLmlzQXJyYXkoZGF0YSkpIHtcbiAgICAgICAgZm9ybWF0dGVkRGF0YSA9IGRhdGEubWFwKGZ1bmN0aW9uIChkYXR1bSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmRWYWx1ZU9mKGRhdHVtLCByZXN0RXhwcik7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIElmIHJlc3VsdGluZyBzdHJ1Y3R1cmUgaXMgYW4gYXJyYXkgb2YgYXJyYXksIGZsYXR0ZW4gaXRcbiAgICAgICAgaWYgKF8uaXNBcnJheShmb3JtYXR0ZWREYXRhWzBdKSkge1xuICAgICAgICAgICAgZm9ybWF0dGVkRGF0YSA9IF8uZmxhdHRlbihmb3JtYXR0ZWREYXRhKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxpc3RlbmVyRm4oZm9ybWF0dGVkRGF0YSwgb2xkVmFsKTtcbiAgICB9XG59O1xuXG5jb25zdCBnZXRVcGRhdGVkV2F0Y0luZm8gPSAoZXhwciwgYWNjZXB0c0FycmF5LCBsaXN0ZW5lcikgPT4ge1xuICAgIC8vIGxpc3RlbmVyIGRvZXNuJ3QgYWNjZXB0IGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgYFskaV1gIHdpdGggYFswXWAgYW5kIHJldHVybiB0aGUgZXhwcmVzc2lvblxuICAgIGxldCByZWdleCA9IC9cXFtcXCRpXFxdL2csXG4gICAgICAgICRJICAgICAgICAgICAgICAgID0gJ1skaV0nLFxuICAgICAgICAkMCAgICAgICAgICAgICAgICA9ICdbMF0nO1xuICAgIGlmICghYWNjZXB0c0FycmF5KSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnZXhwcicgICAgIDogZXhwci5yZXBsYWNlKHJlZ2V4LCAkMCksXG4gICAgICAgICAgICAnbGlzdGVuZXInIDogbGlzdGVuZXJcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBsaXN0ZW5lciBhY2NlcHRzIGFycmF5XG4gICAgLy8gcmVwbGFjZSBhbGwgZXhjZXB0IHRoZSBsYXN0IGBbJGldYCB3aXRoIGBbMF1gIGFuZCByZXR1cm4gdGhlIGV4cHJlc3Npb24uXG4gICAgdmFyIGluZGV4ICAgICAgICAgICA9IGV4cHIubGFzdEluZGV4T2YoJEkpLFxuICAgICAgICBfZXhwciAgICAgICAgICAgPSBleHByLnN1YnN0cigwLCBpbmRleCkucmVwbGFjZSgkSSwgJDApLFxuICAgICAgICByZXN0RXhwciAgICAgICAgPSBleHByLnN1YnN0cihpbmRleCArIDUpLFxuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBsaXN0ZW5lcjtcblxuICAgIGlmIChyZXN0RXhwcikge1xuICAgICAgICBhcnJheUNvbnN1bWVyRm4gPSBhcnJheUNvbnN1bWVyLmJpbmQodW5kZWZpbmVkLCBsaXN0ZW5lciwgcmVzdEV4cHIpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgICdleHByJyAgICAgOiBfZXhwcixcbiAgICAgICAgJ2xpc3RlbmVyJyA6IGFycmF5Q29uc3VtZXJGblxuICAgIH07XG59O1xuXG5leHBvcnQgY29uc3QgJHdhdGNoID0gKGV4cHIsICRzY29wZSwgJGxvY2FscywgbGlzdGVuZXIsIGlkZW50aWZpZXIgPSB3YXRjaElkR2VuZXJhdG9yLm5leHRVaWQoKSwgZG9Ob3RDbG9uZSA9IGZhbHNlLCBjb25maWc6YW55PXt9LCBpc011dGVkPzogKCkgPT4gYm9vbGVhbikgPT4ge1xuICAgIGlmIChleHByLmluZGV4T2YoJ1skaV0nKSAhPT0gLTEpIHtcbiAgICAgICAgbGV0IHdhdGNoSW5mbyA9IGdldFVwZGF0ZWRXYXRjSW5mbyhleHByLCBjb25maWcgJiYgKGNvbmZpZy5hcnJheVR5cGUgfHwgY29uZmlnLmlzTGlzdCksIGxpc3RlbmVyKTtcbiAgICAgICAgZXhwciA9IHdhdGNoSW5mby5leHByO1xuICAgICAgICBsaXN0ZW5lciA9IHdhdGNoSW5mby5saXN0ZW5lcjtcbiAgICB9XG4gICAgY29uc3QgZm4gPSAkcGFyc2VFeHByKGV4cHIpO1xuXG4gICAgcmVnaXN0cnkuc2V0KGlkZW50aWZpZXIsIHtcbiAgICAgICAgZm46IGZuLmJpbmQoZXhwciwgJHNjb3BlLCAkbG9jYWxzKSxcbiAgICAgICAgbGlzdGVuZXIsXG4gICAgICAgIGV4cHIsXG4gICAgICAgIGxhc3Q6IEZJUlNUX1RJTUVfV0FUQ0gsXG4gICAgICAgIGRvTm90Q2xvbmUsXG4gICAgICAgIGlzTXV0ZWQ6IGlzTXV0ZWRcbiAgICB9KTtcblxuICAgIHJldHVybiAoKSA9PiAkdW53YXRjaChpZGVudGlmaWVyKTtcbn07XG5cbmV4cG9ydCBjb25zdCAkdW53YXRjaCA9IGlkZW50aWZpZXIgPT4gcmVnaXN0cnkuZGVsZXRlKGlkZW50aWZpZXIpO1xuXG5sZXQgY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuY29uc3QgJFJBRiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU7XG5cbmxldCBuZ1pvbmU7XG5cbmNvbnN0IHRyaWdnZXJXYXRjaGVycyA9IChpZ25vcmVNdXRlZD86IGJvb2xlYW4pID0+IHtcblxuICAgIGlmIChtdXRlZCAmJiAhaWdub3JlTXV0ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBsb2coXCIuLi4uLi4uLi4uLi4uLi4uLi4uLi4uLnRyaWdnZXJXYXRjaGVycy4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uLlwiKTtcbiAgICBjb25zdCBsaW1pdCA9IDU7XG4gICAgbGV0IHBhc3MgPSAxO1xuICAgIGxldCBjaGFuZ2VEZXRlY3RlZDtcblxuICAgIGRvIHtcbiAgICAgICAgY2hhbmdlRGV0ZWN0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmVnaXN0cnkuZm9yRWFjaCh3YXRjaEluZm8gPT4ge1xuICAgICAgICAgICAgaWYod2F0Y2hJbmZvLmlzTXV0ZWQgJiYgd2F0Y2hJbmZvLmlzTXV0ZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZuID0gd2F0Y2hJbmZvLmZuO1xuICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICBjb25zdCBvdiA9IHdhdGNoSW5mby5sYXN0O1xuICAgICAgICAgICAgbGV0IG52O1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIG52ID0gZm4oKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghXy5pc0VxdWFsKG52LCBvdikpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY2hhbmdlZEJ5V2F0Y2ggPSB0cnVlO1xuICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gbnY7XG5cbiAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdhdGNoSW5mby5sYXN0ID0gXy5jbG9uZShudik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxpc3RlbmVyKG52LCBvdik7XG4gICAgICAgICAgICAgICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIHBhc3MrKztcblxuICAgIH0gd2hpbGUgKGNoYW5nZURldGVjdGVkICYmIHBhc3MgPCBsaW1pdCk7XG5cbiAgICBpZiAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA9PT0gbGltaXQpIHtcbiAgICAgICAgY29uc29sZS53YXJuKGBOdW1iZXIgb2Ygd2F0Y2ggY3ljbGVzIGdvbmUgYWJvdmUgc2V0IGxpbWl0IG9mOiAke2xpbWl0fSBgKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3Qgc2V0Tmdab25lID0gem9uZSA9PiBuZ1pvbmUgPSB6b25lO1xuXG5leHBvcnQgY29uc3Qgc2V0QXBwUmVmID0gcmVmID0+IHtcbiAgICBhcHBSZWYgPSByZWZcbn07XG5cbmV4cG9ydCBjb25zdCBpc0NoYW5nZUZyb21XYXRjaCA9ICgpID0+IGNoYW5nZWRCeVdhdGNoO1xuZXhwb3J0IGNvbnN0IHJlc2V0Q2hhbmdlRnJvbVdhdGNoID0gKCkgPT4gY2hhbmdlZEJ5V2F0Y2ggPSBmYWxzZTtcblxuKDxhbnk+d2luZG93KS53YXRjaFJlZ2lzdHJ5ID0gcmVnaXN0cnk7XG5cbmxldCBza2lwV2F0Y2hlcnM7XG5cbmxldCBzY2hlZHVsZWQgPSBmYWxzZSxcbiAgICByZXJ1blJlcXVlc3RlZCA9IGZhbHNlLFxuICAgIGlzUnVubmluZyA9IGZhbHNlLFxuICAgIGNvbnNlY3V0aXZlUmVydW5zID0gMDtcblxuY29uc3QgTUFYX1BBU1NFUyA9IDUsXG4gICAgREVCT1VOQ0VfVElNRSA9IDIwMCxcbiAgICBNQVhfQ09OU0VDVVRJVkVfUkVSVU5TID0gMztcblxuKHdpbmRvdyBhcyBhbnkpLl9fV01fREVCVUdfV0FUQ0hFUlNfXyA9IGZhbHNlO1xuXG5leHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKFxuICAgIGZvcmNlID0gZmFsc2UsXG4gICAgaWdub3JlTXV0ZWQgPSBmYWxzZVxuKTogdm9pZCA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgc2NoZWR1bGVFeGVjdXRpb24oaWdub3JlTXV0ZWQpO1xuICAgIH1cbn07XG5cbmZ1bmN0aW9uIHNjaGVkdWxlRXhlY3V0aW9uKGlnbm9yZU11dGVkOiBib29sZWFuKSB7XG4gICAgaWYgKHNjaGVkdWxlZCkge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IHRydWU7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzY2hlZHVsZWQgPSB0cnVlO1xuXG4gICAgLy8gUmVzZXQgY29uc2VjdXRpdmUgcmVydW4gY291bnRlciB3aGVuIHNjaGVkdWxpbmcgZnJvbSBvdXRzaWRlXG4gICAgLy8gKG5vdCBmcm9tIHdpdGhpbiBleGVjdXRlV2F0Y2hlcnMgcmVydW4gbG9naWMpXG4gICAgaWYgKCFpc1J1bm5pbmcpIHtcbiAgICAgICAgY29uc2VjdXRpdmVSZXJ1bnMgPSAwO1xuICAgIH1cblxuICAgIGRlYm91bmNlZEV4ZWN1dGUoaWdub3JlTXV0ZWQpO1xufVxuXG5jb25zdCBkZWJvdW5jZWRFeGVjdXRlID0gZGVib3VuY2UoKGlnbm9yZU11dGVkOiBib29sZWFuKSA9PiB7XG4gICAgc2NoZWR1bGVkID0gZmFsc2U7XG4gICAgZXhlY3V0ZVdhdGNoZXJzKGlnbm9yZU11dGVkKTtcbn0sIERFQk9VTkNFX1RJTUUpO1xuXG5mdW5jdGlvbiBleGVjdXRlV2F0Y2hlcnMoaWdub3JlTXV0ZWQ6IGJvb2xlYW4pIHtcbiAgICBpZiAoaXNSdW5uaW5nKSB7XG4gICAgICAgIHJlcnVuUmVxdWVzdGVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlzUnVubmluZyA9IHRydWU7XG5cbiAgICBsZXQgYWN0dWFsbHlDaGFuZ2VkID0gZmFsc2U7XG5cbiAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICBsZXQgcGFzcyA9IDE7XG4gICAgICAgIGxldCBjaGFuZ2VEZXRlY3RlZDogYm9vbGVhbjtcblxuICAgICAgICBkbyB7XG4gICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IGZhbHNlO1xuICAgICAgICAgICAgbG9nKGAtLS0tLS0tZXhlY3V0ZVdhdGNoZXJzIChydW4gIyR7Y29uc2VjdXRpdmVSZXJ1bnMgKyAxfSktLS0tLS0tLS0gYCk7XG5cbiAgICAgICAgICAgIHJlZ2lzdHJ5LmZvckVhY2god2F0Y2hJbmZvID0+IHtcbiAgICAgICAgICAgICAgICBpZih3YXRjaEluZm8uaXNNdXRlZCAmJiB3YXRjaEluZm8uaXNNdXRlZCgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgZm4gPSB3YXRjaEluZm8uZm47XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSB3YXRjaEluZm8ubGlzdGVuZXI7XG4gICAgICAgICAgICAgICAgY29uc3Qgb3YgPSB3YXRjaEluZm8ubGFzdDtcbiAgICAgICAgICAgICAgICBsZXQgbnY7XG5cbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBudiA9IGZuKCk7XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYGVycm9yIGluIGV4ZWN1dGluZyBleHByZXNzaW9uOiAnJHt3YXRjaEluZm8uZXhwcn0nYCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKCFfLmlzRXF1YWwobnYsIG92KSkge1xuICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGFjdHVhbGx5Q2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZWRCeVdhdGNoID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2hJbmZvLmxhc3QgPSBudjtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXy5pc09iamVjdChudikgJiYgIXdhdGNoSW5mby5kb05vdENsb25lICYmIG52Ll9fY2xvbmVhYmxlX18gIT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3YXRjaEluZm8ubGFzdCA9IF8uY2xvbmUobnYpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyKG52LCBvdik7XG4gICAgICAgICAgICAgICAgICAgIHJlc2V0Q2hhbmdlRnJvbVdhdGNoKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHBhc3MrKztcbiAgICAgICAgfSB3aGlsZSAoY2hhbmdlRGV0ZWN0ZWQgJiYgcGFzcyA8IE1BWF9QQVNTRVMpO1xuICAgIH0pO1xuXG4gICAgaXNSdW5uaW5nID0gZmFsc2U7XG5cbiAgICAvLyBUcmlnZ2VyIEFuZ3VsYXIgY2hhbmdlIGRldGVjdGlvbiBpZiB3YXRjaGVycyBhY3R1YWxseSBjaGFuZ2VkIHZhbHVlc1xuICAgIGlmIChhY3R1YWxseUNoYW5nZWQpIHtcbiAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICBsb2coYC0tLS0tLS1ET05FIChjaGFuZ2VzIGRldGVjdGVkKS0tLS0tLS0tLSBgKTtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgbG9nKGAtLS0tLS0tRE9ORSAobm8gY2hhbmdlcyktLS0tLS0tLS0gYCk7XG4gICAgfVxuXG4gICAgLy8g8J+UpSBjb2xsYXBzZSBBTEwgbWlkLXJ1biB0cmlnZ2VycyBpbnRvIE9ORSByZXJ1blxuICAgIC8vIEJVVCBsaW1pdCBjb25zZWN1dGl2ZSByZXJ1bnMgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wc1xuICAgIGlmIChyZXJ1blJlcXVlc3RlZCkge1xuICAgICAgICByZXJ1blJlcXVlc3RlZCA9IGZhbHNlO1xuXG4gICAgICAgIGlmIChjb25zZWN1dGl2ZVJlcnVucyA8IE1BWF9DT05TRUNVVElWRV9SRVJVTlMpIHtcbiAgICAgICAgICAgIGNvbnNlY3V0aXZlUmVydW5zKys7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSBTY2hlZHVsaW5nIHJlcnVuICMke2NvbnNlY3V0aXZlUmVydW5zfSAocmVxdWVzdGVkIGR1cmluZyBleGVjdXRpb24pYCk7XG4gICAgICAgICAgICBzY2hlZHVsZUV4ZWN1dGlvbihpZ25vcmVNdXRlZCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgICAgICAgICBsb2coYFtXYXRjaGVyXSDimqDvuI8gU3RvcHBlZCBpbmZpbml0ZSBsb29wISBNYXggY29uc2VjdXRpdmUgcmVydW5zICgke01BWF9DT05TRUNVVElWRV9SRVJVTlN9KSByZWFjaGVkLiBUaGlzIHVzdWFsbHkgbWVhbnMgd2F0Y2hlciBsaXN0ZW5lcnMgYXJlIHRyaWdnZXJpbmcgbW9yZSBjaGFuZ2UgZGV0ZWN0aW9uLmApO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gTm8gcmVydW4gcmVxdWVzdGVkIC0gcmVzZXQgY291bnRlclxuICAgICAgICBjb25zZWN1dGl2ZVJlcnVucyA9IDA7XG4gICAgfVxufVxuXG5jb25zdCBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMgPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgc2tpcFdhdGNoZXJzID0gdHJ1ZTtcbiAgICBuZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4gdHJpZ2dlcldhdGNoZXJzKCkpO1xufSwgMTAwKTtcblxuLypleHBvcnQgY29uc3QgJGludm9rZVdhdGNoZXJzID0gKGZvcmNlPzogYm9vbGVhbiwgaWdub3JlTXV0ZWQ/OiBib29sZWFuKSA9PiB7XG4gICAgaWYgKGZvcmNlKSB7XG4gICAgICAgIHRyaWdnZXJXYXRjaGVycyhpZ25vcmVNdXRlZCk7XG4gICAgfSBlbHNlIHtcblxuICAgICAgICBpZiAoc2tpcFdhdGNoZXJzKSB7XG4gICAgICAgICAgICBza2lwV2F0Y2hlcnMgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBkZWJvdW5jZWRUcmlnZ2VyV2F0Y2hlcnMoKTtcbiAgICB9XG59OyovXG5cbmV4cG9ydCBjb25zdCAkYXBwRGlnZXN0ID0gKCgpID0+IHtcbiAgICBsZXQgcXVldWVkID0gZmFsc2U7XG4gICAgcmV0dXJuIChmb3JjZT86IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKCFhcHBSZWYpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZm9yY2UpIHtcbiAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICBxdWV1ZWQgPSBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmIChxdWV1ZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHF1ZXVlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgJFJBRigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4gYXBwUmVmLnRpY2soKSk7XG4gICAgICAgICAgICAgICAgICAgIHF1ZXVlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcbn0pKCk7XG5cbmZ1bmN0aW9uIGxvZyhtZXNzYWdlOiBzdHJpbmcpIHtcbiAgICBpZiAoKHdpbmRvdyBhcyBhbnkpLl9fV01fREVCVUdfV0FUQ0hFUlNfXykge1xuICAgICAgICBjb25zb2xlLmxvZyhtZXNzYWdlKTtcbiAgICB9XG59XG4iXX0=
|