@ngutil/aria 0.0.69 → 0.0.71

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.
@@ -0,0 +1,279 @@
1
+ import { DOCUMENT } from "@angular/common";
2
+ import { inject, Injectable, NgZone } from "@angular/core";
3
+ import { takeUntilDestroyed } from "@angular/core/rxjs-interop";
4
+ import { combineLatest, connect, debounceTime, filter, finalize, map, merge, Observable, scan, share, startWith, Subject, switchMap, takeWhile, tap } from "rxjs";
5
+ import { __zone_symbol__, coerceElement, isFalsy, isTruthy } from "@ngutil/common";
6
+ import { Listeners } from "./gesture-event";
7
+ import * as i0 from "@angular/core";
8
+ const ADD_EVENT_LISTENER = __zone_symbol__("addEventListener");
9
+ const REMOVE_EVENT_LISTENER = __zone_symbol__("removeEventListener");
10
+ const DISPATCH_EVENT = __zone_symbol__("dispatchEvent");
11
+ const SCROLL_LISTENER_OPTIONS = { passive: true };
12
+ export class GestureService {
13
+ #zone = inject(NgZone);
14
+ #document = inject(DOCUMENT);
15
+ #watchers = [];
16
+ #trigger = new Subject();
17
+ #moving = merge(...Object.keys(Listeners)
18
+ .filter(name => Listeners[name].phase === "moving" /* GesturePhase.Moving */)
19
+ .map(name => this.#listen(name, Listeners[name]))).pipe(share());
20
+ #end = merge(...Object.keys(Listeners)
21
+ .filter(name => Listeners[name].phase === "end" /* GesturePhase.End */)
22
+ .map(name => this.#listen(name, Listeners[name]))).pipe(share());
23
+ #eventStream = merge(this.#moving, this.#end).pipe(share());
24
+ #begin = new Observable((dst) => {
25
+ let pointerType;
26
+ return this.#trigger
27
+ .pipe(filter(event => {
28
+ if (pointerType == null) {
29
+ pointerType = event.pointerType;
30
+ }
31
+ return event.pointerType === pointerType;
32
+ }), connect(events => merge(events,
33
+ // reset pointerType on end, after 200ms, because touchend is maybe followed by a mouse event
34
+ this.#end.pipe(debounceTime(200), tap(() => {
35
+ pointerType = undefined;
36
+ this.#enableTouchAction();
37
+ }), filter(() => false)))),
38
+ // Select active watchers
39
+ map(event => {
40
+ const eventTarget = event.target;
41
+ let includeScrollDistance = false;
42
+ const gestures = this.#watchers
43
+ .filter(({ gesture, el }) => gesture.filterByEvent(event) &&
44
+ (el === eventTarget || ("contains" in el && el.contains(eventTarget))))
45
+ .reduce((gestures, { gesture }) => {
46
+ if (!gestures.has(gesture)) {
47
+ includeScrollDistance = includeScrollDistance || gesture.includeScrollDistance;
48
+ gestures.set(gesture, 0 /* GestureCaptureState.Unchecked */);
49
+ }
50
+ return gestures;
51
+ }, new Map());
52
+ return { startEvent: event, gestures, includeScrollDistance };
53
+ }), filter(({ gestures }) => gestures.size > 0), tap(this.#disableTouchAction)
54
+ // finalize(() => console.log("FINALIZE BEGIN"))
55
+ )
56
+ .subscribe(dst);
57
+ });
58
+ #gesture = this.#begin.pipe(switchMap(({ startEvent, gestures, includeScrollDistance }) => {
59
+ const pointerType = startEvent.pointerType;
60
+ const startAt = startEvent.origin.timeStamp;
61
+ const dispatchEvent = startEvent.target[DISPATCH_EVENT].bind(startEvent.target);
62
+ const eventStreamInit = this.#eventStream.pipe(startWith(startEvent), filter(event => event.pointerType === pointerType));
63
+ const eventStreamSource = !includeScrollDistance
64
+ ? eventStreamInit
65
+ : combineLatest([
66
+ eventStreamInit,
67
+ this.#scrollDistance(startEvent.target).pipe(startWith({ x: 0, y: 0 }))
68
+ ]).pipe(map(([src, distance]) => {
69
+ ;
70
+ src.scrollDistance = distance;
71
+ return src;
72
+ }));
73
+ const eventStream = eventStreamSource.pipe(scan((state, curr) => updatePointers({
74
+ ...state,
75
+ ...curr,
76
+ elapsed: curr.origin.timeStamp - startAt
77
+ }), startEvent), takeWhile(event => event.phase !== "end" /* GesturePhase.End */, true),
78
+ // finalize(() => console.log("FINALIZE WATCH")),
79
+ share());
80
+ const captureState = eventStream.pipe(connect(src => {
81
+ const state = { events: [], gestures, includeScrollDistance };
82
+ return merge(src.pipe(tap(event => state.events.push(event))), ...Array.from(gestures.keys()).map(gesture => gesture.capture(src.pipe(filter(gesture.filterByEvent))).pipe(takeWhile(result => result !== 2 /* GestureCaptureState.Skip */, true), tap(result => gestures.set(gesture, result))))).pipe(map(() => state));
83
+ })
84
+ // ,finalize(() => console.log("FINALIZE CAPTURE"))
85
+ );
86
+ const selectGesture = captureState.pipe(map(state => {
87
+ const partitions = {};
88
+ for (const [gesture, captureState] of state.gestures) {
89
+ const partition = (partitions[captureState] ??= []);
90
+ partition.push(gesture);
91
+ }
92
+ if (partitions[4 /* GestureCaptureState.Instant */] != null) {
93
+ return {
94
+ gesture: partitions[4 /* GestureCaptureState.Instant */].sort(sortByPripority)[0],
95
+ events: state.events
96
+ };
97
+ }
98
+ // while not all gestures return from Gesture.capture
99
+ if (partitions[0 /* GestureCaptureState.Unchecked */] != null) {
100
+ return null;
101
+ }
102
+ // while has pending, the capture is continued
103
+ if (partitions[1 /* GestureCaptureState.Pending */] != null) {
104
+ return null;
105
+ }
106
+ // no pendig & has maybe
107
+ if (partitions[3 /* GestureCaptureState.Maybe */] != null) {
108
+ return {
109
+ gesture: partitions[3 /* GestureCaptureState.Maybe */].sort(sortByPripority)[0],
110
+ events: state.events
111
+ };
112
+ }
113
+ // no pending & no maybe & no terminate
114
+ // so, nothign matched
115
+ return { events: state.events };
116
+ }), takeWhile(isFalsy, true), filter(isTruthy), takeWhile(v => v.gesture != null, false)
117
+ // finalize(() => console.log("FINALIZE SELECT"))
118
+ );
119
+ return selectGesture.pipe(switchMap(({ events, gesture }) => gesture.handle(eventStream.pipe(startWith(...events), filter(gesture.filterByEvent))).pipe(takeWhile(v => v.phase !== "end" /* GesturePhase.End */, true), tap((e) => dispatchEvent(new CustomEvent(e.type, { detail: e, bubbles: true, cancelable: true })))
120
+ // finalize(() => console.log("GESTURE FINALIZE")),
121
+ )),
122
+ // finalize(() => console.log("FINALIZE RESULT")),
123
+ finalize(this.#enableTouchAction));
124
+ }), share());
125
+ constructor() {
126
+ const triggers = merge(...Object.keys(Listeners)
127
+ .filter(name => Listeners[name].phase === "start" /* GesturePhase.Start */)
128
+ .map(name => this.#listen(name, Listeners[name])));
129
+ triggers.pipe(takeUntilDestroyed()).subscribe(this.#trigger);
130
+ }
131
+ listen(el, ...gestures) {
132
+ return new Observable((dst) => this.#zone.runOutsideAngular(() => {
133
+ const element = coerceElement(el);
134
+ const next = dst.next.bind(dst);
135
+ for (const gesture of gestures) {
136
+ element[ADD_EVENT_LISTENER](gesture.name, next);
137
+ dst.add(element[REMOVE_EVENT_LISTENER].bind(element, gesture.name, next));
138
+ }
139
+ dst.add(this.watch(element, ...gestures).subscribe());
140
+ }));
141
+ }
142
+ watch(el, ...gestures) {
143
+ return new Observable((dst) => this.#zone.runOutsideAngular(() => {
144
+ const element = coerceElement(el);
145
+ const watchers = gestures.map(gesture => {
146
+ return { gesture, el: element };
147
+ });
148
+ this.#add(watchers);
149
+ dst.add(this.#gesture.subscribe(dst));
150
+ return () => {
151
+ this.#remove(watchers);
152
+ };
153
+ }));
154
+ }
155
+ #add(watchers) {
156
+ this.#watchers = this.#watchers.concat(watchers);
157
+ }
158
+ #remove(watchers) {
159
+ this.#watchers = this.#watchers.filter(v => !watchers.includes(v));
160
+ }
161
+ #listen(name, config) {
162
+ const { phase, pointerType, options } = config;
163
+ const toResult = phase === "start" /* GesturePhase.Start */
164
+ ? (origin) => ({
165
+ origin,
166
+ phase,
167
+ pointerType,
168
+ target: origin.target
169
+ })
170
+ : (origin) => {
171
+ if (origin.cancelable) {
172
+ origin.preventDefault();
173
+ }
174
+ return { origin, phase, pointerType };
175
+ };
176
+ return new Observable((dst) => this.#zone.runOutsideAngular(() => {
177
+ const listener = (origin) => {
178
+ if (origin.defaultPrevented) {
179
+ return;
180
+ }
181
+ dst.next(toResult(origin));
182
+ };
183
+ // console.log("addEventListener", name)
184
+ this.#document[ADD_EVENT_LISTENER](name, listener, options);
185
+ return () => {
186
+ // console.log("removeEventListener", name)
187
+ this.#document[REMOVE_EVENT_LISTENER](name, listener, options);
188
+ };
189
+ }));
190
+ }
191
+ #scrollDistance(element) {
192
+ const scrollPosition = () => {
193
+ let x = 0;
194
+ let y = 0;
195
+ let p = element;
196
+ do {
197
+ x += p.scrollLeft ?? 0;
198
+ y += p.scrollTop ?? 0;
199
+ p = p.parentNode;
200
+ } while (p != null);
201
+ return { x, y };
202
+ };
203
+ return new Observable((dst) => this.#zone.runOutsideAngular(() => {
204
+ const initial = scrollPosition();
205
+ const listener = () => {
206
+ const current = scrollPosition();
207
+ dst.next({ x: current.x - initial.x, y: current.y - initial.y });
208
+ };
209
+ this.#document[ADD_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
210
+ return () => {
211
+ this.#document[REMOVE_EVENT_LISTENER]("scroll", listener, SCROLL_LISTENER_OPTIONS);
212
+ };
213
+ }));
214
+ }
215
+ #lastTouchAction;
216
+ #disableTouchAction = () => {
217
+ if (this.#lastTouchAction == null) {
218
+ this.#lastTouchAction = window.getComputedStyle(this.#document.body).touchAction;
219
+ this.#document.body.style.touchAction = "none";
220
+ }
221
+ };
222
+ #enableTouchAction = () => {
223
+ if (this.#lastTouchAction != null) {
224
+ this.#document.body.style.touchAction = this.#lastTouchAction;
225
+ this.#lastTouchAction = undefined;
226
+ }
227
+ };
228
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
229
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, providedIn: "root" }); }
230
+ }
231
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.6", ngImport: i0, type: GestureService, decorators: [{
232
+ type: Injectable,
233
+ args: [{ providedIn: "root" }]
234
+ }], ctorParameters: () => [] });
235
+ function sortByPripority(a, b) {
236
+ return b.priority - a.priority;
237
+ }
238
+ function pointersFromEvent(event) {
239
+ if (event instanceof MouseEvent) {
240
+ return [
241
+ {
242
+ x: event.clientX,
243
+ y: event.clientY
244
+ }
245
+ ];
246
+ }
247
+ else {
248
+ return Array.from(event.touches).map(t => {
249
+ return { x: t.clientX, y: t.clientY };
250
+ });
251
+ }
252
+ }
253
+ function updatePointers(state) {
254
+ if (state.phase === "start" /* GesturePhase.Start */) {
255
+ state.pointers = pointersFromEvent(state.origin).map(v => {
256
+ return { start: v, current: v, distance: { x: 0, y: 0 }, direction: { x: 0, y: 0 } };
257
+ });
258
+ }
259
+ else if (state.pointers) {
260
+ const pointers = pointersFromEvent(state.origin);
261
+ if (pointers.length === 0) {
262
+ return state;
263
+ }
264
+ state.pointers = state.pointers.map((v, i) => {
265
+ const p = pointers[i];
266
+ return {
267
+ start: v.start,
268
+ current: p,
269
+ distance: { x: p.x - v.start.x, y: p.y - v.start.y },
270
+ direction: { x: direction(v.start.x, p.x), y: direction(v.start.y, p.y) }
271
+ };
272
+ });
273
+ }
274
+ return state;
275
+ }
276
+ function direction(prev, curr) {
277
+ return curr > prev ? 1 : curr < prev ? -1 : 0;
278
+ }
279
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VzdHVyZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvYXJpYS9zcmMvZ2VzdHVyZXMvZ2VzdHVyZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQTtBQUMxQyxPQUFPLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDMUQsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUFFL0QsT0FBTyxFQUNILGFBQWEsRUFDYixPQUFPLEVBQ1AsWUFBWSxFQUNaLE1BQU0sRUFDTixRQUFRLEVBQ1IsR0FBRyxFQUNILEtBQUssRUFDTCxVQUFVLEVBQ1YsSUFBSSxFQUNKLEtBQUssRUFDTCxTQUFTLEVBQ1QsT0FBTyxFQUVQLFNBQVMsRUFDVCxTQUFTLEVBQ1QsR0FBRyxFQUNOLE1BQU0sTUFBTSxDQUFBO0FBSWIsT0FBTyxFQUFFLGVBQWUsRUFBRSxhQUFhLEVBQWdCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUloRyxPQUFPLEVBT0gsU0FBUyxFQUNaLE1BQU0saUJBQWlCLENBQUE7O0FBRXhCLE1BQU0sa0JBQWtCLEdBQUcsZUFBZSxDQUFDLGtCQUFrQixDQUFDLENBQUE7QUFDOUQsTUFBTSxxQkFBcUIsR0FBRyxlQUFlLENBQUMscUJBQXFCLENBQUMsQ0FBQTtBQUNwRSxNQUFNLGNBQWMsR0FBRyxlQUFlLENBQUMsZUFBZSxDQUFDLENBQUE7QUFvQ3ZELE1BQU0sdUJBQXVCLEdBQTRCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxDQUFBO0FBRzFFLE1BQU0sT0FBTyxjQUFjO0lBQ2QsS0FBSyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQTtJQUN0QixTQUFTLEdBQUcsTUFBTSxDQUFDLFFBQVEsQ0FBQyxD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Q0FBQTtBQUNqRCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uXCJcbmltcG9ydCB7IGluamVjdCwgSW5qZWN0YWJsZSwgTmdab25lIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmUvcnhqcy1pbnRlcm9wXCJcblxuaW1wb3J0IHtcbiAgICBjb21iaW5lTGF0ZXN0LFxuICAgIGNvbm5lY3QsXG4gICAgZGVib3VuY2VUaW1lLFxuICAgIGZpbHRlcixcbiAgICBmaW5hbGl6ZSxcbiAgICBtYXAsXG4gICAgbWVyZ2UsXG4gICAgT2JzZXJ2YWJsZSxcbiAgICBzY2FuLFxuICAgIHNoYXJlLFxuICAgIHN0YXJ0V2l0aCxcbiAgICBTdWJqZWN0LFxuICAgIFN1YnNjcmliZXIsXG4gICAgc3dpdGNoTWFwLFxuICAgIHRha2VXaGlsZSxcbiAgICB0YXBcbn0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBNdXRhYmxlIH0gZnJvbSBcInV0aWxpdHktdHlwZXNcIlxuXG5pbXBvcnQgeyBfX3pvbmVfc3ltYm9sX18sIGNvZXJjZUVsZW1lbnQsIEVsZW1lbnRJbnB1dCwgaXNGYWxzeSwgaXNUcnV0aHkgfSBmcm9tIFwiQG5ndXRpbC9jb21tb25cIlxuaW1wb3J0IHsgUG9zaXRpb24gfSBmcm9tIFwiQG5ndXRpbC9zdHlsZVwiXG5cbmltcG9ydCB7IEdlc3R1cmUsIEdlc3R1cmVDYXB0dXJlU3RhdGUgfSBmcm9tIFwiLi9nZXN0dXJlXCJcbmltcG9ydCB7XG4gICAgR2VzdHVyZURvbUV2ZW50LFxuICAgIEdlc3R1cmVFdmVudCxcbiAgICBHZXN0dXJlTGlzdGVuZXJDb25maWcsXG4gICAgR2VzdHVyZU9yaWdpbixcbiAgICBHZXN0dXJlUGhhc2UsXG4gICAgR2VzdHVyZVBvaW50ZXJUeXBlLFxuICAgIExpc3RlbmVyc1xufSBmcm9tIFwiLi9nZXN0dXJlLWV2ZW50XCJcblxuY29uc3QgQUREX0VWRU5UX0xJU1RFTkVSID0gX196b25lX3N5bWJvbF9fKFwiYWRkRXZlbnRMaXN0ZW5lclwiKVxuY29uc3QgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gX196b25lX3N5bWJvbF9fKFwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiKVxuY29uc3QgRElTUEFUQ0hfRVZFTlQgPSBfX3pvbmVfc3ltYm9sX18oXCJkaXNwYXRjaEV2ZW50XCIpXG5cbnR5cGUgR2VzdHVyZXNUb0V2ZW50c1R5cGU8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9XG4gICAgVCBleHRlbmRzIEFycmF5PGluZmVyIEc+ID8gKEcgZXh0ZW5kcyBHZXN0dXJlPGluZmVyIEU+ID8gRSA6IG5ldmVyKSA6IG5ldmVyXG5cbnR5cGUgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxUPiA9IFQgZXh0ZW5kcyB7IHR5cGU6IGluZmVyIE4gfSA/IHsgdHlwZTogTiB9ICYgVCA6IG5ldmVyXG5cbmV4cG9ydCB0eXBlIEdlc3R1cmVXYXRjaFJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8XG4gICAgR2VzdHVyZUV2ZW50RGlzY3JpbWluYXRvcjxHZXN0dXJlc1RvRXZlbnRzVHlwZTxUPj5cbj5cblxuZXhwb3J0IHR5cGUgR2VzdHVyZUxpc3RlblJldHVybnM8VCBleHRlbmRzIEFycmF5PEdlc3R1cmU+PiA9IE9ic2VydmFibGU8R2VzdHVyZURvbUV2ZW50PEdlc3R1cmVzVG9FdmVudHNUeXBlPFQ+Pj5cblxuaW50ZXJmYWNlIEJlZ2luU3RhdGUge1xuICAgIHN0YXJ0RXZlbnQ6IEdlc3R1cmVFdmVudFxuICAgIGdlc3R1cmVzOiBNYXA8R2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZT5cbiAgICBpbmNsdWRlU2Nyb2xsRGlzdGFuY2U6IGJvb2xlYW5cbn1cblxuaW50ZXJmYWNlIENhcHR1cmVTdGF0ZSB7XG4gICAgZXZlbnRzOiBHZXN0dXJlRXZlbnRbXVxuICAgIGdlc3R1cmVzOiBCZWdpblN0YXRlW1wiZ2VzdHVyZXNcIl1cbiAgICBpbmNsdWRlU2Nyb2xsRGlzdGFuY2U6IEJlZ2luU3RhdGVbXCJpbmNsdWRlU2Nyb2xsRGlzdGFuY2VcIl1cbn1cblxuaW50ZXJmYWNlIENhcHR1cmVTZWxlY3RTdGF0ZSB7XG4gICAgZXZlbnRzOiBHZXN0dXJlRXZlbnRbXVxuICAgIGdlc3R1cmU/OiBHZXN0dXJlXG4gICAgd2F0Y2hlcnM/OiBBcnJheTxXYXRjaGVyPlxufVxuXG5pbnRlcmZhY2UgV2F0Y2hlciB7XG4gICAgcmVhZG9ubHkgZWw6IEhUTUxFbGVtZW50XG4gICAgcmVhZG9ubHkgZ2VzdHVyZTogR2VzdHVyZVxufVxuXG5jb25zdCBTQ1JPTExfTElTVEVORVJfT1BUSU9OUzogQWRkRXZlbnRMaXN0ZW5lck9wdGlvbnMgPSB7IHBhc3NpdmU6IHRydWUgfVxuXG5ASW5qZWN0YWJsZSh7IHByb3ZpZGVkSW46IFwicm9vdFwiIH0pXG5leHBvcnQgY2xhc3MgR2VzdHVyZVNlcnZpY2Uge1xuICAgIHJlYWRvbmx5ICN6b25lID0gaW5qZWN0KE5nWm9uZSlcbiAgICByZWFkb25seSAjZG9jdW1lbnQgPSBpbmplY3QoRE9DVU1FTlQpXG5cbiAgICAjd2F0Y2hlcnM6IFdhdGNoZXJbXSA9IFtdXG4gICAgcmVhZG9ubHkgI3RyaWdnZXIgPSBuZXcgU3ViamVjdDxHZXN0dXJlRXZlbnQ+KClcblxuICAgIHJlYWRvbmx5ICNtb3Zpbmc6IE9ic2VydmFibGU8R2VzdHVyZUV2ZW50PiA9IG1lcmdlKFxuICAgICAgICAuLi5PYmplY3Qua2V5cyhMaXN0ZW5lcnMpXG4gICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gTGlzdGVuZXJzW25hbWVdLnBoYXNlID09PSBHZXN0dXJlUGhhc2UuTW92aW5nKVxuICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuI2xpc3RlbihuYW1lLCBMaXN0ZW5lcnNbbmFtZV0pKVxuICAgICkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2VuZDogT2JzZXJ2YWJsZTxHZXN0dXJlRXZlbnQ+ID0gbWVyZ2UoXG4gICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgIC5maWx0ZXIobmFtZSA9PiBMaXN0ZW5lcnNbbmFtZV0ucGhhc2UgPT09IEdlc3R1cmVQaGFzZS5FbmQpXG4gICAgICAgICAgICAubWFwKG5hbWUgPT4gdGhpcy4jbGlzdGVuKG5hbWUsIExpc3RlbmVyc1tuYW1lXSkpXG4gICAgKS5waXBlKHNoYXJlKCkpXG5cbiAgICByZWFkb25seSAjZXZlbnRTdHJlYW0gPSBtZXJnZSh0aGlzLiNtb3ZpbmcsIHRoaXMuI2VuZCkucGlwZShzaGFyZSgpKVxuXG4gICAgcmVhZG9ubHkgI2JlZ2luID0gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxCZWdpblN0YXRlPikgPT4ge1xuICAgICAgICBsZXQgcG9pbnRlclR5cGU6IEdlc3R1cmVQb2ludGVyVHlwZSB8IHVuZGVmaW5lZFxuXG4gICAgICAgIHJldHVybiB0aGlzLiN0cmlnZ2VyXG4gICAgICAgICAgICAucGlwZShcbiAgICAgICAgICAgICAgICBmaWx0ZXIoZXZlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9pbnRlclR5cGUgPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlclR5cGUgPSBldmVudC5wb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LnBvaW50ZXJUeXBlID09PSBwb2ludGVyVHlwZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGNvbm5lY3QoZXZlbnRzID0+XG4gICAgICAgICAgICAgICAgICAgIG1lcmdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgcG9pbnRlclR5cGUgb24gZW5kLCBhZnRlciAyMDBtcywgYmVjYXVzZSB0b3VjaGVuZCBpcyBtYXliZSBmb2xsb3dlZCBieSBhIG1vdXNlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmQucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZVRpbWUoMjAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyVHlwZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiNlbmFibGVUb3VjaEFjdGlvbigpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IGZhbHNlKVxuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAvLyBTZWxlY3QgYWN0aXZlIHdhdGNoZXJzXG4gICAgICAgICAgICAgICAgbWFwKGV2ZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXZlbnRUYXJnZXQgPSBldmVudC50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVTY3JvbGxEaXN0YW5jZSA9IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGdlc3R1cmVzID0gdGhpcy4jd2F0Y2hlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHsgZ2VzdHVyZSwgZWwgfSkgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZS5maWx0ZXJCeUV2ZW50KGV2ZW50KSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWwgPT09IGV2ZW50VGFyZ2V0IHx8IChcImNvbnRhaW5zXCIgaW4gZWwgJiYgZWwuY29udGFpbnMoZXZlbnRUYXJnZXQpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGdlc3R1cmVzLCB7IGdlc3R1cmUgfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWdlc3R1cmVzLmhhcyhnZXN0dXJlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVNjcm9sbERpc3RhbmNlID0gaW5jbHVkZVNjcm9sbERpc3RhbmNlIHx8IGdlc3R1cmUuaW5jbHVkZVNjcm9sbERpc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlcy5zZXQoZ2VzdHVyZSwgR2VzdHVyZUNhcHR1cmVTdGF0ZS5VbmNoZWNrZWQpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdlc3R1cmVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWFwKCkgYXMgQmVnaW5TdGF0ZVtcImdlc3R1cmVzXCJdXG4gICAgICAgICAgICAgICAgICAgICAgICApXG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnRFdmVudDogZXZlbnQsIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfSBzYXRpc2ZpZXMgQmVnaW5TdGF0ZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIGZpbHRlcigoeyBnZXN0dXJlcyB9KSA9PiBnZXN0dXJlcy5zaXplID4gMCksXG4gICAgICAgICAgICAgICAgdGFwKHRoaXMuI2Rpc2FibGVUb3VjaEFjdGlvbilcbiAgICAgICAgICAgICAgICAvLyBmaW5hbGl6ZSgoKSA9PiBjb25zb2xlLmxvZyhcIkZJTkFMSVpFIEJFR0lOXCIpKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLnN1YnNjcmliZShkc3QpXG4gICAgfSlcblxuICAgIHJlYWRvbmx5ICNnZXN0dXJlID0gdGhpcy4jYmVnaW4ucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKCh7IHN0YXJ0RXZlbnQsIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcG9pbnRlclR5cGUgPSBzdGFydEV2ZW50LnBvaW50ZXJUeXBlXG4gICAgICAgICAgICBjb25zdCBzdGFydEF0ID0gc3RhcnRFdmVudC5vcmlnaW4udGltZVN0YW1wXG4gICAgICAgICAgICBjb25zdCBkaXNwYXRjaEV2ZW50ID0gc3RhcnRFdmVudC50YXJnZXRbRElTUEFUQ0hfRVZFTlRdLmJpbmQoc3RhcnRFdmVudC50YXJnZXQpXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtSW5pdCA9IHRoaXMuI2V2ZW50U3RyZWFtLnBpcGUoXG4gICAgICAgICAgICAgICAgc3RhcnRXaXRoKHN0YXJ0RXZlbnQpLFxuICAgICAgICAgICAgICAgIGZpbHRlcihldmVudCA9PiBldmVudC5wb2ludGVyVHlwZSA9PT0gcG9pbnRlclR5cGUpXG4gICAgICAgICAgICApXG5cbiAgICAgICAgICAgIGNvbnN0IGV2ZW50U3RyZWFtU291cmNlID0gIWluY2x1ZGVTY3JvbGxEaXN0YW5jZVxuICAgICAgICAgICAgICAgID8gZXZlbnRTdHJlYW1Jbml0XG4gICAgICAgICAgICAgICAgOiBjb21iaW5lTGF0ZXN0KFtcbiAgICAgICAgICAgICAgICAgICAgICBldmVudFN0cmVhbUluaXQsXG4gICAgICAgICAgICAgICAgICAgICAgdGhpcy4jc2Nyb2xsRGlzdGFuY2Uoc3RhcnRFdmVudC50YXJnZXQpLnBpcGUoc3RhcnRXaXRoKHsgeDogMCwgeTogMCB9KSlcbiAgICAgICAgICAgICAgICAgIF0pLnBpcGUoXG4gICAgICAgICAgICAgICAgICAgICAgbWFwKChbc3JjLCBkaXN0YW5jZV0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgOyhzcmMgYXMgTXV0YWJsZTxHZXN0dXJlRXZlbnQ+KS5zY3JvbGxEaXN0YW5jZSA9IGRpc3RhbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzcmNcbiAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICBjb25zdCBldmVudFN0cmVhbSA9IGV2ZW50U3RyZWFtU291cmNlLnBpcGUoXG4gICAgICAgICAgICAgICAgc2NhbihcbiAgICAgICAgICAgICAgICAgICAgKHN0YXRlLCBjdXJyKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUG9pbnRlcnMoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnN0YXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmN1cnIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxhcHNlZDogY3Vyci5vcmlnaW4udGltZVN0YW1wIC0gc3RhcnRBdCFcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICBzdGFydEV2ZW50XG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoZXZlbnQgPT4gZXZlbnQucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgV0FUQ0hcIikpLFxuICAgICAgICAgICAgICAgIHNoYXJlKClcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3QgY2FwdHVyZVN0YXRlID0gZXZlbnRTdHJlYW0ucGlwZShcbiAgICAgICAgICAgICAgICBjb25uZWN0KHNyYyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRlOiBDYXB0dXJlU3RhdGUgPSB7IGV2ZW50czogW10sIGdlc3R1cmVzLCBpbmNsdWRlU2Nyb2xsRGlzdGFuY2UgfVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmMucGlwZSh0YXAoZXZlbnQgPT4gc3RhdGUuZXZlbnRzLnB1c2goZXZlbnQpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5BcnJheS5mcm9tKGdlc3R1cmVzLmtleXMoKSkubWFwKGdlc3R1cmUgPT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXN0dXJlLmNhcHR1cmUoc3JjLnBpcGUoZmlsdGVyKGdlc3R1cmUuZmlsdGVyQnlFdmVudCkpKS5waXBlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlV2hpbGUocmVzdWx0ID0+IHJlc3VsdCAhPT0gR2VzdHVyZUNhcHR1cmVTdGF0ZS5Ta2lwLCB0cnVlKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKHJlc3VsdCA9PiBnZXN0dXJlcy5zZXQoZ2VzdHVyZSwgcmVzdWx0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICkucGlwZShtYXAoKCkgPT4gc3RhdGUpKVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gLGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgQ0FQVFVSRVwiKSlcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgY29uc3Qgc2VsZWN0R2VzdHVyZSA9IGNhcHR1cmVTdGF0ZS5waXBlKFxuICAgICAgICAgICAgICAgIG1hcChzdGF0ZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRpdGlvbnM6IHsgW2sgaW4gR2VzdHVyZUNhcHR1cmVTdGF0ZV0/OiBHZXN0dXJlW10gfSA9IHt9XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBbZ2VzdHVyZSwgY2FwdHVyZVN0YXRlXSBvZiBzdGF0ZS5nZXN0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydGl0aW9uID0gKHBhcnRpdGlvbnNbY2FwdHVyZVN0YXRlXSA/Pz0gW10pXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aXRpb24ucHVzaChnZXN0dXJlKVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5JbnN0YW50XSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlc3R1cmU6IHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5JbnN0YW50XS5zb3J0KHNvcnRCeVByaXBvcml0eSlbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBzdGF0ZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgQ2FwdHVyZVNlbGVjdFN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSBub3QgYWxsIGdlc3R1cmVzIHJldHVybiBmcm9tIEdlc3R1cmUuY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLlVuY2hlY2tlZF0gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHdoaWxlIGhhcyBwZW5kaW5nLCB0aGUgY2FwdHVyZSBpcyBjb250aW51ZWRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnRpdGlvbnNbR2VzdHVyZUNhcHR1cmVTdGF0ZS5QZW5kaW5nXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gbm8gcGVuZGlnICYgaGFzIG1heWJlXG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJ0aXRpb25zW0dlc3R1cmVDYXB0dXJlU3RhdGUuTWF5YmVdICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VzdHVyZTogcGFydGl0aW9uc1tHZXN0dXJlQ2FwdHVyZVN0YXRlLk1heWJlXS5zb3J0KHNvcnRCeVByaXBvcml0eSlbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRzOiBzdGF0ZS5ldmVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gYXMgQ2FwdHVyZVNlbGVjdFN0YXRlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBubyBwZW5kaW5nICYgbm8gbWF5YmUgJiBubyB0ZXJtaW5hdGVcbiAgICAgICAgICAgICAgICAgICAgLy8gc28sIG5vdGhpZ24gbWF0Y2hlZFxuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBldmVudHM6IHN0YXRlLmV2ZW50cyB9IGFzIENhcHR1cmVTZWxlY3RTdGF0ZVxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIHRha2VXaGlsZShpc0ZhbHN5LCB0cnVlKSxcbiAgICAgICAgICAgICAgICBmaWx0ZXIoaXNUcnV0aHkpLFxuICAgICAgICAgICAgICAgIHRha2VXaGlsZSh2ID0+IHYhLmdlc3R1cmUgIT0gbnVsbCwgZmFsc2UpXG4gICAgICAgICAgICAgICAgLy8gZmluYWxpemUoKCkgPT4gY29uc29sZS5sb2coXCJGSU5BTElaRSBTRUxFQ1RcIikpXG4gICAgICAgICAgICApIGFzIE9ic2VydmFibGU8UmVxdWlyZWQ8Q2FwdHVyZVNlbGVjdFN0YXRlPj5cblxuICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEdlc3R1cmUucGlwZShcbiAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoKHsgZXZlbnRzLCBnZXN0dXJlIH0pID0+XG4gICAgICAgICAgICAgICAgICAgIGdlc3R1cmUuaGFuZGxlKGV2ZW50U3RyZWFtLnBpcGUoc3RhcnRXaXRoKC4uLmV2ZW50cyksIGZpbHRlcihnZXN0dXJlLmZpbHRlckJ5RXZlbnQpKSkucGlwZShcbiAgICAgICAgICAgICAgICAgICAgICAgIHRha2VXaGlsZSh2ID0+IHYucGhhc2UgIT09IEdlc3R1cmVQaGFzZS5FbmQsIHRydWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFwKChlOiBNdXRhYmxlPEdlc3R1cmVFdmVudD4pID0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZS50eXBlLCB7IGRldGFpbDogZSwgYnViYmxlczogdHJ1ZSwgY2FuY2VsYWJsZTogdHJ1ZSB9KSlcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiR0VTVFVSRSBGSU5BTElaRVwiKSksXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIC8vIGZpbmFsaXplKCgpID0+IGNvbnNvbGUubG9nKFwiRklOQUxJWkUgUkVTVUxUXCIpKSxcbiAgICAgICAgICAgICAgICBmaW5hbGl6ZSh0aGlzLiNlbmFibGVUb3VjaEFjdGlvbilcbiAgICAgICAgICAgIClcbiAgICAgICAgfSksXG4gICAgICAgIHNoYXJlKClcbiAgICApXG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSBtZXJnZShcbiAgICAgICAgICAgIC4uLk9iamVjdC5rZXlzKExpc3RlbmVycylcbiAgICAgICAgICAgICAgICAuZmlsdGVyKG5hbWUgPT4gTGlzdGVuZXJzW25hbWVdLnBoYXNlID09PSBHZXN0dXJlUGhhc2UuU3RhcnQpXG4gICAgICAgICAgICAgICAgLm1hcChuYW1lID0+IHRoaXMuI2xpc3RlbihuYW1lLCBMaXN0ZW5lcnNbbmFtZV0pKVxuICAgICAgICApXG4gICAgICAgIHRyaWdnZXJzLnBpcGUodGFrZVVudGlsRGVzdHJveWVkKCkpLnN1YnNjcmliZSh0aGlzLiN0cmlnZ2VyKVxuICAgIH1cblxuICAgIGxpc3RlbjxUIGV4dGVuZHMgQXJyYXk8R2VzdHVyZT4+KGVsOiBFbGVtZW50SW5wdXQsIC4uLmdlc3R1cmVzOiBUKTogR2VzdHVyZUxpc3RlblJldHVybnM8VD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRXZlbnQ+KSA9PlxuICAgICAgICAgICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvZXJjZUVsZW1lbnQoZWwpXG4gICAgICAgICAgICAgICAgY29uc3QgbmV4dCA9IGRzdC5uZXh0LmJpbmQoZHN0KVxuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZ2VzdHVyZSBvZiBnZXN0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBlbGVtZW50W0FERF9FVkVOVF9MSVNURU5FUl0oZ2VzdHVyZS5uYW1lIGFzIGFueSwgbmV4dClcbiAgICAgICAgICAgICAgICAgICAgZHN0LmFkZChlbGVtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uYmluZChlbGVtZW50LCBnZXN0dXJlLm5hbWUgYXMgYW55LCBuZXh0IGFzIGFueSkpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRzdC5hZGQodGhpcy53YXRjaChlbGVtZW50LCAuLi5nZXN0dXJlcykuc3Vic2NyaWJlKCkpXG4gICAgICAgICAgICB9KVxuICAgICAgICApIGFzIGFueVxuICAgIH1cblxuICAgIHdhdGNoPFQgZXh0ZW5kcyBBcnJheTxHZXN0dXJlPj4oZWw6IEVsZW1lbnRJbnB1dCwgLi4uZ2VzdHVyZXM6IFQpOiBHZXN0dXJlV2F0Y2hSZXR1cm5zPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKChkc3Q6IFN1YnNjcmliZXI8R2VzdHVyZUV2ZW50PikgPT5cbiAgICAgICAgICAgIHRoaXMuI3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsKVxuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoZXJzID0gZ2VzdHVyZXMubWFwKGdlc3R1cmUgPT4ge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBnZXN0dXJlLCBlbDogZWxlbWVudCB9XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLiNhZGQod2F0Y2hlcnMpXG4gICAgICAgICAgICAgICAgZHN0LmFkZCh0aGlzLiNnZXN0dXJlLnN1YnNjcmliZShkc3QpKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI3JlbW92ZSh3YXRjaGVycylcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApIGFzIGFueVxuICAgIH1cblxuICAgICNhZGQod2F0Y2hlcnM6IFdhdGNoZXJbXSkge1xuICAgICAgICB0aGlzLiN3YXRjaGVycyA9IHRoaXMuI3dhdGNoZXJzLmNvbmNhdCh3YXRjaGVycylcbiAgICB9XG5cbiAgICAjcmVtb3ZlKHdhdGNoZXJzOiBXYXRjaGVyW10pIHtcbiAgICAgICAgdGhpcy4jd2F0Y2hlcnMgPSB0aGlzLiN3YXRjaGVycy5maWx0ZXIodiA9PiAhd2F0Y2hlcnMuaW5jbHVkZXModikpXG4gICAgfVxuXG4gICAgI2xpc3RlbihuYW1lOiBzdHJpbmcsIGNvbmZpZzogR2VzdHVyZUxpc3RlbmVyQ29uZmlnKSB7XG4gICAgICAgIGNvbnN0IHsgcGhhc2UsIHBvaW50ZXJUeXBlLCBvcHRpb25zIH0gPSBjb25maWdcblxuICAgICAgICBjb25zdCB0b1Jlc3VsdCA9XG4gICAgICAgICAgICBwaGFzZSA9PT0gR2VzdHVyZVBoYXNlLlN0YXJ0XG4gICAgICAgICAgICAgICAgPyAob3JpZ2luOiBHZXN0dXJlT3JpZ2luKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGhhc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXJUeXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IG9yaWdpbi50YXJnZXQgYXMgSFRNTEVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICB9KSBhcyBHZXN0dXJlRXZlbnRcbiAgICAgICAgICAgICAgICA6IChvcmlnaW46IEdlc3R1cmVPcmlnaW4pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZ2luLmNhbmNlbGFibGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLnByZXZlbnREZWZhdWx0KClcbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgb3JpZ2luLCBwaGFzZSwgcG9pbnRlclR5cGUgfSBhcyBHZXN0dXJlRXZlbnRcbiAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxHZXN0dXJlRXZlbnQ+KSA9PlxuICAgICAgICAgICAgdGhpcy4jem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXIgPSAob3JpZ2luOiBHZXN0dXJlT3JpZ2luKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW4uZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZHN0Lm5leHQodG9SZXN1bHQob3JpZ2luKSlcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFkZEV2ZW50TGlzdGVuZXJcIiwgbmFtZSlcbiAgICAgICAgICAgICAgICB0aGlzLiNkb2N1bWVudFtBRERfRVZFTlRfTElTVEVORVJdKG5hbWUgYXMga2V5b2YgRG9jdW1lbnRFdmVudE1hcCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3ZlRXZlbnRMaXN0ZW5lclwiLCBuYW1lKVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiNkb2N1bWVudFtSRU1PVkVfRVZFTlRfTElTVEVORVJdKG5hbWUgYXMga2V5b2YgRG9jdW1lbnRFdmVudE1hcCwgbGlzdGVuZXIgYXMgYW55LCBvcHRpb25zKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjc2Nyb2xsRGlzdGFuY2UoZWxlbWVudDogRWxlbWVudCk6IE9ic2VydmFibGU8UG9zaXRpb24+IHtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgeCA9IDBcbiAgICAgICAgICAgIGxldCB5ID0gMFxuICAgICAgICAgICAgbGV0IHAgPSBlbGVtZW50XG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgeCArPSBwLnNjcm9sbExlZnQgPz8gMFxuICAgICAgICAgICAgICAgIHkgKz0gcC5zY3JvbGxUb3AgPz8gMFxuICAgICAgICAgICAgICAgIHAgPSBwLnBhcmVudE5vZGUgYXMgRWxlbWVudFxuICAgICAgICAgICAgfSB3aGlsZSAocCAhPSBudWxsKVxuICAgICAgICAgICAgcmV0dXJuIHsgeCwgeSB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKGRzdDogU3Vic2NyaWJlcjxQb3NpdGlvbj4pID0+XG4gICAgICAgICAgICB0aGlzLiN6b25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbml0aWFsID0gc2Nyb2xsUG9zaXRpb24oKVxuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gc2Nyb2xsUG9zaXRpb24oKVxuICAgICAgICAgICAgICAgICAgICBkc3QubmV4dCh7IHg6IGN1cnJlbnQueCAtIGluaXRpYWwueCwgeTogY3VycmVudC55IC0gaW5pdGlhbC55IH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W0FERF9FVkVOVF9MSVNURU5FUl0oXCJzY3JvbGxcIiwgbGlzdGVuZXIsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKVxuICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuI2RvY3VtZW50W1JFTU9WRV9FVkVOVF9MSVNURU5FUl0oXCJzY3JvbGxcIiwgbGlzdGVuZXIsIFNDUk9MTF9MSVNURU5FUl9PUFRJT05TKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICB9XG5cbiAgICAjbGFzdFRvdWNoQWN0aW9uPzogc3RyaW5nXG4gICAgI2Rpc2FibGVUb3VjaEFjdGlvbiA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuI2xhc3RUb3VjaEFjdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLiNsYXN0VG91Y2hBY3Rpb24gPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzLiNkb2N1bWVudC5ib2R5KS50b3VjaEFjdGlvblxuICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9IFwibm9uZVwiXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAjZW5hYmxlVG91Y2hBY3Rpb24gPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGlmICh0aGlzLiNsYXN0VG91Y2hBY3Rpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgdGhpcy4jZG9jdW1lbnQuYm9keS5zdHlsZS50b3VjaEFjdGlvbiA9IHRoaXMuI2xhc3RUb3VjaEFjdGlvblxuICAgICAgICAgICAgdGhpcy4jbGFzdFRvdWNoQWN0aW9uID0gdW5kZWZpbmVkXG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIHNvcnRCeVByaXBvcml0eShhOiBHZXN0dXJlLCBiOiBHZXN0dXJlKSB7XG4gICAgcmV0dXJuIGIucHJpb3JpdHkgLSBhLnByaW9yaXR5XG59XG5cbmZ1bmN0aW9uIHBvaW50ZXJzRnJvbUV2ZW50KGV2ZW50OiBNb3VzZUV2ZW50IHwgVG91Y2hFdmVudCk6IFBvc2l0aW9uW10ge1xuICAgIGlmIChldmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB4OiBldmVudC5jbGllbnRYLFxuICAgICAgICAgICAgICAgIHk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBBcnJheS5mcm9tKGV2ZW50LnRvdWNoZXMpLm1hcCh0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHg6IHQuY2xpZW50WCwgeTogdC5jbGllbnRZIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmZ1bmN0aW9uIHVwZGF0ZVBvaW50ZXJzKHN0YXRlOiBNdXRhYmxlPEdlc3R1cmVFdmVudD4pOiBHZXN0dXJlRXZlbnQge1xuICAgIGlmIChzdGF0ZS5waGFzZSA9PT0gR2VzdHVyZVBoYXNlLlN0YXJ0KSB7XG4gICAgICAgIHN0YXRlLnBvaW50ZXJzID0gcG9pbnRlcnNGcm9tRXZlbnQoc3RhdGUub3JpZ2luKS5tYXAodiA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogdiwgY3VycmVudDogdiwgZGlzdGFuY2U6IHsgeDogMCwgeTogMCB9LCBkaXJlY3Rpb246IHsgeDogMCwgeTogMCB9IH1cbiAgICAgICAgfSlcbiAgICB9IGVsc2UgaWYgKHN0YXRlLnBvaW50ZXJzKSB7XG4gICAgICAgIGNvbnN0IHBvaW50ZXJzID0gcG9pbnRlcnNGcm9tRXZlbnQoc3RhdGUub3JpZ2luKVxuICAgICAgICBpZiAocG9pbnRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlLnBvaW50ZXJzID0gc3RhdGUucG9pbnRlcnMubWFwKCh2LCBpKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBwID0gcG9pbnRlcnNbaV1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IHYuc3RhcnQsXG4gICAgICAgICAgICAgICAgY3VycmVudDogcCxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogeyB4OiBwLnggLSB2LnN0YXJ0LngsIHk6IHAueSAtIHYuc3RhcnQueSB9LFxuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogeyB4OiBkaXJlY3Rpb24odi5zdGFydC54LCBwLngpLCB5OiBkaXJlY3Rpb24odi5zdGFydC55LCBwLnkpIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVcbn1cblxuZnVuY3Rpb24gZGlyZWN0aW9uKHByZXY6IG51bWJlciwgY3VycjogbnVtYmVyKTogLTEgfCAwIHwgMSB7XG4gICAgcmV0dXJuIGN1cnIgPiBwcmV2ID8gMSA6IGN1cnIgPCBwcmV2ID8gLTEgOiAwXG59XG4iXX0=
@@ -1,3 +1,7 @@
1
- export * from "./gestures";
2
- export * from "./gestures.service";
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9nZXN0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQTtBQUMxQixjQUFjLG9CQUFvQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZXNcIlxuZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZXMuc2VydmljZVwiXG4iXX0=
1
+ export * from "./gesture-drag";
2
+ export * from "./gesture-event";
3
+ export * from "./gesture-longtap";
4
+ export * from "./gesture-tap";
5
+ export * from "./gesture.service";
6
+ export * from "./gesture";
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy9nZXN0dXJlcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGdCQUFnQixDQUFBO0FBQzlCLGNBQWMsaUJBQWlCLENBQUE7QUFDL0IsY0FBYyxtQkFBbUIsQ0FBQTtBQUNqQyxjQUFjLGVBQWUsQ0FBQTtBQUM3QixjQUFjLG1CQUFtQixDQUFBO0FBQ2pDLGNBQWMsV0FBVyxDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1kcmFnXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtZXZlbnRcIlxuZXhwb3J0ICogZnJvbSBcIi4vZ2VzdHVyZS1sb25ndGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUtdGFwXCJcbmV4cG9ydCAqIGZyb20gXCIuL2dlc3R1cmUuc2VydmljZVwiXG5leHBvcnQgKiBmcm9tIFwiLi9nZXN0dXJlXCJcbiJdfQ==
@@ -1,7 +1,7 @@
1
1
  import { Directive } from "@angular/core";
2
2
  import { toSignal } from "@angular/core/rxjs-interop";
3
3
  import { animationFrames, map, Observable, of, scan, shareReplay, startWith, Subject, switchMap, takeWhile } from "rxjs";
4
- import { clamp } from "lodash";
4
+ import { clamp } from "lodash-es";
5
5
  import * as i0 from "@angular/core";
6
6
  const SEGMENT_REGISTER = { type: "fix", percent: 0 };
7
7
  const SEGMENT_COMPLETE = { type: "fix", percent: 1 };
@@ -138,4 +138,4 @@ export class ProgressSegmentRef {
138
138
  return this;
139
139
  }
140
140
  }
141
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3Mtc3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9hcmlhL3NyYy91aS1zdGF0ZS9wcm9ncmVzcy1zdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3pDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQTtBQUVyRCxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBRXhILE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSxRQUFRLENBQUE7O0FBc0M5QixNQUFNLGdCQUFnQixHQUFhLEVBQUUsSUFBSSxFQUFFLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQyxFQUFFLENBQUE7QUFDOUQsTUFBTSxnQkFBZ0IsR0FBYSxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFBO0FBRzlELE1BQU0sT0FBTyxhQUFhO0lBRDFCO1FBRWEsY0FBUyxHQUEwQyxFQUFFLENBQUE7UUFFckQsV0FBTSxHQUFHLElBQUksT0FBTyxFQUF3QixDQUFBO1FBRTVDLFdBQU0sR0FBa0MsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQzdELFNBQVMsQ0FBQyxJQUFJLENBQUMsRUFDZixJQUFJLENBQUMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLEVBQUU7WUFDbEIsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbEMsS0FBSyxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQTtZQUNoQyxDQUFDO1lBRUQsSUFBSSxLQUFLLElB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Q1osT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFBO0lBQzdCLENBQUM7SUFDRCxhQUFhLENBQVM7SUFFdEIsSUFBSSxLQUFLO1FBQ0wsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFBO0lBQ3RCLENBQUM7SUFDRCxNQUFNLENBQVc7SUFFakIsWUFDSSxPQUFzQyxFQUN0QixJQUFZLEVBQzVCLFlBQXFCO1FBREwsU0FBSSxHQUFKLElBQUksQ0FBUTtRQUc1QixJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQTtRQUN2QixJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQTtJQUNyQyxDQUFDO0lBRUQsSUFBSSxDQUFDLFFBQWtCO1FBQ25CLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsQ0FBQTtJQUMvQixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO0lBQ3ZDLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBa0I7UUFDcEIsSUFBSSxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUE7UUFDdEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFBO1FBQ2xGLE9BQU8sSUFBSSxDQUFBO0lBQ2YsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRGlyZWN0aXZlIH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIlxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tIFwiQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3BcIlxuXG5pbXBvcnQgeyBhbmltYXRpb25GcmFtZXMsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNjYW4sIHNoYXJlUmVwbGF5LCBzdGFydFdpdGgsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVdoaWxlIH0gZnJvbSBcInJ4anNcIlxuXG5pbXBvcnQgeyBjbGFtcCB9IGZyb20gXCJsb2Rhc2hcIlxuaW1wb3J0IHsgTXV0YWJsZSB9IGZyb20gXCJ1dGlsaXR5LXR5cGVzXCJcblxuaW1wb3J0IHsgRGVlcFJlYWRvbmx5IH0gZnJvbSBcIkBuZ3V0aWwvY29tbW9uXCJcblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc0NvbW1vbiB7XG4gICAgcmVhZG9ubHkgbWVzc2FnZT86IHN0cmluZ1xuICAgIHJlYWRvbmx5IFtvdGhlcjogc3RyaW5nXTogdW5rbm93blxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzTGF4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImxheFwiXG4gICAgcmVhZG9ubHkgcHJlZGljdGVkVGltZTogbnVtYmVyXG4gICAgLy8gcmVhZG9ubHkgdXBkYXRlSW50ZXJ2YWw6IG51bWJlclxufVxuXG5leHBvcnQgaW50ZXJmYWNlIFByb2dyZXNzRml4IHtcbiAgICByZWFkb25seSB0eXBlOiBcImZpeFwiXG4gICAgcmVhZG9ubHkgcGVyY2VudDogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzID0gKFByb2dyZXNzTGF4IHwgUHJvZ3Jlc3NGaXgpICYgUHJvZ3Jlc3NDb21tb25cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ21lbnRJbnB1dCB7XG4gICAgcmVhZG9ubHkgbmFtZTogc3RyaW5nXG4gICAgcmVhZG9ubHkgZGlzdHJpYnV0aW9uPzogbnVtYmVyXG4gICAgcmVhZG9ubHkgcHJvZ3Jlc3M6IERlZXBSZWFkb25seTxQcm9ncmVzcz5cbn1cblxuZXhwb3J0IGludGVyZmFjZSBQcm9ncmVzc1NlZ2VtZW50IGV4dGVuZHMgUHJvZ3Jlc3NTZWdtZW50SW5wdXQge1xuICAgIHJhdGlvOiBudW1iZXJcbiAgICBzaGFyZTogbnVtYmVyXG4gICAgZG9uZTogYm9vbGVhblxuICAgIGxheEJlZ2luPzogbnVtYmVyXG59XG5cbmV4cG9ydCB0eXBlIFByb2dyZXNzU2VnZW1lbnRzID0geyBba2V5OiBzdHJpbmddOiBQcm9ncmVzc1NlZ2VtZW50IH1cblxuY29uc3QgU0VHTUVOVF9SRUdJU1RFUjogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDAgfVxuY29uc3QgU0VHTUVOVF9DT01QTEVURTogUHJvZ3Jlc3MgPSB7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQ6IDEgfVxuXG5ARGlyZWN0aXZlKClcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1N0YXRlIHtcbiAgICByZWFkb25seSAjc2VnbWVudHM6IHsgW2tleTogc3RyaW5nXTogUHJvZ3Jlc3NTZWdtZW50UmVmIH0gPSB7fVxuXG4gICAgcmVhZG9ubHkgI2lucHV0ID0gbmV3IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+KClcblxuICAgIHJlYWRvbmx5ICNzdGF0ZTogT2JzZXJ2YWJsZTxQcm9ncmVzc1NlZ2VtZW50cz4gPSB0aGlzLiNpbnB1dC5waXBlKFxuICAgICAgICBzdGFydFdpdGgobnVsbCksXG4gICAgICAgIHNjYW4oKHN0YXRlLCBpbnB1dCkgPT4ge1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoaXMuI2luaXRpYWxTdGF0ZSgpXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBjdXJyZW50ID0gc3RhdGVbaW5wdXQubmFtZV0gPz8geyByYXRpbzogMCwgc2hhcmU6IDAsIGRvbmU6IGZhbHNlIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSB7IC4uLmN1cnJlbnQsIC4uLmlucHV0IH1cblxuICAgICAgICAgICAgaWYgKGlucHV0LnByb2dyZXNzLnR5cGUgPT09IFwibGF4XCIpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgY3VycmVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgIGN1cnJlbnQuZG9uZSA9IGZhbHNlXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpbnB1dC5wcm9ncmVzcy50eXBlID09PSBcImZpeFwiICYmIGlucHV0LnByb2dyZXNzLnBlcmNlbnQgPCAxKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudC5kb25lID0gZmFsc2VcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHsgLi4uc3RhdGUsIFtpbnB1dC5uYW1lXTogeyAuLi5jdXJyZW50LCAuLi5pbnB1dCB9IH1cbiAgICAgICAgfSwge30gYXMgUHJvZ3Jlc3NTZWdlbWVudHMpLFxuICAgICAgICBzd2l0Y2hNYXAoc3RhdGUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2xpc3QgPSBPYmplY3QudmFsdWVzKHN0YXRlKSBhcyBBcnJheTxNdXRhYmxlPFByb2dyZXNzU2VnZW1lbnQ+PlxuICAgICAgICAgICAgY29uc3QgbWluID0gc2xpc3QucmVkdWNlKChtaW4sIGN1cnJlbnQpID0+IE1hdGgubWluKG1pbiwgY3VycmVudC5kaXN0cmlidXRpb24gfHwgMCksIEluZmluaXR5KSB8fCAxXG4gICAgICAgICAgICBjb25zdCB0b3RhbERpc3RyaWJ1dGlvbiA9IHNsaXN0LnJlZHVjZSgodG90YWwsIGN1cnJlbnQpID0+IHRvdGFsICsgKGN1cnJlbnQuZGlzdHJpYnV0aW9uIHx8IG1pbiksIDApXG4gICAgICAgICAgICBjb25zdCBoYXNMYXggPSBzbGlzdC5zb21lKHNlZ21lbnQgPT4gc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKVxuICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IGhhc0xheCA/IGFuaW1hdGlvbkZyYW1lcygpIDogb2YoeyB0aW1lc3RhbXA6IHBlcmZvcm1hbmNlLm5vdygpIH0pXG5cbiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKCh7IHRpbWVzdGFtcCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc2VnbWVudCBvZiBzbGlzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQuZGlzdHJpYnV0aW9uID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmRpc3RyaWJ1dGlvbiA9IG1pblxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5yYXRpbyA9IHNlZ21lbnQuZGlzdHJpYnV0aW9uIC8gdG90YWxEaXN0cmlidXRpb24gKyAwLjAwMDFcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBlcmNlbnQ6IG51bWJlclxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VnbWVudC5wcm9ncmVzcy50eXBlID09PSBcImxheFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZ21lbnQubGF4QmVnaW4gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWdtZW50LmxheEJlZ2luID0gdGltZXN0YW1wXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIHNlZ21lbnQucHJvZ3Jlc3MucHJlZGljdGVkVGltZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwZXJjZW50ID49IDAuOCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaW5hbCA9ICh0aW1lc3RhbXAgLSBzZWdtZW50LmxheEJlZ2luKSAvIChzZWdtZW50LnByb2dyZXNzLnByZWRpY3RlZFRpbWUgKiA1MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVyY2VudCA9IDAuOCArIE1hdGgubG9nMXAoZmluYWwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc2VnbWVudC5sYXhCZWdpblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlcmNlbnQgPSBjbGFtcChzZWdtZW50LnByb2dyZXNzLnBlcmNlbnQsIDAsIDEpXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlZ21lbnQuc2hhcmUgPSBwZXJjZW50ICogc2VnbWVudC5yYXRpb1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudC5kb25lID0gcGVyY2VudCA+PSAxXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICB0YWtlV2hpbGUoc3RhdGUgPT4gT2JqZWN0LnZhbHVlcyhzdGF0ZSkuc29tZShzZWdtZW50ID0+ICFzZWdtZW50LmRvbmUpLCB0cnVlKVxuICAgICAgICAgICAgKVxuICAgICAgICB9KSxcbiAgICAgICAgc2hhcmVSZXBsYXkoeyBidWZmZXJTaXplOiAxLCByZWZDb3VudDogdHJ1ZSB9KVxuICAgIClcblxuICAgIHJlYWRvbmx5IHZhbHVlJDogT2JzZXJ2YWJsZTxEZWVwUmVhZG9ubHk8UHJvZ3Jlc3NTZWdlbWVudHM+PiA9IHRoaXMuI3N0YXRlXG4gICAgcmVhZG9ubHkgdmFsdWUgPSB0b1NpZ25hbCh0aGlzLnZhbHVlJClcblxuICAgIHJlYWRvbmx5IHBlcmNlbnQkOiBPYnNlcnZhYmxlPG51bWJlcj4gPSB0aGlzLnZhbHVlJC5waXBlKFxuICAgICAgICBtYXAodmFsdWUgPT5cbiAgICAgICAgICAgIHZhbHVlICE9IG51bGxcbiAgICAgICAgICAgICAgICA/IGNsYW1wKFxuICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXModmFsdWUpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIuc2hhcmUsIDApLFxuICAgICAgICAgICAgICAgICAgICAgIDAsXG4gICAgICAgICAgICAgICAgICAgICAgMVxuICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIDogMFxuICAgICAgICApLFxuICAgICAgICBzaGFyZVJlcGxheSh7IGJ1ZmZlclNpemU6IDEsIHJlZkNvdW50OiB0cnVlIH0pXG4gICAgKVxuXG4gICAgcmVhZG9ubHkgcGVyY2VudCA9IHRvU2lnbmFsKHRoaXMucGVyY2VudCQpXG5cbiAgICBzZWdtZW50KG5hbWU6IHN0cmluZywgZGlzdHJpYnV0aW9uOiBudW1iZXIgPSAxKTogUHJvZ3Jlc3NTZWdtZW50UmVmIHtcbiAgICAgICAgY29uc3Qgc2VnbWVudCA9XG4gICAgICAgICAgICB0aGlzLiNzZWdtZW50c1tuYW1lXSA/PyAodGhpcy4jc2VnbWVudHNbbmFtZV0gPSBuZXcgUHJvZ3Jlc3NTZWdtZW50UmVmKHRoaXMuI2lucHV0LCBuYW1lLCBkaXN0cmlidXRpb24pKVxuICAgICAgICBzZWdtZW50Lm5leHQoU0VHTUVOVF9SRUdJU1RFUilcbiAgICAgICAgcmV0dXJuIHNlZ21lbnRcbiAgICB9XG5cbiAgICBjb25uZWN0KHN0YXRlOiBQcm9ncmVzc1N0YXRlLCBuYW1lOiBzdHJpbmcsIGRpc3RyaWJ1dGlvbj86IG51bWJlcik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3Qgc2VnbWVudCA9IHRoaXMuc2VnbWVudChuYW1lLCBkaXN0cmlidXRpb24pXG4gICAgICAgICAgICByZXR1cm4gc3RhdGUucGVyY2VudCQuc3Vic2NyaWJlKHBlcmNlbnQgPT4ge1xuICAgICAgICAgICAgICAgIHNlZ21lbnQubmV4dCh7IHR5cGU6IFwiZml4XCIsIHBlcmNlbnQgfSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgI2luaXRpYWxTdGF0ZSgpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC52YWx1ZXModGhpcy4jc2VnbWVudHMpLnJlZHVjZSgocmVzLCBzZWdtZW50KSA9PiB7XG4gICAgICAgICAgICBpZiAoc2VnbWVudC52YWx1ZSkge1xuICAgICAgICAgICAgICAgIHJlc1tzZWdtZW50Lm5hbWVdID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiBzZWdtZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGRpc3RyaWJ1dGlvbjogc2VnbWVudC5kaXN0cmlidXRpb24sXG4gICAgICAgICAgICAgICAgICAgIHByb2dyZXNzOiBzZWdtZW50LnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICByYXRpbzogMCxcbiAgICAgICAgICAgICAgICAgICAgc2hhcmU6IDAsXG4gICAgICAgICAgICAgICAgICAgIGRvbmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc1xuICAgICAgICB9LCB7fSBhcyBQcm9ncmVzc1NlZ2VtZW50cylcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9ncmVzc1NlZ21lbnRSZWYge1xuICAgIHJlYWRvbmx5ICNzdWJqZWN0OiBTdWJqZWN0PFByb2dyZXNzU2VnbWVudElucHV0PlxuXG4gICAgc2V0IGRpc3RyaWJ1dGlvbih2YWx1ZTogbnVtYmVyIHwgdW5kZWZpbmVkKSB7XG4gICAgICAgIGlmICh0aGlzLiNkaXN0cmlidXRpb24gIT09IHZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLiNkaXN0cmlidXRpb24gPSB2YWx1ZVxuICAgICAgICAgICAgaWYgKHRoaXMuI3ZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiNuZXh0KHRoaXMuI3ZhbHVlKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRpc3RyaWJ1dGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI2Rpc3RyaWJ1dGlvblxuICAgIH1cbiAgICAjZGlzdHJpYnV0aW9uPzogbnVtYmVyXG5cbiAgICBnZXQgdmFsdWUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiN2YWx1ZVxuICAgIH1cbiAgICAjdmFsdWU/OiBQcm9ncmVzc1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHN1YmplY3Q6IFN1YmplY3Q8UHJvZ3Jlc3NTZWdtZW50SW5wdXQ+LFxuICAgICAgICBwdWJsaWMgcmVhZG9ubHkgbmFtZTogc3RyaW5nLFxuICAgICAgICBkaXN0cmlidXRpb24/OiBudW1iZXJcbiAgICApIHtcbiAgICAgICAgdGhpcy4jc3ViamVjdCA9IHN1YmplY3RcbiAgICAgICAgdGhpcy4jZGlzdHJpYnV0aW9uID0gZGlzdHJpYnV0aW9uXG4gICAgfVxuXG4gICAgbmV4dChwcm9ncmVzczogUHJvZ3Jlc3MpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuI25leHQocHJvZ3Jlc3MpXG4gICAgfVxuXG4gICAgY29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiNuZXh0KFNFR01FTlRfQ09NUExFVEUpXG4gICAgfVxuXG4gICAgI25leHQocHJvZ3Jlc3M6IFByb2dyZXNzKSB7XG4gICAgICAgIHRoaXMuI3ZhbHVlID0gcHJvZ3Jlc3NcbiAgICAgICAgdGhpcy4jc3ViamVjdC5uZXh0KHsgbmFtZTogdGhpcy5uYW1lLCBkaXN0cmlidXRpb246IHRoaXMuZGlzdHJpYnV0aW9uLCBwcm9ncmVzcyB9KVxuICAgICAgICByZXR1cm4gdGhpc1xuICAgIH1cbn1cbiJdfQ==
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==