@ngutil/aria 0.0.80 → 0.0.82

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 (36) hide show
  1. package/fesm2022/ngutil-aria.mjs +88 -65
  2. package/fesm2022/ngutil-aria.mjs.map +1 -1
  3. package/focus/focus-state.directive.d.ts +1 -2
  4. package/focus/focus.service.d.ts +1 -1
  5. package/focus/focusable.directive.d.ts +0 -1
  6. package/package.json +7 -9
  7. package/ui-state/abstract.d.ts +1 -1
  8. package/ui-state/dirty.directive.d.ts +9 -0
  9. package/ui-state/index.d.ts +5 -3
  10. package/ui-state/progress-state.d.ts +1 -1
  11. package/esm2022/activity/activity.service.mjs +0 -49
  12. package/esm2022/activity/index.mjs +0 -2
  13. package/esm2022/focus/focus-state.directive.mjs +0 -63
  14. package/esm2022/focus/focus-trap.directive.mjs +0 -25
  15. package/esm2022/focus/focus.service.mjs +0 -145
  16. package/esm2022/focus/focusable.directive.mjs +0 -52
  17. package/esm2022/focus/index.mjs +0 -5
  18. package/esm2022/gestures/gesture-drag.mjs +0 -81
  19. package/esm2022/gestures/gesture-event.mjs +0 -44
  20. package/esm2022/gestures/gesture-longtap.mjs +0 -34
  21. package/esm2022/gestures/gesture-tap.mjs +0 -37
  22. package/esm2022/gestures/gesture.mjs +0 -66
  23. package/esm2022/gestures/gesture.service.mjs +0 -279
  24. package/esm2022/gestures/index.mjs +0 -7
  25. package/esm2022/index.mjs +0 -6
  26. package/esm2022/keystroke/index.mjs +0 -2
  27. package/esm2022/keystroke/keystroke.service.mjs +0 -92
  28. package/esm2022/ngutil-aria.mjs +0 -5
  29. package/esm2022/ui-state/abstract.mjs +0 -41
  30. package/esm2022/ui-state/busy.directive.mjs +0 -27
  31. package/esm2022/ui-state/disabled.directive.mjs +0 -28
  32. package/esm2022/ui-state/index.mjs +0 -25
  33. package/esm2022/ui-state/progress-state.mjs +0 -141
  34. package/esm2022/ui-state/readonly.directive.mjs +0 -27
  35. package/esm2022/ui-state/selector.mjs +0 -308
  36. package/esm2022/ui-state/ui-state.mjs +0 -91
@@ -1,25 +0,0 @@
1
- import { NgModule } from "@angular/core";
2
- import { BusyDirective } from "./busy.directive";
3
- import { DisabledDirective } from "./disabled.directive";
4
- import { ReadonlyDirective } from "./readonly.directive";
5
- import * as i0 from "@angular/core";
6
- export * from "./abstract";
7
- export * from "./busy.directive";
8
- export * from "./disabled.directive";
9
- export * from "./progress-state";
10
- export * from "./readonly.directive";
11
- export * from "./ui-state";
12
- const entries = [BusyDirective, DisabledDirective, ReadonlyDirective];
13
- export class UiStateModule {
14
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
15
- static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, imports: [BusyDirective, DisabledDirective, ReadonlyDirective], exports: [BusyDirective, DisabledDirective, ReadonlyDirective] }); }
16
- static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule }); }
17
- }
18
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: UiStateModule, decorators: [{
19
- type: NgModule,
20
- args: [{
21
- imports: entries,
22
- exports: entries
23
- }]
24
- }] });
25
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRXhDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUNoRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUN4RCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTs7QUFFeEQsY0FBYyxZQUFZLENBQUE7QUFDMUIsY0FBYyxrQkFBa0IsQ0FBQTtBQUNoQyxjQUFjLHNCQUFzQixDQUFBO0FBQ3BDLGNBQWMsa0JBQWtCLENBQUE7QUFDaEMsY0FBYyxzQkFBc0IsQ0FBQTtBQUNwQyxjQUFjLFlBQVksQ0FBQTtBQUUxQixNQUFNLE9BQU8sR0FBRyxDQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQyxDQUFBO0FBTXJFLE1BQU0sT0FBTyxhQUFhOzhHQUFiLGFBQWE7K0dBQWIsYUFBYSxZQU5ULGFBQWEsRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsYUFBbkQsYUFBYSxFQUFFLGlCQUFpQixFQUFFLGlCQUFpQjsrR0FNdkQsYUFBYTs7MkZBQWIsYUFBYTtrQkFKekIsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUUsT0FBTztvQkFDaEIsT0FBTyxFQUFFLE9BQU87aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdNb2R1bGUgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiXG5cbmltcG9ydCB7IEJ1c3lEaXJlY3RpdmUgfSBmcm9tIFwiLi9idXN5LmRpcmVjdGl2ZVwiXG5pbXBvcnQgeyBEaXNhYmxlZERpcmVjdGl2ZSB9IGZyb20gXCIuL2Rpc2FibGVkLmRpcmVjdGl2ZVwiXG5pbXBvcnQgeyBSZWFkb25seURpcmVjdGl2ZSB9IGZyb20gXCIuL3JlYWRvbmx5LmRpcmVjdGl2ZVwiXG5cbmV4cG9ydCAqIGZyb20gXCIuL2Fic3RyYWN0XCJcbmV4cG9ydCAqIGZyb20gXCIuL2J1c3kuZGlyZWN0aXZlXCJcbmV4cG9ydCAqIGZyb20gXCIuL2Rpc2FibGVkLmRpcmVjdGl2ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9wcm9ncmVzcy1zdGF0ZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9yZWFkb25seS5kaXJlY3RpdmVcIlxuZXhwb3J0ICogZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5jb25zdCBlbnRyaWVzID0gW0J1c3lEaXJlY3RpdmUsIERpc2FibGVkRGlyZWN0aXZlLCBSZWFkb25seURpcmVjdGl2ZV1cblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBlbnRyaWVzLFxuICAgIGV4cG9ydHM6IGVudHJpZXNcbn0pXG5leHBvcnQgY2xhc3MgVWlTdGF0ZU1vZHVsZSB7fVxuIl19
@@ -1,141 +0,0 @@
1
- import { Directive } from "@angular/core";
2
- import { toSignal } from "@angular/core/rxjs-interop";
3
- import { animationFrames, map, Observable, of, scan, shareReplay, startWith, Subject, switchMap, takeWhile } from "rxjs";
4
- import { clamp } from "lodash-es";
5
- import * as i0 from "@angular/core";
6
- const SEGMENT_REGISTER = { type: "fix", percent: 0 };
7
- const SEGMENT_COMPLETE = { type: "fix", percent: 1 };
8
- export class ProgressState {
9
- constructor() {
10
- this.#segments = {};
11
- this.#input = new Subject();
12
- this.#state = this.#input.pipe(startWith(null), scan((state, input) => {
13
- if (Object.keys(state).length === 0) {
14
- state = this.#initialState();
15
- }
16
- if (input == null) {
17
- return state;
18
- }
19
- let current = state[input.name] ?? { ratio: 0, share: 0, done: false };
20
- current = { ...current, ...input };
21
- if (input.progress.type === "lax") {
22
- delete current.laxBegin;
23
- current.done = false;
24
- }
25
- if (input.progress.type === "fix" && input.progress.percent < 1) {
26
- current.done = false;
27
- }
28
- return { ...state, [input.name]: { ...current, ...input } };
29
- }, {}), switchMap(state => {
30
- const slist = Object.values(state);
31
- const min = slist.reduce((min, current) => Math.min(min, current.distribution || 0), Infinity) || 1;
32
- const totalDistribution = slist.reduce((total, current) => total + (current.distribution || min), 0);
33
- const hasLax = slist.some(segment => segment.progress.type === "lax");
34
- const trigger = hasLax ? animationFrames() : of({ timestamp: performance.now() });
35
- return trigger.pipe(map(({ timestamp }) => {
36
- for (const segment of slist) {
37
- if (segment.distribution == null) {
38
- segment.distribution = min;
39
- }
40
- segment.ratio = segment.distribution / totalDistribution + 0.0001;
41
- let percent;
42
- if (segment.progress.type === "lax") {
43
- if (segment.laxBegin == null) {
44
- segment.laxBegin = timestamp;
45
- }
46
- percent = (timestamp - segment.laxBegin) / segment.progress.predictedTime;
47
- if (percent >= 0.8) {
48
- const final = (timestamp - segment.laxBegin) / (segment.progress.predictedTime * 50);
49
- percent = 0.8 + Math.log1p(final);
50
- }
51
- }
52
- else {
53
- delete segment.laxBegin;
54
- percent = clamp(segment.progress.percent, 0, 1);
55
- }
56
- segment.share = percent * segment.ratio;
57
- segment.done = percent >= 1;
58
- }
59
- return state;
60
- }), takeWhile(state => Object.values(state).some(segment => !segment.done), true));
61
- }), shareReplay({ bufferSize: 1, refCount: true }));
62
- this.value$ = this.#state;
63
- this.value = toSignal(this.value$);
64
- this.percent$ = this.value$.pipe(map(value => value != null
65
- ? clamp(Object.values(value).reduce((a, b) => a + b.share, 0), 0, 1)
66
- : 0), shareReplay({ bufferSize: 1, refCount: true }));
67
- this.percent = toSignal(this.percent$);
68
- }
69
- #segments;
70
- #input;
71
- #state;
72
- segment(name, distribution = 1) {
73
- const segment = this.#segments[name] ?? (this.#segments[name] = new ProgressSegmentRef(this.#input, name, distribution));
74
- segment.next(SEGMENT_REGISTER);
75
- return segment;
76
- }
77
- connect(state, name, distribution) {
78
- return new Observable(() => {
79
- const segment = this.segment(name, distribution);
80
- return state.percent$.subscribe(percent => {
81
- segment.next({ type: "fix", percent });
82
- });
83
- });
84
- }
85
- #initialState() {
86
- return Object.values(this.#segments).reduce((res, segment) => {
87
- if (segment.value) {
88
- res[segment.name] = {
89
- name: segment.name,
90
- distribution: segment.distribution,
91
- progress: segment.value,
92
- ratio: 0,
93
- share: 0,
94
- done: false
95
- };
96
- }
97
- return res;
98
- }, {});
99
- }
100
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ProgressState, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
101
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.6", type: ProgressState, ngImport: i0 }); }
102
- }
103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ProgressState, decorators: [{
104
- type: Directive
105
- }] });
106
- export class ProgressSegmentRef {
107
- #subject;
108
- set distribution(value) {
109
- if (this.#distribution !== value) {
110
- this.#distribution = value;
111
- if (this.#value != null) {
112
- this.#next(this.#value);
113
- }
114
- }
115
- }
116
- get distribution() {
117
- return this.#distribution;
118
- }
119
- #distribution;
120
- get value() {
121
- return this.#value;
122
- }
123
- #value;
124
- constructor(subject, name, distribution) {
125
- this.name = name;
126
- this.#subject = subject;
127
- this.#distribution = distribution;
128
- }
129
- next(progress) {
130
- return this.#next(progress);
131
- }
132
- complete() {
133
- return this.#next(SEGMENT_COMPLETE);
134
- }
135
- #next(progress) {
136
- this.#value = progress;
137
- this.#subject.next({ name: this.name, distribution: this.distribution, progress });
138
- return this;
139
- }
140
- }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3Mtc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9wcm9ncmVzcy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRXhILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxXQUFXLENBQUE7O0FBc0NqQyxNQUFNLGdCQUFnQixHQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDOUQsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO0FBRzlELE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRWEsY0FBUyxHQUEwQyxFQUFFLENBQUE7UUFFckQsV0FBTSxHQUFHLElBQUksT0FBTyxFQUF3QixDQUFBO1FBRTVDLFdBQU0sR0FBa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsSUFBSSxLQUFLLElB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Q1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO0lBQzdCLENBQUM7SUFDRCxhQUFhLENBQVM7SUFFdEIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxNQUFNLENBQVc7SUFFakIsWUFDSSxPQUFzQyxFQUN0QixJQUFZLEVBQzVCLFlBQXFCO1FBREwsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUc1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQTtJQUNyQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWtCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBa0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2xGLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZXMsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNjYW4sIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVdoaWxlIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gXCJsb2Rhc2gtZXNcIlxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gXCJ1dGlsaXR5LXR5cGVzXCJcblxuaW1wb3J0IHsgRGVlcFJlYWRvbmx5IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0NvbW1vbiB7XG4gICAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICAgIHJlYWRvbmx5IFtvdGhlcjogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzTGF4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImxheFwiXG4gICAgcmVhZG9ubHkgcHJlZGljdGVkVGltZTogbnVtYmVyXG4gICAgLy8gcmVhZG9ubHkgdXBkYXRlSW50ZXJ2YWw6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzRml4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImZpeFwiXG4gICAgcmVhZG9ubHkgcGVyY2VudDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzID0gKFByb2dyZXNzTGF4IHwgUHJvZ3Jlc3NGaXgpICYgUHJvZ3Jlc3NDb21tb25cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ21lbnRJbnB1dCB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgcHJvZ3Jlc3M6IERlZXBSZWFkb25seTxQcm9ncmVzcz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ2VtZW50IGV4dGVuZHMgUHJvZ3Jlc3NTZWdtZW50SW5wdXQge1xuICAgIHJhdGlvOiBudW1iZXJcbiAgICBzaGFyZTogbnVtYmVyXG4gICAgZG9uZTogYm9vbGVhblxuICAgIGxheEJlZ2luPzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzU2VnZW1lbnRzID0geyBba2V5OiBzdHJpbmddOiBQcm9ncmVzc1NlZ2VtZW50IH1cblxuY29uc3QgU0VHTUVOVF9SRUdJU1RFUjogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDAgfVxuY29uc3QgU0VHTUVOVF9DT01QTEVURTogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDEgfVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1N0YXRlIHtcbiAgICByZWFkb25seSAjc2VnbWVudHM6IHsgW2tleTogc3RyaW5nXTogUHJvZ3Jlc3NTZWdtZW50UmVmIH0gPSB7fVxuXG4gICAgcmVhZG9ubHkgI2lucHV0ID0gbmV3IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+KClcblxuICAgIHJlYWRvbmx5ICNzdGF0ZTogT2JzZXJ2YWJsZTxQcm9ncmVzc1NlZ2VtZW50cz4gPSB0aGlzLiNpbnB1dC5waXBlKFxuICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgIHNjYW4oKHN0YXRlLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoaXMuI2luaXRpYWxTdGF0ZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gc3RhdGVbaW5wdXQubmFtZV0gPz8geyByYXRpbzogMCwgc2hhcmU6IDAsIGRvbmU6IGZhbHNlIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIC4uLmlucHV0IH1cblxuICAgICAgICAgICAgaWYgKGlucHV0LnByb2dyZXNzLnR5cGUgPT09IFwibGF4XCIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY3VycmVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZG9uZSA9IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dC5wcm9ncmVzcy50eXBlID09PSBcImZpeFwiICYmIGlucHV0LnByb2dyZXNzLnBlcmNlbnQgPCAxKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5kb25lID0gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIFtpbnB1dC5uYW1lXTogeyAuLi5jdXJyZW50LCAuLi5pbnB1dCB9IH1cbiAgICAgICAgfSwge30gYXMgUHJvZ3Jlc3NTZWdlbWVudHMpLFxuICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2xpc3QgPSBPYmplY3QudmFsdWVzKHN0YXRlKSBhcyBBcnJheTxNdXRhYmxlPFByb2dyZXNzU2VnZW1lbnQ+PlxuICAgICAgICAgICAgY29uc3QgbWluID0gc2xpc3QucmVkdWNlKChtaW4sIGN1cnJlbnQpID0+IE1hdGgubWluKG1pbiwgY3VycmVudC5kaXN0cmlidXRpb24gfHwgMCksIEluZmluaXR5KSB8fCAxXG4gICAgICAgICAgICBjb25zdCB0b3RhbERpc3RyaWJ1dGlvbiA9IHNsaXN0LnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQuZGlzdHJpYnV0aW9uIHx8IG1pbiksIDApXG4gICAgICAgICAgICBjb25zdCBoYXNMYXggPSBzbGlzdC5zb21lKHNlZ21lbnQgPT4gc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKVxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IGhhc0xheCA/IGFuaW1hdGlvbkZyYW1lcygpIDogb2YoeyB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpIH0pXG5cbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IHRpbWVzdGFtcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuZGlzdHJpYnV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmRpc3RyaWJ1dGlvbiA9IG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5yYXRpbyA9IHNlZ21lbnQuZGlzdHJpYnV0aW9uIC8gdG90YWxEaXN0cmlidXRpb24gKyAwLjAwMDFcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBlcmNlbnQ6IG51bWJlclxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQubGF4QmVnaW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmxheEJlZ2luID0gdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIHNlZ21lbnQucHJvZ3Jlc3MucHJlZGljdGVkVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJjZW50ID49IDAuOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIChzZWdtZW50LnByb2dyZXNzLnByZWRpY3RlZFRpbWUgKiA1MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IDAuOCArIE1hdGgubG9nMXAoZmluYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VnbWVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBjbGFtcChzZWdtZW50LnByb2dyZXNzLnBlcmNlbnQsIDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuc2hhcmUgPSBwZXJjZW50ICogc2VnbWVudC5yYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5kb25lID0gcGVyY2VudCA+PSAxXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoc3RhdGUgPT4gT2JqZWN0LnZhbHVlcyhzdGF0ZSkuc29tZShzZWdtZW50ID0+ICFzZWdtZW50LmRvbmUpLCB0cnVlKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgIClcblxuICAgIHJlYWRvbmx5IHZhbHVlJDogT2JzZXJ2YWJsZTxEZWVwUmVhZG9ubHk8UHJvZ3Jlc3NTZWdlbWVudHM+PiA9IHRoaXMuI3N0YXRlXG4gICAgcmVhZG9ubHkgdmFsdWUgPSB0b1NpZ25hbCh0aGlzLnZhbHVlJClcblxuICAgIHJlYWRvbmx5IHBlcmNlbnQkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZhbHVlJC5waXBlKFxuICAgICAgICBtYXAodmFsdWUgPT5cbiAgICAgICAgICAgIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc2hhcmUsIDApLFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogMFxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgcGVyY2VudCA9IHRvU2lnbmFsKHRoaXMucGVyY2VudCQpXG5cbiAgICBzZWdtZW50KG5hbWU6IHN0cmluZywgZGlzdHJpYnV0aW9uOiBudW1iZXIgPSAxKTogUHJvZ3Jlc3NTZWdtZW50UmVmIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9XG4gICAgICAgICAgICB0aGlzLiNzZWdtZW50c1tuYW1lXSA/PyAodGhpcy4jc2VnbWVudHNbbmFtZV0gPSBuZXcgUHJvZ3Jlc3NTZWdtZW50UmVmKHRoaXMuI2lucHV0LCBuYW1lLCBkaXN0cmlidXRpb24pKVxuICAgICAgICBzZWdtZW50Lm5leHQoU0VHTUVOVF9SRUdJU1RFUilcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRcbiAgICB9XG5cbiAgICBjb25uZWN0KHN0YXRlOiBQcm9ncmVzc1N0YXRlLCBuYW1lOiBzdHJpbmcsIGRpc3RyaWJ1dGlvbj86IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudChuYW1lLCBkaXN0cmlidXRpb24pXG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucGVyY2VudCQuc3Vic2NyaWJlKHBlcmNlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQubmV4dCh7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI2luaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jc2VnbWVudHMpLnJlZHVjZSgocmVzLCBzZWdtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VnbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc1tzZWdtZW50Lm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWdtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogc2VnbWVudC5kaXN0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBzZWdtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByYXRpbzogMCxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9LCB7fSBhcyBQcm9ncmVzc1NlZ2VtZW50cylcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1NlZ21lbnRSZWYge1xuICAgIHJlYWRvbmx5ICNzdWJqZWN0OiBTdWJqZWN0PFByb2dyZXNzU2VnbWVudElucHV0PlxuXG4gICAgc2V0IGRpc3RyaWJ1dGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXN0cmlidXRpb24gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXN0cmlidXRpb24gPSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXh0KHRoaXMuI3ZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRpc3RyaWJ1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3RyaWJ1dGlvblxuICAgIH1cbiAgICAjZGlzdHJpYnV0aW9uPzogbnVtYmVyXG5cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZVxuICAgIH1cbiAgICAjdmFsdWU/OiBQcm9ncmVzc1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN1YmplY3Q6IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBkaXN0cmlidXRpb24/OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy4jc3ViamVjdCA9IHN1YmplY3RcbiAgICAgICAgdGhpcy4jZGlzdHJpYnV0aW9uID0gZGlzdHJpYnV0aW9uXG4gICAgfVxuXG4gICAgbmV4dChwcm9ncmVzczogUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25leHQocHJvZ3Jlc3MpXG4gICAgfVxuXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXh0KFNFR01FTlRfQ09NUExFVEUpXG4gICAgfVxuXG4gICAgI25leHQocHJvZ3Jlc3M6IFByb2dyZXNzKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlID0gcHJvZ3Jlc3NcbiAgICAgICAgdGhpcy4jc3ViamVjdC5uZXh0KHsgbmFtZTogdGhpcy5uYW1lLCBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLCBwcm9ncmVzcyB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiJdfQ==
@@ -1,27 +0,0 @@
1
- import { Directive, input } from "@angular/core";
2
- import { AbstractUiState, NOTSET } from "./abstract";
3
- import { UiState } from "./ui-state";
4
- import * as i0 from "@angular/core";
5
- export class ReadonlyDirective extends AbstractUiState {
6
- constructor() {
7
- super("readonly");
8
- this.input = input(NOTSET, { alias: "nuReadonly" });
9
- this.when = input(NOTSET, { alias: "nuReadonlyWhen" });
10
- }
11
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ReadonlyDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
12
- static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "18.2.6", type: ReadonlyDirective, isStandalone: true, selector: "[nuReadonly], [nuReadonlyWhen]", inputs: { input: { classPropertyName: "input", publicName: "nuReadonly", isSignal: true, isRequired: false, transformFunction: null }, when: { classPropertyName: "when", publicName: "nuReadonlyWhen", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.aria-readonly": "yes() ? 'true' : 'false'", "attr.readonly": "yes() ? '' : null" } }, providers: [UiState], exportAs: ["readonly"], usesInheritance: true, ngImport: i0 }); }
13
- }
14
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: ReadonlyDirective, decorators: [{
15
- type: Directive,
16
- args: [{
17
- selector: "[nuReadonly], [nuReadonlyWhen]",
18
- exportAs: "readonly",
19
- standalone: true,
20
- host: {
21
- "[attr.aria-readonly]": "yes() ? 'true' : 'false'",
22
- "[attr.readonly]": "yes() ? '' : null"
23
- },
24
- providers: [UiState]
25
- }]
26
- }], ctorParameters: () => [] });
27
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZG9ubHkuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvdWktc3RhdGUvcmVhZG9ubHkuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBQ3BELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxZQUFZLENBQUE7O0FBWXBDLE1BQU0sT0FBTyxpQkFBa0IsU0FBUSxlQUEyQjtJQUk5RDtRQUNJLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQTtRQUpaLFVBQUssR0FBRyxLQUFLLENBQUMsTUFBaUIsRUFBRSxFQUFFLEtBQUssRUFBRSxZQUFZLEVBQUUsQ0FBQyxDQUFBO1FBQ3pELFNBQUksR0FBRyxLQUFLLENBQUMsTUFBZ0IsRUFBRSxFQUFFLEtBQUssRUFBRSxnQkFBZ0IsRUFBRSxDQUFDLENBQUE7SUFJcEUsQ0FBQzs4R0FOUSxpQkFBaUI7a0dBQWpCLGlCQUFpQix1Y0FGZixDQUFDLE9BQU8sQ0FBQzs7MkZBRVgsaUJBQWlCO2tCQVY3QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLFFBQVEsRUFBRSxVQUFVO29CQUNwQixVQUFVLEVBQUUsSUFBSTtvQkFDaEIsSUFBSSxFQUFFO3dCQUNGLHNCQUFzQixFQUFFLDBCQUEwQjt3QkFDbEQsaUJBQWlCLEVBQUUsbUJBQW1CO3FCQUN6QztvQkFDRCxTQUFTLEVBQUUsQ0FBQyxPQUFPLENBQUM7aUJBQ3ZCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlLCBpbnB1dCB9IGZyb20gXCJAYW5ndWxhci9jb3JlXCJcblxuaW1wb3J0IHsgQWJzdHJhY3RVaVN0YXRlLCBOT1RTRVQgfSBmcm9tIFwiLi9hYnN0cmFjdFwiXG5pbXBvcnQgeyBVaVN0YXRlIH0gZnJvbSBcIi4vdWktc3RhdGVcIlxuXG5ARGlyZWN0aXZlKHtcbiAgICBzZWxlY3RvcjogXCJbbnVSZWFkb25seV0sIFtudVJlYWRvbmx5V2hlbl1cIixcbiAgICBleHBvcnRBczogXCJyZWFkb25seVwiLFxuICAgIHN0YW5kYWxvbmU6IHRydWUsXG4gICAgaG9zdDoge1xuICAgICAgICBcIlthdHRyLmFyaWEtcmVhZG9ubHldXCI6IFwieWVzKCkgPyAndHJ1ZScgOiAnZmFsc2UnXCIsXG4gICAgICAgIFwiW2F0dHIucmVhZG9ubHldXCI6IFwieWVzKCkgPyAnJyA6IG51bGxcIlxuICAgIH0sXG4gICAgcHJvdmlkZXJzOiBbVWlTdGF0ZV1cbn0pXG5leHBvcnQgY2xhc3MgUmVhZG9ubHlEaXJlY3RpdmUgZXh0ZW5kcyBBYnN0cmFjdFVpU3RhdGU8XCJyZWFkb25seVwiPiB7XG4gICAgcmVhZG9ubHkgaW5wdXQgPSBpbnB1dChOT1RTRVQgYXMgYm9vbGVhbiwgeyBhbGlhczogXCJudVJlYWRvbmx5XCIgfSlcbiAgICByZWFkb25seSB3aGVuID0gaW5wdXQoTk9UU0VUIGFzIHN0cmluZywgeyBhbGlhczogXCJudVJlYWRvbmx5V2hlblwiIH0pXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoXCJyZWFkb25seVwiKVxuICAgIH1cbn1cbiJdfQ==
@@ -1,308 +0,0 @@
1
- const COMPILE_CACHE = {};
2
- export function compile(selector) {
3
- return (COMPILE_CACHE[selector] ??= _compile(parse(selector)));
4
- }
5
- class Cursor {
6
- get ch() {
7
- return this.data[this.position];
8
- }
9
- constructor(data) {
10
- this.data = data;
11
- this.position = 0;
12
- }
13
- inc(value = 1) {
14
- this.position += value;
15
- return this;
16
- }
17
- eatWs() {
18
- let end = this.position;
19
- while (end < this.data.length && /[ \r\n\t]/.test(this.data[end])) {
20
- end++;
21
- }
22
- this.position = end;
23
- return this;
24
- }
25
- is(ch) {
26
- if (ch.length === 1) {
27
- return this.ch === ch;
28
- }
29
- const begin = this.position;
30
- const end = begin + ch.length;
31
- return this.data.substring(begin, end) === ch;
32
- }
33
- eof() {
34
- return this.position >= this.data.length;
35
- }
36
- set(position) {
37
- this.position = position;
38
- return this;
39
- }
40
- }
41
- /**
42
- * expression:
43
- * - "*": any
44
- * - "name without dot": top level: eg. "busy" or "disabled", this is equal to "busy.*"
45
- * - "name with dot": nested: eg. "busy.self" or "busy.loading"
46
- * - negate: "!busy", "!busy.*", "!busy.save"
47
- * - OR: "busy.* || !disabled.*"
48
- * - AND: "busy.* && !disabled.*"
49
- * - GROUP: "(busy || disabled) && !readonly"
50
- * - Shorted of multiple source of same base: "busy{load,save}", if one of load or save is true, the result is true
51
- */
52
- export function parse(selector) {
53
- const cursor = new Cursor(selector);
54
- const res = expression(cursor.eatWs());
55
- if (res == null) {
56
- throw new Error(`invalid selector: ${selector}`);
57
- }
58
- if (!cursor.eof()) {
59
- throw new Error(`unexpected charcter: ${selector[res.end]} at ${res.end}`);
60
- }
61
- return res;
62
- }
63
- function expression(cursor) {
64
- return binary(cursor) || leftExpr(cursor);
65
- }
66
- function leftExpr(cursor) {
67
- const begin = cursor.position;
68
- const left = unary(cursor) || group(cursor) || load(cursor);
69
- if (left != null) {
70
- return left;
71
- }
72
- cursor.set(begin);
73
- return null;
74
- }
75
- function group(cursor) {
76
- const begin = cursor.position;
77
- if (cursor.is("(")) {
78
- const expr = expression(cursor.inc().eatWs());
79
- if (cursor.eatWs().is(")")) {
80
- cursor.inc();
81
- return binary(cursor.eatWs(), expr) || expr;
82
- }
83
- }
84
- cursor.set(begin);
85
- return null;
86
- }
87
- function binary(cursor, left = null) {
88
- const begin = cursor.position;
89
- left = left ?? leftExpr(cursor);
90
- if (left != null) {
91
- cursor.eatWs();
92
- const result = and(left, cursor) || or(left, cursor);
93
- if (result != null) {
94
- return result;
95
- }
96
- }
97
- cursor.set(begin);
98
- return null;
99
- }
100
- function and(left, cursor) {
101
- if (cursor.is("&&")) {
102
- cursor.inc(2);
103
- const right = expression(cursor.eatWs());
104
- if (right == null) {
105
- return null;
106
- }
107
- return { type: 5 /* TokenType.And */, left, right, begin: left.begin, end: cursor.position };
108
- }
109
- return null;
110
- }
111
- function or(left, cursor) {
112
- if (cursor.is("||")) {
113
- cursor.inc(2);
114
- const right = expression(cursor.eatWs());
115
- if (right == null) {
116
- return null;
117
- }
118
- return { type: 4 /* TokenType.Or */, left, right, begin: left.begin, end: cursor.position };
119
- }
120
- return null;
121
- }
122
- function unary(cursor) {
123
- const begin = cursor.position;
124
- if (cursor.is("!")) {
125
- const expr = leftExpr(cursor.inc().eatWs());
126
- if (expr != null) {
127
- return { type: 3 /* TokenType.Negate */, value: expr, begin, end: cursor.position };
128
- }
129
- }
130
- cursor.set(begin);
131
- return null;
132
- }
133
- function load(cursor) {
134
- cursor.eatWs();
135
- const _any = any(cursor);
136
- if (_any != null) {
137
- return _any;
138
- }
139
- const base = name(cursor);
140
- if (base == null) {
141
- return null;
142
- }
143
- cursor.eatWs();
144
- const sub = loadSingle(cursor) || loadMulti(cursor);
145
- if (sub == null) {
146
- return base;
147
- }
148
- else if (Array.isArray(sub)) {
149
- return {
150
- type: 8 /* TokenType.MultiSubscript */,
151
- base,
152
- subscripts: sub,
153
- begin: base.begin,
154
- end: sub[sub.length - 1].end
155
- };
156
- }
157
- else {
158
- return { type: 7 /* TokenType.Subscript */, base, subscript: sub, begin: base.begin, end: sub.end };
159
- }
160
- }
161
- function loadSingle(cursor) {
162
- const begin = cursor.position;
163
- if (cursor.is(".")) {
164
- cursor.inc().eatWs();
165
- const prop = any(cursor) || name(cursor);
166
- if (prop != null) {
167
- return prop;
168
- }
169
- }
170
- cursor.set(begin);
171
- return null;
172
- }
173
- function loadMulti(cursor) {
174
- const begin = cursor.position;
175
- if (cursor.is("{")) {
176
- const names = [];
177
- let entry = null;
178
- cursor.inc().eatWs();
179
- while ((entry = name(cursor))) {
180
- names.push(entry);
181
- cursor.eatWs();
182
- if (cursor.is(",")) {
183
- cursor.inc();
184
- }
185
- cursor.eatWs();
186
- if (cursor.is("}")) {
187
- if (names.length === 0) {
188
- throw new Error("expected name");
189
- }
190
- cursor.inc();
191
- return names;
192
- }
193
- }
194
- }
195
- cursor.set(begin);
196
- return null;
197
- }
198
- function name(cursor) {
199
- const begin = cursor.position;
200
- while (!cursor.eof() && isNameCh(cursor.ch)) {
201
- cursor.inc();
202
- }
203
- if (cursor.position > begin) {
204
- return { type: 2 /* TokenType.Name */, begin, end: cursor.position, value: cursor.data.slice(begin, cursor.position) };
205
- }
206
- cursor.set(begin);
207
- return null;
208
- }
209
- function isNameCh(ch) {
210
- return /[^.,{}()!\s&|]/.test(ch);
211
- }
212
- function any(cursor) {
213
- if (cursor.is("*")) {
214
- const begin = cursor.position;
215
- cursor.inc();
216
- return { type: 1 /* TokenType.Any */, begin, end: cursor.position };
217
- }
218
- return null;
219
- }
220
- function _compile(ast, parent) {
221
- switch (ast.type) {
222
- case 1 /* TokenType.Any */:
223
- return compileAny(ast, parent);
224
- case 7 /* TokenType.Subscript */:
225
- return compileSubscript(ast, parent);
226
- case 8 /* TokenType.MultiSubscript */:
227
- return compileMultiSubscript(ast, parent);
228
- case 2 /* TokenType.Name */:
229
- return compileName(ast, parent);
230
- case 3 /* TokenType.Negate */:
231
- return compileNot(_compile(ast.value, parent));
232
- case 4 /* TokenType.Or */:
233
- return compileOr(_compile(ast.left, parent), _compile(ast.right, parent));
234
- case 5 /* TokenType.And */:
235
- return compileAnd(_compile(ast.left, parent), _compile(ast.right, parent));
236
- }
237
- return () => false;
238
- }
239
- function compileAny(ast, parent) {
240
- if (parent) {
241
- return v => {
242
- if (v[parent] == null) {
243
- return false;
244
- }
245
- return Object.values(v[parent]).some(v => v === true);
246
- };
247
- }
248
- else {
249
- return v => {
250
- for (const entry of Object.values(v)) {
251
- if (Object.values(entry).some(v => v === true)) {
252
- return true;
253
- }
254
- }
255
- return false;
256
- };
257
- }
258
- }
259
- function compileSubscript(ast, parent) {
260
- parent ??= ast.base.value;
261
- if (ast.subscript.type === 1 /* TokenType.Any */) {
262
- return compileAny(ast.subscript, parent);
263
- }
264
- if (ast.subscript.type === 2 /* TokenType.Name */) {
265
- return compileName(ast.subscript, parent);
266
- }
267
- return () => false;
268
- }
269
- function compileMultiSubscript(ast, parent) {
270
- parent ??= ast.base.value;
271
- const values = ast.subscripts.map(v => compileSubscript({ type: 7 /* TokenType.Subscript */, base: ast.base, subscript: v, begin: v.begin, end: v.end }, parent));
272
- if (values.length === 1) {
273
- return values[0];
274
- }
275
- else {
276
- let result = values[0];
277
- for (let i = 1; i < values.length; i++) {
278
- result = compileOr(result, values[i]);
279
- }
280
- return result;
281
- }
282
- }
283
- function compileName(ast, parent) {
284
- if (parent) {
285
- return v => {
286
- if (v[parent] == null) {
287
- return false;
288
- }
289
- return !!v[parent][ast.value];
290
- };
291
- }
292
- else {
293
- return v => {
294
- const many = v[ast.value];
295
- return many != null && Object.values(many).some(v => v === true);
296
- };
297
- }
298
- }
299
- function compileNot(compiled) {
300
- return v => !compiled(v);
301
- }
302
- function compileOr(left, right) {
303
- return v => left(v) || right(v);
304
- }
305
- function compileAnd(left, right) {
306
- return v => left(v) && right(v);
307
- }
308
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9zZWxlY3Rvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUEyREEsTUFBTSxhQUFhLEdBQXdDLEVBQUUsQ0FBQTtBQUM3RCxNQUFNLFVBQVUsT0FBTyxDQUFDLFFBQWdCO0lBQ3BDLE9BQU8sQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLEtBQUssUUFBUSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7QUFDbEUsQ0FBQztBQUVELE1BQU0sTUFBTTtJQUdSLElBQUksRUFBRTtRQUNGLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUE7SUFDbkMsQ0FBQztJQUVELFlBQXFCLElBQVk7UUFBWixTQUFJLEdBQUosSUFBSSxDQUFRO1FBTmpDLGFBQVEsR0FBVyxDQUFDLENBQUE7SUFNZ0IsQ0FBQztJQUVyQyxHQUFHLENBQUMsUUFBZ0IsQ0FBQztRQUNqQixJQUFJLENBQUMsUUFBUSxJQUFJLEtBQUssQ0FBQTtRQUN0QixPQUFPLElBQUksQ0FBQTtJQUNmLENBQUM7SUFFRCxLQUFLO1FBQ0QsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQTtRQUN2QixPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBSSxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDO1lBQ2hFLEdBQUcsRUFBRSxDQUFBO1FBQ1QsQ0FBQztRQUNELElBQUksQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFBO1FBQ25CLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztJQUVELEVBQUUsQ0FBQyxFQUFVO1FBQ1QsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1lB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TCxDQUFDO0FBQ0wsQ0FBQztBQUVELFNBQVMsVUFBVSxDQUFDLFFBQTBCO0lBQzFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUM1QixDQUFDO0FBRUQsU0FBUyxTQUFTLENBQUMsSUFBc0IsRUFBRSxLQUF1QjtJQUM5RCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDO0FBRUQsU0FBUyxVQUFVLENBQUMsSUFBc0IsRUFBRSxLQUF1QjtJQUMvRCxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQTtBQUNuQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBVaVN0YXRlRGV0YWlscyB9IGZyb20gXCIuL3VpLXN0YXRlXCJcblxuZXhwb3J0IHR5cGUgQ29tcGlsZWRTZWxlY3RvciA9IChzdGF0ZTogVWlTdGF0ZURldGFpbHMpID0+IGJvb2xlYW5cblxuZXhwb3J0IGNvbnN0IGVudW0gVG9rZW5UeXBlIHtcbiAgICBBbnkgPSAxLFxuICAgIE5hbWUgPSAyLFxuICAgIE5lZ2F0ZSA9IDMsXG4gICAgT3IgPSA0LFxuICAgIEFuZCA9IDUsXG4gICAgU3Vic2NyaXB0ID0gNyxcbiAgICBNdWx0aVN1YnNjcmlwdCA9IDhcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RCYXNlIHtcbiAgICBiZWdpbjogbnVtYmVyXG4gICAgZW5kOiBudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RBbnkgZXh0ZW5kcyBBc3RCYXNlIHtcbiAgICB0eXBlOiBUb2tlblR5cGUuQW55XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0TmFtZSBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5OYW1lXG4gICAgdmFsdWU6IHN0cmluZ1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEFzdE5lZ2F0ZSBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5OZWdhdGVcbiAgICB2YWx1ZTogU2VsZWN0b3JBc3Rcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RPciBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5PclxuICAgIGxlZnQ6IFNlbGVjdG9yQXN0XG4gICAgcmlnaHQ6IFNlbGVjdG9yQXN0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0QW5kIGV4dGVuZHMgQXN0QmFzZSB7XG4gICAgdHlwZTogVG9rZW5UeXBlLkFuZFxuICAgIGxlZnQ6IFNlbGVjdG9yQXN0XG4gICAgcmlnaHQ6IFNlbGVjdG9yQXN0XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQXN0U3Vic2NyaXB0IGV4dGVuZHMgQXN0QmFzZSB7XG4gICAgdHlwZTogVG9rZW5UeXBlLlN1YnNjcmlwdFxuICAgIGJhc2U6IEFzdE5hbWVcbiAgICBzdWJzY3JpcHQ6IEFzdEFueSB8IEFzdE5hbWVcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBc3RNdWx0aVN1YnNjcmlwdCBleHRlbmRzIEFzdEJhc2Uge1xuICAgIHR5cGU6IFRva2VuVHlwZS5NdWx0aVN1YnNjcmlwdFxuICAgIGJhc2U6IEFzdE5hbWVcbiAgICBzdWJzY3JpcHRzOiBBc3ROYW1lW11cbn1cblxuZXhwb3J0IHR5cGUgU2VsZWN0b3JBc3QgPSBBc3RBbnkgfCBBc3ROYW1lIHwgQXN0TmVnYXRlIHwgQXN0T3IgfCBBc3RBbmQgfCBBc3RTdWJzY3JpcHQgfCBBc3RNdWx0aVN1YnNjcmlwdFxuXG5jb25zdCBDT01QSUxFX0NBQ0hFOiB7IFtrZXk6IHN0cmluZ106IENvbXBpbGVkU2VsZWN0b3IgfSA9IHt9XG5leHBvcnQgZnVuY3Rpb24gY29tcGlsZShzZWxlY3Rvcjogc3RyaW5nKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcmV0dXJuIChDT01QSUxFX0NBQ0hFW3NlbGVjdG9yXSA/Pz0gX2NvbXBpbGUocGFyc2Uoc2VsZWN0b3IpKSlcbn1cblxuY2xhc3MgQ3Vyc29yIHtcbiAgICBwb3NpdGlvbjogbnVtYmVyID0gMFxuXG4gICAgZ2V0IGNoKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5kYXRhW3RoaXMucG9zaXRpb25dXG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IocmVhZG9ubHkgZGF0YTogc3RyaW5nKSB7fVxuXG4gICAgaW5jKHZhbHVlOiBudW1iZXIgPSAxKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gKz0gdmFsdWVcbiAgICAgICAgcmV0dXJuIHRoaXNcbiAgICB9XG5cbiAgICBlYXRXcygpIHtcbiAgICAgICAgbGV0IGVuZCA9IHRoaXMucG9zaXRpb25cbiAgICAgICAgd2hpbGUgKGVuZCA8IHRoaXMuZGF0YS5sZW5ndGggJiYgL1sgXFxyXFxuXFx0XS8udGVzdCh0aGlzLmRhdGFbZW5kXSkpIHtcbiAgICAgICAgICAgIGVuZCsrXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGVuZFxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cblxuICAgIGlzKGNoOiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKGNoLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2ggPT09IGNoXG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYmVnaW4gPSB0aGlzLnBvc2l0aW9uXG4gICAgICAgIGNvbnN0IGVuZCA9IGJlZ2luICsgY2gubGVuZ3RoXG4gICAgICAgIHJldHVybiB0aGlzLmRhdGEuc3Vic3RyaW5nKGJlZ2luLCBlbmQpID09PSBjaFxuICAgIH1cblxuICAgIGVvZigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucG9zaXRpb24gPj0gdGhpcy5kYXRhLmxlbmd0aFxuICAgIH1cblxuICAgIHNldChwb3NpdGlvbjogbnVtYmVyKSB7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cblxuLyoqXG4gKiBleHByZXNzaW9uOlxuICogIC0gXCIqXCI6IGFueVxuICogIC0gXCJuYW1lIHdpdGhvdXQgZG90XCI6IHRvcCBsZXZlbDogZWcuIFwiYnVzeVwiIG9yIFwiZGlzYWJsZWRcIiwgdGhpcyBpcyBlcXVhbCB0byBcImJ1c3kuKlwiXG4gKiAgLSBcIm5hbWUgd2l0aCBkb3RcIjogbmVzdGVkOiBlZy4gXCJidXN5LnNlbGZcIiBvciBcImJ1c3kubG9hZGluZ1wiXG4gKiAgLSBuZWdhdGU6IFwiIWJ1c3lcIiwgXCIhYnVzeS4qXCIsIFwiIWJ1c3kuc2F2ZVwiXG4gKiAgLSBPUjogXCJidXN5LiogfHwgIWRpc2FibGVkLipcIlxuICogIC0gQU5EOiBcImJ1c3kuKiAmJiAhZGlzYWJsZWQuKlwiXG4gKiAgLSBHUk9VUDogXCIoYnVzeSB8fCBkaXNhYmxlZCkgJiYgIXJlYWRvbmx5XCJcbiAqICAtIFNob3J0ZWQgb2YgbXVsdGlwbGUgc291cmNlIG9mIHNhbWUgYmFzZTogXCJidXN5e2xvYWQsc2F2ZX1cIiwgaWYgb25lIG9mIGxvYWQgb3Igc2F2ZSBpcyB0cnVlLCB0aGUgcmVzdWx0IGlzIHRydWVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlKHNlbGVjdG9yOiBzdHJpbmcpOiBTZWxlY3RvckFzdCB7XG4gICAgY29uc3QgY3Vyc29yID0gbmV3IEN1cnNvcihzZWxlY3RvcilcbiAgICBjb25zdCByZXMgPSBleHByZXNzaW9uKGN1cnNvci5lYXRXcygpKVxuICAgIGlmIChyZXMgPT0gbnVsbCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGludmFsaWQgc2VsZWN0b3I6ICR7c2VsZWN0b3J9YClcbiAgICB9XG5cbiAgICBpZiAoIWN1cnNvci5lb2YoKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHVuZXhwZWN0ZWQgY2hhcmN0ZXI6ICR7c2VsZWN0b3JbcmVzLmVuZF19IGF0ICR7cmVzLmVuZH1gKVxuICAgIH1cbiAgICByZXR1cm4gcmVzXG59XG5cbmZ1bmN0aW9uIGV4cHJlc3Npb24oY3Vyc29yOiBDdXJzb3IpIHtcbiAgICByZXR1cm4gYmluYXJ5KGN1cnNvcikgfHwgbGVmdEV4cHIoY3Vyc29yKVxufVxuXG5mdW5jdGlvbiBsZWZ0RXhwcihjdXJzb3I6IEN1cnNvcikge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgY29uc3QgbGVmdCA9IHVuYXJ5KGN1cnNvcikgfHwgZ3JvdXAoY3Vyc29yKSB8fCBsb2FkKGN1cnNvcilcbiAgICBpZiAobGVmdCAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBsZWZ0XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gZ3JvdXAoY3Vyc29yOiBDdXJzb3IpOiBTZWxlY3RvckFzdCB8IG51bGwge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgaWYgKGN1cnNvci5pcyhcIihcIikpIHtcbiAgICAgICAgY29uc3QgZXhwciA9IGV4cHJlc3Npb24oY3Vyc29yLmluYygpLmVhdFdzKCkpXG4gICAgICAgIGlmIChjdXJzb3IuZWF0V3MoKS5pcyhcIilcIikpIHtcbiAgICAgICAgICAgIGN1cnNvci5pbmMoKVxuICAgICAgICAgICAgcmV0dXJuIGJpbmFyeShjdXJzb3IuZWF0V3MoKSwgZXhwcikgfHwgZXhwclxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gYmluYXJ5KGN1cnNvcjogQ3Vyc29yLCBsZWZ0OiBTZWxlY3RvckFzdCB8IG51bGwgPSBudWxsKTogU2VsZWN0b3JBc3QgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIGxlZnQgPSBsZWZ0ID8/IGxlZnRFeHByKGN1cnNvcilcbiAgICBpZiAobGVmdCAhPSBudWxsKSB7XG4gICAgICAgIGN1cnNvci5lYXRXcygpXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFuZChsZWZ0LCBjdXJzb3IpIHx8IG9yKGxlZnQsIGN1cnNvcilcbiAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3Vyc29yLnNldChiZWdpbilcbiAgICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBhbmQobGVmdDogU2VsZWN0b3JBc3QsIGN1cnNvcjogQ3Vyc29yKTogQXN0QW5kIHwgbnVsbCB7XG4gICAgaWYgKGN1cnNvci5pcyhcIiYmXCIpKSB7XG4gICAgICAgIGN1cnNvci5pbmMoMilcbiAgICAgICAgY29uc3QgcmlnaHQgPSBleHByZXNzaW9uKGN1cnNvci5lYXRXcygpKVxuICAgICAgICBpZiAocmlnaHQgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuQW5kLCBsZWZ0LCByaWdodCwgYmVnaW46IGxlZnQuYmVnaW4sIGVuZDogY3Vyc29yLnBvc2l0aW9uIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gb3IobGVmdDogU2VsZWN0b3JBc3QsIGN1cnNvcjogQ3Vyc29yKTogQXN0T3IgfCBudWxsIHtcbiAgICBpZiAoY3Vyc29yLmlzKFwifHxcIikpIHtcbiAgICAgICAgY3Vyc29yLmluYygyKVxuICAgICAgICBjb25zdCByaWdodCA9IGV4cHJlc3Npb24oY3Vyc29yLmVhdFdzKCkpXG4gICAgICAgIGlmIChyaWdodCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRva2VuVHlwZS5PciwgbGVmdCwgcmlnaHQsIGJlZ2luOiBsZWZ0LmJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIHVuYXJ5KGN1cnNvcjogQ3Vyc29yKTogU2VsZWN0b3JBc3QgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIGlmIChjdXJzb3IuaXMoXCIhXCIpKSB7XG4gICAgICAgIGNvbnN0IGV4cHIgPSBsZWZ0RXhwcihjdXJzb3IuaW5jKCkuZWF0V3MoKSlcbiAgICAgICAgaWYgKGV4cHIgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHsgdHlwZTogVG9rZW5UeXBlLk5lZ2F0ZSwgdmFsdWU6IGV4cHIsIGJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3Vyc29yLnNldChiZWdpbilcbiAgICByZXR1cm4gbnVsbFxufVxuXG5mdW5jdGlvbiBsb2FkKGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgQXN0TmFtZSB8IEFzdFN1YnNjcmlwdCB8IEFzdE11bHRpU3Vic2NyaXB0IHwgbnVsbCB7XG4gICAgY3Vyc29yLmVhdFdzKClcbiAgICBjb25zdCBfYW55ID0gYW55KGN1cnNvcilcbiAgICBpZiAoX2FueSAhPSBudWxsKSB7XG4gICAgICAgIHJldHVybiBfYW55XG4gICAgfVxuXG4gICAgY29uc3QgYmFzZSA9IG5hbWUoY3Vyc29yKVxuICAgIGlmIChiYXNlID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICBjdXJzb3IuZWF0V3MoKVxuICAgIGNvbnN0IHN1YiA9IGxvYWRTaW5nbGUoY3Vyc29yKSB8fCBsb2FkTXVsdGkoY3Vyc29yKVxuICAgIGlmIChzdWIgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gYmFzZVxuICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzdWIpKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUb2tlblR5cGUuTXVsdGlTdWJzY3JpcHQsXG4gICAgICAgICAgICBiYXNlLFxuICAgICAgICAgICAgc3Vic2NyaXB0czogc3ViLFxuICAgICAgICAgICAgYmVnaW46IGJhc2UuYmVnaW4sXG4gICAgICAgICAgICBlbmQ6IHN1YltzdWIubGVuZ3RoIC0gMV0uZW5kXG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuU3Vic2NyaXB0LCBiYXNlLCBzdWJzY3JpcHQ6IHN1YiwgYmVnaW46IGJhc2UuYmVnaW4sIGVuZDogc3ViLmVuZCB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsb2FkU2luZ2xlKGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgQXN0TmFtZSB8IG51bGwge1xuICAgIGNvbnN0IGJlZ2luID0gY3Vyc29yLnBvc2l0aW9uXG4gICAgaWYgKGN1cnNvci5pcyhcIi5cIikpIHtcbiAgICAgICAgY3Vyc29yLmluYygpLmVhdFdzKClcbiAgICAgICAgY29uc3QgcHJvcCA9IGFueShjdXJzb3IpIHx8IG5hbWUoY3Vyc29yKVxuICAgICAgICBpZiAocHJvcCAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gcHJvcFxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbG9hZE11bHRpKGN1cnNvcjogQ3Vyc29yKTogQXN0TmFtZVtdIHwgbnVsbCB7XG4gICAgY29uc3QgYmVnaW4gPSBjdXJzb3IucG9zaXRpb25cbiAgICBpZiAoY3Vyc29yLmlzKFwie1wiKSkge1xuICAgICAgICBjb25zdCBuYW1lcyA9IFtdIGFzIEFzdE5hbWVbXVxuICAgICAgICBsZXQgZW50cnk6IEFzdE5hbWUgfCBudWxsID0gbnVsbFxuXG4gICAgICAgIGN1cnNvci5pbmMoKS5lYXRXcygpXG4gICAgICAgIHdoaWxlICgoZW50cnkgPSBuYW1lKGN1cnNvcikpKSB7XG4gICAgICAgICAgICBuYW1lcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgY3Vyc29yLmVhdFdzKClcblxuICAgICAgICAgICAgaWYgKGN1cnNvci5pcyhcIixcIikpIHtcbiAgICAgICAgICAgICAgICBjdXJzb3IuaW5jKClcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY3Vyc29yLmVhdFdzKClcbiAgICAgICAgICAgIGlmIChjdXJzb3IuaXMoXCJ9XCIpKSB7XG4gICAgICAgICAgICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJleHBlY3RlZCBuYW1lXCIpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGN1cnNvci5pbmMoKVxuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lc1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGN1cnNvci5zZXQoYmVnaW4pXG4gICAgcmV0dXJuIG51bGxcbn1cblxuZnVuY3Rpb24gbmFtZShjdXJzb3I6IEN1cnNvcik6IEFzdE5hbWUgfCBudWxsIHtcbiAgICBjb25zdCBiZWdpbiA9IGN1cnNvci5wb3NpdGlvblxuICAgIHdoaWxlICghY3Vyc29yLmVvZigpICYmIGlzTmFtZUNoKGN1cnNvci5jaCkpIHtcbiAgICAgICAgY3Vyc29yLmluYygpXG4gICAgfVxuICAgIGlmIChjdXJzb3IucG9zaXRpb24gPiBiZWdpbikge1xuICAgICAgICByZXR1cm4geyB0eXBlOiBUb2tlblR5cGUuTmFtZSwgYmVnaW4sIGVuZDogY3Vyc29yLnBvc2l0aW9uLCB2YWx1ZTogY3Vyc29yLmRhdGEuc2xpY2UoYmVnaW4sIGN1cnNvci5wb3NpdGlvbikgfVxuICAgIH1cbiAgICBjdXJzb3Iuc2V0KGJlZ2luKVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIGlzTmFtZUNoKGNoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL1teLix7fSgpIVxccyZ8XS8udGVzdChjaClcbn1cblxuZnVuY3Rpb24gYW55KGN1cnNvcjogQ3Vyc29yKTogQXN0QW55IHwgbnVsbCB7XG4gICAgaWYgKGN1cnNvci5pcyhcIipcIikpIHtcbiAgICAgICAgY29uc3QgYmVnaW4gPSBjdXJzb3IucG9zaXRpb25cbiAgICAgICAgY3Vyc29yLmluYygpXG4gICAgICAgIHJldHVybiB7IHR5cGU6IFRva2VuVHlwZS5BbnksIGJlZ2luLCBlbmQ6IGN1cnNvci5wb3NpdGlvbiB9XG4gICAgfVxuICAgIHJldHVybiBudWxsXG59XG5cbmZ1bmN0aW9uIF9jb21waWxlKGFzdDogU2VsZWN0b3JBc3QsIHBhcmVudD86IHN0cmluZyk6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHN3aXRjaCAoYXN0LnR5cGUpIHtcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuQW55OlxuICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVBbnkoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLlN1YnNjcmlwdDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlU3Vic2NyaXB0KGFzdCwgcGFyZW50KVxuICAgICAgICBjYXNlIFRva2VuVHlwZS5NdWx0aVN1YnNjcmlwdDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlTXVsdGlTdWJzY3JpcHQoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLk5hbWU6XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU5hbWUoYXN0LCBwYXJlbnQpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLk5lZ2F0ZTpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlTm90KF9jb21waWxlKGFzdC52YWx1ZSwgcGFyZW50KSlcbiAgICAgICAgY2FzZSBUb2tlblR5cGUuT3I6XG4gICAgICAgICAgICByZXR1cm4gY29tcGlsZU9yKF9jb21waWxlKGFzdC5sZWZ0LCBwYXJlbnQpLCBfY29tcGlsZShhc3QucmlnaHQsIHBhcmVudCkpXG4gICAgICAgIGNhc2UgVG9rZW5UeXBlLkFuZDpcbiAgICAgICAgICAgIHJldHVybiBjb21waWxlQW5kKF9jb21waWxlKGFzdC5sZWZ0LCBwYXJlbnQpLCBfY29tcGlsZShhc3QucmlnaHQsIHBhcmVudCkpXG4gICAgfVxuICAgIHJldHVybiAoKSA9PiBmYWxzZVxufVxuXG5mdW5jdGlvbiBjb21waWxlQW55KGFzdDogQXN0QW55LCBwYXJlbnQ/OiBzdHJpbmcpOiBDb21waWxlZFNlbGVjdG9yIHtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIHJldHVybiB2ID0+IHtcbiAgICAgICAgICAgIGlmICh2W3BhcmVudF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModltwYXJlbnRdKS5zb21lKHYgPT4gdiA9PT0gdHJ1ZSlcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB2ID0+IHtcbiAgICAgICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgT2JqZWN0LnZhbHVlcyh2KSkge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QudmFsdWVzKGVudHJ5KS5zb21lKHYgPT4gdiA9PT0gdHJ1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2VcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZnVuY3Rpb24gY29tcGlsZVN1YnNjcmlwdChhc3Q6IEFzdFN1YnNjcmlwdCwgcGFyZW50Pzogc3RyaW5nKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcGFyZW50ID8/PSBhc3QuYmFzZS52YWx1ZVxuXG4gICAgaWYgKGFzdC5zdWJzY3JpcHQudHlwZSA9PT0gVG9rZW5UeXBlLkFueSkge1xuICAgICAgICByZXR1cm4gY29tcGlsZUFueShhc3Quc3Vic2NyaXB0LCBwYXJlbnQpXG4gICAgfVxuICAgIGlmIChhc3Quc3Vic2NyaXB0LnR5cGUgPT09IFRva2VuVHlwZS5OYW1lKSB7XG4gICAgICAgIHJldHVybiBjb21waWxlTmFtZShhc3Quc3Vic2NyaXB0LCBwYXJlbnQpXG4gICAgfVxuXG4gICAgcmV0dXJuICgpID0+IGZhbHNlXG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVNdWx0aVN1YnNjcmlwdChhc3Q6IEFzdE11bHRpU3Vic2NyaXB0LCBwYXJlbnQ/OiBzdHJpbmcpOiBDb21waWxlZFNlbGVjdG9yIHtcbiAgICBwYXJlbnQgPz89IGFzdC5iYXNlLnZhbHVlXG4gICAgY29uc3QgdmFsdWVzID0gYXN0LnN1YnNjcmlwdHMubWFwKHYgPT5cbiAgICAgICAgY29tcGlsZVN1YnNjcmlwdChcbiAgICAgICAgICAgIHsgdHlwZTogVG9rZW5UeXBlLlN1YnNjcmlwdCwgYmFzZTogYXN0LmJhc2UsIHN1YnNjcmlwdDogdiwgYmVnaW46IHYuYmVnaW4sIGVuZDogdi5lbmQgfSxcbiAgICAgICAgICAgIHBhcmVudFxuICAgICAgICApXG4gICAgKVxuXG4gICAgaWYgKHZhbHVlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlc1swXVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB2YWx1ZXNbMF1cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBpbGVPcihyZXN1bHQsIHZhbHVlc1tpXSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21waWxlTmFtZShhc3Q6IEFzdE5hbWUsIHBhcmVudD86IHN0cmluZyk6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHYgPT4ge1xuICAgICAgICAgICAgaWYgKHZbcGFyZW50XSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gISF2W3BhcmVudF1bYXN0LnZhbHVlXVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHYgPT4ge1xuICAgICAgICAgICAgY29uc3QgbWFueSA9IHZbYXN0LnZhbHVlXVxuICAgICAgICAgICAgcmV0dXJuIG1hbnkgIT0gbnVsbCAmJiBPYmplY3QudmFsdWVzKG1hbnkpLnNvbWUodiA9PiB2ID09PSB0cnVlKVxuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjb21waWxlTm90KGNvbXBpbGVkOiBDb21waWxlZFNlbGVjdG9yKTogQ29tcGlsZWRTZWxlY3RvciB7XG4gICAgcmV0dXJuIHYgPT4gIWNvbXBpbGVkKHYpXG59XG5cbmZ1bmN0aW9uIGNvbXBpbGVPcihsZWZ0OiBDb21waWxlZFNlbGVjdG9yLCByaWdodDogQ29tcGlsZWRTZWxlY3Rvcik6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHJldHVybiB2ID0+IGxlZnQodikgfHwgcmlnaHQodilcbn1cblxuZnVuY3Rpb24gY29tcGlsZUFuZChsZWZ0OiBDb21waWxlZFNlbGVjdG9yLCByaWdodDogQ29tcGlsZWRTZWxlY3Rvcik6IENvbXBpbGVkU2VsZWN0b3Ige1xuICAgIHJldHVybiB2ID0+IGxlZnQodikgJiYgcmlnaHQodilcbn1cbiJdfQ==