@angular/core 17.0.0-next.7 → 17.0.0-rc.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm2022/primitives/signals/index.mjs +15 -0
- package/esm2022/primitives/signals/src/computed.mjs +92 -0
- package/esm2022/primitives/signals/src/equality.mjs +14 -0
- package/esm2022/primitives/signals/src/errors.mjs +18 -0
- package/esm2022/primitives/signals/src/graph.mjs +291 -0
- package/esm2022/primitives/signals/src/signal.mjs +78 -0
- package/esm2022/primitives/signals/src/watch.mjs +82 -0
- package/esm2022/primitives/signals/src/weak_ref.mjs +11 -0
- package/esm2022/rxjs-interop/src/to_signal.mjs +45 -14
- package/esm2022/src/application_init.mjs +50 -2
- package/esm2022/src/application_ref.mjs +8 -2
- package/esm2022/src/application_tokens.mjs +16 -1
- package/esm2022/src/core_private_export.mjs +7 -6
- package/esm2022/src/core_reactivity_export_internal.mjs +6 -2
- package/esm2022/src/core_render3_private_export.mjs +3 -3
- package/esm2022/src/debug/debug_node.mjs +5 -9
- package/esm2022/src/defer/cleanup.mjs +70 -0
- package/esm2022/src/defer/discovery.mjs +47 -0
- package/esm2022/src/defer/dom_triggers.mjs +256 -0
- package/esm2022/src/defer/idle_scheduler.mjs +109 -0
- package/esm2022/src/defer/instructions.mjs +641 -0
- package/esm2022/src/defer/interfaces.mjs +79 -0
- package/esm2022/src/defer/timer_scheduler.mjs +192 -0
- package/esm2022/src/defer/utils.mjs +134 -0
- package/esm2022/src/errors.mjs +1 -1
- package/esm2022/src/hydration/api.mjs +1 -2
- package/esm2022/src/hydration/utils.mjs +2 -2
- package/esm2022/src/image_performance_warning.mjs +154 -0
- package/esm2022/src/linker/compiler.mjs +1 -1
- package/esm2022/src/metadata/directives.mjs +1 -1
- package/esm2022/src/render/api.mjs +1 -1
- package/esm2022/src/render3/after_render_hooks.mjs +35 -1
- package/esm2022/src/render3/assert.mjs +16 -1
- package/esm2022/src/render3/component_ref.mjs +12 -3
- package/esm2022/src/render3/debug/framework_injector_profiler.mjs +33 -4
- package/esm2022/src/render3/debug/injector_profiler.mjs +1 -1
- package/esm2022/src/render3/debug/set_debug_info.mjs +20 -0
- package/esm2022/src/render3/definition.mjs +2 -1
- package/esm2022/src/render3/deps_tracker/api.mjs +1 -1
- package/esm2022/src/render3/deps_tracker/deps_tracker.mjs +13 -2
- package/esm2022/src/render3/features/host_directives_feature.mjs +3 -8
- package/esm2022/src/render3/hooks.mjs +5 -5
- package/esm2022/src/render3/index.mjs +4 -2
- package/esm2022/src/render3/instructions/all.mjs +2 -2
- package/esm2022/src/render3/instructions/change_detection.mjs +31 -14
- package/esm2022/src/render3/instructions/control_flow.mjs +42 -23
- package/esm2022/src/render3/instructions/shared.mjs +5 -4
- package/esm2022/src/render3/interfaces/container.mjs +5 -7
- package/esm2022/src/render3/interfaces/definition.mjs +2 -4
- package/esm2022/src/render3/interfaces/i18n.mjs +1 -4
- package/esm2022/src/render3/interfaces/injector.mjs +1 -4
- package/esm2022/src/render3/interfaces/node.mjs +1 -4
- package/esm2022/src/render3/interfaces/projection.mjs +2 -4
- package/esm2022/src/render3/interfaces/query.mjs +2 -4
- package/esm2022/src/render3/interfaces/renderer.mjs +2 -4
- package/esm2022/src/render3/interfaces/renderer_dom.mjs +2 -4
- package/esm2022/src/render3/interfaces/view.mjs +5 -7
- package/esm2022/src/render3/jit/environment.mjs +3 -1
- package/esm2022/src/render3/list_reconciliation.mjs +58 -34
- package/esm2022/src/render3/node_manipulation.mjs +4 -6
- package/esm2022/src/render3/reactive_lview_consumer.mjs +3 -8
- package/esm2022/src/render3/reactivity/api.mjs +15 -0
- package/esm2022/src/render3/reactivity/asserts.mjs +26 -0
- package/esm2022/src/render3/reactivity/computed.mjs +19 -0
- package/esm2022/src/render3/reactivity/effect.mjs +7 -6
- package/esm2022/src/render3/reactivity/signal.mjs +32 -0
- package/esm2022/src/render3/reactivity/untracked.mjs +24 -0
- package/esm2022/src/render3/util/injector_discovery_utils.mjs +43 -14
- package/esm2022/src/render3/util/stringify_utils.mjs +28 -1
- package/esm2022/src/render3/util/view_utils.mjs +41 -25
- package/esm2022/src/render3/view_ref.mjs +3 -2
- package/esm2022/src/util/stringify.mjs +16 -1
- package/esm2022/src/version.mjs +1 -1
- package/esm2022/testing/src/logger.mjs +3 -3
- package/fesm2022/core.mjs +2881 -2270
- package/fesm2022/core.mjs.map +1 -1
- package/fesm2022/primitives/signals.mjs +539 -0
- package/fesm2022/primitives/signals.mjs.map +1 -0
- package/fesm2022/rxjs-interop.mjs +45 -14
- package/fesm2022/rxjs-interop.mjs.map +1 -1
- package/fesm2022/testing.mjs +1 -1
- package/index.d.ts +204 -168
- package/package.json +7 -1
- package/primitives/signals/index.d.ts +281 -0
- package/rxjs-interop/index.d.ts +15 -101
- package/schematics/collection.json +12 -2
- package/schematics/migrations/block-template-entities/bundle.js +551 -197
- package/schematics/migrations/block-template-entities/bundle.js.map +4 -4
- package/schematics/migrations/compiler-options/bundle.js +582 -0
- package/schematics/migrations/compiler-options/bundle.js.map +7 -0
- package/schematics/migrations/transfer-state/bundle.js +592 -0
- package/schematics/migrations/transfer-state/bundle.js.map +7 -0
- package/schematics/migrations.json +10 -0
- package/schematics/ng-generate/control-flow-migration/bundle.js +24309 -0
- package/schematics/ng-generate/control-flow-migration/bundle.js.map +7 -0
- package/schematics/ng-generate/control-flow-migration/schema.json +7 -0
- package/schematics/ng-generate/standalone-migration/bundle.js +1496 -924
- package/schematics/ng-generate/standalone-migration/bundle.js.map +4 -4
- package/testing/index.d.ts +1 -1
- package/esm2022/src/render3/instructions/defer.mjs +0 -1091
- package/esm2022/src/render3/instructions/defer_events.mjs +0 -164
- package/esm2022/src/render3/interfaces/defer.mjs +0 -72
- package/esm2022/src/signals/index.mjs +0 -16
- package/esm2022/src/signals/src/api.mjs +0 -39
- package/esm2022/src/signals/src/computed.mjs +0 -95
- package/esm2022/src/signals/src/errors.mjs +0 -18
- package/esm2022/src/signals/src/graph.mjs +0 -280
- package/esm2022/src/signals/src/signal.mjs +0 -92
- package/esm2022/src/signals/src/untracked.mjs +0 -26
- package/esm2022/src/signals/src/watch.mjs +0 -81
- package/esm2022/src/signals/src/weak_ref.mjs +0 -11
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* Describes the state of defer block dependency loading.
|
|
10
|
+
*/
|
|
11
|
+
export var DeferDependenciesLoadingState;
|
|
12
|
+
(function (DeferDependenciesLoadingState) {
|
|
13
|
+
/** Initial state, dependency loading is not yet triggered */
|
|
14
|
+
DeferDependenciesLoadingState[DeferDependenciesLoadingState["NOT_STARTED"] = 0] = "NOT_STARTED";
|
|
15
|
+
/** Dependency loading is in progress */
|
|
16
|
+
DeferDependenciesLoadingState[DeferDependenciesLoadingState["IN_PROGRESS"] = 1] = "IN_PROGRESS";
|
|
17
|
+
/** Dependency loading has completed successfully */
|
|
18
|
+
DeferDependenciesLoadingState[DeferDependenciesLoadingState["COMPLETE"] = 2] = "COMPLETE";
|
|
19
|
+
/** Dependency loading has failed */
|
|
20
|
+
DeferDependenciesLoadingState[DeferDependenciesLoadingState["FAILED"] = 3] = "FAILED";
|
|
21
|
+
})(DeferDependenciesLoadingState || (DeferDependenciesLoadingState = {}));
|
|
22
|
+
/** Slot index where `minimum` parameter value is stored. */
|
|
23
|
+
export const MINIMUM_SLOT = 0;
|
|
24
|
+
/** Slot index where `after` parameter value is stored. */
|
|
25
|
+
export const LOADING_AFTER_SLOT = 1;
|
|
26
|
+
/**
|
|
27
|
+
* Describes the current state of this defer block instance.
|
|
28
|
+
*
|
|
29
|
+
* @publicApi
|
|
30
|
+
* @developerPreview
|
|
31
|
+
*/
|
|
32
|
+
export var DeferBlockState;
|
|
33
|
+
(function (DeferBlockState) {
|
|
34
|
+
/** The placeholder block content is rendered */
|
|
35
|
+
DeferBlockState[DeferBlockState["Placeholder"] = 0] = "Placeholder";
|
|
36
|
+
/** The loading block content is rendered */
|
|
37
|
+
DeferBlockState[DeferBlockState["Loading"] = 1] = "Loading";
|
|
38
|
+
/** The main content block content is rendered */
|
|
39
|
+
DeferBlockState[DeferBlockState["Complete"] = 2] = "Complete";
|
|
40
|
+
/** The error block content is rendered */
|
|
41
|
+
DeferBlockState[DeferBlockState["Error"] = 3] = "Error";
|
|
42
|
+
})(DeferBlockState || (DeferBlockState = {}));
|
|
43
|
+
/**
|
|
44
|
+
* Describes the initial state of this defer block instance.
|
|
45
|
+
*
|
|
46
|
+
* Note: this state is internal only and *must* be represented
|
|
47
|
+
* with a number lower than any value in the `DeferBlockState` enum.
|
|
48
|
+
*/
|
|
49
|
+
export var DeferBlockInternalState;
|
|
50
|
+
(function (DeferBlockInternalState) {
|
|
51
|
+
/** Initial state. Nothing is rendered yet. */
|
|
52
|
+
DeferBlockInternalState[DeferBlockInternalState["Initial"] = -1] = "Initial";
|
|
53
|
+
})(DeferBlockInternalState || (DeferBlockInternalState = {}));
|
|
54
|
+
export const NEXT_DEFER_BLOCK_STATE = 0;
|
|
55
|
+
// Note: it's *important* to keep the state in this slot, because this slot
|
|
56
|
+
// is used by runtime logic to differentiate between LViews, LContainers and
|
|
57
|
+
// other types (see `isLView` and `isLContainer` functions). In case of defer
|
|
58
|
+
// blocks, this slot would always be a number.
|
|
59
|
+
export const DEFER_BLOCK_STATE = 1;
|
|
60
|
+
export const STATE_IS_FROZEN_UNTIL = 2;
|
|
61
|
+
export const LOADING_AFTER_CLEANUP_FN = 3;
|
|
62
|
+
/**
|
|
63
|
+
* Options for configuring defer blocks behavior.
|
|
64
|
+
* @publicApi
|
|
65
|
+
* @developerPreview
|
|
66
|
+
*/
|
|
67
|
+
export var DeferBlockBehavior;
|
|
68
|
+
(function (DeferBlockBehavior) {
|
|
69
|
+
/**
|
|
70
|
+
* Manual triggering mode for defer blocks. Provides control over when defer blocks render
|
|
71
|
+
* and which state they render. This is the default behavior in test environments.
|
|
72
|
+
*/
|
|
73
|
+
DeferBlockBehavior[DeferBlockBehavior["Manual"] = 0] = "Manual";
|
|
74
|
+
/**
|
|
75
|
+
* Playthrough mode for defer blocks. This mode behaves like defer blocks would in a browser.
|
|
76
|
+
*/
|
|
77
|
+
DeferBlockBehavior[DeferBlockBehavior["Playthrough"] = 1] = "Playthrough";
|
|
78
|
+
})(DeferBlockBehavior || (DeferBlockBehavior = {}));
|
|
79
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZXJmYWNlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2NvcmUvc3JjL2RlZmVyL2ludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBc0JIOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksNkJBWVg7QUFaRCxXQUFZLDZCQUE2QjtJQUN2Qyw2REFBNkQ7SUFDN0QsK0ZBQVcsQ0FBQTtJQUVYLHdDQUF3QztJQUN4QywrRkFBVyxDQUFBO0lBRVgsb0RBQW9EO0lBQ3BELHlGQUFRLENBQUE7SUFFUixvQ0FBb0M7SUFDcEMscUZBQU0sQ0FBQTtBQUNSLENBQUMsRUFaVyw2QkFBNkIsS0FBN0IsNkJBQTZCLFFBWXhDO0FBRUQsNERBQTREO0FBQzVELE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUM7QUFFOUIsMERBQTBEO0FBQzFELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHLENBQUMsQ0FBQztBQTZEcEM7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQU4sSUFBWSxlQVlYO0FBWkQsV0FBWSxlQUFlO0lBQ3pCLGdEQUFnRDtJQUNoRCxtRUFBZSxDQUFBO0lBRWYsNENBQTRDO0lBQzVDLDJEQUFXLENBQUE7SUFFWCxpREFBaUQ7SUFDakQsNkRBQVksQ0FBQTtJQUVaLDBDQUEwQztJQUMxQyx1REFBUyxDQUFBO0FBQ1gsQ0FBQyxFQVpXLGVBQWUsS0FBZixlQUFlLFFBWTFCO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLENBQU4sSUFBWSx1QkFHWDtBQUhELFdBQVksdUJBQXVCO0lBQ2pDLDhDQUE4QztJQUM5Qyw0RUFBWSxDQUFBO0FBQ2QsQ0FBQyxFQUhXLHVCQUF1QixLQUF2Qix1QkFBdUIsUUFHbEM7QUFFRCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFDeEMsMkVBQTJFO0FBQzNFLDRFQUE0RTtBQUM1RSw2RUFBNkU7QUFDN0UsOENBQThDO0FBQzlDLE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFHLENBQUMsQ0FBQztBQUNuQyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLENBQUM7QUFDdkMsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxDQUFDO0FBeUMxQzs7OztHQUlHO0FBQ0gsTUFBTSxDQUFOLElBQVksa0JBV1g7QUFYRCxXQUFZLGtCQUFrQjtJQUM1Qjs7O09BR0c7SUFDSCwrREFBTSxDQUFBO0lBRU47O09BRUc7SUFDSCx5RUFBVyxDQUFBO0FBQ2IsQ0FBQyxFQVhXLGtCQUFrQixLQUFsQixrQkFBa0IsUUFXN0IiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHR5cGUge0RlcGVuZGVuY3lUeXBlfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvZGVmaW5pdGlvbic7XG5cbi8qKlxuICogRGVzY3JpYmVzIHRoZSBzaGFwZSBvZiBhIGZ1bmN0aW9uIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXJcbiAqIHRvIGRvd25sb2FkIGRlcGVuZGVuY2llcyB0aGF0IGNhbiBiZSBkZWZlci1sb2FkZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERlcGVuZGVuY3lSZXNvbHZlckZuID0gKCkgPT4gQXJyYXk8UHJvbWlzZTxEZXBlbmRlbmN5VHlwZT4+O1xuXG4vKipcbiAqIEVudW1lcmF0ZXMgYWxsIGBvbmAgdHJpZ2dlcnMgb2YgYSBkZWZlciBibG9jay5cbiAqL1xuZXhwb3J0IGNvbnN0IGVudW0gRGVmZXJCbG9ja1RyaWdnZXJzIHtcbiAgT25JZGxlLFxuICBPblRpbWVyLFxuICBPbkltbWVkaWF0ZSxcbiAgT25Ib3ZlcixcbiAgT25JbnRlcmFjdGlvbixcbiAgT25WaWV3cG9ydCxcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGRlZmVyIGJsb2NrIGRlcGVuZGVuY3kgbG9hZGluZy5cbiAqL1xuZXhwb3J0IGVudW0gRGVmZXJEZXBlbmRlbmNpZXNMb2FkaW5nU3RhdGUge1xuICAvKiogSW5pdGlhbCBzdGF0ZSwgZGVwZW5kZW5jeSBsb2FkaW5nIGlzIG5vdCB5ZXQgdHJpZ2dlcmVkICovXG4gIE5PVF9TVEFSVEVELFxuXG4gIC8qKiBEZXBlbmRlbmN5IGxvYWRpbmcgaXMgaW4gcHJvZ3Jlc3MgKi9cbiAgSU5fUFJPR1JFU1MsXG5cbiAgLyoqIERlcGVuZGVuY3kgbG9hZGluZyBoYXMgY29tcGxldGVkIHN1Y2Nlc3NmdWxseSAqL1xuICBDT01QTEVURSxcblxuICAvKiogRGVwZW5kZW5jeSBsb2FkaW5nIGhhcyBmYWlsZWQgKi9cbiAgRkFJTEVELFxufVxuXG4vKiogU2xvdCBpbmRleCB3aGVyZSBgbWluaW11bWAgcGFyYW1ldGVyIHZhbHVlIGlzIHN0b3JlZC4gKi9cbmV4cG9ydCBjb25zdCBNSU5JTVVNX1NMT1QgPSAwO1xuXG4vKiogU2xvdCBpbmRleCB3aGVyZSBgYWZ0ZXJgIHBhcmFtZXRlciB2YWx1ZSBpcyBzdG9yZWQuICovXG5leHBvcnQgY29uc3QgTE9BRElOR19BRlRFUl9TTE9UID0gMTtcblxuLyoqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBhIGxvYWRpbmcgYmxvY2sgYXMgaXQgaXMgc3RvcmVkIGluIHRoZSBjb21wb25lbnQgY29uc3RhbnRzLiAqL1xuZXhwb3J0IHR5cGUgRGVmZXJyZWRMb2FkaW5nQmxvY2tDb25maWcgPSBbbWluaW11bVRpbWU6IG51bWJlcnxudWxsLCBhZnRlclRpbWU6IG51bWJlcnxudWxsXTtcblxuLyoqIENvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciBhIHBsYWNlaG9sZGVyIGJsb2NrIGFzIGl0IGlzIHN0b3JlZCBpbiB0aGUgY29tcG9uZW50IGNvbnN0YW50cy4gKi9cbmV4cG9ydCB0eXBlIERlZmVycmVkUGxhY2Vob2xkZXJCbG9ja0NvbmZpZyA9IFttaW5pbXVtVGltZTogbnVtYmVyfG51bGxdO1xuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgZGF0YSBzaGFyZWQgYWNyb3NzIGFsbCBpbnN0YW5jZXMgb2YgYSBkZWZlciBibG9jay5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBURGVmZXJCbG9ja0RldGFpbHMge1xuICAvKipcbiAgICogSW5kZXggaW4gYW4gTFZpZXcgYW5kIFREYXRhIGFycmF5cyB3aGVyZSBhIHRlbXBsYXRlIGZvciB0aGUgcHJpbWFyeSBjb250ZW50XG4gICAqIGNhbiBiZSBmb3VuZC5cbiAgICovXG4gIHByaW1hcnlUbXBsSW5kZXg6IG51bWJlcjtcblxuICAvKipcbiAgICogSW5kZXggaW4gYW4gTFZpZXcgYW5kIFREYXRhIGFycmF5cyB3aGVyZSBhIHRlbXBsYXRlIGZvciB0aGUgbG9hZGluZyBibG9jayBjYW4gYmUgZm91bmQuXG4gICAqL1xuICBsb2FkaW5nVG1wbEluZGV4OiBudW1iZXJ8bnVsbDtcblxuICAvKipcbiAgICogRXh0cmEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIChzdWNoIGFzIGBhZnRlcmAgYW5kIGBtaW5pbXVtYCkgZm9yIHRoZSBsb2FkaW5nIGJsb2NrLlxuICAgKi9cbiAgbG9hZGluZ0Jsb2NrQ29uZmlnOiBEZWZlcnJlZExvYWRpbmdCbG9ja0NvbmZpZ3xudWxsO1xuXG4gIC8qKlxuICAgKiBJbmRleCBpbiBhbiBMVmlldyBhbmQgVERhdGEgYXJyYXlzIHdoZXJlIGEgdGVtcGxhdGUgZm9yIHRoZSBwbGFjZWhvbGRlciBibG9jayBjYW4gYmUgZm91bmQuXG4gICAqL1xuICBwbGFjZWhvbGRlclRtcGxJbmRleDogbnVtYmVyfG51bGw7XG5cbiAgLyoqXG4gICAqIEV4dHJhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyAoc3VjaCBhcyBgYWZ0ZXJgIGFuZCBgbWluaW11bWApIGZvciB0aGUgcGxhY2Vob2xkZXIgYmxvY2suXG4gICAqL1xuICBwbGFjZWhvbGRlckJsb2NrQ29uZmlnOiBEZWZlcnJlZFBsYWNlaG9sZGVyQmxvY2tDb25maWd8bnVsbDtcblxuICAvKipcbiAgICogSW5kZXggaW4gYW4gTFZpZXcgYW5kIFREYXRhIGFycmF5cyB3aGVyZSBhIHRlbXBsYXRlIGZvciB0aGUgZXJyb3IgYmxvY2sgY2FuIGJlIGZvdW5kLlxuICAgKi9cbiAgZXJyb3JUbXBsSW5kZXg6IG51bWJlcnxudWxsO1xuXG4gIC8qKlxuICAgKiBDb21waWxlci1nZW5lcmF0ZWQgZnVuY3Rpb24gdGhhdCBsb2FkcyBhbGwgZGVwZW5kZW5jaWVzIGZvciBhIGRlZmVyIGJsb2NrLlxuICAgKi9cbiAgZGVwZW5kZW5jeVJlc29sdmVyRm46IERlcGVuZGVuY3lSZXNvbHZlckZufG51bGw7XG5cbiAgLyoqXG4gICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxvYWRpbmcgc3RhdGUgb2YgZGVmZXIgYmxvY2sgZGVwZW5kZW5jaWVzLlxuICAgKi9cbiAgbG9hZGluZ1N0YXRlOiBEZWZlckRlcGVuZGVuY2llc0xvYWRpbmdTdGF0ZTtcblxuICAvKipcbiAgICogRGVwZW5kZW5jeSBsb2FkaW5nIFByb21pc2UuIFRoaXMgUHJvbWlzZSBpcyBoZWxwZnVsIGZvciBjYXNlcyB3aGVuIHRoZXJlXG4gICAqIGFyZSBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgYSBkZWZlciBibG9jayAoZS5nLiBpZiBpdCB3YXMgdXNlZCBpbnNpZGUgb2YgYW4gKm5nRm9yKSxcbiAgICogd2hpY2ggYWxsIGF3YWl0IHRoZSBzYW1lIHNldCBvZiBkZXBlbmRlbmNpZXMuXG4gICAqL1xuICBsb2FkaW5nUHJvbWlzZTogUHJvbWlzZTx1bmtub3duPnxudWxsO1xufVxuXG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGlzIGRlZmVyIGJsb2NrIGluc3RhbmNlLlxuICpcbiAqIEBwdWJsaWNBcGlcbiAqIEBkZXZlbG9wZXJQcmV2aWV3XG4gKi9cbmV4cG9ydCBlbnVtIERlZmVyQmxvY2tTdGF0ZSB7XG4gIC8qKiBUaGUgcGxhY2Vob2xkZXIgYmxvY2sgY29udGVudCBpcyByZW5kZXJlZCAqL1xuICBQbGFjZWhvbGRlciA9IDAsXG5cbiAgLyoqIFRoZSBsb2FkaW5nIGJsb2NrIGNvbnRlbnQgaXMgcmVuZGVyZWQgKi9cbiAgTG9hZGluZyA9IDEsXG5cbiAgLyoqIFRoZSBtYWluIGNvbnRlbnQgYmxvY2sgY29udGVudCBpcyByZW5kZXJlZCAqL1xuICBDb21wbGV0ZSA9IDIsXG5cbiAgLyoqIFRoZSBlcnJvciBibG9jayBjb250ZW50IGlzIHJlbmRlcmVkICovXG4gIEVycm9yID0gMyxcbn1cblxuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGluaXRpYWwgc3RhdGUgb2YgdGhpcyBkZWZlciBibG9jayBpbnN0YW5jZS5cbiAqXG4gKiBOb3RlOiB0aGlzIHN0YXRlIGlzIGludGVybmFsIG9ubHkgYW5kICptdXN0KiBiZSByZXByZXNlbnRlZFxuICogd2l0aCBhIG51bWJlciBsb3dlciB0aGFuIGFueSB2YWx1ZSBpbiB0aGUgYERlZmVyQmxvY2tTdGF0ZWAgZW51bS5cbiAqL1xuZXhwb3J0IGVudW0gRGVmZXJCbG9ja0ludGVybmFsU3RhdGUge1xuICAvKiogSW5pdGlhbCBzdGF0ZS4gTm90aGluZyBpcyByZW5kZXJlZCB5ZXQuICovXG4gIEluaXRpYWwgPSAtMSxcbn1cblxuZXhwb3J0IGNvbnN0IE5FWFRfREVGRVJfQkxPQ0tfU1RBVEUgPSAwO1xuLy8gTm90ZTogaXQncyAqaW1wb3J0YW50KiB0byBrZWVwIHRoZSBzdGF0ZSBpbiB0aGlzIHNsb3QsIGJlY2F1c2UgdGhpcyBzbG90XG4vLyBpcyB1c2VkIGJ5IHJ1bnRpbWUgbG9naWMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIExWaWV3cywgTENvbnRhaW5lcnMgYW5kXG4vLyBvdGhlciB0eXBlcyAoc2VlIGBpc0xWaWV3YCBhbmQgYGlzTENvbnRhaW5lcmAgZnVuY3Rpb25zKS4gSW4gY2FzZSBvZiBkZWZlclxuLy8gYmxvY2tzLCB0aGlzIHNsb3Qgd291bGQgYWx3YXlzIGJlIGEgbnVtYmVyLlxuZXhwb3J0IGNvbnN0IERFRkVSX0JMT0NLX1NUQVRFID0gMTtcbmV4cG9ydCBjb25zdCBTVEFURV9JU19GUk9aRU5fVU5USUwgPSAyO1xuZXhwb3J0IGNvbnN0IExPQURJTkdfQUZURVJfQ0xFQU5VUF9GTiA9IDM7XG5cbi8qKlxuICogRGVzY3JpYmVzIGluc3RhbmNlLXNwZWNpZmljIGRlZmVyIGJsb2NrIGRhdGEuXG4gKlxuICogTm90ZTogY3VycmVudGx5IHRoZXJlIGlzIG9ubHkgdGhlIGBzdGF0ZWAgc2xvdCwgYnV0IG1vcmUgc2xvdHNcbiAqIHdvdWxkIGJlIGFkZGVkIGxhdGVyIHRvIGtlZXAgdHJhY2sgb2YgYGFmdGVyYCBhbmQgYG1heGltdW1gIGZlYXR1cmVzXG4gKiAod2hpY2ggd291bGQgcmVxdWlyZSBwZXItaW5zdGFuY2Ugc3RhdGUpLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExEZWZlckJsb2NrRGV0YWlscyBleHRlbmRzIEFycmF5PHVua25vd24+IHtcbiAgLyoqXG4gICAqIEN1cnJlbnRseSByZW5kZXJlZCBibG9jayBzdGF0ZS5cbiAgICovXG4gIFtERUZFUl9CTE9DS19TVEFURV06IERlZmVyQmxvY2tTdGF0ZXxEZWZlckJsb2NrSW50ZXJuYWxTdGF0ZTtcblxuICAvKipcbiAgICogQmxvY2sgc3RhdGUgdGhhdCB3YXMgcmVxdWVzdGVkIHdoZW4gYW5vdGhlciBzdGF0ZSB3YXMgcmVuZGVyZWQuXG4gICAqL1xuICBbTkVYVF9ERUZFUl9CTE9DS19TVEFURV06IERlZmVyQmxvY2tTdGF0ZXxudWxsO1xuXG4gIC8qKlxuICAgKiBUaW1lc3RhbXAgaW5kaWNhdGluZyB3aGVuIHRoZSBjdXJyZW50IHN0YXRlIGNhbiBiZSBzd2l0Y2hlZCB0b1xuICAgKiB0aGUgbmV4dCBvbmUsIGluIGNhc2UgdGVoIGN1cnJlbnQgc3RhdGUgaGFzIGBtaW5pbXVtYCBwYXJhbWV0ZXIuXG4gICAqL1xuICBbU1RBVEVfSVNfRlJPWkVOX1VOVElMXTogbnVtYmVyfG51bGw7XG5cbiAgLyoqXG4gICAqIENvbnRhaW5zIGEgcmVmZXJlbmNlIHRvIGEgY2xlYW51cCBmdW5jdGlvbiB3aGljaCBjYW5jZWxzIGEgdGltZW91dFxuICAgKiB3aGVuIEFuZ3VsYXIgd2FpdHMgYmVmb3JlIHJlbmRlcmluZyBsb2FkaW5nIHN0YXRlLiBUaGlzIGlzIHVzZWQgd2hlblxuICAgKiB0aGUgbG9hZGluZyBibG9jayBoYXMgdGhlIGBhZnRlcmAgcGFyYW1ldGVyIGNvbmZpZ3VyZWQuXG4gICAqL1xuICBbTE9BRElOR19BRlRFUl9DTEVBTlVQX0ZOXTogVm9pZEZ1bmN0aW9ufG51bGw7XG59XG5cbi8qKlxuICogSW50ZXJuYWwgc3RydWN0dXJlIHVzZWQgZm9yIGNvbmZpZ3VyYXRpb24gb2YgZGVmZXIgYmxvY2sgYmVoYXZpb3IuXG4gKiAqL1xuZXhwb3J0IGludGVyZmFjZSBEZWZlckJsb2NrQ29uZmlnIHtcbiAgYmVoYXZpb3I6IERlZmVyQmxvY2tCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBPcHRpb25zIGZvciBjb25maWd1cmluZyBkZWZlciBibG9ja3MgYmVoYXZpb3IuXG4gKiBAcHVibGljQXBpXG4gKiBAZGV2ZWxvcGVyUHJldmlld1xuICovXG5leHBvcnQgZW51bSBEZWZlckJsb2NrQmVoYXZpb3Ige1xuICAvKipcbiAgICogTWFudWFsIHRyaWdnZXJpbmcgbW9kZSBmb3IgZGVmZXIgYmxvY2tzLiBQcm92aWRlcyBjb250cm9sIG92ZXIgd2hlbiBkZWZlciBibG9ja3MgcmVuZGVyXG4gICAqIGFuZCB3aGljaCBzdGF0ZSB0aGV5IHJlbmRlci4gVGhpcyBpcyB0aGUgZGVmYXVsdCBiZWhhdmlvciBpbiB0ZXN0IGVudmlyb25tZW50cy5cbiAgICovXG4gIE1hbnVhbCxcblxuICAvKipcbiAgICogUGxheXRocm91Z2ggbW9kZSBmb3IgZGVmZXIgYmxvY2tzLiBUaGlzIG1vZGUgYmVoYXZlcyBsaWtlIGRlZmVyIGJsb2NrcyB3b3VsZCBpbiBhIGJyb3dzZXIuXG4gICAqL1xuICBQbGF5dGhyb3VnaCxcbn1cblxuLyoqXG4gKiAqKklOVEVSTkFMKiosIGF2b2lkIHJlZmVyZW5jaW5nIGl0IGluIGFwcGxpY2F0aW9uIGNvZGUuXG4gKlxuICogRGVzY3JpYmVzIGEgaGVscGVyIGNsYXNzIHRoYXQgYWxsb3dzIHRvIGludGVyY2VwdCBhIGNhbGwgdG8gcmV0cmlldmUgY3VycmVudFxuICogZGVwZW5kZW5jeSBsb2FkaW5nIGZ1bmN0aW9uIGFuZCByZXBsYWNlIGl0IHdpdGggYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uXG4gKiBUaGlzIGludGVyY2VwdG9yIGNsYXNzIGlzIG5lZWRlZCB0byBhbGxvdyB0ZXN0aW5nIGJsb2NrcyBpbiBkaWZmZXJlbnQgc3RhdGVzXG4gKiBieSBzaW11bGF0aW5nIGxvYWRpbmcgcmVzcG9uc2UuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGVmZXJCbG9ja0RlcGVuZGVuY3lJbnRlcmNlcHRvciB7XG4gIC8qKlxuICAgKiBJbnZva2VkIGZvciBlYWNoIGRlZmVyIGJsb2NrIHdoZW4gZGVwZW5kZW5jeSBsb2FkaW5nIGZ1bmN0aW9uIGlzIGFjY2Vzc2VkLlxuICAgKi9cbiAgaW50ZXJjZXB0KGRlcGVuZGVuY3lGbjogRGVwZW5kZW5jeVJlc29sdmVyRm58bnVsbCk6IERlcGVuZGVuY3lSZXNvbHZlckZufG51bGw7XG5cbiAgLyoqXG4gICAqIEFsbG93cyB0byBjb25maWd1cmUgYW4gaW50ZXJjZXB0b3IgZnVuY3Rpb24uXG4gICAqL1xuICBzZXRJbnRlcmNlcHRvcihpbnRlcmNlcHRvckZuOiAoY3VycmVudDogRGVwZW5kZW5jeVJlc29sdmVyRm4pID0+IERlcGVuZGVuY3lSZXNvbHZlckZuKTogdm9pZDtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { ɵɵdefineInjectable } from '../di';
|
|
9
|
+
import { INJECTOR } from '../render3/interfaces/view';
|
|
10
|
+
import { arrayInsert2, arraySplice } from '../util/array_utils';
|
|
11
|
+
import { wrapWithLViewCleanup } from './utils';
|
|
12
|
+
/**
|
|
13
|
+
* Returns a function that captures a provided delay.
|
|
14
|
+
* Invoking the returned function schedules a trigger.
|
|
15
|
+
*/
|
|
16
|
+
export function onTimer(delay) {
|
|
17
|
+
return (callback, lView, withLViewCleanup) => scheduleTimerTrigger(delay, callback, lView, withLViewCleanup);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Schedules a callback to be invoked after a given timeout.
|
|
21
|
+
*
|
|
22
|
+
* @param delay A number of ms to wait until firing a callback.
|
|
23
|
+
* @param callback A function to be invoked after a timeout.
|
|
24
|
+
* @param lView LView that hosts an instance of a defer block.
|
|
25
|
+
* @param withLViewCleanup A flag that indicates whether a scheduled callback
|
|
26
|
+
* should be cancelled in case an LView is destroyed before a callback
|
|
27
|
+
* was invoked.
|
|
28
|
+
*/
|
|
29
|
+
export function scheduleTimerTrigger(delay, callback, lView, withLViewCleanup) {
|
|
30
|
+
const injector = lView[INJECTOR];
|
|
31
|
+
const scheduler = injector.get(TimerScheduler);
|
|
32
|
+
const cleanupFn = () => scheduler.remove(callback);
|
|
33
|
+
const wrappedCallback = withLViewCleanup ? wrapWithLViewCleanup(callback, lView, cleanupFn) : callback;
|
|
34
|
+
scheduler.add(delay, wrappedCallback);
|
|
35
|
+
return cleanupFn;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Helper service to schedule `setTimeout`s for batches of defer blocks,
|
|
39
|
+
* to avoid calling `setTimeout` for each defer block (e.g. if defer blocks
|
|
40
|
+
* are created inside a for loop).
|
|
41
|
+
*/
|
|
42
|
+
export class TimerScheduler {
|
|
43
|
+
constructor() {
|
|
44
|
+
// Indicates whether current callbacks are being invoked.
|
|
45
|
+
this.executingCallbacks = false;
|
|
46
|
+
// Currently scheduled `setTimeout` id.
|
|
47
|
+
this.timeoutId = null;
|
|
48
|
+
// When currently scheduled timer would fire.
|
|
49
|
+
this.invokeTimerAt = null;
|
|
50
|
+
// List of callbacks to be invoked.
|
|
51
|
+
// For each callback we also store a timestamp on when the callback
|
|
52
|
+
// should be invoked. We store timestamps and callback functions
|
|
53
|
+
// in a flat array to avoid creating new objects for each entry.
|
|
54
|
+
// [timestamp1, callback1, timestamp2, callback2, ...]
|
|
55
|
+
this.current = [];
|
|
56
|
+
// List of callbacks collected while invoking current set of callbacks.
|
|
57
|
+
// Those callbacks are added to the "current" queue at the end of
|
|
58
|
+
// the current callback invocation. The shape of this list is the same
|
|
59
|
+
// as the shape of the `current` list.
|
|
60
|
+
this.deferred = [];
|
|
61
|
+
}
|
|
62
|
+
add(delay, callback) {
|
|
63
|
+
const target = this.executingCallbacks ? this.deferred : this.current;
|
|
64
|
+
this.addToQueue(target, Date.now() + delay, callback);
|
|
65
|
+
this.scheduleTimer();
|
|
66
|
+
}
|
|
67
|
+
remove(callback) {
|
|
68
|
+
const callbackIndex = this.removeFromQueue(this.current, callback);
|
|
69
|
+
if (callbackIndex === -1) {
|
|
70
|
+
// Try cleaning up deferred queue only in case
|
|
71
|
+
// we didn't find a callback in the "current" queue.
|
|
72
|
+
this.removeFromQueue(this.deferred, callback);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
addToQueue(target, invokeAt, callback) {
|
|
76
|
+
let insertAtIndex = target.length;
|
|
77
|
+
for (let i = 0; i < target.length; i += 2) {
|
|
78
|
+
const invokeQueuedCallbackAt = target[i];
|
|
79
|
+
if (invokeQueuedCallbackAt > invokeAt) {
|
|
80
|
+
// We've reached a first timer that is scheduled
|
|
81
|
+
// for a later time than what we are trying to insert.
|
|
82
|
+
// This is the location at which we need to insert,
|
|
83
|
+
// no need to iterate further.
|
|
84
|
+
insertAtIndex = i;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
arrayInsert2(target, insertAtIndex, invokeAt, callback);
|
|
89
|
+
}
|
|
90
|
+
removeFromQueue(target, callback) {
|
|
91
|
+
let index = -1;
|
|
92
|
+
for (let i = 0; i < target.length; i += 2) {
|
|
93
|
+
const queuedCallback = target[i + 1];
|
|
94
|
+
if (queuedCallback === callback) {
|
|
95
|
+
index = i;
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
if (index > -1) {
|
|
100
|
+
// Remove 2 elements: a timestamp slot and
|
|
101
|
+
// the following slot with a callback function.
|
|
102
|
+
arraySplice(target, index, 2);
|
|
103
|
+
}
|
|
104
|
+
return index;
|
|
105
|
+
}
|
|
106
|
+
scheduleTimer() {
|
|
107
|
+
const callback = () => {
|
|
108
|
+
clearTimeout(this.timeoutId);
|
|
109
|
+
this.timeoutId = null;
|
|
110
|
+
this.executingCallbacks = true;
|
|
111
|
+
// Invoke callbacks that were scheduled to run
|
|
112
|
+
// before the current time.
|
|
113
|
+
let now = Date.now();
|
|
114
|
+
let lastCallbackIndex = null;
|
|
115
|
+
for (let i = 0; i < this.current.length; i += 2) {
|
|
116
|
+
const invokeAt = this.current[i];
|
|
117
|
+
const callback = this.current[i + 1];
|
|
118
|
+
if (invokeAt <= now) {
|
|
119
|
+
callback();
|
|
120
|
+
// Point at the invoked callback function, which is located
|
|
121
|
+
// after the timestamp.
|
|
122
|
+
lastCallbackIndex = i + 1;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// We've reached a timer that should not be invoked yet.
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
if (lastCallbackIndex !== null) {
|
|
130
|
+
// If last callback index is `null` - no callbacks were invoked,
|
|
131
|
+
// so no cleanup is needed. Otherwise, remove invoked callbacks
|
|
132
|
+
// from the queue.
|
|
133
|
+
arraySplice(this.current, 0, lastCallbackIndex + 1);
|
|
134
|
+
}
|
|
135
|
+
this.executingCallbacks = false;
|
|
136
|
+
// If there are any callbacks added during an invocation
|
|
137
|
+
// of the current ones - move them over to the "current"
|
|
138
|
+
// queue.
|
|
139
|
+
if (this.deferred.length > 0) {
|
|
140
|
+
for (let i = 0; i < this.deferred.length; i += 2) {
|
|
141
|
+
const invokeAt = this.deferred[i];
|
|
142
|
+
const callback = this.deferred[i + 1];
|
|
143
|
+
this.addToQueue(this.current, invokeAt, callback);
|
|
144
|
+
}
|
|
145
|
+
this.deferred.length = 0;
|
|
146
|
+
}
|
|
147
|
+
this.scheduleTimer();
|
|
148
|
+
};
|
|
149
|
+
// Avoid running timer callbacks more than once per
|
|
150
|
+
// average frame duration. This is needed for better
|
|
151
|
+
// batching and to avoid kicking off excessive change
|
|
152
|
+
// detection cycles.
|
|
153
|
+
const FRAME_DURATION_MS = 16; // 1000ms / 60fps
|
|
154
|
+
if (this.current.length > 0) {
|
|
155
|
+
const now = Date.now();
|
|
156
|
+
// First element in the queue points at the timestamp
|
|
157
|
+
// of the first (earliest) event.
|
|
158
|
+
const invokeAt = this.current[0];
|
|
159
|
+
if (!this.timeoutId ||
|
|
160
|
+
// Reschedule a timer in case a queue contains an item with
|
|
161
|
+
// an earlier timestamp and the delta is more than an average
|
|
162
|
+
// frame duration.
|
|
163
|
+
(this.invokeTimerAt && (this.invokeTimerAt - invokeAt > FRAME_DURATION_MS))) {
|
|
164
|
+
if (this.timeoutId !== null) {
|
|
165
|
+
// There was a timeout already, but an earlier event was added
|
|
166
|
+
// into the queue. In this case we drop an old timer and setup
|
|
167
|
+
// a new one with an updated (smaller) timeout.
|
|
168
|
+
clearTimeout(this.timeoutId);
|
|
169
|
+
this.timeoutId = null;
|
|
170
|
+
}
|
|
171
|
+
const timeout = Math.max(invokeAt - now, FRAME_DURATION_MS);
|
|
172
|
+
this.invokeTimerAt = invokeAt;
|
|
173
|
+
this.timeoutId = setTimeout(callback, timeout);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
ngOnDestroy() {
|
|
178
|
+
if (this.timeoutId !== null) {
|
|
179
|
+
clearTimeout(this.timeoutId);
|
|
180
|
+
this.timeoutId = null;
|
|
181
|
+
}
|
|
182
|
+
this.current.length = 0;
|
|
183
|
+
this.deferred.length = 0;
|
|
184
|
+
}
|
|
185
|
+
/** @nocollapse */
|
|
186
|
+
static { this.ɵprov = ɵɵdefineInjectable({
|
|
187
|
+
token: TimerScheduler,
|
|
188
|
+
providedIn: 'root',
|
|
189
|
+
factory: () => new TimerScheduler(),
|
|
190
|
+
}); }
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZXJfc2NoZWR1bGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvZGVmZXIvdGltZXJfc2NoZWR1bGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLE9BQU8sQ0FBQztBQUN6QyxPQUFPLEVBQUMsUUFBUSxFQUFRLE1BQU0sNEJBQTRCLENBQUM7QUFDM0QsT0FBTyxFQUFDLFlBQVksRUFBRSxXQUFXLEVBQUMsTUFBTSxxQkFBcUIsQ0FBQztBQUU5RCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxTQUFTLENBQUM7QUFFN0M7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FBQyxLQUFhO0lBQ25DLE9BQU8sQ0FBQyxRQUFzQixFQUFFLEtBQVksRUFBRSxnQkFBeUIsRUFBRSxFQUFFLENBQ2hFLG9CQUFvQixDQUFDLEtBQUssRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDNUUsQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILE1BQU0sVUFBVSxvQkFBb0IsQ0FDaEMsS0FBYSxFQUFFLFFBQXNCLEVBQUUsS0FBWSxFQUFFLGdCQUF5QjtJQUNoRixNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsUUFBUSxDQUFFLENBQUM7SUFDbEMsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUMvQyxNQUFNLFNBQVMsR0FBRyxHQUFHLEVBQUUsQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ25ELE1BQU0sZUFBZSxHQUNqQixnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDO0lBQ25G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OEQ7b0JBQzlELDhEQUE4RDtvQkFDOUQsK0NBQStDO29CQUMvQyxZQUFZLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDO29CQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztpQkFDdkI7Z0JBQ0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFLGlCQUFpQixDQUFDLENBQUM7Z0JBQzVELElBQUksQ0FBQyxhQUFhLEdBQUcsUUFBUSxDQUFDO2dCQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFzQixDQUFDO2FBQ3JFO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksSUFBSSxDQUFDLFNBQVMsS0FBSyxJQUFJLEVBQUU7WUFDM0IsWUFBWSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztTQUN2QjtRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjthQUNYLFVBQUssR0FBNkIsa0JBQWtCLENBQUM7UUFDMUQsS0FBSyxFQUFFLGNBQWM7UUFDckIsVUFBVSxFQUFFLE1BQU07UUFDbEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLElBQUksY0FBYyxFQUFFO0tBQ3BDLENBQUMsQUFKVSxDQUlUIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7ybXJtWRlZmluZUluamVjdGFibGV9IGZyb20gJy4uL2RpJztcbmltcG9ydCB7SU5KRUNUT1IsIExWaWV3fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge2FycmF5SW5zZXJ0MiwgYXJyYXlTcGxpY2V9IGZyb20gJy4uL3V0aWwvYXJyYXlfdXRpbHMnO1xuXG5pbXBvcnQge3dyYXBXaXRoTFZpZXdDbGVhbnVwfSBmcm9tICcuL3V0aWxzJztcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBjYXB0dXJlcyBhIHByb3ZpZGVkIGRlbGF5LlxuICogSW52b2tpbmcgdGhlIHJldHVybmVkIGZ1bmN0aW9uIHNjaGVkdWxlcyBhIHRyaWdnZXIuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBvblRpbWVyKGRlbGF5OiBudW1iZXIpIHtcbiAgcmV0dXJuIChjYWxsYmFjazogVm9pZEZ1bmN0aW9uLCBsVmlldzogTFZpZXcsIHdpdGhMVmlld0NsZWFudXA6IGJvb2xlYW4pID0+XG4gICAgICAgICAgICAgc2NoZWR1bGVUaW1lclRyaWdnZXIoZGVsYXksIGNhbGxiYWNrLCBsVmlldywgd2l0aExWaWV3Q2xlYW51cCk7XG59XG5cbi8qKlxuICogU2NoZWR1bGVzIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCBhZnRlciBhIGdpdmVuIHRpbWVvdXQuXG4gKlxuICogQHBhcmFtIGRlbGF5IEEgbnVtYmVyIG9mIG1zIHRvIHdhaXQgdW50aWwgZmlyaW5nIGEgY2FsbGJhY2suXG4gKiBAcGFyYW0gY2FsbGJhY2sgQSBmdW5jdGlvbiB0byBiZSBpbnZva2VkIGFmdGVyIGEgdGltZW91dC5cbiAqIEBwYXJhbSBsVmlldyBMVmlldyB0aGF0IGhvc3RzIGFuIGluc3RhbmNlIG9mIGEgZGVmZXIgYmxvY2suXG4gKiBAcGFyYW0gd2l0aExWaWV3Q2xlYW51cCBBIGZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIHNjaGVkdWxlZCBjYWxsYmFja1xuICogICAgICAgICAgIHNob3VsZCBiZSBjYW5jZWxsZWQgaW4gY2FzZSBhbiBMVmlldyBpcyBkZXN0cm95ZWQgYmVmb3JlIGEgY2FsbGJhY2tcbiAqICAgICAgICAgICB3YXMgaW52b2tlZC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNjaGVkdWxlVGltZXJUcmlnZ2VyKFxuICAgIGRlbGF5OiBudW1iZXIsIGNhbGxiYWNrOiBWb2lkRnVuY3Rpb24sIGxWaWV3OiBMVmlldywgd2l0aExWaWV3Q2xlYW51cDogYm9vbGVhbikge1xuICBjb25zdCBpbmplY3RvciA9IGxWaWV3W0lOSkVDVE9SXSE7XG4gIGNvbnN0IHNjaGVkdWxlciA9IGluamVjdG9yLmdldChUaW1lclNjaGVkdWxlcik7XG4gIGNvbnN0IGNsZWFudXBGbiA9ICgpID0+IHNjaGVkdWxlci5yZW1vdmUoY2FsbGJhY2spO1xuICBjb25zdCB3cmFwcGVkQ2FsbGJhY2sgPVxuICAgICAgd2l0aExWaWV3Q2xlYW51cCA/IHdyYXBXaXRoTFZpZXdDbGVhbnVwKGNhbGxiYWNrLCBsVmlldywgY2xlYW51cEZuKSA6IGNhbGxiYWNrO1xuICBzY2hlZHVsZXIuYWRkKGRlbGF5LCB3cmFwcGVkQ2FsbGJhY2spO1xuICByZXR1cm4gY2xlYW51cEZuO1xufVxuXG4vKipcbiAqIEhlbHBlciBzZXJ2aWNlIHRvIHNjaGVkdWxlIGBzZXRUaW1lb3V0YHMgZm9yIGJhdGNoZXMgb2YgZGVmZXIgYmxvY2tzLFxuICogdG8gYXZvaWQgY2FsbGluZyBgc2V0VGltZW91dGAgZm9yIGVhY2ggZGVmZXIgYmxvY2sgKGUuZy4gaWYgZGVmZXIgYmxvY2tzXG4gKiBhcmUgY3JlYXRlZCBpbnNpZGUgYSBmb3IgbG9vcCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBUaW1lclNjaGVkdWxlciB7XG4gIC8vIEluZGljYXRlcyB3aGV0aGVyIGN1cnJlbnQgY2FsbGJhY2tzIGFyZSBiZWluZyBpbnZva2VkLlxuICBleGVjdXRpbmdDYWxsYmFja3MgPSBmYWxzZTtcblxuICAvLyBDdXJyZW50bHkgc2NoZWR1bGVkIGBzZXRUaW1lb3V0YCBpZC5cbiAgdGltZW91dElkOiBudW1iZXJ8bnVsbCA9IG51bGw7XG5cbiAgLy8gV2hlbiBjdXJyZW50bHkgc2NoZWR1bGVkIHRpbWVyIHdvdWxkIGZpcmUuXG4gIGludm9rZVRpbWVyQXQ6IG51bWJlcnxudWxsID0gbnVsbDtcblxuICAvLyBMaXN0IG9mIGNhbGxiYWNrcyB0byBiZSBpbnZva2VkLlxuICAvLyBGb3IgZWFjaCBjYWxsYmFjayB3ZSBhbHNvIHN0b3JlIGEgdGltZXN0YW1wIG9uIHdoZW4gdGhlIGNhbGxiYWNrXG4gIC8vIHNob3VsZCBiZSBpbnZva2VkLiBXZSBzdG9yZSB0aW1lc3RhbXBzIGFuZCBjYWxsYmFjayBmdW5jdGlvbnNcbiAgLy8gaW4gYSBmbGF0IGFycmF5IHRvIGF2b2lkIGNyZWF0aW5nIG5ldyBvYmplY3RzIGZvciBlYWNoIGVudHJ5LlxuICAvLyBbdGltZXN0YW1wMSwgY2FsbGJhY2sxLCB0aW1lc3RhbXAyLCBjYWxsYmFjazIsIC4uLl1cbiAgY3VycmVudDogQXJyYXk8bnVtYmVyfFZvaWRGdW5jdGlvbj4gPSBbXTtcblxuICAvLyBMaXN0IG9mIGNhbGxiYWNrcyBjb2xsZWN0ZWQgd2hpbGUgaW52b2tpbmcgY3VycmVudCBzZXQgb2YgY2FsbGJhY2tzLlxuICAvLyBUaG9zZSBjYWxsYmFja3MgYXJlIGFkZGVkIHRvIHRoZSBcImN1cnJlbnRcIiBxdWV1ZSBhdCB0aGUgZW5kIG9mXG4gIC8vIHRoZSBjdXJyZW50IGNhbGxiYWNrIGludm9jYXRpb24uIFRoZSBzaGFwZSBvZiB0aGlzIGxpc3QgaXMgdGhlIHNhbWVcbiAgLy8gYXMgdGhlIHNoYXBlIG9mIHRoZSBgY3VycmVudGAgbGlzdC5cbiAgZGVmZXJyZWQ6IEFycmF5PG51bWJlcnxWb2lkRnVuY3Rpb24+ID0gW107XG5cbiAgYWRkKGRlbGF5OiBudW1iZXIsIGNhbGxiYWNrOiBWb2lkRnVuY3Rpb24pIHtcbiAgICBjb25zdCB0YXJnZXQgPSB0aGlzLmV4ZWN1dGluZ0NhbGxiYWNrcyA/IHRoaXMuZGVmZXJyZWQgOiB0aGlzLmN1cnJlbnQ7XG4gICAgdGhpcy5hZGRUb1F1ZXVlKHRhcmdldCwgRGF0ZS5ub3coKSArIGRlbGF5LCBjYWxsYmFjayk7XG4gICAgdGhpcy5zY2hlZHVsZVRpbWVyKCk7XG4gIH1cblxuICByZW1vdmUoY2FsbGJhY2s6IFZvaWRGdW5jdGlvbikge1xuICAgIGNvbnN0IGNhbGxiYWNrSW5kZXggPSB0aGlzLnJlbW92ZUZyb21RdWV1ZSh0aGlzLmN1cnJlbnQsIGNhbGxiYWNrKTtcbiAgICBpZiAoY2FsbGJhY2tJbmRleCA9PT0gLTEpIHtcbiAgICAgIC8vIFRyeSBjbGVhbmluZyB1cCBkZWZlcnJlZCBxdWV1ZSBvbmx5IGluIGNhc2VcbiAgICAgIC8vIHdlIGRpZG4ndCBmaW5kIGEgY2FsbGJhY2sgaW4gdGhlIFwiY3VycmVudFwiIHF1ZXVlLlxuICAgICAgdGhpcy5yZW1vdmVGcm9tUXVldWUodGhpcy5kZWZlcnJlZCwgY2FsbGJhY2spO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgYWRkVG9RdWV1ZSh0YXJnZXQ6IEFycmF5PG51bWJlcnxWb2lkRnVuY3Rpb24+LCBpbnZva2VBdDogbnVtYmVyLCBjYWxsYmFjazogVm9pZEZ1bmN0aW9uKSB7XG4gICAgbGV0IGluc2VydEF0SW5kZXggPSB0YXJnZXQubGVuZ3RoO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFyZ2V0Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICBjb25zdCBpbnZva2VRdWV1ZWRDYWxsYmFja0F0ID0gdGFyZ2V0W2ldIGFzIG51bWJlcjtcbiAgICAgIGlmIChpbnZva2VRdWV1ZWRDYWxsYmFja0F0ID4gaW52b2tlQXQpIHtcbiAgICAgICAgLy8gV2UndmUgcmVhY2hlZCBhIGZpcnN0IHRpbWVyIHRoYXQgaXMgc2NoZWR1bGVkXG4gICAgICAgIC8vIGZvciBhIGxhdGVyIHRpbWUgdGhhbiB3aGF0IHdlIGFyZSB0cnlpbmcgdG8gaW5zZXJ0LlxuICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb2NhdGlvbiBhdCB3aGljaCB3ZSBuZWVkIHRvIGluc2VydCxcbiAgICAgICAgLy8gbm8gbmVlZCB0byBpdGVyYXRlIGZ1cnRoZXIuXG4gICAgICAgIGluc2VydEF0SW5kZXggPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgYXJyYXlJbnNlcnQyKHRhcmdldCwgaW5zZXJ0QXRJbmRleCwgaW52b2tlQXQsIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVtb3ZlRnJvbVF1ZXVlKHRhcmdldDogQXJyYXk8bnVtYmVyfFZvaWRGdW5jdGlvbj4sIGNhbGxiYWNrOiBWb2lkRnVuY3Rpb24pIHtcbiAgICBsZXQgaW5kZXggPSAtMTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRhcmdldC5sZW5ndGg7IGkgKz0gMikge1xuICAgICAgY29uc3QgcXVldWVkQ2FsbGJhY2sgPSB0YXJnZXRbaSArIDFdO1xuICAgICAgaWYgKHF1ZXVlZENhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICBpbmRleCA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgLy8gUmVtb3ZlIDIgZWxlbWVudHM6IGEgdGltZXN0YW1wIHNsb3QgYW5kXG4gICAgICAvLyB0aGUgZm9sbG93aW5nIHNsb3Qgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uLlxuICAgICAgYXJyYXlTcGxpY2UodGFyZ2V0LCBpbmRleCwgMik7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxuXG4gIHByaXZhdGUgc2NoZWR1bGVUaW1lcigpIHtcbiAgICBjb25zdCBjYWxsYmFjayA9ICgpID0+IHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnRpbWVvdXRJZCEpO1xuICAgICAgdGhpcy50aW1lb3V0SWQgPSBudWxsO1xuXG4gICAgICB0aGlzLmV4ZWN1dGluZ0NhbGxiYWNrcyA9IHRydWU7XG5cbiAgICAgIC8vIEludm9rZSBjYWxsYmFja3MgdGhhdCB3ZXJlIHNjaGVkdWxlZCB0byBydW5cbiAgICAgIC8vIGJlZm9yZSB0aGUgY3VycmVudCB0aW1lLlxuICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7XG4gICAgICBsZXQgbGFzdENhbGxiYWNrSW5kZXg6IG51bWJlcnxudWxsID0gbnVsbDtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jdXJyZW50Lmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgIGNvbnN0IGludm9rZUF0ID0gdGhpcy5jdXJyZW50W2ldIGFzIG51bWJlcjtcbiAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmN1cnJlbnRbaSArIDFdIGFzIFZvaWRGdW5jdGlvbjtcbiAgICAgICAgaWYgKGludm9rZUF0IDw9IG5vdykge1xuICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgLy8gUG9pbnQgYXQgdGhlIGludm9rZWQgY2FsbGJhY2sgZnVuY3Rpb24sIHdoaWNoIGlzIGxvY2F0ZWRcbiAgICAgICAgICAvLyBhZnRlciB0aGUgdGltZXN0YW1wLlxuICAgICAgICAgIGxhc3RDYWxsYmFja0luZGV4ID0gaSArIDE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gV2UndmUgcmVhY2hlZCBhIHRpbWVyIHRoYXQgc2hvdWxkIG5vdCBiZSBpbnZva2VkIHlldC5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGxhc3RDYWxsYmFja0luZGV4ICE9PSBudWxsKSB7XG4gICAgICAgIC8vIElmIGxhc3QgY2FsbGJhY2sgaW5kZXggaXMgYG51bGxgIC0gbm8gY2FsbGJhY2tzIHdlcmUgaW52b2tlZCxcbiAgICAgICAgLy8gc28gbm8gY2xlYW51cCBpcyBuZWVkZWQuIE90aGVyd2lzZSwgcmVtb3ZlIGludm9rZWQgY2FsbGJhY2tzXG4gICAgICAgIC8vIGZyb20gdGhlIHF1ZXVlLlxuICAgICAgICBhcnJheVNwbGljZSh0aGlzLmN1cnJlbnQsIDAsIGxhc3RDYWxsYmFja0luZGV4ICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuZXhlY3V0aW5nQ2FsbGJhY2tzID0gZmFsc2U7XG5cbiAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgY2FsbGJhY2tzIGFkZGVkIGR1cmluZyBhbiBpbnZvY2F0aW9uXG4gICAgICAvLyBvZiB0aGUgY3VycmVudCBvbmVzIC0gbW92ZSB0aGVtIG92ZXIgdG8gdGhlIFwiY3VycmVudFwiXG4gICAgICAvLyBxdWV1ZS5cbiAgICAgIGlmICh0aGlzLmRlZmVycmVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmRlZmVycmVkLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgICAgICAgY29uc3QgaW52b2tlQXQgPSB0aGlzLmRlZmVycmVkW2ldIGFzIG51bWJlcjtcbiAgICAgICAgICBjb25zdCBjYWxsYmFjayA9IHRoaXMuZGVmZXJyZWRbaSArIDFdIGFzIFZvaWRGdW5jdGlvbjtcbiAgICAgICAgICB0aGlzLmFkZFRvUXVldWUodGhpcy5jdXJyZW50LCBpbnZva2VBdCwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGVmZXJyZWQubGVuZ3RoID0gMDtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2NoZWR1bGVUaW1lcigpO1xuICAgIH07XG5cbiAgICAvLyBBdm9pZCBydW5uaW5nIHRpbWVyIGNhbGxiYWNrcyBtb3JlIHRoYW4gb25jZSBwZXJcbiAgICAvLyBhdmVyYWdlIGZyYW1lIGR1cmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBmb3IgYmV0dGVyXG4gICAgLy8gYmF0Y2hpbmcgYW5kIHRvIGF2b2lkIGtpY2tpbmcgb2ZmIGV4Y2Vzc2l2ZSBjaGFuZ2VcbiAgICAvLyBkZXRlY3Rpb24gY3ljbGVzLlxuICAgIGNvbnN0IEZSQU1FX0RVUkFUSU9OX01TID0gMTY7ICAvLyAxMDAwbXMgLyA2MGZwc1xuXG4gICAgaWYgKHRoaXMuY3VycmVudC5sZW5ndGggPiAwKSB7XG4gICAgICBjb25zdCBub3cgPSBEYXRlLm5vdygpO1xuICAgICAgLy8gRmlyc3QgZWxlbWVudCBpbiB0aGUgcXVldWUgcG9pbnRzIGF0IHRoZSB0aW1lc3RhbXBcbiAgICAgIC8vIG9mIHRoZSBmaXJzdCAoZWFybGllc3QpIGV2ZW50LlxuICAgICAgY29uc3QgaW52b2tlQXQgPSB0aGlzLmN1cnJlbnRbMF0gYXMgbnVtYmVyO1xuICAgICAgaWYgKCF0aGlzLnRpbWVvdXRJZCB8fFxuICAgICAgICAgIC8vIFJlc2NoZWR1bGUgYSB0aW1lciBpbiBjYXNlIGEgcXVldWUgY29udGFpbnMgYW4gaXRlbSB3aXRoXG4gICAgICAgICAgLy8gYW4gZWFybGllciB0aW1lc3RhbXAgYW5kIHRoZSBkZWx0YSBpcyBtb3JlIHRoYW4gYW4gYXZlcmFnZVxuICAgICAgICAgIC8vIGZyYW1lIGR1cmF0aW9uLlxuICAgICAgICAgICh0aGlzLmludm9rZVRpbWVyQXQgJiYgKHRoaXMuaW52b2tlVGltZXJBdCAtIGludm9rZUF0ID4gRlJBTUVfRFVSQVRJT05fTVMpKSkge1xuICAgICAgICBpZiAodGhpcy50aW1lb3V0SWQgIT09IG51bGwpIHtcbiAgICAgICAgICAvLyBUaGVyZSB3YXMgYSB0aW1lb3V0IGFscmVhZHksIGJ1dCBhbiBlYXJsaWVyIGV2ZW50IHdhcyBhZGRlZFxuICAgICAgICAgIC8vIGludG8gdGhlIHF1ZXVlLiBJbiB0aGlzIGNhc2Ugd2UgZHJvcCBhbiBvbGQgdGltZXIgYW5kIHNldHVwXG4gICAgICAgICAgLy8gYSBuZXcgb25lIHdpdGggYW4gdXBkYXRlZCAoc21hbGxlcikgdGltZW91dC5cbiAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgICAgICAgIHRoaXMudGltZW91dElkID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0aW1lb3V0ID0gTWF0aC5tYXgoaW52b2tlQXQgLSBub3csIEZSQU1FX0RVUkFUSU9OX01TKTtcbiAgICAgICAgdGhpcy5pbnZva2VUaW1lckF0ID0gaW52b2tlQXQ7XG4gICAgICAgIHRoaXMudGltZW91dElkID0gc2V0VGltZW91dChjYWxsYmFjaywgdGltZW91dCkgYXMgdW5rbm93biBhcyBudW1iZXI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMudGltZW91dElkICE9PSBudWxsKSB7XG4gICAgICBjbGVhclRpbWVvdXQodGhpcy50aW1lb3V0SWQpO1xuICAgICAgdGhpcy50aW1lb3V0SWQgPSBudWxsO1xuICAgIH1cbiAgICB0aGlzLmN1cnJlbnQubGVuZ3RoID0gMDtcbiAgICB0aGlzLmRlZmVycmVkLmxlbmd0aCA9IDA7XG4gIH1cblxuICAvKiogQG5vY29sbGFwc2UgKi9cbiAgc3RhdGljIMm1cHJvdiA9IC8qKiBAcHVyZU9yQnJlYWtNeUNvZGUgKi8gybXJtWRlZmluZUluamVjdGFibGUoe1xuICAgIHRva2VuOiBUaW1lclNjaGVkdWxlcixcbiAgICBwcm92aWRlZEluOiAncm9vdCcsXG4gICAgZmFjdG9yeTogKCkgPT4gbmV3IFRpbWVyU2NoZWR1bGVyKCksXG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Google LLC All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be
|
|
6
|
+
* found in the LICENSE file at https://angular.io/license
|
|
7
|
+
*/
|
|
8
|
+
import { assertIndexInDeclRange } from '../render3/assert';
|
|
9
|
+
import { HEADER_OFFSET, TVIEW } from '../render3/interfaces/view';
|
|
10
|
+
import { getTNode, removeLViewOnDestroy, storeLViewOnDestroy } from '../render3/util/view_utils';
|
|
11
|
+
import { assertEqual, throwError } from '../util/assert';
|
|
12
|
+
import { DeferBlockState, DeferDependenciesLoadingState, LOADING_AFTER_SLOT, MINIMUM_SLOT } from './interfaces';
|
|
13
|
+
/**
|
|
14
|
+
* Wraps a given callback into a logic that registers a cleanup function
|
|
15
|
+
* in the LView cleanup slot, to be invoked when an LView is destroyed.
|
|
16
|
+
*/
|
|
17
|
+
export function wrapWithLViewCleanup(callback, lView, cleanup) {
|
|
18
|
+
const wrappedCallback = () => {
|
|
19
|
+
callback();
|
|
20
|
+
removeLViewOnDestroy(lView, cleanup);
|
|
21
|
+
};
|
|
22
|
+
storeLViewOnDestroy(lView, cleanup);
|
|
23
|
+
return wrappedCallback;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Calculates a data slot index for defer block info (either static or
|
|
27
|
+
* instance-specific), given an index of a defer instruction.
|
|
28
|
+
*/
|
|
29
|
+
export function getDeferBlockDataIndex(deferBlockIndex) {
|
|
30
|
+
// Instance state is located at the *next* position
|
|
31
|
+
// after the defer block slot in an LView or TView.data.
|
|
32
|
+
return deferBlockIndex + 1;
|
|
33
|
+
}
|
|
34
|
+
/** Retrieves a defer block state from an LView, given a TNode that represents a block. */
|
|
35
|
+
export function getLDeferBlockDetails(lView, tNode) {
|
|
36
|
+
const tView = lView[TVIEW];
|
|
37
|
+
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
38
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
39
|
+
return lView[slotIndex];
|
|
40
|
+
}
|
|
41
|
+
/** Stores a defer block instance state in LView. */
|
|
42
|
+
export function setLDeferBlockDetails(lView, deferBlockIndex, lDetails) {
|
|
43
|
+
const tView = lView[TVIEW];
|
|
44
|
+
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
45
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
46
|
+
lView[slotIndex] = lDetails;
|
|
47
|
+
}
|
|
48
|
+
/** Retrieves static info about a defer block, given a TView and a TNode that represents a block. */
|
|
49
|
+
export function getTDeferBlockDetails(tView, tNode) {
|
|
50
|
+
const slotIndex = getDeferBlockDataIndex(tNode.index);
|
|
51
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
52
|
+
return tView.data[slotIndex];
|
|
53
|
+
}
|
|
54
|
+
/** Stores a defer block static info in `TView.data`. */
|
|
55
|
+
export function setTDeferBlockDetails(tView, deferBlockIndex, deferBlockConfig) {
|
|
56
|
+
const slotIndex = getDeferBlockDataIndex(deferBlockIndex);
|
|
57
|
+
ngDevMode && assertIndexInDeclRange(tView, slotIndex);
|
|
58
|
+
tView.data[slotIndex] = deferBlockConfig;
|
|
59
|
+
}
|
|
60
|
+
export function getTemplateIndexForState(newState, hostLView, tNode) {
|
|
61
|
+
const tView = hostLView[TVIEW];
|
|
62
|
+
const tDetails = getTDeferBlockDetails(tView, tNode);
|
|
63
|
+
switch (newState) {
|
|
64
|
+
case DeferBlockState.Complete:
|
|
65
|
+
return tDetails.primaryTmplIndex;
|
|
66
|
+
case DeferBlockState.Loading:
|
|
67
|
+
return tDetails.loadingTmplIndex;
|
|
68
|
+
case DeferBlockState.Error:
|
|
69
|
+
return tDetails.errorTmplIndex;
|
|
70
|
+
case DeferBlockState.Placeholder:
|
|
71
|
+
return tDetails.placeholderTmplIndex;
|
|
72
|
+
default:
|
|
73
|
+
ngDevMode && throwError(`Unexpected defer block state: ${newState}`);
|
|
74
|
+
return null;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Returns a minimum amount of time that a given state should be rendered for,
|
|
79
|
+
* taking into account `minimum` parameter value. If the `minimum` value is
|
|
80
|
+
* not specified - returns `null`.
|
|
81
|
+
*/
|
|
82
|
+
export function getMinimumDurationForState(tDetails, currentState) {
|
|
83
|
+
if (currentState === DeferBlockState.Placeholder) {
|
|
84
|
+
return tDetails.placeholderBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
85
|
+
}
|
|
86
|
+
else if (currentState === DeferBlockState.Loading) {
|
|
87
|
+
return tDetails.loadingBlockConfig?.[MINIMUM_SLOT] ?? null;
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/** Retrieves the value of the `after` parameter on the @loading block. */
|
|
92
|
+
export function getLoadingBlockAfter(tDetails) {
|
|
93
|
+
return tDetails.loadingBlockConfig?.[LOADING_AFTER_SLOT] ?? null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Adds downloaded dependencies into a directive or a pipe registry,
|
|
97
|
+
* making sure that a dependency doesn't yet exist in the registry.
|
|
98
|
+
*/
|
|
99
|
+
export function addDepsToRegistry(currentDeps, newDeps) {
|
|
100
|
+
if (!currentDeps || currentDeps.length === 0) {
|
|
101
|
+
return newDeps;
|
|
102
|
+
}
|
|
103
|
+
const currentDepSet = new Set(currentDeps);
|
|
104
|
+
for (const dep of newDeps) {
|
|
105
|
+
currentDepSet.add(dep);
|
|
106
|
+
}
|
|
107
|
+
// If `currentDeps` is the same length, there were no new deps and can
|
|
108
|
+
// return the original array.
|
|
109
|
+
return (currentDeps.length === currentDepSet.size) ? currentDeps : Array.from(currentDepSet);
|
|
110
|
+
}
|
|
111
|
+
/** Retrieves a TNode that represents main content of a defer block. */
|
|
112
|
+
export function getPrimaryBlockTNode(tView, tDetails) {
|
|
113
|
+
const adjustedIndex = tDetails.primaryTmplIndex + HEADER_OFFSET;
|
|
114
|
+
return getTNode(tView, adjustedIndex);
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Asserts whether all dependencies for a defer block are loaded.
|
|
118
|
+
* Always run this function (in dev mode) before rendering a defer
|
|
119
|
+
* block in completed state.
|
|
120
|
+
*/
|
|
121
|
+
export function assertDeferredDependenciesLoaded(tDetails) {
|
|
122
|
+
assertEqual(tDetails.loadingState, DeferDependenciesLoadingState.COMPLETE, 'Expecting all deferred dependencies to be loaded.');
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Determines if a given value matches the expected structure of a defer block
|
|
126
|
+
*
|
|
127
|
+
* We can safely rely on the primaryTmplIndex because every defer block requires
|
|
128
|
+
* that a primary template exists. All the other template options are optional.
|
|
129
|
+
*/
|
|
130
|
+
export function isTDeferBlockDetails(value) {
|
|
131
|
+
return (typeof value === 'object') &&
|
|
132
|
+
(typeof value.primaryTmplIndex === 'number');
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9jb3JlL3NyYy9kZWZlci91dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUd6RCxPQUFPLEVBQUMsYUFBYSxFQUFTLEtBQUssRUFBUSxNQUFNLDRCQUE0QixDQUFDO0FBQzlFLE9BQU8sRUFBQyxRQUFRLEVBQUUsb0JBQW9CLEVBQUUsbUJBQW1CLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUMvRixPQUFPLEVBQUMsV0FBVyxFQUFFLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRXZELE9BQU8sRUFBQyxlQUFlLEVBQUUsNkJBQTZCLEVBQXNCLGtCQUFrQixFQUFFLFlBQVksRUFBcUIsTUFBTSxjQUFjLENBQUM7QUFFdEo7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLG9CQUFvQixDQUNoQyxRQUFzQixFQUFFLEtBQVksRUFBRSxPQUFxQjtJQUM3RCxNQUFNLGVBQWUsR0FBRyxHQUFHLEVBQUU7UUFDM0IsUUFBUSxFQUFFLENBQUM7UUFDWCxvQkFBb0IsQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQyxDQUFDO0lBQ0YsbUJBQW1CLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ3BDLE9BQU8sZUFBZSxDQUFDO0FBQ3pCLENBQUM7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsZUFBdUI7SUFDNUQsbURBQW1EO0lBQ25ELHdEQUF3RDtJQUN4RCxPQUFPLGVBQWUsR0FBRyxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVELDBGQUEwRjtBQUMxRixNQUFNLFVBQVUscUJBQXFCLENBQUMsS0FBWSxFQUFFLEtBQVk7SUFDOUQsTUFBTSxLQUFLLEdBQUcsS0FBSyxDQUFDLEtB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QUMsQ0FBQztBQUMzRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBAbGljZW5zZVxuICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZVxuICovXG5cbmltcG9ydCB7YXNzZXJ0SW5kZXhJbkRlY2xSYW5nZX0gZnJvbSAnLi4vcmVuZGVyMy9hc3NlcnQnO1xuaW1wb3J0IHtEZXBlbmRlbmN5RGVmfSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvZGVmaW5pdGlvbic7XG5pbXBvcnQge1RDb250YWluZXJOb2RlLCBUTm9kZX0gZnJvbSAnLi4vcmVuZGVyMy9pbnRlcmZhY2VzL25vZGUnO1xuaW1wb3J0IHtIRUFERVJfT0ZGU0VULCBMVmlldywgVFZJRVcsIFRWaWV3fSBmcm9tICcuLi9yZW5kZXIzL2ludGVyZmFjZXMvdmlldyc7XG5pbXBvcnQge2dldFROb2RlLCByZW1vdmVMVmlld09uRGVzdHJveSwgc3RvcmVMVmlld09uRGVzdHJveX0gZnJvbSAnLi4vcmVuZGVyMy91dGlsL3ZpZXdfdXRpbHMnO1xuaW1wb3J0IHthc3NlcnRFcXVhbCwgdGhyb3dFcnJvcn0gZnJvbSAnLi4vdXRpbC9hc3NlcnQnO1xuXG5pbXBvcnQge0RlZmVyQmxvY2tTdGF0ZSwgRGVmZXJEZXBlbmRlbmNpZXNMb2FkaW5nU3RhdGUsIExEZWZlckJsb2NrRGV0YWlscywgTE9BRElOR19BRlRFUl9TTE9ULCBNSU5JTVVNX1NMT1QsIFREZWZlckJsb2NrRGV0YWlsc30gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuLyoqXG4gKiBXcmFwcyBhIGdpdmVuIGNhbGxiYWNrIGludG8gYSBsb2dpYyB0aGF0IHJlZ2lzdGVycyBhIGNsZWFudXAgZnVuY3Rpb25cbiAqIGluIHRoZSBMVmlldyBjbGVhbnVwIHNsb3QsIHRvIGJlIGludm9rZWQgd2hlbiBhbiBMVmlldyBpcyBkZXN0cm95ZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3cmFwV2l0aExWaWV3Q2xlYW51cChcbiAgICBjYWxsYmFjazogVm9pZEZ1bmN0aW9uLCBsVmlldzogTFZpZXcsIGNsZWFudXA6IFZvaWRGdW5jdGlvbik6IFZvaWRGdW5jdGlvbiB7XG4gIGNvbnN0IHdyYXBwZWRDYWxsYmFjayA9ICgpID0+IHtcbiAgICBjYWxsYmFjaygpO1xuICAgIHJlbW92ZUxWaWV3T25EZXN0cm95KGxWaWV3LCBjbGVhbnVwKTtcbiAgfTtcbiAgc3RvcmVMVmlld09uRGVzdHJveShsVmlldywgY2xlYW51cCk7XG4gIHJldHVybiB3cmFwcGVkQ2FsbGJhY2s7XG59XG5cbi8qKlxuICogQ2FsY3VsYXRlcyBhIGRhdGEgc2xvdCBpbmRleCBmb3IgZGVmZXIgYmxvY2sgaW5mbyAoZWl0aGVyIHN0YXRpYyBvclxuICogaW5zdGFuY2Utc3BlY2lmaWMpLCBnaXZlbiBhbiBpbmRleCBvZiBhIGRlZmVyIGluc3RydWN0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RGVmZXJCbG9ja0RhdGFJbmRleChkZWZlckJsb2NrSW5kZXg6IG51bWJlcikge1xuICAvLyBJbnN0YW5jZSBzdGF0ZSBpcyBsb2NhdGVkIGF0IHRoZSAqbmV4dCogcG9zaXRpb25cbiAgLy8gYWZ0ZXIgdGhlIGRlZmVyIGJsb2NrIHNsb3QgaW4gYW4gTFZpZXcgb3IgVFZpZXcuZGF0YS5cbiAgcmV0dXJuIGRlZmVyQmxvY2tJbmRleCArIDE7XG59XG5cbi8qKiBSZXRyaWV2ZXMgYSBkZWZlciBibG9jayBzdGF0ZSBmcm9tIGFuIExWaWV3LCBnaXZlbiBhIFROb2RlIHRoYXQgcmVwcmVzZW50cyBhIGJsb2NrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldExEZWZlckJsb2NrRGV0YWlscyhsVmlldzogTFZpZXcsIHROb2RlOiBUTm9kZSk6IExEZWZlckJsb2NrRGV0YWlscyB7XG4gIGNvbnN0IHRWaWV3ID0gbFZpZXdbVFZJRVddO1xuICBjb25zdCBzbG90SW5kZXggPSBnZXREZWZlckJsb2NrRGF0YUluZGV4KHROb2RlLmluZGV4KTtcbiAgbmdEZXZNb2RlICYmIGFzc2VydEluZGV4SW5EZWNsUmFuZ2UodFZpZXcsIHNsb3RJbmRleCk7XG4gIHJldHVybiBsVmlld1tzbG90SW5kZXhdO1xufVxuXG4vKiogU3RvcmVzIGEgZGVmZXIgYmxvY2sgaW5zdGFuY2Ugc3RhdGUgaW4gTFZpZXcuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0TERlZmVyQmxvY2tEZXRhaWxzKFxuICAgIGxWaWV3OiBMVmlldywgZGVmZXJCbG9ja0luZGV4OiBudW1iZXIsIGxEZXRhaWxzOiBMRGVmZXJCbG9ja0RldGFpbHMpIHtcbiAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107XG4gIGNvbnN0IHNsb3RJbmRleCA9IGdldERlZmVyQmxvY2tEYXRhSW5kZXgoZGVmZXJCbG9ja0luZGV4KTtcbiAgbmdEZXZNb2RlICYmIGFzc2VydEluZGV4SW5EZWNsUmFuZ2UodFZpZXcsIHNsb3RJbmRleCk7XG4gIGxWaWV3W3Nsb3RJbmRleF0gPSBsRGV0YWlscztcbn1cblxuLyoqIFJldHJpZXZlcyBzdGF0aWMgaW5mbyBhYm91dCBhIGRlZmVyIGJsb2NrLCBnaXZlbiBhIFRWaWV3IGFuZCBhIFROb2RlIHRoYXQgcmVwcmVzZW50cyBhIGJsb2NrLiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldFREZWZlckJsb2NrRGV0YWlscyh0VmlldzogVFZpZXcsIHROb2RlOiBUTm9kZSk6IFREZWZlckJsb2NrRGV0YWlscyB7XG4gIGNvbnN0IHNsb3RJbmRleCA9IGdldERlZmVyQmxvY2tEYXRhSW5kZXgodE5vZGUuaW5kZXgpO1xuICBuZ0Rldk1vZGUgJiYgYXNzZXJ0SW5kZXhJbkRlY2xSYW5nZSh0Vmlldywgc2xvdEluZGV4KTtcbiAgcmV0dXJuIHRWaWV3LmRhdGFbc2xvdEluZGV4XSBhcyBURGVmZXJCbG9ja0RldGFpbHM7XG59XG5cbi8qKiBTdG9yZXMgYSBkZWZlciBibG9jayBzdGF0aWMgaW5mbyBpbiBgVFZpZXcuZGF0YWAuICovXG5leHBvcnQgZnVuY3Rpb24gc2V0VERlZmVyQmxvY2tEZXRhaWxzKFxuICAgIHRWaWV3OiBUVmlldywgZGVmZXJCbG9ja0luZGV4OiBudW1iZXIsIGRlZmVyQmxvY2tDb25maWc6IFREZWZlckJsb2NrRGV0YWlscykge1xuICBjb25zdCBzbG90SW5kZXggPSBnZXREZWZlckJsb2NrRGF0YUluZGV4KGRlZmVyQmxvY2tJbmRleCk7XG4gIG5nRGV2TW9kZSAmJiBhc3NlcnRJbmRleEluRGVjbFJhbmdlKHRWaWV3LCBzbG90SW5kZXgpO1xuICB0Vmlldy5kYXRhW3Nsb3RJbmRleF0gPSBkZWZlckJsb2NrQ29uZmlnO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGVtcGxhdGVJbmRleEZvclN0YXRlKFxuICAgIG5ld1N0YXRlOiBEZWZlckJsb2NrU3RhdGUsIGhvc3RMVmlldzogTFZpZXcsIHROb2RlOiBUTm9kZSk6IG51bWJlcnxudWxsIHtcbiAgY29uc3QgdFZpZXcgPSBob3N0TFZpZXdbVFZJRVddO1xuICBjb25zdCB0RGV0YWlscyA9IGdldFREZWZlckJsb2NrRGV0YWlscyh0VmlldywgdE5vZGUpO1xuXG4gIHN3aXRjaCAobmV3U3RhdGUpIHtcbiAgICBjYXNlIERlZmVyQmxvY2tTdGF0ZS5Db21wbGV0ZTpcbiAgICAgIHJldHVybiB0RGV0YWlscy5wcmltYXJ5VG1wbEluZGV4O1xuICAgIGNhc2UgRGVmZXJCbG9ja1N0YXRlLkxvYWRpbmc6XG4gICAgICByZXR1cm4gdERldGFpbHMubG9hZGluZ1RtcGxJbmRleDtcbiAgICBjYXNlIERlZmVyQmxvY2tTdGF0ZS5FcnJvcjpcbiAgICAgIHJldHVybiB0RGV0YWlscy5lcnJvclRtcGxJbmRleDtcbiAgICBjYXNlIERlZmVyQmxvY2tTdGF0ZS5QbGFjZWhvbGRlcjpcbiAgICAgIHJldHVybiB0RGV0YWlscy5wbGFjZWhvbGRlclRtcGxJbmRleDtcbiAgICBkZWZhdWx0OlxuICAgICAgbmdEZXZNb2RlICYmIHRocm93RXJyb3IoYFVuZXhwZWN0ZWQgZGVmZXIgYmxvY2sgc3RhdGU6ICR7bmV3U3RhdGV9YCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG4vKipcbiAqIFJldHVybnMgYSBtaW5pbXVtIGFtb3VudCBvZiB0aW1lIHRoYXQgYSBnaXZlbiBzdGF0ZSBzaG91bGQgYmUgcmVuZGVyZWQgZm9yLFxuICogdGFraW5nIGludG8gYWNjb3VudCBgbWluaW11bWAgcGFyYW1ldGVyIHZhbHVlLiBJZiB0aGUgYG1pbmltdW1gIHZhbHVlIGlzXG4gKiBub3Qgc3BlY2lmaWVkIC0gcmV0dXJucyBgbnVsbGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRNaW5pbXVtRHVyYXRpb25Gb3JTdGF0ZShcbiAgICB0RGV0YWlsczogVERlZmVyQmxvY2tEZXRhaWxzLCBjdXJyZW50U3RhdGU6IERlZmVyQmxvY2tTdGF0ZSk6IG51bWJlcnxudWxsIHtcbiAgaWYgKGN1cnJlbnRTdGF0ZSA9PT0gRGVmZXJCbG9ja1N0YXRlLlBsYWNlaG9sZGVyKSB7XG4gICAgcmV0dXJuIHREZXRhaWxzLnBsYWNlaG9sZGVyQmxvY2tDb25maWc/LltNSU5JTVVNX1NMT1RdID8/IG51bGw7XG4gIH0gZWxzZSBpZiAoY3VycmVudFN0YXRlID09PSBEZWZlckJsb2NrU3RhdGUuTG9hZGluZykge1xuICAgIHJldHVybiB0RGV0YWlscy5sb2FkaW5nQmxvY2tDb25maWc/LltNSU5JTVVNX1NMT1RdID8/IG51bGw7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG5cbi8qKiBSZXRyaWV2ZXMgdGhlIHZhbHVlIG9mIHRoZSBgYWZ0ZXJgIHBhcmFtZXRlciBvbiB0aGUgQGxvYWRpbmcgYmxvY2suICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0TG9hZGluZ0Jsb2NrQWZ0ZXIodERldGFpbHM6IFREZWZlckJsb2NrRGV0YWlscyk6IG51bWJlcnxudWxsIHtcbiAgcmV0dXJuIHREZXRhaWxzLmxvYWRpbmdCbG9ja0NvbmZpZz8uW0xPQURJTkdfQUZURVJfU0xPVF0gPz8gbnVsbDtcbn1cblxuLyoqXG4gKiBBZGRzIGRvd25sb2FkZWQgZGVwZW5kZW5jaWVzIGludG8gYSBkaXJlY3RpdmUgb3IgYSBwaXBlIHJlZ2lzdHJ5LFxuICogbWFraW5nIHN1cmUgdGhhdCBhIGRlcGVuZGVuY3kgZG9lc24ndCB5ZXQgZXhpc3QgaW4gdGhlIHJlZ2lzdHJ5LlxuICovXG5leHBvcnQgZnVuY3Rpb24gYWRkRGVwc1RvUmVnaXN0cnk8VCBleHRlbmRzIERlcGVuZGVuY3lEZWZbXT4oY3VycmVudERlcHM6IFR8bnVsbCwgbmV3RGVwczogVCk6IFQge1xuICBpZiAoIWN1cnJlbnREZXBzIHx8IGN1cnJlbnREZXBzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBuZXdEZXBzO1xuICB9XG5cbiAgY29uc3QgY3VycmVudERlcFNldCA9IG5ldyBTZXQoY3VycmVudERlcHMpO1xuICBmb3IgKGNvbnN0IGRlcCBvZiBuZXdEZXBzKSB7XG4gICAgY3VycmVudERlcFNldC5hZGQoZGVwKTtcbiAgfVxuXG4gIC8vIElmIGBjdXJyZW50RGVwc2AgaXMgdGhlIHNhbWUgbGVuZ3RoLCB0aGVyZSB3ZXJlIG5vIG5ldyBkZXBzIGFuZCBjYW5cbiAgLy8gcmV0dXJuIHRoZSBvcmlnaW5hbCBhcnJheS5cbiAgcmV0dXJuIChjdXJyZW50RGVwcy5sZW5ndGggPT09IGN1cnJlbnREZXBTZXQuc2l6ZSkgPyBjdXJyZW50RGVwcyA6IEFycmF5LmZyb20oY3VycmVudERlcFNldCkgYXMgVDtcbn1cblxuLyoqIFJldHJpZXZlcyBhIFROb2RlIHRoYXQgcmVwcmVzZW50cyBtYWluIGNvbnRlbnQgb2YgYSBkZWZlciBibG9jay4gKi9cbmV4cG9ydCBmdW5jdGlvbiBnZXRQcmltYXJ5QmxvY2tUTm9kZSh0VmlldzogVFZpZXcsIHREZXRhaWxzOiBURGVmZXJCbG9ja0RldGFpbHMpOiBUQ29udGFpbmVyTm9kZSB7XG4gIGNvbnN0IGFkanVzdGVkSW5kZXggPSB0RGV0YWlscy5wcmltYXJ5VG1wbEluZGV4ICsgSEVBREVSX09GRlNFVDtcbiAgcmV0dXJuIGdldFROb2RlKHRWaWV3LCBhZGp1c3RlZEluZGV4KSBhcyBUQ29udGFpbmVyTm9kZTtcbn1cblxuLyoqXG4gKiBBc3NlcnRzIHdoZXRoZXIgYWxsIGRlcGVuZGVuY2llcyBmb3IgYSBkZWZlciBibG9jayBhcmUgbG9hZGVkLlxuICogQWx3YXlzIHJ1biB0aGlzIGZ1bmN0aW9uIChpbiBkZXYgbW9kZSkgYmVmb3JlIHJlbmRlcmluZyBhIGRlZmVyXG4gKiBibG9jayBpbiBjb21wbGV0ZWQgc3RhdGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWZlcnJlZERlcGVuZGVuY2llc0xvYWRlZCh0RGV0YWlsczogVERlZmVyQmxvY2tEZXRhaWxzKSB7XG4gIGFzc2VydEVxdWFsKFxuICAgICAgdERldGFpbHMubG9hZGluZ1N0YXRlLCBEZWZlckRlcGVuZGVuY2llc0xvYWRpbmdTdGF0ZS5DT01QTEVURSxcbiAgICAgICdFeHBlY3RpbmcgYWxsIGRlZmVycmVkIGRlcGVuZGVuY2llcyB0byBiZSBsb2FkZWQuJyk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBpZiBhIGdpdmVuIHZhbHVlIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHN0cnVjdHVyZSBvZiBhIGRlZmVyIGJsb2NrXG4gKlxuICogV2UgY2FuIHNhZmVseSByZWx5IG9uIHRoZSBwcmltYXJ5VG1wbEluZGV4IGJlY2F1c2UgZXZlcnkgZGVmZXIgYmxvY2sgcmVxdWlyZXNcbiAqIHRoYXQgYSBwcmltYXJ5IHRlbXBsYXRlIGV4aXN0cy4gQWxsIHRoZSBvdGhlciB0ZW1wbGF0ZSBvcHRpb25zIGFyZSBvcHRpb25hbC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzVERlZmVyQmxvY2tEZXRhaWxzKHZhbHVlOiB1bmtub3duKTogdmFsdWUgaXMgVERlZmVyQmxvY2tEZXRhaWxzIHtcbiAgcmV0dXJuICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnKSAmJlxuICAgICAgKHR5cGVvZiAodmFsdWUgYXMgVERlZmVyQmxvY2tEZXRhaWxzKS5wcmltYXJ5VG1wbEluZGV4ID09PSAnbnVtYmVyJyk7XG59XG4iXX0=
|
package/esm2022/src/errors.mjs
CHANGED
|
@@ -46,4 +46,4 @@ export function formatRuntimeError(code, message) {
|
|
|
46
46
|
}
|
|
47
47
|
return errorMessage;
|
|
48
48
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvZXJyb3JzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUVILE9BQU8sRUFBQywyQkFBMkIsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBaUhyRTs7Ozs7Ozs7Ozs7Ozs7O0dBZUc7QUFDSCxNQUFNLE9BQU8sWUFBa0QsU0FBUSxLQUFLO0lBQzFFLFlBQW1CLElBQU8sRUFBRSxPQUEwQjtRQUNwRCxLQUFLLENBQUMsa0JBQWtCLENBQUksSUFBSSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFEM0IsU0FBSSxHQUFKLElBQUksQ0FBRztJQUUxQixDQUFDO0NBQ0Y7QUFFRDs7O0dBR0c7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQzlCLElBQU8sRUFBRSxPQUEwQjtJQUNyQywrRkFBK0Y7SUFDL0YsMkRBQTJEO0lBQzNELGtEQUFrRDtJQUNsRCxNQUFNLFFBQVEsR0FBRyxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztJQUV4QyxJQUFJLFlBQVksR0FBRyxHQUFHLFFBQVEsR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRWpFLElBQUksU0FBUyxJQUFJLElBQUksR0FBRyxDQUFDLEVBQUU7UUFDekIsTUFBTSxrQkFBa0IsR0FBRyxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDN0QsTUFBTSxTQUFTLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQ2hELFlBQVk7WUFDUixHQUFHLFlBQVksR0FBRyxTQUFTLGlCQUFpQiwyQkFBMkIsSUFBSSxRQUFRLEVBQUUsQ0FBQztLQUMzRjtJQUNELE9BQU8sWUFBWSxDQUFDO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlXG4gKi9cblxuaW1wb3J0IHtFUlJPUl9ERVRBSUxTX1BBR0VfQkFTRV9VUkx9IGZyb20gJy4vZXJyb3JfZGV0YWlsc19iYXNlX3VybCc7XG5cbi8qKlxuICogVGhlIGxpc3Qgb2YgZXJyb3IgY29kZXMgdXNlZCBpbiBydW50aW1lIGNvZGUgb2YgdGhlIGBjb3JlYCBwYWNrYWdlLlxuICogUmVzZXJ2ZWQgZXJyb3IgY29kZSByYW5nZTogMTAwLTk5OS5cbiAqXG4gKiBOb3RlOiB0aGUgbWludXMgc2lnbiBkZW5vdGVzIHRoZSBmYWN0IHRoYXQgYSBwYXJ0aWN1bGFyIGNvZGUgaGFzIGEgZGV0YWlsZWQgZ3VpZGUgb25cbiAqIGFuZ3VsYXIuaW8uIFRoaXMgZXh0cmEgYW5ub3RhdGlvbiBpcyBuZWVkZWQgdG8gYXZvaWQgaW50cm9kdWNpbmcgYSBzZXBhcmF0ZSBzZXQgdG8gc3RvcmVcbiAqIGVycm9yIGNvZGVzIHdoaWNoIGhhdmUgZ3VpZGVzLCB3aGljaCBtaWdodCBsZWFrIGludG8gcnVudGltZSBjb2RlLlxuICpcbiAqIEZ1bGwgbGlzdCBvZiBhdmFpbGFibGUgZXJyb3IgZ3VpZGVzIGNhbiBiZSBmb3VuZCBhdCBodHRwczovL2FuZ3VsYXIuaW8vZXJyb3JzLlxuICpcbiAqIEVycm9yIGNvZGUgcmFuZ2VzIHBlciBwYWNrYWdlOlxuICogIC0gY29yZSAodGhpcyBwYWNrYWdlKTogMTAwLTk5OVxuICogIC0gZm9ybXM6IDEwMDAtMTk5OVxuICogIC0gY29tbW9uOiAyMDAwLTI5OTlcbiAqICAtIGFuaW1hdGlvbnM6IDMwMDAtMzk5OVxuICogIC0gcm91dGVyOiA0MDAwLTQ5OTlcbiAqICAtIHBsYXRmb3JtLWJyb3dzZXI6IDUwMDAtNTUwMFxuICovXG5leHBvcnQgY29uc3QgZW51bSBSdW50aW1lRXJyb3JDb2RlIHtcbiAgLy8gQ2hhbmdlIERldGVjdGlvbiBFcnJvcnNcbiAgRVhQUkVTU0lPTl9DSEFOR0VEX0FGVEVSX0NIRUNLRUQgPSAtMTAwLFxuICBSRUNVUlNJVkVfQVBQTElDQVRJT05fUkVGX1RJQ0sgPSAxMDEsXG4gIFJFQ1VSU0lWRV9BUFBMSUNBVElPTl9SRU5ERVIgPSAxMDIsXG5cbiAgLy8gRGVwZW5kZW5jeSBJbmplY3Rpb24gRXJyb3JzXG4gIENZQ0xJQ19ESV9ERVBFTkRFTkNZID0gLTIwMCxcbiAgUFJPVklERVJfTk9UX0ZPVU5EID0gLTIwMSxcbiAgSU5WQUxJRF9GQUNUT1JZX0RFUEVOREVOQ1kgPSAyMDIsXG4gIE1JU1NJTkdfSU5KRUNUSU9OX0NPTlRFWFQgPSAtMjAzLFxuICBJTlZBTElEX0lOSkVDVElPTl9UT0tFTiA9IDIwNCxcbiAgSU5KRUNUT1JfQUxSRUFEWV9ERVNUUk9ZRUQgPSAyMDUsXG4gIFBST1ZJREVSX0lOX1dST05HX0NPTlRFWFQgPSAyMDcsXG4gIE1JU1NJTkdfSU5KRUNUSU9OX1RPS0VOID0gMjA4LFxuICBJTlZBTElEX01VTFRJX1BST1ZJREVSID0gLTIwOSxcbiAgTUlTU0lOR19ET0NVTUVOVCA9IDIxMCxcblxuICAvLyBUZW1wbGF0ZSBFcnJvcnNcbiAgTVVMVElQTEVfQ09NUE9ORU5UU19NQVRDSCA9IC0zMDAsXG4gIEVYUE9SVF9OT1RfRk9VTkQgPSAtMzAxLFxuICBQSVBFX05PVF9GT1VORCA9IC0zMDIsXG4gIFVOS05PV05fQklORElORyA9IDMwMyxcbiAgVU5LTk9XTl9FTEVNRU5UID0gMzA0LFxuICBURU1QTEFURV9TVFJVQ1RVUkVfRVJST1IgPSAzMDUsXG4gIElOVkFMSURfRVZFTlRfQklORElORyA9IDMwNixcbiAgSE9TVF9ESVJFQ1RJVkVfVU5SRVNPTFZBQkxFID0gMzA3LFxuICBIT1NUX0RJUkVDVElWRV9OT1RfU1RBTkRBTE9ORSA9IDMwOCxcbiAgRFVQTElDQVRFX0RJUkVDVElUVkUgPSAzMDksXG4gIEhPU1RfRElSRUNUSVZFX0NPTVBPTkVOVCA9IDMxMCxcbiAgSE9TVF9ESVJFQ1RJVkVfVU5ERUZJTkVEX0JJTkRJTkcgPSAzMTEsXG4gIEhPU1RfRElSRUNUSVZFX0NPTkZMSUNUSU5HX0FMSUFTID0gMzEyLFxuICBNVUxUSVBMRV9NQVRDSElOR19QSVBFUyA9IDMxMyxcblxuICAvLyBCb290c3RyYXAgRXJyb3JzXG4gIE1VTFRJUExFX1BMQVRGT1JNUyA9IDQwMCxcbiAgUExBVEZPUk1fTk9UX0ZPVU5EID0gNDAxLFxuICBNSVNTSU5HX1JFUVVJUkVEX0lOSkVDVEFCTEVfSU5fQk9PVFNUUkFQID0gNDAyLFxuICBCT09UU1RSQVBfQ09NUE9ORU5UU19OT1RfRk9VTkQgPSAtNDAzLFxuICBQTEFURk9STV9BTFJFQURZX0RFU1RST1lFRCA9IDQwNCxcbiAgQVNZTkNfSU5JVElBTElaRVJTX1NUSUxMX1JVTk5JTkcgPSA0MDUsXG4gIEFQUExJQ0FUSU9OX1JFRl9BTFJFQURZX0RFU1RST1lFRCA9IDQwNixcbiAgUkVOREVSRVJfTk9UX0ZPVU5EID0gNDA3LFxuXG4gIC8vIEh5ZHJhdGlvbiBFcnJvcnNcbiAgSFlEUkFUSU9OX05PREVfTUlTTUFUQ0ggPSAtNTAwLFxuICBIWURSQVRJT05fTUlTU0lOR19TSUJMSU5HUyA9IC01MDEsXG4gIEhZRFJBVElPTl9NSVNTSU5HX05PREUgPSAtNTAyLFxuICBVTlNVUFBPUlRFRF9QUk9KRUNUSU9OX0RPTV9OT0RFUyA9IC01MDMsXG4gIElOVkFMSURfU0tJUF9IWURSQVRJT05fSE9TVCA9IC01MDQsXG4gIE1JU1NJTkdfSFlEUkFUSU9OX0FOTk9UQVRJT05TID0gLTUwNSxcbiAgSFlEUkFUSU9OX1NUQUJMRV9USU1FRE9VVCA9IC01MDYsXG4gIE1JU1NJTkdfU1NSX0NPTlRFTlRfSU5URUdSSVRZX01BUktFUiA9IC01MDcsXG5cbiAgLy8gU2lnbmFsIEVycm9yc1xuICBTSUdOQUxfV1JJVEVfRlJPTV9JTExFR0FMX0NPTlRFWFQgPSA2MDAsXG4gIFJFUVVJUkVfU1lOQ19XSVRIT1VUX1NZTkNfRU1JVCA9IDYwMSxcbiAgQVNTRVJUSU9OX05PVF9JTlNJREVfUkVBQ1RJVkVfQ09OVEVYVCA9IC02MDIsXG5cbiAgLy8gU3R5bGluZyBFcnJvcnNcblxuICAvLyBEZWNsYXJhdGlvbnMgRXJyb3JzXG5cbiAgLy8gaTE4biBFcnJvcnNcbiAgSU5WQUxJRF9JMThOX1NUUlVDVFVSRSA9IDcwMCxcbiAgTUlTU0lOR19MT0NBTEVfREFUQSA9IDcwMSxcblxuICAvLyBzdGFuZGFsb25lIGVycm9yc1xuICBJTVBPUlRfUFJPVklERVJTX0ZST01fU1RBTkRBTE9ORSA9IDgwMCxcblxuICAvLyBKSVQgQ29tcGlsYXRpb24gRXJyb3JzXG4gIC8vIE90aGVyXG4gIElOVkFMSURfRElGRkVSX0lOUFVUID0gOTAwLFxuICBOT19TVVBQT1JUSU5HX0RJRkZFUl9GQUNUT1JZID0gOTAxLFxuICBWSUVXX0FMUkVBRFlfQVRUQUNIRUQgPSA5MDIsXG4gIElOVkFMSURfSU5IRVJJVEFOQ0UgPSA5MDMsXG4gIFVOU0FGRV9WQUxVRV9JTl9SRVNPVVJDRV9VUkwgPSA5MDQsXG4gIFVOU0FGRV9WQUxVRV9JTl9TQ1JJUFQgPSA5MDUsXG4gIE1JU1NJTkdfR0VORVJBVEVEX0RFRiA9IDkwNixcbiAgVFlQRV9JU19OT1RfU1RBTkRBTE9ORSA9IDkwNyxcbiAgTUlTU0lOR19aT05FSlMgPSA5MDgsXG4gIFVORVhQRUNURURfWk9ORV9TVEFURSA9IDkwOSxcbiAgVU5TQUZFX0lGUkFNRV9BVFRSUyA9IC05MTAsXG4gIFZJRVdfQUxSRUFEWV9ERVNUUk9ZRUQgPSA5MTEsXG4gIENPTVBPTkVOVF9JRF9DT0xMSVNJT04gPSAtOTEyLFxuICBJTUFHRV9QRVJGT1JNQU5DRV9XQVJOSU5HID0gLTkxMyxcblxuICAvLyBSdW50aW1lIGRlcGVuZGVuY3kgdHJhY2tlciBlcnJvcnNcbiAgUlVOVElNRV9ERVBTX0lOVkFMSURfSU1QT1JURURfVFlQRSA9IDEwMDAsXG4gIFJVTlRJTUVfREVQU19PUlBIQU5fQ09NUE9ORU5UID0gMTAwMSxcbn1cblxuXG4vKipcbiAqIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHJ1bnRpbWUgZXJyb3IuXG4gKiBGb3JtYXRzIGFuZCBvdXRwdXRzIHRoZSBlcnJvciBtZXNzYWdlIGluIGEgY29uc2lzdGVudCB3YXkuXG4gKlxuICogRXhhbXBsZTpcbiAqIGBgYFxuICogIHRocm93IG5ldyBSdW50aW1lRXJyb3IoXG4gKiAgICBSdW50aW1lRXJyb3JDb2RlLklOSkVDVE9SX0FMUkVBRFlfREVTVFJPWUVELFxuICogICAgbmdEZXZNb2RlICYmICdJbmplY3RvciBoYXMgYWxyZWFkeSBiZWVuIGRlc3Ryb3llZC4nKTtcbiAqIGBgYFxuICpcbiAqIE5vdGU6IHRoZSBgbWVzc2FnZWAgYXJndW1lbnQgY29udGFpbnMgYSBkZXNjcmlwdGl2ZSBlcnJvciBtZXNzYWdlIGFzIGEgc3RyaW5nIGluIGRldmVsb3BtZW50XG4gKiBtb2RlICh3aGVuIHRoZSBgbmdEZXZNb2RlYCBpcyBkZWZpbmVkKS4gSW4gcHJvZHVjdGlvbiBtb2RlIChhZnRlciB0cmVlLXNoYWtpbmcgcGFzcyksIHRoZVxuICogYG1lc3NhZ2VgIGFyZ3VtZW50IGJlY29tZXMgYGZhbHNlYCwgdGh1cyB3ZSBhY2NvdW50IGZvciBpdCBpbiB0aGUgdHlwaW5ncyBhbmQgdGhlIHJ1bnRpbWVcbiAqIGxvZ2ljLlxuICovXG5leHBvcnQgY2xhc3MgUnVudGltZUVycm9yPFQgZXh0ZW5kcyBudW1iZXIgPSBSdW50aW1lRXJyb3JDb2RlPiBleHRlbmRzIEVycm9yIHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvZGU6IFQsIG1lc3NhZ2U6IG51bGx8ZmFsc2V8c3RyaW5nKSB7XG4gICAgc3VwZXIoZm9ybWF0UnVudGltZUVycm9yPFQ+KGNvZGUsIG1lc3NhZ2UpKTtcbiAgfVxufVxuXG4vKipcbiAqIENhbGxlZCB0byBmb3JtYXQgYSBydW50aW1lIGVycm9yLlxuICogU2VlIGFkZGl0aW9uYWwgaW5mbyBvbiB0aGUgYG1lc3NhZ2VgIGFyZ3VtZW50IHR5cGUgaW4gdGhlIGBSdW50aW1lRXJyb3JgIGNsYXNzIGRlc2NyaXB0aW9uLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0UnVudGltZUVycm9yPFQgZXh0ZW5kcyBudW1iZXIgPSBSdW50aW1lRXJyb3JDb2RlPihcbiAgICBjb2RlOiBULCBtZXNzYWdlOiBudWxsfGZhbHNlfHN0cmluZyk6IHN0cmluZyB7XG4gIC8vIEVycm9yIGNvZGUgbWlnaHQgYmUgYSBuZWdhdGl2ZSBudW1iZXIsIHdoaWNoIGlzIGEgc3BlY2lhbCBtYXJrZXIgdGhhdCBpbnN0cnVjdHMgdGhlIGxvZ2ljIHRvXG4gIC8vIGdlbmVyYXRlIGEgbGluayB0byB0aGUgZXJyb3IgZGV0YWlscyBwYWdlIG9uIGFuZ3VsYXIuaW8uXG4gIC8vIFdlIGFsc28gcHJlcGVuZCBgMGAgdG8gbm9uLWNvbXBpbGUtdGltZSBlcnJvcnMuXG4gIGNvbnN0IGZ1bGxDb2RlID0gYE5HMCR7TWF0aC5hYnMoY29kZSl9YDtcblxuICBsZXQgZXJyb3JNZXNzYWdlID0gYCR7ZnVsbENvZGV9JHttZXNzYWdlID8gJzogJyArIG1lc3NhZ2UgOiAnJ31gO1xuXG4gIGlmIChuZ0Rldk1vZGUgJiYgY29kZSA8IDApIHtcbiAgICBjb25zdCBhZGRQZXJpb2RTZXBhcmF0b3IgPSAhZXJyb3JNZXNzYWdlLm1hdGNoKC9bLiw7IT9cXG5dJC8pO1xuICAgIGNvbnN0IHNlcGFyYXRvciA9IGFkZFBlcmlvZFNlcGFyYXRvciA/ICcuJyA6ICcnO1xuICAgIGVycm9yTWVzc2FnZSA9XG4gICAgICAgIGAke2Vycm9yTWVzc2FnZX0ke3NlcGFyYXRvcn0gRmluZCBtb3JlIGF0ICR7RVJST1JfREVUQUlMU19QQUdFX0JBU0VfVVJMfS8ke2Z1bGxDb2RlfWA7XG4gIH1cbiAgcmV0dXJuIGVycm9yTWVzc2FnZTtcbn1cbiJdfQ==
|