@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.
Files changed (67) hide show
  1. package/components/base/bundles/index.umd.js +6 -22
  2. package/components/base/esm2022/pipes/custom-pipes.mjs +1 -1
  3. package/components/base/esm2022/widgets/common/base/base.component.mjs +8 -24
  4. package/components/base/fesm2022/index.mjs +7 -23
  5. package/components/base/fesm2022/index.mjs.map +1 -1
  6. package/components/chart/bundles/index.umd.js +2 -2
  7. package/components/chart/esm2022/chart.utils.mjs +3 -3
  8. package/components/chart/fesm2022/index.mjs +2 -2
  9. package/components/chart/fesm2022/index.mjs.map +1 -1
  10. package/components/containers/wizard/bundles/index.umd.js +21 -2
  11. package/components/containers/wizard/esm2022/wizard-step/wizard-step.component.mjs +3 -1
  12. package/components/containers/wizard/esm2022/wizard.component.mjs +20 -3
  13. package/components/containers/wizard/fesm2022/index.mjs +21 -2
  14. package/components/containers/wizard/fesm2022/index.mjs.map +1 -1
  15. package/components/containers/wizard/wizard-step/wizard-step.component.d.ts +2 -0
  16. package/components/data/pagination/bundles/index.umd.js +6 -1
  17. package/components/data/pagination/esm2022/pagination.component.mjs +7 -2
  18. package/components/data/pagination/fesm2022/index.mjs +6 -1
  19. package/components/data/pagination/fesm2022/index.mjs.map +1 -1
  20. package/components/data/table/bundles/index.umd.js +331 -23
  21. package/components/data/table/esm2022/table-action/table-action.directive.mjs +8 -1
  22. package/components/data/table/esm2022/table-column/table-column.directive.mjs +108 -4
  23. package/components/data/table/esm2022/table-column-group/table-column-group.directive.mjs +9 -1
  24. package/components/data/table/esm2022/table-cud.directive.mjs +22 -5
  25. package/components/data/table/esm2022/table-filter.directive.mjs +43 -4
  26. package/components/data/table/esm2022/table-row/table-row.directive.mjs +8 -1
  27. package/components/data/table/esm2022/table-row-action/table-row-action.directive.mjs +8 -1
  28. package/components/data/table/esm2022/table.component.mjs +134 -15
  29. package/components/data/table/fesm2022/index.mjs +333 -25
  30. package/components/data/table/fesm2022/index.mjs.map +1 -1
  31. package/components/data/table/table-action/table-action.directive.d.ts +3 -2
  32. package/components/data/table/table-column/table-column.directive.d.ts +3 -2
  33. package/components/data/table/table-column-group/table-column-group.directive.d.ts +3 -2
  34. package/components/data/table/table-cud.directive.d.ts +3 -1
  35. package/components/data/table/table-filter.directive.d.ts +3 -1
  36. package/components/data/table/table-row/table-row.directive.d.ts +3 -2
  37. package/components/data/table/table-row-action/table-row-action.directive.d.ts +3 -2
  38. package/components/data/table/table.component.d.ts +10 -0
  39. package/components/page/default/bundles/index.umd.js +1 -0
  40. package/components/page/default/esm2022/page.directive.mjs +2 -1
  41. package/components/page/default/fesm2022/index.mjs +1 -0
  42. package/components/page/default/fesm2022/index.mjs.map +1 -1
  43. package/core/bundles/index.umd.js +185 -330
  44. package/core/esm2022/public_api.mjs +2 -2
  45. package/core/esm2022/utils/watcher.mjs +189 -328
  46. package/core/fesm2022/index.mjs +192 -330
  47. package/core/fesm2022/index.mjs.map +1 -1
  48. package/core/public_api.d.ts +1 -1
  49. package/core/utils/watcher.d.ts +5 -26
  50. package/locales/moment-timezone/moment-timezone-with-data.js +179 -27
  51. package/npm-shrinkwrap.json +2 -2
  52. package/package-lock.json +2 -2
  53. package/package.json +1 -1
  54. package/runtime/base/bundles/index.umd.js +20 -46
  55. package/runtime/base/components/base-prefab.component.d.ts +6 -4
  56. package/runtime/base/esm2022/components/app-component/app.component.mjs +2 -7
  57. package/runtime/base/esm2022/components/base-page.component.mjs +2 -8
  58. package/runtime/base/esm2022/components/base-partial.component.mjs +3 -11
  59. package/runtime/base/esm2022/components/base-prefab.component.mjs +21 -21
  60. package/runtime/base/esm2022/components/base-spa-page.component.mjs +2 -9
  61. package/runtime/base/fesm2022/index.mjs +21 -47
  62. package/runtime/base/fesm2022/index.mjs.map +1 -1
  63. package/runtime/dynamic/bundles/index.umd.js +4 -0
  64. package/runtime/dynamic/esm2022/app/app.config.mjs +6 -2
  65. package/runtime/dynamic/fesm2022/index.mjs +5 -1
  66. package/runtime/dynamic/fesm2022/index.mjs.map +1 -1
  67. package/scripts/datatable/datatable.js +336 -33
@@ -1450,11 +1450,11 @@
1450
1450
  }
1451
1451
  };
1452
1452
 
1453
- const $RAF = window.requestAnimationFrame;
1453
+ const $RAF$1 = window.requestAnimationFrame;
1454
1454
  const $RAFQueue = [];
1455
1455
  const invokeLater = fn => {
1456
1456
  if (!$RAFQueue.length) {
1457
- $RAF(() => {
1457
+ $RAF$1(() => {
1458
1458
  $RAFQueue.forEach(f => f());
1459
1459
  $RAFQueue.length = 0;
1460
1460
  });
@@ -2191,25 +2191,14 @@
2191
2191
  return fnExecutor(expr, ExpressionType.Action);
2192
2192
  };
2193
2193
 
2194
- // Constants
2195
- const WIDGET_ID_REGEX = /^(widget-[^_]+)/;
2196
- const WIDGET_PROPERTY_REGEX = /^widget-[^_]+_(.+)$/;
2197
- const ARRAY_INDEX_PLACEHOLDER = '[$i]';
2198
- const ARRAY_INDEX_ZERO = '[0]';
2199
- const DEBOUNCE_WAIT = 100;
2200
- const MAX_WATCH_CYCLES = 5;
2201
2194
  const registry = new Map();
2202
2195
  const watchIdGenerator = new IDGenerator('watch-id-');
2203
- const FIRST_TIME_WATCH = Object.freeze({});
2204
- // State
2196
+ const FIRST_TIME_WATCH = {};
2197
+ Object.freeze(FIRST_TIME_WATCH);
2198
+ const isFirstTimeChange = v => v === FIRST_TIME_WATCH;
2205
2199
  let muted = false;
2206
- let changedByWatch = false;
2207
- let skipWatchers = false;
2208
- let ngZone;
2209
2200
  let appRef;
2210
- // Utility functions
2211
- const isFirstTimeChange = (v) => v === FIRST_TIME_WATCH;
2212
- const debounce = (fn, wait = DEBOUNCE_WAIT) => {
2201
+ const debounce = (fn, wait = 50) => {
2213
2202
  let timeout;
2214
2203
  return (...args) => {
2215
2204
  window['__zone_symbol__clearTimeout'](timeout);
@@ -2221,362 +2210,225 @@
2221
2210
  };
2222
2211
  const unMuteWatchers = () => {
2223
2212
  muted = false;
2224
- triggerWatchers();
2225
- };
2226
- /**
2227
- * Extracts widget ID from identifier (e.g., "widget-id23_eventsource" -> "widget-id23")
2228
- */
2229
- const getWidgetId = (identifier) => {
2230
- if (!identifier || typeof identifier !== 'string') {
2231
- return null;
2232
- }
2233
- const match = identifier.match(WIDGET_ID_REGEX);
2234
- return match ? match[1] : null;
2213
+ $invokeWatchers(true);
2235
2214
  };
2236
- /**
2237
- * Extracts property name from identifier (e.g., "widget-id23_eventsource" -> "eventsource")
2238
- */
2239
- const getPropertyName = (identifier) => {
2240
- if (!identifier || typeof identifier !== 'string') {
2241
- return identifier;
2242
- }
2243
- const match = identifier.match(WIDGET_PROPERTY_REGEX);
2244
- return match ? match[1] : identifier;
2245
- };
2246
- /**
2247
- * Array consumer wrapper for array-based expressions
2248
- */
2249
2215
  const arrayConsumer = (listenerFn, restExpr, newVal, oldVal) => {
2250
- if (!lodashEs.isArray(newVal)) {
2251
- return;
2252
- }
2253
- let formattedData = newVal.map(datum => findValueOf(datum, restExpr));
2254
- // Flatten if result is array of arrays
2255
- if (lodashEs.isArray(formattedData[0])) {
2256
- formattedData = lodashEs.flatten(formattedData);
2216
+ let data = newVal, formattedData;
2217
+ if (_.isArray(data)) {
2218
+ formattedData = data.map(function (datum) {
2219
+ return findValueOf(datum, restExpr);
2220
+ });
2221
+ // If resulting structure is an array of array, flatten it
2222
+ if (_.isArray(formattedData[0])) {
2223
+ formattedData = _.flatten(formattedData);
2224
+ }
2225
+ listenerFn(formattedData, oldVal);
2257
2226
  }
2258
- listenerFn(formattedData, oldVal);
2259
2227
  };
2260
- /**
2261
- * Updates watch info for array expressions
2262
- */
2263
- const getUpdatedWatchInfo = (expr, acceptsArray, listener) => {
2264
- const regex = /\[\$i\]/g;
2228
+ const getUpdatedWatcInfo = (expr, acceptsArray, listener) => {
2229
+ // listener doesn't accept array
2230
+ // replace all `[$i]` with `[0]` and return the expression
2231
+ let regex = /\[\$i\]/g, $I = '[$i]', $0 = '[0]';
2265
2232
  if (!acceptsArray) {
2266
2233
  return {
2267
- expr: expr.replace(regex, ARRAY_INDEX_ZERO),
2268
- listener
2234
+ 'expr': expr.replace(regex, $0),
2235
+ 'listener': listener
2269
2236
  };
2270
2237
  }
2271
- const lastIndex = expr.lastIndexOf(ARRAY_INDEX_PLACEHOLDER);
2272
- const baseExpr = expr.substring(0, lastIndex).replace(ARRAY_INDEX_PLACEHOLDER, ARRAY_INDEX_ZERO);
2273
- const restExpr = expr.substring(lastIndex + ARRAY_INDEX_PLACEHOLDER.length);
2274
- const arrayConsumerFn = restExpr
2275
- ? arrayConsumer.bind(undefined, listener, restExpr)
2276
- : listener;
2238
+ // listener accepts array
2239
+ // replace all except the last `[$i]` with `[0]` and return the expression.
2240
+ var index = expr.lastIndexOf($I), _expr = expr.substr(0, index).replace($I, $0), restExpr = expr.substr(index + 5), arrayConsumerFn = listener;
2241
+ if (restExpr) {
2242
+ arrayConsumerFn = arrayConsumer.bind(undefined, listener, restExpr);
2243
+ }
2277
2244
  return {
2278
- expr: baseExpr,
2279
- listener: arrayConsumerFn
2245
+ 'expr': _expr,
2246
+ 'listener': arrayConsumerFn
2280
2247
  };
2281
2248
  };
2282
- /**
2283
- * Determines if an expression is static (doesn't need to be watched)
2284
- */
2285
- const STATIC_EXPRESSION_NAMES = [
2286
- "row.getProperty('investment')",
2287
- "row.getProperty('factsheetLink')",
2288
- "row.getProperty('isRebalanceEligible')"
2289
- ];
2290
- const isStaticExpression = (expr) => {
2291
- if (typeof expr !== 'string') {
2292
- return false;
2293
- }
2294
- const trimmedExpr = expr.trim();
2295
- // Expressions that always evaluate to localization strings
2296
- if (trimmedExpr.includes('appLocale')) {
2297
- return true;
2298
- }
2299
- // Hard-coded static expression names
2300
- if (STATIC_EXPRESSION_NAMES.includes(trimmedExpr)) {
2301
- return true;
2302
- }
2303
- return false;
2304
- };
2305
- /**
2306
- * Gets the scope type from the scope object
2307
- */
2308
- const getScopeType = ($scope) => {
2309
- if (!$scope) {
2310
- return null;
2311
- }
2312
- if ($scope.pageName)
2313
- return 'Page';
2314
- if ($scope.prefabName)
2315
- return 'Prefab';
2316
- if ($scope.partialName)
2317
- return 'Partial';
2318
- // Check for App scope
2319
- if ($scope.Variables !== undefined &&
2320
- $scope.Actions !== undefined &&
2321
- !$scope.pageName &&
2322
- !$scope.prefabName &&
2323
- !$scope.partialName) {
2324
- return 'App';
2325
- }
2326
- if ($scope.constructor?.name === 'AppRef') {
2327
- return 'App';
2328
- }
2329
- return null;
2330
- };
2331
- /**
2332
- * Gets scope name based on scope type
2333
- */
2334
- const getScopeName = ($scope, scopeType) => {
2335
- if (!scopeType || !$scope) {
2336
- return null;
2337
- }
2338
- switch (scopeType) {
2339
- case 'Prefab': return $scope.prefabName || null;
2340
- case 'Partial': return $scope.partialName || null;
2341
- case 'Page': return $scope.pageName || null;
2342
- default: return null;
2343
- }
2344
- };
2345
- /**
2346
- * Main watch function
2347
- */
2348
2249
  const $watch = (expr, $scope, $locals, listener, identifier = watchIdGenerator.nextUid(), doNotClone = false, config = {}, isMuted) => {
2349
- // Handle array expressions
2350
- if (expr.includes(ARRAY_INDEX_PLACEHOLDER)) {
2351
- const watchInfo = getUpdatedWatchInfo(expr, config.arrayType || config.isList || false, listener);
2250
+ if (expr.indexOf('[$i]') !== -1) {
2251
+ let watchInfo = getUpdatedWatcInfo(expr, config && (config.arrayType || config.isList), listener);
2352
2252
  expr = watchInfo.expr;
2353
2253
  listener = watchInfo.listener;
2354
2254
  }
2355
- // Handle static expressions
2356
- if (isStaticExpression(expr)) {
2357
- try {
2358
- const fn = $parseExpr(expr);
2359
- const staticValue = fn($scope, $locals);
2360
- listener(staticValue, FIRST_TIME_WATCH);
2361
- }
2362
- catch (e) {
2363
- console.warn(`Error evaluating static expression '${expr}':`, e);
2364
- listener(undefined, FIRST_TIME_WATCH);
2365
- }
2366
- return () => { }; // No-op unsubscribe
2367
- }
2368
2255
  const fn = $parseExpr(expr);
2369
- const scopeType = getScopeType($scope);
2370
- const scopeName = getScopeName($scope, scopeType);
2371
- const watchInfo = {
2372
- fn: fn.bind(null, $scope, $locals),
2256
+ registry.set(identifier, {
2257
+ fn: fn.bind(expr, $scope, $locals),
2373
2258
  listener,
2374
2259
  expr,
2375
2260
  last: FIRST_TIME_WATCH,
2376
2261
  doNotClone,
2377
- isMuted,
2378
- scopeType,
2379
- scopeName
2380
- };
2381
- // Store in registry
2382
- const widgetId = getWidgetId(identifier);
2383
- if (widgetId) {
2384
- const propertyName = getPropertyName(identifier);
2385
- if (!registry.has(widgetId)) {
2386
- registry.set(widgetId, {});
2387
- }
2388
- const widgetGroup = registry.get(widgetId);
2389
- widgetGroup[propertyName] = watchInfo;
2390
- }
2391
- else {
2392
- registry.set(identifier, watchInfo);
2393
- }
2394
- return () => $unwatch(identifier);
2395
- };
2396
- /**
2397
- * Unwatches a single identifier
2398
- */
2399
- const $unwatch = (identifier) => {
2400
- const widgetId = getWidgetId(identifier);
2401
- if (widgetId) {
2402
- const propertyName = getPropertyName(identifier);
2403
- const widgetGroup = registry.get(widgetId);
2404
- if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2405
- const watchInfo = widgetGroup[propertyName];
2406
- if (watchInfo) {
2407
- delete widgetGroup[propertyName];
2408
- // Clean up empty widget groups
2409
- if (Object.keys(widgetGroup).length === 0) {
2410
- registry.delete(widgetId);
2411
- }
2412
- return true;
2413
- }
2414
- }
2415
- }
2416
- // Fallback to direct lookup
2417
- if (registry.has(identifier)) {
2418
- registry.delete(identifier);
2419
- return true;
2420
- }
2421
- return false;
2422
- };
2423
- /**
2424
- * Unwatches all watchers for a specific widget ID
2425
- */
2426
- const $unwatchAll = (widgetId) => {
2427
- if (!widgetId || typeof widgetId !== 'string') {
2428
- return 0;
2429
- }
2430
- const widgetGroup = registry.get(widgetId);
2431
- if (widgetGroup && typeof widgetGroup === 'object' && !widgetGroup.fn) {
2432
- const count = Object.keys(widgetGroup).length;
2433
- registry.delete(widgetId);
2434
- return count;
2435
- }
2436
- // Fallback: find all identifiers starting with this widget ID
2437
- let removedCount = 0;
2438
- const identifiersToRemove = [];
2439
- registry.forEach((_, key) => {
2440
- if (key.startsWith(widgetId + '_')) {
2441
- identifiersToRemove.push(key);
2442
- }
2443
- });
2444
- identifiersToRemove.forEach(identifier => {
2445
- if ($unwatch(identifier)) {
2446
- removedCount++;
2447
- }
2448
- });
2449
- return removedCount;
2450
- };
2451
- /**
2452
- * Unwatches all watchers for a specific scope (Page, Prefab, Partial, or App)
2453
- * Now works directly with the main registry instead of separate scoped registries
2454
- */
2455
- const $unwatchAllByScope = (scopeType, scopeName) => {
2456
- if (!scopeType) {
2457
- return 0;
2458
- }
2459
- let removedCount = 0;
2460
- const identifiersToRemove = [];
2461
- registry.forEach((value, key) => {
2462
- // Handle grouped structure (widget groups)
2463
- if (value && typeof value === 'object' && !value.fn) {
2464
- Object.entries(value).forEach(([propertyName, watchInfo]) => {
2465
- if (watchInfo?.scopeType === scopeType &&
2466
- (!scopeName || watchInfo.scopeName === scopeName)) {
2467
- identifiersToRemove.push(`${key}_${propertyName}`);
2468
- }
2469
- });
2470
- }
2471
- else {
2472
- // Direct watchInfo
2473
- const watchInfo = value;
2474
- if (watchInfo?.scopeType === scopeType &&
2475
- (!scopeName || watchInfo.scopeName === scopeName)) {
2476
- identifiersToRemove.push(key);
2477
- }
2478
- }
2262
+ isMuted: isMuted
2479
2263
  });
2480
- // Unwatch all collected identifiers
2481
- identifiersToRemove.forEach(identifier => {
2482
- if ($unwatch(identifier)) {
2483
- removedCount++;
2484
- }
2485
- });
2486
- return removedCount;
2487
- };
2488
- /**
2489
- * Processes a single watch info during trigger cycle
2490
- */
2491
- const processWatchInfo = (watchInfo) => {
2492
- if (!watchInfo?.fn || (watchInfo.isMuted?.() ?? false)) {
2493
- return false;
2494
- }
2495
- let newValue;
2496
- try {
2497
- newValue = watchInfo.fn();
2498
- }
2499
- catch (e) {
2500
- console.warn(`Error executing expression: '${watchInfo.expr}'`, e);
2501
- return false;
2502
- }
2503
- if (lodashEs.isEqual(newValue, watchInfo.last)) {
2504
- return false;
2505
- }
2506
- // Change detected
2507
- changedByWatch = true;
2508
- watchInfo.last = lodashEs.isObject(newValue) && !watchInfo.doNotClone
2509
- ? lodashEs.clone(newValue)
2510
- : newValue;
2511
- watchInfo.listener(newValue, watchInfo.last === newValue ? FIRST_TIME_WATCH : watchInfo.last);
2512
- changedByWatch = false;
2513
- return true;
2264
+ return () => $unwatch(identifier);
2514
2265
  };
2515
- /**
2516
- * Triggers all watchers
2517
- */
2518
- const triggerWatchers = (ignoreMuted = false) => {
2266
+ const $unwatch = identifier => registry.delete(identifier);
2267
+ let changedByWatch = false;
2268
+ const $RAF = window.requestAnimationFrame;
2269
+ let ngZone;
2270
+ const triggerWatchers = (ignoreMuted) => {
2519
2271
  if (muted && !ignoreMuted) {
2520
2272
  return;
2521
2273
  }
2274
+ log(".......................triggerWatchers.................................");
2275
+ const limit = 5;
2522
2276
  let pass = 1;
2523
2277
  let changeDetected;
2524
2278
  do {
2525
2279
  changeDetected = false;
2526
- registry.forEach((value) => {
2527
- // Handle grouped structure
2528
- if (value && typeof value === 'object' && !value.fn) {
2529
- Object.values(value).forEach((watchInfo) => {
2530
- if (processWatchInfo(watchInfo)) {
2531
- changeDetected = true;
2532
- }
2533
- });
2280
+ registry.forEach(watchInfo => {
2281
+ if (watchInfo.isMuted && watchInfo.isMuted()) {
2282
+ return;
2534
2283
  }
2535
- else {
2536
- // Direct watchInfo
2537
- if (processWatchInfo(value)) {
2538
- changeDetected = true;
2284
+ const fn = watchInfo.fn;
2285
+ const listener = watchInfo.listener;
2286
+ const ov = watchInfo.last;
2287
+ let nv;
2288
+ try {
2289
+ nv = fn();
2290
+ }
2291
+ catch (e) {
2292
+ console.warn(`error in executing expression: '${watchInfo.expr}'`);
2293
+ }
2294
+ if (!_.isEqual(nv, ov)) {
2295
+ changeDetected = true;
2296
+ changedByWatch = true;
2297
+ watchInfo.last = nv;
2298
+ if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2299
+ watchInfo.last = _.clone(nv);
2539
2300
  }
2301
+ listener(nv, ov);
2302
+ resetChangeFromWatch();
2540
2303
  }
2541
2304
  });
2542
2305
  pass++;
2543
- } while (changeDetected && pass < MAX_WATCH_CYCLES);
2544
- if (changeDetected && pass === MAX_WATCH_CYCLES) {
2545
- console.warn(`Watch cycles exceeded limit of ${MAX_WATCH_CYCLES}`);
2306
+ } while (changeDetected && pass < limit);
2307
+ if (changeDetected && pass === limit) {
2308
+ console.warn(`Number of watch cycles gone above set limit of: ${limit} `);
2546
2309
  }
2547
2310
  };
2548
- // Angular zone integration
2549
- const setNgZone = (zone) => {
2550
- ngZone = zone;
2551
- };
2552
- const setAppRef = (ref) => {
2311
+ const setNgZone = zone => ngZone = zone;
2312
+ const setAppRef = ref => {
2553
2313
  appRef = ref;
2554
2314
  };
2555
2315
  const isChangeFromWatch = () => changedByWatch;
2556
- const resetChangeFromWatch = () => {
2557
- changedByWatch = false;
2558
- };
2559
- // Debounced trigger
2560
- const debouncedTriggerWatchers = debounce(() => {
2561
- skipWatchers = true;
2562
- ngZone.run(() => triggerWatchers());
2563
- }, DEBOUNCE_WAIT);
2316
+ const resetChangeFromWatch = () => changedByWatch = false;
2317
+ window.watchRegistry = registry;
2318
+ let scheduled = false, rerunRequested = false, isRunning = false, consecutiveReruns = 0;
2319
+ const MAX_PASSES = 5, DEBOUNCE_TIME = 200, MAX_CONSECUTIVE_RERUNS = 3;
2320
+ window.__WM_DEBUG_WATCHERS__ = false;
2564
2321
  const $invokeWatchers = (force = false, ignoreMuted = false) => {
2565
2322
  if (force) {
2566
2323
  triggerWatchers(ignoreMuted);
2567
2324
  }
2568
2325
  else {
2326
+ scheduleExecution(ignoreMuted);
2327
+ }
2328
+ };
2329
+ function scheduleExecution(ignoreMuted) {
2330
+ if (scheduled) {
2331
+ rerunRequested = true;
2332
+ return;
2333
+ }
2334
+ scheduled = true;
2335
+ // Reset consecutive rerun counter when scheduling from outside
2336
+ // (not from within executeWatchers rerun logic)
2337
+ if (!isRunning) {
2338
+ consecutiveReruns = 0;
2339
+ }
2340
+ debouncedExecute(ignoreMuted);
2341
+ }
2342
+ const debouncedExecute = debounce((ignoreMuted) => {
2343
+ scheduled = false;
2344
+ executeWatchers(ignoreMuted);
2345
+ }, DEBOUNCE_TIME);
2346
+ function executeWatchers(ignoreMuted) {
2347
+ if (isRunning) {
2348
+ rerunRequested = true;
2349
+ return;
2350
+ }
2351
+ isRunning = true;
2352
+ let actuallyChanged = false;
2353
+ ngZone.runOutsideAngular(() => {
2354
+ let pass = 1;
2355
+ let changeDetected;
2356
+ do {
2357
+ changeDetected = false;
2358
+ log(`-------executeWatchers (run #${consecutiveReruns + 1})--------- `);
2359
+ registry.forEach(watchInfo => {
2360
+ if (watchInfo.isMuted && watchInfo.isMuted()) {
2361
+ return;
2362
+ }
2363
+ const fn = watchInfo.fn;
2364
+ const listener = watchInfo.listener;
2365
+ const ov = watchInfo.last;
2366
+ let nv;
2367
+ try {
2368
+ nv = fn();
2369
+ }
2370
+ catch (e) {
2371
+ console.warn(`error in executing expression: '${watchInfo.expr}'`);
2372
+ }
2373
+ if (!_.isEqual(nv, ov)) {
2374
+ changeDetected = true;
2375
+ actuallyChanged = true;
2376
+ changedByWatch = true;
2377
+ watchInfo.last = nv;
2378
+ if (_.isObject(nv) && !watchInfo.doNotClone && nv.__cloneable__ !== false) {
2379
+ watchInfo.last = _.clone(nv);
2380
+ }
2381
+ listener(nv, ov);
2382
+ resetChangeFromWatch();
2383
+ }
2384
+ });
2385
+ pass++;
2386
+ } while (changeDetected && pass < MAX_PASSES);
2387
+ });
2388
+ isRunning = false;
2389
+ // Trigger Angular change detection if watchers actually changed values
2390
+ if (actuallyChanged) {
2391
+ ngZone.run(() => {
2392
+ log(`-------DONE (changes detected)--------- `);
2393
+ });
2394
+ }
2395
+ else {
2396
+ log(`-------DONE (no changes)--------- `);
2397
+ }
2398
+ // 🔥 collapse ALL mid-run triggers into ONE rerun
2399
+ // BUT limit consecutive reruns to prevent infinite loops
2400
+ if (rerunRequested) {
2401
+ rerunRequested = false;
2402
+ if (consecutiveReruns < MAX_CONSECUTIVE_RERUNS) {
2403
+ consecutiveReruns++;
2404
+ log(`[Watcher] Scheduling rerun #${consecutiveReruns} (requested during execution)`);
2405
+ scheduleExecution(ignoreMuted);
2406
+ }
2407
+ else {
2408
+ consecutiveReruns = 0;
2409
+ log(`[Watcher] ⚠️ Stopped infinite loop! Max consecutive reruns (${MAX_CONSECUTIVE_RERUNS}) reached. This usually means watcher listeners are triggering more change detection.`);
2410
+ }
2411
+ }
2412
+ else {
2413
+ // No rerun requested - reset counter
2414
+ consecutiveReruns = 0;
2415
+ }
2416
+ }
2417
+ /*export const $invokeWatchers = (force?: boolean, ignoreMuted?: boolean) => {
2418
+ if (force) {
2419
+ triggerWatchers(ignoreMuted);
2420
+ } else {
2421
+
2569
2422
  if (skipWatchers) {
2570
2423
  skipWatchers = false;
2571
2424
  return;
2572
2425
  }
2573
2426
  debouncedTriggerWatchers();
2574
2427
  }
2575
- };
2428
+ };*/
2576
2429
  const $appDigest = (() => {
2577
2430
  let queued = false;
2578
- const $RAF = window.requestAnimationFrame;
2579
- return (force = false) => {
2431
+ return (force) => {
2580
2432
  if (!appRef) {
2581
2433
  return;
2582
2434
  }
@@ -2588,16 +2440,21 @@
2588
2440
  if (queued) {
2589
2441
  return;
2590
2442
  }
2591
- queued = true;
2592
- $RAF(() => {
2593
- ngZone.run(() => appRef.tick());
2594
- queued = false;
2595
- });
2443
+ else {
2444
+ queued = true;
2445
+ $RAF(() => {
2446
+ ngZone.run(() => appRef.tick());
2447
+ queued = false;
2448
+ });
2449
+ }
2596
2450
  }
2597
2451
  };
2598
2452
  })();
2599
- // Export registry for debugging
2600
- // (window as any).watchRegistry = registry;
2453
+ function log(message) {
2454
+ if (window.__WM_DEBUG_WATCHERS__) {
2455
+ console.log(message);
2456
+ }
2457
+ }
2601
2458
 
2602
2459
  exports.ComponentType = void 0;
2603
2460
  (function (ComponentType) {
@@ -5406,8 +5263,6 @@
5406
5263
  exports.$parseEvent = $parseEvent;
5407
5264
  exports.$parseExpr = $parseExpr;
5408
5265
  exports.$unwatch = $unwatch;
5409
- exports.$unwatchAll = $unwatchAll;
5410
- exports.$unwatchAllByScope = $unwatchAllByScope;
5411
5266
  exports.$watch = $watch;
5412
5267
  exports.AbstractDialogService = AbstractDialogService;
5413
5268
  exports.AbstractHttpService = AbstractHttpService;
@@ -8,7 +8,7 @@ export * from './enums/enums';
8
8
  export * from './utils/event-notifier';
9
9
  export { $parseExpr, $parseEvent, registerFnByExpr, setPipeProvider, getFnByExpr, getFnForBindExpr, getFnForEventExpr } from './utils/expression-parser';
10
10
  export { isDefined, isObject, toBoolean, isIE, isAndroid, isAndroidTablet, isIphone, isIpod, isIpad, isIos, isSafari, isLargeTabletLandscape, isLargeTabletPortrait, isMobile, getAndroidVersion, isKitkatDevice, encodeUrl, encodeUrlParams, initCaps, spaceSeparate, replaceAt, periodSeparate, prettifyLabel, deHyphenate, prettifyLabels, isInsecureContentRequest, stringStartsWith, getEvaluatedExprValue, isImageFile, isAudioFile, isVideoFile, isValidImageUrl, isValidWebURL, getResourceURL, triggerFn, hasOffsetStr, getFormattedDate, getDateObj, addEventListenerOnElement, getClonedObject, getFiles, generateGUId, validateAccessRoles, getValidJSON, xmlToJson, findValueOf, extractType, isNumberType, isEmptyObject, scrollToElement, isElementInViewport, isPageable, replace, isDateTimeType, getValidDateObject, getNativeDateObject, getBlob, isEqualWithFields, loadStyleSheet, loadStyleSheets, loadScript, loadScripts, _WM_APP_PROJECT, setSessionStorageItem, getSessionStorageItem, noop, convertToBlob, AppConstants, openLink, fetchContent, toPromise, retryIfFails, getAbortableDefer, createCSSRule, getUrlParams, getMomentLocaleObject, getRouteNameFromLink, isAppleProduct, defer, executePromiseChain, isDataSourceEqual, validateDataSourceCtx, processFilterExpBindNode, extendProto, removeExtraSlashes, getDisplayDateTimeFormat, addForIdAttributes, adjustContainerPosition, adjustContainerRightEdges, setTranslation3dPosition, getWebkitTraslationMatrix, closePopover, detectChanges, triggerItemAction, getDatasourceFromExpr, extractCurrentItemExpr, findRootContainer, VALIDATOR, transformFileURI, appendScriptToHead, getAppSetting, setListClass, findParent, getNavClass, getSheetPositionClass } from './utils/utils';
11
- export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, $unwatchAll, $unwatchAllByScope, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
11
+ export { FIRST_TIME_WATCH, isFirstTimeChange, debounce, muteWatchers, unMuteWatchers, $watch, $unwatch, setNgZone, setAppRef, isChangeFromWatch, resetChangeFromWatch, $invokeWatchers, $appDigest } from './utils/watcher';
12
12
  export * from './utils/id-generator';
13
13
  export * from './types/types';
14
14
  export { Viewport } from './services/viewport.service';
@@ -23,4 +23,4 @@ export { StatePersistence } from './services/state-persistence.service';
23
23
  export { PaginationService } from './services/pagination.service';
24
24
  export * from './utils/wm-project-properties';
25
25
  export * from './utils/lru-cache';
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLFNBQVMsRUFDVCxTQUFTLEVBQ1QsaUJBQWlCLEVBQ2pCLG9CQUFvQixFQUNwQixlQUFlLEVBQ2YsVUFBVSxFQUNiLE1BQU0saUJBQWlCLENBQUM7QUFDekIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLGVBQWUsQ0FBQztBQUM5QixPQUFPLEVBQUUsUUFBUSxFQUFpQixNQUFNLDZCQUE2QixDQUFDO0FBQ3RFLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsaUNBQWlDLENBQUM7QUFDaEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDZDQUE2QyxDQUFDO0FBQzVELGNBQWMsd0NBQXdDLENBQUM7QUFDdkQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7QUFDeEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDbEUsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLG1CQUFtQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBjb3JlXG4gKi9cbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvYnVpbGQtdXRpbHMnO1xuZXhwb3J0ICogZnJvbSAnLi9jb25zdGFudHMvY3VycmVuY3ktY29uc3RhbnRzJztcbmV4cG9ydCB7XG4gICAgYXBwZW5kTm9kZSxcbiAgICBpbnNlcnRCZWZvcmUsXG4gICAgaW5zZXJ0QWZ0ZXIsXG4gICAgcmVtb3ZlTm9kZSxcbiAgICByZW1vdmVDbGFzcyxcbiAgICBhZGRDbGFzcyxcbiAgICBzd2l0Y2hDbGFzcyxcbiAgICB0b2dnbGVDbGFzcyxcbiAgICBzZXRDU1MsXG4gICAgc2V0Q1NTRnJvbU9iaixcbiAgICBzZXRQcm9wZXJ0eSxcbiAgICBzZXRBdHRyLFxuICAgIHNldEh0bWwsXG4gICAgcmVtb3ZlQXR0cixcbiAgICBjcmVhdGVFbGVtZW50LFxuICAgIHRvRGltZW5zaW9uXG59IGZyb20gJy4vdXRpbHMvZG9tJztcbmV4cG9ydCAqIGZyb20gJy4vZW51bXMvZW51bXMnO1xuZXhwb3J0ICogZnJvbSAnLi91dGlscy9ldmVudC1ub3RpZmllcic7XG5leHBvcnQge1xuICAgIFBhcnNlRXhwclJlc3VsdCxcbiAgICAkcGFyc2VFeHByLFxuICAgICRwYXJzZUV2ZW50LFxuICAgIHJlZ2lzdGVyRm5CeUV4cHIsXG4gICAgc2V0UGlwZVByb3ZpZGVyLFxuICAgIGdldEZuQnlFeHByLFxuICAgIGdldEZuRm9yQmluZEV4cHIsXG4gICAgZ2V0Rm5Gb3JFdmVudEV4cHJcbn0gZnJvbSAnLi91dGlscy9leHByZXNzaW9uLXBhcnNlcic7XG5leHBvcnQge1xuICAgIEVWRU5UX0xJRkUsXG4gICAgaXNEZWZpbmVkLFxuICAgIGlzT2JqZWN0LFxuICAgIHRvQm9vbGVhbixcbiAgICBpc0lFLFxuICAgIGlzQW5kcm9pZCxcbiAgICBpc0FuZHJvaWRUYWJsZXQsXG4gICAgaXNJcGhvbmUsXG4gICAgaXNJcG9kLFxuICAgIGlzSXBhZCxcbiAgICBpc0lvcyxcbiAgICBpc1NhZmFyaSxcbiAgICBpc0xhcmdlVGFibGV0TGFuZHNjYXBlLFxuICAgIGlzTGFyZ2VUYWJsZXRQb3J0cmFpdCxcbiAgICBpc01vYmlsZSxcbiAgICBnZXRBbmRyb2lkVmVyc2lvbixcbiAgICBpc0tpdGthdERldmljZSxcbiAgICBlbmNvZGVVcmwsXG4gICAgZW5jb2RlVXJsUGFyYW1zLFxuICAgIGluaXRDYXBzLFxuICAgIHNwYWNlU2VwYXJhdGUsXG4gICAgcmVwbGFjZUF0LFxuICAgIHBlcmlvZFNlcGFyYXRlLFxuICAgIHByZXR0aWZ5TGFiZWwsXG4gICAgZGVIeXBoZW5hdGUsXG4gICAgcHJldHRpZnlMYWJlbHMsXG4gICAgaXNJbnNlY3VyZUNvbnRlbnRSZXF1ZXN0LFxuICAgIHN0cmluZ1N0YXJ0c1dpdGgsXG4gICAgZ2V0RXZhbHVhdGVkRXhwclZhbHVlLFxuICAgIGlzSW1hZ2VGaWxlLFxuICAgIGlzQXVkaW9GaWxlLFxuICAgIGlzVmlkZW9GaWxlLFxuICAgIGlzVmFsaWRJbWFnZVVybCxcbiAgICBpc1ZhbGlkV2ViVVJMLFxuICAgIGdldFJlc291cmNlVVJMLFxuICAgIHRyaWdnZXJGbixcbiAgICBoYXNPZmZzZXRTdHIsXG4gICAgZ2V0Rm9ybWF0dGVkRGF0ZSxcbiAgICBnZXREYXRlT2JqLFxuICAgIGFkZEV2ZW50TGlzdGVuZXJPbkVsZW1lbnQsXG4gICAgZ2V0Q2xvbmVkT2JqZWN0LFxuICAgIGdldEZpbGVzLFxuICAgIGdlbmVyYXRlR1VJZCxcbiAgICB2YWxpZGF0ZUFjY2Vzc1JvbGVzLFxuICAgIGdldFZhbGlkSlNPTixcbiAgICB4bWxUb0pzb24sXG4gICAgZmluZFZhbHVlT2YsXG4gICAgZXh0cmFjdFR5cGUsXG4gICAgaXNOdW1iZXJUeXBlLFxuICAgIGlzRW1wdHlPYmplY3QsXG4gICAgc2Nyb2xsVG9FbGVtZW50LFxuICAgIGlzRWxlbWVudEluVmlld3BvcnQsXG4gICAgaXNQYWdlYWJsZSxcbiAgICByZXBsYWNlLFxuICAgIGlzRGF0ZVRpbWVUeXBlLFxuICAgIGdldFZhbGlkRGF0ZU9iamVjdCxcbiAgICBnZXROYXRpdmVEYXRlT2JqZWN0LFxuICAgIGdldEJsb2IsXG4gICAgaXNFcXVhbFdpdGhGaWVsZHMsXG4gICAgbG9hZFN0eWxlU2hlZXQsXG4gICAgbG9hZFN0eWxlU2hlZXRzLFxuICAgIGxvYWRTY3JpcHQsXG4gICAgbG9hZFNjcmlwdHMsXG4gICAgX1dNX0FQUF9QUk9KRUNULFxuICAgIHNldFNlc3Npb25TdG9yYWdlSXRlbSxcbiAgICBnZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgbm9vcCxcbiAgICBjb252ZXJ0VG9CbG9iLFxuICAgIEFwcENvbnN0YW50cyxcbiAgICBvcGVuTGluayxcbiAgICBmZXRjaENvbnRlbnQsXG4gICAgdG9Qcm9taXNlLFxuICAgIHJldHJ5SWZGYWlscyxcbiAgICBnZXRBYm9ydGFibGVEZWZlcixcbiAgICBjcmVhdGVDU1NSdWxlLFxuICAgIGdldFVybFBhcmFtcyxcbiAgICBnZXRNb21lbnRMb2NhbGVPYmplY3QsXG4gICAgZ2V0Um91dGVOYW1lRnJvbUxpbmssXG4gICAgaXNBcHBsZVByb2R1Y3QsXG4gICAgZGVmZXIsXG4gICAgZXhlY3V0ZVByb21pc2VDaGFpbixcbiAgICBpc0RhdGFTb3VyY2VFcXVhbCxcbiAgICB2YWxpZGF0ZURhdGFTb3VyY2VDdHgsXG4gICAgcHJvY2Vzc0ZpbHRlckV4cEJpbmROb2RlLFxuICAgIGV4dGVuZFByb3RvLFxuICAgIHJlbW92ZUV4dHJhU2xhc2hlcyxcbiAgICBnZXREaXNwbGF5RGF0ZVRpbWVGb3JtYXQsXG4gICAgYWRkRm9ySWRBdHRyaWJ1dGVzLFxuICAgIGFkanVzdENvbnRhaW5lclBvc2l0aW9uLFxuICAgIGFkanVzdENvbnRhaW5lclJpZ2h0RWRnZXMsXG4gICAgc2V0VHJhbnNsYXRpb24zZFBvc2l0aW9uLFxuICAgIGdldFdlYmtpdFRyYXNsYXRpb25NYXRyaXgsXG4gICAgY2xvc2VQb3BvdmVyLFxuICAgIGRldGVjdENoYW5nZXMsXG4gICAgdHJpZ2dlckl0ZW1BY3Rpb24sXG4gICAgZ2V0RGF0YXNvdXJjZUZyb21FeHByLFxuICAgIGV4dHJhY3RDdXJyZW50SXRlbUV4cHIsXG4gICAgZmluZFJvb3RDb250YWluZXIsXG4gICAgVkFMSURBVE9SLFxuICAgIHRyYW5zZm9ybUZpbGVVUkksXG4gICAgYXBwZW5kU2NyaXB0VG9IZWFkLFxuICAgIGdldEFwcFNldHRpbmcsXG4gICAgc2V0TGlzdENsYXNzLFxuICAgIGZpbmRQYXJlbnQsXG4gICAgZ2V0TmF2Q2xhc3MsXG4gICAgZ2V0U2hlZXRQb3NpdGlvbkNsYXNzXG59IGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuZXhwb3J0IHtcbiAgICBGSVJTVF9USU1FX1dBVENILFxuICAgIGlzRmlyc3RUaW1lQ2hhbmdlLFxuICAgIGRlYm91bmNlLFxuICAgIG11dGVXYXRjaGVycyxcbiAgICB1bk11dGVXYXRjaGVycyxcbiAgICAkd2F0Y2gsXG4gICAgJHVud2F0Y2gsXG4gICAgJHVud2F0Y2hBbGwsXG4gICAgJHVud2F0Y2hBbGxCeVNjb3BlLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljX2FwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL3B1YmxpY19hcGkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFDSCxjQUFjLHFCQUFxQixDQUFDO0FBQ3BDLGNBQWMsZ0NBQWdDLENBQUM7QUFDL0MsT0FBTyxFQUNILFVBQVUsRUFDVixZQUFZLEVBQ1osV0FBVyxFQUNYLFVBQVUsRUFDVixXQUFXLEVBQ1gsUUFBUSxFQUNSLFdBQVcsRUFDWCxXQUFXLEVBQ1gsTUFBTSxFQUNOLGFBQWEsRUFDYixXQUFXLEVBQ1gsT0FBTyxFQUNQLE9BQU8sRUFDUCxVQUFVLEVBQ1YsYUFBYSxFQUNiLFdBQVcsRUFDZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixjQUFjLGVBQWUsQ0FBQztBQUM5QixjQUFjLHdCQUF3QixDQUFDO0FBQ3ZDLE9BQU8sRUFFSCxVQUFVLEVBQ1YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixlQUFlLEVBQ2YsV0FBVyxFQUNYLGdCQUFnQixFQUNoQixpQkFBaUIsRUFDcEIsTUFBTSwyQkFBMkIsQ0FBQztBQUNuQyxPQUFPLEVBRUgsU0FBUyxFQUNULFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxFQUNKLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLE1BQU0sRUFDTixNQUFNLEVBQ04sS0FBSyxFQUNMLFFBQVEsRUFDUixzQkFBc0IsRUFDdEIscUJBQXFCLEVBQ3JCLFFBQVEsRUFDUixpQkFBaUIsRUFDakIsY0FBYyxFQUNkLFNBQVMsRUFDVCxlQUFlLEVBQ2YsUUFBUSxFQUNSLGFBQWEsRUFDYixTQUFTLEVBQ1QsY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBQ1gsY0FBYyxFQUNkLHdCQUF3QixFQUN4QixnQkFBZ0IsRUFDaEIscUJBQXFCLEVBQ3JCLFdBQVcsRUFDWCxXQUFXLEVBQ1gsV0FBVyxFQUNYLGVBQWUsRUFDZixhQUFhLEVBQ2IsY0FBYyxFQUNkLFNBQVMsRUFDVCxZQUFZLEVBQ1osZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVix5QkFBeUIsRUFDekIsZUFBZSxFQUNmLFFBQVEsRUFDUixZQUFZLEVBQ1osbUJBQW1CLEVBQ25CLFlBQVksRUFDWixTQUFTLEVBQ1QsV0FBVyxFQUNYLFdBQVcsRUFDWCxZQUFZLEVBQ1osYUFBYSxFQUNiLGVBQWUsRUFDZixtQkFBbUIsRUFDbkIsVUFBVSxFQUNWLE9BQU8sRUFDUCxjQUFjLEVBQ2Qsa0JBQWtCLEVBQ2xCLG1CQUFtQixFQUNuQixPQUFPLEVBQ1AsaUJBQWlCLEVBQ2pCLGNBQWMsRUFDZCxlQUFlLEVBQ2YsVUFBVSxFQUNWLFdBQVcsRUFDWCxlQUFlLEVBQ2YscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixJQUFJLEVBQ0osYUFBYSxFQUNiLFlBQVksRUFDWixRQUFRLEVBQ1IsWUFBWSxFQUNaLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2pCLGFBQWEsRUFDYixZQUFZLEVBQ1oscUJBQXFCLEVBQ3JCLG9CQUFvQixFQUNwQixjQUFjLEVBQ2QsS0FBSyxFQUNMLG1CQUFtQixFQUNuQixpQkFBaUIsRUFDakIscUJBQXFCLEVBQ3JCLHdCQUF3QixFQUN4QixXQUFXLEVBQ1gsa0JBQWtCLEVBQ2xCLHdCQUF3QixFQUN4QixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHlCQUF5QixFQUN6Qix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLFlBQVksRUFDWixhQUFhLEVBQ2IsaUJBQWlCLEVBQ2pCLHFCQUFxQixFQUNyQixzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxnQkFBZ0IsRUFDaEIsa0JBQWtCLEVBQ2xCLGFBQWEsRUFDYixZQUFZLEVBQ1osVUFBVSxFQUNWLFdBQVcsRUFDWCxxQkFBcUIsRUFDeEIsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUNILGdCQUFnQixFQUNoQixpQkFBaUIsRUFDakIsUUFBUSxFQUNSLFlBQVksRUFDWixjQUFjLEVBQ2QsTUFBTSxFQUNOLFFBQVEsRUFDUixTQUFTLEVBQ1QsU0FBUyxFQUNULGlCQUFpQixFQUNqQixvQkFBb0IsRUFDcEIsZUFBZSxFQUNmLFVBQVUsRUFDYixNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYyxlQUFlLENBQUM7QUFDOUIsT0FBTyxFQUFFLFFBQVEsRUFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUN0RSxjQUFjLDZCQUE2QixDQUFDO0FBQzVDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYywrQkFBK0IsQ0FBQztBQUM5QyxjQUFjLGlDQUFpQyxDQUFDO0FBQ2hELGNBQWMsa0NBQWtDLENBQUM7QUFDakQsY0FBYyw2Q0FBNkMsQ0FBQztBQUM1RCxjQUFjLHdDQUF3QyxDQUFDO0FBQ3ZELE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNDQUFzQyxDQUFDO0FBQ3hFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2xFLGNBQWMsK0JBQStCLENBQUM7QUFDOUMsY0FBYyxtQkFBbUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgY29yZVxuICovXG5leHBvcnQgKiBmcm9tICcuL3V0aWxzL2J1aWxkLXV0aWxzJztcbmV4cG9ydCAqIGZyb20gJy4vY29uc3RhbnRzL2N1cnJlbmN5LWNvbnN0YW50cyc7XG5leHBvcnQge1xuICAgIGFwcGVuZE5vZGUsXG4gICAgaW5zZXJ0QmVmb3JlLFxuICAgIGluc2VydEFmdGVyLFxuICAgIHJlbW92ZU5vZGUsXG4gICAgcmVtb3ZlQ2xhc3MsXG4gICAgYWRkQ2xhc3MsXG4gICAgc3dpdGNoQ2xhc3MsXG4gICAgdG9nZ2xlQ2xhc3MsXG4gICAgc2V0Q1NTLFxuICAgIHNldENTU0Zyb21PYmosXG4gICAgc2V0UHJvcGVydHksXG4gICAgc2V0QXR0cixcbiAgICBzZXRIdG1sLFxuICAgIHJlbW92ZUF0dHIsXG4gICAgY3JlYXRlRWxlbWVudCxcbiAgICB0b0RpbWVuc2lvblxufSBmcm9tICcuL3V0aWxzL2RvbSc7XG5leHBvcnQgKiBmcm9tICcuL2VudW1zL2VudW1zJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvZXZlbnQtbm90aWZpZXInO1xuZXhwb3J0IHtcbiAgICBQYXJzZUV4cHJSZXN1bHQsXG4gICAgJHBhcnNlRXhwcixcbiAgICAkcGFyc2VFdmVudCxcbiAgICByZWdpc3RlckZuQnlFeHByLFxuICAgIHNldFBpcGVQcm92aWRlcixcbiAgICBnZXRGbkJ5RXhwcixcbiAgICBnZXRGbkZvckJpbmRFeHByLFxuICAgIGdldEZuRm9yRXZlbnRFeHByXG59IGZyb20gJy4vdXRpbHMvZXhwcmVzc2lvbi1wYXJzZXInO1xuZXhwb3J0IHtcbiAgICBFVkVOVF9MSUZFLFxuICAgIGlzRGVmaW5lZCxcbiAgICBpc09iamVjdCxcbiAgICB0b0Jvb2xlYW4sXG4gICAgaXNJRSxcbiAgICBpc0FuZHJvaWQsXG4gICAgaXNBbmRyb2lkVGFibGV0LFxuICAgIGlzSXBob25lLFxuICAgIGlzSXBvZCxcbiAgICBpc0lwYWQsXG4gICAgaXNJb3MsXG4gICAgaXNTYWZhcmksXG4gICAgaXNMYXJnZVRhYmxldExhbmRzY2FwZSxcbiAgICBpc0xhcmdlVGFibGV0UG9ydHJhaXQsXG4gICAgaXNNb2JpbGUsXG4gICAgZ2V0QW5kcm9pZFZlcnNpb24sXG4gICAgaXNLaXRrYXREZXZpY2UsXG4gICAgZW5jb2RlVXJsLFxuICAgIGVuY29kZVVybFBhcmFtcyxcbiAgICBpbml0Q2FwcyxcbiAgICBzcGFjZVNlcGFyYXRlLFxuICAgIHJlcGxhY2VBdCxcbiAgICBwZXJpb2RTZXBhcmF0ZSxcbiAgICBwcmV0dGlmeUxhYmVsLFxuICAgIGRlSHlwaGVuYXRlLFxuICAgIHByZXR0aWZ5TGFiZWxzLFxuICAgIGlzSW5zZWN1cmVDb250ZW50UmVxdWVzdCxcbiAgICBzdHJpbmdTdGFydHNXaXRoLFxuICAgIGdldEV2YWx1YXRlZEV4cHJWYWx1ZSxcbiAgICBpc0ltYWdlRmlsZSxcbiAgICBpc0F1ZGlvRmlsZSxcbiAgICBpc1ZpZGVvRmlsZSxcbiAgICBpc1ZhbGlkSW1hZ2VVcmwsXG4gICAgaXNWYWxpZFdlYlVSTCxcbiAgICBnZXRSZXNvdXJjZVVSTCxcbiAgICB0cmlnZ2VyRm4sXG4gICAgaGFzT2Zmc2V0U3RyLFxuICAgIGdldEZvcm1hdHRlZERhdGUsXG4gICAgZ2V0RGF0ZU9iaixcbiAgICBhZGRFdmVudExpc3RlbmVyT25FbGVtZW50LFxuICAgIGdldENsb25lZE9iamVjdCxcbiAgICBnZXRGaWxlcyxcbiAgICBnZW5lcmF0ZUdVSWQsXG4gICAgdmFsaWRhdGVBY2Nlc3NSb2xlcyxcbiAgICBnZXRWYWxpZEpTT04sXG4gICAgeG1sVG9Kc29uLFxuICAgIGZpbmRWYWx1ZU9mLFxuICAgIGV4dHJhY3RUeXBlLFxuICAgIGlzTnVtYmVyVHlwZSxcbiAgICBpc0VtcHR5T2JqZWN0LFxuICAgIHNjcm9sbFRvRWxlbWVudCxcbiAgICBpc0VsZW1lbnRJblZpZXdwb3J0LFxuICAgIGlzUGFnZWFibGUsXG4gICAgcmVwbGFjZSxcbiAgICBpc0RhdGVUaW1lVHlwZSxcbiAgICBnZXRWYWxpZERhdGVPYmplY3QsXG4gICAgZ2V0TmF0aXZlRGF0ZU9iamVjdCxcbiAgICBnZXRCbG9iLFxuICAgIGlzRXF1YWxXaXRoRmllbGRzLFxuICAgIGxvYWRTdHlsZVNoZWV0LFxuICAgIGxvYWRTdHlsZVNoZWV0cyxcbiAgICBsb2FkU2NyaXB0LFxuICAgIGxvYWRTY3JpcHRzLFxuICAgIF9XTV9BUFBfUFJPSkVDVCxcbiAgICBzZXRTZXNzaW9uU3RvcmFnZUl0ZW0sXG4gICAgZ2V0U2Vzc2lvblN0b3JhZ2VJdGVtLFxuICAgIG5vb3AsXG4gICAgY29udmVydFRvQmxvYixcbiAgICBBcHBDb25zdGFudHMsXG4gICAgb3BlbkxpbmssXG4gICAgZmV0Y2hDb250ZW50LFxuICAgIHRvUHJvbWlzZSxcbiAgICByZXRyeUlmRmFpbHMsXG4gICAgZ2V0QWJvcnRhYmxlRGVmZXIsXG4gICAgY3JlYXRlQ1NTUnVsZSxcbiAgICBnZXRVcmxQYXJhbXMsXG4gICAgZ2V0TW9tZW50TG9jYWxlT2JqZWN0LFxuICAgIGdldFJvdXRlTmFtZUZyb21MaW5rLFxuICAgIGlzQXBwbGVQcm9kdWN0LFxuICAgIGRlZmVyLFxuICAgIGV4ZWN1dGVQcm9taXNlQ2hhaW4sXG4gICAgaXNEYXRhU291cmNlRXF1YWwsXG4gICAgdmFsaWRhdGVEYXRhU291cmNlQ3R4LFxuICAgIHByb2Nlc3NGaWx0ZXJFeHBCaW5kTm9kZSxcbiAgICBleHRlbmRQcm90byxcbiAgICByZW1vdmVFeHRyYVNsYXNoZXMsXG4gICAgZ2V0RGlzcGxheURhdGVUaW1lRm9ybWF0LFxuICAgIGFkZEZvcklkQXR0cmlidXRlcyxcbiAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbixcbiAgICBhZGp1c3RDb250YWluZXJSaWdodEVkZ2VzLFxuICAgIHNldFRyYW5zbGF0aW9uM2RQb3NpdGlvbixcbiAgICBnZXRXZWJraXRUcmFzbGF0aW9uTWF0cml4LFxuICAgIGNsb3NlUG9wb3ZlcixcbiAgICBkZXRlY3RDaGFuZ2VzLFxuICAgIHRyaWdnZXJJdGVtQWN0aW9uLFxuICAgIGdldERhdGFzb3VyY2VGcm9tRXhwcixcbiAgICBleHRyYWN0Q3VycmVudEl0ZW1FeHByLFxuICAgIGZpbmRSb290Q29udGFpbmVyLFxuICAgIFZBTElEQVRPUixcbiAgICB0cmFuc2Zvcm1GaWxlVVJJLFxuICAgIGFwcGVuZFNjcmlwdFRvSGVhZCxcbiAgICBnZXRBcHBTZXR0aW5nLFxuICAgIHNldExpc3RDbGFzcyxcbiAgICBmaW5kUGFyZW50LFxuICAgIGdldE5hdkNsYXNzLFxuICAgIGdldFNoZWV0UG9zaXRpb25DbGFzc1xufSBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmV4cG9ydCB7XG4gICAgRklSU1RfVElNRV9XQVRDSCxcbiAgICBpc0ZpcnN0VGltZUNoYW5nZSxcbiAgICBkZWJvdW5jZSxcbiAgICBtdXRlV2F0Y2hlcnMsXG4gICAgdW5NdXRlV2F0Y2hlcnMsXG4gICAgJHdhdGNoLFxuICAgICR1bndhdGNoLFxuICAgIHNldE5nWm9uZSxcbiAgICBzZXRBcHBSZWYsXG4gICAgaXNDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgcmVzZXRDaGFuZ2VGcm9tV2F0Y2gsXG4gICAgJGludm9rZVdhdGNoZXJzLFxuICAgICRhcHBEaWdlc3Rcbn0gZnJvbSAnLi91dGlscy93YXRjaGVyJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvaWQtZ2VuZXJhdG9yJztcbmV4cG9ydCAqIGZyb20gJy4vdHlwZXMvdHlwZXMnO1xuZXhwb3J0IHsgVmlld3BvcnQsIFZpZXdwb3J0RXZlbnQgfSBmcm9tICcuL3NlcnZpY2VzL3ZpZXdwb3J0LnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jb25zdGFudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXRpbHMuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXR5cGUuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2VzL2ZpZWxkLXdpZGdldC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvc2NyaXB0LWxvYWRlci5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc2VydmljZXMvdXNlci1jdXN0b20tcGlwZS1tYW5hZ2VyLnNlcnZpY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlcy9jdXN0b20taWNvbnMtbG9hZGVyLnNlcnZpY2UnO1xuZXhwb3J0IHsgU3RhdGVQZXJzaXN0ZW5jZSB9IGZyb20gJy4vc2VydmljZXMvc3RhdGUtcGVyc2lzdGVuY2Uuc2VydmljZSc7XG5leHBvcnQgeyBQYWdpbmF0aW9uU2VydmljZSB9IGZyb20gJy4vc2VydmljZXMvcGFnaW5hdGlvbi5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvd20tcHJvamVjdC1wcm9wZXJ0aWVzJztcbmV4cG9ydCAqIGZyb20gJy4vdXRpbHMvbHJ1LWNhY2hlJztcbiJdfQ==