UNPKG

@y3krulez/angular-archwizard

Version:

The port of angular-archwizard, supporting IVY and thus being compatible with Angular16+

164 lines 23 kB
import { MovingDirection } from '../util/moving-direction.enum'; /** * Base implementation of [[NavigationMode]] * * Note: Built-in [[NavigationMode]] classes should be stateless, allowing the library user to easily create * an instance of a particular [[NavigationMode]] class and pass it to `<aw-wizard [navigationMode]="...">`. * * @author Marc Arndt */ export class BaseNavigationMode { /** * Checks, whether a wizard step, as defined by the given destination index, can be transitioned to. * * This method controls navigation by [[goToStep]], [[goToPreviousStep]], and [[goToNextStep]] directives. * Navigation by navigation bar is governed by [[isNavigable]]. * * In this implementation, a destination wizard step can be entered if: * - it exists * - the current step can be exited in the direction of the destination step * - the destination step can be entered in the direction from the current step * * Subclasses can impose additional restrictions, see [[canTransitionToStep]]. * * @param wizard The wizard component to operate on * @param destinationIndex The index of the destination step * @returns A [[Promise]] containing `true`, if the destination step can be transitioned to and `false` otherwise */ canGoToStep(wizard, destinationIndex) { const hasStep = wizard.hasStep(destinationIndex); const movingDirection = wizard.getMovingDirection(destinationIndex); const canExitCurrentStep = (previous) => { return previous && wizard.currentStep.canExitStep(movingDirection); }; const canEnterDestinationStep = (previous) => { return previous && wizard.getStepAtIndex(destinationIndex).canEnterStep(movingDirection); }; const canTransitionToStep = (previous) => { return previous && this.canTransitionToStep(wizard, destinationIndex); }; return Promise.resolve(hasStep) .then(canTransitionToStep) // Apply user-defined checks at the end. They can involve user interaction // which is better to be avoided if navigation mode does not actually allow the transition // (`canTransitionToStep` returns `false`). .then(canExitCurrentStep) .then(canEnterDestinationStep); } /** * Imposes additional restrictions for `canGoToStep` in current navigation mode. * * The base implementation allows transition iff the given step is navigable from the navigation bar (see `isNavigable`). * However, in some navigation modes `canTransitionToStep` can be more relaxed to allow navigation to certain steps * by previous/next buttons, but not using the navigation bar. * * @param wizard The wizard component to operate on * @param destinationIndex The index of the destination step * @returns `true`, if the destination step can be transitioned to and `false` otherwise */ canTransitionToStep(wizard, destinationIndex) { return this.isNavigable(wizard, destinationIndex); } /** * Tries to transition to the wizard step, as denoted by the given destination index. * * When entering the destination step, the following actions are done: * - the old current step is set as completed * - the old current step is set as unselected * - the old current step is exited * - the destination step is set as selected * - the destination step is entered * * When the destination step couldn't be entered, the following actions are done: * - the current step is exited and entered in the direction `MovingDirection.Stay` * * @param wizard The wizard component to operate on * @param destinationIndex The index of the destination wizard step, which should be entered * @param preFinalize An event emitter, to be called before the step has been transitioned * @param postFinalize An event emitter, to be called after the step has been transitioned */ goToStep(wizard, destinationIndex, preFinalize, postFinalize) { this.canGoToStep(wizard, destinationIndex).then(navigationAllowed => { if (navigationAllowed) { // the current step can be exited in the given direction const movingDirection = wizard.getMovingDirection(destinationIndex); /* istanbul ignore if */ if (preFinalize) { preFinalize.emit(); } // leave current step wizard.currentStep.completed = true; wizard.currentStep.exit(movingDirection); wizard.currentStep.editing = false; wizard.currentStep.selected = false; this.transition(wizard, destinationIndex); // remember if the next step is already completed before entering it to properly set `editing` flag const wasCompleted = wizard.completed || wizard.currentStep.completed; // go to next step wizard.currentStep.enter(movingDirection); wizard.currentStep.selected = true; if (wasCompleted) { wizard.currentStep.editing = true; } /* istanbul ignore if */ if (postFinalize) { postFinalize.emit(); } } else { // if the current step can't be left, reenter the current step wizard.currentStep.exit(MovingDirection.Stay); wizard.currentStep.enter(MovingDirection.Stay); } }); } /** * Transitions the wizard to the given step index. * * Can perform additional actions in particular navigation mode implementations. * * @param wizard The wizard component to operate on * @param destinationIndex The index of the destination wizard step */ transition(wizard, destinationIndex) { wizard.currentStepIndex = destinationIndex; } /** * Resets the state of this wizard. * * A reset transitions the wizard automatically to the first step and sets all steps as incomplete. * In addition the whole wizard is set as incomplete. * * @param wizard The wizard component to operate on */ reset(wizard) { this.ensureCanReset(wizard); // reset the step internal state wizard.wizardSteps.forEach(step => { step.completed = step.initiallyCompleted; step.selected = false; step.editing = false; }); // set the first step as the current step wizard.currentStepIndex = wizard.defaultStepIndex; wizard.currentStep.selected = true; wizard.currentStep.enter(MovingDirection.Forwards); } /** * Checks if wizard configuration allows to perform reset. * * A check failure is indicated by throwing an `Error` with the message discribing the discovered misconfiguration issue. * * Can include additional checks in particular navigation mode implementations. * * @param wizard The wizard component to operate on * @throws An `Error` is thrown, if a micconfiguration issue is discovered. */ ensureCanReset(wizard) { // the wizard doesn't contain a step with the default step index if (!wizard.hasStep(wizard.defaultStepIndex)) { throw new Error(`The wizard doesn't contain a step with index ${wizard.defaultStepIndex}`); } } } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1uYXZpZ2F0aW9uLW1vZGUuaW50ZXJmYWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9uYXZpZ2F0aW9uL2Jhc2UtbmF2aWdhdGlvbi1tb2RlLmludGVyZmFjZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsZUFBZSxFQUFDLE1BQU0sK0JBQStCLENBQUM7QUFJOUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sT0FBZ0Isa0JBQWtCO0lBRXRDOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksV0FBVyxDQUFDLE1BQXVCLEVBQUUsZ0JBQXdCO1FBQ2xFLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVqRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsa0JBQWtCLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUVwRSxNQUFNLGtCQUFrQixHQUFHLENBQUMsUUFBaUIsRUFBRSxFQUFFO1lBQy9DLE9BQU8sUUFBUSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3JFLENBQUMsQ0FBQztRQUVGLE1BQU0sdUJBQXVCLEdBQUcsQ0FBQyxRQUFpQixFQUFFLEVBQUU7WUFDcEQsT0FBTyxRQUFRLElBQUksTUFBTSxDQUFDLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLFlBQVksQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUMzRixDQUFDLENBQUM7UUFFRixNQUFNLG1CQUFtQixHQUFHLENBQUMsUUFBaUIsRUFBRSxFQUFFO1lBQ2hELE9BQU8sUUFBUSxJQUFJLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztRQUN4RSxDQUFDLENBQUM7UUFFRixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDO2FBQzVCLElBQUksQ0FBQyxtQkFBbUIsQ0FBQztZ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QWdCLENBQUM7UUFDbEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ25DLE1BQU0sQ0FBQyxXQUFXLENBQUMsS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ08sY0FBYyxDQUFDLE1BQXVCO1FBQzlDLGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtZQUM1QyxNQUFNLElBQUksS0FBSyxDQUFDLGdEQUFnRCxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQyxDQUFDO1NBQzVGO0lBQ0gsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge01vdmluZ0RpcmVjdGlvbn0gZnJvbSAnLi4vdXRpbC9tb3ZpbmctZGlyZWN0aW9uLmVudW0nO1xyXG5pbXBvcnQge05hdmlnYXRpb25Nb2RlfSBmcm9tICcuL25hdmlnYXRpb24tbW9kZS5pbnRlcmZhY2UnO1xyXG5pbXBvcnQge1dpemFyZENvbXBvbmVudH0gZnJvbSAnLi4vY29tcG9uZW50cy93aXphcmQuY29tcG9uZW50JztcclxuXHJcbi8qKlxyXG4gKiBCYXNlIGltcGxlbWVudGF0aW9uIG9mIFtbTmF2aWdhdGlvbk1vZGVdXVxyXG4gKlxyXG4gKiBOb3RlOiBCdWlsdC1pbiBbW05hdmlnYXRpb25Nb2RlXV0gY2xhc3NlcyBzaG91bGQgYmUgc3RhdGVsZXNzLCBhbGxvd2luZyB0aGUgbGlicmFyeSB1c2VyIHRvIGVhc2lseSBjcmVhdGVcclxuICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIFtbTmF2aWdhdGlvbk1vZGVdXSBjbGFzcyBhbmQgcGFzcyBpdCB0byBgPGF3LXdpemFyZCBbbmF2aWdhdGlvbk1vZGVdPVwiLi4uXCI+YC5cclxuICpcclxuICogQGF1dGhvciBNYXJjIEFybmR0XHJcbiAqL1xyXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQmFzZU5hdmlnYXRpb25Nb2RlIGltcGxlbWVudHMgTmF2aWdhdGlvbk1vZGUge1xyXG5cclxuICAvKipcclxuICAgKiBDaGVja3MsIHdoZXRoZXIgYSB3aXphcmQgc3RlcCwgYXMgZGVmaW5lZCBieSB0aGUgZ2l2ZW4gZGVzdGluYXRpb24gaW5kZXgsIGNhbiBiZSB0cmFuc2l0aW9uZWQgdG8uXHJcbiAgICpcclxuICAgKiBUaGlzIG1ldGhvZCBjb250cm9scyBuYXZpZ2F0aW9uIGJ5IFtbZ29Ub1N0ZXBdXSwgW1tnb1RvUHJldmlvdXNTdGVwXV0sIGFuZCBbW2dvVG9OZXh0U3RlcF1dIGRpcmVjdGl2ZXMuXHJcbiAgICogTmF2aWdhdGlvbiBieSBuYXZpZ2F0aW9uIGJhciBpcyBnb3Zlcm5lZCBieSBbW2lzTmF2aWdhYmxlXV0uXHJcbiAgICpcclxuICAgKiBJbiB0aGlzIGltcGxlbWVudGF0aW9uLCBhIGRlc3RpbmF0aW9uIHdpemFyZCBzdGVwIGNhbiBiZSBlbnRlcmVkIGlmOlxyXG4gICAqIC0gaXQgZXhpc3RzXHJcbiAgICogLSB0aGUgY3VycmVudCBzdGVwIGNhbiBiZSBleGl0ZWQgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZGVzdGluYXRpb24gc3RlcFxyXG4gICAqIC0gdGhlIGRlc3RpbmF0aW9uIHN0ZXAgY2FuIGJlIGVudGVyZWQgaW4gdGhlIGRpcmVjdGlvbiBmcm9tIHRoZSBjdXJyZW50IHN0ZXBcclxuICAgKlxyXG4gICAqIFN1YmNsYXNzZXMgY2FuIGltcG9zZSBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucywgc2VlIFtbY2FuVHJhbnNpdGlvblRvU3RlcF1dLlxyXG4gICAqXHJcbiAgICogQHBhcmFtIHdpemFyZCBUaGUgd2l6YXJkIGNvbXBvbmVudCB0byBvcGVyYXRlIG9uXHJcbiAgICogQHBhcmFtIGRlc3RpbmF0aW9uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXN0aW5hdGlvbiBzdGVwXHJcbiAgICogQHJldHVybnMgQSBbW1Byb21pc2VdXSBjb250YWluaW5nIGB0cnVlYCwgaWYgdGhlIGRlc3RpbmF0aW9uIHN0ZXAgY2FuIGJlIHRyYW5zaXRpb25lZCB0byBhbmQgYGZhbHNlYCBvdGhlcndpc2VcclxuICAgKi9cclxuICBwdWJsaWMgY2FuR29Ub1N0ZXAod2l6YXJkOiBXaXphcmRDb21wb25lbnQsIGRlc3RpbmF0aW9uSW5kZXg6IG51bWJlcik6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgY29uc3QgaGFzU3RlcCA9IHdpemFyZC5oYXNTdGVwKGRlc3RpbmF0aW9uSW5kZXgpO1xyXG5cclxuICAgIGNvbnN0IG1vdmluZ0RpcmVjdGlvbiA9IHdpemFyZC5nZXRNb3ZpbmdEaXJlY3Rpb24oZGVzdGluYXRpb25JbmRleCk7XHJcblxyXG4gICAgY29uc3QgY2FuRXhpdEN1cnJlbnRTdGVwID0gKHByZXZpb3VzOiBib29sZWFuKSA9PiB7XHJcbiAgICAgIHJldHVybiBwcmV2aW91cyAmJiB3aXphcmQuY3VycmVudFN0ZXAuY2FuRXhpdFN0ZXAobW92aW5nRGlyZWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY2FuRW50ZXJEZXN0aW5hdGlvblN0ZXAgPSAocHJldmlvdXM6IGJvb2xlYW4pID0+IHtcclxuICAgICAgcmV0dXJuIHByZXZpb3VzICYmIHdpemFyZC5nZXRTdGVwQXRJbmRleChkZXN0aW5hdGlvbkluZGV4KS5jYW5FbnRlclN0ZXAobW92aW5nRGlyZWN0aW9uKTtcclxuICAgIH07XHJcblxyXG4gICAgY29uc3QgY2FuVHJhbnNpdGlvblRvU3RlcCA9IChwcmV2aW91czogYm9vbGVhbikgPT4ge1xyXG4gICAgICByZXR1cm4gcHJldmlvdXMgJiYgdGhpcy5jYW5UcmFuc2l0aW9uVG9TdGVwKHdpemFyZCwgZGVzdGluYXRpb25JbmRleCk7XHJcbiAgICB9O1xyXG5cclxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaGFzU3RlcClcclxuICAgICAgLnRoZW4oY2FuVHJhbnNpdGlvblRvU3RlcClcclxuICAgICAgLy8gQXBwbHkgdXNlci1kZWZpbmVkIGNoZWNrcyBhdCB0aGUgZW5kLiAgVGhleSBjYW4gaW52b2x2ZSB1c2VyIGludGVyYWN0aW9uXHJcbiAgICAgIC8vIHdoaWNoIGlzIGJldHRlciB0byBiZSBhdm9pZGVkIGlmIG5hdmlnYXRpb24gbW9kZSBkb2VzIG5vdCBhY3R1YWxseSBhbGxvdyB0aGUgdHJhbnNpdGlvblxyXG4gICAgICAvLyAoYGNhblRyYW5zaXRpb25Ub1N0ZXBgIHJldHVybnMgYGZhbHNlYCkuXHJcbiAgICAgIC50aGVuKGNhbkV4aXRDdXJyZW50U3RlcClcclxuICAgICAgLnRoZW4oY2FuRW50ZXJEZXN0aW5hdGlvblN0ZXApO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogSW1wb3NlcyBhZGRpdGlvbmFsIHJlc3RyaWN0aW9ucyBmb3IgYGNhbkdvVG9TdGVwYCBpbiBjdXJyZW50IG5hdmlnYXRpb24gbW9kZS5cclxuICAgKlxyXG4gICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIGFsbG93cyB0cmFuc2l0aW9uIGlmZiB0aGUgZ2l2ZW4gc3RlcCBpcyBuYXZpZ2FibGUgZnJvbSB0aGUgbmF2aWdhdGlvbiBiYXIgKHNlZSBgaXNOYXZpZ2FibGVgKS5cclxuICAgKiBIb3dldmVyLCBpbiBzb21lIG5hdmlnYXRpb24gbW9kZXMgYGNhblRyYW5zaXRpb25Ub1N0ZXBgIGNhbiBiZSBtb3JlIHJlbGF4ZWQgdG8gYWxsb3cgbmF2aWdhdGlvbiB0byBjZXJ0YWluIHN0ZXBzXHJcbiAgICogYnkgcHJldmlvdXMvbmV4dCBidXR0b25zLCBidXQgbm90IHVzaW5nIHRoZSBuYXZpZ2F0aW9uIGJhci5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB3aXphcmQgVGhlIHdpemFyZCBjb21wb25lbnQgdG8gb3BlcmF0ZSBvblxyXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGVzdGluYXRpb24gc3RlcFxyXG4gICAqIEByZXR1cm5zIGB0cnVlYCwgaWYgdGhlIGRlc3RpbmF0aW9uIHN0ZXAgY2FuIGJlIHRyYW5zaXRpb25lZCB0byBhbmQgYGZhbHNlYCBvdGhlcndpc2VcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgY2FuVHJhbnNpdGlvblRvU3RlcCh3aXphcmQ6IFdpemFyZENvbXBvbmVudCwgZGVzdGluYXRpb25JbmRleDogbnVtYmVyKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5pc05hdmlnYWJsZSh3aXphcmQsIGRlc3RpbmF0aW9uSW5kZXgpO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogVHJpZXMgdG8gdHJhbnNpdGlvbiB0byB0aGUgd2l6YXJkIHN0ZXAsIGFzIGRlbm90ZWQgYnkgdGhlIGdpdmVuIGRlc3RpbmF0aW9uIGluZGV4LlxyXG4gICAqXHJcbiAgICogV2hlbiBlbnRlcmluZyB0aGUgZGVzdGluYXRpb24gc3RlcCwgdGhlIGZvbGxvd2luZyBhY3Rpb25zIGFyZSBkb25lOlxyXG4gICAqIC0gdGhlIG9sZCBjdXJyZW50IHN0ZXAgaXMgc2V0IGFzIGNvbXBsZXRlZFxyXG4gICAqIC0gdGhlIG9sZCBjdXJyZW50IHN0ZXAgaXMgc2V0IGFzIHVuc2VsZWN0ZWRcclxuICAgKiAtIHRoZSBvbGQgY3VycmVudCBzdGVwIGlzIGV4aXRlZFxyXG4gICAqIC0gdGhlIGRlc3RpbmF0aW9uIHN0ZXAgaXMgc2V0IGFzIHNlbGVjdGVkXHJcbiAgICogLSB0aGUgZGVzdGluYXRpb24gc3RlcCBpcyBlbnRlcmVkXHJcbiAgICpcclxuICAgKiBXaGVuIHRoZSBkZXN0aW5hdGlvbiBzdGVwIGNvdWxkbid0IGJlIGVudGVyZWQsIHRoZSBmb2xsb3dpbmcgYWN0aW9ucyBhcmUgZG9uZTpcclxuICAgKiAtIHRoZSBjdXJyZW50IHN0ZXAgaXMgZXhpdGVkIGFuZCBlbnRlcmVkIGluIHRoZSBkaXJlY3Rpb24gYE1vdmluZ0RpcmVjdGlvbi5TdGF5YFxyXG4gICAqXHJcbiAgICogQHBhcmFtIHdpemFyZCBUaGUgd2l6YXJkIGNvbXBvbmVudCB0byBvcGVyYXRlIG9uXHJcbiAgICogQHBhcmFtIGRlc3RpbmF0aW9uSW5kZXggVGhlIGluZGV4IG9mIHRoZSBkZXN0aW5hdGlvbiB3aXphcmQgc3RlcCwgd2hpY2ggc2hvdWxkIGJlIGVudGVyZWRcclxuICAgKiBAcGFyYW0gcHJlRmluYWxpemUgQW4gZXZlbnQgZW1pdHRlciwgdG8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgc3RlcCBoYXMgYmVlbiB0cmFuc2l0aW9uZWRcclxuICAgKiBAcGFyYW0gcG9zdEZpbmFsaXplIEFuIGV2ZW50IGVtaXR0ZXIsIHRvIGJlIGNhbGxlZCBhZnRlciB0aGUgc3RlcCBoYXMgYmVlbiB0cmFuc2l0aW9uZWRcclxuICAgKi9cclxuICBwdWJsaWMgZ29Ub1N0ZXAoXHJcbiAgICB3aXphcmQ6IFdpemFyZENvbXBvbmVudCxcclxuICAgIGRlc3RpbmF0aW9uSW5kZXg6IG51bWJlcixcclxuICAgIHByZUZpbmFsaXplPzogRXZlbnRFbWl0dGVyPHZvaWQ+LFxyXG4gICAgcG9zdEZpbmFsaXplPzogRXZlbnRFbWl0dGVyPHZvaWQ+KTogdm9pZCB7XHJcblxyXG4gICAgdGhpcy5jYW5Hb1RvU3RlcCh3aXphcmQsIGRlc3RpbmF0aW9uSW5kZXgpLnRoZW4obmF2aWdhdGlvbkFsbG93ZWQgPT4ge1xyXG4gICAgICBpZiAobmF2aWdhdGlvbkFsbG93ZWQpIHtcclxuICAgICAgICAvLyB0aGUgY3VycmVudCBzdGVwIGNhbiBiZSBleGl0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvblxyXG4gICAgICAgIGNvbnN0IG1vdmluZ0RpcmVjdGlvbjogTW92aW5nRGlyZWN0aW9uID0gd2l6YXJkLmdldE1vdmluZ0RpcmVjdGlvbihkZXN0aW5hdGlvbkluZGV4KTtcclxuXHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXHJcbiAgICAgICAgaWYgKHByZUZpbmFsaXplKSB7XHJcbiAgICAgICAgICBwcmVGaW5hbGl6ZS5lbWl0KCk7XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLyBsZWF2ZSBjdXJyZW50IHN0ZXBcclxuICAgICAgICB3aXphcmQuY3VycmVudFN0ZXAuY29tcGxldGVkID0gdHJ1ZTtcclxuICAgICAgICB3aXphcmQuY3VycmVudFN0ZXAuZXhpdChtb3ZpbmdEaXJlY3Rpb24pO1xyXG4gICAgICAgIHdpemFyZC5jdXJyZW50U3RlcC5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICAgICAgd2l6YXJkLmN1cnJlbnRTdGVwLnNlbGVjdGVkID0gZmFsc2U7XHJcblxyXG4gICAgICAgIHRoaXMudHJhbnNpdGlvbih3aXphcmQsIGRlc3RpbmF0aW9uSW5kZXgpO1xyXG5cclxuICAgICAgICAvLyByZW1lbWJlciBpZiB0aGUgbmV4dCBzdGVwIGlzIGFscmVhZHkgY29tcGxldGVkIGJlZm9yZSBlbnRlcmluZyBpdCB0byBwcm9wZXJseSBzZXQgYGVkaXRpbmdgIGZsYWdcclxuICAgICAgICBjb25zdCB3YXNDb21wbGV0ZWQgPSB3aXphcmQuY29tcGxldGVkIHx8IHdpemFyZC5jdXJyZW50U3RlcC5jb21wbGV0ZWQ7XHJcblxyXG4gICAgICAgIC8vIGdvIHRvIG5leHQgc3RlcFxyXG4gICAgICAgIHdpemFyZC5jdXJyZW50U3RlcC5lbnRlcihtb3ZpbmdEaXJlY3Rpb24pO1xyXG4gICAgICAgIHdpemFyZC5jdXJyZW50U3RlcC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgaWYgKHdhc0NvbXBsZXRlZCkge1xyXG4gICAgICAgICAgd2l6YXJkLmN1cnJlbnRTdGVwLmVkaXRpbmcgPSB0cnVlO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXHJcbiAgICAgICAgaWYgKHBvc3RGaW5hbGl6ZSkge1xyXG4gICAgICAgICAgcG9zdEZpbmFsaXplLmVtaXQoKTtcclxuICAgICAgICB9XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgc3RlcCBjYW4ndCBiZSBsZWZ0LCByZWVudGVyIHRoZSBjdXJyZW50IHN0ZXBcclxuICAgICAgICB3aXphcmQuY3VycmVudFN0ZXAuZXhpdChNb3ZpbmdEaXJlY3Rpb24uU3RheSk7XHJcbiAgICAgICAgd2l6YXJkLmN1cnJlbnRTdGVwLmVudGVyKE1vdmluZ0RpcmVjdGlvbi5TdGF5KTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBUcmFuc2l0aW9ucyB0aGUgd2l6YXJkIHRvIHRoZSBnaXZlbiBzdGVwIGluZGV4LlxyXG4gICAqXHJcbiAgICogQ2FuIHBlcmZvcm0gYWRkaXRpb25hbCBhY3Rpb25zIGluIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBtb2RlIGltcGxlbWVudGF0aW9ucy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB3aXphcmQgVGhlIHdpemFyZCBjb21wb25lbnQgdG8gb3BlcmF0ZSBvblxyXG4gICAqIEBwYXJhbSBkZXN0aW5hdGlvbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGVzdGluYXRpb24gd2l6YXJkIHN0ZXBcclxuICAgKi9cclxuICBwcm90ZWN0ZWQgdHJhbnNpdGlvbih3aXphcmQ6IFdpemFyZENvbXBvbmVudCwgZGVzdGluYXRpb25JbmRleDogbnVtYmVyKTogdm9pZCB7XHJcbiAgICB3aXphcmQuY3VycmVudFN0ZXBJbmRleCA9IGRlc3RpbmF0aW9uSW5kZXg7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAaW5oZXJpdERvY1xyXG4gICAqL1xyXG4gIHB1YmxpYyBhYnN0cmFjdCBpc05hdmlnYWJsZShXaXphcmRDb21wb25lbnQ6IFdpemFyZENvbXBvbmVudCwgZGVzdGluYXRpb25JbmRleDogbnVtYmVyKTogYm9vbGVhbjtcclxuXHJcbiAgLyoqXHJcbiAgICogUmVzZXRzIHRoZSBzdGF0ZSBvZiB0aGlzIHdpemFyZC5cclxuICAgKlxyXG4gICAqIEEgcmVzZXQgdHJhbnNpdGlvbnMgdGhlIHdpemFyZCBhdXRvbWF0aWNhbGx5IHRvIHRoZSBmaXJzdCBzdGVwIGFuZCBzZXRzIGFsbCBzdGVwcyBhcyBpbmNvbXBsZXRlLlxyXG4gICAqIEluIGFkZGl0aW9uIHRoZSB3aG9sZSB3aXphcmQgaXMgc2V0IGFzIGluY29tcGxldGUuXHJcbiAgICpcclxuICAgKiBAcGFyYW0gd2l6YXJkIFRoZSB3aXphcmQgY29tcG9uZW50IHRvIG9wZXJhdGUgb25cclxuICAgKi9cclxuICBwdWJsaWMgcmVzZXQod2l6YXJkOiBXaXphcmRDb21wb25lbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuZW5zdXJlQ2FuUmVzZXQod2l6YXJkKTtcclxuXHJcbiAgICAvLyByZXNldCB0aGUgc3RlcCBpbnRlcm5hbCBzdGF0ZVxyXG4gICAgd2l6YXJkLndpemFyZFN0ZXBzLmZvckVhY2goc3RlcCA9PiB7XHJcbiAgICAgIHN0ZXAuY29tcGxldGVkID0gc3RlcC5pbml0aWFsbHlDb21wbGV0ZWQ7XHJcbiAgICAgIHN0ZXAuc2VsZWN0ZWQgPSBmYWxzZTtcclxuICAgICAgc3RlcC5lZGl0aW5nID0gZmFsc2U7XHJcbiAgICB9KTtcclxuXHJcbiAgICAvLyBzZXQgdGhlIGZpcnN0IHN0ZXAgYXMgdGhlIGN1cnJlbnQgc3RlcFxyXG4gICAgd2l6YXJkLmN1cnJlbnRTdGVwSW5kZXggPSB3aXphcmQuZGVmYXVsdFN0ZXBJbmRleDtcclxuICAgIHdpemFyZC5jdXJyZW50U3RlcC5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICB3aXphcmQuY3VycmVudFN0ZXAuZW50ZXIoTW92aW5nRGlyZWN0aW9uLkZvcndhcmRzKTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIENoZWNrcyBpZiB3aXphcmQgY29uZmlndXJhdGlvbiBhbGxvd3MgdG8gcGVyZm9ybSByZXNldC5cclxuICAgKlxyXG4gICAqIEEgY2hlY2sgZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnkgdGhyb3dpbmcgYW4gYEVycm9yYCB3aXRoIHRoZSBtZXNzYWdlIGRpc2NyaWJpbmcgdGhlIGRpc2NvdmVyZWQgbWlzY29uZmlndXJhdGlvbiBpc3N1ZS5cclxuICAgKlxyXG4gICAqIENhbiBpbmNsdWRlIGFkZGl0aW9uYWwgY2hlY2tzIGluIHBhcnRpY3VsYXIgbmF2aWdhdGlvbiBtb2RlIGltcGxlbWVudGF0aW9ucy5cclxuICAgKlxyXG4gICAqIEBwYXJhbSB3aXphcmQgVGhlIHdpemFyZCBjb21wb25lbnQgdG8gb3BlcmF0ZSBvblxyXG4gICAqIEB0aHJvd3MgQW4gYEVycm9yYCBpcyB0aHJvd24sIGlmIGEgbWljY29uZmlndXJhdGlvbiBpc3N1ZSBpcyBkaXNjb3ZlcmVkLlxyXG4gICAqL1xyXG4gIHByb3RlY3RlZCBlbnN1cmVDYW5SZXNldCh3aXphcmQ6IFdpemFyZENvbXBvbmVudCk6IHZvaWQge1xyXG4gICAgLy8gdGhlIHdpemFyZCBkb2Vzbid0IGNvbnRhaW4gYSBzdGVwIHdpdGggdGhlIGRlZmF1bHQgc3RlcCBpbmRleFxyXG4gICAgaWYgKCF3aXphcmQuaGFzU3RlcCh3aXphcmQuZGVmYXVsdFN0ZXBJbmRleCkpIHtcclxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgd2l6YXJkIGRvZXNuJ3QgY29udGFpbiBhIHN0ZXAgd2l0aCBpbmRleCAke3dpemFyZC5kZWZhdWx0U3RlcEluZGV4fWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=