ng-virtual-list 16.11.4 → 16.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +73 -45
- package/esm2022/lib/components/ng-list-item/base/base-virtual-list-item-component.mjs +133 -31
- package/esm2022/lib/components/ng-list-item/const/index.mjs +13 -2
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.component.mjs +35 -42
- package/esm2022/lib/components/ng-list-item/ng-virtual-list-item.module.mjs +5 -5
- package/esm2022/lib/components/ng-list-item/utils/create-display-id.mjs +7 -1
- package/esm2022/lib/components/ng-list-item/utils/get-element-by-index.mjs +17 -3
- package/esm2022/lib/components/ng-list-item/utils/index.mjs +3 -2
- package/esm2022/lib/components/ng-list-item/utils/matrix-3d.mjs +18 -0
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.mjs +28 -18
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.mjs +32 -16
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.mjs +5 -5
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.mjs +8 -6
- package/esm2022/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.module.mjs +3 -3
- package/esm2022/lib/components/ng-prerender-container/core/prerender-track-box.mjs +38 -8
- package/esm2022/lib/components/ng-prerender-container/interfaces/refresh-params.mjs +1 -1
- package/esm2022/lib/components/ng-prerender-container/ng-prerender-container.component.mjs +7 -6
- package/esm2022/lib/components/ng-prerender-container/types/cache.mjs +1 -1
- package/esm2022/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.mjs +1 -1
- package/esm2022/lib/components/ng-scroll-bar/ng-scroll-bar.component.mjs +68 -27
- package/esm2022/lib/components/ng-scroll-view/base/base-scroll-view.component.mjs +108 -21
- package/esm2022/lib/components/ng-scroll-view/const/index.mjs +4 -2
- package/esm2022/lib/components/ng-scroll-view/interfaces/scroll-to-params.mjs +1 -1
- package/esm2022/lib/components/ng-scroll-view/ng-scroll-view.component.mjs +551 -71
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-direction.mjs +7 -1
- package/esm2022/lib/components/ng-scroll-view/utils/calculate-velocity.mjs +12 -0
- package/esm2022/lib/components/ng-scroll-view/utils/get-dir.mjs +10 -0
- package/esm2022/lib/components/ng-scroll-view/utils/index.mjs +4 -2
- package/esm2022/lib/components/ng-scroll-view/utils/matrix-3d.mjs +15 -0
- package/esm2022/lib/components/ng-scroller/enums/scroller-directions.mjs +1 -1
- package/esm2022/lib/components/ng-scroller/ng-scroller.component.mjs +199 -123
- package/esm2022/lib/components/ng-scroller/utils/scroll-box.mjs +2 -2
- package/esm2022/lib/const/index.mjs +50 -10
- package/esm2022/lib/core/cache-map.mjs +1 -54
- package/esm2022/lib/core/const/index.mjs +3 -0
- package/esm2022/lib/core/enums/index.mjs +3 -0
- package/esm2022/lib/core/enums/item-display-methods.mjs +14 -0
- package/esm2022/lib/core/events/index.mjs +3 -0
- package/esm2022/lib/core/events/track-box-events.mjs +12 -0
- package/esm2022/lib/core/interfaces/get-item-position-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/get-metrics-returns.mjs +2 -0
- package/esm2022/lib/core/interfaces/index.mjs +2 -0
- package/esm2022/lib/core/interfaces/item.mjs +2 -0
- package/esm2022/lib/core/interfaces/metrics.mjs +2 -0
- package/esm2022/lib/core/interfaces/recalculate-metrics-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/update-collection-options.mjs +2 -0
- package/esm2022/lib/core/interfaces/update-collection-returns.mjs +2 -0
- package/esm2022/lib/core/track-box.mjs +619 -204
- package/esm2022/lib/core/tracker.mjs +24 -15
- package/esm2022/lib/core/types/cache-map-events.mjs +2 -0
- package/esm2022/lib/core/types/cache-map-listeners.mjs +2 -0
- package/esm2022/lib/core/types/cache.mjs +2 -0
- package/esm2022/lib/core/types/index.mjs +2 -0
- package/esm2022/lib/core/types/on-change-event-listener.mjs +2 -0
- package/esm2022/lib/core/types/on-tick-event-listener.mjs +2 -0
- package/esm2022/lib/core/utils/get-service-id-prop.mjs +10 -0
- package/esm2022/lib/core/utils/index.mjs +3 -0
- package/esm2022/lib/directives/index.mjs +3 -3
- package/esm2022/lib/directives/locale-sensitive/locale-sensitive.directive.mjs +2 -1
- package/esm2022/lib/directives/virtual-click/virtual-click.directive.mjs +67 -0
- package/esm2022/lib/directives/virtual-click/virtual-click.module.mjs +19 -0
- package/esm2022/lib/enums/alignments.mjs +12 -0
- package/esm2022/lib/enums/collapsing-modes.mjs +22 -0
- package/esm2022/lib/enums/index.mjs +8 -4
- package/esm2022/lib/enums/selecting-modes-types.mjs +22 -0
- package/esm2022/lib/enums/selecting-modes.mjs +22 -0
- package/esm2022/lib/enums/snap-to-item-aligns.mjs +22 -0
- package/esm2022/lib/enums/spreading-modes.mjs +18 -0
- package/esm2022/lib/interfaces/animation-params.mjs +1 -1
- package/esm2022/lib/interfaces/base-virtual-list-item-component.mjs +2 -9
- package/esm2022/lib/interfaces/index.mjs +1 -1
- package/esm2022/lib/interfaces/item-transformation.mjs +2 -0
- package/esm2022/lib/interfaces/point.mjs +2 -0
- package/esm2022/lib/interfaces/scroll-options.mjs +1 -1
- package/esm2022/lib/interfaces/scroll-params.mjs +1 -1
- package/esm2022/lib/models/item-config-map.model.mjs +1 -1
- package/esm2022/lib/models/item.model.mjs +1 -1
- package/esm2022/lib/models/render-item-config.model.mjs +1 -1
- package/esm2022/lib/models/render-item-measures.model.mjs +1 -1
- package/esm2022/lib/ng-virtual-list-public.service.mjs +6 -7
- package/esm2022/lib/ng-virtual-list.component.mjs +1074 -354
- package/esm2022/lib/ng-virtual-list.service.mjs +83 -28
- package/esm2022/lib/transformations/deck-of-cards-3d.mjs +57 -0
- package/esm2022/lib/transformations/deck-of-cards.mjs +54 -0
- package/esm2022/lib/transformations/event-horizon.mjs +47 -0
- package/esm2022/lib/transformations/index.mjs +13 -0
- package/esm2022/lib/transformations/linear.mjs +47 -0
- package/esm2022/lib/transformations/swipe-3d.mjs +51 -0
- package/esm2022/lib/types/alignment.mjs +2 -0
- package/esm2022/lib/types/arithmetic-expression.mjs +2 -0
- package/esm2022/lib/types/collapsing-mode.mjs +2 -0
- package/esm2022/lib/types/collection-mode.mjs +2 -0
- package/esm2022/lib/types/color.mjs +2 -0
- package/esm2022/lib/types/direction.mjs +2 -0
- package/esm2022/lib/types/float-or-persentage-value.mjs +2 -0
- package/esm2022/lib/types/focus-item-params.mjs +1 -1
- package/esm2022/lib/types/gradient-color-position.mjs +1 -1
- package/esm2022/lib/types/index.mjs +1 -1
- package/esm2022/lib/types/item-transform.mjs +2 -0
- package/esm2022/lib/types/scroll-direction.mjs +1 -1
- package/esm2022/lib/types/selecting-mode.mjs +2 -0
- package/esm2022/lib/types/snap-to-item-align.mjs +2 -0
- package/esm2022/lib/types/snapping-distance.mjs +2 -0
- package/esm2022/lib/types/snapping-method.mjs +2 -0
- package/esm2022/lib/types/spreading-mode.mjs +2 -0
- package/esm2022/lib/types/text-direction.mjs +2 -0
- package/esm2022/lib/utils/animator/animator.mjs +28 -8
- package/esm2022/lib/utils/animator/const/index.mjs +2 -0
- package/esm2022/lib/utils/animator/ease.mjs +1 -13
- package/esm2022/lib/utils/animator/index.mjs +3 -2
- package/esm2022/lib/utils/animator/interfaces/animator-params.mjs +2 -0
- package/esm2022/lib/utils/animator/interfaces/animator-update-data.mjs +2 -0
- package/esm2022/lib/utils/animator/interfaces/index.mjs +2 -0
- package/esm2022/lib/utils/animator/types/easing.mjs +1 -1
- package/esm2022/lib/utils/event-emitter/event-emitter.mjs +2 -2
- package/esm2022/lib/utils/event-emitter/interfaces/event-emitter.mjs +1 -1
- package/esm2022/lib/utils/get-scroll-state-version.mjs +12 -0
- package/esm2022/lib/utils/is-collapse-mode.mjs +18 -0
- package/esm2022/lib/utils/is-collection-mode.mjs +1 -1
- package/esm2022/lib/utils/is-direction.mjs +1 -1
- package/esm2022/lib/utils/is-persentage-value.mjs +14 -0
- package/esm2022/lib/utils/is-select-mode.mjs +18 -0
- package/esm2022/lib/utils/is-spreading-mode.mjs +15 -0
- package/esm2022/lib/utils/normalize-collection.mjs +42 -0
- package/esm2022/lib/utils/parse-arithmetic-expression.mjs +53 -0
- package/esm2022/lib/utils/parse-float-or-persentage-value.mjs +17 -0
- package/esm2022/lib/utils/scrolling-direction.mjs +29 -0
- package/esm2022/lib/utils/snapping-method.mjs +1 -1
- package/esm2022/public-api.mjs +4 -1
- package/fesm2022/ng-virtual-list.mjs +5789 -3121
- package/fesm2022/ng-virtual-list.mjs.map +1 -1
- package/lib/components/ng-list-item/base/base-virtual-list-item-component.d.ts +19 -4
- package/lib/components/ng-list-item/const/index.d.ts +1 -1
- package/lib/components/ng-list-item/ng-virtual-list-item.component.d.ts +1 -1
- package/lib/components/ng-list-item/ng-virtual-list-item.module.d.ts +2 -2
- package/lib/components/ng-list-item/utils/create-display-id.d.ts +6 -0
- package/lib/components/ng-list-item/utils/get-element-by-index.d.ts +15 -1
- package/lib/components/ng-list-item/utils/index.d.ts +2 -1
- package/lib/components/ng-list-item/utils/matrix-3d.d.ts +7 -0
- package/lib/components/ng-prerender-container/components/ng-prerender-list/ng-prerender-list.component.d.ts +11 -7
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.component.d.ts +2 -2
- package/lib/components/ng-prerender-container/components/ng-prerender-list-item/ng-prerender-list-item.module.d.ts +2 -2
- package/lib/components/ng-prerender-container/components/ng-prerender-scroller/ng-prerender-scroller.component.d.ts +3 -3
- package/lib/components/ng-prerender-container/core/prerender-track-box.d.ts +1 -1
- package/lib/components/ng-prerender-container/interfaces/refresh-params.d.ts +2 -1
- package/lib/components/ng-prerender-container/ng-prerender-container.component.d.ts +5 -4
- package/lib/components/ng-prerender-container/types/cache.d.ts +1 -1
- package/lib/components/ng-scroll-bar/interfaces/scroll-bar-template-context.d.ts +1 -1
- package/lib/components/ng-scroll-bar/ng-scroll-bar.component.d.ts +11 -6
- package/lib/components/ng-scroll-view/base/base-scroll-view.component.d.ts +30 -10
- package/lib/components/ng-scroll-view/const/index.d.ts +3 -1
- package/lib/components/ng-scroll-view/interfaces/scroll-to-params.d.ts +4 -1
- package/lib/components/ng-scroll-view/ng-scroll-view.component.d.ts +65 -7
- package/lib/components/ng-scroll-view/utils/calculate-direction.d.ts +6 -0
- package/lib/components/ng-scroll-view/utils/calculate-velocity.d.ts +7 -0
- package/lib/components/ng-scroll-view/utils/get-dir.d.ts +7 -0
- package/lib/components/ng-scroll-view/utils/index.d.ts +3 -1
- package/lib/components/ng-scroll-view/utils/matrix-3d.d.ts +7 -0
- package/lib/components/ng-scroller/enums/scroller-directions.d.ts +2 -1
- package/lib/components/ng-scroller/ng-scroller.component.d.ts +40 -26
- package/lib/components/ng-scroller/utils/scroll-box.d.ts +1 -1
- package/lib/const/index.d.ts +46 -5
- package/lib/core/cache-map.d.ts +0 -10
- package/lib/core/const/index.d.ts +1 -0
- package/lib/core/enums/index.d.ts +2 -0
- package/lib/core/enums/item-display-methods.d.ts +12 -0
- package/lib/core/events/index.d.ts +2 -0
- package/lib/core/events/track-box-events.d.ts +10 -0
- package/lib/core/interfaces/get-item-position-options.d.ts +10 -0
- package/lib/core/interfaces/get-metrics-returns.d.ts +11 -0
- package/lib/core/interfaces/index.d.ts +8 -0
- package/lib/core/interfaces/item.d.ts +9 -0
- package/lib/core/interfaces/metrics.d.ts +51 -0
- package/lib/core/interfaces/recalculate-metrics-options.d.ts +33 -0
- package/lib/core/interfaces/update-collection-options.d.ts +10 -0
- package/lib/core/interfaces/update-collection-returns.d.ts +14 -0
- package/lib/core/track-box.d.ts +26 -96
- package/lib/core/tracker.d.ts +1 -1
- package/lib/core/types/cache-map-events.d.ts +8 -0
- package/lib/core/types/cache-map-listeners.d.ts +9 -0
- package/lib/core/types/cache.d.ts +12 -0
- package/lib/core/types/index.d.ts +6 -0
- package/lib/core/types/on-change-event-listener.d.ts +7 -0
- package/lib/core/types/on-tick-event-listener.d.ts +7 -0
- package/lib/core/utils/get-service-id-prop.d.ts +7 -0
- package/lib/core/utils/index.d.ts +2 -0
- package/lib/directives/index.d.ts +2 -2
- package/lib/directives/locale-sensitive/locale-sensitive.directive.d.ts +1 -1
- package/lib/directives/{item-click/item-click.directive.d.ts → virtual-click/virtual-click.directive.d.ts} +4 -4
- package/lib/directives/virtual-click/virtual-click.module.d.ts +8 -0
- package/lib/enums/alignments.d.ts +10 -0
- package/lib/enums/collapsing-modes.d.ts +20 -0
- package/lib/enums/index.d.ts +7 -9
- package/lib/enums/{method-for-selecting-types.d.ts → selecting-modes-types.d.ts} +3 -3
- package/lib/enums/{methods-for-selecting.d.ts → selecting-modes.d.ts} +3 -3
- package/lib/enums/snap-to-item-aligns.d.ts +20 -0
- package/lib/enums/spreading-modes.d.ts +16 -0
- package/lib/interfaces/animation-params.d.ts +1 -0
- package/lib/interfaces/base-virtual-list-item-component.d.ts +13 -13
- package/lib/interfaces/index.d.ts +3 -2
- package/lib/interfaces/item-transformation.d.ts +22 -0
- package/lib/interfaces/point.d.ts +16 -0
- package/lib/interfaces/scroll-options.d.ts +4 -0
- package/lib/interfaces/scroll-params.d.ts +2 -1
- package/lib/models/item-config-map.model.d.ts +5 -0
- package/lib/models/item.model.d.ts +7 -0
- package/lib/models/render-item-config.model.d.ts +50 -0
- package/lib/models/render-item-measures.model.d.ts +71 -0
- package/lib/ng-virtual-list-public.service.d.ts +4 -5
- package/lib/ng-virtual-list.component.d.ts +252 -53
- package/lib/ng-virtual-list.service.d.ts +30 -12
- package/lib/transformations/deck-of-cards-3d.d.ts +54 -0
- package/lib/transformations/deck-of-cards.d.ts +50 -0
- package/lib/transformations/event-horizon.d.ts +26 -0
- package/lib/transformations/index.d.ts +7 -0
- package/lib/transformations/linear.d.ts +26 -0
- package/lib/transformations/swipe-3d.d.ts +38 -0
- package/lib/types/alignment.d.ts +8 -0
- package/lib/types/arithmetic-expression.d.ts +10 -0
- package/lib/types/collapsing-mode.d.ts +8 -0
- package/lib/{enums → types}/collection-mode.d.ts +1 -1
- package/lib/types/color.d.ts +4 -0
- package/lib/{enums → types}/direction.d.ts +1 -1
- package/lib/types/float-or-persentage-value.d.ts +7 -0
- package/lib/types/focus-item-params.d.ts +6 -0
- package/lib/types/gradient-color-position.d.ts +1 -1
- package/lib/types/index.d.ts +15 -1
- package/lib/types/item-transform.d.ts +9 -0
- package/lib/types/scroll-direction.d.ts +2 -0
- package/lib/types/selecting-mode.d.ts +8 -0
- package/lib/types/snap-to-item-align.d.ts +8 -0
- package/lib/types/snapping-distance.d.ts +8 -0
- package/lib/{enums → types}/snapping-method.d.ts +1 -1
- package/lib/types/spreading-mode.d.ts +8 -0
- package/lib/{enums → types}/text-direction.d.ts +1 -1
- package/lib/utils/animator/animator.d.ts +10 -17
- package/lib/utils/animator/const/index.d.ts +1 -0
- package/lib/utils/animator/ease.d.ts +0 -12
- package/lib/utils/animator/index.d.ts +2 -1
- package/lib/utils/animator/interfaces/animator-params.d.ts +18 -0
- package/lib/utils/animator/interfaces/animator-update-data.d.ts +13 -0
- package/lib/utils/animator/interfaces/index.d.ts +3 -0
- package/lib/utils/animator/types/easing.d.ts +1 -1
- package/lib/utils/event-emitter/event-emitter.d.ts +1 -1
- package/lib/utils/event-emitter/interfaces/event-emitter.d.ts +1 -1
- package/lib/utils/get-scroll-state-version.d.ts +1 -0
- package/lib/utils/is-collapse-mode.d.ts +8 -0
- package/lib/utils/is-collection-mode.d.ts +1 -1
- package/lib/utils/is-direction.d.ts +1 -1
- package/lib/utils/is-persentage-value.d.ts +7 -0
- package/lib/utils/is-select-mode.d.ts +8 -0
- package/lib/utils/is-spreading-mode.d.ts +8 -0
- package/lib/utils/normalize-collection.d.ts +8 -0
- package/lib/utils/parse-arithmetic-expression.d.ts +8 -0
- package/lib/utils/parse-float-or-persentage-value.d.ts +7 -0
- package/lib/utils/scrolling-direction.d.ts +17 -0
- package/lib/utils/snapping-method.d.ts +1 -1
- package/package.json +1 -1
- package/public-api.d.ts +3 -0
- package/esm2022/lib/components/ng-scroller/const/index.mjs +0 -2
- package/esm2022/lib/directives/item-click/item-click.directive.mjs +0 -66
- package/esm2022/lib/directives/item-click/item-click.module.mjs +0 -19
- package/esm2022/lib/enums/collection-mode.mjs +0 -2
- package/esm2022/lib/enums/direction.mjs +0 -2
- package/esm2022/lib/enums/method-for-selecting-types.mjs +0 -22
- package/esm2022/lib/enums/method-for-selecting.mjs +0 -2
- package/esm2022/lib/enums/methods-for-selecting.mjs +0 -22
- package/esm2022/lib/enums/snapping-method.mjs +0 -2
- package/esm2022/lib/enums/text-direction.mjs +0 -2
- package/esm2022/lib/utils/is-method-for-selecting.mjs +0 -18
- package/lib/components/ng-scroller/const/index.d.ts +0 -1
- package/lib/directives/item-click/item-click.module.d.ts +0 -8
- package/lib/enums/method-for-selecting.d.ts +0 -8
- package/lib/utils/is-method-for-selecting.d.ts +0 -8
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import { Component, inject, Input, ViewChild, } from '@angular/core';
|
|
2
2
|
import { CdkScrollable } from '@angular/cdk/scrolling';
|
|
3
|
-
import { BehaviorSubject, filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
|
|
4
|
-
import { ScrollerDirection } from './enums';
|
|
3
|
+
import { BehaviorSubject, debounceTime, delay, filter, fromEvent, map, of, race, Subject, switchMap, takeUntil, tap } from 'rxjs';
|
|
5
4
|
import { ANIMATOR_MIN_TIMESTAMP, Animator, easeOutQuad } from '../../utils/animator';
|
|
6
|
-
import { BEHAVIOR_INSTANT, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SCROLLING_SETTINGS, INTERACTIVE, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, TOUCH_END, TOUCH_MOVE, TOUCH_START, WHEEL, } from '../../const';
|
|
7
|
-
import { ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_VELOCITY_TIMESTAMP, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
|
|
8
|
-
import { calculateDirection } from './utils';
|
|
5
|
+
import { BEHAVIOR_INSTANT, DEFAULT_ANIMATION_PARAMS, DEFAULT_OVERSCROLL_ENABLED, DEFAULT_SCROLL_BEHAVIOR, DEFAULT_SCROLLING_ONE_BY_ONE, DEFAULT_SCROLLING_SETTINGS, DEFAULT_SNAP_TO_ITEM, DEFAULT_SNAP_TO_ITEM_ALIGN, DEFAULT_SNAPPING_DISTANCE, INTERACTIVE, MOUSE_DOWN, MOUSE_MOVE, MOUSE_UP, TOUCH_END, TOUCH_MOVE, TOUCH_START, WHEEL, } from '../../const';
|
|
6
|
+
import { ANIMATION_DURATION, AUTO, DURATION, FRICTION_FORCE, INSTANT, LEFT, MASS, MAX_DIST, MAX_DURATION, MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS, MAX_VELOCITY_TIMESTAMP, OVERSCROLL_START_ITERATION, SCROLL_EVENT, SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO, SMOOTH, SPEED_SCALE, TOP, } from './const';
|
|
7
|
+
import { calculateDirection, matrix3d } from './utils';
|
|
9
8
|
import { BaseScrollView } from './base/base-scroll-view.component';
|
|
9
|
+
import { SnapToItemAligns } from '../../enums';
|
|
10
|
+
import { NgVirtualListService } from '../../ng-virtual-list.service';
|
|
11
|
+
import { parseFloatOrPersentageValue } from '../../utils/parse-float-or-persentage-value';
|
|
12
|
+
import { isPercentageValue } from '../../utils/is-persentage-value';
|
|
13
|
+
import { ScrollingDirection } from '../../utils/scrolling-direction';
|
|
14
|
+
import { calculateVelocity } from './utils/calculate-velocity';
|
|
10
15
|
import * as i0 from "@angular/core";
|
|
11
16
|
/**
|
|
12
17
|
* NgScrollView
|
|
@@ -18,6 +23,7 @@ import * as i0 from "@angular/core";
|
|
|
18
23
|
*/
|
|
19
24
|
export class NgScrollView extends BaseScrollView {
|
|
20
25
|
cdkScrollable;
|
|
26
|
+
_service = inject(NgVirtualListService);
|
|
21
27
|
_$scrollBehavior = new BehaviorSubject(DEFAULT_SCROLL_BEHAVIOR);
|
|
22
28
|
$scrollBehavior = this._$scrollBehavior.asObservable();
|
|
23
29
|
set scrollBehavior(v) {
|
|
@@ -42,42 +48,199 @@ export class NgScrollView extends BaseScrollView {
|
|
|
42
48
|
}
|
|
43
49
|
}
|
|
44
50
|
get scrollingSettings() { return this._$scrollingSettings.getValue(); }
|
|
51
|
+
_$snapToItem = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM);
|
|
52
|
+
$snapToItem = this._$snapToItem.asObservable();
|
|
53
|
+
set snapToItem(v) {
|
|
54
|
+
if (this._$snapToItem.getValue() !== v) {
|
|
55
|
+
this._$snapToItem.next(v);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
get snapToItem() { return this._$snapToItem.getValue(); }
|
|
59
|
+
_$scrollingOneByOne = new BehaviorSubject(DEFAULT_SCROLLING_ONE_BY_ONE);
|
|
60
|
+
$scrollingOneByOne = this._$scrollingOneByOne.asObservable();
|
|
61
|
+
set scrollingOneByOne(v) {
|
|
62
|
+
if (this._$scrollingOneByOne.getValue() !== v) {
|
|
63
|
+
this._$scrollingOneByOne.next(v);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
get scrollingOneByOne() { return this._$scrollingOneByOne.getValue(); }
|
|
67
|
+
_$snapToItemAlign = new BehaviorSubject(DEFAULT_SNAP_TO_ITEM_ALIGN);
|
|
68
|
+
$snapToItemAlign = this._$snapToItemAlign.asObservable();
|
|
69
|
+
set snapToItemAlign(v) {
|
|
70
|
+
if (this._$snapToItemAlign.getValue() !== v) {
|
|
71
|
+
this._$snapToItemAlign.next(v);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
get snapToItemAlign() { return this._$snapToItemAlign.getValue(); }
|
|
75
|
+
_$snappingDistance = new BehaviorSubject(DEFAULT_SNAPPING_DISTANCE);
|
|
76
|
+
$snappingDistance = this._$snappingDistance.asObservable();
|
|
77
|
+
set snappingDistance(v) {
|
|
78
|
+
if (this._$snappingDistance.getValue() !== v) {
|
|
79
|
+
this._$snappingDistance.next(v);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
get snappingDistance() { return this._$snappingDistance.getValue(); }
|
|
83
|
+
_$animationParams = new BehaviorSubject(DEFAULT_ANIMATION_PARAMS);
|
|
84
|
+
$animationParams = this._$animationParams.asObservable();
|
|
85
|
+
set animationParams(v) {
|
|
86
|
+
if (this._$animationParams.getValue() !== v) {
|
|
87
|
+
this._$animationParams.next(v);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
get animationParams() { return this._$animationParams.getValue(); }
|
|
45
91
|
_normalizeValueFromZero = inject(SCROLL_VIEW_NORMALIZE_VALUE_FROM_ZERO);
|
|
92
|
+
_isScrollsTo = false;
|
|
93
|
+
_scrollDirection = new ScrollingDirection();
|
|
94
|
+
get scrollDirection() {
|
|
95
|
+
return this._scrollDirection.get();
|
|
96
|
+
}
|
|
97
|
+
get $scrollDirection() { return this._scrollDirection.$direction; }
|
|
98
|
+
_$wheel = new Subject();
|
|
99
|
+
$wheel = this._$wheel.asObservable();
|
|
46
100
|
_$scroll = new Subject();
|
|
47
101
|
$scroll = this._$scroll.asObservable();
|
|
48
102
|
_$scrollEnd = new Subject();
|
|
49
103
|
$scrollEnd = this._$scrollEnd.asObservable();
|
|
104
|
+
_velocities = [];
|
|
105
|
+
_$velocity = new BehaviorSubject(0);
|
|
106
|
+
$velocity = this._$velocity.asObservable();
|
|
107
|
+
get velocity() { return this._$velocity.getValue(); }
|
|
108
|
+
_$averageVelocity = new BehaviorSubject(0);
|
|
109
|
+
$averageVelocity = this._$averageVelocity.asObservable();
|
|
110
|
+
get averageVelocity() { return this._$averageVelocity.getValue(); }
|
|
111
|
+
_measureVelocityTimestamp = Date.now();
|
|
112
|
+
_measureVelocityLastPosition = this._$isVertical.getValue() ? this._y : this._x;
|
|
50
113
|
_startPosition = 0;
|
|
51
114
|
_animator = new Animator();
|
|
52
115
|
_interactive = true;
|
|
53
116
|
_overscrollIteration = 0;
|
|
117
|
+
set x(v) {
|
|
118
|
+
this.setX(v);
|
|
119
|
+
}
|
|
120
|
+
get x() { return this._x; }
|
|
121
|
+
setX(x, snap = true, normalize = true) {
|
|
122
|
+
if (x !== undefined && !Number.isNaN(x)) {
|
|
123
|
+
this.updateDirection(x, this._y);
|
|
124
|
+
this._x = this._actualY = x;
|
|
125
|
+
if (normalize) {
|
|
126
|
+
this.normalizeScrollSize();
|
|
127
|
+
}
|
|
128
|
+
this.refreshCoordinate(this._x, this._y);
|
|
129
|
+
this.measureVelocity();
|
|
130
|
+
if (snap) {
|
|
131
|
+
this.checkIntersectionComponent();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
set y(v) {
|
|
136
|
+
this.setY(v);
|
|
137
|
+
}
|
|
138
|
+
get y() { return this._y; }
|
|
139
|
+
setY(y, snap = true, normalize = true) {
|
|
140
|
+
if (y !== undefined && !Number.isNaN(y)) {
|
|
141
|
+
this.updateDirection(y, this._y);
|
|
142
|
+
this._y = this._actualY = y;
|
|
143
|
+
if (normalize) {
|
|
144
|
+
this.normalizeScrollSize();
|
|
145
|
+
}
|
|
146
|
+
this.refreshCoordinate(this._x, this._y);
|
|
147
|
+
this.measureVelocity();
|
|
148
|
+
if (snap) {
|
|
149
|
+
this.checkIntersectionComponent();
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
_delta = 0;
|
|
54
154
|
set delta(v) {
|
|
155
|
+
this._delta = v;
|
|
55
156
|
this._startPosition += v;
|
|
56
157
|
}
|
|
158
|
+
set startLayoutOffset(v) {
|
|
159
|
+
if (this._startLayoutOffset !== v) {
|
|
160
|
+
this._startLayoutOffset = v;
|
|
161
|
+
this.refreshCoordinate(this._x, this._y);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
get startLayoutOffset() { return this._startLayoutOffset; }
|
|
165
|
+
_intersectionComponentId = null;
|
|
166
|
+
_isAlignmentAnimation = false;
|
|
57
167
|
constructor() {
|
|
58
168
|
super();
|
|
59
169
|
}
|
|
60
170
|
ngAfterViewInit() {
|
|
171
|
+
let mouseCanceled = false, touchCanceled = false;
|
|
172
|
+
const $viewportBounds = this.$viewportBounds;
|
|
173
|
+
$viewportBounds.pipe(takeUntil(this._$unsubscribe), debounceTime(0), tap(() => {
|
|
174
|
+
this._isMoving = false;
|
|
175
|
+
this._$grabbing.next(false);
|
|
176
|
+
if (!mouseCanceled || !touchCanceled) {
|
|
177
|
+
this.stopMoving();
|
|
178
|
+
}
|
|
179
|
+
mouseCanceled = touchCanceled = true;
|
|
180
|
+
if (this.snapToItem || this.scrollingOneByOne) {
|
|
181
|
+
this.stopScrolling(true);
|
|
182
|
+
this.alignPosition(true, true);
|
|
183
|
+
}
|
|
184
|
+
this._$scrollEnd.next(false);
|
|
185
|
+
})).subscribe();
|
|
186
|
+
const $wheel = this.$wheel;
|
|
187
|
+
$wheel.pipe(takeUntil(this._$unsubscribe), switchMap(v => of(this.averageVelocity)), debounceTime(100), tap(v => {
|
|
188
|
+
this.snapWithInitialForceIfNecessary(v);
|
|
189
|
+
this._scrollDirection.clear();
|
|
190
|
+
})).subscribe();
|
|
61
191
|
const $viewport = of(this.scrollViewport).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $content = of(this.scrollContent).pipe(takeUntil(this._$unsubscribe), filter(v => !!v), map(v => v.nativeElement)), $wheelEmitter = this._inversion ? $viewport : $content;
|
|
62
192
|
$wheelEmitter.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
|
|
63
193
|
return fromEvent(content, WHEEL, { passive: false }).pipe(filter(() => this._interactive), takeUntil(this._$unsubscribe), tap(e => {
|
|
64
194
|
const isVertical = this._$isVertical.getValue();
|
|
65
195
|
this.emitScrollableEvent();
|
|
66
196
|
this.checkOverscroll(e);
|
|
67
|
-
this.stopScrolling();
|
|
68
|
-
const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this.
|
|
69
|
-
this.scroll({ [isVertical ? TOP : LEFT]: position, behavior: INSTANT, userAction: true });
|
|
197
|
+
this.stopScrolling(true);
|
|
198
|
+
const scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, startPos = isVertical ? this._y : this._x, delta = isVertical ? e.deltaY : e.deltaX, dp = (startPos + delta), position = this.isInfinity ? dp : (dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp);
|
|
199
|
+
this.scroll({ [isVertical ? TOP : LEFT]: position, behavior: INSTANT, userAction: true, blending: false, fireUpdate: true });
|
|
200
|
+
this._$wheel.next(delta);
|
|
70
201
|
}));
|
|
71
202
|
})).subscribe();
|
|
72
|
-
const $mouseUp =
|
|
203
|
+
const $mouseUp = race([
|
|
204
|
+
fromEvent(window, MOUSE_UP, { passive: true }).pipe(takeUntil(this._$unsubscribe)),
|
|
205
|
+
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => fromEvent(content, MOUSE_UP, { passive: true }))),
|
|
206
|
+
]), $mouseDragCancel = $mouseUp.pipe(takeUntil(this._$unsubscribe), delay(0), tap(() => {
|
|
73
207
|
this._isMoving = false;
|
|
74
208
|
this._$grabbing.next(false);
|
|
209
|
+
if (!mouseCanceled) {
|
|
210
|
+
this.stopMoving();
|
|
211
|
+
}
|
|
212
|
+
mouseCanceled = true;
|
|
213
|
+
if (this.snapToItem && this.scrollingOneByOne) {
|
|
214
|
+
this._isAlignmentAnimation = false;
|
|
215
|
+
this.alignPosition(true, true);
|
|
216
|
+
}
|
|
217
|
+
this._$scrollEnd.next(true);
|
|
75
218
|
}));
|
|
219
|
+
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
|
|
220
|
+
return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
|
|
221
|
+
return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil(fromEvent(window, MOUSE_MOVE, { passive: false })), tap(e => {
|
|
222
|
+
this._isMoving = false;
|
|
223
|
+
this._$grabbing.next(false);
|
|
224
|
+
if (!mouseCanceled) {
|
|
225
|
+
this.stopMoving();
|
|
226
|
+
}
|
|
227
|
+
mouseCanceled = true;
|
|
228
|
+
if (this.snapToItem || this.scrollingOneByOne) {
|
|
229
|
+
this._isAlignmentAnimation = false;
|
|
230
|
+
this.alignPosition(true, true);
|
|
231
|
+
}
|
|
232
|
+
this._$scrollEnd.next(true);
|
|
233
|
+
}));
|
|
234
|
+
}));
|
|
235
|
+
})).subscribe();
|
|
76
236
|
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
|
|
77
237
|
return fromEvent(content, MOUSE_DOWN, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(v => this._interactive), switchMap(e => {
|
|
238
|
+
mouseCanceled = false;
|
|
239
|
+
this._scrollDirection.clear();
|
|
78
240
|
this.cancelOverscroll();
|
|
79
241
|
this.onDragStart();
|
|
80
|
-
this.stopScrolling();
|
|
242
|
+
this.stopScrolling(true);
|
|
243
|
+
this.stopMoving();
|
|
81
244
|
const target = e.target;
|
|
82
245
|
if (target.classList.contains(INTERACTIVE)) {
|
|
83
246
|
return of(undefined);
|
|
@@ -86,36 +249,76 @@ export class NgScrollView extends BaseScrollView {
|
|
|
86
249
|
this._isMoving = true;
|
|
87
250
|
this._$grabbing.next(true);
|
|
88
251
|
this._startPosition = (isVertical ? this.y : this.x);
|
|
89
|
-
let prevClientPosition =
|
|
252
|
+
let prevClientPosition = isVertical ? e.clientY : e.clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
|
|
90
253
|
return fromEvent(window, MOUSE_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
|
|
91
254
|
this.checkOverscroll(e);
|
|
92
255
|
}), switchMap(e => {
|
|
93
256
|
const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
|
|
94
257
|
prevClientPosition = currentPos;
|
|
95
258
|
this.move(isVertical, position, true, true, true);
|
|
259
|
+
const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
|
|
260
|
+
if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
|
|
261
|
+
startClientPos -= offset;
|
|
262
|
+
}
|
|
96
263
|
startTime = endTime;
|
|
97
|
-
return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), tap(e => {
|
|
264
|
+
return race([fromEvent(window, MOUSE_UP, { passive: false }), fromEvent(content, MOUSE_UP, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($mouseDragCancel), tap(e => {
|
|
265
|
+
mouseCanceled = true;
|
|
98
266
|
this.cancelOverscroll();
|
|
99
267
|
const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
|
|
100
268
|
this._isMoving = false;
|
|
101
269
|
this._$grabbing.next(false);
|
|
102
|
-
if (this.
|
|
103
|
-
|
|
270
|
+
if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
|
|
271
|
+
this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
|
|
272
|
+
}
|
|
273
|
+
else {
|
|
274
|
+
this.snapIfNecessary(v0);
|
|
275
|
+
this._$scrollEnd.next(true);
|
|
104
276
|
}
|
|
105
|
-
this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
|
|
106
277
|
}));
|
|
107
278
|
}));
|
|
108
279
|
}));
|
|
109
280
|
})).subscribe();
|
|
110
|
-
const $touchUp =
|
|
281
|
+
const $touchUp = race([
|
|
282
|
+
fromEvent(window, TOUCH_END, { passive: false }).pipe(takeUntil(this._$unsubscribe)),
|
|
283
|
+
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => fromEvent(content, TOUCH_END, { passive: false }))),
|
|
284
|
+
]), $touchCanceler = $touchUp.pipe(takeUntil(this._$unsubscribe), delay(0), tap(() => {
|
|
111
285
|
this._isMoving = false;
|
|
112
286
|
this._$grabbing.next(false);
|
|
287
|
+
if (!touchCanceled) {
|
|
288
|
+
this.stopMoving();
|
|
289
|
+
}
|
|
290
|
+
touchCanceled = true;
|
|
291
|
+
if (this.snapToItem && this.scrollingOneByOne) {
|
|
292
|
+
this._isAlignmentAnimation = false;
|
|
293
|
+
this.alignPosition(true, true);
|
|
294
|
+
}
|
|
295
|
+
this._$scrollEnd.next(true);
|
|
113
296
|
}));
|
|
114
297
|
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
|
|
115
298
|
return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
|
|
299
|
+
return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil(fromEvent(window, TOUCH_MOVE, { passive: false })), tap(e => {
|
|
300
|
+
this._isMoving = false;
|
|
301
|
+
this._$grabbing.next(false);
|
|
302
|
+
if (!touchCanceled) {
|
|
303
|
+
this.stopMoving();
|
|
304
|
+
}
|
|
305
|
+
touchCanceled = true;
|
|
306
|
+
if (this.snapToItem || this.scrollingOneByOne) {
|
|
307
|
+
this._isAlignmentAnimation = false;
|
|
308
|
+
this.alignPosition(true, true);
|
|
309
|
+
}
|
|
310
|
+
this._$scrollEnd.next(true);
|
|
311
|
+
}));
|
|
312
|
+
}));
|
|
313
|
+
})).subscribe();
|
|
314
|
+
$content.pipe(takeUntil(this._$unsubscribe), switchMap(content => {
|
|
315
|
+
return fromEvent(content, TOUCH_START, { passive: false }).pipe(takeUntil(this._$unsubscribe), filter(() => this._interactive), switchMap(e => {
|
|
316
|
+
touchCanceled = false;
|
|
317
|
+
this._scrollDirection.clear();
|
|
116
318
|
this.cancelOverscroll();
|
|
117
319
|
this.onDragStart();
|
|
118
|
-
this.stopScrolling();
|
|
320
|
+
this.stopScrolling(true);
|
|
321
|
+
this.stopMoving();
|
|
119
322
|
const target = e.target;
|
|
120
323
|
if (target.classList.contains(INTERACTIVE)) {
|
|
121
324
|
return of(undefined);
|
|
@@ -124,35 +327,109 @@ export class NgScrollView extends BaseScrollView {
|
|
|
124
327
|
this._isMoving = true;
|
|
125
328
|
this._$grabbing.next(true);
|
|
126
329
|
this._startPosition = (isVertical ? this.y : this.x);
|
|
127
|
-
let prevClientPosition =
|
|
330
|
+
let prevClientPosition = isVertical ? e.touches[e.touches.length - 1].clientY : e.touches[e.touches.length - 1].clientX, startClientPos = prevClientPosition, offsets = new Array(), velocities = new Array(), startTime = Date.now();
|
|
128
331
|
return fromEvent(window, TOUCH_MOVE, { passive: false }).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
|
|
129
332
|
this.checkOverscroll(e);
|
|
130
333
|
}), switchMap(e => {
|
|
131
334
|
const { position, currentPos, endTime, scrollDelta } = this.calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities);
|
|
132
335
|
prevClientPosition = currentPos;
|
|
133
336
|
this.move(isVertical, position, true, true, true);
|
|
337
|
+
const offset = Math.abs(position) - Math.abs(isVertical ? this._y : this._x), scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
|
|
338
|
+
if (position >= (scrollSize - viewportSize * .5) || position <= 0) {
|
|
339
|
+
startClientPos -= offset;
|
|
340
|
+
}
|
|
134
341
|
startTime = endTime;
|
|
135
|
-
return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), tap(e => {
|
|
342
|
+
return race([fromEvent(window, TOUCH_END, { passive: false }), fromEvent(content, TOUCH_END, { passive: false })]).pipe(takeUntil(this._$unsubscribe), takeUntil($touchCanceler), tap(e => {
|
|
343
|
+
touchCanceled = true;
|
|
136
344
|
this.cancelOverscroll();
|
|
137
345
|
const endTime = Date.now(), timestamp = endTime - startTime, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp), { a0 } = this.calculateAcceleration(velocities, v0, timestamp);
|
|
138
346
|
this._isMoving = false;
|
|
139
347
|
this._$grabbing.next(false);
|
|
140
|
-
if (this.
|
|
141
|
-
|
|
348
|
+
if (!this.snapIfNecessary(v0, false) && this.scrollBehavior !== BEHAVIOR_INSTANT) {
|
|
349
|
+
this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
|
|
350
|
+
}
|
|
351
|
+
else {
|
|
352
|
+
this.snapIfNecessary(v0);
|
|
353
|
+
this._$scrollEnd.next(true);
|
|
142
354
|
}
|
|
143
|
-
this.moveWithAcceleration(isVertical, position, 0, v0, a0, timestamp);
|
|
144
355
|
}));
|
|
145
356
|
}));
|
|
146
357
|
}));
|
|
147
358
|
})).subscribe();
|
|
148
359
|
}
|
|
360
|
+
updateDirection(position, prePosition) {
|
|
361
|
+
const delta = (position - this._delta) - prePosition;
|
|
362
|
+
this._scrollDirection.add(delta > 0 ? 1 : delta < 0 ? -1 : 0);
|
|
363
|
+
}
|
|
364
|
+
overrideCoordinates(x, y) {
|
|
365
|
+
super.overrideCoordinates(x, y);
|
|
366
|
+
const position = Math.abs(this._$isVertical.getValue() ? y : x);
|
|
367
|
+
this._measureVelocityTimestamp = Date.now();
|
|
368
|
+
this._measureVelocityLastPosition = position;
|
|
369
|
+
this.refreshCoordinate(x, y);
|
|
370
|
+
}
|
|
371
|
+
measureVelocity() {
|
|
372
|
+
const timestamp = Date.now();
|
|
373
|
+
if (timestamp === this._measureVelocityTimestamp) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
const position = Math.abs(this._$isVertical.getValue() ? this._y : this._x);
|
|
377
|
+
if (!this.isInfinity) {
|
|
378
|
+
if (position <= 0 || position >= (this._$isVertical.getValue() ? this.scrollHeight : this.scrollWidth)) {
|
|
379
|
+
this._velocities = [0];
|
|
380
|
+
this._$averageVelocity.next(0);
|
|
381
|
+
this._measureVelocityLastPosition = position;
|
|
382
|
+
this._measureVelocityTimestamp = timestamp;
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
if (this._delta !== 0) {
|
|
387
|
+
return;
|
|
388
|
+
}
|
|
389
|
+
const timeDelta = timestamp - this._measureVelocityTimestamp, positionDelta = Math.abs(position - this._measureVelocityLastPosition), velocity = timeDelta > 0 ? positionDelta / timeDelta : 0;
|
|
390
|
+
let avgVelocity = this._velocities.length > 0 ? this._velocities.reduce((p, c) => p + c) : 0;
|
|
391
|
+
if (this._velocities.length >= MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS) {
|
|
392
|
+
this._velocities.shift();
|
|
393
|
+
}
|
|
394
|
+
avgVelocity += velocity;
|
|
395
|
+
this._$velocity.next(velocity);
|
|
396
|
+
this._velocities.push(velocity);
|
|
397
|
+
this._$averageVelocity.next(avgVelocity / MAX_ITERATIONS_FOR_AVERAGE_CALCULATIONS);
|
|
398
|
+
this._measureVelocityLastPosition = position;
|
|
399
|
+
this._measureVelocityTimestamp = timestamp;
|
|
400
|
+
}
|
|
401
|
+
stopMoving() { }
|
|
402
|
+
snapIfNecessary(v0, withInitialForce = true, animated = true, force = false) {
|
|
403
|
+
const scrollDirection = this._scrollDirection.get() || (force ? 1 : 0);
|
|
404
|
+
if (scrollDirection === 0) {
|
|
405
|
+
return false;
|
|
406
|
+
}
|
|
407
|
+
const snapToItem = this.snapToItem;
|
|
408
|
+
if (!!snapToItem) {
|
|
409
|
+
const scrollingOneByOne = this.scrollingOneByOne;
|
|
410
|
+
if (scrollingOneByOne) {
|
|
411
|
+
return this.alignPosition();
|
|
412
|
+
}
|
|
413
|
+
if (withInitialForce) {
|
|
414
|
+
return this.snapWithInitialForceIfNecessary(v0, animated, force);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return false;
|
|
418
|
+
}
|
|
419
|
+
snapWithInitialForceIfNecessary(v0 = null, animated = true, force = false) {
|
|
420
|
+
const t = this.animationParams.snapToItem * .01, s = this.getSnappedComponentSize(), va = s !== null && t !== 0 ? (s / t) : 0;
|
|
421
|
+
if (va >= Math.abs(v0 ?? this.averageVelocity)) {
|
|
422
|
+
return this.alignPosition(animated, force);
|
|
423
|
+
}
|
|
424
|
+
return false;
|
|
425
|
+
}
|
|
149
426
|
calculatePosition(isVertical, e, inversion, startClientPos, startTime, prevClientPosition, offsets, velocities) {
|
|
150
|
-
const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position =
|
|
427
|
+
const currentPos = isVertical ? e.touches?.[e.touches?.length - 1]?.clientY || e.clientY : e.touches?.[e.touches?.length - 1]?.clientX || e.clientX, scrollSize = isVertical ? this.scrollHeight : this.scrollWidth, delta = (inversion ? -1 : 1) * (startClientPos - currentPos), dp = this._startPosition + delta, position = this.isInfinity ? dp : dp < 0 ? 0 : dp > scrollSize ? scrollSize : dp, endTime = Date.now(), timestamp = endTime - startTime, scrollDelta = prevClientPosition === 0 ? 0 : prevClientPosition - currentPos, { v0 } = this.calculateVelocity(offsets, scrollDelta, timestamp);
|
|
151
428
|
this.calculateAcceleration(velocities, v0, timestamp);
|
|
152
429
|
return { position, currentPos, endTime, scrollDelta };
|
|
153
430
|
}
|
|
154
431
|
cancelOverscroll() {
|
|
155
|
-
if (!this.
|
|
432
|
+
if (!this.overscrollEnabled) {
|
|
156
433
|
return;
|
|
157
434
|
}
|
|
158
435
|
this._overscrollIteration = 0;
|
|
@@ -177,18 +454,20 @@ export class NgScrollView extends BaseScrollView {
|
|
|
177
454
|
}
|
|
178
455
|
}
|
|
179
456
|
checkOverscroll(e) {
|
|
180
|
-
if (!this.
|
|
457
|
+
if (!this._overscrollEnabled || !this.overscrollEnabled) {
|
|
181
458
|
if (e.cancelable) {
|
|
182
459
|
e.stopImmediatePropagation();
|
|
183
460
|
e.preventDefault();
|
|
184
461
|
}
|
|
185
462
|
return;
|
|
186
463
|
}
|
|
187
|
-
if (this.
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
464
|
+
if (this._overscrollEnabled) {
|
|
465
|
+
if (this._$isVertical.getValue()) {
|
|
466
|
+
this.checkOverscrollByAxis(e, this._y, this.scrollHeight);
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
this.checkOverscrollByAxis(e, this._x, this.scrollWidth);
|
|
470
|
+
}
|
|
192
471
|
}
|
|
193
472
|
}
|
|
194
473
|
calculateVelocity(offsets, delta, timestamp, indexOffset = 10) {
|
|
@@ -227,7 +506,11 @@ export class NgScrollView extends BaseScrollView {
|
|
|
227
506
|
const a0 = aSum * (this.scrollingSettings?.frictionalForce ?? FRICTION_FORCE);
|
|
228
507
|
return { a0 };
|
|
229
508
|
}
|
|
230
|
-
stopScrolling() {
|
|
509
|
+
stopScrolling(force = false) {
|
|
510
|
+
if (this._isAlignmentAnimation && !force) {
|
|
511
|
+
return;
|
|
512
|
+
}
|
|
513
|
+
this._isAlignmentAnimation = false;
|
|
231
514
|
this._animator.stop();
|
|
232
515
|
}
|
|
233
516
|
move(isVertical, position, blending = false, userAction = false, fireUpdate = true) {
|
|
@@ -238,54 +521,247 @@ export class NgScrollView extends BaseScrollView {
|
|
|
238
521
|
const dvSign = Math.sign(v), mass = this.scrollingSettings?.mass ?? MASS, duration = DURATION, maxDuration = this.scrollingSettings?.maxDuration ?? MAX_DURATION, maxDist = this.scrollingSettings?.maxDistance ?? MAX_DIST, maxDistance = dvSign * maxDist, s = (dvSign * Math.abs((a0 * Math.pow(duration, 2)) * .5) / 1000) / mass, distance = Math.abs(s) < maxDist ? s : maxDistance, positionWithVelocity = position + (this._inversion ? -1 : 1) * distance, vmax = Math.max(Math.abs(v0), Math.abs(v)), ad = Math.abs(vmax !== 0 ? Math.sqrt(vmax) : 0) * 10 / mass, aDuration = ad < maxDuration ? ad : maxDuration, startPosition = isVertical ? this.y : this.x;
|
|
239
522
|
this.animate(startPosition, Math.round(positionWithVelocity), aDuration, easeOutQuad, true);
|
|
240
523
|
}
|
|
524
|
+
else {
|
|
525
|
+
this.alignPosition(true, true);
|
|
526
|
+
}
|
|
241
527
|
}
|
|
242
528
|
normalizeValue(value) {
|
|
243
|
-
|
|
529
|
+
if (this.isInfinity) {
|
|
530
|
+
return value;
|
|
531
|
+
}
|
|
532
|
+
const isVertical = this._$isVertical.getValue(), startOffset = this._normalizeValueFromZero ? 0 : this.startOffset, scrollSize = this.scrollable ? ((isVertical ? this.scrollHeight : this.scrollWidth) - this.alignmentEndOffset) : 0, result = this.scrollable ? (value <= startOffset ? startOffset : value > scrollSize ? scrollSize : value) : startOffset;
|
|
244
533
|
return result;
|
|
245
534
|
}
|
|
246
|
-
animate(startValue, endValue, duration = ANIMATION_DURATION, easingFunction = easeOutQuad, userAction = false) {
|
|
247
|
-
const isVertical = this._$
|
|
535
|
+
animate(startValue, endValue, duration = ANIMATION_DURATION, easingFunction = easeOutQuad, userAction = false, alignmentAtComplete = true, skipOverridedCoordinates = false) {
|
|
536
|
+
const isVertical = this._$isVertical.getValue();
|
|
537
|
+
let position = startValue;
|
|
538
|
+
this._isAlignmentAnimation = !alignmentAtComplete;
|
|
248
539
|
this._animator.animate({
|
|
249
|
-
|
|
540
|
+
withDelta: this._service.dynamic && !this.isInfinity,
|
|
541
|
+
startValue,
|
|
542
|
+
endValue,
|
|
543
|
+
duration,
|
|
250
544
|
easingFunction,
|
|
251
545
|
getPropValue: () => {
|
|
252
546
|
return isVertical ? this._y : this._x;
|
|
253
|
-
}, onUpdate: ({ value }) => {
|
|
254
|
-
this.
|
|
255
|
-
|
|
256
|
-
|
|
547
|
+
}, onUpdate: ({ value, timestamp, elapsed }) => {
|
|
548
|
+
if (this._isCoordinatesOverrided && !skipOverridedCoordinates) {
|
|
549
|
+
this._isCoordinatesOverrided = false;
|
|
550
|
+
const currentCoordinate = isVertical ? this._y : this._x, delta = endValue - value;
|
|
551
|
+
this.animate(currentCoordinate, currentCoordinate + delta, duration - elapsed, easingFunction, userAction, alignmentAtComplete);
|
|
552
|
+
return;
|
|
553
|
+
}
|
|
554
|
+
const v0 = calculateVelocity(position, value - this._delta, timestamp) ?? this.averageVelocity;
|
|
555
|
+
position = value;
|
|
556
|
+
if (alignmentAtComplete && !this._isAlignmentAnimation && !skipOverridedCoordinates) {
|
|
557
|
+
if (!this.snapIfNecessary(v0)) {
|
|
558
|
+
this.move(isVertical, value, false, userAction);
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
else {
|
|
562
|
+
this.move(isVertical, value, false, userAction);
|
|
563
|
+
}
|
|
564
|
+
this._service.update(true);
|
|
565
|
+
}, onComplete: ({ value, timestamp }) => {
|
|
566
|
+
this._isAlignmentAnimation = false;
|
|
567
|
+
const v0 = calculateVelocity(position, value, timestamp);
|
|
568
|
+
if (alignmentAtComplete && !this._isAlignmentAnimation && !skipOverridedCoordinates) {
|
|
569
|
+
this.snapIfNecessary(v0);
|
|
570
|
+
}
|
|
571
|
+
else {
|
|
572
|
+
this.move(isVertical, value, false, userAction);
|
|
573
|
+
}
|
|
257
574
|
this._$scrollEnd.next(userAction);
|
|
575
|
+
this._service.update(true);
|
|
258
576
|
this.onAnimationComplete(value);
|
|
259
577
|
},
|
|
260
578
|
});
|
|
261
579
|
}
|
|
580
|
+
getSnappedComponentSize() {
|
|
581
|
+
const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), sd = this.snappingDistance, snappingDistance = parseFloatOrPersentageValue(sd), isPersentageSnappingDistance = isPercentageValue(sd);
|
|
582
|
+
let size = null;
|
|
583
|
+
const scrollDirection = this._scrollDirection.get(), currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, currentComponentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition), currentComponentSize = isVertical ? currentComponentBounds?.height ?? 0 : currentComponentBounds?.width ?? 0;
|
|
584
|
+
switch (align) {
|
|
585
|
+
case SnapToItemAligns.START: {
|
|
586
|
+
const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition + offset);
|
|
587
|
+
if (!!componentBounds) {
|
|
588
|
+
const { width, height } = componentBounds, compSize = isVertical ? height : width;
|
|
589
|
+
size = compSize;
|
|
590
|
+
}
|
|
591
|
+
break;
|
|
592
|
+
}
|
|
593
|
+
case SnapToItemAligns.CENTER: {
|
|
594
|
+
const viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, offset = (currentComponentSize * .5 - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
595
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
|
|
596
|
+
if (!!componentBounds) {
|
|
597
|
+
const { width, height } = componentBounds, compSize = isVertical ? height : width;
|
|
598
|
+
size = compSize;
|
|
599
|
+
}
|
|
600
|
+
break;
|
|
601
|
+
}
|
|
602
|
+
case SnapToItemAligns.END: {
|
|
603
|
+
const viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
604
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
|
|
605
|
+
if (!!componentBounds) {
|
|
606
|
+
const { width, height } = componentBounds, compSize = isVertical ? height : width;
|
|
607
|
+
size = compSize;
|
|
608
|
+
}
|
|
609
|
+
break;
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
return size;
|
|
613
|
+
}
|
|
614
|
+
alignPosition(animated = true, force = false) {
|
|
615
|
+
if (!this.snapToItem || (this._isAlignmentAnimation && !force)) {
|
|
616
|
+
return false;
|
|
617
|
+
}
|
|
618
|
+
const scrollDirection = this._scrollDirection.get() || (force ? 1 : 0);
|
|
619
|
+
if (scrollDirection === 0) {
|
|
620
|
+
return false;
|
|
621
|
+
}
|
|
622
|
+
const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width, sd = this.snappingDistance, snappingDistance = parseFloatOrPersentageValue(sd), isPersentageSnappingDistance = isPercentageValue(sd);
|
|
623
|
+
let position = null, size = 0;
|
|
624
|
+
const currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset, currentComponentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition), currentComponentSize = isVertical ? currentComponentBounds?.height ?? 0 : currentComponentBounds?.width ?? 0;
|
|
625
|
+
switch (align) {
|
|
626
|
+
case SnapToItemAligns.START: {
|
|
627
|
+
const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition + offset);
|
|
628
|
+
if (!!componentBounds) {
|
|
629
|
+
const { x, y, width, height } = componentBounds, startOffset = this.startOffset, alignmentStartOffset = this.alignmentStartOffset, componentPosition = isVertical ? y : x;
|
|
630
|
+
size = isVertical ? height : width;
|
|
631
|
+
const maxPos = (isVertical ? this.scrollHeight : this.scrollWidth) - (startOffset - alignmentStartOffset) + this._startLayoutOffset;
|
|
632
|
+
position = componentPosition - (startOffset - alignmentStartOffset) + this._startLayoutOffset;
|
|
633
|
+
if (this.isInfinity) {
|
|
634
|
+
if (position < 0 || position > maxPos) {
|
|
635
|
+
position = maxPos;
|
|
636
|
+
if (isVertical) {
|
|
637
|
+
this._y = this.scrollHeight;
|
|
638
|
+
}
|
|
639
|
+
else {
|
|
640
|
+
this._x = this.scrollWidth;
|
|
641
|
+
}
|
|
642
|
+
}
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
break;
|
|
646
|
+
}
|
|
647
|
+
case SnapToItemAligns.CENTER: {
|
|
648
|
+
const offset = (currentComponentSize * .5 - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
649
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
|
|
650
|
+
if (!!componentBounds) {
|
|
651
|
+
const { x, y, width, height } = componentBounds, startOffset = this.startOffset, alignmentStartOffset = this.alignmentStartOffset, componentPosition = isVertical ? y : x;
|
|
652
|
+
size = isVertical ? height : width;
|
|
653
|
+
const maxPos = (isVertical ? this.scrollHeight : this.scrollWidth) - size * .5 - viewportSize * .5 - (startOffset - alignmentStartOffset) * .5;
|
|
654
|
+
position = componentPosition + size * .5 - viewportSize * .5 - (startOffset - alignmentStartOffset) * .5 + this._startLayoutOffset;
|
|
655
|
+
if (this.isInfinity) {
|
|
656
|
+
if (position <= 0 || position > maxPos) {
|
|
657
|
+
position = maxPos;
|
|
658
|
+
if (isVertical) {
|
|
659
|
+
this._y = this.scrollHeight;
|
|
660
|
+
}
|
|
661
|
+
else {
|
|
662
|
+
this._x = this.scrollWidth;
|
|
663
|
+
}
|
|
664
|
+
}
|
|
665
|
+
}
|
|
666
|
+
}
|
|
667
|
+
break;
|
|
668
|
+
}
|
|
669
|
+
case SnapToItemAligns.END: {
|
|
670
|
+
const offset = ((scrollDirection === 1 ? currentComponentSize : 0) - (isPersentageSnappingDistance ? currentComponentSize * snappingDistance : snappingDistance)) * scrollDirection, actualPos = currentPosition + offset + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
671
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos);
|
|
672
|
+
if (!!componentBounds) {
|
|
673
|
+
const { x, y, width, height } = componentBounds, componentPosition = isVertical ? y : x;
|
|
674
|
+
size = isVertical ? height : width;
|
|
675
|
+
position = componentPosition - viewportSize + this._startLayoutOffset;
|
|
676
|
+
}
|
|
677
|
+
break;
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
const cPos = (isVertical ? this.scrollTop : this.scrollLeft);
|
|
681
|
+
if (position !== null && position !== cPos) {
|
|
682
|
+
this.stopScrolling(true);
|
|
683
|
+
this.animate(cPos, position, animated ? this.animationParams.snapToItem : 1, easeOutQuad, false, false, true);
|
|
684
|
+
return true;
|
|
685
|
+
}
|
|
686
|
+
return false;
|
|
687
|
+
}
|
|
688
|
+
checkIntersectionComponent() {
|
|
689
|
+
const align = this.snapToItemAlign, isVertical = this._$isVertical.getValue(), viewportSize = isVertical ? this._$viewportBounds.getValue().height : this._$viewportBounds.getValue().width;
|
|
690
|
+
let componentId = null;
|
|
691
|
+
const currentPosition = (isVertical ? this.scrollTop : this.scrollLeft) - this._startLayoutOffset;
|
|
692
|
+
switch (align) {
|
|
693
|
+
case SnapToItemAligns.START: {
|
|
694
|
+
const maxPos = isVertical ? this.scrollHeight : this.scrollWidth, componentBounds = this._service.getComponentBoundsByIntersectionPosition(currentPosition, maxPos);
|
|
695
|
+
if (!!componentBounds) {
|
|
696
|
+
const { id } = componentBounds;
|
|
697
|
+
componentId = id;
|
|
698
|
+
}
|
|
699
|
+
break;
|
|
700
|
+
}
|
|
701
|
+
case SnapToItemAligns.CENTER: {
|
|
702
|
+
const actualPos = currentPosition + viewportSize * .5, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
703
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos, maxPos);
|
|
704
|
+
if (!!componentBounds) {
|
|
705
|
+
const { id } = componentBounds;
|
|
706
|
+
componentId = id;
|
|
707
|
+
}
|
|
708
|
+
break;
|
|
709
|
+
}
|
|
710
|
+
case SnapToItemAligns.END: {
|
|
711
|
+
const actualPos = currentPosition + viewportSize, maxPos = isVertical ? this.scrollHeight : this.scrollWidth, pos = Math.min(actualPos, maxPos);
|
|
712
|
+
const componentBounds = this._service.getComponentBoundsByIntersectionPosition(pos, maxPos);
|
|
713
|
+
if (!!componentBounds) {
|
|
714
|
+
const { id } = componentBounds;
|
|
715
|
+
componentId = id;
|
|
716
|
+
}
|
|
717
|
+
break;
|
|
718
|
+
}
|
|
719
|
+
}
|
|
720
|
+
if (componentId !== this._intersectionComponentId && componentId !== null) {
|
|
721
|
+
this._service.setIntersectionElementBySnapToItemAlign(componentId);
|
|
722
|
+
}
|
|
723
|
+
this._intersectionComponentId = componentId;
|
|
724
|
+
}
|
|
262
725
|
onAnimationComplete(position) { }
|
|
263
726
|
fireScroll(userAction = false) {
|
|
264
|
-
this.stopScrolling();
|
|
265
727
|
this._$updateScrollBar.next();
|
|
266
728
|
this.emitScrollableEvent();
|
|
267
729
|
this.fireScrollEvent(userAction);
|
|
268
730
|
}
|
|
269
|
-
scrollLimits(value) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
731
|
+
scrollLimits(value, silent = false) {
|
|
732
|
+
if (!this.isInfinity) {
|
|
733
|
+
const x = value !== undefined ? value : this._x, y = value !== undefined ? value : this._y, isVertical = this._$isVertical.getValue();
|
|
734
|
+
if (isVertical) {
|
|
735
|
+
const yy = this.normalizeValue(y);
|
|
736
|
+
if (y !== yy) {
|
|
737
|
+
if (silent) {
|
|
738
|
+
this._y = yy;
|
|
739
|
+
this.refreshCoordinate(this._x, this._y);
|
|
740
|
+
}
|
|
741
|
+
else {
|
|
742
|
+
this.y = yy;
|
|
743
|
+
}
|
|
744
|
+
return true;
|
|
745
|
+
}
|
|
276
746
|
}
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
747
|
+
else {
|
|
748
|
+
const xx = this.normalizeValue(x);
|
|
749
|
+
if (x !== xx) {
|
|
750
|
+
if (silent) {
|
|
751
|
+
this._x = xx;
|
|
752
|
+
this.refreshCoordinate(this._x, this._y);
|
|
753
|
+
}
|
|
754
|
+
else {
|
|
755
|
+
this.x = xx;
|
|
756
|
+
}
|
|
757
|
+
return true;
|
|
758
|
+
}
|
|
283
759
|
}
|
|
284
760
|
}
|
|
285
761
|
return false;
|
|
286
762
|
}
|
|
287
763
|
scroll(params) {
|
|
288
|
-
const posX = params.x || params.left || 0, posY = params.y || params.top || 0, userAction = params.userAction ?? false, ease = params.ease || easeOutQuad, fireUpdate = params.fireUpdate ?? true, behavior = params.behavior ?? INSTANT, blending = params.blending ?? true, duration = params.duration ?? ANIMATION_DURATION, isVertical = this._$
|
|
764
|
+
const posX = params.x || params.left || 0, posY = params.y || params.top || 0, userAction = params.userAction ?? false, snap = params.snap ?? true, normalize = params.normalize ?? true, ease = params.ease || easeOutQuad, fireUpdate = params.fireUpdate ?? true, behavior = params.behavior ?? INSTANT, blending = params.blending ?? true, force = params.force ?? false, duration = params.duration ?? ANIMATION_DURATION, isVertical = this._$isVertical.getValue();
|
|
289
765
|
const x = this.normalizeValue(posX), y = this.normalizeValue(posY), prevX = this._x, prevY = this._y;
|
|
290
766
|
if (behavior === AUTO || behavior === SMOOTH) {
|
|
291
767
|
if (isVertical) {
|
|
@@ -300,13 +776,12 @@ export class NgScrollView extends BaseScrollView {
|
|
|
300
776
|
}
|
|
301
777
|
}
|
|
302
778
|
else {
|
|
303
|
-
if (
|
|
304
|
-
if (
|
|
779
|
+
if (isVertical) {
|
|
780
|
+
if (this._y !== y || force) {
|
|
305
781
|
if (!blending) {
|
|
306
|
-
this.stopScrolling();
|
|
782
|
+
this.stopScrolling(force);
|
|
307
783
|
}
|
|
308
|
-
this.
|
|
309
|
-
this.y = y;
|
|
784
|
+
this.setY(y, snap, normalize);
|
|
310
785
|
this.emitScrollableEvent();
|
|
311
786
|
if (fireUpdate) {
|
|
312
787
|
this.fireScrollEvent(userAction);
|
|
@@ -314,12 +789,11 @@ export class NgScrollView extends BaseScrollView {
|
|
|
314
789
|
}
|
|
315
790
|
}
|
|
316
791
|
else {
|
|
317
|
-
if (this._x !== x) {
|
|
792
|
+
if (this._x !== x || force) {
|
|
318
793
|
if (!blending) {
|
|
319
|
-
this.stopScrolling();
|
|
794
|
+
this.stopScrolling(force);
|
|
320
795
|
}
|
|
321
|
-
this.
|
|
322
|
-
this.x = x;
|
|
796
|
+
this.setX(x, snap, normalize);
|
|
323
797
|
this.emitScrollableEvent();
|
|
324
798
|
if (fireUpdate) {
|
|
325
799
|
this.fireScrollEvent(userAction);
|
|
@@ -333,13 +807,9 @@ export class NgScrollView extends BaseScrollView {
|
|
|
333
807
|
this.cdkScrollable.getElementRef()?.nativeElement?.dispatchEvent(SCROLL_EVENT);
|
|
334
808
|
}
|
|
335
809
|
}
|
|
336
|
-
|
|
337
|
-
const scrollContent = this.scrollContent?.nativeElement;
|
|
338
|
-
scrollContent.style.transform = `translate3d(${(this._inversion ? 1 : -1) * value}px, 0, 0)`;
|
|
339
|
-
}
|
|
340
|
-
refreshY(value) {
|
|
810
|
+
refreshCoordinate(x, y) {
|
|
341
811
|
const scrollContent = this.scrollContent?.nativeElement;
|
|
342
|
-
scrollContent.style.transform =
|
|
812
|
+
scrollContent.style.transform = matrix3d((this._inversion ? 1 : -1) * x + (this._$isVertical.getValue() ? 0 : this._startLayoutOffset), (this._inversion ? 1 : -1) * y + (this._$isVertical.getValue() ? this._startLayoutOffset : 0));
|
|
343
813
|
}
|
|
344
814
|
fireScrollEvent(userAction) {
|
|
345
815
|
this._$scroll.next(userAction);
|
|
@@ -356,7 +826,7 @@ export class NgScrollView extends BaseScrollView {
|
|
|
356
826
|
}
|
|
357
827
|
}
|
|
358
828
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgScrollView, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
359
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgScrollView, selector: "ng-scroll-view", inputs: { scrollBehavior: "scrollBehavior", overscrollEnabled: "overscrollEnabled", scrollingSettings: "scrollingSettings" }, viewQueries: [{ propertyName: "cdkScrollable", first: true, predicate: ["scrollViewport"], descendants: true, read: CdkScrollable }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
|
|
829
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: NgScrollView, selector: "ng-scroll-view", inputs: { scrollBehavior: "scrollBehavior", overscrollEnabled: "overscrollEnabled", scrollingSettings: "scrollingSettings", snapToItem: "snapToItem", scrollingOneByOne: "scrollingOneByOne", snapToItemAlign: "snapToItemAlign", snappingDistance: "snappingDistance", animationParams: "animationParams" }, viewQueries: [{ propertyName: "cdkScrollable", first: true, predicate: ["scrollViewport"], descendants: true, read: CdkScrollable }], usesInheritance: true, ngImport: i0, template: '', isInline: true });
|
|
360
830
|
}
|
|
361
831
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: NgScrollView, decorators: [{
|
|
362
832
|
type: Component,
|
|
@@ -373,5 +843,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
|
|
|
373
843
|
type: Input
|
|
374
844
|
}], scrollingSettings: [{
|
|
375
845
|
type: Input
|
|
846
|
+
}], snapToItem: [{
|
|
847
|
+
type: Input
|
|
848
|
+
}], scrollingOneByOne: [{
|
|
849
|
+
type: Input
|
|
850
|
+
}], snapToItemAlign: [{
|
|
851
|
+
type: Input
|
|
852
|
+
}], snappingDistance: [{
|
|
853
|
+
type: Input
|
|
854
|
+
}], animationParams: [{
|
|
855
|
+
type: Input
|
|
376
856
|
}] } });
|
|
377
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsRUFBRSxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDN0csT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxRQUFRLEVBQVUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDN0YsT0FBTyxFQUNILGdCQUFnQixFQUFFLDBCQUEwQixFQUFFLHVCQUF1QixFQUFFLDBCQUEwQixFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFDaEosU0FBUyxFQUFFLFVBQVUsRUFBRSxXQUFXLEVBQUUsS0FBSyxHQUM1QyxNQUFNLGFBQWEsQ0FBQztBQUVyQixPQUFPLEVBQ0gsa0JBQWtCLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxzQkFBc0IsRUFDdkgsMEJBQTBCLEVBQUUsWUFBWSxFQUFFLHFDQUFxQyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsR0FB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eEIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO29CQUMxQixRQUFRLEVBQUUsRUFBRTtpQkFDZjswRUFHWSxhQUFhO3NCQURyQixTQUFTO3VCQUFDLGdCQUFnQixFQUFFLEVBQUUsSUFBSSxFQUFFLGFBQWEsRUFBRTtnQkFNaEQsY0FBYztzQkFEakIsS0FBSztnQkFXRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBV0YsaUJBQWlCO3NCQURwQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZmlsdGVyLCBmcm9tRXZlbnQsIG1hcCwgb2YsIHJhY2UsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgU2Nyb2xsZXJEaXJlY3Rpb24gfSBmcm9tICcuL2VudW1zJztcclxuaW1wb3J0IHsgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCwgQW5pbWF0b3IsIEVhc2luZywgZWFzZU91dFF1YWQgfSBmcm9tICcuLi8uLi91dGlscy9hbmltYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgICBCRUhBVklPUl9JTlNUQU5ULCBERUZBVUxUX09WRVJTQ1JPTExfRU5BQkxFRCwgREVGQVVMVF9TQ1JPTExfQkVIQVZJT1IsIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLCBJTlRFUkFDVElWRSwgTU9VU0VfRE9XTiwgTU9VU0VfTU9WRSwgTU9VU0VfVVAsXHJcbiAgICBUT1VDSF9FTkQsIFRPVUNIX01PVkUsIFRPVUNIX1NUQVJULCBXSEVFTCxcclxufSBmcm9tICcuLi8uLi9jb25zdCc7XHJcbmltcG9ydCB7IElTY3JvbGxUb1BhcmFtcyB9IGZyb20gJy4vaW50ZXJmYWNlcyc7XHJcbmltcG9ydCB7XHJcbiAgICBBTklNQVRJT05fRFVSQVRJT04sIEFVVE8sIERVUkFUSU9OLCBGUklDVElPTl9GT1JDRSwgSU5TVEFOVCwgTEVGVCwgTUFTUywgTUFYX0RJU1QsIE1BWF9EVVJBVElPTiwgTUFYX1ZFTE9DSVRZX1RJTUVTVEFNUCxcclxuICAgIE9WRVJTQ1JPTExfU1RBUlRfSVRFUkFUSU9OLCBTQ1JPTExfRVZFTlQsIFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8sIFNNT09USCwgU1BFRURfU0NBTEUsIFRPUCxcclxufSBmcm9tICcuL2NvbnN0JztcclxuaW1wb3J0IHsgY2FsY3VsYXRlRGlyZWN0aW9uIH0gZnJvbSAnLi91dGlscyc7XHJcbmltcG9ydCB7IEJhc2VTY3JvbGxWaWV3IH0gZnJvbSAnLi9iYXNlL2Jhc2Utc2Nyb2xsLXZpZXcuY29tcG9uZW50JztcclxuaW1wb3J0IHsgSVNjcm9sbGluZ1NldHRpbmdzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcyc7XHJcblxyXG4vKipcclxuICogTmdTY3JvbGxWaWV3XHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE2LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEFsZXhhbmRyb3ZpY2ggR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmctc2Nyb2xsLXZpZXcnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTY3JvbGxWaWV3IGV4dGVuZHMgQmFzZVNjcm9sbFZpZXcge1xyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsVmlld3BvcnQnLCB7IHJlYWQ6IENka1Njcm9sbGFibGUgfSlcclxuICAgIHJlYWRvbmx5IGNka1Njcm9sbGFibGU6IENka1Njcm9sbGFibGUgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsQmVoYXZpb3IgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjcm9sbEJlaGF2aW9yPihERUZBVUxUX1NDUk9MTF9CRUhBVklPUik7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsQmVoYXZpb3IgPSB0aGlzLl8kc2Nyb2xsQmVoYXZpb3IuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNjcm9sbEJlaGF2aW9yKHY6IFNjcm9sbEJlaGF2aW9yKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxCZWhhdmlvci5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxCZWhhdmlvcigpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kb3ZlcnNjcm9sbEVuYWJsZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVEKTtcclxuICAgIHJlYWRvbmx5ICRvdmVyc2Nyb2xsRW5hYmxlZCA9IHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgb3ZlcnNjcm9sbEVuYWJsZWQodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgb3ZlcnNjcm9sbEVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbGluZ1NldHRpbmdzID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJU2Nyb2xsaW5nU2V0dGluZ3M+KERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxpbmdTZXR0aW5ncyA9IHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsaW5nU2V0dGluZ3ModjogSVNjcm9sbGluZ1NldHRpbmdzKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzY3JvbGxpbmdTZXR0aW5ncygpIHsgcmV0dXJuIHRoaXMuXyRzY3JvbGxpbmdTZXR0aW5ncy5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID0gaW5qZWN0KFNDUk9MTF9WSUVXX05PUk1BTElaRV9WQUxVRV9GUk9NX1pFUk8pO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsID0gdGhpcy5fJHNjcm9sbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxFbmQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbEVuZCA9IHRoaXMuXyRzY3JvbGxFbmQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJpdmF0ZSBfc3RhcnRQb3NpdGlvbiA9IDA7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9hbmltYXRvciA9IG5ldyBBbmltYXRvcigpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaW50ZXJhY3RpdmUgPSB0cnVlO1xyXG5cclxuICAgIHByaXZhdGUgX292ZXJzY3JvbGxJdGVyYXRpb246IG51bWJlciA9IDA7XHJcblxyXG4gICAgc2V0IGRlbHRhKHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gKz0gdjtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBjb25zdCAkdmlld3BvcnQgPSBvZih0aGlzLnNjcm9sbFZpZXdwb3J0KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICAgICAgbWFwKHYgPT4gdiEubmF0aXZlRWxlbWVudCksXHJcbiAgICAgICAgKSwgJGNvbnRlbnQgPSBvZih0aGlzLnNjcm9sbENvbnRlbnQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgICBtYXAodiA9PiB2IS5uYXRpdmVFbGVtZW50KSxcclxuICAgICAgICApLCAkd2hlZWxFbWl0dGVyID0gdGhpcy5faW52ZXJzaW9uID8gJHZpZXdwb3J0IDogJGNvbnRlbnQ7XHJcblxyXG4gICAgICAgICR3aGVlbEVtaXR0ZXIucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oY29udGVudCwgV0hFRUwsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBpc1ZlcnRpY2FsID8gZS5kZWx0YVkgOiBlLmRlbHRhWCwgZHAgPSAoc3RhcnRQb3MgKyBkZWx0YSksIHBvc2l0aW9uID0gZHAgPCAwID8gMCA6IGRwID4gc2Nyb2xsU2l6ZSA/IHNjcm9sbFNpemUgOiBkcDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGwoeyBbaXNWZXJ0aWNhbCA/IFRPUCA6IExFRlRdOiBwb3NpdGlvbiwgYmVoYXZpb3I6IElOU1RBTlQsIHVzZXJBY3Rpb246IHRydWUgfSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkbW91c2VVcCA9IGZyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICksXHJcbiAgICAgICAgICAgICRtb3VzZURyYWdDYW5jZWwgPSAkbW91c2VVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICk7XHJcblxyXG4gICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBzd2l0Y2hNYXAoY29udGVudCA9PiB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX0RPV04sIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIodiA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVEVSQUNUSVZFKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzaW9uID0gdGhpcy5faW52ZXJzaW9uLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDbGllbnRQb3NpdGlvbiA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyA9IGlzVmVydGljYWwgPyBlLmNsaWVudFkgOiBlLmNsaWVudFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0aWVzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRHJhZ0NhbmNlbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvbiwgb2Zmc2V0cywgdmVsb2NpdGllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uID0gY3VycmVudFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxNb3VzZUV2ZW50Pih3aW5kb3csIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pLCBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSldKS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRUaW1lID0gRGF0ZS5ub3coKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAgPSBlbmRUaW1lIC0gc3RhcnRUaW1lLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBhMCB9ID0gdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQoZmFsc2UpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuXyRzY3JvbGxCZWhhdmlvci5nZXRWYWx1ZSgpID09PSBCRUhBVklPUl9JTlNUQU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgMCwgdjAsIGEwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR0b3VjaFVwID0gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KHdpbmRvdywgVE9VQ0hfRU5ELCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICksXHJcbiAgICAgICAgICAgICR0b3VjaENhbmNlbGVyID0gJHRvdWNoVXAucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICApO1xyXG5cclxuICAgICAgICAkY29udGVudC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4ge1xyXG4gICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pihjb250ZW50LCBUT1VDSF9TVEFSVCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkRyYWdTdGFydCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVEVSQUNUSVZFKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzaW9uID0gdGhpcy5faW52ZXJzaW9uLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDbGllbnRQb3NpdGlvbiA9IDAsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyA9IGlzVmVydGljYWwgPyBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFkgOiBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksIHZlbG9jaXRpZXMgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IERhdGUubm93KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCgkdG91Y2hDYW5jZWxlciksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvbiwgb2Zmc2V0cywgdmVsb2NpdGllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uID0gY3VycmVudFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGEwIH0gPSB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fJHNjcm9sbEJlaGF2aW9yLmdldFZhbHVlKCkgPT09IEJFSEFWSU9SX0lOU1RBTlQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmVXaXRoQWNjZWxlcmF0aW9uKGlzVmVydGljYWwsIHBvc2l0aW9uLCAwLCB2MCwgYTAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICB9KVxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyLCBvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgdmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT5cclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsIGRlbHRhID0gKGludmVyc2lvbiA/IC0xIDogMSkgKiAoc3RhcnRDbGllbnRQb3MgLSBjdXJyZW50UG9zKSxcclxuICAgICAgICAgICAgZHAgPSB0aGlzLl9zdGFydFBvc2l0aW9uICsgZGVsdGEsIHBvc2l0aW9uID0gTWF0aC5yb3VuZChkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwKSwgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsIHNjcm9sbERlbHRhID0gcHJldkNsaWVudFBvc2l0aW9uID09PSAwID8gMCA6IHByZXZDbGllbnRQb3NpdGlvbiAtIGN1cnJlbnRQb3MsXHJcbiAgICAgICAgICAgIHsgdjAgfSA9IHRoaXMuY2FsY3VsYXRlVmVsb2NpdHkob2Zmc2V0cywgc2Nyb2xsRGVsdGEsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgdGhpcy5jYWxjdWxhdGVBY2NlbGVyYXRpb24odmVsb2NpdGllcywgdjAsIHRpbWVzdGFtcCk7XHJcbiAgICAgICAgcmV0dXJuIHsgcG9zaXRpb24sIGN1cnJlbnRQb3MsIGVuZFRpbWUsIHNjcm9sbERlbHRhIH07XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYW5jZWxPdmVyc2Nyb2xsKCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmdldFZhbHVlKCkpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uID0gMDtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbEJ5QXhpcyhlOiBFdmVudCwgcG9zOiBudW1iZXIsIGxpbWl0OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBwID0gTWF0aC5hYnMocG9zKTtcclxuICAgICAgICBpZiAocCA+IDAgJiYgcCA8IGxpbWl0KSB7XHJcbiAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPCBPVkVSU0NST0xMX1NUQVJUX0lURVJBVElPTikge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbisrO1xyXG4gICAgICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2hlY2tPdmVyc2Nyb2xsKGU6IEV2ZW50KSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLl8kb3ZlcnNjcm9sbEVuYWJsZWQuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkpIHtcclxuICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feSwgdGhpcy5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2hlY2tPdmVyc2Nyb2xsQnlBeGlzKGUsIHRoaXMuX3gsIHRoaXMuc2Nyb2xsV2lkdGgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVZlbG9jaXR5KG9mZnNldHM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBkZWx0YTogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlciwgaW5kZXhPZmZzZXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICAgICAgb2Zmc2V0cy5wdXNoKFtkZWx0YSwgdGltZXN0YW1wIDwgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCA/IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgOiB0aW1lc3RhbXBdKTtcclxuXHJcbiAgICAgICAgY29uc3QgbGVuID0gb2Zmc2V0cy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKG9mZnNldHMpLFxyXG4gICAgICAgICAgICBzcGVlZFNjYWxlID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8uc3BlZWRTY2FsZSA/PyBTUEVFRF9TQ0FMRTtcclxuICAgICAgICBsZXQgdlN1bSA9IDA7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSBvZmZzZXRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCBwMCA9IG9mZnNldHNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbihwMFswXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICBjb25zdCB2MCA9IChwMFsxXSAhPT0gMCA/IGxhc3RWU2lnbiAqIE1hdGguYWJzKHAwWzBdIC8gcDBbMV0pICogc3BlZWRTY2FsZSA6IDApO1xyXG4gICAgICAgICAgICB2U3VtICs9IE1hdGguc2lnbih2MCkgKiBNYXRoLnBvdyh2MCwgNCkgKiAuMDAzO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgY29uc3QgbCA9IE1hdGgubWluKG9mZnNldHMubGVuZ3RoLCBpbmRleE9mZnNldCksIHYwID0gbCA+IDAgPyAodlN1bSAvIGwpIDogMDtcclxuICAgICAgICByZXR1cm4geyB2MCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHByaXZhdGUgY2FsY3VsYXRlQWNjZWxlcmF0aW9uKHZlbG9jaXRpZXM6IEFycmF5PFtudW1iZXIsIG51bWJlcl0+LCBkZWx0YTogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlciwgaW5kZXhPZmZzZXQ6IG51bWJlciA9IDEwKSB7XHJcbiAgICAgICAgdmVsb2NpdGllcy5wdXNoKFtkZWx0YSwgdGltZXN0YW1wIDwgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCA/IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgOiB0aW1lc3RhbXBdKTtcclxuICAgICAgICBjb25zdCBsZW4gPSB2ZWxvY2l0aWVzLmxlbmd0aCwgc3RhcnRJbmRleCA9IGxlbiA+IGluZGV4T2Zmc2V0ID8gbGVuIC0gaW5kZXhPZmZzZXQgOiAwO1xyXG4gICAgICAgIGxldCBhU3VtID0gMCwgcHJldlYwOiBbbnVtYmVyLCBudW1iZXJdIHwgdW5kZWZpbmVkLCBpdGVyYXRpb24gPSAwLCBsYXN0VlNpZ24gPSBjYWxjdWxhdGVEaXJlY3Rpb24odmVsb2NpdGllcyk7XHJcbiAgICAgICAgY29uc3QgbWFzcyA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1hc3MgPz8gTUFTUztcclxuICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleCwgbCA9IHZlbG9jaXRpZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHYwMCA9IHByZXZWMCwgdjAxID0gdmVsb2NpdGllc1tpXTtcclxuICAgICAgICAgICAgaWYgKGxhc3RWU2lnbiAhPT0gTWF0aC5zaWduKHYwMVswXSkpIHtcclxuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGlmICh2MDApIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGEwID0gdGltZXN0YW1wIDwgTUFYX1ZFTE9DSVRZX1RJTUVTVEFNUCA/ICh2MDBbMV0gIT09IDAgPyAobGFzdFZTaWduICogTWF0aC5hYnMoTWF0aC5hYnModjAxWzBdKSAtIE1hdGguYWJzKHYwMFswXSkpKSAvIE1hdGguYWJzKHYwMFsxXSkgOiAwKSA6IDAuMTtcclxuICAgICAgICAgICAgICAgIGFTdW0gPSAoYVN1bSAqIG1hc3MpICsgYTA7XHJcbiAgICAgICAgICAgICAgICBwcmV2VjAgPSB2MDE7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgcHJldlYwID0gdjAxO1xyXG4gICAgICAgICAgICBpdGVyYXRpb24rKztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGEwID0gYVN1bSAqICh0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5mcmljdGlvbmFsRm9yY2UgPz8gRlJJQ1RJT05fRk9SQ0UpO1xyXG4gICAgICAgIHJldHVybiB7IGEwIH07XHJcbiAgICB9XHJcblxyXG4gICAgc3RvcFNjcm9sbGluZygpIHtcclxuICAgICAgICB0aGlzLl9hbmltYXRvci5zdG9wKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG1vdmUoaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgYmxlbmRpbmc6IGJvb2xlYW4gPSBmYWxzZSwgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBmaXJlVXBkYXRlOiBib29sZWFuID0gdHJ1ZSkge1xyXG4gICAgICAgIHRoaXMuc2Nyb2xsKHsgW2lzVmVydGljYWwgPyBUT1AgOiBMRUZUXTogcG9zaXRpb24sIGJlaGF2aW9yOiBJTlNUQU5ULCBibGVuZGluZywgdXNlckFjdGlvbiwgZmlyZVVwZGF0ZSB9KTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbDogYm9vbGVhbiwgcG9zaXRpb246IG51bWJlciwgdjA6IG51bWJlciwgdjogbnVtYmVyLCBhMDogbnVtYmVyLCB0aW1lc3RhbXA6IG51bWJlcikge1xyXG4gICAgICAgIGlmIChhMCAhPT0gMCAmJiB0aW1lc3RhbXAgPCBNQVhfVkVMT0NJVFlfVElNRVNUQU1QKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IGR2U2lnbiA9IE1hdGguc2lnbih2KSxcclxuICAgICAgICAgICAgICAgIG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1MsXHJcbiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IERVUkFUSU9OLCBtYXhEdXJhdGlvbiA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1heER1cmF0aW9uID8/IE1BWF9EVVJBVElPTixcclxuICAgICAgICAgICAgICAgIG1heERpc3QgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXhEaXN0YW5jZSA/PyBNQVhfRElTVCxcclxuICAgICAgICAgICAgICAgIG1heERpc3RhbmNlID0gZHZTaWduICogbWF4RGlzdCwgcyA9IChkdlNpZ24gKiBNYXRoLmFicygoYTAgKiBNYXRoLnBvdyhkdXJhdGlvbiwgMikpICogLjUpIC8gMTAwMCkgLyBtYXNzLFxyXG4gICAgICAgICAgICAgICAgZGlzdGFuY2UgPSBNYXRoLmFicyhzKSA8IG1heERpc3QgPyBzIDogbWF4RGlzdGFuY2UsIHBvc2l0aW9uV2l0aFZlbG9jaXR5ID0gcG9zaXRpb24gKyAodGhpcy5faW52ZXJzaW9uID8gLTEgOiAxKSAqIGRpc3RhbmNlLFxyXG4gICAgICAgICAgICAgICAgdm1heCA9IE1hdGgubWF4KE1hdGguYWJzKHYwKSwgTWF0aC5hYnModikpLFxyXG4gICAgICAgICAgICAgICAgYWQgPSBNYXRoLmFicyh2bWF4ICE9PSAwID8gTWF0aC5zcXJ0KHZtYXgpIDogMCkgKiAxMCAvIG1hc3MsXHJcbiAgICAgICAgICAgICAgICBhRHVyYXRpb24gPSBhZCA8IG1heER1cmF0aW9uID8gYWQgOiBtYXhEdXJhdGlvbixcclxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54O1xyXG4gICAgICAgICAgICB0aGlzLmFuaW1hdGUoc3RhcnRQb3NpdGlvbiwgTWF0aC5yb3VuZChwb3NpdGlvbldpdGhWZWxvY2l0eSksIGFEdXJhdGlvbiwgZWFzZU91dFF1YWQsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kZGlyZWN0aW9uLmdldFZhbHVlKCkgPT09IFNjcm9sbGVyRGlyZWN0aW9uLlZFUlRJQ0FMLFxyXG4gICAgICAgICAgICBzdGFydE9mZnNldCA9IHRoaXMuX25vcm1hbGl6ZVZhbHVlRnJvbVplcm8gPyAwIDogdGhpcy5fJHN0YXJ0T2Zmc2V0LmdldFZhbHVlKCksXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICByZXN1bHQgPSB2YWx1ZSA8PSBzdGFydE9mZnNldCA/IHN0YXJ0T2Zmc2V0IDogdmFsdWUgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IHZhbHVlO1xyXG4gICAgICAgIHJldHVybiByZXN1bHQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGFuaW1hdGUoc3RhcnRWYWx1ZTogbnVtYmVyLCBlbmRWYWx1ZTogbnVtYmVyLCBkdXJhdGlvbiA9IEFOSU1BVElPTl9EVVJBVElPTiwgZWFzaW5nRnVuY3Rpb246IEVhc2luZyA9IGVhc2VPdXRRdWFkLFxyXG4gICAgICAgIHVzZXJBY3Rpb246IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGNvbnN0IGlzVmVydGljYWwgPSB0aGlzLl8kZGlyZWN0aW9uLmdldFZhbHVlKCkgPT09IFNjcm9sbGVyRGlyZWN0aW9uLlZFUlRJQ0FMO1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICBzdGFydFZhbHVlLCBlbmRWYWx1ZSwgZHVyYXRpb24sXHJcbiAgICAgICAgICAgIGVhc2luZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICBnZXRQcm9wVmFsdWU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3g7XHJcbiAgICAgICAgICAgIH0sIG9uVXBkYXRlOiAoeyB2YWx1ZSB9KSA9PiB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgdmFsdWUsIGZhbHNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgfSwgb25Db21wbGV0ZTogKHsgdmFsdWUgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5tb3ZlKGlzVmVydGljYWwsIHZhbHVlLCBmYWxzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGUodmFsdWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvbkFuaW1hdGlvbkNvbXBsZXRlKHBvc2l0aW9uOiBudW1iZXIpIHsgfVxyXG5cclxuICAgIGZpcmVTY3JvbGwodXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgdGhpcy5fJHVwZGF0ZVNjcm9sbEJhci5uZXh0KCk7XHJcbiAgICAgICAgdGhpcy5lbWl0U2Nyb2xsYWJsZUV2ZW50KCk7XHJcbiAgICAgICAgdGhpcy5maXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsTGltaXRzKHZhbHVlPzogbnVtYmVyIHwgdW5kZWZpbmVkKTogYm9vbGVhbiB7XHJcbiAgICAgICAgY29uc3QgeCA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuX3gsIHkgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB0aGlzLl95LCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICBjb25zdCB5eSA9IHRoaXMubm9ybWFsaXplVmFsdWUoeSk7XHJcbiAgICAgICAgICAgIGlmICh5ICE9PSB5eSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy55ID0geXk7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHh4ID0gdGhpcy5ub3JtYWxpemVWYWx1ZSh4KTtcclxuICAgICAgICAgICAgaWYgKHggIT09IHh4KSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnggPSB4eDtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGwocGFyYW1zOiBJU2Nyb2xsVG9QYXJhbXMpIHtcclxuICAgICAgICBjb25zdCBwb3NYID0gcGFyYW1zLnggfHwgcGFyYW1zLmxlZnQgfHwgMCxcclxuICAgICAgICAgICAgcG9zWSA9IHBhcmFtcy55IHx8IHBhcmFtcy50b3AgfHwgMCxcclxuICAgICAgICAgICAgdXNlckFjdGlvbiA9IHBhcmFtcy51c2VyQWN0aW9uID8/IGZhbHNlLFxyXG4gICAgICAgICAgICBlYXNlID0gcGFyYW1zLmVhc2UgfHwgZWFzZU91dFF1YWQsXHJcbiAgICAgICAgICAgIGZpcmVVcGRhdGUgPSBwYXJhbXMuZmlyZVVwZGF0ZSA/PyB0cnVlLFxyXG4gICAgICAgICAgICBiZWhhdmlvciA9IHBhcmFtcy5iZWhhdmlvciA/PyBJTlNUQU5ULFxyXG4gICAgICAgICAgICBibGVuZGluZyA9IHBhcmFtcy5ibGVuZGluZyA/PyB0cnVlLFxyXG4gICAgICAgICAgICBkdXJhdGlvbiA9IHBhcmFtcy5kdXJhdGlvbiA/PyBBTklNQVRJT05fRFVSQVRJT04sXHJcbiAgICAgICAgICAgIGlzVmVydGljYWwgPSB0aGlzLl8kZGlyZWN0aW9uLmdldFZhbHVlKCkgPT09IFNjcm9sbGVyRGlyZWN0aW9uLlZFUlRJQ0FMO1xyXG5cclxuICAgICAgICBjb25zdCB4ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShwb3NYKSxcclxuICAgICAgICAgICAgeSA9IHRoaXMubm9ybWFsaXplVmFsdWUocG9zWSksXHJcbiAgICAgICAgICAgIHByZXZYID0gdGhpcy5feCxcclxuICAgICAgICAgICAgcHJldlkgPSB0aGlzLl95O1xyXG4gICAgICAgIGlmIChiZWhhdmlvciA9PT0gQVVUTyB8fCBiZWhhdmlvciA9PT0gU01PT1RIKSB7XHJcbiAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICBpZiAocHJldlkgIT09IHkpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUocHJldlksIHksIGR1cmF0aW9uLCBlYXNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2WCAhPT0geCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShwcmV2WCwgeCwgZHVyYXRpb24sIGVhc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgaWYgKHRoaXMuX3kgIT09IHkpIHtcclxuICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFibGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoWSh5KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnkgPSB5O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl94ICE9PSB4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFibGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoWCh4KTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnggPSB4O1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZW1pdFNjcm9sbGFibGVFdmVudCgpIHtcclxuICAgICAgICBpZiAoISF0aGlzLmNka1Njcm9sbGFibGUpIHtcclxuICAgICAgICAgICAgdGhpcy5jZGtTY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKT8ubmF0aXZlRWxlbWVudD8uZGlzcGF0Y2hFdmVudChTQ1JPTExfRVZFTlQpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoWCh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGVudCA9IHRoaXMuc2Nyb2xsQ29udGVudD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBzY3JvbGxDb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgkeyh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogdmFsdWV9cHgsIDAsIDApYDtcclxuICAgIH1cclxuXHJcbiAgICByZWZyZXNoWSh2YWx1ZTogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGVudCA9IHRoaXMuc2Nyb2xsQ29udGVudD8ubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudDtcclxuICAgICAgICBzY3JvbGxDb250ZW50LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGUzZCgwLCAkeyh0aGlzLl9pbnZlcnNpb24gPyAxIDogLTEpICogdmFsdWV9cHgsIDApYDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb246IGJvb2xlYW4pIHtcclxuICAgICAgICB0aGlzLl8kc2Nyb2xsLm5leHQodXNlckFjdGlvbik7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uRHJhZ1N0YXJ0KCkgeyB9XHJcblxyXG4gICAgcmVzZXQob2Zmc2V0OiBudW1iZXIgPSAwKSB7XHJcbiAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKCk7XHJcbiAgICAgICAgdGhpcy5tb3ZlKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCksIG9mZnNldCk7XHJcbiAgICB9XHJcblxyXG4gICAgb3ZlcnJpZGUgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTtcclxuXHJcbiAgICAgICAgaWYgKHRoaXMuX2FuaW1hdG9yKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yLmRpc3Bvc2UoKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbn0iXX0=
|
|
857
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmctc2Nyb2xsLXZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLFNBQVMsR0FDdEMsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsSSxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsUUFBUSxFQUFVLFdBQVcsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzdGLE9BQU8sRUFDSCxnQkFBZ0IsRUFBRSx3QkFBd0IsRUFBRSwwQkFBMEIsRUFBRSx1QkFBdUIsRUFBRSw0QkFBNEIsRUFDN0gsMEJBQTBCLEVBQUUsb0JBQW9CLEVBQUUsMEJBQTBCLEVBQUUseUJBQXlCLEVBQUUsV0FBVyxFQUFFLFVBQVUsRUFDaEksVUFBVSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxLQUFLLEdBQ2xFLE1BQU0sYUFBYSxDQUFDO0FBRXJCLE9BQU8sRUFDSCxrQkFBa0IsRUFBRSxJQUFJLEVBQUUsUUFBUSxFQUFFLGNBQWMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLHVDQUF1QyxFQUN4SSxzQkFBc0IsRUFBRSwwQkFBMEIs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QjtRQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRVMsV0FBVyxLQUFLLENBQUM7SUFFM0IsS0FBSyxDQUFDLFNBQWlCLENBQUM7UUFDcEIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRVEsV0FBVztRQUNoQixLQUFLLENBQUMsV0FBVyxFQUFFLENBQUM7UUFFcEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2hCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDNUI7SUFDTCxDQUFDO3dHQXJrQ1EsWUFBWTs0RkFBWixZQUFZLGdjQUNnQixhQUFhLG9EQUh4QyxFQUFFOzs0RkFFSCxZQUFZO2tCQUp4QixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxFQUFFO2lCQUNmOzBFQUdZLGFBQWE7c0JBRHJCLFNBQVM7dUJBQUMsZ0JBQWdCLEVBQUUsRUFBRSxJQUFJLEVBQUUsYUFBYSxFQUFFO2dCQVFoRCxjQUFjO3NCQURqQixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixpQkFBaUI7c0JBRHBCLEtBQUs7Z0JBV0YsVUFBVTtzQkFEYixLQUFLO2dCQVdGLGlCQUFpQjtzQkFEcEIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLO2dCQVdGLGdCQUFnQjtzQkFEbkIsS0FBSztnQkFXRixlQUFlO3NCQURsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICAgIENvbXBvbmVudCwgaW5qZWN0LCBJbnB1dCwgVmlld0NoaWxkLFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDZGtTY3JvbGxhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY2RrL3Njcm9sbGluZyc7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZGVib3VuY2VUaW1lLCBkZWxheSwgZmlsdGVyLCBmcm9tRXZlbnQsIG1hcCwgb2YsIHJhY2UsIFN1YmplY3QsIHN3aXRjaE1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgQU5JTUFUT1JfTUlOX1RJTUVTVEFNUCwgQW5pbWF0b3IsIEVhc2luZywgZWFzZU91dFF1YWQgfSBmcm9tICcuLi8uLi91dGlscy9hbmltYXRvcic7XHJcbmltcG9ydCB7XHJcbiAgICBCRUhBVklPUl9JTlNUQU5ULCBERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMsIERFRkFVTFRfT1ZFUlNDUk9MTF9FTkFCTEVELCBERUZBVUxUX1NDUk9MTF9CRUhBVklPUiwgREVGQVVMVF9TQ1JPTExJTkdfT05FX0JZX09ORSxcclxuICAgIERFRkFVTFRfU0NST0xMSU5HX1NFVFRJTkdTLCBERUZBVUxUX1NOQVBfVE9fSVRFTSwgREVGQVVMVF9TTkFQX1RPX0lURU1fQUxJR04sIERFRkFVTFRfU05BUFBJTkdfRElTVEFOQ0UsIElOVEVSQUNUSVZFLCBNT1VTRV9ET1dOLFxyXG4gICAgTU9VU0VfTU9WRSwgTU9VU0VfVVAsIFRPVUNIX0VORCwgVE9VQ0hfTU9WRSwgVE9VQ0hfU1RBUlQsIFdIRUVMLFxyXG59IGZyb20gJy4uLy4uL2NvbnN0JztcclxuaW1wb3J0IHsgSVNjcm9sbFRvUGFyYW1zIH0gZnJvbSAnLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHtcclxuICAgIEFOSU1BVElPTl9EVVJBVElPTiwgQVVUTywgRFVSQVRJT04sIEZSSUNUSU9OX0ZPUkNFLCBJTlNUQU5ULCBMRUZULCBNQVNTLCBNQVhfRElTVCwgTUFYX0RVUkFUSU9OLCBNQVhfSVRFUkFUSU9OU19GT1JfQVZFUkFHRV9DQUxDVUxBVElPTlMsXHJcbiAgICBNQVhfVkVMT0NJVFlfVElNRVNUQU1QLCBPVkVSU0NST0xMX1NUQVJUX0lURVJBVElPTiwgU0NST0xMX0VWRU5ULCBTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPLCBTTU9PVEgsIFNQRUVEX1NDQUxFLCBUT1AsXHJcbn0gZnJvbSAnLi9jb25zdCc7XHJcbmltcG9ydCB7IGNhbGN1bGF0ZURpcmVjdGlvbiwgbWF0cml4M2QgfSBmcm9tICcuL3V0aWxzJztcclxuaW1wb3J0IHsgQmFzZVNjcm9sbFZpZXcgfSBmcm9tICcuL2Jhc2UvYmFzZS1zY3JvbGwtdmlldy5jb21wb25lbnQnO1xyXG5pbXBvcnQgeyBJQW5pbWF0aW9uUGFyYW1zLCBJU2Nyb2xsaW5nU2V0dGluZ3MgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzJztcclxuaW1wb3J0IHsgU25hcFRvSXRlbUFsaWducyB9IGZyb20gJy4uLy4uL2VudW1zJztcclxuaW1wb3J0IHsgTmdWaXJ0dWFsTGlzdFNlcnZpY2UgfSBmcm9tICcuLi8uLi9uZy12aXJ0dWFsLWxpc3Quc2VydmljZSc7XHJcbmltcG9ydCB7IElkLCBTbmFwcGluZ0Rpc3RhbmNlLCBTbmFwVG9JdGVtQWxpZ24gfSBmcm9tICcuLi8uLi90eXBlcyc7XHJcbmltcG9ydCB7IHBhcnNlRmxvYXRPclBlcnNlbnRhZ2VWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL3BhcnNlLWZsb2F0LW9yLXBlcnNlbnRhZ2UtdmFsdWUnO1xyXG5pbXBvcnQgeyBpc1BlcmNlbnRhZ2VWYWx1ZSB9IGZyb20gJy4uLy4uL3V0aWxzL2lzLXBlcnNlbnRhZ2UtdmFsdWUnO1xyXG5pbXBvcnQgeyBTY3JvbGxpbmdEaXJlY3Rpb24gfSBmcm9tICcuLi8uLi91dGlscy9zY3JvbGxpbmctZGlyZWN0aW9uJztcclxuaW1wb3J0IHsgY2FsY3VsYXRlVmVsb2NpdHkgfSBmcm9tICcuL3V0aWxzL2NhbGN1bGF0ZS12ZWxvY2l0eSc7XHJcblxyXG4vKipcclxuICogTmdTY3JvbGxWaWV3XHJcbiAqIE1heGltdW0gcGVyZm9ybWFuY2UgZm9yIGV4dHJlbWVseSBsYXJnZSBsaXN0cy5cclxuICogSXQgaXMgYmFzZWQgb24gYWxnb3JpdGhtcyBmb3IgdmlydHVhbGl6YXRpb24gb2Ygc2NyZWVuIG9iamVjdHMuXHJcbiAqIEBsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9Eam9ubnlYL25nLXZpcnR1YWwtbGlzdC9ibG9iLzE2LngvcHJvamVjdHMvbmctdmlydHVhbC1saXN0L3NyYy9saWIvY29tcG9uZW50cy9uZy1zY3JvbGwtdmlldy9uZy1zY3JvbGwtdmlldy5jb21wb25lbnQudHNcclxuICogQGF1dGhvciBFdmdlbmlpIEFsZXhhbmRyb3ZpY2ggR3JlYmVubmlrb3ZcclxuICogQGVtYWlsIGRqb25ueXhAZ21haWwuY29tXHJcbiAqL1xyXG5AQ29tcG9uZW50KHtcclxuICAgIHNlbGVjdG9yOiAnbmctc2Nyb2xsLXZpZXcnLFxyXG4gICAgdGVtcGxhdGU6ICcnLFxyXG59KVxyXG5leHBvcnQgY2xhc3MgTmdTY3JvbGxWaWV3IGV4dGVuZHMgQmFzZVNjcm9sbFZpZXcge1xyXG4gICAgQFZpZXdDaGlsZCgnc2Nyb2xsVmlld3BvcnQnLCB7IHJlYWQ6IENka1Njcm9sbGFibGUgfSlcclxuICAgIHJlYWRvbmx5IGNka1Njcm9sbGFibGU6IENka1Njcm9sbGFibGUgfCB1bmRlZmluZWQ7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zZXJ2aWNlID0gaW5qZWN0KE5nVmlydHVhbExpc3RTZXJ2aWNlKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxCZWhhdmlvciA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U2Nyb2xsQmVoYXZpb3I+KERFRkFVTFRfU0NST0xMX0JFSEFWSU9SKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxCZWhhdmlvciA9IHRoaXMuXyRzY3JvbGxCZWhhdmlvci5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsQmVoYXZpb3IodjogU2Nyb2xsQmVoYXZpb3IpIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNjcm9sbEJlaGF2aW9yLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEJlaGF2aW9yLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbEJlaGF2aW9yKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbEJlaGF2aW9yLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRvdmVyc2Nyb2xsRW5hYmxlZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oREVGQVVMVF9PVkVSU0NST0xMX0VOQUJMRUQpO1xyXG4gICAgcmVhZG9ubHkgJG92ZXJzY3JvbGxFbmFibGVkID0gdGhpcy5fJG92ZXJzY3JvbGxFbmFibGVkLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBvdmVyc2Nyb2xsRW5hYmxlZCh2OiBib29sZWFuKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBvdmVyc2Nyb2xsRW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuXyRvdmVyc2Nyb2xsRW5hYmxlZC5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kc2Nyb2xsaW5nU2V0dGluZ3MgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElTY3JvbGxpbmdTZXR0aW5ncz4oREVGQVVMVF9TQ1JPTExJTkdfU0VUVElOR1MpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbGluZ1NldHRpbmdzID0gdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzY3JvbGxpbmdTZXR0aW5ncyh2OiBJU2Nyb2xsaW5nU2V0dGluZ3MpIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNjcm9sbGluZ1NldHRpbmdzKCkgeyByZXR1cm4gdGhpcy5fJHNjcm9sbGluZ1NldHRpbmdzLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzbmFwVG9JdGVtID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NOQVBfVE9fSVRFTSk7XHJcbiAgICByZWFkb25seSAkc25hcFRvSXRlbSA9IHRoaXMuXyRzbmFwVG9JdGVtLmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgQElucHV0KClcclxuICAgIHNldCBzbmFwVG9JdGVtKHY6IGJvb2xlYW4pIHtcclxuICAgICAgICBpZiAodGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc25hcFRvSXRlbS5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzbmFwVG9JdGVtKCkgeyByZXR1cm4gdGhpcy5fJHNuYXBUb0l0ZW0uZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbGluZ09uZUJ5T25lID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihERUZBVUxUX1NDUk9MTElOR19PTkVfQllfT05FKTtcclxuICAgIHJlYWRvbmx5ICRzY3JvbGxpbmdPbmVCeU9uZSA9IHRoaXMuXyRzY3JvbGxpbmdPbmVCeU9uZS5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc2Nyb2xsaW5nT25lQnlPbmUodjogYm9vbGVhbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUubmV4dCh2KTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcbiAgICBnZXQgc2Nyb2xsaW5nT25lQnlPbmUoKSB7IHJldHVybiB0aGlzLl8kc2Nyb2xsaW5nT25lQnlPbmUuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHNuYXBUb0l0ZW1BbGlnbiA9IG5ldyBCZWhhdmlvclN1YmplY3Q8U25hcFRvSXRlbUFsaWduPihERUZBVUxUX1NOQVBfVE9fSVRFTV9BTElHTik7XHJcbiAgICByZWFkb25seSAkc25hcFRvSXRlbUFsaWduID0gdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5hc09ic2VydmFibGUoKTtcclxuICAgIEBJbnB1dCgpXHJcbiAgICBzZXQgc25hcFRvSXRlbUFsaWduKHY6IFNuYXBUb0l0ZW1BbGlnbikge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc25hcFRvSXRlbUFsaWduLmdldFZhbHVlKCkgIT09IHYpIHtcclxuICAgICAgICAgICAgdGhpcy5fJHNuYXBUb0l0ZW1BbGlnbi5uZXh0KHYpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIGdldCBzbmFwVG9JdGVtQWxpZ24oKSB7IHJldHVybiB0aGlzLl8kc25hcFRvSXRlbUFsaWduLmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzbmFwcGluZ0Rpc3RhbmNlID0gbmV3IEJlaGF2aW9yU3ViamVjdDxTbmFwcGluZ0Rpc3RhbmNlPihERUZBVUxUX1NOQVBQSU5HX0RJU1RBTkNFKTtcclxuICAgIHJlYWRvbmx5ICRzbmFwcGluZ0Rpc3RhbmNlID0gdGhpcy5fJHNuYXBwaW5nRGlzdGFuY2UuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IHNuYXBwaW5nRGlzdGFuY2UodjogU25hcHBpbmdEaXN0YW5jZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5nZXRWYWx1ZSgpICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuXyRzbmFwcGluZ0Rpc3RhbmNlLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IHNuYXBwaW5nRGlzdGFuY2UoKSB7IHJldHVybiB0aGlzLl8kc25hcHBpbmdEaXN0YW5jZS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kYW5pbWF0aW9uUGFyYW1zID0gbmV3IEJlaGF2aW9yU3ViamVjdDxJQW5pbWF0aW9uUGFyYW1zPihERUZBVUxUX0FOSU1BVElPTl9QQVJBTVMpO1xyXG4gICAgcmVhZG9ubHkgJGFuaW1hdGlvblBhcmFtcyA9IHRoaXMuXyRhbmltYXRpb25QYXJhbXMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBASW5wdXQoKVxyXG4gICAgc2V0IGFuaW1hdGlvblBhcmFtcyh2OiBJQW5pbWF0aW9uUGFyYW1zKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKSAhPT0gdikge1xyXG4gICAgICAgICAgICB0aGlzLl8kYW5pbWF0aW9uUGFyYW1zLm5leHQodik7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgZ2V0IGFuaW1hdGlvblBhcmFtcygpIHsgcmV0dXJuIHRoaXMuXyRhbmltYXRpb25QYXJhbXMuZ2V0VmFsdWUoKTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfbm9ybWFsaXplVmFsdWVGcm9tWmVybyA9IGluamVjdChTQ1JPTExfVklFV19OT1JNQUxJWkVfVkFMVUVfRlJPTV9aRVJPKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2lzU2Nyb2xsc1RvOiBib29sZWFuID0gZmFsc2U7XHJcblxyXG4gICAgcHJvdGVjdGVkIF9zY3JvbGxEaXJlY3Rpb24gPSBuZXcgU2Nyb2xsaW5nRGlyZWN0aW9uKCk7XHJcbiAgICBnZXQgc2Nyb2xsRGlyZWN0aW9uKCkge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uZ2V0KCk7XHJcbiAgICB9XHJcblxyXG4gICAgZ2V0ICRzY3JvbGxEaXJlY3Rpb24oKSB7IHJldHVybiB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uJGRpcmVjdGlvbjsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfJHdoZWVsID0gbmV3IFN1YmplY3Q8bnVtYmVyPigpO1xyXG4gICAgcmVhZG9ubHkgJHdoZWVsID0gdGhpcy5fJHdoZWVsLmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuICAgIHByb3RlY3RlZCBfJHNjcm9sbCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XHJcbiAgICByZWFkb25seSAkc2Nyb2xsID0gdGhpcy5fJHNjcm9sbC5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRzY3JvbGxFbmQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xyXG4gICAgcmVhZG9ubHkgJHNjcm9sbEVuZCA9IHRoaXMuXyRzY3JvbGxFbmQuYXNPYnNlcnZhYmxlKCk7XHJcblxyXG4gICAgcHJvdGVjdGVkIF92ZWxvY2l0aWVzOiBBcnJheTxudW1iZXI+ID0gW107XHJcblxyXG4gICAgcHJvdGVjdGVkIF8kdmVsb2NpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgICBwcm90ZWN0ZWQgJHZlbG9jaXR5ID0gdGhpcy5fJHZlbG9jaXR5LmFzT2JzZXJ2YWJsZSgpO1xyXG4gICAgZ2V0IHZlbG9jaXR5KCkgeyByZXR1cm4gdGhpcy5fJHZlbG9jaXR5LmdldFZhbHVlKCk7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgXyRhdmVyYWdlVmVsb2NpdHkgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XHJcbiAgICBwcm90ZWN0ZWQgJGF2ZXJhZ2VWZWxvY2l0eSA9IHRoaXMuXyRhdmVyYWdlVmVsb2NpdHkuYXNPYnNlcnZhYmxlKCk7XHJcbiAgICBnZXQgYXZlcmFnZVZlbG9jaXR5KCkgeyByZXR1cm4gdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5nZXRWYWx1ZSgpOyB9XHJcblxyXG4gICAgcHJpdmF0ZSBfbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wOiBudW1iZXIgPSBEYXRlLm5vdygpO1xyXG5cclxuICAgIHByaXZhdGUgX21lYXN1cmVWZWxvY2l0eUxhc3RQb3NpdGlvbjogbnVtYmVyID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IHRoaXMuX3kgOiB0aGlzLl94O1xyXG5cclxuICAgIHByaXZhdGUgX3N0YXJ0UG9zaXRpb24gPSAwO1xyXG5cclxuICAgIHByb3RlY3RlZCBfYW5pbWF0b3IgPSBuZXcgQW5pbWF0b3IoKTtcclxuXHJcbiAgICBwcm90ZWN0ZWQgX2ludGVyYWN0aXZlID0gdHJ1ZTtcclxuXHJcbiAgICBwcml2YXRlIF9vdmVyc2Nyb2xsSXRlcmF0aW9uOiBudW1iZXIgPSAwO1xyXG5cclxuICAgIG92ZXJyaWRlIHNldCB4KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuc2V0WCh2KTtcclxuICAgIH1cclxuICAgIG92ZXJyaWRlIGdldCB4KCkgeyByZXR1cm4gdGhpcy5feDsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRYKHg6IG51bWJlciwgc25hcDogYm9vbGVhbiA9IHRydWUsIG5vcm1hbGl6ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoeCAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNOYU4oeCkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oeCwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5fYWN0dWFsWSA9IHg7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVNjcm9sbFNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVZlbG9jaXR5KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIG92ZXJyaWRlIHNldCB5KHY6IG51bWJlcikge1xyXG4gICAgICAgIHRoaXMuc2V0WSh2KTtcclxuICAgIH1cclxuICAgIG92ZXJyaWRlIGdldCB5KCkgeyByZXR1cm4gdGhpcy5feTsgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzZXRZKHk6IG51bWJlciwgc25hcDogYm9vbGVhbiA9IHRydWUsIG5vcm1hbGl6ZTogYm9vbGVhbiA9IHRydWUpIHtcclxuICAgICAgICBpZiAoeSAhPT0gdW5kZWZpbmVkICYmICFOdW1iZXIuaXNOYU4oeSkpIHtcclxuICAgICAgICAgICAgdGhpcy51cGRhdGVEaXJlY3Rpb24oeSwgdGhpcy5feSk7XHJcblxyXG4gICAgICAgICAgICB0aGlzLl95ID0gdGhpcy5fYWN0dWFsWSA9IHk7XHJcblxyXG4gICAgICAgICAgICBpZiAobm9ybWFsaXplKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZVNjcm9sbFNpemUoKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoQ29vcmRpbmF0ZSh0aGlzLl94LCB0aGlzLl95KTtcclxuXHJcbiAgICAgICAgICAgIHRoaXMubWVhc3VyZVZlbG9jaXR5KCk7XHJcblxyXG4gICAgICAgICAgICBpZiAoc25hcCkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja0ludGVyc2VjdGlvbkNvbXBvbmVudCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBfZGVsdGE6IG51bWJlciA9IDA7XHJcbiAgICBzZXQgZGVsdGEodjogbnVtYmVyKSB7XHJcbiAgICAgICAgdGhpcy5fZGVsdGEgPSB2O1xyXG4gICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gKz0gdjtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBzZXQgc3RhcnRMYXlvdXRPZmZzZXQodjogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ICE9PSB2KSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0ID0gdjtcclxuXHJcbiAgICAgICAgICAgIHRoaXMucmVmcmVzaENvb3JkaW5hdGUodGhpcy5feCwgdGhpcy5feSk7XHJcbiAgICAgICAgfVxyXG4gICAgfVxyXG4gICAgb3ZlcnJpZGUgZ2V0IHN0YXJ0TGF5b3V0T2Zmc2V0KCkgeyByZXR1cm4gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7IH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgX2ludGVyc2VjdGlvbkNvbXBvbmVudElkOiBJZCB8IG51bGwgPSBudWxsO1xyXG5cclxuICAgIHByb3RlY3RlZCBfaXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuXHJcbiAgICBjb25zdHJ1Y3RvcigpIHtcclxuICAgICAgICBzdXBlcigpO1xyXG4gICAgfVxyXG5cclxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcclxuICAgICAgICBsZXQgbW91c2VDYW5jZWxlZCA9IGZhbHNlLFxyXG4gICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIGNvbnN0ICR2aWV3cG9ydEJvdW5kcyA9IHRoaXMuJHZpZXdwb3J0Qm91bmRzO1xyXG4gICAgICAgICR2aWV3cG9ydEJvdW5kcy5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLFxyXG4gICAgICAgICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgIGlmICghbW91c2VDYW5jZWxlZCB8fCAhdG91Y2hDYW5jZWxlZCkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRvdWNoQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc25hcFRvSXRlbSB8fCB0aGlzLnNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWxpZ25Qb3NpdGlvbih0cnVlLCB0cnVlKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0ICR3aGVlbCA9IHRoaXMuJHdoZWVsO1xyXG4gICAgICAgICR3aGVlbC5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgc3dpdGNoTWFwKHYgPT4gb2YodGhpcy5hdmVyYWdlVmVsb2NpdHkpKSxcclxuICAgICAgICAgICAgZGVib3VuY2VUaW1lKDEwMCksXHJcbiAgICAgICAgICAgIHRhcCh2ID0+IHtcclxuICAgICAgICAgICAgICAgIHRoaXMuc25hcFdpdGhJbml0aWFsRm9yY2VJZk5lY2Vzc2FyeSh2KTtcclxuICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpcmVjdGlvbi5jbGVhcigpO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdmlld3BvcnQgPSBvZih0aGlzLnNjcm9sbFZpZXdwb3J0KS5waXBlKFxyXG4gICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgZmlsdGVyKHYgPT4gISF2KSxcclxuICAgICAgICAgICAgbWFwKHYgPT4gdiEubmF0aXZlRWxlbWVudCksXHJcbiAgICAgICAgKSwgJGNvbnRlbnQgPSBvZih0aGlzLnNjcm9sbENvbnRlbnQpLnBpcGUoXHJcbiAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICBmaWx0ZXIodiA9PiAhIXYpLFxyXG4gICAgICAgICAgICBtYXAodiA9PiB2IS5uYXRpdmVFbGVtZW50KSxcclxuICAgICAgICApLCAkd2hlZWxFbWl0dGVyID0gdGhpcy5faW52ZXJzaW9uID8gJHZpZXdwb3J0IDogJGNvbnRlbnQ7XHJcblxyXG4gICAgICAgICR3aGVlbEVtaXR0ZXIucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8V2hlZWxFdmVudD4oY29udGVudCwgV0hFRUwsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxTaXplID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBpc1ZlcnRpY2FsID8gZS5kZWx0YVkgOiBlLmRlbHRhWCwgZHAgPSAoc3RhcnRQb3MgKyBkZWx0YSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHRoaXMuaXNJbmZpbml0eSA/IGRwIDogKGRwIDwgMCA/IDAgOiBkcCA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogZHApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbCh7IFtpc1ZlcnRpY2FsID8gVE9QIDogTEVGVF06IHBvc2l0aW9uLCBiZWhhdmlvcjogSU5TVEFOVCwgdXNlckFjdGlvbjogdHJ1ZSwgYmxlbmRpbmc6IGZhbHNlLCBmaXJlVXBkYXRlOiB0cnVlIH0pO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kd2hlZWwubmV4dChkZWx0YSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkbW91c2VVcCA9IHJhY2UoW1xyXG4gICAgICAgICAgICBmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiB0cnVlIH0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX1VQLCB7IHBhc3NpdmU6IHRydWUgfSkpXHJcbiAgICAgICAgICAgICksXHJcbiAgICAgICAgXSksXHJcbiAgICAgICAgICAgICRtb3VzZURyYWdDYW5jZWwgPSAkbW91c2VVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICBkZWxheSgwKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3VzZUNhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICBtb3VzZUNhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtICYmIHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfRE9XTiwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcigoKSA9PiB0aGlzLl9pbnRlcmFjdGl2ZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmFjZShbZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfVVAsIHsgcGFzc2l2ZTogZmFsc2UgfSksIGZyb21FdmVudDxNb3VzZUV2ZW50Pihjb250ZW50LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1vdXNlQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8TW91c2VFdmVudD4oY29udGVudCwgTU9VU0VfRE9XTiwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIGZpbHRlcih2ID0+IHRoaXMuX2ludGVyYWN0aXZlKSxcclxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2hNYXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vdXNlQ2FuY2VsZWQgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmNsZWFyKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRHJhZ1N0YXJ0KCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGUudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhJTlRFUkFDVElWRSkpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvZih1bmRlZmluZWQpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludmVyc2lvbiA9IHRoaXMuX2ludmVyc2lvbiwgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJGdyYWJiaW5nLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0UG9zaXRpb24gPSAoaXNWZXJ0aWNhbCA/IHRoaXMueSA6IHRoaXMueCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwcmV2Q2xpZW50UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8gZS5jbGllbnRZIDogZS5jbGllbnRYLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgPSBwcmV2Q2xpZW50UG9zaXRpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWxvY2l0aWVzID0gbmV3IEFycmF5PFtudW1iZXIsIG51bWJlcl0+KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBEYXRlLm5vdygpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KHdpbmRvdywgTU9VU0VfTU9WRSwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJG1vdXNlRHJhZ0NhbmNlbCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGwoZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHBvc2l0aW9uLCBjdXJyZW50UG9zLCBlbmRUaW1lLCBzY3JvbGxEZWx0YSB9ID1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbihpc1ZlcnRpY2FsLCBlLCBpbnZlcnNpb24sIHN0YXJ0Q2xpZW50UG9zLCBzdGFydFRpbWUsIHByZXZDbGllbnRQb3NpdGlvbiwgb2Zmc2V0cywgdmVsb2NpdGllcyk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldkNsaWVudFBvc2l0aW9uID0gY3VycmVudFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgcG9zaXRpb24sIHRydWUsIHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IE1hdGguYWJzKHBvc2l0aW9uKSAtIE1hdGguYWJzKGlzVmVydGljYWwgPyB0aGlzLl95IDogdGhpcy5feCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID49IChzY3JvbGxTaXplIC0gdmlld3BvcnRTaXplICogLjUpIHx8IHBvc2l0aW9uIDw9IDApIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRDbGllbnRQb3MgLT0gb2Zmc2V0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFRpbWUgPSBlbmRUaW1lO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByYWNlKFtmcm9tRXZlbnQ8TW91c2VFdmVudD4od2luZG93LCBNT1VTRV9VUCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PE1vdXNlRXZlbnQ+KGNvbnRlbnQsIE1PVVNFX1VQLCB7IHBhc3NpdmU6IGZhbHNlIH0pXSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCgkbW91c2VEcmFnQ2FuY2VsKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91c2VDYW5jZWxlZCA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbE92ZXJzY3JvbGwoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZFRpbWUgPSBEYXRlLm5vdygpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGVuZFRpbWUgLSBzdGFydFRpbWUsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGEwIH0gPSB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2lzTW92aW5nID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc25hcElmTmVjZXNzYXJ5KHYwLCBmYWxzZSkgJiYgdGhpcy5zY3JvbGxCZWhhdmlvciAhPT0gQkVIQVZJT1JfSU5TVEFOVCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVdpdGhBY2NlbGVyYXRpb24oaXNWZXJ0aWNhbCwgcG9zaXRpb24sIDAsIHYwLCBhMCwgdGltZXN0YW1wKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwSWZOZWNlc3NhcnkodjApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pXHJcbiAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICB9KSxcclxuICAgICAgICApLnN1YnNjcmliZSgpO1xyXG5cclxuICAgICAgICBjb25zdCAkdG91Y2hVcCA9IHJhY2UoXHJcbiAgICAgICAgICAgIFtcclxuICAgICAgICAgICAgICAgIGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KS5waXBlKFxyXG4gICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgKSxcclxuICAgICAgICAgICAgICAgICRjb250ZW50LnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGNvbnRlbnQgPT4gZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSksXHJcbiAgICAgICAgICAgICAgICApLFxyXG4gICAgICAgICAgICBdXHJcbiAgICAgICAgKSxcclxuICAgICAgICAgICAgJHRvdWNoQ2FuY2VsZXIgPSAkdG91Y2hVcC5waXBlKFxyXG4gICAgICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgICAgICBkZWxheSgwKSxcclxuICAgICAgICAgICAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dChmYWxzZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3VjaENhbmNlbGVkKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcE1vdmluZygpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zbmFwVG9JdGVtICYmIHRoaXMuc2Nyb2xsaW5nT25lQnlPbmUpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl8kc2Nyb2xsRW5kLm5leHQodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfU1RBUlQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbChmcm9tRXZlbnQ8VG91Y2hFdmVudD4od2luZG93LCBUT1VDSF9NT1ZFLCB7IHBhc3NpdmU6IGZhbHNlIH0pKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01vdmluZyA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRvdWNoQ2FuY2VsZWQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wTW92aW5nKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdWNoQ2FuY2VsZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNuYXBUb0l0ZW0gfHwgdGhpcy5zY3JvbGxpbmdPbmVCeU9uZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFsaWduUG9zaXRpb24odHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRzY3JvbGxFbmQubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgKTtcclxuICAgICAgICAgICAgfSksXHJcbiAgICAgICAgKS5zdWJzY3JpYmUoKTtcclxuXHJcbiAgICAgICAgJGNvbnRlbnQucGlwZShcclxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuXyR1bnN1YnNjcmliZSksXHJcbiAgICAgICAgICAgIHN3aXRjaE1hcChjb250ZW50ID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBmcm9tRXZlbnQ8VG91Y2hFdmVudD4oY29udGVudCwgVE9VQ0hfU1RBUlQsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwodGhpcy5fJHVuc3Vic2NyaWJlKSxcclxuICAgICAgICAgICAgICAgICAgICBmaWx0ZXIoKCkgPT4gdGhpcy5faW50ZXJhY3RpdmUpLFxyXG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaE1hcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdG91Y2hDYW5jZWxlZCA9IGZhbHNlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uY2xlYXIoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxPdmVyc2Nyb2xsKCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25EcmFnU3RhcnQoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9wU2Nyb2xsaW5nKHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BNb3ZpbmcoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQgYXMgSFRNTEVsZW1lbnQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKElOVEVSQUNUSVZFKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW52ZXJzaW9uID0gdGhpcy5faW52ZXJzaW9uLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSB0cnVlO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl8kZ3JhYmJpbmcubmV4dCh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy55IDogdGhpcy54KTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHByZXZDbGllbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFkgOiBlLnRvdWNoZXNbZS50b3VjaGVzLmxlbmd0aCAtIDFdLmNsaWVudFgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyA9IHByZXZDbGllbnRQb3NpdGlvbixcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMgPSBuZXcgQXJyYXk8W251bWJlciwgbnVtYmVyXT4oKSwgdmVsb2NpdGllcyA9IG5ldyBBcnJheTxbbnVtYmVyLCBudW1iZXJdPigpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lID0gRGF0ZS5ub3coKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX01PVkUsIHsgcGFzc2l2ZTogZmFsc2UgfSkucGlwZShcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKCR0b3VjaENhbmNlbGVyKSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcChlID0+IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT3ZlcnNjcm9sbChlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoTWFwKGUgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcG9zaXRpb24sIGN1cnJlbnRQb3MsIGVuZFRpbWUsIHNjcm9sbERlbHRhIH0gPVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWwsIGUsIGludmVyc2lvbiwgc3RhcnRDbGllbnRQb3MsIHN0YXJ0VGltZSwgcHJldkNsaWVudFBvc2l0aW9uLCBvZmZzZXRzLCB2ZWxvY2l0aWVzKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2Q2xpZW50UG9zaXRpb24gPSBjdXJyZW50UG9zO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gTWF0aC5hYnMocG9zaXRpb24pIC0gTWF0aC5hYnMoaXNWZXJ0aWNhbCA/IHRoaXMuX3kgOiB0aGlzLl94KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPj0gKHNjcm9sbFNpemUgLSB2aWV3cG9ydFNpemUgKiAuNSkgfHwgcG9zaXRpb24gPD0gMCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydENsaWVudFBvcyAtPSBvZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGVuZFRpbWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJhY2UoW2Zyb21FdmVudDxUb3VjaEV2ZW50Pih3aW5kb3csIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KSwgZnJvbUV2ZW50PFRvdWNoRXZlbnQ+KGNvbnRlbnQsIFRPVUNIX0VORCwgeyBwYXNzaXZlOiBmYWxzZSB9KV0pLnBpcGUoXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl8kdW5zdWJzY3JpYmUpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWtlVW50aWwoJHRvdWNoQ2FuY2VsZXIpLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXAoZSA9PiB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3VjaENhbmNlbGVkID0gdHJ1ZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsT3ZlcnNjcm9sbCgpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IERhdGUubm93KCksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHYwIH0gPSB0aGlzLmNhbGN1bGF0ZVZlbG9jaXR5KG9mZnNldHMsIHNjcm9sbERlbHRhLCB0aW1lc3RhbXApLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgYTAgfSA9IHRoaXMuY2FsY3VsYXRlQWNjZWxlcmF0aW9uKHZlbG9jaXRpZXMsIHYwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNNb3ZpbmcgPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuXyRncmFiYmluZy5uZXh0KGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5zbmFwSWZOZWNlc3NhcnkodjAsIGZhbHNlKSAmJiB0aGlzLnNjcm9sbEJlaGF2aW9yICE9PSBCRUhBVklPUl9JTlNUQU5UKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsLCBwb3NpdGlvbiwgMCwgdjAsIGEwLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBJZk5lY2Vzc2FyeSh2MCk7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHRydWUpO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgICAgICAgICAgfSlcclxuICAgICAgICAgICAgICAgICk7XHJcbiAgICAgICAgICAgIH0pLFxyXG4gICAgICAgICkuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHVwZGF0ZURpcmVjdGlvbihwb3NpdGlvbjogbnVtYmVyLCBwcmVQb3NpdGlvbjogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgZGVsdGEgPSAocG9zaXRpb24gLSB0aGlzLl9kZWx0YSkgLSBwcmVQb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uYWRkKGRlbHRhID4gMCA/IDEgOiBkZWx0YSA8IDAgPyAtMSA6IDApO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBvdmVycmlkZUNvb3JkaW5hdGVzKHg6IG51bWJlciwgeTogbnVtYmVyKSB7XHJcbiAgICAgICAgc3VwZXIub3ZlcnJpZGVDb29yZGluYXRlcyh4LCB5KTtcclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB5IDogeCk7XHJcbiAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHgsIHkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtZWFzdXJlVmVsb2NpdHkoKSB7XHJcbiAgICAgICAgY29uc3QgdGltZXN0YW1wID0gRGF0ZS5ub3coKTtcclxuICAgICAgICBpZiAodGltZXN0YW1wID09PSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXApIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBwb3NpdGlvbiA9IE1hdGguYWJzKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLl95IDogdGhpcy5feCk7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDw9IDAgfHwgcG9zaXRpb24gPj0gKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLl92ZWxvY2l0aWVzID0gWzBdO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KDApO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZVZlbG9jaXR5TGFzdFBvc2l0aW9uID0gcG9zaXRpb247XHJcbiAgICAgICAgICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICAgICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgaWYgKHRoaXMuX2RlbHRhICE9PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3QgdGltZURlbHRhID0gdGltZXN0YW1wIC0gdGhpcy5fbWVhc3VyZVZlbG9jaXR5VGltZXN0YW1wLFxyXG4gICAgICAgICAgICBwb3NpdGlvbkRlbHRhID0gTWF0aC5hYnMocG9zaXRpb24gLSB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24pLFxyXG4gICAgICAgICAgICB2ZWxvY2l0eSA9IHRpbWVEZWx0YSA+IDAgPyBwb3NpdGlvbkRlbHRhIC8gdGltZURlbHRhIDogMDtcclxuICAgICAgICBsZXQgYXZnVmVsb2NpdHkgPSB0aGlzLl92ZWxvY2l0aWVzLmxlbmd0aCA+IDAgPyB0aGlzLl92ZWxvY2l0aWVzLnJlZHVjZSgocCwgYykgPT4gcCArIGMpIDogMDtcclxuICAgICAgICBpZiAodGhpcy5fdmVsb2NpdGllcy5sZW5ndGggPj0gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMuc2hpZnQoKTtcclxuICAgICAgICB9XHJcbiAgICAgICAgYXZnVmVsb2NpdHkgKz0gdmVsb2NpdHk7XHJcbiAgICAgICAgdGhpcy5fJHZlbG9jaXR5Lm5leHQodmVsb2NpdHkpO1xyXG4gICAgICAgIHRoaXMuX3ZlbG9jaXRpZXMucHVzaCh2ZWxvY2l0eSk7XHJcbiAgICAgICAgdGhpcy5fJGF2ZXJhZ2VWZWxvY2l0eS5uZXh0KGF2Z1ZlbG9jaXR5IC8gTUFYX0lURVJBVElPTlNfRk9SX0FWRVJBR0VfQ0FMQ1VMQVRJT05TKTtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlMYXN0UG9zaXRpb24gPSBwb3NpdGlvbjtcclxuICAgICAgICB0aGlzLl9tZWFzdXJlVmVsb2NpdHlUaW1lc3RhbXAgPSB0aW1lc3RhbXA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIHN0b3BNb3ZpbmcoKSB7IH1cclxuXHJcbiAgICBwcml2YXRlIHNuYXBJZk5lY2Vzc2FyeSh2MDogbnVtYmVyLCB3aXRoSW5pdGlhbEZvcmNlOiBib29sZWFuID0gdHJ1ZSwgYW5pbWF0ZWQ6IGJvb2xlYW4gPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3Qgc2Nyb2xsRGlyZWN0aW9uID0gdGhpcy5fc2Nyb2xsRGlyZWN0aW9uLmdldCgpIHx8IChmb3JjZSA/IDEgOiAwKTtcclxuICAgICAgICBpZiAoc2Nyb2xsRGlyZWN0aW9uID09PSAwKSB7XHJcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgY29uc3Qgc25hcFRvSXRlbSA9IHRoaXMuc25hcFRvSXRlbTtcclxuICAgICAgICBpZiAoISFzbmFwVG9JdGVtKSB7XHJcbiAgICAgICAgICAgIGNvbnN0IHNjcm9sbGluZ09uZUJ5T25lID0gdGhpcy5zY3JvbGxpbmdPbmVCeU9uZTtcclxuICAgICAgICAgICAgaWYgKHNjcm9sbGluZ09uZUJ5T25lKSB7XHJcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgaWYgKHdpdGhJbml0aWFsRm9yY2UpIHtcclxuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNuYXBXaXRoSW5pdGlhbEZvcmNlSWZOZWNlc3NhcnkodjAsIGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBzbmFwV2l0aEluaXRpYWxGb3JjZUlmTmVjZXNzYXJ5KHYwOiBudW1iZXIgfCBudWxsID0gbnVsbCwgYW5pbWF0ZWQgPSB0cnVlLCBmb3JjZTogYm9vbGVhbiA9IGZhbHNlKSB7XHJcbiAgICAgICAgY29uc3QgdCA9IHRoaXMuYW5pbWF0aW9uUGFyYW1zLnNuYXBUb0l0ZW0gKiAuMDEsIHMgPSB0aGlzLmdldFNuYXBwZWRDb21wb25lbnRTaXplKCksXHJcbiAgICAgICAgICAgIHZhID0gcyAhPT0gbnVsbCAmJiB0ICE9PSAwID8gKHMgLyB0KSA6IDA7XHJcbiAgICAgICAgaWYgKHZhID49IE1hdGguYWJzKHYwID8/IHRoaXMuYXZlcmFnZVZlbG9jaXR5KSkge1xyXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5hbGlnblBvc2l0aW9uKGFuaW1hdGVkLCBmb3JjZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHJldHVybiBmYWxzZTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZVBvc2l0aW9uKGlzVmVydGljYWw6IGJvb2xlYW4sIGU6IE1vdXNlRXZlbnQgfCBUb3VjaEV2ZW50IHwgYW55LCBpbnZlcnNpb246IGJvb2xlYW4sIHN0YXJ0Q2xpZW50UG9zOiBudW1iZXIsIHN0YXJ0VGltZTogbnVtYmVyLFxyXG4gICAgICAgIHByZXZDbGllbnRQb3NpdGlvbjogbnVtYmVyLCBvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgdmVsb2NpdGllczogQXJyYXk8W251bWJlciwgbnVtYmVyXT5cclxuICAgICkge1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3MgPSBpc1ZlcnRpY2FsID8gZS50b3VjaGVzPy5bZS50b3VjaGVzPy5sZW5ndGggLSAxXT8uY2xpZW50WSB8fCBlLmNsaWVudFkgOiBlLnRvdWNoZXM/LltlLnRvdWNoZXM/Lmxlbmd0aCAtIDFdPy5jbGllbnRYIHx8IGUuY2xpZW50WCxcclxuICAgICAgICAgICAgc2Nyb2xsU2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsIGRlbHRhID0gKGludmVyc2lvbiA/IC0xIDogMSkgKiAoc3RhcnRDbGllbnRQb3MgLSBjdXJyZW50UG9zKSxcclxuICAgICAgICAgICAgZHAgPSB0aGlzLl9zdGFydFBvc2l0aW9uICsgZGVsdGEsIHBvc2l0aW9uID0gdGhpcy5pc0luZmluaXR5ID8gZHAgOiBkcCA8IDAgPyAwIDogZHAgPiBzY3JvbGxTaXplID8gc2Nyb2xsU2l6ZSA6IGRwLFxyXG4gICAgICAgICAgICBlbmRUaW1lID0gRGF0ZS5ub3coKSwgdGltZXN0YW1wID0gZW5kVGltZSAtIHN0YXJ0VGltZSwgc2Nyb2xsRGVsdGEgPSBwcmV2Q2xpZW50UG9zaXRpb24gPT09IDAgPyAwIDogcHJldkNsaWVudFBvc2l0aW9uIC0gY3VycmVudFBvcyxcclxuICAgICAgICAgICAgeyB2MCB9ID0gdGhpcy5jYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzLCBzY3JvbGxEZWx0YSwgdGltZXN0YW1wKTtcclxuICAgICAgICB0aGlzLmNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzLCB2MCwgdGltZXN0YW1wKTtcclxuICAgICAgICByZXR1cm4geyBwb3NpdGlvbiwgY3VycmVudFBvcywgZW5kVGltZSwgc2Nyb2xsRGVsdGEgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbmNlbE92ZXJzY3JvbGwoKSB7XHJcbiAgICAgICAgaWYgKCF0aGlzLm92ZXJzY3JvbGxFbmFibGVkKSB7XHJcbiAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5fb3ZlcnNjcm9sbEl0ZXJhdGlvbiA9IDA7XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjaGVja092ZXJzY3JvbGxCeUF4aXMoZTogRXZlbnQsIHBvczogbnVtYmVyLCBsaW1pdDogbnVtYmVyKSB7XHJcbiAgICAgICAgY29uc3QgcCA9IE1hdGguYWJzKHBvcyk7XHJcbiAgICAgICAgaWYgKHAgPiAwICYmIHAgPCBsaW1pdCkge1xyXG4gICAgICAgICAgICBpZiAoZS5jYW5jZWxhYmxlKSB7XHJcbiAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24gPSAwO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsSXRlcmF0aW9uIDwgT1ZFUlNDUk9MTF9TVEFSVF9JVEVSQVRJT04pIHtcclxuICAgICAgICAgICAgICAgIHRoaXMuX292ZXJzY3JvbGxJdGVyYXRpb24rKztcclxuICAgICAgICAgICAgICAgIGlmIChlLmNhbmNlbGFibGUpIHtcclxuICAgICAgICAgICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xyXG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNoZWNrT3ZlcnNjcm9sbChlOiBFdmVudCkge1xyXG4gICAgICAgIGlmICghdGhpcy5fb3ZlcnNjcm9sbEVuYWJsZWQgfHwgIXRoaXMub3ZlcnNjcm9sbEVuYWJsZWQpIHtcclxuICAgICAgICAgICAgaWYgKGUuY2FuY2VsYWJsZSkge1xyXG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcclxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICByZXR1cm47XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGlmICh0aGlzLl9vdmVyc2Nyb2xsRW5hYmxlZCkge1xyXG4gICAgICAgICAgICBpZiAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSkge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feSwgdGhpcy5zY3JvbGxIZWlnaHQpO1xyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja092ZXJzY3JvbGxCeUF4aXMoZSwgdGhpcy5feCwgdGhpcy5zY3JvbGxXaWR0aCk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJpdmF0ZSBjYWxjdWxhdGVWZWxvY2l0eShvZmZzZXRzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIG9mZnNldHMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcblxyXG4gICAgICAgIGNvbnN0IGxlbiA9IG9mZnNldHMubGVuZ3RoLCBzdGFydEluZGV4ID0gbGVuID4gaW5kZXhPZmZzZXQgPyBsZW4gLSBpbmRleE9mZnNldCA6IDAsIGxhc3RWU2lnbiA9IGNhbGN1bGF0ZURpcmVjdGlvbihvZmZzZXRzKSxcclxuICAgICAgICAgICAgc3BlZWRTY2FsZSA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/LnNwZWVkU2NhbGUgPz8gU1BFRURfU0NBTEU7XHJcbiAgICAgICAgbGV0IHZTdW0gPSAwO1xyXG4gICAgICAgIGZvciAobGV0IGkgPSBzdGFydEluZGV4LCBsID0gb2Zmc2V0cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcclxuICAgICAgICAgICAgY29uc3QgcDAgPSBvZmZzZXRzW2ldO1xyXG4gICAgICAgICAgICBpZiAobGFzdFZTaWduICE9PSBNYXRoLnNpZ24ocDBbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgdjAgPSAocDBbMV0gIT09IDAgPyBsYXN0VlNpZ24gKiBNYXRoLmFicyhwMFswXSAvIHAwWzFdKSAqIHNwZWVkU2NhbGUgOiAwKTtcclxuICAgICAgICAgICAgdlN1bSArPSBNYXRoLnNpZ24odjApICogTWF0aC5wb3codjAsIDQpICogLjAwMztcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIGNvbnN0IGwgPSBNYXRoLm1pbihvZmZzZXRzLmxlbmd0aCwgaW5kZXhPZmZzZXQpLCB2MCA9IGwgPiAwID8gKHZTdW0gLyBsKSA6IDA7XHJcbiAgICAgICAgcmV0dXJuIHsgdjAgfTtcclxuICAgIH1cclxuXHJcbiAgICBwcml2YXRlIGNhbGN1bGF0ZUFjY2VsZXJhdGlvbih2ZWxvY2l0aWVzOiBBcnJheTxbbnVtYmVyLCBudW1iZXJdPiwgZGVsdGE6IG51bWJlciwgdGltZXN0YW1wOiBudW1iZXIsIGluZGV4T2Zmc2V0OiBudW1iZXIgPSAxMCkge1xyXG4gICAgICAgIHZlbG9jaXRpZXMucHVzaChbZGVsdGEsIHRpbWVzdGFtcCA8IEFOSU1BVE9SX01JTl9USU1FU1RBTVAgPyBBTklNQVRPUl9NSU5fVElNRVNUQU1QIDogdGltZXN0YW1wXSk7XHJcbiAgICAgICAgY29uc3QgbGVuID0gdmVsb2NpdGllcy5sZW5ndGgsIHN0YXJ0SW5kZXggPSBsZW4gPiBpbmRleE9mZnNldCA/IGxlbiAtIGluZGV4T2Zmc2V0IDogMDtcclxuICAgICAgICBsZXQgYVN1bSA9IDAsIHByZXZWMDogW251bWJlciwgbnVtYmVyXSB8IHVuZGVmaW5lZCwgaXRlcmF0aW9uID0gMCwgbGFzdFZTaWduID0gY2FsY3VsYXRlRGlyZWN0aW9uKHZlbG9jaXRpZXMpO1xyXG4gICAgICAgIGNvbnN0IG1hc3MgPSB0aGlzLnNjcm9sbGluZ1NldHRpbmdzPy5tYXNzID8/IE1BU1M7XHJcbiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXgsIGwgPSB2ZWxvY2l0aWVzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xyXG4gICAgICAgICAgICBjb25zdCB2MDAgPSBwcmV2VjAsIHYwMSA9IHZlbG9jaXRpZXNbaV07XHJcbiAgICAgICAgICAgIGlmIChsYXN0VlNpZ24gIT09IE1hdGguc2lnbih2MDFbMF0pKSB7XHJcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBpZiAodjAwKSB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhMCA9IHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVAgPyAodjAwWzFdICE9PSAwID8gKGxhc3RWU2lnbiAqIE1hdGguYWJzKE1hdGguYWJzKHYwMVswXSkgLSBNYXRoLmFicyh2MDBbMF0pKSkgLyBNYXRoLmFicyh2MDBbMV0pIDogMCkgOiAwLjE7XHJcbiAgICAgICAgICAgICAgICBhU3VtID0gKGFTdW0gKiBtYXNzKSArIGEwO1xyXG4gICAgICAgICAgICAgICAgcHJldlYwID0gdjAxO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIHByZXZWMCA9IHYwMTtcclxuICAgICAgICAgICAgaXRlcmF0aW9uKys7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBhMCA9IGFTdW0gKiAodGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8uZnJpY3Rpb25hbEZvcmNlID8/IEZSSUNUSU9OX0ZPUkNFKTtcclxuICAgICAgICByZXR1cm4geyBhMCB9O1xyXG4gICAgfVxyXG5cclxuICAgIHN0b3BTY3JvbGxpbmcoZm9yY2U6IGJvb2xlYW4gPSBmYWxzZSkge1xyXG4gICAgICAgIGlmICh0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiAmJiAhZm9yY2UpIHtcclxuICAgICAgICAgICAgcmV0dXJuO1xyXG4gICAgICAgIH1cclxuICAgICAgICB0aGlzLl9pc0FsaWdubWVudEFuaW1hdGlvbiA9IGZhbHNlO1xyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLnN0b3AoKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbW92ZShpc1ZlcnRpY2FsOiBib29sZWFuLCBwb3NpdGlvbjogbnVtYmVyLCBibGVuZGluZzogYm9vbGVhbiA9IGZhbHNlLCB1c2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2UsIGZpcmVVcGRhdGU6IGJvb2xlYW4gPSB0cnVlKSB7XHJcbiAgICAgICAgdGhpcy5zY3JvbGwoeyBbaXNWZXJ0aWNhbCA/IFRPUCA6IExFRlRdOiBwb3NpdGlvbiwgYmVoYXZpb3I6IElOU1RBTlQsIGJsZW5kaW5nLCB1c2VyQWN0aW9uLCBmaXJlVXBkYXRlIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBtb3ZlV2l0aEFjY2VsZXJhdGlvbihpc1ZlcnRpY2FsOiBib29sZWFuLCBwb3NpdGlvbjogbnVtYmVyLCB2MDogbnVtYmVyLCB2OiBudW1iZXIsIGEwOiBudW1iZXIsIHRpbWVzdGFtcDogbnVtYmVyKSB7XHJcbiAgICAgICAgaWYgKGEwICE9PSAwICYmIHRpbWVzdGFtcCA8IE1BWF9WRUxPQ0lUWV9USU1FU1RBTVApIHtcclxuICAgICAgICAgICAgY29uc3QgZHZTaWduID0gTWF0aC5zaWduKHYpLFxyXG4gICAgICAgICAgICAgICAgbWFzcyA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1hc3MgPz8gTUFTUyxcclxuICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gRFVSQVRJT04sIG1heER1cmF0aW9uID0gdGhpcy5zY3JvbGxpbmdTZXR0aW5ncz8ubWF4RHVyYXRpb24gPz8gTUFYX0RVUkFUSU9OLFxyXG4gICAgICAgICAgICAgICAgbWF4RGlzdCA9IHRoaXMuc2Nyb2xsaW5nU2V0dGluZ3M/Lm1heERpc3RhbmNlID8/IE1BWF9ESVNULFxyXG4gICAgICAgICAgICAgICAgbWF4RGlzdGFuY2UgPSBkdlNpZ24gKiBtYXhEaXN0LCBzID0gKGR2U2lnbiAqIE1hdGguYWJzKChhMCAqIE1hdGgucG93KGR1cmF0aW9uLCAyKSkgKiAuNSkgLyAxMDAwKSAvIG1hc3MsXHJcbiAgICAgICAgICAgICAgICBkaXN0YW5jZSA9IE1hdGguYWJzKHMpIDwgbWF4RGlzdCA/IHMgOiBtYXhEaXN0YW5jZSwgcG9zaXRpb25XaXRoVmVsb2NpdHkgPSBwb3NpdGlvbiArICh0aGlzLl9pbnZlcnNpb24gPyAtMSA6IDEpICogZGlzdGFuY2UsXHJcbiAgICAgICAgICAgICAgICB2bWF4ID0gTWF0aC5tYXgoTWF0aC5hYnModjApLCBNYXRoLmFicyh2KSksXHJcbiAgICAgICAgICAgICAgICBhZCA9IE1hdGguYWJzKHZtYXggIT09IDAgPyBNYXRoLnNxcnQodm1heCkgOiAwKSAqIDEwIC8gbWFzcyxcclxuICAgICAgICAgICAgICAgIGFEdXJhdGlvbiA9IGFkIDwgbWF4RHVyYXRpb24gPyBhZCA6IG1heER1cmF0aW9uLFxyXG4gICAgICAgICAgICAgICAgc3RhcnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB0aGlzLnkgOiB0aGlzLng7XHJcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShzdGFydFBvc2l0aW9uLCBNYXRoLnJvdW5kKHBvc2l0aW9uV2l0aFZlbG9jaXR5KSwgYUR1cmF0aW9uLCBlYXNlT3V0UXVhZCwgdHJ1ZSk7XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgdGhpcy5hbGlnblBvc2l0aW9uKHRydWUsIHRydWUpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgbm9ybWFsaXplVmFsdWUodmFsdWU6IG51bWJlcikge1xyXG4gICAgICAgIGlmICh0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSxcclxuICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSB0aGlzLl9ub3JtYWxpemVWYWx1ZUZyb21aZXJvID8gMCA6IHRoaXMuc3RhcnRPZmZzZXQsXHJcbiAgICAgICAgICAgIHNjcm9sbFNpemUgPSB0aGlzLnNjcm9sbGFibGUgPyAoKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgpIC0gdGhpcy5hbGlnbm1lbnRFbmRPZmZzZXQpIDogMCxcclxuICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zY3JvbGxhYmxlID8gKHZhbHVlIDw9IHN0YXJ0T2Zmc2V0ID8gc3RhcnRPZmZzZXQgOiB2YWx1ZSA+IHNjcm9sbFNpemUgPyBzY3JvbGxTaXplIDogdmFsdWUpIDogc3RhcnRPZmZzZXQ7XHJcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYW5pbWF0ZShzdGFydFZhbHVlOiBudW1iZXIsIGVuZFZhbHVlOiBudW1iZXIsIGR1cmF0aW9uID0gQU5JTUFUSU9OX0RVUkFUSU9OLCBlYXNpbmdGdW5jdGlvbjogRWFzaW5nID0gZWFzZU91dFF1YWQsXHJcbiAgICAgICAgdXNlckFjdGlvbjogYm9vbGVhbiA9IGZhbHNlLCBhbGlnbm1lbnRBdENvbXBsZXRlOiBib29sZWFuID0gdHJ1ZSwgc2tpcE92ZXJyaWRlZENvb3JkaW5hdGVzOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBjb25zdCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICBsZXQgcG9zaXRpb24gPSBzdGFydFZhbHVlO1xyXG4gICAgICAgIHRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uID0gIWFsaWdubWVudEF0Q29tcGxldGU7XHJcblxyXG4gICAgICAgIHRoaXMuX2FuaW1hdG9yLmFuaW1hdGUoe1xyXG4gICAgICAgICAgICB3aXRoRGVsdGE6IHRoaXMuX3NlcnZpY2UuZHluYW1pYyAmJiAhdGhpcy5pc0luZmluaXR5LFxyXG4gICAgICAgICAgICBzdGFydFZhbHVlLFxyXG4gICAgICAgICAgICBlbmRWYWx1ZSxcclxuICAgICAgICAgICAgZHVyYXRpb24sXHJcbiAgICAgICAgICAgIGVhc2luZ0Z1bmN0aW9uLFxyXG4gICAgICAgICAgICBnZXRQcm9wVmFsdWU6ICgpID0+IHtcclxuICAgICAgICAgICAgICAgIHJldHVybiBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3g7XHJcbiAgICAgICAgICAgIH0sIG9uVXBkYXRlOiAoeyB2YWx1ZSwgdGltZXN0YW1wLCBlbGFwc2VkIH0pID0+IHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0Nvb3JkaW5hdGVzT3ZlcnJpZGVkICYmICFza2lwT3ZlcnJpZGVkQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc0Nvb3JkaW5hdGVzT3ZlcnJpZGVkID0gZmFsc2U7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudENvb3JkaW5hdGUgPSBpc1ZlcnRpY2FsID8gdGhpcy5feSA6IHRoaXMuX3gsIGRlbHRhID0gZW5kVmFsdWUgLSB2YWx1ZTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGUoY3VycmVudENvb3JkaW5hdGUsIGN1cnJlbnRDb29yZGluYXRlICsgZGVsdGEsIGR1cmF0aW9uIC0gZWxhcHNlZCwgZWFzaW5nRnVuY3Rpb24sIHVzZXJBY3Rpb24sIGFsaWdubWVudEF0Q29tcGxldGUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gY2FsY3VsYXRlVmVsb2NpdHkocG9zaXRpb24sIHZhbHVlIC0gdGhpcy5fZGVsdGEsIHRpbWVzdGFtcCkgPz8gdGhpcy5hdmVyYWdlVmVsb2NpdHk7XHJcbiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IHZhbHVlO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsaWdubWVudEF0Q29tcGxldGUgJiYgIXRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uICYmICFza2lwT3ZlcnJpZGVkQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc25hcElmTmVjZXNzYXJ5KHYwKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vdmUoaXNWZXJ0aWNhbCwgdmFsdWUsIGZhbHNlLCB1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCB2YWx1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZS51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgICAgIH0sIG9uQ29tcGxldGU6ICh7IHZhbHVlLCB0aW1lc3RhbXAgfSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgdGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gPSBmYWxzZTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHYwID0gY2FsY3VsYXRlVmVsb2NpdHkocG9zaXRpb24sIHZhbHVlLCB0aW1lc3RhbXApO1xyXG4gICAgICAgICAgICAgICAgaWYgKGFsaWdubWVudEF0Q29tcGxldGUgJiYgIXRoaXMuX2lzQWxpZ25tZW50QW5pbWF0aW9uICYmICFza2lwT3ZlcnJpZGVkQ29vcmRpbmF0ZXMpIHtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNuYXBJZk5lY2Vzc2FyeSh2MCk7XHJcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZShpc1ZlcnRpY2FsLCB2YWx1ZSwgZmFsc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgdGhpcy5fJHNjcm9sbEVuZC5uZXh0KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgdGhpcy5fc2VydmljZS51cGRhdGUodHJ1ZSk7XHJcbiAgICAgICAgICAgICAgICB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGUodmFsdWUpO1xyXG4gICAgICAgICAgICB9LFxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBnZXRTbmFwcGVkQ29tcG9uZW50U2l6ZSgpIHtcclxuICAgICAgICBjb25zdCBhbGlnbiA9IHRoaXMuc25hcFRvSXRlbUFsaWduLCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSwgc2QgPSB0aGlzLnNuYXBwaW5nRGlzdGFuY2UsXHJcbiAgICAgICAgICAgIHNuYXBwaW5nRGlzdGFuY2UgPSBwYXJzZUZsb2F0T3JQZXJzZW50YWdlVmFsdWUoc2QpLFxyXG4gICAgICAgICAgICBpc1BlcnNlbnRhZ2VTbmFwcGluZ0Rpc3RhbmNlID0gaXNQZXJjZW50YWdlVmFsdWUoc2QpO1xyXG4gICAgICAgIGxldCBzaXplOiBudW1iZXIgfCBudWxsID0gbnVsbDtcclxuICAgICAgICBjb25zdCBzY3JvbGxEaXJlY3Rpb24gPSB0aGlzLl9zY3JvbGxEaXJlY3Rpb24uZ2V0KCksXHJcbiAgICAgICAgICAgIGN1cnJlbnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxUb3AgOiB0aGlzLnNjcm9sbExlZnQpIC0gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKSxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudFNpemUgPSBpc1ZlcnRpY2FsID8gY3VycmVudENvbXBvbmVudEJvdW5kcz8uaGVpZ2h0ID8/IDAgOiBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy53aWR0aCA/PyAwO1xyXG4gICAgICAgIHN3aXRjaCAoYWxpZ24pIHtcclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLlNUQVJUOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoKHNjcm9sbERpcmVjdGlvbiA9PT0gMSA/IGN1cnJlbnRDb21wb25lbnRTaXplIDogMCkgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24oY3VycmVudFBvc2l0aW9uICsgb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wU2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gY29tcFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuQ0VOVEVSOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gKGN1cnJlbnRDb21wb25lbnRTaXplICogLjUgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUgKiAuNSxcclxuICAgICAgICAgICAgICAgICAgICBtYXhQb3MgPSBpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxIZWlnaHQgOiB0aGlzLnNjcm9sbFdpZHRoLFxyXG4gICAgICAgICAgICAgICAgICAgIHBvcyA9IE1hdGgubWluKGFjdHVhbFBvcywgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEJvdW5kcyA9IHRoaXMuX3NlcnZpY2UuZ2V0Q29tcG9uZW50Qm91bmRzQnlJbnRlcnNlY3Rpb25Qb3NpdGlvbihwb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0IH0gPSBjb21wb25lbnRCb3VuZHMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBTaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHNpemUgPSBjb21wU2l6ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5FTkQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IGlzVmVydGljYWwgPyB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS5oZWlnaHQgOiB0aGlzLl8kdmlld3BvcnRCb3VuZHMuZ2V0VmFsdWUoKS53aWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAoKHNjcm9sbERpcmVjdGlvbiA9PT0gMSA/IGN1cnJlbnRDb21wb25lbnRTaXplIDogMCkgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wU2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gY29tcFNpemU7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gc2l6ZTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgYWxpZ25Qb3NpdGlvbihhbmltYXRlZDogYm9vbGVhbiA9IHRydWUsIGZvcmNlOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICBpZiAoIXRoaXMuc25hcFRvSXRlbSB8fCAodGhpcy5faXNBbGlnbm1lbnRBbmltYXRpb24gJiYgIWZvcmNlKSkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IHNjcm9sbERpcmVjdGlvbiA9IHRoaXMuX3Njcm9sbERpcmVjdGlvbi5nZXQoKSB8fCAoZm9yY2UgPyAxIDogMCk7XHJcbiAgICAgICAgaWYgKHNjcm9sbERpcmVjdGlvbiA9PT0gMCkge1xyXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGNvbnN0IGFsaWduID0gdGhpcy5zbmFwVG9JdGVtQWxpZ24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGgsXHJcbiAgICAgICAgICAgIHNkID0gdGhpcy5zbmFwcGluZ0Rpc3RhbmNlLFxyXG4gICAgICAgICAgICBzbmFwcGluZ0Rpc3RhbmNlID0gcGFyc2VGbG9hdE9yUGVyc2VudGFnZVZhbHVlKHNkKSxcclxuICAgICAgICAgICAgaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA9IGlzUGVyY2VudGFnZVZhbHVlKHNkKTtcclxuICAgICAgICBsZXQgcG9zaXRpb246IG51bWJlciB8IG51bGwgPSBudWxsLCBzaXplOiBudW1iZXIgPSAwO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxUb3AgOiB0aGlzLnNjcm9sbExlZnQpIC0gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQsXHJcbiAgICAgICAgICAgIGN1cnJlbnRDb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24oY3VycmVudFBvc2l0aW9uKSxcclxuICAgICAgICAgICAgY3VycmVudENvbXBvbmVudFNpemUgPSBpc1ZlcnRpY2FsID8gY3VycmVudENvbXBvbmVudEJvdW5kcz8uaGVpZ2h0ID8/IDAgOiBjdXJyZW50Q29tcG9uZW50Qm91bmRzPy53aWR0aCA/PyAwO1xyXG4gICAgICAgIHN3aXRjaCAoYWxpZ24pIHtcclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLlNUQVJUOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoKHNjcm9sbERpcmVjdGlvbiA9PT0gMSA/IGN1cnJlbnRDb21wb25lbnRTaXplIDogMCkgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24oY3VycmVudFBvc2l0aW9uICsgb2Zmc2V0KTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLCBzdGFydE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQsIGFsaWdubWVudFN0YXJ0T2Zmc2V0ID0gdGhpcy5hbGlnbm1lbnRTdGFydE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8geSA6IHg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCkgLSAoc3RhcnRPZmZzZXQgLSBhbGlnbm1lbnRTdGFydE9mZnNldCkgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGNvbXBvbmVudFBvc2l0aW9uIC0gKHN0YXJ0T2Zmc2V0IC0gYWxpZ25tZW50U3RhcnRPZmZzZXQpICsgdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID4gbWF4UG9zKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IG1heFBvcztcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1ZlcnRpY2FsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHRoaXMuc2Nyb2xsSGVpZ2h0O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl94ID0gdGhpcy5zY3JvbGxXaWR0aDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIGNhc2UgU25hcFRvSXRlbUFsaWducy5DRU5URVI6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG9mZnNldCA9IChjdXJyZW50Q29tcG9uZW50U2l6ZSAqIC41IC0gKGlzUGVyc2VudGFnZVNuYXBwaW5nRGlzdGFuY2UgPyBjdXJyZW50Q29tcG9uZW50U2l6ZSAqIHNuYXBwaW5nRGlzdGFuY2UgOiBzbmFwcGluZ0Rpc3RhbmNlKSkgKiBzY3JvbGxEaXJlY3Rpb24sXHJcbiAgICAgICAgICAgICAgICAgICAgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgb2Zmc2V0ICsgdmlld3BvcnRTaXplICogLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLCBzdGFydE9mZnNldCA9IHRoaXMuc3RhcnRPZmZzZXQsIGFsaWdubWVudFN0YXJ0T2Zmc2V0ID0gdGhpcy5hbGlnbm1lbnRTdGFydE9mZnNldCxcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50UG9zaXRpb24gPSBpc1ZlcnRpY2FsID8geSA6IHg7XHJcbiAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IGlzVmVydGljYWwgPyBoZWlnaHQgOiB3aWR0aDtcclxuICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXhQb3MgPSAoaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCkgLSBzaXplICogLjUgLSB2aWV3cG9ydFNpemUgKiAuNSAtIChzdGFydE9mZnNldCAtIGFsaWdubWVudFN0YXJ0T2Zmc2V0KSAqIC41O1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29tcG9uZW50UG9zaXRpb24gKyBzaXplICogLjUgLSB2aWV3cG9ydFNpemUgKiAuNSAtIChzdGFydE9mZnNldCAtIGFsaWdubWVudFN0YXJ0T2Zmc2V0KSAqIC41ICsgdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbmZpbml0eSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPD0gMCB8fCBwb3NpdGlvbiA+IG1heFBvcykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBtYXhQb3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3kgPSB0aGlzLnNjcm9sbEhlaWdodDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feCA9IHRoaXMuc2Nyb2xsV2lkdGg7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuRU5EOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSAoKHNjcm9sbERpcmVjdGlvbiA9PT0gMSA/IGN1cnJlbnRDb21wb25lbnRTaXplIDogMCkgLSAoaXNQZXJzZW50YWdlU25hcHBpbmdEaXN0YW5jZSA/IGN1cnJlbnRDb21wb25lbnRTaXplICogc25hcHBpbmdEaXN0YW5jZSA6IHNuYXBwaW5nRGlzdGFuY2UpKSAqIHNjcm9sbERpcmVjdGlvbixcclxuICAgICAgICAgICAgICAgICAgICBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyBvZmZzZXQgKyB2aWV3cG9ydFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gY29tcG9uZW50Qm91bmRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRQb3NpdGlvbiA9IGlzVmVydGljYWwgPyB5IDogeDtcclxuICAgICAgICAgICAgICAgICAgICBzaXplID0gaXNWZXJ0aWNhbCA/IGhlaWdodCA6IHdpZHRoO1xyXG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29tcG9uZW50UG9zaXRpb24gLSB2aWV3cG9ydFNpemUgKyB0aGlzLl9zdGFydExheW91dE9mZnNldDtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIGJyZWFrO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICBjb25zdCBjUG9zID0gKGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbFRvcCA6IHRoaXMuc2Nyb2xsTGVmdCk7XHJcblxyXG4gICAgICAgIGlmIChwb3NpdGlvbiAhPT0gbnVsbCAmJiBwb3NpdGlvbiAhPT0gY1Bvcykge1xyXG4gICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcodHJ1ZSk7XHJcbiAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShjUG9zLCBwb3NpdGlvbiwgYW5pbWF0ZWQgPyB0aGlzLmFuaW1hdGlvblBhcmFtcy5zbmFwVG9JdGVtIDogMSwgZWFzZU91dFF1YWQsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7XHJcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGNoZWNrSW50ZXJzZWN0aW9uQ29tcG9uZW50KCkge1xyXG4gICAgICAgIGNvbnN0IGFsaWduID0gdGhpcy5zbmFwVG9JdGVtQWxpZ24sIGlzVmVydGljYWwgPSB0aGlzLl8kaXNWZXJ0aWNhbC5nZXRWYWx1ZSgpLFxyXG4gICAgICAgICAgICB2aWV3cG9ydFNpemUgPSBpc1ZlcnRpY2FsID8gdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkuaGVpZ2h0IDogdGhpcy5fJHZpZXdwb3J0Qm91bmRzLmdldFZhbHVlKCkud2lkdGg7XHJcbiAgICAgICAgbGV0IGNvbXBvbmVudElkOiBJZCB8IG51bGwgPSBudWxsO1xyXG4gICAgICAgIGNvbnN0IGN1cnJlbnRQb3NpdGlvbiA9IChpc1ZlcnRpY2FsID8gdGhpcy5zY3JvbGxUb3AgOiB0aGlzLnNjcm9sbExlZnQpIC0gdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQ7XHJcbiAgICAgICAgc3dpdGNoIChhbGlnbikge1xyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuU1RBUlQ6IHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IG1heFBvcyA9IGlzVmVydGljYWwgPyB0aGlzLnNjcm9sbEhlaWdodCA6IHRoaXMuc2Nyb2xsV2lkdGgsXHJcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Qm91bmRzID0gdGhpcy5fc2VydmljZS5nZXRDb21wb25lbnRCb3VuZHNCeUludGVyc2VjdGlvblBvc2l0aW9uKGN1cnJlbnRQb3NpdGlvbiwgbWF4UG9zKTtcclxuICAgICAgICAgICAgICAgIGlmICghIWNvbXBvbmVudEJvdW5kcykge1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaWQgfSA9IGNvbXBvbmVudEJvdW5kcztcclxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJZCA9IGlkO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgYnJlYWs7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgY2FzZSBTbmFwVG9JdGVtQWxpZ25zLkNFTlRFUjoge1xyXG4gICAgICAgICAgICAgICAgY29uc3QgYWN0dWFsUG9zID0gY3VycmVudFBvc2l0aW9uICsgdmlld3BvcnRTaXplICogLjUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gY29tcG9uZW50Qm91bmRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBjYXNlIFNuYXBUb0l0ZW1BbGlnbnMuRU5EOiB7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBhY3R1YWxQb3MgPSBjdXJyZW50UG9zaXRpb24gKyB2aWV3cG9ydFNpemUsXHJcbiAgICAgICAgICAgICAgICAgICAgbWF4UG9zID0gaXNWZXJ0aWNhbCA/IHRoaXMuc2Nyb2xsSGVpZ2h0IDogdGhpcy5zY3JvbGxXaWR0aCxcclxuICAgICAgICAgICAgICAgICAgICBwb3MgPSBNYXRoLm1pbihhY3R1YWxQb3MsIG1heFBvcyk7XHJcbiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRCb3VuZHMgPSB0aGlzLl9zZXJ2aWNlLmdldENvbXBvbmVudEJvdW5kc0J5SW50ZXJzZWN0aW9uUG9zaXRpb24ocG9zLCBtYXhQb3MpO1xyXG4gICAgICAgICAgICAgICAgaWYgKCEhY29tcG9uZW50Qm91bmRzKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpZCB9ID0gY29tcG9uZW50Qm91bmRzO1xyXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudElkID0gaWQ7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICBicmVhaztcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgaWYgKGNvbXBvbmVudElkICE9PSB0aGlzLl9pbnRlcnNlY3Rpb25Db21wb25lbnRJZCAmJiBjb21wb25lbnRJZCAhPT0gbnVsbCkge1xyXG4gICAgICAgICAgICB0aGlzLl9zZXJ2aWNlLnNldEludGVyc2VjdGlvbkVsZW1lbnRCeVNuYXBUb0l0ZW1BbGlnbihjb21wb25lbnRJZCk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuX2ludGVyc2VjdGlvbkNvbXBvbmVudElkID0gY29tcG9uZW50SWQ7XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIG9uQW5pbWF0aW9uQ29tcGxldGUocG9zaXRpb246IG51bWJlcikgeyB9XHJcblxyXG4gICAgZmlyZVNjcm9sbCh1c2VyQWN0aW9uOiBib29sZWFuID0gZmFsc2UpIHtcclxuICAgICAgICB0aGlzLl8kdXBkYXRlU2Nyb2xsQmFyLm5leHQoKTtcclxuICAgICAgICB0aGlzLmVtaXRTY3JvbGxhYmxlRXZlbnQoKTtcclxuICAgICAgICB0aGlzLmZpcmVTY3JvbGxFdmVudCh1c2VyQWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBzY3JvbGxMaW1pdHModmFsdWU/OiBudW1iZXIgfCB1bmRlZmluZWQsIHNpbGVudDogYm9vbGVhbiA9IGZhbHNlKTogYm9vbGVhbiB7XHJcbiAgICAgICAgaWYgKCF0aGlzLmlzSW5maW5pdHkpIHtcclxuICAgICAgICAgICAgY29uc3QgeCA9IHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IHRoaXMuX3gsIHkgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkID8gdmFsdWUgOiB0aGlzLl95LCBpc1ZlcnRpY2FsID0gdGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKTtcclxuICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHl5ID0gdGhpcy5ub3JtYWxpemVWYWx1ZSh5KTtcclxuICAgICAgICAgICAgICAgIGlmICh5ICE9PSB5eSkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feSA9IHl5O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueSA9IHl5O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHh4ID0gdGhpcy5ub3JtYWxpemVWYWx1ZSh4KTtcclxuICAgICAgICAgICAgICAgIGlmICh4ICE9PSB4eCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChzaWxlbnQpIHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feCA9IHh4O1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hDb29yZGluYXRlKHRoaXMuX3gsIHRoaXMuX3kpO1xyXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMueCA9IHh4O1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcblxyXG4gICAgc2Nyb2xsKHBhcmFtczogSVNjcm9sbFRvUGFyYW1zKSB7XHJcbiAgICAgICAgY29uc3QgcG9zWCA9IHBhcmFtcy54IHx8IHBhcmFtcy5sZWZ0IHx8IDAsXHJcbiAgICAgICAgICAgIHBvc1kgPSBwYXJhbXMueSB8fCBwYXJhbXMudG9wIHx8IDAsXHJcbiAgICAgICAgICAgIHVzZXJBY3Rpb24gPSBwYXJhbXMudXNlckFjdGlvbiA/PyBmYWxzZSxcclxuICAgICAgICAgICAgc25hcCA9IHBhcmFtcy5zbmFwID8/IHRydWUsXHJcbiAgICAgICAgICAgIG5vcm1hbGl6ZSA9IHBhcmFtcy5ub3JtYWxpemUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgZWFzZSA9IHBhcmFtcy5lYXNlIHx8IGVhc2VPdXRRdWFkLFxyXG4gICAgICAgICAgICBmaXJlVXBkYXRlID0gcGFyYW1zLmZpcmVVcGRhdGUgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgYmVoYXZpb3IgPSBwYXJhbXMuYmVoYXZpb3IgPz8gSU5TVEFOVCxcclxuICAgICAgICAgICAgYmxlbmRpbmcgPSBwYXJhbXMuYmxlbmRpbmcgPz8gdHJ1ZSxcclxuICAgICAgICAgICAgZm9yY2UgPSBwYXJhbXMuZm9yY2UgPz8gZmFsc2UsXHJcbiAgICAgICAgICAgIGR1cmF0aW9uID0gcGFyYW1zLmR1cmF0aW9uID8/IEFOSU1BVElPTl9EVVJBVElPTixcclxuICAgICAgICAgICAgaXNWZXJ0aWNhbCA9IHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCk7XHJcblxyXG4gICAgICAgIGNvbnN0IHggPSB0aGlzLm5vcm1hbGl6ZVZhbHVlKHBvc1gpLFxyXG4gICAgICAgICAgICB5ID0gdGhpcy5ub3JtYWxpemVWYWx1ZShwb3NZKSxcclxuICAgICAgICAgICAgcHJldlggPSB0aGlzLl94LFxyXG4gICAgICAgICAgICBwcmV2WSA9IHRoaXMuX3k7XHJcbiAgICAgICAgaWYgKGJlaGF2aW9yID09PSBBVVRPIHx8IGJlaGF2aW9yID09PSBTTU9PVEgpIHtcclxuICAgICAgICAgICAgaWYgKGlzVmVydGljYWwpIHtcclxuICAgICAgICAgICAgICAgIGlmIChwcmV2WSAhPT0geSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5pbWF0ZShwcmV2WSwgeSwgZHVyYXRpb24sIGVhc2UsIHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICAgICAgaWYgKHByZXZYICE9PSB4KSB7XHJcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmltYXRlKHByZXZYLCB4LCBkdXJhdGlvbiwgZWFzZSwgdXNlckFjdGlvbik7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgICBpZiAoaXNWZXJ0aWNhbCkge1xyXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3kgIT09IHkgfHwgZm9yY2UpIHtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoIWJsZW5kaW5nKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNjcm9sbGluZyhmb3JjZSk7XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0WSh5LCBzbmFwLCBub3JtYWxpemUpO1xyXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1pdFNjcm9sbGFibGVFdmVudCgpO1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChmaXJlVXBkYXRlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVNjcm9sbEV2ZW50KHVzZXJBY3Rpb24pO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl94ICE9PSB4IHx8IGZvcmNlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFibGVuZGluZykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoZm9yY2UpO1xyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFgoeCwgc25hcCwgbm9ybWFsaXplKTtcclxuICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRTY3JvbGxhYmxlRXZlbnQoKTtcclxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyZVVwZGF0ZSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVTY3JvbGxFdmVudCh1c2VyQWN0aW9uKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcHJvdGVjdGVkIGVtaXRTY3JvbGxhYmxlRXZlbnQoKSB7XHJcbiAgICAgICAgaWYgKCEhdGhpcy5jZGtTY3JvbGxhYmxlKSB7XHJcbiAgICAgICAgICAgIHRoaXMuY2RrU2Nyb2xsYWJsZS5nZXRFbGVtZW50UmVmKCk/Lm5hdGl2ZUVsZW1lbnQ/LmRpc3BhdGNoRXZlbnQoU0NST0xMX0VWRU5UKTtcclxuICAgICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmVmcmVzaENvb3JkaW5hdGUoeDogbnVtYmVyLCB5OiBudW1iZXIpIHtcclxuICAgICAgICBjb25zdCBzY3JvbGxDb250ZW50ID0gdGhpcy5zY3JvbGxDb250ZW50Py5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50O1xyXG4gICAgICAgIHNjcm9sbENvbnRlbnQuc3R5bGUudHJhbnNmb3JtID0gbWF0cml4M2QoKHRoaXMuX2ludmVyc2lvbiA/IDEgOiAtMSkgKiB4ICsgKHRoaXMuXyRpc1ZlcnRpY2FsLmdldFZhbHVlKCkgPyAwIDogdGhpcy5fc3RhcnRMYXlvdXRPZmZzZXQpLFxyXG4gICAgICAgICAgICAodGhpcy5faW52ZXJzaW9uID8gMSA6IC0xKSAqIHkgKyAodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSA/IHRoaXMuX3N0YXJ0TGF5b3V0T2Zmc2V0IDogMCkpO1xyXG4gICAgfVxyXG5cclxuICAgIHByb3RlY3RlZCBmaXJlU2Nyb2xsRXZlbnQodXNlckFjdGlvbjogYm9vbGVhbikge1xyXG4gICAgICAgIHRoaXMuXyRzY3JvbGwubmV4dCh1c2VyQWN0aW9uKTtcclxuICAgIH1cclxuXHJcbiAgICBwcm90ZWN0ZWQgb25EcmFnU3RhcnQoKSB7IH1cclxuXHJcbiAgICByZXNldChvZmZzZXQ6IG51bWJlciA9IDApIHtcclxuICAgICAgICB0aGlzLnN0b3BTY3JvbGxpbmcoKTtcclxuICAgICAgICB0aGlzLm1vdmUodGhpcy5fJGlzVmVydGljYWwuZ2V0VmFsdWUoKSwgb2Zmc2V0KTtcclxuICAgIH1cclxuXHJcbiAgICBvdmVycmlkZSBuZ09uRGVzdHJveSgpOiB2b2lkIHtcclxuICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpO1xyXG5cclxuICAgICAgICBpZiAodGhpcy5fYW5pbWF0b3IpIHtcclxuICAgICAgICAgICAgdGhpcy5fYW5pbWF0b3IuZGlzcG9zZSgpO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxufSJdfQ==
|