{"version":3,"sources":["node_modules/moment/moment.js","node_modules/deep-diff/index.js","node_modules/jsoneditor/dist/jsoneditor.min.js","node_modules/highcharts/highcharts.js","node_modules/lodash/lodash.js","node_modules/file-saver/dist/FileSaver.min.js","node_modules/highcharts/highcharts-more.js","node_modules/@angular/core/fesm2022/primitives/signals.mjs","node_modules/rxjs/dist/esm/internal/util/isFunction.js","node_modules/rxjs/dist/esm/internal/util/createErrorClass.js","node_modules/rxjs/dist/esm/internal/util/UnsubscriptionError.js","node_modules/rxjs/dist/esm/internal/util/arrRemove.js","node_modules/rxjs/dist/esm/internal/Subscription.js","node_modules/rxjs/dist/esm/internal/config.js","node_modules/rxjs/dist/esm/internal/scheduler/timeoutProvider.js","node_modules/rxjs/dist/esm/internal/util/reportUnhandledError.js","node_modules/rxjs/dist/esm/internal/util/noop.js","node_modules/rxjs/dist/esm/internal/NotificationFactories.js","node_modules/rxjs/dist/esm/internal/util/errorContext.js","node_modules/rxjs/dist/esm/internal/Subscriber.js","node_modules/rxjs/dist/esm/internal/symbol/observable.js","node_modules/rxjs/dist/esm/internal/util/identity.js","node_modules/rxjs/dist/esm/internal/util/pipe.js","node_modules/rxjs/dist/esm/internal/Observable.js","node_modules/rxjs/dist/esm/internal/util/lift.js","node_modules/rxjs/dist/esm/internal/operators/OperatorSubscriber.js","node_modules/rxjs/dist/esm/internal/operators/refCount.js","node_modules/rxjs/dist/esm/internal/observable/ConnectableObservable.js","node_modules/rxjs/dist/esm/internal/scheduler/animationFrameProvider.js","node_modules/rxjs/dist/esm/internal/util/ObjectUnsubscribedError.js","node_modules/rxjs/dist/esm/internal/Subject.js","node_modules/rxjs/dist/esm/internal/BehaviorSubject.js","node_modules/rxjs/dist/esm/internal/scheduler/dateTimestampProvider.js","node_modules/rxjs/dist/esm/internal/ReplaySubject.js","node_modules/rxjs/dist/esm/internal/scheduler/Action.js","node_modules/rxjs/dist/esm/internal/scheduler/intervalProvider.js","node_modules/rxjs/dist/esm/internal/scheduler/AsyncAction.js","node_modules/rxjs/dist/esm/internal/Scheduler.js","node_modules/rxjs/dist/esm/internal/scheduler/AsyncScheduler.js","node_modules/rxjs/dist/esm/internal/scheduler/async.js","node_modules/rxjs/dist/esm/internal/scheduler/QueueAction.js","node_modules/rxjs/dist/esm/internal/scheduler/QueueScheduler.js","node_modules/rxjs/dist/esm/internal/scheduler/queue.js","node_modules/rxjs/dist/esm/internal/scheduler/AnimationFrameAction.js","node_modules/rxjs/dist/esm/internal/scheduler/AnimationFrameScheduler.js","node_modules/rxjs/dist/esm/internal/scheduler/animationFrame.js","node_modules/rxjs/dist/esm/internal/observable/empty.js","node_modules/rxjs/dist/esm/internal/util/isScheduler.js","node_modules/rxjs/dist/esm/internal/util/args.js","node_modules/tslib/tslib.es6.mjs","node_modules/rxjs/dist/esm/internal/util/isArrayLike.js","node_modules/rxjs/dist/esm/internal/util/isPromise.js","node_modules/rxjs/dist/esm/internal/util/isInteropObservable.js","node_modules/rxjs/dist/esm/internal/util/isAsyncIterable.js","node_modules/rxjs/dist/esm/internal/util/throwUnobservableError.js","node_modules/rxjs/dist/esm/internal/symbol/iterator.js","node_modules/rxjs/dist/esm/internal/util/isIterable.js","node_modules/rxjs/dist/esm/internal/util/isReadableStreamLike.js","node_modules/rxjs/dist/esm/internal/observable/innerFrom.js","node_modules/rxjs/dist/esm/internal/util/executeSchedule.js","node_modules/rxjs/dist/esm/internal/operators/observeOn.js","node_modules/rxjs/dist/esm/internal/operators/subscribeOn.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduleObservable.js","node_modules/rxjs/dist/esm/internal/scheduled/schedulePromise.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduleArray.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduleIterable.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduleAsyncIterable.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduleReadableStreamLike.js","node_modules/rxjs/dist/esm/internal/scheduled/scheduled.js","node_modules/rxjs/dist/esm/internal/observable/from.js","node_modules/rxjs/dist/esm/internal/observable/of.js","node_modules/rxjs/dist/esm/internal/observable/throwError.js","node_modules/rxjs/dist/esm/internal/util/isObservable.js","node_modules/rxjs/dist/esm/internal/util/EmptyError.js","node_modules/rxjs/dist/esm/internal/util/isDate.js","node_modules/rxjs/dist/esm/internal/operators/map.js","node_modules/rxjs/dist/esm/internal/util/mapOneOrManyArgs.js","node_modules/rxjs/dist/esm/internal/util/argsArgArrayOrObject.js","node_modules/rxjs/dist/esm/internal/util/createObject.js","node_modules/rxjs/dist/esm/internal/observable/combineLatest.js","node_modules/rxjs/dist/esm/internal/operators/mergeInternals.js","node_modules/rxjs/dist/esm/internal/operators/mergeMap.js","node_modules/rxjs/dist/esm/internal/operators/mergeAll.js","node_modules/rxjs/dist/esm/internal/operators/concatAll.js","node_modules/rxjs/dist/esm/internal/observable/concat.js","node_modules/rxjs/dist/esm/internal/observable/defer.js","node_modules/rxjs/dist/esm/internal/observable/forkJoin.js","node_modules/rxjs/dist/esm/internal/observable/fromEvent.js","node_modules/rxjs/dist/esm/internal/observable/timer.js","node_modules/rxjs/dist/esm/internal/observable/interval.js","node_modules/rxjs/dist/esm/internal/observable/merge.js","node_modules/rxjs/dist/esm/internal/observable/never.js","node_modules/rxjs/dist/esm/internal/util/argsOrArgArray.js","node_modules/rxjs/dist/esm/internal/operators/filter.js","node_modules/rxjs/dist/esm/internal/observable/zip.js","node_modules/rxjs/dist/esm/internal/operators/catchError.js","node_modules/rxjs/dist/esm/internal/operators/scanInternals.js","node_modules/rxjs/dist/esm/internal/operators/concatMap.js","node_modules/rxjs/dist/esm/internal/operators/debounceTime.js","node_modules/rxjs/dist/esm/internal/operators/defaultIfEmpty.js","node_modules/rxjs/dist/esm/internal/operators/take.js","node_modules/rxjs/dist/esm/internal/operators/ignoreElements.js","node_modules/rxjs/dist/esm/internal/operators/mapTo.js","node_modules/rxjs/dist/esm/internal/operators/delayWhen.js","node_modules/rxjs/dist/esm/internal/operators/delay.js","node_modules/rxjs/dist/esm/internal/operators/distinctUntilChanged.js","node_modules/rxjs/dist/esm/internal/operators/throwIfEmpty.js","node_modules/rxjs/dist/esm/internal/operators/exhaustMap.js","node_modules/rxjs/dist/esm/internal/operators/finalize.js","node_modules/rxjs/dist/esm/internal/operators/first.js","node_modules/rxjs/dist/esm/internal/operators/takeLast.js","node_modules/rxjs/dist/esm/internal/operators/last.js","node_modules/rxjs/dist/esm/internal/operators/flatMap.js","node_modules/rxjs/dist/esm/internal/operators/sample.js","node_modules/rxjs/dist/esm/internal/operators/sampleTime.js","node_modules/rxjs/dist/esm/internal/operators/scan.js","node_modules/rxjs/dist/esm/internal/operators/share.js","node_modules/rxjs/dist/esm/internal/operators/shareReplay.js","node_modules/rxjs/dist/esm/internal/operators/skipWhile.js","node_modules/rxjs/dist/esm/internal/operators/startWith.js","node_modules/rxjs/dist/esm/internal/operators/switchMap.js","node_modules/rxjs/dist/esm/internal/operators/takeUntil.js","node_modules/rxjs/dist/esm/internal/operators/takeWhile.js","node_modules/rxjs/dist/esm/internal/operators/tap.js","node_modules/rxjs/dist/esm/internal/operators/throttle.js","node_modules/rxjs/dist/esm/internal/operators/throttleTime.js","node_modules/rxjs/dist/esm/internal/operators/withLatestFrom.js","node_modules/@angular/core/fesm2022/core.mjs","node_modules/@angular/common/fesm2022/common.mjs","node_modules/@angular/common/fesm2022/http.mjs","node_modules/@angular/platform-browser/fesm2022/platform-browser.mjs","node_modules/@angular/animations/fesm2022/animations.mjs","node_modules/@angular/animations/fesm2022/browser.mjs","node_modules/@angular/platform-browser/fesm2022/animations.mjs","node_modules/@angular/forms/fesm2022/forms.mjs","node_modules/@wtw/crbra-platform-ui/services/objectExtender.ts","node_modules/@wtw/crbra-platform-ui/services/arrayExtender.ts","node_modules/@angular/router/fesm2022/router.mjs","node_modules/@wtw/crbra-platform-ui/models/strategyTab-mode-type.ts","node_modules/@wtw/crbra-platform-ui/models/upload-error-type.ts","node_modules/@wtw/crbra-platform-ui/models/nav-bar-mode.enum.ts","node_modules/@wtw/crbra-platform-ui/config.ts","node_modules/@wtw/crbra-platform-ui/services/user.service.ts","node_modules/@wtw/crbra-platform-ui/interfaces.ts","node_modules/@wtw/crbra-platform-ui/services/alert.service.ts","node_modules/@wtw/crbra-platform-ui/bootstrap/extension-points.ts","node_modules/@wtw/crbra-platform-ui/services/helpers/ResettableReplaySubject.ts","node_modules/@wtw/crbra-platform-ui/api/proxies.ts","node_modules/@wtw/crbra-platform-ui/services/url-helper.service.ts","node_modules/@wtw/crbra-platform-ui/api/binary-transfer-object.ts","node_modules/@wtw/crbra-platform-ui/api/generated/ProxyController.ts","node_modules/ngx-cookie-service/fesm2022/ngx-cookie-service.mjs","node_modules/@wtw/crbra-toolkit/src/pipes/short-number-format/short-number-format.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/short-number-divide-by-thousand/short-number-divide-by-thousand.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/short-blank-number-format/short-blank-number-format.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/currency-to-symbol/currency-to-symbol.pipe.ts","node_modules/@wtw/crbra-toolkit/src/directives/tab.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/tabs.directive.ts","node_modules/@wtw/crbra-toolkit/src/pipes/int-percent.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/number-percent.pipe.ts","node_modules/@wtw/crbra-toolkit/src/utils/base.component.ts","node_modules/@wtw/crbra-toolkit/src/config.ts","node_modules/@ngx-translate/core/fesm2020/ngx-translate-core.mjs","node_modules/@wtw/crbra-toolkit/src/directives/number-format.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/short-number-format.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/unique-item/uniqueItem.ts","node_modules/@wtw/crbra-toolkit/src/directives/unique-item/unique-item.directive.ts","node_modules/@wtw/crbra-toolkit/src/pipes/unique-id.pipe.ts","node_modules/@wtw/crbra-toolkit/src/utils/window-ref.service.ts","node_modules/ng-click-outside/lib_esmodule/click-outside.directive.js","node_modules/ng-click-outside/lib_esmodule/click-outside.module.js","node_modules/@wtw/crbra-toolkit/src/directives/expander.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/collapse-directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/click-input.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/slider.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/read-only-inputs.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/autocomplete.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/myclients.directive.ts","node_modules/@wtw/crbra-toolkit/src/validation/complex-validation.directive.ts","node_modules/@wtw/crbra-toolkit/src/validation/error-summary.service.ts","node_modules/@wtw/crbra-toolkit/src/validation/label-for.ts","node_modules/@wtw/crbra-toolkit/src/validation/validators.ts","node_modules/@wtw/crbra-toolkit/src/directives/trim-accessor.directive.ts","node_modules/@wtw/crbra-toolkit/src/components/loading/loading.component.ts","node_modules/@wtw/crbra-toolkit/src/directives/isolated-spinner-directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/loading-indicator.component.ts","node_modules/@wtw/crbra-toolkit/src/directives/scroll-to.directive.ts","node_modules/@wtw/crbra-toolkit/src/pipes/casing.pipes.ts","node_modules/@wtw/crbra-toolkit/src/directives/action-permission/action-permission.directive.ts","node_modules/@wtw/crbra-toolkit/src/pipes/localized/localized-date.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/localized/localized-number.pipe.ts","node_modules/@wtw/crbra-toolkit/src/pipes/localized/localized-number-percent.pipe.ts","node_modules/@wtw/crbra-toolkit/src/directives/sanitize-input.directive.ts","node_modules/@wtw/crbra-toolkit/src/directives/autocomplete_clientSearch.directive.ts","node_modules/@wtw/crbra-toolkit/src/toolkit.module.ts","node_modules/@wtw/crbra-toolkit/src/change-tracking/main.ts","node_modules/@wtw/crbra-platform-ui/api/ajaxproxy.ts","node_modules/@wtw/crbra-platform-ui/api/generated/ClientsController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/RunsController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/UserController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/CurrencyController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/ErrorController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/SettingsController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/AdminController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/LocalisationController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/StsCallbackController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/RunIntegrationController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/UserManagementController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/LanguageController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/UserSettingsController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/LiveEventController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/HomeController.ts","node_modules/@wtw/crbra-platform-ui/api/generated/AccessManagementController.ts","node_modules/@wtw/crbra-platform-ui/services/config.service.ts","node_modules/@wtw/crbra-platform-ui/services/site-header.service.ts","node_modules/@wtw/crbra-platform-ui/services/clients.service.ts","node_modules/@wtw/crbra-platform-ui/api/dtos.ts","node_modules/@wtw/crbra-platform-ui/api/generated/AdminModels.ts","node_modules/@wtw/crbra-platform-ui/api/generated/RunIntegrationModels.ts","node_modules/@wtw/crbra-platform-ui/api/generated/PollStatus.ts","node_modules/@wtw/crbra-platform-ui/api/generated/LiveEventSubscriptionStatus.ts","node_modules/@wtw/crbra-platform-ui/api/translation-proxy-loader.ts","node_modules/@wtw/crbra-platform-ui/api/index.ts","node_modules/@wtw/crbra-platform-ui/api/user-verification-proxy.ts","node_modules/@wtw/crbra-platform-ui/services/auth.service.ts","node_modules/@wtw/crbra-platform-ui/services/run.service.ts","node_modules/@wtw/crbra-platform-ui/services/navigation.service.ts","node_modules/@wtw/crbra-platform-ui/services/page-link.service.ts","node_modules/@wtw/crbra-platform-ui/services/title.service.ts","node_modules/ngx-bootstrap/utils/fesm2022/ngx-bootstrap-utils.mjs","node_modules/ngx-bootstrap/positioning/fesm2022/ngx-bootstrap-positioning.mjs","node_modules/ngx-bootstrap/component-loader/fesm2022/ngx-bootstrap-component-loader.mjs","node_modules/ngx-bootstrap/focus-trap/fesm2022/ngx-bootstrap-focus-trap.mjs","node_modules/ngx-bootstrap/modal/fesm2022/ngx-bootstrap-modal.mjs","node_modules/@wtw/crbra-platform-ui/components/standard-modal/standard-modal.component.ts","node_modules/@wtw/crbra-platform-ui/services/modal.service.ts","node_modules/@wtw/crbra-platform-ui/services/model-nav-bar.service.ts","node_modules/@wtw/crbra-platform-ui/services/navbar.service.ts","node_modules/@wtw/crbra-platform-ui/services/run-integration.service.ts","node_modules/@wtw/crbra-platform-ui/services/currency-validation.service.ts","node_modules/ngx-bootstrap/chronos/fesm2022/ngx-bootstrap-chronos.mjs","node_modules/@angular/common/locales/fr.mjs","node_modules/@angular/common/locales/pt.mjs","node_modules/@angular/common/locales/es.mjs","node_modules/@angular/common/locales/zh.mjs","node_modules/ngx-bootstrap/mini-ngrx/fesm2022/ngx-bootstrap-mini-ngrx.mjs","node_modules/ngx-bootstrap/timepicker/fesm2022/ngx-bootstrap-timepicker.mjs","node_modules/ngx-bootstrap/tooltip/fesm2022/ngx-bootstrap-tooltip.mjs","node_modules/ngx-bootstrap/datepicker/fesm2022/ngx-bootstrap-datepicker.mjs","node_modules/@wtw/crbra-platform-ui/services/cookies.service.ts","node_modules/@wtw/crbra-platform-ui/services/locale.service.ts","node_modules/@wtw/crbra-platform-ui/services/ref-translation.service.ts","node_modules/@wtw/crbra-platform-ui/services/one-trust-cookie.service.ts","node_modules/@wtw/crbra-platform-ui/services/accessManagement.service.ts","node_modules/@microsoft/dynamicproto-js/lib/dist/esm/dynamicproto-js.js","node_modules/@microsoft/applicationinsights-shims/dist-esm/Constants.js","node_modules/@microsoft/applicationinsights-shims/dist-esm/Helpers.js","node_modules/@microsoft/applicationinsights-shims/dist-esm/TsLibShims.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/InternalConstants.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/HelperFuncs.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK.Enums/EnumHelperFuncs.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/EnvUtils.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/DbgExtensionUtils.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/DiagnosticLogger.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/PerfManager.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/RandomHelper.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/DataCacheHelper.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/CookieMgr.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/EventHelpers.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/CoreUtils.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/W3cTraceParent.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/TelemetryHelpers.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/ProcessTelemetryContext.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/ChannelController.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/UnloadHandlerContainer.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/BaseTelemetryPlugin.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/TelemetryInitializerPlugin.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/BaseCore.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/NotificationManager.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/AppInsightsCore.js","node_modules/@microsoft/applicationinsights-core-js/dist-esm/JavaScriptSDK/InstrumentHooks.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Constants.js","node_modules/@microsoft/applicationinsights-common/dist-esm/DomHelperFuncs.js","node_modules/@microsoft/applicationinsights-common/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-common/dist-esm/HelperFuncs.js","node_modules/@microsoft/applicationinsights-common/dist-esm/RequestResponseHeaders.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Enums.js","node_modules/@microsoft/applicationinsights-common/dist-esm/StorageHelperFuncs.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Common/DataSanitizer.js","node_modules/@microsoft/applicationinsights-common/dist-esm/UrlHelperFuncs.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Util.js","node_modules/@microsoft/applicationinsights-common/dist-esm/ConnectionStringParser.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Common/Envelope.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Event.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Exception.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Common/DataPoint.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Metric.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/PageView.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/RemoteDependencyData.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Trace.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/PageViewPerformance.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Telemetry/Common/Data.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Interfaces/Contracts/ContextTagKeys.js","node_modules/@microsoft/applicationinsights-common/dist-esm/TelemetryItemCreator.js","node_modules/@microsoft/applicationinsights-common/dist-esm/Interfaces/PartAExtensions.js","node_modules/@microsoft/applicationinsights-common/dist-esm/applicationinsights-common.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/JavaScriptSDK/Telemetry/PageViewManager.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/JavaScriptSDK/Telemetry/PageViewPerformanceManager.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/JavaScriptSDK/Telemetry/PageVisitTimeManager.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/JavaScriptSDK/Timing.js","node_modules/@microsoft/applicationinsights-analytics-js/dist-esm/JavaScriptSDK/AnalyticsPlugin.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/InternalConstants.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/EnvelopeCreator.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/Offline.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/SendBuffer.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/Serializer.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/TelemetryProcessors/SamplingScoreGenerators/HashCodeScoreGenerator.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/TelemetryProcessors/SamplingScoreGenerators/SamplingScoreGenerator.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/TelemetryProcessors/Sample.js","node_modules/@microsoft/applicationinsights-channel-js/dist-esm/Sender.js","node_modules/@microsoft/applicationinsights-dependencies-js/dist-esm/InternalConstants.js","node_modules/@microsoft/applicationinsights-dependencies-js/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-dependencies-js/dist-esm/ajaxRecord.js","node_modules/@microsoft/applicationinsights-dependencies-js/dist-esm/ajax.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/Application.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/Device.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/Internal.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/Location.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/Session.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/TelemetryTrace.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/Context/User.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/TelemetryContext.js","node_modules/@microsoft/applicationinsights-properties-js/dist-esm/PropertiesPlugin.js","node_modules/@microsoft/applicationinsights-web/dist-esm/InternalConstants.js","node_modules/@microsoft/applicationinsights-web/dist-esm/__DynamicConstants.js","node_modules/@microsoft/applicationinsights-web/dist-esm/Initialization.js","node_modules/@wtw/crbra-platform-ui/services/application-insights.service.ts","node_modules/@wtw/crbra-platform-ui/services/index.ts","node_modules/@wtw/crbra-platform-ui/pages/account/no-sub-role/no-sub-role.component.ts","node_modules/@wtw/crbra-platform-ui/components/alert/alert.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/runs-page/runs-page.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/run-list/run-links/run-links.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/run-list/run-list.component.ts","node_modules/@wtw/crbra-platform-ui/components/date-filter/date-filter.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/create-run/create-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/edit-run/edit-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/final-run/final-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/prospect-run/prospect-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/share-run/share-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/unmark-final-run/unmark-final-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/run-navigation/run-navigation.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/run-list/run-item/run-item.component.ts","node_modules/@wtw/crbra-platform-ui/components/progress-indicator/progress-indicator.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/run-list/run-item-detail/run-item-detail.component.ts","node_modules/@wtw/crbra-platform-ui/components/currency/select-currency/select-currency.component.ts","node_modules/@wtw/crbra-platform-ui/pages/account/no-role.component.ts","node_modules/@wtw/crbra-platform-ui/pages/account/has-roles.guard.ts","node_modules/@wtw/crbra-platform-ui/pages/account/is-admin.guard.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/active-run/active-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/active-run/jump-guard.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/active-run/progression-guard.ts","node_modules/@wtw/crbra-platform-ui/pages/runs/navigation-loading/loading-step.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/admin-navbar/admin-navbar.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/admin-host.component.ts","node_modules/@wtw/crbra-platform-ui/components/pagination/pagination.component.ts","node_modules/ang-jsoneditor/fesm2022/ang-jsoneditor.mjs","node_modules/@wtw/crbra-platform-ui/pages/admin/localisation/localisation.component.ts","node_modules/@wtw/crbra-platform-ui/pages/not-found.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/ref-file/file-upload-base.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/ref-file/reupload.popup.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/ref-file/static-file-upload.component.ts","node_modules/@wtw/crbra-platform-ui/pages/home/alert/alert.component.ts","node_modules/@wtw/crbra-platform-ui/pages/home/home.component.ts","node_modules/@wtw/crbra-platform-ui/pages/run-title/run-title.component.ts","node_modules/@wtw/crbra-platform-ui/pages/client-dashboard/client-dashboard.component.ts","node_modules/@wtw/crbra-platform-ui/pages/client-dashboard/client-share-run/client-share-run.component.ts","node_modules/@wtw/crbra-platform-ui/pages/account/is-client.guard.ts","node_modules/@wtw/crbra-platform-ui/pages/client-dashboard/client-run-item-detail/client-run-item-detail.component.ts","node_modules/@wtw/crbra-platform-ui/pages/client-dashboard/client-run-links/client-run-links.component.ts","node_modules/@wtw/crbra-platform-ui/pages/account/restrict-client-role.guard.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/access-management/access-management.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/language/language.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/user-settings/user-settings.component.ts","node_modules/@wtw/crbra-platform-ui/pages/subscription-mapping-notfound/subscription-mapping-notfound.component.ts","node_modules/@wtw/crbra-platform-ui/pages/capiq-search/capiq-search.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/createAccessManagementSubRole/createAccessManagementSubRole.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/createAccessManagementFeature/createAccessManagementFeature.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/feature-mapping/feature-mapping.component.ts","node_modules/@wtw/crbra-platform-ui/services/shared.service.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/createAccessManagementUser/createAccessManagementUser.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/users/users.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/importAccessManagementUser/importAccessManagementUser.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/userhistory/userhistory.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/rolehistory/rolehistory.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/admin-history/admin-history.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/sub-roles/sub-roles.component.ts","node_modules/@wtw/crbra-platform-ui/pages/admin/security-scorecard/SecurityScorecardComponent.component.ts","node_modules/@wtw/crbra-platform-ui/bootstrap/routes.ts","node_modules/@wtw/crbra-platform-ui/bootstrap/initialization.service.ts","node_modules/@wtw/crbra-platform-ui/pages/header/timeout.popup.component.ts","node_modules/@wtw/crbra-platform-ui/components/currency/currency.component.ts","node_modules/@wtw/crbra-platform-ui/components/language/select-language.component.ts","node_modules/@wtw/crbra-platform-ui/pages/navbar/navbar-base.component.ts","node_modules/@wtw/crbra-platform-ui/pages/navbar/horizontal/horizontal-navbar.component.ts","node_modules/@wtw/crbra-platform-ui/pages/header/site-header.component.ts","node_modules/@wtw/crbra-platform-ui/pages/footer/site-footer.component.ts","node_modules/@wtw/crbra-platform-ui/pages/navbar/vertical/vertical-navbar.component.ts","node_modules/@wtw/crbra-platform-ui/pages/platform-root.component.ts","node_modules/@wtw/crbra-platform-ui/components/edit-page-indicator/edit-page-indicator.component.ts","node_modules/@wtw/crbra-platform-ui/components/navigation-chevron.directive.ts","node_modules/ng2-file-upload/fesm2022/ng2-file-upload.mjs","node_modules/@wtw/crbra-platform-ui/components/pdf-link.directive.ts","node_modules/@wtw/crbra-platform-ui/components/yes-no.pipe.ts","node_modules/@wtw/crbra-platform-ui/components/download-results/download-results.component.ts","node_modules/@wtw/crbra-platform-ui/components/upload-file/upload-file.component.ts","node_modules/@wtw/crbra-platform-ui/components/run-integration/select-run-integration-strategy/select-run-integration-strategy.component.ts","node_modules/@wtw/crbra-platform-ui/components/run-integration/select-run-integration.component.ts","node_modules/@wtw/crbra-platform-ui/components/checkbox-toggle/checkbox-toggle-component.ts","node_modules/@wtw/crbra-platform-ui/components/plus-minus/plus-minus.component.ts","node_modules/@wtw/crbra-platform-ui/components/strategy-container/strategy-container.component.ts","node_modules/@wtw/crbra-platform-ui/components/platform-loading/platform-loading-indicator.component.ts","node_modules/@wtw/crbra-platform-ui/components/index.ts","node_modules/ngx-bootstrap/collapse/fesm2022/ngx-bootstrap-collapse.mjs","node_modules/@wtw/crbra-platform-ui/bootstrap/platform.module.ts","node_modules/highcharts-angular/fesm2022/highcharts-angular.mjs","src/app/config.ts","src/app/pages/modeling-inputs/client-data/add-data/client-data-type.enum.ts","src/app/shared/helpers/form-helper.service.ts","src/app/app-constants.ts","src/app/pages/modeling-inputs/client-data/add-data/exposure-modal/exposure-modal.component.ts","src/app/pages/modeling-inputs/client-data/add-data/exposure-modal/exposure-modal.component.html","src/app/pages/modeling-inputs/client-data/add-data/exposure-modal/exposure-moda-form-validators.ts","src/app/shared/validators/custom-form-validators.ts","src/app/api/generated/OdsController.ts","src/app/pages/modeling-inputs/client-data/add-data/exposure-modal/edit-exposure-modal.service.ts","src/app/shared/components/notification-box/notification-box.component.ts","src/app/shared/components/notification-box/notification-box.component.html","src/app/services/data-manager-common.service.ts","src/app/shared/components/error-box/error-box.component.ts","src/app/shared/components/error-box/error-box.component.html","src/app/pages/modeling-inputs/data-input/components/lob-card/lob-card.component.ts","src/app/pages/modeling-inputs/data-input/components/lob-card/lob-card.component.html","src/app/pages/modeling-inputs/client-data/add-data/risk-profile-modal/risk-profile-modal.component.ts","src/app/pages/modeling-inputs/client-data/add-data/risk-profile-modal/risk-profile-modal.component.html","src/app/constants/hazard-group-group.constants.ts","src/app/pages/modeling-inputs/client-data/add-data/risk-profile-modal/edit-risk-profile-modal.service.ts","src/app/shared/pipes/filter-formarray-by-value.pipe.ts","src/app/constants/lines-of-business.contants.ts","src/app/services/add-data.service.ts","src/app/api/generated/ReferenceDataController.ts","src/app/services/reference-data.service.ts","src/app/pages/modeling-inputs/client-data/add-data/available-data/available-data.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/available-data.component.html","src/app/pages/modeling-inputs/client-data/add-data/upload-data/upload-data.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/upload-data/upload-data.component.html","src/app/pages/modeling-inputs/client-data/add-data/upload-data/upload-data-modal/upload-data-modal.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/upload-data/upload-data-modal/upload-data-modal.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/exposure-data-expander/exposure-data-geography/exposure-data-geography.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/exposure-data-expander/exposure-data-geography/exposure-data-geography.component.html","src/app/pipes/thousandSuff.pipe.ts","src/app/services/highcharts.service.ts","src/app/shared/components/basic-bar-chart/basic-bar-chart.component.ts","node_modules/@wtw/acl-shared-components/src/lib/basic-bar-chart/basic-bar-chart.component.html","src/app/shared/components/policy-details/policy-details.component.ts","node_modules/@wtw/acl-shared-components/src/lib/policy-details/policy-details.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/exposure-data-expander/exposure-data-expander.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/exposure-data-expander/exposure-data-expander.component.html","src/app/shared/components/basic-chart/basic-chart.component.ts","node_modules/@wtw/acl-shared-components/src/lib/bar-chart/bar-chart.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/loss-data-expander/loss-data-expander.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/loss-data-expander/loss-data-expander.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/sov-data-expander/sov-report-chart/sov-report-chart.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/sov-data-expander/sov-report-chart/sov-report-chart.component.html","src/app/shared/components/donut-chart/donut-chart.component.ts","node_modules/@wtw/acl-shared-components/src/lib/basic-chart/basic-chart.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/sov-data-expander/sov-data-expander.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/available-data/sov-data-expander/sov-data-expander.component.html","src/app/pages/modeling-inputs/client-data/add-data/data-to-include/data-to-include.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/data-to-include/data-to-include.component.html","src/app/pages/modeling-inputs/client-data/add-data/tooltip/tooltip.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/tooltip/tooltip.component.html","src/app/pages/modeling-inputs/client-data/add-data/add-data.component.ts","node_modules/@wtw/acl-shared-components/src/lib/add-data/add-data.component.html","src/app/shared/components/breadcrumb/breadcrumb.component.ts","src/app/shared/components/breadcrumb/breadcrumb.component.html","src/app/pages/modeling-inputs/client-data/client-data.component.ts","src/app/pages/modeling-inputs/client-data/client-data.component.html","src/app/shared/helpers/view-model-helper.service.ts","src/app/shared/components/lines-of-business-tabs/lines-of-business-tabs.component.ts","src/app/shared/components/lines-of-business-tabs/lines-of-business-tabs.component.html","src/app/pages/loss-analysis/loss-analysis.component.ts","src/app/pages/loss-analysis/loss-analysis.component.html","src/app/pages/modeling-inputs/client-details/client-details.component.ts","src/app/pages/modeling-inputs/client-details/client-details.component.html","src/app/pages/modeling-inputs/client-details/client-details-form.service.ts","src/app/pipes/number-formatter.pipe.ts","src/app/shared/components/field-error/field-error.component.ts","src/app/shared/components/field-error/field-error.component.html","src/app/pages/modeling-inputs/client-details/components/financials/financials.component.ts","src/app/pages/modeling-inputs/client-details/components/financials/financials.component.html","src/app/pages/modeling-inputs/client-details/components/lines-of-business/lines-of-business.component.ts","src/app/pages/modeling-inputs/client-details/components/lines-of-business/lines-of-business.component.html","src/app/shared/components/constituent-builder/constituent-builder.component.ts","src/app/shared/components/constituent-builder/constituent-builder.component.html","src/app/shared/components/lob-selector/lob-selector.component.ts","src/app/shared/components/lob-selector/lob-selector.component.html","src/app/utils/custom-validators.utils.ts","src/app/pages/modeling-inputs/data-input/components/projected-exposure/projected-exposure.component.ts","src/app/pages/modeling-inputs/data-input/components/projected-exposure/projected-exposure.component.html","src/app/pages/modeling-inputs/data-input/data-input.component.ts","src/app/pages/modeling-inputs/data-input/data-input.component.html","src/app/pages/modeling-inputs/modeling-inputs.component.ts","src/app/pages/modeling-inputs/modeling-inputs.component.html","src/app/pages/risk-quantification/risk-quantification.component.ts","src/app/pages/risk-quantification/risk-quantification.component.html","src/app/pages/risk-strategy-design/risk-strategy-design.component.ts","src/app/pages/risk-strategy-design/risk-strategy-design.component.html","src/app/shared/components/notification-toast/notification-toast.service.ts","src/app/shared/components/notification-toast/notification-toast.component.ts","src/app/shared/components/notification-toast/notification-toast.component.html","src/app/utils/guid.utils.ts","src/app/services/lines-of-business.service.ts","node_modules/ngx-filesaver/fesm2020/ngx-filesaver.mjs","src/app/services/report.service.ts","src/app/shared/components/flyout/flyout.component.ts","src/app/shared/components/flyout/flyout.component.html","src/app/constants/report.constants.ts","src/app/shared/components/report-config/report-config-form-validators.ts","src/app/shared/components/report-config/report-config.component.ts","src/app/shared/components/report-config/report-config.component.html","src/app/pages/risk-strategy-design/primary-strategy-design/primary-strategy-design.component.ts","src/app/pages/risk-strategy-design/primary-strategy-design/primary-strategy-design.component.html","src/app/pages/modeling-inputs/client-data/add-data/available-data/exposure-data-expander/hazard-groups-chart/hazard-groups-chart.component.ts","node_modules/ngx-toastr/fesm2020/ngx-toastr.mjs","src/app/shared/components/slide-bar/slide-bar.component.ts","src/app/shared/components/slide-bar/slide-bar.component.html","src/app/pages/modeling-inputs/lob-scenarios/components/scenario-card/scenario-card.component.ts","src/app/pages/modeling-inputs/lob-scenarios/components/scenario-card/scenario-card.component.html","src/app/shared/components/back-to-top/back-to-top.component.ts","src/app/shared/components/back-to-top/back-to-top.component.html","src/app/pages/modeling-inputs/lob-scenarios/lob-scenarios.component.ts","src/app/pages/modeling-inputs/lob-scenarios/lob-scenarios.component.html","src/app/pages/modeling-inputs/data-summary/data-summary.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary.component.html","src/app/pages/modeling-inputs/data-summary/data-summary-lob/data-summary-lob.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/data-summary-lob.component.html","src/app/pages/modeling-inputs/data-summary/data-summary-lob/exposure-summary/exposure-summary.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/exposure-summary/exposure-summary.component.html","src/app/pipes/number-precision.pipe.ts","src/app/shared/components/chart-container/chart-container.component.ts","src/app/shared/components/chart-container/chart-container.component.html","src/app/shared/components/kpis-container/kpis-container.component.ts","src/app/shared/components/kpis-container/kpis-container.component.html","src/app/pages/modeling-inputs/data-summary/data-summary-lob/loss-summary/loss-summary.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/loss-summary/loss-summary.component.html","src/app/services/tooltip.service.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/scenario-summary/scenario-summary.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/scenario-summary/scenario-summary.component.html","src/app/shared/components/box-plot/box-plot.component.ts","src/app/shared/components/box-plot/box-plot.component.html","src/app/pipes/short-num-for-any-qty.pipe.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/components/combined-scenarios/combined-scenarios.component.ts","src/app/pages/modeling-inputs/data-summary/data-summary-lob/components/combined-scenarios/combined-scenarios.component.html","src/app/pipes/dynamic.pipe.ts","src/app/pages/loss-analysis/components/compiled-table/compiled-table.component.ts","src/app/pages/loss-analysis/components/compiled-table/compiled-table.component.html","src/app/pages/loss-analysis/components/policy-year-selector/policy-year-selector.component.ts","src/app/pages/loss-analysis/components/policy-year-selector/policy-year-selector.component.html","src/app/pages/loss-analysis/loss-analysis-lob/loss-analysis-lob.component.ts","src/app/pages/loss-analysis/loss-analysis-lob/loss-analysis-lob.component.html","src/app/services/loss-analysis.service.ts","src/app/pages/loss-analysis/components/rate-selector/rate-selector.component.ts","src/app/pages/loss-analysis/components/rate-selector/rate-selector.component.html","src/app/pages/loss-analysis/components/loss-analysis-tab/loss-analysis-tab.component.ts","src/app/pages/loss-analysis/components/loss-analysis-tab/loss-analysis-tab.component.html","src/app/pages/loss-analysis/components/loss-analysis-tab/loss-analysis-tab.enum.ts","src/app/pages/loss-analysis/loss-analysis-lob/loss-analysis-column-defs.ts","src/app/pages/loss-analysis/components/reference-lines/reference-lines.component.ts","src/app/pages/loss-analysis/components/reference-lines/reference-lines.component.html","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-lob.component.ts","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-lob.component.html","src/app/pages/risk-strategy-design/components/edit-primary-option/edit-primary-option.component.ts","src/app/pages/risk-strategy-design/components/edit-primary-option/edit-primary-option.component.html","src/app/pages/risk-strategy-design/components/add-primary-layer/primary-layer-lob-form/primary-layer-lob-form.component.ts","src/app/pages/risk-strategy-design/components/add-primary-layer/primary-layer-lob-form/primary-layer-lob-form.component.html","src/app/pages/risk-strategy-design/components/add-primary-layer/add-primary-layer.component.ts","src/app/pages/risk-strategy-design/components/add-primary-layer/add-primary-layer.component.html","src/app/pages/risk-quantification/components/percentiles-table/percentiles-table.component.ts","src/app/pages/risk-quantification/components/percentiles-table/percentiles-table.component.html","src/app/constants/loss-stratification-view.constants.ts","src/app/api/generated/RiskQuantificationController.ts","src/app/pages/risk-quantification/components/stratification-table/stratification-table.component.ts","src/app/pages/risk-quantification/components/stratification-table/stratification-table.component.html","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-frequency/risk-quantification-frequency.component.ts","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-frequency/risk-quantification-frequency.component.html","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-severity/risk-quantification-severity.component.ts","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-severity/risk-quantification-severity.component.html","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-aggregate/risk-quantification-aggregate.component.ts","src/app/pages/risk-quantification/risk-quantification-lob/risk-quantification-aggregate/risk-quantification-aggregate.component.html","src/app/shared/helpers/layer-helper.service.ts","src/app/services/casualty-quantified-runs.service.ts","src/app/api/generated/RiskStrategyDesignController.ts","src/app/services/strategy-design.service.ts","src/app/pages/risk-strategy-design/components/primary-layer-key-summary/primary-layer-key-summary.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-key-summary/primary-layer-key-summary.component.html","src/app/pages/risk-strategy-design/components/primary-layer-modeling-results/primary-layer-modeling-results.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-modeling-results/primary-layer-modeling-results.component.html","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-expanded-view.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-expanded-view.component.html","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-statistics/primary-layer-statistics.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-statistics/primary-layer-statistics.component.html","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-ilf/primary-layer-ilf.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-ilf/primary-layer-ilf.component.html","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-historic-data/primary-layer-historic-data.component.ts","src/app/pages/risk-strategy-design/components/primary-layer-expanded-view/primary-layer-historic-data/primary-layer-historic-data.component.html","src/app/shared/components/option-header/option-header.component.ts","src/app/shared/components/option-header/option-header.component.html","src/app/pages/risk-strategy-design/risk-strategy-design-program/risk-strategy-design-program.component.ts","src/app/pages/risk-strategy-design/risk-strategy-design-program/risk-strategy-design-program.component.html","src/app/pages/excess-layers/components/strategy-selector/strategy-selector.component.ts","src/app/pages/excess-layers/components/strategy-selector/strategy-selector.component.html","src/app/services/excess-program.service.ts","src/app/pages/excess-layers/excess-layers.component.ts","src/app/pages/excess-layers/excess-layers.component.html","src/app/pages/excess-layers/components/primary-options-selector/primary-options-selector.component.ts","src/app/pages/excess-layers/components/primary-options-selector/primary-options-selector.component.html","src/app/pages/excess-layers/components/add-excess-layer/add-excess-layer.component.ts","src/app/pages/excess-layers/components/add-excess-layer/add-excess-layer.component.html","src/app/pages/excess-layers/excess-program/excess-program.component.ts","src/app/pages/excess-layers/excess-program/excess-program.component.html","src/app/pages/excess-layers/components/stack/stack.component.ts","src/app/pages/excess-layers/components/stack/stack.component.html","src/app/pages/excess-layers/components/layer-summary-adequacy/layer-summary-adequacy.component.ts","src/app/pages/excess-layers/components/layer-summary-adequacy/layer-summary-adequacy.component.html","src/app/pages/excess-layers/components/layer-summary-coverage/layer-summary-coverage.component.ts","src/app/pages/excess-layers/components/layer-summary-coverage/layer-summary-coverage.component.html","src/app/pages/excess-layers/components/layer-summary-schematic/layer-summary-schematic.component.ts","src/app/pages/excess-layers/components/layer-summary-schematic/layer-summary-schematic.component.html","src/app/pages/excess-layers/components/ccor-chart/ccor-chart.component.ts","src/app/pages/excess-layers/components/ccor-chart/ccor-chart.component.html","src/app/pipes/shortNumberFormatExtenderPipe.ts","src/app/pages/excess-layers/components/tcor-breakdown/tcor-breakdown.component.ts","src/app/pages/excess-layers/components/tcor-breakdown/tcor-breakdown.component.html","src/app/pages/excess-layers/components/tcor-financials/tcor-financials.component.ts","src/app/pages/excess-layers/components/tcor-financials/tcor-financials.component.html","src/app/pages/excess-layers/components/structure-analysis-breakdown/structure-analysis-breakdown.component.ts","src/app/pages/excess-layers/components/structure-analysis-breakdown/structure-analysis-breakdown.component.html","src/app/pages/excess-layers/components/structure-analysis-summary/structure-analysis-summary.component.ts","src/app/pages/excess-layers/components/structure-analysis-summary/structure-analysis-summary.component.html","src/app/pages/index.ts","src/app/services/routes-static-run.service.ts","src/app/routes.ts","src/app/shared/components/excess-option-header/excess-option-header.component.ts","src/app/shared/components/excess-option-header/excess-option-header.component.html","src/app/shared/index.ts","src/app/shared/helpers/url-helper.service.ts","src/app/services/casualty-quantified-nav-bar.service.ts","src/app/pipes/removeSpacesPipe.ts","src/app/pipes/SearchFilter.ts","src/app/pipes/index.ts","src/app/api/generated/index.ts","src/app/services/initialisation.service.ts","src/app/common.module.ts","src/app/app.module.ts","src/environments/environment.prod.ts","src/main.ts"],"sourcesContent":["//! moment.js\n//! version : 2.30.1\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\n\n;\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : typeof define === 'function' && define.amd ? define(factory) : global.moment = factory();\n})(this, function () {\n 'use strict';\n\n var hookCallback;\n function hooks() {\n return hookCallback.apply(null, arguments);\n }\n\n // This is done to register the method called with moment()\n // without creating circular dependencies.\n function setHookCallback(callback) {\n hookCallback = callback;\n }\n function isArray(input) {\n return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]';\n }\n function isObject(input) {\n // IE8 will treat undefined and null as object if it wasn't for\n // input != null\n return input != null && Object.prototype.toString.call(input) === '[object Object]';\n }\n function hasOwnProp(a, b) {\n return Object.prototype.hasOwnProperty.call(a, b);\n }\n function isObjectEmpty(obj) {\n if (Object.getOwnPropertyNames) {\n return Object.getOwnPropertyNames(obj).length === 0;\n } else {\n var k;\n for (k in obj) {\n if (hasOwnProp(obj, k)) {\n return false;\n }\n }\n return true;\n }\n }\n function isUndefined(input) {\n return input === void 0;\n }\n function isNumber(input) {\n return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]';\n }\n function isDate(input) {\n return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]';\n }\n function map(arr, fn) {\n var res = [],\n i,\n arrLen = arr.length;\n for (i = 0; i < arrLen; ++i) {\n res.push(fn(arr[i], i));\n }\n return res;\n }\n function extend(a, b) {\n for (var i in b) {\n if (hasOwnProp(b, i)) {\n a[i] = b[i];\n }\n }\n if (hasOwnProp(b, 'toString')) {\n a.toString = b.toString;\n }\n if (hasOwnProp(b, 'valueOf')) {\n a.valueOf = b.valueOf;\n }\n return a;\n }\n function createUTC(input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, true).utc();\n }\n function defaultParsingFlags() {\n // We need to deep clone this object.\n return {\n empty: false,\n unusedTokens: [],\n unusedInput: [],\n overflow: -2,\n charsLeftOver: 0,\n nullInput: false,\n invalidEra: null,\n invalidMonth: null,\n invalidFormat: false,\n userInvalidated: false,\n iso: false,\n parsedDateParts: [],\n era: null,\n meridiem: null,\n rfc2822: false,\n weekdayMismatch: false\n };\n }\n function getParsingFlags(m) {\n if (m._pf == null) {\n m._pf = defaultParsingFlags();\n }\n return m._pf;\n }\n var some;\n if (Array.prototype.some) {\n some = Array.prototype.some;\n } else {\n some = function (fun) {\n var t = Object(this),\n len = t.length >>> 0,\n i;\n for (i = 0; i < len; i++) {\n if (i in t && fun.call(this, t[i], i, t)) {\n return true;\n }\n }\n return false;\n };\n }\n function isValid(m) {\n var flags = null,\n parsedParts = false,\n isNowValid = m._d && !isNaN(m._d.getTime());\n if (isNowValid) {\n flags = getParsingFlags(m);\n parsedParts = some.call(flags.parsedDateParts, function (i) {\n return i != null;\n });\n isNowValid = flags.overflow < 0 && !flags.empty && !flags.invalidEra && !flags.invalidMonth && !flags.invalidWeekday && !flags.weekdayMismatch && !flags.nullInput && !flags.invalidFormat && !flags.userInvalidated && (!flags.meridiem || flags.meridiem && parsedParts);\n if (m._strict) {\n isNowValid = isNowValid && flags.charsLeftOver === 0 && flags.unusedTokens.length === 0 && flags.bigHour === undefined;\n }\n }\n if (Object.isFrozen == null || !Object.isFrozen(m)) {\n m._isValid = isNowValid;\n } else {\n return isNowValid;\n }\n return m._isValid;\n }\n function createInvalid(flags) {\n var m = createUTC(NaN);\n if (flags != null) {\n extend(getParsingFlags(m), flags);\n } else {\n getParsingFlags(m).userInvalidated = true;\n }\n return m;\n }\n\n // Plugins that add properties should also add the key here (null value),\n // so we can properly clone ourselves.\n var momentProperties = hooks.momentProperties = [],\n updateInProgress = false;\n function copyConfig(to, from) {\n var i,\n prop,\n val,\n momentPropertiesLen = momentProperties.length;\n if (!isUndefined(from._isAMomentObject)) {\n to._isAMomentObject = from._isAMomentObject;\n }\n if (!isUndefined(from._i)) {\n to._i = from._i;\n }\n if (!isUndefined(from._f)) {\n to._f = from._f;\n }\n if (!isUndefined(from._l)) {\n to._l = from._l;\n }\n if (!isUndefined(from._strict)) {\n to._strict = from._strict;\n }\n if (!isUndefined(from._tzm)) {\n to._tzm = from._tzm;\n }\n if (!isUndefined(from._isUTC)) {\n to._isUTC = from._isUTC;\n }\n if (!isUndefined(from._offset)) {\n to._offset = from._offset;\n }\n if (!isUndefined(from._pf)) {\n to._pf = getParsingFlags(from);\n }\n if (!isUndefined(from._locale)) {\n to._locale = from._locale;\n }\n if (momentPropertiesLen > 0) {\n for (i = 0; i < momentPropertiesLen; i++) {\n prop = momentProperties[i];\n val = from[prop];\n if (!isUndefined(val)) {\n to[prop] = val;\n }\n }\n }\n return to;\n }\n\n // Moment prototype object\n function Moment(config) {\n copyConfig(this, config);\n this._d = new Date(config._d != null ? config._d.getTime() : NaN);\n if (!this.isValid()) {\n this._d = new Date(NaN);\n }\n // Prevent infinite loop in case updateOffset creates new moment\n // objects.\n if (updateInProgress === false) {\n updateInProgress = true;\n hooks.updateOffset(this);\n updateInProgress = false;\n }\n }\n function isMoment(obj) {\n return obj instanceof Moment || obj != null && obj._isAMomentObject != null;\n }\n function warn(msg) {\n if (hooks.suppressDeprecationWarnings === false && typeof console !== 'undefined' && console.warn) {\n console.warn('Deprecation warning: ' + msg);\n }\n }\n function deprecate(msg, fn) {\n var firstTime = true;\n return extend(function () {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(null, msg);\n }\n if (firstTime) {\n var args = [],\n arg,\n i,\n key,\n argLen = arguments.length;\n for (i = 0; i < argLen; i++) {\n arg = '';\n if (typeof arguments[i] === 'object') {\n arg += '\\n[' + i + '] ';\n for (key in arguments[0]) {\n if (hasOwnProp(arguments[0], key)) {\n arg += key + ': ' + arguments[0][key] + ', ';\n }\n }\n arg = arg.slice(0, -2); // Remove trailing comma and space\n } else {\n arg = arguments[i];\n }\n args.push(arg);\n }\n warn(msg + '\\nArguments: ' + Array.prototype.slice.call(args).join('') + '\\n' + new Error().stack);\n firstTime = false;\n }\n return fn.apply(this, arguments);\n }, fn);\n }\n var deprecations = {};\n function deprecateSimple(name, msg) {\n if (hooks.deprecationHandler != null) {\n hooks.deprecationHandler(name, msg);\n }\n if (!deprecations[name]) {\n warn(msg);\n deprecations[name] = true;\n }\n }\n hooks.suppressDeprecationWarnings = false;\n hooks.deprecationHandler = null;\n function isFunction(input) {\n return typeof Function !== 'undefined' && input instanceof Function || Object.prototype.toString.call(input) === '[object Function]';\n }\n function set(config) {\n var prop, i;\n for (i in config) {\n if (hasOwnProp(config, i)) {\n prop = config[i];\n if (isFunction(prop)) {\n this[i] = prop;\n } else {\n this['_' + i] = prop;\n }\n }\n }\n this._config = config;\n // Lenient ordinal parsing accepts just a number in addition to\n // number + (possibly) stuff coming from _dayOfMonthOrdinalParse.\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + '|' + /\\d{1,2}/.source);\n }\n function mergeConfigs(parentConfig, childConfig) {\n var res = extend({}, parentConfig),\n prop;\n for (prop in childConfig) {\n if (hasOwnProp(childConfig, prop)) {\n if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) {\n res[prop] = {};\n extend(res[prop], parentConfig[prop]);\n extend(res[prop], childConfig[prop]);\n } else if (childConfig[prop] != null) {\n res[prop] = childConfig[prop];\n } else {\n delete res[prop];\n }\n }\n }\n for (prop in parentConfig) {\n if (hasOwnProp(parentConfig, prop) && !hasOwnProp(childConfig, prop) && isObject(parentConfig[prop])) {\n // make sure changes to properties don't modify parent config\n res[prop] = extend({}, res[prop]);\n }\n }\n return res;\n }\n function Locale(config) {\n if (config != null) {\n this.set(config);\n }\n }\n var keys;\n if (Object.keys) {\n keys = Object.keys;\n } else {\n keys = function (obj) {\n var i,\n res = [];\n for (i in obj) {\n if (hasOwnProp(obj, i)) {\n res.push(i);\n }\n }\n return res;\n };\n }\n var defaultCalendar = {\n sameDay: '[Today at] LT',\n nextDay: '[Tomorrow at] LT',\n nextWeek: 'dddd [at] LT',\n lastDay: '[Yesterday at] LT',\n lastWeek: '[Last] dddd [at] LT',\n sameElse: 'L'\n };\n function calendar(key, mom, now) {\n var output = this._calendar[key] || this._calendar['sameElse'];\n return isFunction(output) ? output.call(mom, now) : output;\n }\n function zeroFill(number, targetLength, forceSign) {\n var absNumber = '' + Math.abs(number),\n zerosToFill = targetLength - absNumber.length,\n sign = number >= 0;\n return (sign ? forceSign ? '+' : '' : '-') + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber;\n }\n var formattingTokens = /(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,\n localFormattingTokens = /(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,\n formatFunctions = {},\n formatTokenFunctions = {};\n\n // token: 'M'\n // padded: ['MM', 2]\n // ordinal: 'Mo'\n // callback: function () { this.month() + 1 }\n function addFormatToken(token, padded, ordinal, callback) {\n var func = callback;\n if (typeof callback === 'string') {\n func = function () {\n return this[callback]();\n };\n }\n if (token) {\n formatTokenFunctions[token] = func;\n }\n if (padded) {\n formatTokenFunctions[padded[0]] = function () {\n return zeroFill(func.apply(this, arguments), padded[1], padded[2]);\n };\n }\n if (ordinal) {\n formatTokenFunctions[ordinal] = function () {\n return this.localeData().ordinal(func.apply(this, arguments), token);\n };\n }\n }\n function removeFormattingTokens(input) {\n if (input.match(/\\[[\\s\\S]/)) {\n return input.replace(/^\\[|\\]$/g, '');\n }\n return input.replace(/\\\\/g, '');\n }\n function makeFormatFunction(format) {\n var array = format.match(formattingTokens),\n i,\n length;\n for (i = 0, length = array.length; i < length; i++) {\n if (formatTokenFunctions[array[i]]) {\n array[i] = formatTokenFunctions[array[i]];\n } else {\n array[i] = removeFormattingTokens(array[i]);\n }\n }\n return function (mom) {\n var output = '',\n i;\n for (i = 0; i < length; i++) {\n output += isFunction(array[i]) ? array[i].call(mom, format) : array[i];\n }\n return output;\n };\n }\n\n // format date using native date object\n function formatMoment(m, format) {\n if (!m.isValid()) {\n return m.localeData().invalidDate();\n }\n format = expandFormat(format, m.localeData());\n formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format);\n return formatFunctions[format](m);\n }\n function expandFormat(format, locale) {\n var i = 5;\n function replaceLongDateFormatTokens(input) {\n return locale.longDateFormat(input) || input;\n }\n localFormattingTokens.lastIndex = 0;\n while (i >= 0 && localFormattingTokens.test(format)) {\n format = format.replace(localFormattingTokens, replaceLongDateFormatTokens);\n localFormattingTokens.lastIndex = 0;\n i -= 1;\n }\n return format;\n }\n var defaultLongDateFormat = {\n LTS: 'h:mm:ss A',\n LT: 'h:mm A',\n L: 'MM/DD/YYYY',\n LL: 'MMMM D, YYYY',\n LLL: 'MMMM D, YYYY h:mm A',\n LLLL: 'dddd, MMMM D, YYYY h:mm A'\n };\n function longDateFormat(key) {\n var format = this._longDateFormat[key],\n formatUpper = this._longDateFormat[key.toUpperCase()];\n if (format || !formatUpper) {\n return format;\n }\n this._longDateFormat[key] = formatUpper.match(formattingTokens).map(function (tok) {\n if (tok === 'MMMM' || tok === 'MM' || tok === 'DD' || tok === 'dddd') {\n return tok.slice(1);\n }\n return tok;\n }).join('');\n return this._longDateFormat[key];\n }\n var defaultInvalidDate = 'Invalid date';\n function invalidDate() {\n return this._invalidDate;\n }\n var defaultOrdinal = '%d',\n defaultDayOfMonthOrdinalParse = /\\d{1,2}/;\n function ordinal(number) {\n return this._ordinal.replace('%d', number);\n }\n var defaultRelativeTime = {\n future: 'in %s',\n past: '%s ago',\n s: 'a few seconds',\n ss: '%d seconds',\n m: 'a minute',\n mm: '%d minutes',\n h: 'an hour',\n hh: '%d hours',\n d: 'a day',\n dd: '%d days',\n w: 'a week',\n ww: '%d weeks',\n M: 'a month',\n MM: '%d months',\n y: 'a year',\n yy: '%d years'\n };\n function relativeTime(number, withoutSuffix, string, isFuture) {\n var output = this._relativeTime[string];\n return isFunction(output) ? output(number, withoutSuffix, string, isFuture) : output.replace(/%d/i, number);\n }\n function pastFuture(diff, output) {\n var format = this._relativeTime[diff > 0 ? 'future' : 'past'];\n return isFunction(format) ? format(output) : format.replace(/%s/i, output);\n }\n var aliases = {\n D: 'date',\n dates: 'date',\n date: 'date',\n d: 'day',\n days: 'day',\n day: 'day',\n e: 'weekday',\n weekdays: 'weekday',\n weekday: 'weekday',\n E: 'isoWeekday',\n isoweekdays: 'isoWeekday',\n isoweekday: 'isoWeekday',\n DDD: 'dayOfYear',\n dayofyears: 'dayOfYear',\n dayofyear: 'dayOfYear',\n h: 'hour',\n hours: 'hour',\n hour: 'hour',\n ms: 'millisecond',\n milliseconds: 'millisecond',\n millisecond: 'millisecond',\n m: 'minute',\n minutes: 'minute',\n minute: 'minute',\n M: 'month',\n months: 'month',\n month: 'month',\n Q: 'quarter',\n quarters: 'quarter',\n quarter: 'quarter',\n s: 'second',\n seconds: 'second',\n second: 'second',\n gg: 'weekYear',\n weekyears: 'weekYear',\n weekyear: 'weekYear',\n GG: 'isoWeekYear',\n isoweekyears: 'isoWeekYear',\n isoweekyear: 'isoWeekYear',\n w: 'week',\n weeks: 'week',\n week: 'week',\n W: 'isoWeek',\n isoweeks: 'isoWeek',\n isoweek: 'isoWeek',\n y: 'year',\n years: 'year',\n year: 'year'\n };\n function normalizeUnits(units) {\n return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined;\n }\n function normalizeObjectUnits(inputObject) {\n var normalizedInput = {},\n normalizedProp,\n prop;\n for (prop in inputObject) {\n if (hasOwnProp(inputObject, prop)) {\n normalizedProp = normalizeUnits(prop);\n if (normalizedProp) {\n normalizedInput[normalizedProp] = inputObject[prop];\n }\n }\n }\n return normalizedInput;\n }\n var priorities = {\n date: 9,\n day: 11,\n weekday: 11,\n isoWeekday: 11,\n dayOfYear: 4,\n hour: 13,\n millisecond: 16,\n minute: 14,\n month: 8,\n quarter: 7,\n second: 15,\n weekYear: 1,\n isoWeekYear: 1,\n week: 5,\n isoWeek: 5,\n year: 1\n };\n function getPrioritizedUnits(unitsObj) {\n var units = [],\n u;\n for (u in unitsObj) {\n if (hasOwnProp(unitsObj, u)) {\n units.push({\n unit: u,\n priority: priorities[u]\n });\n }\n }\n units.sort(function (a, b) {\n return a.priority - b.priority;\n });\n return units;\n }\n var match1 = /\\d/,\n // 0 - 9\n match2 = /\\d\\d/,\n // 00 - 99\n match3 = /\\d{3}/,\n // 000 - 999\n match4 = /\\d{4}/,\n // 0000 - 9999\n match6 = /[+-]?\\d{6}/,\n // -999999 - 999999\n match1to2 = /\\d\\d?/,\n // 0 - 99\n match3to4 = /\\d\\d\\d\\d?/,\n // 999 - 9999\n match5to6 = /\\d\\d\\d\\d\\d\\d?/,\n // 99999 - 999999\n match1to3 = /\\d{1,3}/,\n // 0 - 999\n match1to4 = /\\d{1,4}/,\n // 0 - 9999\n match1to6 = /[+-]?\\d{1,6}/,\n // -999999 - 999999\n matchUnsigned = /\\d+/,\n // 0 - inf\n matchSigned = /[+-]?\\d+/,\n // -inf - inf\n matchOffset = /Z|[+-]\\d\\d:?\\d\\d/gi,\n // +00:00 -00:00 +0000 -0000 or Z\n matchShortOffset = /Z|[+-]\\d\\d(?::?\\d\\d)?/gi,\n // +00 -00 +00:00 -00:00 +0000 -0000 or Z\n matchTimestamp = /[+-]?\\d+(\\.\\d{1,3})?/,\n // 123456789 123456789.123\n // any word (or two) characters or numbers including two/three word month in arabic.\n // includes scottish gaelic two word and hyphenated months\n matchWord = /[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,\n match1to2NoLeadingZero = /^[1-9]\\d?/,\n // 1-99\n match1to2HasZero = /^([1-9]\\d|\\d)/,\n // 0-99\n regexes;\n regexes = {};\n function addRegexToken(token, regex, strictRegex) {\n regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) {\n return isStrict && strictRegex ? strictRegex : regex;\n };\n }\n function getParseRegexForToken(token, config) {\n if (!hasOwnProp(regexes, token)) {\n return new RegExp(unescapeFormat(token));\n }\n return regexes[token](config._strict, config._locale);\n }\n\n // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript\n function unescapeFormat(s) {\n return regexEscape(s.replace('\\\\', '').replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g, function (matched, p1, p2, p3, p4) {\n return p1 || p2 || p3 || p4;\n }));\n }\n function regexEscape(s) {\n return s.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n }\n function absFloor(number) {\n if (number < 0) {\n // -0 -> 0\n return Math.ceil(number) || 0;\n } else {\n return Math.floor(number);\n }\n }\n function toInt(argumentForCoercion) {\n var coercedNumber = +argumentForCoercion,\n value = 0;\n if (coercedNumber !== 0 && isFinite(coercedNumber)) {\n value = absFloor(coercedNumber);\n }\n return value;\n }\n var tokens = {};\n function addParseToken(token, callback) {\n var i,\n func = callback,\n tokenLen;\n if (typeof token === 'string') {\n token = [token];\n }\n if (isNumber(callback)) {\n func = function (input, array) {\n array[callback] = toInt(input);\n };\n }\n tokenLen = token.length;\n for (i = 0; i < tokenLen; i++) {\n tokens[token[i]] = func;\n }\n }\n function addWeekParseToken(token, callback) {\n addParseToken(token, function (input, array, config, token) {\n config._w = config._w || {};\n callback(input, config._w, config, token);\n });\n }\n function addTimeToArrayFromToken(token, input, config) {\n if (input != null && hasOwnProp(tokens, token)) {\n tokens[token](input, config._a, config, token);\n }\n }\n function isLeapYear(year) {\n return year % 4 === 0 && year % 100 !== 0 || year % 400 === 0;\n }\n var YEAR = 0,\n MONTH = 1,\n DATE = 2,\n HOUR = 3,\n MINUTE = 4,\n SECOND = 5,\n MILLISECOND = 6,\n WEEK = 7,\n WEEKDAY = 8;\n\n // FORMATTING\n\n addFormatToken('Y', 0, 0, function () {\n var y = this.year();\n return y <= 9999 ? zeroFill(y, 4) : '+' + y;\n });\n addFormatToken(0, ['YY', 2], 0, function () {\n return this.year() % 100;\n });\n addFormatToken(0, ['YYYY', 4], 0, 'year');\n addFormatToken(0, ['YYYYY', 5], 0, 'year');\n addFormatToken(0, ['YYYYYY', 6, true], 0, 'year');\n\n // PARSING\n\n addRegexToken('Y', matchSigned);\n addRegexToken('YY', match1to2, match2);\n addRegexToken('YYYY', match1to4, match4);\n addRegexToken('YYYYY', match1to6, match6);\n addRegexToken('YYYYYY', match1to6, match6);\n addParseToken(['YYYYY', 'YYYYYY'], YEAR);\n addParseToken('YYYY', function (input, array) {\n array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input);\n });\n addParseToken('YY', function (input, array) {\n array[YEAR] = hooks.parseTwoDigitYear(input);\n });\n addParseToken('Y', function (input, array) {\n array[YEAR] = parseInt(input, 10);\n });\n\n // HELPERS\n\n function daysInYear(year) {\n return isLeapYear(year) ? 366 : 365;\n }\n\n // HOOKS\n\n hooks.parseTwoDigitYear = function (input) {\n return toInt(input) + (toInt(input) > 68 ? 1900 : 2000);\n };\n\n // MOMENTS\n\n var getSetYear = makeGetSet('FullYear', true);\n function getIsLeapYear() {\n return isLeapYear(this.year());\n }\n function makeGetSet(unit, keepTime) {\n return function (value) {\n if (value != null) {\n set$1(this, unit, value);\n hooks.updateOffset(this, keepTime);\n return this;\n } else {\n return get(this, unit);\n }\n };\n }\n function get(mom, unit) {\n if (!mom.isValid()) {\n return NaN;\n }\n var d = mom._d,\n isUTC = mom._isUTC;\n switch (unit) {\n case 'Milliseconds':\n return isUTC ? d.getUTCMilliseconds() : d.getMilliseconds();\n case 'Seconds':\n return isUTC ? d.getUTCSeconds() : d.getSeconds();\n case 'Minutes':\n return isUTC ? d.getUTCMinutes() : d.getMinutes();\n case 'Hours':\n return isUTC ? d.getUTCHours() : d.getHours();\n case 'Date':\n return isUTC ? d.getUTCDate() : d.getDate();\n case 'Day':\n return isUTC ? d.getUTCDay() : d.getDay();\n case 'Month':\n return isUTC ? d.getUTCMonth() : d.getMonth();\n case 'FullYear':\n return isUTC ? d.getUTCFullYear() : d.getFullYear();\n default:\n return NaN;\n // Just in case\n }\n }\n function set$1(mom, unit, value) {\n var d, isUTC, year, month, date;\n if (!mom.isValid() || isNaN(value)) {\n return;\n }\n d = mom._d;\n isUTC = mom._isUTC;\n switch (unit) {\n case 'Milliseconds':\n return void (isUTC ? d.setUTCMilliseconds(value) : d.setMilliseconds(value));\n case 'Seconds':\n return void (isUTC ? d.setUTCSeconds(value) : d.setSeconds(value));\n case 'Minutes':\n return void (isUTC ? d.setUTCMinutes(value) : d.setMinutes(value));\n case 'Hours':\n return void (isUTC ? d.setUTCHours(value) : d.setHours(value));\n case 'Date':\n return void (isUTC ? d.setUTCDate(value) : d.setDate(value));\n // case 'Day': // Not real\n // return void (isUTC ? d.setUTCDay(value) : d.setDay(value));\n // case 'Month': // Not used because we need to pass two variables\n // return void (isUTC ? d.setUTCMonth(value) : d.setMonth(value));\n case 'FullYear':\n break;\n // See below ...\n default:\n return;\n // Just in case\n }\n year = value;\n month = mom.month();\n date = mom.date();\n date = date === 29 && month === 1 && !isLeapYear(year) ? 28 : date;\n void (isUTC ? d.setUTCFullYear(year, month, date) : d.setFullYear(year, month, date));\n }\n\n // MOMENTS\n\n function stringGet(units) {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units]();\n }\n return this;\n }\n function stringSet(units, value) {\n if (typeof units === 'object') {\n units = normalizeObjectUnits(units);\n var prioritized = getPrioritizedUnits(units),\n i,\n prioritizedLen = prioritized.length;\n for (i = 0; i < prioritizedLen; i++) {\n this[prioritized[i].unit](units[prioritized[i].unit]);\n }\n } else {\n units = normalizeUnits(units);\n if (isFunction(this[units])) {\n return this[units](value);\n }\n }\n return this;\n }\n function mod(n, x) {\n return (n % x + x) % x;\n }\n var indexOf;\n if (Array.prototype.indexOf) {\n indexOf = Array.prototype.indexOf;\n } else {\n indexOf = function (o) {\n // I know\n var i;\n for (i = 0; i < this.length; ++i) {\n if (this[i] === o) {\n return i;\n }\n }\n return -1;\n };\n }\n function daysInMonth(year, month) {\n if (isNaN(year) || isNaN(month)) {\n return NaN;\n }\n var modMonth = mod(month, 12);\n year += (month - modMonth) / 12;\n return modMonth === 1 ? isLeapYear(year) ? 29 : 28 : 31 - modMonth % 7 % 2;\n }\n\n // FORMATTING\n\n addFormatToken('M', ['MM', 2], 'Mo', function () {\n return this.month() + 1;\n });\n addFormatToken('MMM', 0, 0, function (format) {\n return this.localeData().monthsShort(this, format);\n });\n addFormatToken('MMMM', 0, 0, function (format) {\n return this.localeData().months(this, format);\n });\n\n // PARSING\n\n addRegexToken('M', match1to2, match1to2NoLeadingZero);\n addRegexToken('MM', match1to2, match2);\n addRegexToken('MMM', function (isStrict, locale) {\n return locale.monthsShortRegex(isStrict);\n });\n addRegexToken('MMMM', function (isStrict, locale) {\n return locale.monthsRegex(isStrict);\n });\n addParseToken(['M', 'MM'], function (input, array) {\n array[MONTH] = toInt(input) - 1;\n });\n addParseToken(['MMM', 'MMMM'], function (input, array, config, token) {\n var month = config._locale.monthsParse(input, token, config._strict);\n // if we didn't find a month name, mark the date as invalid.\n if (month != null) {\n array[MONTH] = month;\n } else {\n getParsingFlags(config).invalidMonth = input;\n }\n });\n\n // LOCALES\n\n var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'),\n defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'),\n MONTHS_IN_FORMAT = /D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,\n defaultMonthsShortRegex = matchWord,\n defaultMonthsRegex = matchWord;\n function localeMonths(m, format) {\n if (!m) {\n return isArray(this._months) ? this._months : this._months['standalone'];\n }\n return isArray(this._months) ? this._months[m.month()] : this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()];\n }\n function localeMonthsShort(m, format) {\n if (!m) {\n return isArray(this._monthsShort) ? this._monthsShort : this._monthsShort['standalone'];\n }\n return isArray(this._monthsShort) ? this._monthsShort[m.month()] : this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()];\n }\n function handleStrictParse(monthName, format, strict) {\n var i,\n ii,\n mom,\n llc = monthName.toLocaleLowerCase();\n if (!this._monthsParse) {\n // this is not used\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n for (i = 0; i < 12; ++i) {\n mom = createUTC([2000, i]);\n this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase();\n this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase();\n }\n }\n if (strict) {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'MMM') {\n ii = indexOf.call(this._shortMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._longMonthsParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._longMonthsParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortMonthsParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n function localeMonthsParse(monthName, format, strict) {\n var i, mom, regex;\n if (this._monthsParseExact) {\n return handleStrictParse.call(this, monthName, format, strict);\n }\n if (!this._monthsParse) {\n this._monthsParse = [];\n this._longMonthsParse = [];\n this._shortMonthsParse = [];\n }\n\n // TODO: add sorting\n // Sorting makes sure if one month (or abbr) is a prefix of another\n // see sorting in computeMonthsParse\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n if (strict && !this._longMonthsParse[i]) {\n this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i');\n this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i');\n }\n if (!strict && !this._monthsParse[i]) {\n regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, '');\n this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) {\n return i;\n } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) {\n return i;\n } else if (!strict && this._monthsParse[i].test(monthName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function setMonth(mom, value) {\n if (!mom.isValid()) {\n // No op\n return mom;\n }\n if (typeof value === 'string') {\n if (/^\\d+$/.test(value)) {\n value = toInt(value);\n } else {\n value = mom.localeData().monthsParse(value);\n // TODO: Another silent failure?\n if (!isNumber(value)) {\n return mom;\n }\n }\n }\n var month = value,\n date = mom.date();\n date = date < 29 ? date : Math.min(date, daysInMonth(mom.year(), month));\n void (mom._isUTC ? mom._d.setUTCMonth(month, date) : mom._d.setMonth(month, date));\n return mom;\n }\n function getSetMonth(value) {\n if (value != null) {\n setMonth(this, value);\n hooks.updateOffset(this, true);\n return this;\n } else {\n return get(this, 'Month');\n }\n }\n function getDaysInMonth() {\n return daysInMonth(this.year(), this.month());\n }\n function monthsShortRegex(isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsShortStrictRegex;\n } else {\n return this._monthsShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsShortRegex')) {\n this._monthsShortRegex = defaultMonthsShortRegex;\n }\n return this._monthsShortStrictRegex && isStrict ? this._monthsShortStrictRegex : this._monthsShortRegex;\n }\n }\n function monthsRegex(isStrict) {\n if (this._monthsParseExact) {\n if (!hasOwnProp(this, '_monthsRegex')) {\n computeMonthsParse.call(this);\n }\n if (isStrict) {\n return this._monthsStrictRegex;\n } else {\n return this._monthsRegex;\n }\n } else {\n if (!hasOwnProp(this, '_monthsRegex')) {\n this._monthsRegex = defaultMonthsRegex;\n }\n return this._monthsStrictRegex && isStrict ? this._monthsStrictRegex : this._monthsRegex;\n }\n }\n function computeMonthsParse() {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n var shortPieces = [],\n longPieces = [],\n mixedPieces = [],\n i,\n mom,\n shortP,\n longP;\n for (i = 0; i < 12; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, i]);\n shortP = regexEscape(this.monthsShort(mom, ''));\n longP = regexEscape(this.months(mom, ''));\n shortPieces.push(shortP);\n longPieces.push(longP);\n mixedPieces.push(longP);\n mixedPieces.push(shortP);\n }\n // Sorting makes sure if one month (or abbr) is a prefix of another it\n // will match the longer piece.\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._monthsShortRegex = this._monthsRegex;\n this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n }\n function createDate(y, m, d, h, M, s, ms) {\n // can't just apply() to create a date:\n // https://stackoverflow.com/q/181348\n var date;\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n date = new Date(y + 400, m, d, h, M, s, ms);\n if (isFinite(date.getFullYear())) {\n date.setFullYear(y);\n }\n } else {\n date = new Date(y, m, d, h, M, s, ms);\n }\n return date;\n }\n function createUTCDate(y) {\n var date, args;\n // the Date.UTC function remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n args = Array.prototype.slice.call(arguments);\n // preserve leap years using a full 400 year cycle, then reset\n args[0] = y + 400;\n date = new Date(Date.UTC.apply(null, args));\n if (isFinite(date.getUTCFullYear())) {\n date.setUTCFullYear(y);\n }\n } else {\n date = new Date(Date.UTC.apply(null, arguments));\n }\n return date;\n }\n\n // start-of-first-week - start-of-year\n function firstWeekOffset(year, dow, doy) {\n var\n // first-week day -- which january is always in the first week (4 for iso, 1 for other)\n fwd = 7 + dow - doy,\n // first-week day local weekday -- which local weekday is fwd\n fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7;\n return -fwdlw + fwd - 1;\n }\n\n // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday\n function dayOfYearFromWeeks(year, week, weekday, dow, doy) {\n var localWeekday = (7 + weekday - dow) % 7,\n weekOffset = firstWeekOffset(year, dow, doy),\n dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset,\n resYear,\n resDayOfYear;\n if (dayOfYear <= 0) {\n resYear = year - 1;\n resDayOfYear = daysInYear(resYear) + dayOfYear;\n } else if (dayOfYear > daysInYear(year)) {\n resYear = year + 1;\n resDayOfYear = dayOfYear - daysInYear(year);\n } else {\n resYear = year;\n resDayOfYear = dayOfYear;\n }\n return {\n year: resYear,\n dayOfYear: resDayOfYear\n };\n }\n function weekOfYear(mom, dow, doy) {\n var weekOffset = firstWeekOffset(mom.year(), dow, doy),\n week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1,\n resWeek,\n resYear;\n if (week < 1) {\n resYear = mom.year() - 1;\n resWeek = week + weeksInYear(resYear, dow, doy);\n } else if (week > weeksInYear(mom.year(), dow, doy)) {\n resWeek = week - weeksInYear(mom.year(), dow, doy);\n resYear = mom.year() + 1;\n } else {\n resYear = mom.year();\n resWeek = week;\n }\n return {\n week: resWeek,\n year: resYear\n };\n }\n function weeksInYear(year, dow, doy) {\n var weekOffset = firstWeekOffset(year, dow, doy),\n weekOffsetNext = firstWeekOffset(year + 1, dow, doy);\n return (daysInYear(year) - weekOffset + weekOffsetNext) / 7;\n }\n\n // FORMATTING\n\n addFormatToken('w', ['ww', 2], 'wo', 'week');\n addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek');\n\n // PARSING\n\n addRegexToken('w', match1to2, match1to2NoLeadingZero);\n addRegexToken('ww', match1to2, match2);\n addRegexToken('W', match1to2, match1to2NoLeadingZero);\n addRegexToken('WW', match1to2, match2);\n addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) {\n week[token.substr(0, 1)] = toInt(input);\n });\n\n // HELPERS\n\n // LOCALES\n\n function localeWeek(mom) {\n return weekOfYear(mom, this._week.dow, this._week.doy).week;\n }\n var defaultLocaleWeek = {\n dow: 0,\n // Sunday is the first day of the week.\n doy: 6 // The week that contains Jan 6th is the first week of the year.\n };\n function localeFirstDayOfWeek() {\n return this._week.dow;\n }\n function localeFirstDayOfYear() {\n return this._week.doy;\n }\n\n // MOMENTS\n\n function getSetWeek(input) {\n var week = this.localeData().week(this);\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n function getSetISOWeek(input) {\n var week = weekOfYear(this, 1, 4).week;\n return input == null ? week : this.add((input - week) * 7, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('d', 0, 'do', 'day');\n addFormatToken('dd', 0, 0, function (format) {\n return this.localeData().weekdaysMin(this, format);\n });\n addFormatToken('ddd', 0, 0, function (format) {\n return this.localeData().weekdaysShort(this, format);\n });\n addFormatToken('dddd', 0, 0, function (format) {\n return this.localeData().weekdays(this, format);\n });\n addFormatToken('e', 0, 0, 'weekday');\n addFormatToken('E', 0, 0, 'isoWeekday');\n\n // PARSING\n\n addRegexToken('d', match1to2);\n addRegexToken('e', match1to2);\n addRegexToken('E', match1to2);\n addRegexToken('dd', function (isStrict, locale) {\n return locale.weekdaysMinRegex(isStrict);\n });\n addRegexToken('ddd', function (isStrict, locale) {\n return locale.weekdaysShortRegex(isStrict);\n });\n addRegexToken('dddd', function (isStrict, locale) {\n return locale.weekdaysRegex(isStrict);\n });\n addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) {\n var weekday = config._locale.weekdaysParse(input, token, config._strict);\n // if we didn't get a weekday name, mark the date as invalid\n if (weekday != null) {\n week.d = weekday;\n } else {\n getParsingFlags(config).invalidWeekday = input;\n }\n });\n addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) {\n week[token] = toInt(input);\n });\n\n // HELPERS\n\n function parseWeekday(input, locale) {\n if (typeof input !== 'string') {\n return input;\n }\n if (!isNaN(input)) {\n return parseInt(input, 10);\n }\n input = locale.weekdaysParse(input);\n if (typeof input === 'number') {\n return input;\n }\n return null;\n }\n function parseIsoWeekday(input, locale) {\n if (typeof input === 'string') {\n return locale.weekdaysParse(input) % 7 || 7;\n }\n return isNaN(input) ? null : input;\n }\n\n // LOCALES\n function shiftWeekdays(ws, n) {\n return ws.slice(n, 7).concat(ws.slice(0, n));\n }\n var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'),\n defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'),\n defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'),\n defaultWeekdaysRegex = matchWord,\n defaultWeekdaysShortRegex = matchWord,\n defaultWeekdaysMinRegex = matchWord;\n function localeWeekdays(m, format) {\n var weekdays = isArray(this._weekdays) ? this._weekdays : this._weekdays[m && m !== true && this._weekdays.isFormat.test(format) ? 'format' : 'standalone'];\n return m === true ? shiftWeekdays(weekdays, this._week.dow) : m ? weekdays[m.day()] : weekdays;\n }\n function localeWeekdaysShort(m) {\n return m === true ? shiftWeekdays(this._weekdaysShort, this._week.dow) : m ? this._weekdaysShort[m.day()] : this._weekdaysShort;\n }\n function localeWeekdaysMin(m) {\n return m === true ? shiftWeekdays(this._weekdaysMin, this._week.dow) : m ? this._weekdaysMin[m.day()] : this._weekdaysMin;\n }\n function handleStrictParse$1(weekdayName, format, strict) {\n var i,\n ii,\n mom,\n llc = weekdayName.toLocaleLowerCase();\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._minWeekdaysParse = [];\n for (i = 0; i < 7; ++i) {\n mom = createUTC([2000, 1]).day(i);\n this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase();\n this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase();\n this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase();\n }\n }\n if (strict) {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n } else {\n if (format === 'dddd') {\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else if (format === 'ddd') {\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._minWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n } else {\n ii = indexOf.call(this._minWeekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._weekdaysParse, llc);\n if (ii !== -1) {\n return ii;\n }\n ii = indexOf.call(this._shortWeekdaysParse, llc);\n return ii !== -1 ? ii : null;\n }\n }\n }\n function localeWeekdaysParse(weekdayName, format, strict) {\n var i, mom, regex;\n if (this._weekdaysParseExact) {\n return handleStrictParse$1.call(this, weekdayName, format, strict);\n }\n if (!this._weekdaysParse) {\n this._weekdaysParse = [];\n this._minWeekdaysParse = [];\n this._shortWeekdaysParse = [];\n this._fullWeekdaysParse = [];\n }\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n\n mom = createUTC([2000, 1]).day(i);\n if (strict && !this._fullWeekdaysParse[i]) {\n this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\\\.?') + '$', 'i');\n this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\\\.?') + '$', 'i');\n }\n if (!this._weekdaysParse[i]) {\n regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, '');\n this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i');\n }\n // test the regex\n if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) {\n return i;\n } else if (!strict && this._weekdaysParse[i].test(weekdayName)) {\n return i;\n }\n }\n }\n\n // MOMENTS\n\n function getSetDayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var day = get(this, 'Day');\n if (input != null) {\n input = parseWeekday(input, this.localeData());\n return this.add(input - day, 'd');\n } else {\n return day;\n }\n }\n function getSetLocaleDayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7;\n return input == null ? weekday : this.add(input - weekday, 'd');\n }\n function getSetISODayOfWeek(input) {\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n\n // behaves the same as moment#day except\n // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6)\n // as a setter, sunday should belong to the previous week.\n\n if (input != null) {\n var weekday = parseIsoWeekday(input, this.localeData());\n return this.day(this.day() % 7 ? weekday : weekday - 7);\n } else {\n return this.day() || 7;\n }\n }\n function weekdaysRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysStrictRegex;\n } else {\n return this._weekdaysRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n this._weekdaysRegex = defaultWeekdaysRegex;\n }\n return this._weekdaysStrictRegex && isStrict ? this._weekdaysStrictRegex : this._weekdaysRegex;\n }\n }\n function weekdaysShortRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysShortStrictRegex;\n } else {\n return this._weekdaysShortRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysShortRegex')) {\n this._weekdaysShortRegex = defaultWeekdaysShortRegex;\n }\n return this._weekdaysShortStrictRegex && isStrict ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex;\n }\n }\n function weekdaysMinRegex(isStrict) {\n if (this._weekdaysParseExact) {\n if (!hasOwnProp(this, '_weekdaysRegex')) {\n computeWeekdaysParse.call(this);\n }\n if (isStrict) {\n return this._weekdaysMinStrictRegex;\n } else {\n return this._weekdaysMinRegex;\n }\n } else {\n if (!hasOwnProp(this, '_weekdaysMinRegex')) {\n this._weekdaysMinRegex = defaultWeekdaysMinRegex;\n }\n return this._weekdaysMinStrictRegex && isStrict ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex;\n }\n }\n function computeWeekdaysParse() {\n function cmpLenRev(a, b) {\n return b.length - a.length;\n }\n var minPieces = [],\n shortPieces = [],\n longPieces = [],\n mixedPieces = [],\n i,\n mom,\n minp,\n shortp,\n longp;\n for (i = 0; i < 7; i++) {\n // make the regex if we don't have it already\n mom = createUTC([2000, 1]).day(i);\n minp = regexEscape(this.weekdaysMin(mom, ''));\n shortp = regexEscape(this.weekdaysShort(mom, ''));\n longp = regexEscape(this.weekdays(mom, ''));\n minPieces.push(minp);\n shortPieces.push(shortp);\n longPieces.push(longp);\n mixedPieces.push(minp);\n mixedPieces.push(shortp);\n mixedPieces.push(longp);\n }\n // Sorting makes sure if one weekday (or abbr) is a prefix of another it\n // will match the longer piece.\n minPieces.sort(cmpLenRev);\n shortPieces.sort(cmpLenRev);\n longPieces.sort(cmpLenRev);\n mixedPieces.sort(cmpLenRev);\n this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._weekdaysShortRegex = this._weekdaysRegex;\n this._weekdaysMinRegex = this._weekdaysRegex;\n this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i');\n this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i');\n this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n function hFormat() {\n return this.hours() % 12 || 12;\n }\n function kFormat() {\n return this.hours() || 24;\n }\n addFormatToken('H', ['HH', 2], 0, 'hour');\n addFormatToken('h', ['hh', 2], 0, hFormat);\n addFormatToken('k', ['kk', 2], 0, kFormat);\n addFormatToken('hmm', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2);\n });\n addFormatToken('hmmss', 0, 0, function () {\n return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n });\n addFormatToken('Hmm', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2);\n });\n addFormatToken('Hmmss', 0, 0, function () {\n return '' + this.hours() + zeroFill(this.minutes(), 2) + zeroFill(this.seconds(), 2);\n });\n function meridiem(token, lowercase) {\n addFormatToken(token, 0, 0, function () {\n return this.localeData().meridiem(this.hours(), this.minutes(), lowercase);\n });\n }\n meridiem('a', true);\n meridiem('A', false);\n\n // PARSING\n\n function matchMeridiem(isStrict, locale) {\n return locale._meridiemParse;\n }\n addRegexToken('a', matchMeridiem);\n addRegexToken('A', matchMeridiem);\n addRegexToken('H', match1to2, match1to2HasZero);\n addRegexToken('h', match1to2, match1to2NoLeadingZero);\n addRegexToken('k', match1to2, match1to2NoLeadingZero);\n addRegexToken('HH', match1to2, match2);\n addRegexToken('hh', match1to2, match2);\n addRegexToken('kk', match1to2, match2);\n addRegexToken('hmm', match3to4);\n addRegexToken('hmmss', match5to6);\n addRegexToken('Hmm', match3to4);\n addRegexToken('Hmmss', match5to6);\n addParseToken(['H', 'HH'], HOUR);\n addParseToken(['k', 'kk'], function (input, array, config) {\n var kInput = toInt(input);\n array[HOUR] = kInput === 24 ? 0 : kInput;\n });\n addParseToken(['a', 'A'], function (input, array, config) {\n config._isPm = config._locale.isPM(input);\n config._meridiem = input;\n });\n addParseToken(['h', 'hh'], function (input, array, config) {\n array[HOUR] = toInt(input);\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('hmmss', function (input, array, config) {\n var pos1 = input.length - 4,\n pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n getParsingFlags(config).bigHour = true;\n });\n addParseToken('Hmm', function (input, array, config) {\n var pos = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos));\n array[MINUTE] = toInt(input.substr(pos));\n });\n addParseToken('Hmmss', function (input, array, config) {\n var pos1 = input.length - 4,\n pos2 = input.length - 2;\n array[HOUR] = toInt(input.substr(0, pos1));\n array[MINUTE] = toInt(input.substr(pos1, 2));\n array[SECOND] = toInt(input.substr(pos2));\n });\n\n // LOCALES\n\n function localeIsPM(input) {\n // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays\n // Using charAt should be more compatible.\n return (input + '').toLowerCase().charAt(0) === 'p';\n }\n var defaultLocaleMeridiemParse = /[ap]\\.?m?\\.?/i,\n // Setting the hour should keep the time, because the user explicitly\n // specified which hour they want. So trying to maintain the same hour (in\n // a new timezone) makes sense. Adding/subtracting hours does not follow\n // this rule.\n getSetHour = makeGetSet('Hours', true);\n function localeMeridiem(hours, minutes, isLower) {\n if (hours > 11) {\n return isLower ? 'pm' : 'PM';\n } else {\n return isLower ? 'am' : 'AM';\n }\n }\n var baseConfig = {\n calendar: defaultCalendar,\n longDateFormat: defaultLongDateFormat,\n invalidDate: defaultInvalidDate,\n ordinal: defaultOrdinal,\n dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse,\n relativeTime: defaultRelativeTime,\n months: defaultLocaleMonths,\n monthsShort: defaultLocaleMonthsShort,\n week: defaultLocaleWeek,\n weekdays: defaultLocaleWeekdays,\n weekdaysMin: defaultLocaleWeekdaysMin,\n weekdaysShort: defaultLocaleWeekdaysShort,\n meridiemParse: defaultLocaleMeridiemParse\n };\n\n // internal storage for locale config files\n var locales = {},\n localeFamilies = {},\n globalLocale;\n function commonPrefix(arr1, arr2) {\n var i,\n minl = Math.min(arr1.length, arr2.length);\n for (i = 0; i < minl; i += 1) {\n if (arr1[i] !== arr2[i]) {\n return i;\n }\n }\n return minl;\n }\n function normalizeLocale(key) {\n return key ? key.toLowerCase().replace('_', '-') : key;\n }\n\n // pick the locale from the array\n // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each\n // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root\n function chooseLocale(names) {\n var i = 0,\n j,\n next,\n locale,\n split;\n while (i < names.length) {\n split = normalizeLocale(names[i]).split('-');\n j = split.length;\n next = normalizeLocale(names[i + 1]);\n next = next ? next.split('-') : null;\n while (j > 0) {\n locale = loadLocale(split.slice(0, j).join('-'));\n if (locale) {\n return locale;\n }\n if (next && next.length >= j && commonPrefix(split, next) >= j - 1) {\n //the next array item is better than a shallower substring of this one\n break;\n }\n j--;\n }\n i++;\n }\n return globalLocale;\n }\n function isLocaleNameSane(name) {\n // Prevent names that look like filesystem paths, i.e contain '/' or '\\'\n // Ensure name is available and function returns boolean\n return !!(name && name.match('^[^/\\\\\\\\]*$'));\n }\n function loadLocale(name) {\n var oldLocale = null,\n aliasedRequire;\n // TODO: Find a better way to register and load all the locales in Node\n if (locales[name] === undefined && typeof module !== 'undefined' && module && module.exports && isLocaleNameSane(name)) {\n try {\n oldLocale = globalLocale._abbr;\n aliasedRequire = require;\n aliasedRequire('./locale/' + name);\n getSetGlobalLocale(oldLocale);\n } catch (e) {\n // mark as not found to avoid repeating expensive file require call causing high CPU\n // when trying to find en-US, en_US, en-us for every format call\n locales[name] = null; // null means not found\n }\n }\n return locales[name];\n }\n\n // This function will load locale and then set the global locale. If\n // no arguments are passed in, it will simply return the current global\n // locale key.\n function getSetGlobalLocale(key, values) {\n var data;\n if (key) {\n if (isUndefined(values)) {\n data = getLocale(key);\n } else {\n data = defineLocale(key, values);\n }\n if (data) {\n // moment.duration._locale = moment._locale = data;\n globalLocale = data;\n } else {\n if (typeof console !== 'undefined' && console.warn) {\n //warn user if arguments are passed but the locale could not be set\n console.warn('Locale ' + key + ' not found. Did you forget to load it?');\n }\n }\n }\n return globalLocale._abbr;\n }\n function defineLocale(name, config) {\n if (config !== null) {\n var locale,\n parentConfig = baseConfig;\n config.abbr = name;\n if (locales[name] != null) {\n deprecateSimple('defineLocaleOverride', 'use moment.updateLocale(localeName, config) to change ' + 'an existing locale. moment.defineLocale(localeName, ' + 'config) should only be used for creating a new locale ' + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.');\n parentConfig = locales[name]._config;\n } else if (config.parentLocale != null) {\n if (locales[config.parentLocale] != null) {\n parentConfig = locales[config.parentLocale]._config;\n } else {\n locale = loadLocale(config.parentLocale);\n if (locale != null) {\n parentConfig = locale._config;\n } else {\n if (!localeFamilies[config.parentLocale]) {\n localeFamilies[config.parentLocale] = [];\n }\n localeFamilies[config.parentLocale].push({\n name: name,\n config: config\n });\n return null;\n }\n }\n }\n locales[name] = new Locale(mergeConfigs(parentConfig, config));\n if (localeFamilies[name]) {\n localeFamilies[name].forEach(function (x) {\n defineLocale(x.name, x.config);\n });\n }\n\n // backwards compat for now: also set the locale\n // make sure we set the locale AFTER all child locales have been\n // created, so we won't end up with the child locale set.\n getSetGlobalLocale(name);\n return locales[name];\n } else {\n // useful for testing\n delete locales[name];\n return null;\n }\n }\n function updateLocale(name, config) {\n if (config != null) {\n var locale,\n tmpLocale,\n parentConfig = baseConfig;\n if (locales[name] != null && locales[name].parentLocale != null) {\n // Update existing child locale in-place to avoid memory-leaks\n locales[name].set(mergeConfigs(locales[name]._config, config));\n } else {\n // MERGE\n tmpLocale = loadLocale(name);\n if (tmpLocale != null) {\n parentConfig = tmpLocale._config;\n }\n config = mergeConfigs(parentConfig, config);\n if (tmpLocale == null) {\n // updateLocale is called for creating a new locale\n // Set abbr so it will have a name (getters return\n // undefined otherwise).\n config.abbr = name;\n }\n locale = new Locale(config);\n locale.parentLocale = locales[name];\n locales[name] = locale;\n }\n\n // backwards compat for now: also set the locale\n getSetGlobalLocale(name);\n } else {\n // pass null for config to unupdate, useful for tests\n if (locales[name] != null) {\n if (locales[name].parentLocale != null) {\n locales[name] = locales[name].parentLocale;\n if (name === getSetGlobalLocale()) {\n getSetGlobalLocale(name);\n }\n } else if (locales[name] != null) {\n delete locales[name];\n }\n }\n }\n return locales[name];\n }\n\n // returns locale data\n function getLocale(key) {\n var locale;\n if (key && key._locale && key._locale._abbr) {\n key = key._locale._abbr;\n }\n if (!key) {\n return globalLocale;\n }\n if (!isArray(key)) {\n //short-circuit everything else\n locale = loadLocale(key);\n if (locale) {\n return locale;\n }\n key = [key];\n }\n return chooseLocale(key);\n }\n function listLocales() {\n return keys(locales);\n }\n function checkOverflow(m) {\n var overflow,\n a = m._a;\n if (a && getParsingFlags(m).overflow === -2) {\n overflow = a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : a[HOUR] < 0 || a[HOUR] > 24 || a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0) ? HOUR : a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : -1;\n if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) {\n overflow = DATE;\n }\n if (getParsingFlags(m)._overflowWeeks && overflow === -1) {\n overflow = WEEK;\n }\n if (getParsingFlags(m)._overflowWeekday && overflow === -1) {\n overflow = WEEKDAY;\n }\n getParsingFlags(m).overflow = overflow;\n }\n return m;\n }\n\n // iso 8601 regex\n // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00)\n var extendedIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n basicIsoRegex = /^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,\n tzRegex = /Z|[+-]\\d\\d(?::?\\d\\d)?/,\n isoDates = [['YYYYYY-MM-DD', /[+-]\\d{6}-\\d\\d-\\d\\d/], ['YYYY-MM-DD', /\\d{4}-\\d\\d-\\d\\d/], ['GGGG-[W]WW-E', /\\d{4}-W\\d\\d-\\d/], ['GGGG-[W]WW', /\\d{4}-W\\d\\d/, false], ['YYYY-DDD', /\\d{4}-\\d{3}/], ['YYYY-MM', /\\d{4}-\\d\\d/, false], ['YYYYYYMMDD', /[+-]\\d{10}/], ['YYYYMMDD', /\\d{8}/], ['GGGG[W]WWE', /\\d{4}W\\d{3}/], ['GGGG[W]WW', /\\d{4}W\\d{2}/, false], ['YYYYDDD', /\\d{7}/], ['YYYYMM', /\\d{6}/, false], ['YYYY', /\\d{4}/, false]],\n // iso time formats and regexes\n isoTimes = [['HH:mm:ss.SSSS', /\\d\\d:\\d\\d:\\d\\d\\.\\d+/], ['HH:mm:ss,SSSS', /\\d\\d:\\d\\d:\\d\\d,\\d+/], ['HH:mm:ss', /\\d\\d:\\d\\d:\\d\\d/], ['HH:mm', /\\d\\d:\\d\\d/], ['HHmmss.SSSS', /\\d\\d\\d\\d\\d\\d\\.\\d+/], ['HHmmss,SSSS', /\\d\\d\\d\\d\\d\\d,\\d+/], ['HHmmss', /\\d\\d\\d\\d\\d\\d/], ['HHmm', /\\d\\d\\d\\d/], ['HH', /\\d\\d/]],\n aspNetJsonRegex = /^\\/?Date\\((-?\\d+)/i,\n // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3\n rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,\n obsOffsets = {\n UT: 0,\n GMT: 0,\n EDT: -4 * 60,\n EST: -5 * 60,\n CDT: -5 * 60,\n CST: -6 * 60,\n MDT: -6 * 60,\n MST: -7 * 60,\n PDT: -7 * 60,\n PST: -8 * 60\n };\n\n // date from iso format\n function configFromISO(config) {\n var i,\n l,\n string = config._i,\n match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string),\n allowTime,\n dateFormat,\n timeFormat,\n tzFormat,\n isoDatesLen = isoDates.length,\n isoTimesLen = isoTimes.length;\n if (match) {\n getParsingFlags(config).iso = true;\n for (i = 0, l = isoDatesLen; i < l; i++) {\n if (isoDates[i][1].exec(match[1])) {\n dateFormat = isoDates[i][0];\n allowTime = isoDates[i][2] !== false;\n break;\n }\n }\n if (dateFormat == null) {\n config._isValid = false;\n return;\n }\n if (match[3]) {\n for (i = 0, l = isoTimesLen; i < l; i++) {\n if (isoTimes[i][1].exec(match[3])) {\n // match[2] should be 'T' or space\n timeFormat = (match[2] || ' ') + isoTimes[i][0];\n break;\n }\n }\n if (timeFormat == null) {\n config._isValid = false;\n return;\n }\n }\n if (!allowTime && timeFormat != null) {\n config._isValid = false;\n return;\n }\n if (match[4]) {\n if (tzRegex.exec(match[4])) {\n tzFormat = 'Z';\n } else {\n config._isValid = false;\n return;\n }\n }\n config._f = dateFormat + (timeFormat || '') + (tzFormat || '');\n configFromStringAndFormat(config);\n } else {\n config._isValid = false;\n }\n }\n function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) {\n var result = [untruncateYear(yearStr), defaultLocaleMonthsShort.indexOf(monthStr), parseInt(dayStr, 10), parseInt(hourStr, 10), parseInt(minuteStr, 10)];\n if (secondStr) {\n result.push(parseInt(secondStr, 10));\n }\n return result;\n }\n function untruncateYear(yearStr) {\n var year = parseInt(yearStr, 10);\n if (year <= 49) {\n return 2000 + year;\n } else if (year <= 999) {\n return 1900 + year;\n }\n return year;\n }\n function preprocessRFC2822(s) {\n // Remove comments and folding whitespace and replace multiple-spaces with a single space\n return s.replace(/\\([^()]*\\)|[\\n\\t]/g, ' ').replace(/(\\s\\s+)/g, ' ').replace(/^\\s\\s*/, '').replace(/\\s\\s*$/, '');\n }\n function checkWeekday(weekdayStr, parsedInput, config) {\n if (weekdayStr) {\n // TODO: Replace the vanilla JS Date object with an independent day-of-week check.\n var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr),\n weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay();\n if (weekdayProvided !== weekdayActual) {\n getParsingFlags(config).weekdayMismatch = true;\n config._isValid = false;\n return false;\n }\n }\n return true;\n }\n function calculateOffset(obsOffset, militaryOffset, numOffset) {\n if (obsOffset) {\n return obsOffsets[obsOffset];\n } else if (militaryOffset) {\n // the only allowed military tz is Z\n return 0;\n } else {\n var hm = parseInt(numOffset, 10),\n m = hm % 100,\n h = (hm - m) / 100;\n return h * 60 + m;\n }\n }\n\n // date and time from ref 2822 format\n function configFromRFC2822(config) {\n var match = rfc2822.exec(preprocessRFC2822(config._i)),\n parsedArray;\n if (match) {\n parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]);\n if (!checkWeekday(match[1], parsedArray, config)) {\n return;\n }\n config._a = parsedArray;\n config._tzm = calculateOffset(match[8], match[9], match[10]);\n config._d = createUTCDate.apply(null, config._a);\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n getParsingFlags(config).rfc2822 = true;\n } else {\n config._isValid = false;\n }\n }\n\n // date from 1) ASP.NET, 2) ISO, 3) RFC 2822 formats, or 4) optional fallback if parsing isn't strict\n function configFromString(config) {\n var matched = aspNetJsonRegex.exec(config._i);\n if (matched !== null) {\n config._d = new Date(+matched[1]);\n return;\n }\n configFromISO(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n configFromRFC2822(config);\n if (config._isValid === false) {\n delete config._isValid;\n } else {\n return;\n }\n if (config._strict) {\n config._isValid = false;\n } else {\n // Final attempt, use Input Fallback\n hooks.createFromInputFallback(config);\n }\n }\n hooks.createFromInputFallback = deprecate('value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + 'discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.', function (config) {\n config._d = new Date(config._i + (config._useUTC ? ' UTC' : ''));\n });\n\n // Pick the first defined of two or three arguments.\n function defaults(a, b, c) {\n if (a != null) {\n return a;\n }\n if (b != null) {\n return b;\n }\n return c;\n }\n function currentDateArray(config) {\n // hooks is actually the exported moment object\n var nowValue = new Date(hooks.now());\n if (config._useUTC) {\n return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()];\n }\n return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()];\n }\n\n // convert an array to a date.\n // the array should mirror the parameters below\n // note: all values past the year are optional and will default to the lowest possible value.\n // [year, month, day , hour, minute, second, millisecond]\n function configFromArray(config) {\n var i,\n date,\n input = [],\n currentDate,\n expectedWeekday,\n yearToUse;\n if (config._d) {\n return;\n }\n currentDate = currentDateArray(config);\n\n //compute day of the year from weeks and weekdays\n if (config._w && config._a[DATE] == null && config._a[MONTH] == null) {\n dayOfYearFromWeekInfo(config);\n }\n\n //if the day of the year is set, figure out what it is\n if (config._dayOfYear != null) {\n yearToUse = defaults(config._a[YEAR], currentDate[YEAR]);\n if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) {\n getParsingFlags(config)._overflowDayOfYear = true;\n }\n date = createUTCDate(yearToUse, 0, config._dayOfYear);\n config._a[MONTH] = date.getUTCMonth();\n config._a[DATE] = date.getUTCDate();\n }\n\n // Default to current date.\n // * if no year, month, day of month are given, default to today\n // * if day of month is given, default month and year\n // * if month is given, default only year\n // * if year is given, don't default anything\n for (i = 0; i < 3 && config._a[i] == null; ++i) {\n config._a[i] = input[i] = currentDate[i];\n }\n\n // Zero out whatever was not defaulted, including time\n for (; i < 7; i++) {\n config._a[i] = input[i] = config._a[i] == null ? i === 2 ? 1 : 0 : config._a[i];\n }\n\n // Check for 24:00:00.000\n if (config._a[HOUR] === 24 && config._a[MINUTE] === 0 && config._a[SECOND] === 0 && config._a[MILLISECOND] === 0) {\n config._nextDay = true;\n config._a[HOUR] = 0;\n }\n config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input);\n expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay();\n\n // Apply timezone offset from input. The actual utcOffset can be changed\n // with parseZone.\n if (config._tzm != null) {\n config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm);\n }\n if (config._nextDay) {\n config._a[HOUR] = 24;\n }\n\n // check for mismatching day of week\n if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) {\n getParsingFlags(config).weekdayMismatch = true;\n }\n }\n function dayOfYearFromWeekInfo(config) {\n var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow, curWeek;\n w = config._w;\n if (w.GG != null || w.W != null || w.E != null) {\n dow = 1;\n doy = 4;\n\n // TODO: We need to take the current isoWeekYear, but that depends on\n // how we interpret now (local, utc, fixed offset). So create\n // a now version of current config (take local/utc/offset flags, and\n // create now).\n weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year);\n week = defaults(w.W, 1);\n weekday = defaults(w.E, 1);\n if (weekday < 1 || weekday > 7) {\n weekdayOverflow = true;\n }\n } else {\n dow = config._locale._week.dow;\n doy = config._locale._week.doy;\n curWeek = weekOfYear(createLocal(), dow, doy);\n weekYear = defaults(w.gg, config._a[YEAR], curWeek.year);\n\n // Default to current week.\n week = defaults(w.w, curWeek.week);\n if (w.d != null) {\n // weekday -- low day numbers are considered next week\n weekday = w.d;\n if (weekday < 0 || weekday > 6) {\n weekdayOverflow = true;\n }\n } else if (w.e != null) {\n // local weekday -- counting starts from beginning of week\n weekday = w.e + dow;\n if (w.e < 0 || w.e > 6) {\n weekdayOverflow = true;\n }\n } else {\n // default to beginning of week\n weekday = dow;\n }\n }\n if (week < 1 || week > weeksInYear(weekYear, dow, doy)) {\n getParsingFlags(config)._overflowWeeks = true;\n } else if (weekdayOverflow != null) {\n getParsingFlags(config)._overflowWeekday = true;\n } else {\n temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy);\n config._a[YEAR] = temp.year;\n config._dayOfYear = temp.dayOfYear;\n }\n }\n\n // constant that refers to the ISO standard\n hooks.ISO_8601 = function () {};\n\n // constant that refers to the RFC 2822 form\n hooks.RFC_2822 = function () {};\n\n // date from string and format string\n function configFromStringAndFormat(config) {\n // TODO: Move this to another part of the creation flow to prevent circular deps\n if (config._f === hooks.ISO_8601) {\n configFromISO(config);\n return;\n }\n if (config._f === hooks.RFC_2822) {\n configFromRFC2822(config);\n return;\n }\n config._a = [];\n getParsingFlags(config).empty = true;\n\n // This array is used to make a Date, either with `new Date` or `Date.UTC`\n var string = '' + config._i,\n i,\n parsedInput,\n tokens,\n token,\n skipped,\n stringLength = string.length,\n totalParsedInputLength = 0,\n era,\n tokenLen;\n tokens = expandFormat(config._f, config._locale).match(formattingTokens) || [];\n tokenLen = tokens.length;\n for (i = 0; i < tokenLen; i++) {\n token = tokens[i];\n parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0];\n if (parsedInput) {\n skipped = string.substr(0, string.indexOf(parsedInput));\n if (skipped.length > 0) {\n getParsingFlags(config).unusedInput.push(skipped);\n }\n string = string.slice(string.indexOf(parsedInput) + parsedInput.length);\n totalParsedInputLength += parsedInput.length;\n }\n // don't parse if it's not a known token\n if (formatTokenFunctions[token]) {\n if (parsedInput) {\n getParsingFlags(config).empty = false;\n } else {\n getParsingFlags(config).unusedTokens.push(token);\n }\n addTimeToArrayFromToken(token, parsedInput, config);\n } else if (config._strict && !parsedInput) {\n getParsingFlags(config).unusedTokens.push(token);\n }\n }\n\n // add remaining unparsed input length to the string\n getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength;\n if (string.length > 0) {\n getParsingFlags(config).unusedInput.push(string);\n }\n\n // clear _12h flag if hour is <= 12\n if (config._a[HOUR] <= 12 && getParsingFlags(config).bigHour === true && config._a[HOUR] > 0) {\n getParsingFlags(config).bigHour = undefined;\n }\n getParsingFlags(config).parsedDateParts = config._a.slice(0);\n getParsingFlags(config).meridiem = config._meridiem;\n // handle meridiem\n config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem);\n\n // handle era\n era = getParsingFlags(config).era;\n if (era !== null) {\n config._a[YEAR] = config._locale.erasConvertYear(era, config._a[YEAR]);\n }\n configFromArray(config);\n checkOverflow(config);\n }\n function meridiemFixWrap(locale, hour, meridiem) {\n var isPm;\n if (meridiem == null) {\n // nothing to do\n return hour;\n }\n if (locale.meridiemHour != null) {\n return locale.meridiemHour(hour, meridiem);\n } else if (locale.isPM != null) {\n // Fallback\n isPm = locale.isPM(meridiem);\n if (isPm && hour < 12) {\n hour += 12;\n }\n if (!isPm && hour === 12) {\n hour = 0;\n }\n return hour;\n } else {\n // this is not supposed to happen\n return hour;\n }\n }\n\n // date from string and array of format strings\n function configFromStringAndArray(config) {\n var tempConfig,\n bestMoment,\n scoreToBeat,\n i,\n currentScore,\n validFormatFound,\n bestFormatIsValid = false,\n configfLen = config._f.length;\n if (configfLen === 0) {\n getParsingFlags(config).invalidFormat = true;\n config._d = new Date(NaN);\n return;\n }\n for (i = 0; i < configfLen; i++) {\n currentScore = 0;\n validFormatFound = false;\n tempConfig = copyConfig({}, config);\n if (config._useUTC != null) {\n tempConfig._useUTC = config._useUTC;\n }\n tempConfig._f = config._f[i];\n configFromStringAndFormat(tempConfig);\n if (isValid(tempConfig)) {\n validFormatFound = true;\n }\n\n // if there is any input that was not parsed add a penalty for that format\n currentScore += getParsingFlags(tempConfig).charsLeftOver;\n\n //or tokens\n currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10;\n getParsingFlags(tempConfig).score = currentScore;\n if (!bestFormatIsValid) {\n if (scoreToBeat == null || currentScore < scoreToBeat || validFormatFound) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n if (validFormatFound) {\n bestFormatIsValid = true;\n }\n }\n } else {\n if (currentScore < scoreToBeat) {\n scoreToBeat = currentScore;\n bestMoment = tempConfig;\n }\n }\n }\n extend(config, bestMoment || tempConfig);\n }\n function configFromObject(config) {\n if (config._d) {\n return;\n }\n var i = normalizeObjectUnits(config._i),\n dayOrDate = i.day === undefined ? i.date : i.day;\n config._a = map([i.year, i.month, dayOrDate, i.hour, i.minute, i.second, i.millisecond], function (obj) {\n return obj && parseInt(obj, 10);\n });\n configFromArray(config);\n }\n function createFromConfig(config) {\n var res = new Moment(checkOverflow(prepareConfig(config)));\n if (res._nextDay) {\n // Adding is smart enough around DST\n res.add(1, 'd');\n res._nextDay = undefined;\n }\n return res;\n }\n function prepareConfig(config) {\n var input = config._i,\n format = config._f;\n config._locale = config._locale || getLocale(config._l);\n if (input === null || format === undefined && input === '') {\n return createInvalid({\n nullInput: true\n });\n }\n if (typeof input === 'string') {\n config._i = input = config._locale.preparse(input);\n }\n if (isMoment(input)) {\n return new Moment(checkOverflow(input));\n } else if (isDate(input)) {\n config._d = input;\n } else if (isArray(format)) {\n configFromStringAndArray(config);\n } else if (format) {\n configFromStringAndFormat(config);\n } else {\n configFromInput(config);\n }\n if (!isValid(config)) {\n config._d = null;\n }\n return config;\n }\n function configFromInput(config) {\n var input = config._i;\n if (isUndefined(input)) {\n config._d = new Date(hooks.now());\n } else if (isDate(input)) {\n config._d = new Date(input.valueOf());\n } else if (typeof input === 'string') {\n configFromString(config);\n } else if (isArray(input)) {\n config._a = map(input.slice(0), function (obj) {\n return parseInt(obj, 10);\n });\n configFromArray(config);\n } else if (isObject(input)) {\n configFromObject(config);\n } else if (isNumber(input)) {\n // from milliseconds\n config._d = new Date(input);\n } else {\n hooks.createFromInputFallback(config);\n }\n }\n function createLocalOrUTC(input, format, locale, strict, isUTC) {\n var c = {};\n if (format === true || format === false) {\n strict = format;\n format = undefined;\n }\n if (locale === true || locale === false) {\n strict = locale;\n locale = undefined;\n }\n if (isObject(input) && isObjectEmpty(input) || isArray(input) && input.length === 0) {\n input = undefined;\n }\n // object construction must be done this way.\n // https://github.com/moment/moment/issues/1423\n c._isAMomentObject = true;\n c._useUTC = c._isUTC = isUTC;\n c._l = locale;\n c._i = input;\n c._f = format;\n c._strict = strict;\n return createFromConfig(c);\n }\n function createLocal(input, format, locale, strict) {\n return createLocalOrUTC(input, format, locale, strict, false);\n }\n var prototypeMin = deprecate('moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other < this ? this : other;\n } else {\n return createInvalid();\n }\n }),\n prototypeMax = deprecate('moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', function () {\n var other = createLocal.apply(null, arguments);\n if (this.isValid() && other.isValid()) {\n return other > this ? this : other;\n } else {\n return createInvalid();\n }\n });\n\n // Pick a moment m from moments so that m[fn](other) is true for all\n // other. This relies on the function fn to be transitive.\n //\n // moments should either be an array of moment objects or an array, whose\n // first element is an array of moment objects.\n function pickBy(fn, moments) {\n var res, i;\n if (moments.length === 1 && isArray(moments[0])) {\n moments = moments[0];\n }\n if (!moments.length) {\n return createLocal();\n }\n res = moments[0];\n for (i = 1; i < moments.length; ++i) {\n if (!moments[i].isValid() || moments[i][fn](res)) {\n res = moments[i];\n }\n }\n return res;\n }\n\n // TODO: Use [].sort instead?\n function min() {\n var args = [].slice.call(arguments, 0);\n return pickBy('isBefore', args);\n }\n function max() {\n var args = [].slice.call(arguments, 0);\n return pickBy('isAfter', args);\n }\n var now = function () {\n return Date.now ? Date.now() : +new Date();\n };\n var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond'];\n function isDurationValid(m) {\n var key,\n unitHasDecimal = false,\n i,\n orderLen = ordering.length;\n for (key in m) {\n if (hasOwnProp(m, key) && !(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) {\n return false;\n }\n }\n for (i = 0; i < orderLen; ++i) {\n if (m[ordering[i]]) {\n if (unitHasDecimal) {\n return false; // only allow non-integers for smallest unit\n }\n if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) {\n unitHasDecimal = true;\n }\n }\n }\n return true;\n }\n function isValid$1() {\n return this._isValid;\n }\n function createInvalid$1() {\n return createDuration(NaN);\n }\n function Duration(duration) {\n var normalizedInput = normalizeObjectUnits(duration),\n years = normalizedInput.year || 0,\n quarters = normalizedInput.quarter || 0,\n months = normalizedInput.month || 0,\n weeks = normalizedInput.week || normalizedInput.isoWeek || 0,\n days = normalizedInput.day || 0,\n hours = normalizedInput.hour || 0,\n minutes = normalizedInput.minute || 0,\n seconds = normalizedInput.second || 0,\n milliseconds = normalizedInput.millisecond || 0;\n this._isValid = isDurationValid(normalizedInput);\n\n // representation for dateAddRemove\n this._milliseconds = +milliseconds + seconds * 1e3 +\n // 1000\n minutes * 6e4 +\n // 1000 * 60\n hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978\n // Because of dateAddRemove treats 24 hours as different from a\n // day when working around DST, we need to store them separately\n this._days = +days + weeks * 7;\n // It is impossible to translate months into days without knowing\n // which months you are are talking about, so we have to store\n // it separately.\n this._months = +months + quarters * 3 + years * 12;\n this._data = {};\n this._locale = getLocale();\n this._bubble();\n }\n function isDuration(obj) {\n return obj instanceof Duration;\n }\n function absRound(number) {\n if (number < 0) {\n return Math.round(-1 * number) * -1;\n } else {\n return Math.round(number);\n }\n }\n\n // compare two arrays, return the number of differences\n function compareArrays(array1, array2, dontConvert) {\n var len = Math.min(array1.length, array2.length),\n lengthDiff = Math.abs(array1.length - array2.length),\n diffs = 0,\n i;\n for (i = 0; i < len; i++) {\n if (dontConvert && array1[i] !== array2[i] || !dontConvert && toInt(array1[i]) !== toInt(array2[i])) {\n diffs++;\n }\n }\n return diffs + lengthDiff;\n }\n\n // FORMATTING\n\n function offset(token, separator) {\n addFormatToken(token, 0, 0, function () {\n var offset = this.utcOffset(),\n sign = '+';\n if (offset < 0) {\n offset = -offset;\n sign = '-';\n }\n return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~offset % 60, 2);\n });\n }\n offset('Z', ':');\n offset('ZZ', '');\n\n // PARSING\n\n addRegexToken('Z', matchShortOffset);\n addRegexToken('ZZ', matchShortOffset);\n addParseToken(['Z', 'ZZ'], function (input, array, config) {\n config._useUTC = true;\n config._tzm = offsetFromString(matchShortOffset, input);\n });\n\n // HELPERS\n\n // timezone chunker\n // '+10:00' > ['10', '00']\n // '-1530' > ['-15', '30']\n var chunkOffset = /([\\+\\-]|\\d\\d)/gi;\n function offsetFromString(matcher, string) {\n var matches = (string || '').match(matcher),\n chunk,\n parts,\n minutes;\n if (matches === null) {\n return null;\n }\n chunk = matches[matches.length - 1] || [];\n parts = (chunk + '').match(chunkOffset) || ['-', 0, 0];\n minutes = +(parts[1] * 60) + toInt(parts[2]);\n return minutes === 0 ? 0 : parts[0] === '+' ? minutes : -minutes;\n }\n\n // Return a moment from input, that is local/utc/zone equivalent to model.\n function cloneWithOffset(input, model) {\n var res, diff;\n if (model._isUTC) {\n res = model.clone();\n diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf();\n // Use low-level api, because this fn is low-level api.\n res._d.setTime(res._d.valueOf() + diff);\n hooks.updateOffset(res, false);\n return res;\n } else {\n return createLocal(input).local();\n }\n }\n function getDateOffset(m) {\n // On Firefox.24 Date#getTimezoneOffset returns a floating point.\n // https://github.com/moment/moment/pull/1871\n return -Math.round(m._d.getTimezoneOffset());\n }\n\n // HOOKS\n\n // This function will be called whenever a moment is mutated.\n // It is intended to keep the offset in sync with the timezone.\n hooks.updateOffset = function () {};\n\n // MOMENTS\n\n // keepLocalTime = true means only change the timezone, without\n // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]-->\n // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset\n // +0200, so we adjust the time as needed, to be valid.\n //\n // Keeping the time actually adds/subtracts (one hour)\n // from the actual represented time. That is why we call updateOffset\n // a second time. In case it wants us to change the offset again\n // _changeInProgress == true case, then we have to adjust, because\n // there is no such time in the given timezone.\n function getSetOffset(input, keepLocalTime, keepMinutes) {\n var offset = this._offset || 0,\n localAdjust;\n if (!this.isValid()) {\n return input != null ? this : NaN;\n }\n if (input != null) {\n if (typeof input === 'string') {\n input = offsetFromString(matchShortOffset, input);\n if (input === null) {\n return this;\n }\n } else if (Math.abs(input) < 16 && !keepMinutes) {\n input = input * 60;\n }\n if (!this._isUTC && keepLocalTime) {\n localAdjust = getDateOffset(this);\n }\n this._offset = input;\n this._isUTC = true;\n if (localAdjust != null) {\n this.add(localAdjust, 'm');\n }\n if (offset !== input) {\n if (!keepLocalTime || this._changeInProgress) {\n addSubtract(this, createDuration(input - offset, 'm'), 1, false);\n } else if (!this._changeInProgress) {\n this._changeInProgress = true;\n hooks.updateOffset(this, true);\n this._changeInProgress = null;\n }\n }\n return this;\n } else {\n return this._isUTC ? offset : getDateOffset(this);\n }\n }\n function getSetZone(input, keepLocalTime) {\n if (input != null) {\n if (typeof input !== 'string') {\n input = -input;\n }\n this.utcOffset(input, keepLocalTime);\n return this;\n } else {\n return -this.utcOffset();\n }\n }\n function setOffsetToUTC(keepLocalTime) {\n return this.utcOffset(0, keepLocalTime);\n }\n function setOffsetToLocal(keepLocalTime) {\n if (this._isUTC) {\n this.utcOffset(0, keepLocalTime);\n this._isUTC = false;\n if (keepLocalTime) {\n this.subtract(getDateOffset(this), 'm');\n }\n }\n return this;\n }\n function setOffsetToParsedOffset() {\n if (this._tzm != null) {\n this.utcOffset(this._tzm, false, true);\n } else if (typeof this._i === 'string') {\n var tZone = offsetFromString(matchOffset, this._i);\n if (tZone != null) {\n this.utcOffset(tZone);\n } else {\n this.utcOffset(0, true);\n }\n }\n return this;\n }\n function hasAlignedHourOffset(input) {\n if (!this.isValid()) {\n return false;\n }\n input = input ? createLocal(input).utcOffset() : 0;\n return (this.utcOffset() - input) % 60 === 0;\n }\n function isDaylightSavingTime() {\n return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset();\n }\n function isDaylightSavingTimeShifted() {\n if (!isUndefined(this._isDSTShifted)) {\n return this._isDSTShifted;\n }\n var c = {},\n other;\n copyConfig(c, this);\n c = prepareConfig(c);\n if (c._a) {\n other = c._isUTC ? createUTC(c._a) : createLocal(c._a);\n this._isDSTShifted = this.isValid() && compareArrays(c._a, other.toArray()) > 0;\n } else {\n this._isDSTShifted = false;\n }\n return this._isDSTShifted;\n }\n function isLocal() {\n return this.isValid() ? !this._isUTC : false;\n }\n function isUtcOffset() {\n return this.isValid() ? this._isUTC : false;\n }\n function isUtc() {\n return this.isValid() ? this._isUTC && this._offset === 0 : false;\n }\n\n // ASP.NET json date format regex\n var aspNetRegex = /^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,\n // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html\n // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere\n // and further modified to allow for strings containing both week and day\n isoRegex = /^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;\n function createDuration(input, key) {\n var duration = input,\n // matching against regexp is expensive, do it on demand\n match = null,\n sign,\n ret,\n diffRes;\n if (isDuration(input)) {\n duration = {\n ms: input._milliseconds,\n d: input._days,\n M: input._months\n };\n } else if (isNumber(input) || !isNaN(+input)) {\n duration = {};\n if (key) {\n duration[key] = +input;\n } else {\n duration.milliseconds = +input;\n }\n } else if (match = aspNetRegex.exec(input)) {\n sign = match[1] === '-' ? -1 : 1;\n duration = {\n y: 0,\n d: toInt(match[DATE]) * sign,\n h: toInt(match[HOUR]) * sign,\n m: toInt(match[MINUTE]) * sign,\n s: toInt(match[SECOND]) * sign,\n ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match\n };\n } else if (match = isoRegex.exec(input)) {\n sign = match[1] === '-' ? -1 : 1;\n duration = {\n y: parseIso(match[2], sign),\n M: parseIso(match[3], sign),\n w: parseIso(match[4], sign),\n d: parseIso(match[5], sign),\n h: parseIso(match[6], sign),\n m: parseIso(match[7], sign),\n s: parseIso(match[8], sign)\n };\n } else if (duration == null) {\n // checks for null or undefined\n duration = {};\n } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) {\n diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to));\n duration = {};\n duration.ms = diffRes.milliseconds;\n duration.M = diffRes.months;\n }\n ret = new Duration(duration);\n if (isDuration(input) && hasOwnProp(input, '_locale')) {\n ret._locale = input._locale;\n }\n if (isDuration(input) && hasOwnProp(input, '_isValid')) {\n ret._isValid = input._isValid;\n }\n return ret;\n }\n createDuration.fn = Duration.prototype;\n createDuration.invalid = createInvalid$1;\n function parseIso(inp, sign) {\n // We'd normally use ~~inp for this, but unfortunately it also\n // converts floats to ints.\n // inp may be undefined, so careful calling replace on it.\n var res = inp && parseFloat(inp.replace(',', '.'));\n // apply sign while we're at it\n return (isNaN(res) ? 0 : res) * sign;\n }\n function positiveMomentsDifference(base, other) {\n var res = {};\n res.months = other.month() - base.month() + (other.year() - base.year()) * 12;\n if (base.clone().add(res.months, 'M').isAfter(other)) {\n --res.months;\n }\n res.milliseconds = +other - +base.clone().add(res.months, 'M');\n return res;\n }\n function momentsDifference(base, other) {\n var res;\n if (!(base.isValid() && other.isValid())) {\n return {\n milliseconds: 0,\n months: 0\n };\n }\n other = cloneWithOffset(other, base);\n if (base.isBefore(other)) {\n res = positiveMomentsDifference(base, other);\n } else {\n res = positiveMomentsDifference(other, base);\n res.milliseconds = -res.milliseconds;\n res.months = -res.months;\n }\n return res;\n }\n\n // TODO: remove 'name' arg after deprecation is removed\n function createAdder(direction, name) {\n return function (val, period) {\n var dur, tmp;\n //invert the arguments, but complain about it\n if (period !== null && !isNaN(+period)) {\n deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.');\n tmp = val;\n val = period;\n period = tmp;\n }\n dur = createDuration(val, period);\n addSubtract(this, dur, direction);\n return this;\n };\n }\n function addSubtract(mom, duration, isAdding, updateOffset) {\n var milliseconds = duration._milliseconds,\n days = absRound(duration._days),\n months = absRound(duration._months);\n if (!mom.isValid()) {\n // No op\n return;\n }\n updateOffset = updateOffset == null ? true : updateOffset;\n if (months) {\n setMonth(mom, get(mom, 'Month') + months * isAdding);\n }\n if (days) {\n set$1(mom, 'Date', get(mom, 'Date') + days * isAdding);\n }\n if (milliseconds) {\n mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding);\n }\n if (updateOffset) {\n hooks.updateOffset(mom, days || months);\n }\n }\n var add = createAdder(1, 'add'),\n subtract = createAdder(-1, 'subtract');\n function isString(input) {\n return typeof input === 'string' || input instanceof String;\n }\n\n // type MomentInput = Moment | Date | string | number | (number | string)[] | MomentInputObject | void; // null | undefined\n function isMomentInput(input) {\n return isMoment(input) || isDate(input) || isString(input) || isNumber(input) || isNumberOrStringArray(input) || isMomentInputObject(input) || input === null || input === undefined;\n }\n function isMomentInputObject(input) {\n var objectTest = isObject(input) && !isObjectEmpty(input),\n propertyTest = false,\n properties = ['years', 'year', 'y', 'months', 'month', 'M', 'days', 'day', 'd', 'dates', 'date', 'D', 'hours', 'hour', 'h', 'minutes', 'minute', 'm', 'seconds', 'second', 's', 'milliseconds', 'millisecond', 'ms'],\n i,\n property,\n propertyLen = properties.length;\n for (i = 0; i < propertyLen; i += 1) {\n property = properties[i];\n propertyTest = propertyTest || hasOwnProp(input, property);\n }\n return objectTest && propertyTest;\n }\n function isNumberOrStringArray(input) {\n var arrayTest = isArray(input),\n dataTypeTest = false;\n if (arrayTest) {\n dataTypeTest = input.filter(function (item) {\n return !isNumber(item) && isString(input);\n }).length === 0;\n }\n return arrayTest && dataTypeTest;\n }\n function isCalendarSpec(input) {\n var objectTest = isObject(input) && !isObjectEmpty(input),\n propertyTest = false,\n properties = ['sameDay', 'nextDay', 'lastDay', 'nextWeek', 'lastWeek', 'sameElse'],\n i,\n property;\n for (i = 0; i < properties.length; i += 1) {\n property = properties[i];\n propertyTest = propertyTest || hasOwnProp(input, property);\n }\n return objectTest && propertyTest;\n }\n function getCalendarFormat(myMoment, now) {\n var diff = myMoment.diff(now, 'days', true);\n return diff < -6 ? 'sameElse' : diff < -1 ? 'lastWeek' : diff < 0 ? 'lastDay' : diff < 1 ? 'sameDay' : diff < 2 ? 'nextDay' : diff < 7 ? 'nextWeek' : 'sameElse';\n }\n function calendar$1(time, formats) {\n // Support for single parameter, formats only overload to the calendar function\n if (arguments.length === 1) {\n if (!arguments[0]) {\n time = undefined;\n formats = undefined;\n } else if (isMomentInput(arguments[0])) {\n time = arguments[0];\n formats = undefined;\n } else if (isCalendarSpec(arguments[0])) {\n formats = arguments[0];\n time = undefined;\n }\n }\n // We want to compare the start of today, vs this.\n // Getting start-of-today depends on whether we're local/utc/offset or not.\n var now = time || createLocal(),\n sod = cloneWithOffset(now, this).startOf('day'),\n format = hooks.calendarFormat(this, sod) || 'sameElse',\n output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]);\n return this.format(output || this.localeData().calendar(format, this, createLocal(now)));\n }\n function clone() {\n return new Moment(this);\n }\n function isAfter(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() > localInput.valueOf();\n } else {\n return localInput.valueOf() < this.clone().startOf(units).valueOf();\n }\n }\n function isBefore(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input);\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() < localInput.valueOf();\n } else {\n return this.clone().endOf(units).valueOf() < localInput.valueOf();\n }\n }\n function isBetween(from, to, units, inclusivity) {\n var localFrom = isMoment(from) ? from : createLocal(from),\n localTo = isMoment(to) ? to : createLocal(to);\n if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) {\n return false;\n }\n inclusivity = inclusivity || '()';\n return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units));\n }\n function isSame(input, units) {\n var localInput = isMoment(input) ? input : createLocal(input),\n inputMs;\n if (!(this.isValid() && localInput.isValid())) {\n return false;\n }\n units = normalizeUnits(units) || 'millisecond';\n if (units === 'millisecond') {\n return this.valueOf() === localInput.valueOf();\n } else {\n inputMs = localInput.valueOf();\n return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf();\n }\n }\n function isSameOrAfter(input, units) {\n return this.isSame(input, units) || this.isAfter(input, units);\n }\n function isSameOrBefore(input, units) {\n return this.isSame(input, units) || this.isBefore(input, units);\n }\n function diff(input, units, asFloat) {\n var that, zoneDelta, output;\n if (!this.isValid()) {\n return NaN;\n }\n that = cloneWithOffset(input, this);\n if (!that.isValid()) {\n return NaN;\n }\n zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4;\n units = normalizeUnits(units);\n switch (units) {\n case 'year':\n output = monthDiff(this, that) / 12;\n break;\n case 'month':\n output = monthDiff(this, that);\n break;\n case 'quarter':\n output = monthDiff(this, that) / 3;\n break;\n case 'second':\n output = (this - that) / 1e3;\n break;\n // 1000\n case 'minute':\n output = (this - that) / 6e4;\n break;\n // 1000 * 60\n case 'hour':\n output = (this - that) / 36e5;\n break;\n // 1000 * 60 * 60\n case 'day':\n output = (this - that - zoneDelta) / 864e5;\n break;\n // 1000 * 60 * 60 * 24, negate dst\n case 'week':\n output = (this - that - zoneDelta) / 6048e5;\n break;\n // 1000 * 60 * 60 * 24 * 7, negate dst\n default:\n output = this - that;\n }\n return asFloat ? output : absFloor(output);\n }\n function monthDiff(a, b) {\n if (a.date() < b.date()) {\n // end-of-month calculations work correct when the start month has more\n // days than the end month.\n return -monthDiff(b, a);\n }\n // difference in months\n var wholeMonthDiff = (b.year() - a.year()) * 12 + (b.month() - a.month()),\n // b is in (anchor - 1 month, anchor + 1 month)\n anchor = a.clone().add(wholeMonthDiff, 'months'),\n anchor2,\n adjust;\n if (b - anchor < 0) {\n anchor2 = a.clone().add(wholeMonthDiff - 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor - anchor2);\n } else {\n anchor2 = a.clone().add(wholeMonthDiff + 1, 'months');\n // linear across the month\n adjust = (b - anchor) / (anchor2 - anchor);\n }\n\n //check for negative zero, return zero if negative zero\n return -(wholeMonthDiff + adjust) || 0;\n }\n hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ';\n hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]';\n function toString() {\n return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ');\n }\n function toISOString(keepOffset) {\n if (!this.isValid()) {\n return null;\n }\n var utc = keepOffset !== true,\n m = utc ? this.clone().utc() : this;\n if (m.year() < 0 || m.year() > 9999) {\n return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n if (isFunction(Date.prototype.toISOString)) {\n // native implementation is ~50x faster, use it when we can\n if (utc) {\n return this.toDate().toISOString();\n } else {\n return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z'));\n }\n }\n return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ');\n }\n\n /**\n * Return a human readable representation of a moment that can\n * also be evaluated to get a new moment which is the same\n *\n * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects\n */\n function inspect() {\n if (!this.isValid()) {\n return 'moment.invalid(/* ' + this._i + ' */)';\n }\n var func = 'moment',\n zone = '',\n prefix,\n year,\n datetime,\n suffix;\n if (!this.isLocal()) {\n func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone';\n zone = 'Z';\n }\n prefix = '[' + func + '(\"]';\n year = 0 <= this.year() && this.year() <= 9999 ? 'YYYY' : 'YYYYYY';\n datetime = '-MM-DD[T]HH:mm:ss.SSS';\n suffix = zone + '[\")]';\n return this.format(prefix + year + datetime + suffix);\n }\n function format(inputString) {\n if (!inputString) {\n inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat;\n }\n var output = formatMoment(this, inputString);\n return this.localeData().postformat(output);\n }\n function from(time, withoutSuffix) {\n if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n return createDuration({\n to: this,\n from: time\n }).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n function fromNow(withoutSuffix) {\n return this.from(createLocal(), withoutSuffix);\n }\n function to(time, withoutSuffix) {\n if (this.isValid() && (isMoment(time) && time.isValid() || createLocal(time).isValid())) {\n return createDuration({\n from: this,\n to: time\n }).locale(this.locale()).humanize(!withoutSuffix);\n } else {\n return this.localeData().invalidDate();\n }\n }\n function toNow(withoutSuffix) {\n return this.to(createLocal(), withoutSuffix);\n }\n\n // If passed a locale key, it will set the locale for this\n // instance. Otherwise, it will return the locale configuration\n // variables for this instance.\n function locale(key) {\n var newLocaleData;\n if (key === undefined) {\n return this._locale._abbr;\n } else {\n newLocaleData = getLocale(key);\n if (newLocaleData != null) {\n this._locale = newLocaleData;\n }\n return this;\n }\n }\n var lang = deprecate('moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', function (key) {\n if (key === undefined) {\n return this.localeData();\n } else {\n return this.locale(key);\n }\n });\n function localeData() {\n return this._locale;\n }\n var MS_PER_SECOND = 1000,\n MS_PER_MINUTE = 60 * MS_PER_SECOND,\n MS_PER_HOUR = 60 * MS_PER_MINUTE,\n MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR;\n\n // actual modulo - handles negative numbers (for dates before 1970):\n function mod$1(dividend, divisor) {\n return (dividend % divisor + divisor) % divisor;\n }\n function localStartOfDate(y, m, d) {\n // the date constructor remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n return new Date(y + 400, m, d) - MS_PER_400_YEARS;\n } else {\n return new Date(y, m, d).valueOf();\n }\n }\n function utcStartOfDate(y, m, d) {\n // Date.UTC remaps years 0-99 to 1900-1999\n if (y < 100 && y >= 0) {\n // preserve leap years using a full 400 year cycle, then reset\n return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS;\n } else {\n return Date.UTC(y, m, d);\n }\n }\n function startOf(units) {\n var time, startOfDate;\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond' || !this.isValid()) {\n return this;\n }\n startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n switch (units) {\n case 'year':\n time = startOfDate(this.year(), 0, 1);\n break;\n case 'quarter':\n time = startOfDate(this.year(), this.month() - this.month() % 3, 1);\n break;\n case 'month':\n time = startOfDate(this.year(), this.month(), 1);\n break;\n case 'week':\n time = startOfDate(this.year(), this.month(), this.date() - this.weekday());\n break;\n case 'isoWeek':\n time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1));\n break;\n case 'day':\n case 'date':\n time = startOfDate(this.year(), this.month(), this.date());\n break;\n case 'hour':\n time = this._d.valueOf();\n time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR);\n break;\n case 'minute':\n time = this._d.valueOf();\n time -= mod$1(time, MS_PER_MINUTE);\n break;\n case 'second':\n time = this._d.valueOf();\n time -= mod$1(time, MS_PER_SECOND);\n break;\n }\n this._d.setTime(time);\n hooks.updateOffset(this, true);\n return this;\n }\n function endOf(units) {\n var time, startOfDate;\n units = normalizeUnits(units);\n if (units === undefined || units === 'millisecond' || !this.isValid()) {\n return this;\n }\n startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate;\n switch (units) {\n case 'year':\n time = startOfDate(this.year() + 1, 0, 1) - 1;\n break;\n case 'quarter':\n time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1;\n break;\n case 'month':\n time = startOfDate(this.year(), this.month() + 1, 1) - 1;\n break;\n case 'week':\n time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1;\n break;\n case 'isoWeek':\n time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1;\n break;\n case 'day':\n case 'date':\n time = startOfDate(this.year(), this.month(), this.date() + 1) - 1;\n break;\n case 'hour':\n time = this._d.valueOf();\n time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1;\n break;\n case 'minute':\n time = this._d.valueOf();\n time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1;\n break;\n case 'second':\n time = this._d.valueOf();\n time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1;\n break;\n }\n this._d.setTime(time);\n hooks.updateOffset(this, true);\n return this;\n }\n function valueOf() {\n return this._d.valueOf() - (this._offset || 0) * 60000;\n }\n function unix() {\n return Math.floor(this.valueOf() / 1000);\n }\n function toDate() {\n return new Date(this.valueOf());\n }\n function toArray() {\n var m = this;\n return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()];\n }\n function toObject() {\n var m = this;\n return {\n years: m.year(),\n months: m.month(),\n date: m.date(),\n hours: m.hours(),\n minutes: m.minutes(),\n seconds: m.seconds(),\n milliseconds: m.milliseconds()\n };\n }\n function toJSON() {\n // new Date(NaN).toJSON() === null\n return this.isValid() ? this.toISOString() : null;\n }\n function isValid$2() {\n return isValid(this);\n }\n function parsingFlags() {\n return extend({}, getParsingFlags(this));\n }\n function invalidAt() {\n return getParsingFlags(this).overflow;\n }\n function creationData() {\n return {\n input: this._i,\n format: this._f,\n locale: this._locale,\n isUTC: this._isUTC,\n strict: this._strict\n };\n }\n addFormatToken('N', 0, 0, 'eraAbbr');\n addFormatToken('NN', 0, 0, 'eraAbbr');\n addFormatToken('NNN', 0, 0, 'eraAbbr');\n addFormatToken('NNNN', 0, 0, 'eraName');\n addFormatToken('NNNNN', 0, 0, 'eraNarrow');\n addFormatToken('y', ['y', 1], 'yo', 'eraYear');\n addFormatToken('y', ['yy', 2], 0, 'eraYear');\n addFormatToken('y', ['yyy', 3], 0, 'eraYear');\n addFormatToken('y', ['yyyy', 4], 0, 'eraYear');\n addRegexToken('N', matchEraAbbr);\n addRegexToken('NN', matchEraAbbr);\n addRegexToken('NNN', matchEraAbbr);\n addRegexToken('NNNN', matchEraName);\n addRegexToken('NNNNN', matchEraNarrow);\n addParseToken(['N', 'NN', 'NNN', 'NNNN', 'NNNNN'], function (input, array, config, token) {\n var era = config._locale.erasParse(input, token, config._strict);\n if (era) {\n getParsingFlags(config).era = era;\n } else {\n getParsingFlags(config).invalidEra = input;\n }\n });\n addRegexToken('y', matchUnsigned);\n addRegexToken('yy', matchUnsigned);\n addRegexToken('yyy', matchUnsigned);\n addRegexToken('yyyy', matchUnsigned);\n addRegexToken('yo', matchEraYearOrdinal);\n addParseToken(['y', 'yy', 'yyy', 'yyyy'], YEAR);\n addParseToken(['yo'], function (input, array, config, token) {\n var match;\n if (config._locale._eraYearOrdinalRegex) {\n match = input.match(config._locale._eraYearOrdinalRegex);\n }\n if (config._locale.eraYearOrdinalParse) {\n array[YEAR] = config._locale.eraYearOrdinalParse(input, match);\n } else {\n array[YEAR] = parseInt(input, 10);\n }\n });\n function localeEras(m, format) {\n var i,\n l,\n date,\n eras = this._eras || getLocale('en')._eras;\n for (i = 0, l = eras.length; i < l; ++i) {\n switch (typeof eras[i].since) {\n case 'string':\n // truncate time\n date = hooks(eras[i].since).startOf('day');\n eras[i].since = date.valueOf();\n break;\n }\n switch (typeof eras[i].until) {\n case 'undefined':\n eras[i].until = +Infinity;\n break;\n case 'string':\n // truncate time\n date = hooks(eras[i].until).startOf('day').valueOf();\n eras[i].until = date.valueOf();\n break;\n }\n }\n return eras;\n }\n function localeErasParse(eraName, format, strict) {\n var i,\n l,\n eras = this.eras(),\n name,\n abbr,\n narrow;\n eraName = eraName.toUpperCase();\n for (i = 0, l = eras.length; i < l; ++i) {\n name = eras[i].name.toUpperCase();\n abbr = eras[i].abbr.toUpperCase();\n narrow = eras[i].narrow.toUpperCase();\n if (strict) {\n switch (format) {\n case 'N':\n case 'NN':\n case 'NNN':\n if (abbr === eraName) {\n return eras[i];\n }\n break;\n case 'NNNN':\n if (name === eraName) {\n return eras[i];\n }\n break;\n case 'NNNNN':\n if (narrow === eraName) {\n return eras[i];\n }\n break;\n }\n } else if ([name, abbr, narrow].indexOf(eraName) >= 0) {\n return eras[i];\n }\n }\n }\n function localeErasConvertYear(era, year) {\n var dir = era.since <= era.until ? +1 : -1;\n if (year === undefined) {\n return hooks(era.since).year();\n } else {\n return hooks(era.since).year() + (year - era.offset) * dir;\n }\n }\n function getEraName() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].name;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].name;\n }\n }\n return '';\n }\n function getEraNarrow() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].narrow;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].narrow;\n }\n }\n return '';\n }\n function getEraAbbr() {\n var i,\n l,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n // truncate time\n val = this.clone().startOf('day').valueOf();\n if (eras[i].since <= val && val <= eras[i].until) {\n return eras[i].abbr;\n }\n if (eras[i].until <= val && val <= eras[i].since) {\n return eras[i].abbr;\n }\n }\n return '';\n }\n function getEraYear() {\n var i,\n l,\n dir,\n val,\n eras = this.localeData().eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n dir = eras[i].since <= eras[i].until ? +1 : -1;\n\n // truncate time\n val = this.clone().startOf('day').valueOf();\n if (eras[i].since <= val && val <= eras[i].until || eras[i].until <= val && val <= eras[i].since) {\n return (this.year() - hooks(eras[i].since).year()) * dir + eras[i].offset;\n }\n }\n return this.year();\n }\n function erasNameRegex(isStrict) {\n if (!hasOwnProp(this, '_erasNameRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasNameRegex : this._erasRegex;\n }\n function erasAbbrRegex(isStrict) {\n if (!hasOwnProp(this, '_erasAbbrRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasAbbrRegex : this._erasRegex;\n }\n function erasNarrowRegex(isStrict) {\n if (!hasOwnProp(this, '_erasNarrowRegex')) {\n computeErasParse.call(this);\n }\n return isStrict ? this._erasNarrowRegex : this._erasRegex;\n }\n function matchEraAbbr(isStrict, locale) {\n return locale.erasAbbrRegex(isStrict);\n }\n function matchEraName(isStrict, locale) {\n return locale.erasNameRegex(isStrict);\n }\n function matchEraNarrow(isStrict, locale) {\n return locale.erasNarrowRegex(isStrict);\n }\n function matchEraYearOrdinal(isStrict, locale) {\n return locale._eraYearOrdinalRegex || matchUnsigned;\n }\n function computeErasParse() {\n var abbrPieces = [],\n namePieces = [],\n narrowPieces = [],\n mixedPieces = [],\n i,\n l,\n erasName,\n erasAbbr,\n erasNarrow,\n eras = this.eras();\n for (i = 0, l = eras.length; i < l; ++i) {\n erasName = regexEscape(eras[i].name);\n erasAbbr = regexEscape(eras[i].abbr);\n erasNarrow = regexEscape(eras[i].narrow);\n namePieces.push(erasName);\n abbrPieces.push(erasAbbr);\n narrowPieces.push(erasNarrow);\n mixedPieces.push(erasName);\n mixedPieces.push(erasAbbr);\n mixedPieces.push(erasNarrow);\n }\n this._erasRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i');\n this._erasNameRegex = new RegExp('^(' + namePieces.join('|') + ')', 'i');\n this._erasAbbrRegex = new RegExp('^(' + abbrPieces.join('|') + ')', 'i');\n this._erasNarrowRegex = new RegExp('^(' + narrowPieces.join('|') + ')', 'i');\n }\n\n // FORMATTING\n\n addFormatToken(0, ['gg', 2], 0, function () {\n return this.weekYear() % 100;\n });\n addFormatToken(0, ['GG', 2], 0, function () {\n return this.isoWeekYear() % 100;\n });\n function addWeekYearFormatToken(token, getter) {\n addFormatToken(0, [token, token.length], 0, getter);\n }\n addWeekYearFormatToken('gggg', 'weekYear');\n addWeekYearFormatToken('ggggg', 'weekYear');\n addWeekYearFormatToken('GGGG', 'isoWeekYear');\n addWeekYearFormatToken('GGGGG', 'isoWeekYear');\n\n // ALIASES\n\n // PARSING\n\n addRegexToken('G', matchSigned);\n addRegexToken('g', matchSigned);\n addRegexToken('GG', match1to2, match2);\n addRegexToken('gg', match1to2, match2);\n addRegexToken('GGGG', match1to4, match4);\n addRegexToken('gggg', match1to4, match4);\n addRegexToken('GGGGG', match1to6, match6);\n addRegexToken('ggggg', match1to6, match6);\n addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) {\n week[token.substr(0, 2)] = toInt(input);\n });\n addWeekParseToken(['gg', 'GG'], function (input, week, config, token) {\n week[token] = hooks.parseTwoDigitYear(input);\n });\n\n // MOMENTS\n\n function getSetWeekYear(input) {\n return getSetWeekYearHelper.call(this, input, this.week(), this.weekday() + this.localeData()._week.dow, this.localeData()._week.dow, this.localeData()._week.doy);\n }\n function getSetISOWeekYear(input) {\n return getSetWeekYearHelper.call(this, input, this.isoWeek(), this.isoWeekday(), 1, 4);\n }\n function getISOWeeksInYear() {\n return weeksInYear(this.year(), 1, 4);\n }\n function getISOWeeksInISOWeekYear() {\n return weeksInYear(this.isoWeekYear(), 1, 4);\n }\n function getWeeksInYear() {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy);\n }\n function getWeeksInWeekYear() {\n var weekInfo = this.localeData()._week;\n return weeksInYear(this.weekYear(), weekInfo.dow, weekInfo.doy);\n }\n function getSetWeekYearHelper(input, week, weekday, dow, doy) {\n var weeksTarget;\n if (input == null) {\n return weekOfYear(this, dow, doy).year;\n } else {\n weeksTarget = weeksInYear(input, dow, doy);\n if (week > weeksTarget) {\n week = weeksTarget;\n }\n return setWeekAll.call(this, input, week, weekday, dow, doy);\n }\n }\n function setWeekAll(weekYear, week, weekday, dow, doy) {\n var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy),\n date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear);\n this.year(date.getUTCFullYear());\n this.month(date.getUTCMonth());\n this.date(date.getUTCDate());\n return this;\n }\n\n // FORMATTING\n\n addFormatToken('Q', 0, 'Qo', 'quarter');\n\n // PARSING\n\n addRegexToken('Q', match1);\n addParseToken('Q', function (input, array) {\n array[MONTH] = (toInt(input) - 1) * 3;\n });\n\n // MOMENTS\n\n function getSetQuarter(input) {\n return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3);\n }\n\n // FORMATTING\n\n addFormatToken('D', ['DD', 2], 'Do', 'date');\n\n // PARSING\n\n addRegexToken('D', match1to2, match1to2NoLeadingZero);\n addRegexToken('DD', match1to2, match2);\n addRegexToken('Do', function (isStrict, locale) {\n // TODO: Remove \"ordinalParse\" fallback in next major release.\n return isStrict ? locale._dayOfMonthOrdinalParse || locale._ordinalParse : locale._dayOfMonthOrdinalParseLenient;\n });\n addParseToken(['D', 'DD'], DATE);\n addParseToken('Do', function (input, array) {\n array[DATE] = toInt(input.match(match1to2)[0]);\n });\n\n // MOMENTS\n\n var getSetDayOfMonth = makeGetSet('Date', true);\n\n // FORMATTING\n\n addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear');\n\n // PARSING\n\n addRegexToken('DDD', match1to3);\n addRegexToken('DDDD', match3);\n addParseToken(['DDD', 'DDDD'], function (input, array, config) {\n config._dayOfYear = toInt(input);\n });\n\n // HELPERS\n\n // MOMENTS\n\n function getSetDayOfYear(input) {\n var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1;\n return input == null ? dayOfYear : this.add(input - dayOfYear, 'd');\n }\n\n // FORMATTING\n\n addFormatToken('m', ['mm', 2], 0, 'minute');\n\n // PARSING\n\n addRegexToken('m', match1to2, match1to2HasZero);\n addRegexToken('mm', match1to2, match2);\n addParseToken(['m', 'mm'], MINUTE);\n\n // MOMENTS\n\n var getSetMinute = makeGetSet('Minutes', false);\n\n // FORMATTING\n\n addFormatToken('s', ['ss', 2], 0, 'second');\n\n // PARSING\n\n addRegexToken('s', match1to2, match1to2HasZero);\n addRegexToken('ss', match1to2, match2);\n addParseToken(['s', 'ss'], SECOND);\n\n // MOMENTS\n\n var getSetSecond = makeGetSet('Seconds', false);\n\n // FORMATTING\n\n addFormatToken('S', 0, 0, function () {\n return ~~(this.millisecond() / 100);\n });\n addFormatToken(0, ['SS', 2], 0, function () {\n return ~~(this.millisecond() / 10);\n });\n addFormatToken(0, ['SSS', 3], 0, 'millisecond');\n addFormatToken(0, ['SSSS', 4], 0, function () {\n return this.millisecond() * 10;\n });\n addFormatToken(0, ['SSSSS', 5], 0, function () {\n return this.millisecond() * 100;\n });\n addFormatToken(0, ['SSSSSS', 6], 0, function () {\n return this.millisecond() * 1000;\n });\n addFormatToken(0, ['SSSSSSS', 7], 0, function () {\n return this.millisecond() * 10000;\n });\n addFormatToken(0, ['SSSSSSSS', 8], 0, function () {\n return this.millisecond() * 100000;\n });\n addFormatToken(0, ['SSSSSSSSS', 9], 0, function () {\n return this.millisecond() * 1000000;\n });\n\n // PARSING\n\n addRegexToken('S', match1to3, match1);\n addRegexToken('SS', match1to3, match2);\n addRegexToken('SSS', match1to3, match3);\n var token, getSetMillisecond;\n for (token = 'SSSS'; token.length <= 9; token += 'S') {\n addRegexToken(token, matchUnsigned);\n }\n function parseMs(input, array) {\n array[MILLISECOND] = toInt(('0.' + input) * 1000);\n }\n for (token = 'S'; token.length <= 9; token += 'S') {\n addParseToken(token, parseMs);\n }\n getSetMillisecond = makeGetSet('Milliseconds', false);\n\n // FORMATTING\n\n addFormatToken('z', 0, 0, 'zoneAbbr');\n addFormatToken('zz', 0, 0, 'zoneName');\n\n // MOMENTS\n\n function getZoneAbbr() {\n return this._isUTC ? 'UTC' : '';\n }\n function getZoneName() {\n return this._isUTC ? 'Coordinated Universal Time' : '';\n }\n var proto = Moment.prototype;\n proto.add = add;\n proto.calendar = calendar$1;\n proto.clone = clone;\n proto.diff = diff;\n proto.endOf = endOf;\n proto.format = format;\n proto.from = from;\n proto.fromNow = fromNow;\n proto.to = to;\n proto.toNow = toNow;\n proto.get = stringGet;\n proto.invalidAt = invalidAt;\n proto.isAfter = isAfter;\n proto.isBefore = isBefore;\n proto.isBetween = isBetween;\n proto.isSame = isSame;\n proto.isSameOrAfter = isSameOrAfter;\n proto.isSameOrBefore = isSameOrBefore;\n proto.isValid = isValid$2;\n proto.lang = lang;\n proto.locale = locale;\n proto.localeData = localeData;\n proto.max = prototypeMax;\n proto.min = prototypeMin;\n proto.parsingFlags = parsingFlags;\n proto.set = stringSet;\n proto.startOf = startOf;\n proto.subtract = subtract;\n proto.toArray = toArray;\n proto.toObject = toObject;\n proto.toDate = toDate;\n proto.toISOString = toISOString;\n proto.inspect = inspect;\n if (typeof Symbol !== 'undefined' && Symbol.for != null) {\n proto[Symbol.for('nodejs.util.inspect.custom')] = function () {\n return 'Moment<' + this.format() + '>';\n };\n }\n proto.toJSON = toJSON;\n proto.toString = toString;\n proto.unix = unix;\n proto.valueOf = valueOf;\n proto.creationData = creationData;\n proto.eraName = getEraName;\n proto.eraNarrow = getEraNarrow;\n proto.eraAbbr = getEraAbbr;\n proto.eraYear = getEraYear;\n proto.year = getSetYear;\n proto.isLeapYear = getIsLeapYear;\n proto.weekYear = getSetWeekYear;\n proto.isoWeekYear = getSetISOWeekYear;\n proto.quarter = proto.quarters = getSetQuarter;\n proto.month = getSetMonth;\n proto.daysInMonth = getDaysInMonth;\n proto.week = proto.weeks = getSetWeek;\n proto.isoWeek = proto.isoWeeks = getSetISOWeek;\n proto.weeksInYear = getWeeksInYear;\n proto.weeksInWeekYear = getWeeksInWeekYear;\n proto.isoWeeksInYear = getISOWeeksInYear;\n proto.isoWeeksInISOWeekYear = getISOWeeksInISOWeekYear;\n proto.date = getSetDayOfMonth;\n proto.day = proto.days = getSetDayOfWeek;\n proto.weekday = getSetLocaleDayOfWeek;\n proto.isoWeekday = getSetISODayOfWeek;\n proto.dayOfYear = getSetDayOfYear;\n proto.hour = proto.hours = getSetHour;\n proto.minute = proto.minutes = getSetMinute;\n proto.second = proto.seconds = getSetSecond;\n proto.millisecond = proto.milliseconds = getSetMillisecond;\n proto.utcOffset = getSetOffset;\n proto.utc = setOffsetToUTC;\n proto.local = setOffsetToLocal;\n proto.parseZone = setOffsetToParsedOffset;\n proto.hasAlignedHourOffset = hasAlignedHourOffset;\n proto.isDST = isDaylightSavingTime;\n proto.isLocal = isLocal;\n proto.isUtcOffset = isUtcOffset;\n proto.isUtc = isUtc;\n proto.isUTC = isUtc;\n proto.zoneAbbr = getZoneAbbr;\n proto.zoneName = getZoneName;\n proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth);\n proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth);\n proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear);\n proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone);\n proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted);\n function createUnix(input) {\n return createLocal(input * 1000);\n }\n function createInZone() {\n return createLocal.apply(null, arguments).parseZone();\n }\n function preParsePostFormat(string) {\n return string;\n }\n var proto$1 = Locale.prototype;\n proto$1.calendar = calendar;\n proto$1.longDateFormat = longDateFormat;\n proto$1.invalidDate = invalidDate;\n proto$1.ordinal = ordinal;\n proto$1.preparse = preParsePostFormat;\n proto$1.postformat = preParsePostFormat;\n proto$1.relativeTime = relativeTime;\n proto$1.pastFuture = pastFuture;\n proto$1.set = set;\n proto$1.eras = localeEras;\n proto$1.erasParse = localeErasParse;\n proto$1.erasConvertYear = localeErasConvertYear;\n proto$1.erasAbbrRegex = erasAbbrRegex;\n proto$1.erasNameRegex = erasNameRegex;\n proto$1.erasNarrowRegex = erasNarrowRegex;\n proto$1.months = localeMonths;\n proto$1.monthsShort = localeMonthsShort;\n proto$1.monthsParse = localeMonthsParse;\n proto$1.monthsRegex = monthsRegex;\n proto$1.monthsShortRegex = monthsShortRegex;\n proto$1.week = localeWeek;\n proto$1.firstDayOfYear = localeFirstDayOfYear;\n proto$1.firstDayOfWeek = localeFirstDayOfWeek;\n proto$1.weekdays = localeWeekdays;\n proto$1.weekdaysMin = localeWeekdaysMin;\n proto$1.weekdaysShort = localeWeekdaysShort;\n proto$1.weekdaysParse = localeWeekdaysParse;\n proto$1.weekdaysRegex = weekdaysRegex;\n proto$1.weekdaysShortRegex = weekdaysShortRegex;\n proto$1.weekdaysMinRegex = weekdaysMinRegex;\n proto$1.isPM = localeIsPM;\n proto$1.meridiem = localeMeridiem;\n function get$1(format, index, field, setter) {\n var locale = getLocale(),\n utc = createUTC().set(setter, index);\n return locale[field](utc, format);\n }\n function listMonthsImpl(format, index, field) {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n format = format || '';\n if (index != null) {\n return get$1(format, index, field, 'month');\n }\n var i,\n out = [];\n for (i = 0; i < 12; i++) {\n out[i] = get$1(format, i, field, 'month');\n }\n return out;\n }\n\n // ()\n // (5)\n // (fmt, 5)\n // (fmt)\n // (true)\n // (true, 5)\n // (true, fmt, 5)\n // (true, fmt)\n function listWeekdaysImpl(localeSorted, format, index, field) {\n if (typeof localeSorted === 'boolean') {\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n format = format || '';\n } else {\n format = localeSorted;\n index = format;\n localeSorted = false;\n if (isNumber(format)) {\n index = format;\n format = undefined;\n }\n format = format || '';\n }\n var locale = getLocale(),\n shift = localeSorted ? locale._week.dow : 0,\n i,\n out = [];\n if (index != null) {\n return get$1(format, (index + shift) % 7, field, 'day');\n }\n for (i = 0; i < 7; i++) {\n out[i] = get$1(format, (i + shift) % 7, field, 'day');\n }\n return out;\n }\n function listMonths(format, index) {\n return listMonthsImpl(format, index, 'months');\n }\n function listMonthsShort(format, index) {\n return listMonthsImpl(format, index, 'monthsShort');\n }\n function listWeekdays(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdays');\n }\n function listWeekdaysShort(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort');\n }\n function listWeekdaysMin(localeSorted, format, index) {\n return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin');\n }\n getSetGlobalLocale('en', {\n eras: [{\n since: '0001-01-01',\n until: +Infinity,\n offset: 1,\n name: 'Anno Domini',\n narrow: 'AD',\n abbr: 'AD'\n }, {\n since: '0000-12-31',\n until: -Infinity,\n offset: 1,\n name: 'Before Christ',\n narrow: 'BC',\n abbr: 'BC'\n }],\n dayOfMonthOrdinalParse: /\\d{1,2}(th|st|nd|rd)/,\n ordinal: function (number) {\n var b = number % 10,\n output = toInt(number % 100 / 10) === 1 ? 'th' : b === 1 ? 'st' : b === 2 ? 'nd' : b === 3 ? 'rd' : 'th';\n return number + output;\n }\n });\n\n // Side effect imports\n\n hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale);\n hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale);\n var mathAbs = Math.abs;\n function abs() {\n var data = this._data;\n this._milliseconds = mathAbs(this._milliseconds);\n this._days = mathAbs(this._days);\n this._months = mathAbs(this._months);\n data.milliseconds = mathAbs(data.milliseconds);\n data.seconds = mathAbs(data.seconds);\n data.minutes = mathAbs(data.minutes);\n data.hours = mathAbs(data.hours);\n data.months = mathAbs(data.months);\n data.years = mathAbs(data.years);\n return this;\n }\n function addSubtract$1(duration, input, value, direction) {\n var other = createDuration(input, value);\n duration._milliseconds += direction * other._milliseconds;\n duration._days += direction * other._days;\n duration._months += direction * other._months;\n return duration._bubble();\n }\n\n // supports only 2.0-style add(1, 's') or add(duration)\n function add$1(input, value) {\n return addSubtract$1(this, input, value, 1);\n }\n\n // supports only 2.0-style subtract(1, 's') or subtract(duration)\n function subtract$1(input, value) {\n return addSubtract$1(this, input, value, -1);\n }\n function absCeil(number) {\n if (number < 0) {\n return Math.floor(number);\n } else {\n return Math.ceil(number);\n }\n }\n function bubble() {\n var milliseconds = this._milliseconds,\n days = this._days,\n months = this._months,\n data = this._data,\n seconds,\n minutes,\n hours,\n years,\n monthsFromDays;\n\n // if we have a mix of positive and negative values, bubble down first\n // check: https://github.com/moment/moment/issues/2166\n if (!(milliseconds >= 0 && days >= 0 && months >= 0 || milliseconds <= 0 && days <= 0 && months <= 0)) {\n milliseconds += absCeil(monthsToDays(months) + days) * 864e5;\n days = 0;\n months = 0;\n }\n\n // The following code bubbles up values, see the tests for\n // examples of what that means.\n data.milliseconds = milliseconds % 1000;\n seconds = absFloor(milliseconds / 1000);\n data.seconds = seconds % 60;\n minutes = absFloor(seconds / 60);\n data.minutes = minutes % 60;\n hours = absFloor(minutes / 60);\n data.hours = hours % 24;\n days += absFloor(hours / 24);\n\n // convert days to months\n monthsFromDays = absFloor(daysToMonths(days));\n months += monthsFromDays;\n days -= absCeil(monthsToDays(monthsFromDays));\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n data.days = days;\n data.months = months;\n data.years = years;\n return this;\n }\n function daysToMonths(days) {\n // 400 years have 146097 days (taking into account leap year rules)\n // 400 years have 12 months === 4800\n return days * 4800 / 146097;\n }\n function monthsToDays(months) {\n // the reverse of daysToMonths\n return months * 146097 / 4800;\n }\n function as(units) {\n if (!this.isValid()) {\n return NaN;\n }\n var days,\n months,\n milliseconds = this._milliseconds;\n units = normalizeUnits(units);\n if (units === 'month' || units === 'quarter' || units === 'year') {\n days = this._days + milliseconds / 864e5;\n months = this._months + daysToMonths(days);\n switch (units) {\n case 'month':\n return months;\n case 'quarter':\n return months / 3;\n case 'year':\n return months / 12;\n }\n } else {\n // handle milliseconds separately because of floating point math errors (issue #1867)\n days = this._days + Math.round(monthsToDays(this._months));\n switch (units) {\n case 'week':\n return days / 7 + milliseconds / 6048e5;\n case 'day':\n return days + milliseconds / 864e5;\n case 'hour':\n return days * 24 + milliseconds / 36e5;\n case 'minute':\n return days * 1440 + milliseconds / 6e4;\n case 'second':\n return days * 86400 + milliseconds / 1000;\n // Math.floor prevents floating point math errors here\n case 'millisecond':\n return Math.floor(days * 864e5) + milliseconds;\n default:\n throw new Error('Unknown unit ' + units);\n }\n }\n }\n function makeAs(alias) {\n return function () {\n return this.as(alias);\n };\n }\n var asMilliseconds = makeAs('ms'),\n asSeconds = makeAs('s'),\n asMinutes = makeAs('m'),\n asHours = makeAs('h'),\n asDays = makeAs('d'),\n asWeeks = makeAs('w'),\n asMonths = makeAs('M'),\n asQuarters = makeAs('Q'),\n asYears = makeAs('y'),\n valueOf$1 = asMilliseconds;\n function clone$1() {\n return createDuration(this);\n }\n function get$2(units) {\n units = normalizeUnits(units);\n return this.isValid() ? this[units + 's']() : NaN;\n }\n function makeGetter(name) {\n return function () {\n return this.isValid() ? this._data[name] : NaN;\n };\n }\n var milliseconds = makeGetter('milliseconds'),\n seconds = makeGetter('seconds'),\n minutes = makeGetter('minutes'),\n hours = makeGetter('hours'),\n days = makeGetter('days'),\n months = makeGetter('months'),\n years = makeGetter('years');\n function weeks() {\n return absFloor(this.days() / 7);\n }\n var round = Math.round,\n thresholds = {\n ss: 44,\n // a few seconds to seconds\n s: 45,\n // seconds to minute\n m: 45,\n // minutes to hour\n h: 22,\n // hours to day\n d: 26,\n // days to month/week\n w: null,\n // weeks to month\n M: 11 // months to year\n };\n\n // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize\n function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) {\n return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture);\n }\n function relativeTime$1(posNegDuration, withoutSuffix, thresholds, locale) {\n var duration = createDuration(posNegDuration).abs(),\n seconds = round(duration.as('s')),\n minutes = round(duration.as('m')),\n hours = round(duration.as('h')),\n days = round(duration.as('d')),\n months = round(duration.as('M')),\n weeks = round(duration.as('w')),\n years = round(duration.as('y')),\n a = seconds <= thresholds.ss && ['s', seconds] || seconds < thresholds.s && ['ss', seconds] || minutes <= 1 && ['m'] || minutes < thresholds.m && ['mm', minutes] || hours <= 1 && ['h'] || hours < thresholds.h && ['hh', hours] || days <= 1 && ['d'] || days < thresholds.d && ['dd', days];\n if (thresholds.w != null) {\n a = a || weeks <= 1 && ['w'] || weeks < thresholds.w && ['ww', weeks];\n }\n a = a || months <= 1 && ['M'] || months < thresholds.M && ['MM', months] || years <= 1 && ['y'] || ['yy', years];\n a[2] = withoutSuffix;\n a[3] = +posNegDuration > 0;\n a[4] = locale;\n return substituteTimeAgo.apply(null, a);\n }\n\n // This function allows you to set the rounding function for relative time strings\n function getSetRelativeTimeRounding(roundingFunction) {\n if (roundingFunction === undefined) {\n return round;\n }\n if (typeof roundingFunction === 'function') {\n round = roundingFunction;\n return true;\n }\n return false;\n }\n\n // This function allows you to set a threshold for relative time strings\n function getSetRelativeTimeThreshold(threshold, limit) {\n if (thresholds[threshold] === undefined) {\n return false;\n }\n if (limit === undefined) {\n return thresholds[threshold];\n }\n thresholds[threshold] = limit;\n if (threshold === 's') {\n thresholds.ss = limit - 1;\n }\n return true;\n }\n function humanize(argWithSuffix, argThresholds) {\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n var withSuffix = false,\n th = thresholds,\n locale,\n output;\n if (typeof argWithSuffix === 'object') {\n argThresholds = argWithSuffix;\n argWithSuffix = false;\n }\n if (typeof argWithSuffix === 'boolean') {\n withSuffix = argWithSuffix;\n }\n if (typeof argThresholds === 'object') {\n th = Object.assign({}, thresholds, argThresholds);\n if (argThresholds.s != null && argThresholds.ss == null) {\n th.ss = argThresholds.s - 1;\n }\n }\n locale = this.localeData();\n output = relativeTime$1(this, !withSuffix, th, locale);\n if (withSuffix) {\n output = locale.pastFuture(+this, output);\n }\n return locale.postformat(output);\n }\n var abs$1 = Math.abs;\n function sign(x) {\n return (x > 0) - (x < 0) || +x;\n }\n function toISOString$1() {\n // for ISO strings we do not use the normal bubbling rules:\n // * milliseconds bubble up until they become hours\n // * days do not bubble at all\n // * months bubble up until they become years\n // This is because there is no context-free conversion between hours and days\n // (think of clock changes)\n // and also not between days and months (28-31 days per month)\n if (!this.isValid()) {\n return this.localeData().invalidDate();\n }\n var seconds = abs$1(this._milliseconds) / 1000,\n days = abs$1(this._days),\n months = abs$1(this._months),\n minutes,\n hours,\n years,\n s,\n total = this.asSeconds(),\n totalSign,\n ymSign,\n daysSign,\n hmsSign;\n if (!total) {\n // this is the same as C#'s (Noda) and python (isodate)...\n // but not other JS (goog.date)\n return 'P0D';\n }\n\n // 3600 seconds -> 60 minutes -> 1 hour\n minutes = absFloor(seconds / 60);\n hours = absFloor(minutes / 60);\n seconds %= 60;\n minutes %= 60;\n\n // 12 months -> 1 year\n years = absFloor(months / 12);\n months %= 12;\n\n // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js\n s = seconds ? seconds.toFixed(3).replace(/\\.?0+$/, '') : '';\n totalSign = total < 0 ? '-' : '';\n ymSign = sign(this._months) !== sign(total) ? '-' : '';\n daysSign = sign(this._days) !== sign(total) ? '-' : '';\n hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : '';\n return totalSign + 'P' + (years ? ymSign + years + 'Y' : '') + (months ? ymSign + months + 'M' : '') + (days ? daysSign + days + 'D' : '') + (hours || minutes || seconds ? 'T' : '') + (hours ? hmsSign + hours + 'H' : '') + (minutes ? hmsSign + minutes + 'M' : '') + (seconds ? hmsSign + s + 'S' : '');\n }\n var proto$2 = Duration.prototype;\n proto$2.isValid = isValid$1;\n proto$2.abs = abs;\n proto$2.add = add$1;\n proto$2.subtract = subtract$1;\n proto$2.as = as;\n proto$2.asMilliseconds = asMilliseconds;\n proto$2.asSeconds = asSeconds;\n proto$2.asMinutes = asMinutes;\n proto$2.asHours = asHours;\n proto$2.asDays = asDays;\n proto$2.asWeeks = asWeeks;\n proto$2.asMonths = asMonths;\n proto$2.asQuarters = asQuarters;\n proto$2.asYears = asYears;\n proto$2.valueOf = valueOf$1;\n proto$2._bubble = bubble;\n proto$2.clone = clone$1;\n proto$2.get = get$2;\n proto$2.milliseconds = milliseconds;\n proto$2.seconds = seconds;\n proto$2.minutes = minutes;\n proto$2.hours = hours;\n proto$2.days = days;\n proto$2.weeks = weeks;\n proto$2.months = months;\n proto$2.years = years;\n proto$2.humanize = humanize;\n proto$2.toISOString = toISOString$1;\n proto$2.toString = toISOString$1;\n proto$2.toJSON = toISOString$1;\n proto$2.locale = locale;\n proto$2.localeData = localeData;\n proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1);\n proto$2.lang = lang;\n\n // FORMATTING\n\n addFormatToken('X', 0, 0, 'unix');\n addFormatToken('x', 0, 0, 'valueOf');\n\n // PARSING\n\n addRegexToken('x', matchSigned);\n addRegexToken('X', matchTimestamp);\n addParseToken('X', function (input, array, config) {\n config._d = new Date(parseFloat(input) * 1000);\n });\n addParseToken('x', function (input, array, config) {\n config._d = new Date(toInt(input));\n });\n\n //! moment.js\n\n hooks.version = '2.30.1';\n setHookCallback(createLocal);\n hooks.fn = proto;\n hooks.min = min;\n hooks.max = max;\n hooks.now = now;\n hooks.utc = createUTC;\n hooks.unix = createUnix;\n hooks.months = listMonths;\n hooks.isDate = isDate;\n hooks.locale = getSetGlobalLocale;\n hooks.invalid = createInvalid;\n hooks.duration = createDuration;\n hooks.isMoment = isMoment;\n hooks.weekdays = listWeekdays;\n hooks.parseZone = createInZone;\n hooks.localeData = getLocale;\n hooks.isDuration = isDuration;\n hooks.monthsShort = listMonthsShort;\n hooks.weekdaysMin = listWeekdaysMin;\n hooks.defineLocale = defineLocale;\n hooks.updateLocale = updateLocale;\n hooks.locales = listLocales;\n hooks.weekdaysShort = listWeekdaysShort;\n hooks.normalizeUnits = normalizeUnits;\n hooks.relativeTimeRounding = getSetRelativeTimeRounding;\n hooks.relativeTimeThreshold = getSetRelativeTimeThreshold;\n hooks.calendarFormat = getCalendarFormat;\n hooks.prototype = proto;\n\n // currently HTML5 input type only supports 24-hour formats\n hooks.HTML5_FMT = {\n DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm',\n // \n DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss',\n // \n DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS',\n // \n DATE: 'YYYY-MM-DD',\n // \n TIME: 'HH:mm',\n // \n TIME_SECONDS: 'HH:mm:ss',\n // \n TIME_MS: 'HH:mm:ss.SSS',\n // \n WEEK: 'GGGG-[W]WW',\n // \n MONTH: 'YYYY-MM' // \n };\n return hooks;\n});",";\n(function (root, factory) {\n // eslint-disable-line no-extra-semi\n var deepDiff = factory(root);\n // eslint-disable-next-line no-undef\n if (typeof define === 'function' && define.amd) {\n // AMD\n define('DeepDiff', function () {\n // eslint-disable-line no-undef\n return deepDiff;\n });\n } else if (typeof exports === 'object' || typeof navigator === 'object' && navigator.product.match(/ReactNative/i)) {\n // Node.js or ReactNative\n module.exports = deepDiff;\n } else {\n // Browser globals\n var _deepdiff = root.DeepDiff;\n deepDiff.noConflict = function () {\n if (root.DeepDiff === deepDiff) {\n root.DeepDiff = _deepdiff;\n }\n return deepDiff;\n };\n root.DeepDiff = deepDiff;\n }\n})(this, function (root) {\n var validKinds = ['N', 'E', 'A', 'D'];\n\n // nodejs compatible on server side and in the browser.\n function inherits(ctor, superCtor) {\n ctor.super_ = superCtor;\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n }\n function Diff(kind, path) {\n Object.defineProperty(this, 'kind', {\n value: kind,\n enumerable: true\n });\n if (path && path.length) {\n Object.defineProperty(this, 'path', {\n value: path,\n enumerable: true\n });\n }\n }\n function DiffEdit(path, origin, value) {\n DiffEdit.super_.call(this, 'E', path);\n Object.defineProperty(this, 'lhs', {\n value: origin,\n enumerable: true\n });\n Object.defineProperty(this, 'rhs', {\n value: value,\n enumerable: true\n });\n }\n inherits(DiffEdit, Diff);\n function DiffNew(path, value) {\n DiffNew.super_.call(this, 'N', path);\n Object.defineProperty(this, 'rhs', {\n value: value,\n enumerable: true\n });\n }\n inherits(DiffNew, Diff);\n function DiffDeleted(path, value) {\n DiffDeleted.super_.call(this, 'D', path);\n Object.defineProperty(this, 'lhs', {\n value: value,\n enumerable: true\n });\n }\n inherits(DiffDeleted, Diff);\n function DiffArray(path, index, item) {\n DiffArray.super_.call(this, 'A', path);\n Object.defineProperty(this, 'index', {\n value: index,\n enumerable: true\n });\n Object.defineProperty(this, 'item', {\n value: item,\n enumerable: true\n });\n }\n inherits(DiffArray, Diff);\n function arrayRemove(arr, from, to) {\n var rest = arr.slice((to || from) + 1 || arr.length);\n arr.length = from < 0 ? arr.length + from : from;\n arr.push.apply(arr, rest);\n return arr;\n }\n function realTypeOf(subject) {\n var type = typeof subject;\n if (type !== 'object') {\n return type;\n }\n if (subject === Math) {\n return 'math';\n } else if (subject === null) {\n return 'null';\n } else if (Array.isArray(subject)) {\n return 'array';\n } else if (Object.prototype.toString.call(subject) === '[object Date]') {\n return 'date';\n } else if (typeof subject.toString === 'function' && /^\\/.*\\//.test(subject.toString())) {\n return 'regexp';\n }\n return 'object';\n }\n\n // http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/\n function hashThisString(string) {\n var hash = 0;\n if (string.length === 0) {\n return hash;\n }\n for (var i = 0; i < string.length; i++) {\n var char = string.charCodeAt(i);\n hash = (hash << 5) - hash + char;\n hash = hash & hash; // Convert to 32bit integer\n }\n return hash;\n }\n\n // Gets a hash of the given object in an array order-independent fashion\n // also object key order independent (easier since they can be alphabetized)\n function getOrderIndependentHash(object) {\n var accum = 0;\n var type = realTypeOf(object);\n if (type === 'array') {\n object.forEach(function (item) {\n // Addition is commutative so this is order indep\n accum += getOrderIndependentHash(item);\n });\n var arrayString = '[type: array, hash: ' + accum + ']';\n return accum + hashThisString(arrayString);\n }\n if (type === 'object') {\n for (var key in object) {\n if (object.hasOwnProperty(key)) {\n var keyValueString = '[ type: object, key: ' + key + ', value hash: ' + getOrderIndependentHash(object[key]) + ']';\n accum += hashThisString(keyValueString);\n }\n }\n return accum;\n }\n\n // Non object, non array...should be good?\n var stringToHash = '[ type: ' + type + ' ; value: ' + object + ']';\n return accum + hashThisString(stringToHash);\n }\n function deepDiff(lhs, rhs, changes, prefilter, path, key, stack, orderIndependent) {\n changes = changes || [];\n path = path || [];\n stack = stack || [];\n var currentPath = path.slice(0);\n if (typeof key !== 'undefined' && key !== null) {\n if (prefilter) {\n if (typeof prefilter === 'function' && prefilter(currentPath, key)) {\n return;\n } else if (typeof prefilter === 'object') {\n if (prefilter.prefilter && prefilter.prefilter(currentPath, key)) {\n return;\n }\n if (prefilter.normalize) {\n var alt = prefilter.normalize(currentPath, key, lhs, rhs);\n if (alt) {\n lhs = alt[0];\n rhs = alt[1];\n }\n }\n }\n }\n currentPath.push(key);\n }\n\n // Use string comparison for regexes\n if (realTypeOf(lhs) === 'regexp' && realTypeOf(rhs) === 'regexp') {\n lhs = lhs.toString();\n rhs = rhs.toString();\n }\n var ltype = typeof lhs;\n var rtype = typeof rhs;\n var i, j, k, other;\n var ldefined = ltype !== 'undefined' || stack && stack.length > 0 && stack[stack.length - 1].lhs && Object.getOwnPropertyDescriptor(stack[stack.length - 1].lhs, key);\n var rdefined = rtype !== 'undefined' || stack && stack.length > 0 && stack[stack.length - 1].rhs && Object.getOwnPropertyDescriptor(stack[stack.length - 1].rhs, key);\n if (!ldefined && rdefined) {\n changes.push(new DiffNew(currentPath, rhs));\n } else if (!rdefined && ldefined) {\n changes.push(new DiffDeleted(currentPath, lhs));\n } else if (realTypeOf(lhs) !== realTypeOf(rhs)) {\n changes.push(new DiffEdit(currentPath, lhs, rhs));\n } else if (realTypeOf(lhs) === 'date' && lhs - rhs !== 0) {\n changes.push(new DiffEdit(currentPath, lhs, rhs));\n } else if (ltype === 'object' && lhs !== null && rhs !== null) {\n for (i = stack.length - 1; i > -1; --i) {\n if (stack[i].lhs === lhs) {\n other = true;\n break;\n }\n }\n if (!other) {\n stack.push({\n lhs: lhs,\n rhs: rhs\n });\n if (Array.isArray(lhs)) {\n // If order doesn't matter, we need to sort our arrays\n if (orderIndependent) {\n lhs.sort(function (a, b) {\n return getOrderIndependentHash(a) - getOrderIndependentHash(b);\n });\n rhs.sort(function (a, b) {\n return getOrderIndependentHash(a) - getOrderIndependentHash(b);\n });\n }\n i = rhs.length - 1;\n j = lhs.length - 1;\n while (i > j) {\n changes.push(new DiffArray(currentPath, i, new DiffNew(undefined, rhs[i--])));\n }\n while (j > i) {\n changes.push(new DiffArray(currentPath, j, new DiffDeleted(undefined, lhs[j--])));\n }\n for (; i >= 0; --i) {\n deepDiff(lhs[i], rhs[i], changes, prefilter, currentPath, i, stack, orderIndependent);\n }\n } else {\n var akeys = Object.keys(lhs);\n var pkeys = Object.keys(rhs);\n for (i = 0; i < akeys.length; ++i) {\n k = akeys[i];\n other = pkeys.indexOf(k);\n if (other >= 0) {\n deepDiff(lhs[k], rhs[k], changes, prefilter, currentPath, k, stack, orderIndependent);\n pkeys[other] = null;\n } else {\n deepDiff(lhs[k], undefined, changes, prefilter, currentPath, k, stack, orderIndependent);\n }\n }\n for (i = 0; i < pkeys.length; ++i) {\n k = pkeys[i];\n if (k) {\n deepDiff(undefined, rhs[k], changes, prefilter, currentPath, k, stack, orderIndependent);\n }\n }\n }\n stack.length = stack.length - 1;\n } else if (lhs !== rhs) {\n // lhs is contains a cycle at this element and it differs from rhs\n changes.push(new DiffEdit(currentPath, lhs, rhs));\n }\n } else if (lhs !== rhs) {\n if (!(ltype === 'number' && isNaN(lhs) && isNaN(rhs))) {\n changes.push(new DiffEdit(currentPath, lhs, rhs));\n }\n }\n }\n function observableDiff(lhs, rhs, observer, prefilter, orderIndependent) {\n var changes = [];\n deepDiff(lhs, rhs, changes, prefilter, null, null, null, orderIndependent);\n if (observer) {\n for (var i = 0; i < changes.length; ++i) {\n observer(changes[i]);\n }\n }\n return changes;\n }\n function orderIndependentDeepDiff(lhs, rhs, changes, prefilter, path, key, stack) {\n return deepDiff(lhs, rhs, changes, prefilter, path, key, stack, true);\n }\n function accumulateDiff(lhs, rhs, prefilter, accum) {\n var observer = accum ? function (difference) {\n if (difference) {\n accum.push(difference);\n }\n } : undefined;\n var changes = observableDiff(lhs, rhs, observer, prefilter);\n return accum ? accum : changes.length ? changes : undefined;\n }\n function accumulateOrderIndependentDiff(lhs, rhs, prefilter, accum) {\n var observer = accum ? function (difference) {\n if (difference) {\n accum.push(difference);\n }\n } : undefined;\n var changes = observableDiff(lhs, rhs, observer, prefilter, true);\n return accum ? accum : changes.length ? changes : undefined;\n }\n function applyArrayChange(arr, index, change) {\n if (change.path && change.path.length) {\n var it = arr[index],\n i,\n u = change.path.length - 1;\n for (i = 0; i < u; i++) {\n it = it[change.path[i]];\n }\n switch (change.kind) {\n case 'A':\n applyArrayChange(it[change.path[i]], change.index, change.item);\n break;\n case 'D':\n delete it[change.path[i]];\n break;\n case 'E':\n case 'N':\n it[change.path[i]] = change.rhs;\n break;\n }\n } else {\n switch (change.kind) {\n case 'A':\n applyArrayChange(arr[index], change.index, change.item);\n break;\n case 'D':\n arr = arrayRemove(arr, index);\n break;\n case 'E':\n case 'N':\n arr[index] = change.rhs;\n break;\n }\n }\n return arr;\n }\n function applyChange(target, source, change) {\n if (typeof change === 'undefined' && source && ~validKinds.indexOf(source.kind)) {\n change = source;\n }\n if (target && change && change.kind) {\n var it = target,\n i = -1,\n last = change.path ? change.path.length - 1 : 0;\n while (++i < last) {\n if (typeof it[change.path[i]] === 'undefined') {\n it[change.path[i]] = typeof change.path[i + 1] !== 'undefined' && typeof change.path[i + 1] === 'number' ? [] : {};\n }\n it = it[change.path[i]];\n }\n switch (change.kind) {\n case 'A':\n if (change.path && typeof it[change.path[i]] === 'undefined') {\n it[change.path[i]] = [];\n }\n applyArrayChange(change.path ? it[change.path[i]] : it, change.index, change.item);\n break;\n case 'D':\n delete it[change.path[i]];\n break;\n case 'E':\n case 'N':\n it[change.path[i]] = change.rhs;\n break;\n }\n }\n }\n function revertArrayChange(arr, index, change) {\n if (change.path && change.path.length) {\n // the structure of the object at the index has changed...\n var it = arr[index],\n i,\n u = change.path.length - 1;\n for (i = 0; i < u; i++) {\n it = it[change.path[i]];\n }\n switch (change.kind) {\n case 'A':\n revertArrayChange(it[change.path[i]], change.index, change.item);\n break;\n case 'D':\n it[change.path[i]] = change.lhs;\n break;\n case 'E':\n it[change.path[i]] = change.lhs;\n break;\n case 'N':\n delete it[change.path[i]];\n break;\n }\n } else {\n // the array item is different...\n switch (change.kind) {\n case 'A':\n revertArrayChange(arr[index], change.index, change.item);\n break;\n case 'D':\n arr[index] = change.lhs;\n break;\n case 'E':\n arr[index] = change.lhs;\n break;\n case 'N':\n arr = arrayRemove(arr, index);\n break;\n }\n }\n return arr;\n }\n function revertChange(target, source, change) {\n if (target && source && change && change.kind) {\n var it = target,\n i,\n u;\n u = change.path.length - 1;\n for (i = 0; i < u; i++) {\n if (typeof it[change.path[i]] === 'undefined') {\n it[change.path[i]] = {};\n }\n it = it[change.path[i]];\n }\n switch (change.kind) {\n case 'A':\n // Array was modified...\n // it will be an array...\n revertArrayChange(it[change.path[i]], change.index, change.item);\n break;\n case 'D':\n // Item was deleted...\n it[change.path[i]] = change.lhs;\n break;\n case 'E':\n // Item was edited...\n it[change.path[i]] = change.lhs;\n break;\n case 'N':\n // Item is new...\n delete it[change.path[i]];\n break;\n }\n }\n }\n function applyDiff(target, source, filter) {\n if (target && source) {\n var onChange = function (change) {\n if (!filter || filter(target, source, change)) {\n applyChange(target, source, change);\n }\n };\n observableDiff(target, source, onChange);\n }\n }\n Object.defineProperties(accumulateDiff, {\n diff: {\n value: accumulateDiff,\n enumerable: true\n },\n orderIndependentDiff: {\n value: accumulateOrderIndependentDiff,\n enumerable: true\n },\n observableDiff: {\n value: observableDiff,\n enumerable: true\n },\n orderIndependentObservableDiff: {\n value: orderIndependentDeepDiff,\n enumerable: true\n },\n orderIndepHash: {\n value: getOrderIndependentHash,\n enumerable: true\n },\n applyDiff: {\n value: applyDiff,\n enumerable: true\n },\n applyChange: {\n value: applyChange,\n enumerable: true\n },\n revertChange: {\n value: revertChange,\n enumerable: true\n },\n isConflict: {\n value: function () {\n return typeof $conflict !== 'undefined';\n },\n enumerable: true\n }\n });\n\n // hackish...\n accumulateDiff.DeepDiff = accumulateDiff;\n // ...but works with:\n // import DeepDiff from 'deep-diff'\n // import { DeepDiff } from 'deep-diff'\n // const DeepDiff = require('deep-diff');\n // const { DeepDiff } = require('deep-diff');\n\n if (root) {\n root.DeepDiff = accumulateDiff;\n }\n return accumulateDiff;\n});","/*!\n * jsoneditor.js\n *\n * @brief\n * JSONEditor is a web-based tool to view, edit, format, and validate JSON.\n * It has various modes such as a tree editor, a code editor, and a plain text\n * editor.\n *\n * Supported browsers: Chrome, Firefox, Safari, Opera, Internet Explorer 8+\n *\n * @license\n * Licensed under the Apache License, Version 2.0 (the \"License\"); you may not\n * use this file except in compliance with the License. You may obtain a copy\n * of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n *\n * Copyright (c) 2011-2023 Jos de Jong, http://jsoneditoronline.org\n *\n * @author Jos de Jong, \n * @version 9.10.5\n * @date 2023-12-21\n */\n!function (e, t) {\n \"object\" == typeof exports && \"object\" == typeof module ? module.exports = t() : \"function\" == typeof define && define.amd ? define([], t) : \"object\" == typeof exports ? exports.JSONEditor = t() : e.JSONEditor = t();\n}(self, function () {\n return n = {\n 897: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n x: function () {\n return r;\n }\n });\n var c = n(2602),\n h = n(9791),\n d = n(7907);\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function i(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, function (e) {\n e = function (e, t) {\n if (\"object\" !== o(e) || null === e) return e;\n var n = e[Symbol.toPrimitive];\n if (void 0 === n) return (\"string\" === t ? String : Number)(e);\n n = n.call(e, t || \"default\");\n if (\"object\" !== o(n)) return n;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }(e, \"string\");\n return \"symbol\" === o(e) ? e : String(e);\n }(i.key), i);\n }\n }\n var r = function () {\n function l(t, e) {\n if (!(this instanceof l)) throw new TypeError(\"Cannot call a class as a function\");\n this.dom = {};\n var h = this,\n n = this.dom,\n e = (this.anchor = void 0, this.items = t, this.eventListeners = {}, this.selection = void 0, this.onClose = e ? e.close : void 0, this.limitHeight = !!e && e.limitHeight, document.createElement(\"div\")),\n i = (e.className = \"jsoneditor-contextmenu-root\", n.root = e, document.createElement(\"div\")),\n e = (i.className = \"jsoneditor-contextmenu\", n.menu = i, e.appendChild(i), document.createElement(\"ul\")),\n i = (e.className = \"jsoneditor-menu\", i.appendChild(e), n.list = e, n.items = [], document.createElement(\"button\")),\n n = (i.type = \"button\", n.focusButton = i, document.createElement(\"li\"));\n n.style.overflow = \"hidden\", n.style.height = \"0\", n.appendChild(i), e.appendChild(n), function a(l, c, e) {\n e.forEach(function (t) {\n var n, e, i, o, r, s;\n \"separator\" === t.type ? ((r = document.createElement(\"div\")).className = \"jsoneditor-separator\", (e = document.createElement(\"li\")).appendChild(r), l.appendChild(e)) : (n = {}, r = document.createElement(\"li\"), l.appendChild(r), (e = document.createElement(\"button\")).type = \"button\", e.className = t.className, n.button = e, t.title && (e.title = t.title), t.click && (e.onclick = function (e) {\n e.preventDefault(), h.hide(), t.click();\n }), r.appendChild(e), t.submenu ? ((o = document.createElement(\"div\")).className = \"jsoneditor-icon\", e.appendChild(o), (o = document.createElement(\"div\")).className = \"jsoneditor-text\" + (t.click ? \"\" : \" jsoneditor-right-margin\"), o.appendChild(document.createTextNode(t.text)), e.appendChild(o), (i = t.click ? (e.className += \" jsoneditor-default\", (o = document.createElement(\"button\")).type = \"button\", (n.buttonExpand = o).className = \"jsoneditor-expand\", (s = document.createElement(\"div\")).className = \"jsoneditor-expand\", o.appendChild(s), r.appendChild(o), t.submenuTitle && (o.title = t.submenuTitle), o) : ((s = document.createElement(\"div\")).className = \"jsoneditor-expand\", e.appendChild(s), e)).onclick = function (e) {\n e.preventDefault(), h._onExpandItem(n), i.focus();\n }, n.subItems = o = [], s = document.createElement(\"ul\"), (n.ul = s).className = \"jsoneditor-menu\", s.style.height = \"0\", r.appendChild(s), a(s, o, t.submenu)) : ((r = document.createElement(\"div\")).className = \"jsoneditor-icon\", e.appendChild(r), (s = document.createElement(\"div\")).className = \"jsoneditor-text\", s.appendChild(document.createTextNode((0, d.Iu)(t.text))), e.appendChild(s)), c.push(n));\n });\n }(e, this.dom.items, t), this.maxHeight = 0, t.forEach(function (e) {\n e = 24 * (t.length + (e.submenu ? e.submenu.length : 0));\n h.maxHeight = Math.max(h.maxHeight, e);\n });\n }\n var e, t, n;\n return e = l, (t = [{\n key: \"_getVisibleButtons\",\n value: function () {\n var t = [],\n n = this;\n return this.dom.items.forEach(function (e) {\n t.push(e.button), e.buttonExpand && t.push(e.buttonExpand), e.subItems && e === n.expandedItem && e.subItems.forEach(function (e) {\n t.push(e.button), e.buttonExpand && t.push(e.buttonExpand);\n });\n }), t;\n }\n }, {\n key: \"show\",\n value: function (e, t, n) {\n this.hide();\n var i = !0,\n o = e.parentNode,\n r = e.getBoundingClientRect(),\n o = o.getBoundingClientRect(),\n s = t.getBoundingClientRect(),\n a = this,\n t = (this.dom.absoluteAnchor = (0, c.w)(e, t, function () {\n a.hide();\n }), r.bottom + this.maxHeight < s.bottom || r.top - this.maxHeight > s.top && (i = !1), n ? 0 : r.top - o.top);\n i ? (n = e.offsetHeight, this.dom.menu.style.left = \"0\", this.dom.menu.style.top = t + n + \"px\", this.dom.menu.style.bottom = \"\") : (this.dom.menu.style.left = \"0\", this.dom.menu.style.top = \"\", this.dom.menu.style.bottom = \"0px\"), this.limitHeight && (o = i ? s.bottom - r.bottom - 10 : r.top - s.top - 10, this.dom.list.style.maxHeight = o + \"px\", this.dom.list.style.overflowY = \"auto\"), this.dom.absoluteAnchor.appendChild(this.dom.root), this.selection = (0, h.getSelection)(), this.anchor = e, setTimeout(function () {\n a.dom.focusButton.focus();\n }, 0), l.visibleMenu && l.visibleMenu.hide(), l.visibleMenu = this;\n }\n }, {\n key: \"hide\",\n value: function () {\n this.dom.absoluteAnchor && (this.dom.absoluteAnchor.destroy(), delete this.dom.absoluteAnchor), this.dom.root.parentNode && (this.dom.root.parentNode.removeChild(this.dom.root), this.onClose) && this.onClose(), l.visibleMenu === this && (l.visibleMenu = void 0);\n }\n }, {\n key: \"_onExpandItem\",\n value: function (n) {\n var i,\n o = this,\n e = n === this.expandedItem,\n t = this.expandedItem;\n t && (t.ul.style.height = \"0\", t.ul.style.padding = \"\", setTimeout(function () {\n o.expandedItem !== t && (t.ul.style.display = \"\", h.removeClassName)(t.ul.parentNode, \"jsoneditor-selected\");\n }, 300), this.expandedItem = void 0), e || ((i = n.ul).style.display = \"block\", i.clientHeight, setTimeout(function () {\n if (o.expandedItem === n) {\n for (var e = 0, t = 0; t < i.childNodes.length; t++) e += i.childNodes[t].clientHeight;\n i.style.height = e + \"px\", i.style.padding = \"5px 10px\";\n }\n }, 0), (0, h.addClassName)(i.parentNode, \"jsoneditor-selected\"), this.expandedItem = n);\n }\n }, {\n key: \"_onKeyDown\",\n value: function (e) {\n var t,\n n,\n i,\n o,\n r = e.target,\n s = e.which,\n a = !1;\n 27 === s ? (this.selection && (0, h.setSelection)(this.selection), this.anchor && this.anchor.focus(), this.hide(), a = !0) : 9 === s ? e.shiftKey ? 0 === (n = (t = this._getVisibleButtons()).indexOf(r)) && (t[t.length - 1].focus(), a = !0) : (n = (t = this._getVisibleButtons()).indexOf(r)) === t.length - 1 && (t[0].focus(), a = !0) : 37 === s ? (\"jsoneditor-expand\" === r.className && (n = (t = this._getVisibleButtons()).indexOf(r), i = t[n - 1]) && i.focus(), a = !0) : 38 === s ? (n = (t = this._getVisibleButtons()).indexOf(r), (i = (i = (i = t[n - 1]) && \"jsoneditor-expand\" === i.className ? t[n - 2] : i) || t[t.length - 1]) && i.focus(), a = !0) : 39 === s ? (n = (t = this._getVisibleButtons()).indexOf(r), (o = t[n + 1]) && \"jsoneditor-expand\" === o.className && o.focus(), a = !0) : 40 === s && (n = (t = this._getVisibleButtons()).indexOf(r), (o = (o = (o = t[n + 1]) && \"jsoneditor-expand\" === o.className ? t[n + 2] : o) || t[0]) && (o.focus(), a = !0), a = !0), a && (e.stopPropagation(), e.preventDefault());\n }\n }]) && i(e.prototype, t), n && i(e, n), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), l;\n }();\n r.visibleMenu = void 0;\n },\n 6436: function (e, t, n) {\n \"use strict\";\n\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function r(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, function (e) {\n e = function (e, t) {\n if (\"object\" !== o(e) || null === e) return e;\n var n = e[Symbol.toPrimitive];\n if (void 0 === n) return (\"string\" === t ? String : Number)(e);\n n = n.call(e, t || \"default\");\n if (\"object\" !== o(n)) return n;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }(e, \"string\");\n return \"symbol\" === o(e) ? e : String(e);\n }(i.key), i);\n }\n }\n n.d(t, {\n Q: function () {\n return i;\n }\n });\n var i = function () {\n function n(e) {\n if (!(this instanceof n)) throw new TypeError(\"Cannot call a class as a function\");\n this.errorTableVisible = e.errorTableVisible, this.onToggleVisibility = e.onToggleVisibility, this.onFocusLine = e.onFocusLine || function () {}, this.onChangeHeight = e.onChangeHeight, this.dom = {};\n var e = document.createElement(\"div\"),\n t = (e.className = \"jsoneditor-validation-errors-container\", this.dom.validationErrorsContainer = e, document.createElement(\"div\")),\n e = (t.style.display = \"none\", t.className = \"jsoneditor-additional-errors fadein\", t.textContent = \"Scroll for more ▿\", this.dom.additionalErrorsIndication = t, e.appendChild(t), document.createElement(\"span\")),\n t = (e.className = \"jsoneditor-validation-error-icon\", e.style.display = \"none\", this.dom.validationErrorIcon = e, document.createElement(\"span\"));\n t.className = \"jsoneditor-validation-error-count\", t.style.display = \"none\", this.dom.validationErrorCount = t, this.dom.parseErrorIndication = document.createElement(\"span\"), this.dom.parseErrorIndication.className = \"jsoneditor-parse-error-icon\", this.dom.parseErrorIndication.style.display = \"none\";\n }\n var e, t, i;\n return e = n, (t = [{\n key: \"getErrorTable\",\n value: function () {\n return this.dom.validationErrorsContainer;\n }\n }, {\n key: \"getErrorCounter\",\n value: function () {\n return this.dom.validationErrorCount;\n }\n }, {\n key: \"getWarningIcon\",\n value: function () {\n return this.dom.validationErrorIcon;\n }\n }, {\n key: \"getErrorIcon\",\n value: function () {\n return this.dom.parseErrorIndication;\n }\n }, {\n key: \"toggleTableVisibility\",\n value: function () {\n this.errorTableVisible = !this.errorTableVisible, this.onToggleVisibility(this.errorTableVisible);\n }\n }, {\n key: \"setErrors\",\n value: function (e, r) {\n var s,\n t,\n a = this,\n n = (this.dom.validationErrors && (this.dom.validationErrors.parentNode.removeChild(this.dom.validationErrors), this.dom.validationErrors = null, this.dom.additionalErrorsIndication.style.display = \"none\"), this.errorTableVisible && 0 < e.length ? ((n = document.createElement(\"div\")).className = \"jsoneditor-validation-errors\", (t = document.createElement(\"table\")).className = \"jsoneditor-text-errors\", n.appendChild(t), s = document.createElement(\"tbody\"), t.appendChild(s), e.forEach(function (t) {\n isNaN(t.line) ? t.dataPath && (n = r.find(function (e) {\n return e.path === t.dataPath;\n })) && (e = n.line + 1) : e = t.line;\n var e,\n n = document.createElement(\"tr\"),\n i = (n.className = isNaN(e) ? \"\" : \"jump-to-line\", \"error\" === t.type ? n.className += \" parse-error\" : n.className += \" validation-error\", document.createElement(\"td\")),\n o = document.createElement(\"button\"),\n o = (o.className = \"jsoneditor-schema-error\", i.appendChild(o), n.appendChild(i), document.createElement(\"td\"));\n o.style = \"white-space: nowrap;\", o.textContent = isNaN(e) ? \"\" : \"Ln \" + e, n.appendChild(o), \"string\" == typeof t ? ((i = document.createElement(\"td\")).colSpan = 2, (o = document.createElement(\"pre\")).appendChild(document.createTextNode(t)), i.appendChild(o), n.appendChild(i)) : ((o = document.createElement(\"td\")).appendChild(document.createTextNode(t.dataPath || \"\")), n.appendChild(o), i = document.createElement(\"td\"), (o = document.createElement(\"pre\")).appendChild(document.createTextNode(t.message.replace(/
/gi, \"\\n\"))), i.appendChild(o), n.appendChild(i)), n.onclick = function () {\n a.onFocusLine(e);\n }, s.appendChild(n);\n }), this.dom.validationErrors = n, this.dom.validationErrorsContainer.appendChild(n), this.dom.additionalErrorsIndication.title = e.length + \" errors total\", this.dom.validationErrorsContainer.clientHeight < this.dom.validationErrorsContainer.scrollHeight ? (this.dom.additionalErrorsIndication.style.display = \"block\", this.dom.validationErrorsContainer.onscroll = function () {\n a.dom.additionalErrorsIndication.style.display = 0 < a.dom.validationErrorsContainer.clientHeight && 0 === a.dom.validationErrorsContainer.scrollTop ? \"block\" : \"none\";\n }) : this.dom.validationErrorsContainer.onscroll = void 0, t = this.dom.validationErrorsContainer.clientHeight + (this.dom.statusBar ? this.dom.statusBar.clientHeight : 0), this.onChangeHeight(t)) : this.onChangeHeight(0), e.filter(function (e) {\n return \"error\" !== e.type;\n }).length);\n 0 < n ? (this.dom.validationErrorCount.style.display = \"inline\", this.dom.validationErrorCount.innerText = n, this.dom.validationErrorCount.onclick = this.toggleTableVisibility.bind(this), this.dom.validationErrorIcon.style.display = \"inline\", this.dom.validationErrorIcon.title = n + \" schema validation error(s) found\", this.dom.validationErrorIcon.onclick = this.toggleTableVisibility.bind(this)) : (this.dom.validationErrorCount.style.display = \"none\", this.dom.validationErrorIcon.style.display = \"none\"), e.some(function (e) {\n return \"error\" === e.type;\n }) ? (t = e[0].line, this.dom.parseErrorIndication.style.display = \"block\", this.dom.parseErrorIndication.title = isNaN(t) ? \"parse error - check that the json is valid\" : \"parse error on line \" + t, this.dom.parseErrorIndication.onclick = this.toggleTableVisibility.bind(this)) : this.dom.parseErrorIndication.style.display = \"none\";\n }\n }]) && r(e.prototype, t), i && r(e, i), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), n;\n }();\n },\n 2474: function (e, t, n) {\n \"use strict\";\n\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function r(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, function (e) {\n e = function (e, t) {\n if (\"object\" !== o(e) || null === e) return e;\n var n = e[Symbol.toPrimitive];\n if (void 0 === n) return (\"string\" === t ? String : Number)(e);\n n = n.call(e, t || \"default\");\n if (\"object\" !== o(n)) return n;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }(e, \"string\");\n return \"symbol\" === o(e) ? e : String(e);\n }(i.key), i);\n }\n }\n n.d(t, {\n R: function () {\n return i;\n }\n });\n var i = function () {\n function t(e) {\n if (!(this instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n if (this.target = e.target || null, !this.target) throw new Error('FocusTracker constructor called without a \"target\" to track.');\n this.onFocus = \"function\" == typeof e.onFocus ? e.onFocus : null, this.onBlur = \"function\" == typeof e.onBlur ? e.onBlur : null, this._onClick = this._onEvent.bind(this), this._onKeyUp = function (e) {\n 9 !== e.which && 9 !== e.keyCode || this._onEvent(e);\n }.bind(this), this._onBlur = this._onEvent.bind(this), this.focusFlag = !1, this.firstEventFlag = !0, (this.onFocus || this.onBlur) && (document.addEventListener(\"click\", this._onClick), document.addEventListener(\"keyup\", this._onKeyUp), document.addEventListener(\"blur\", this._onBlur));\n }\n var e, n, i;\n return e = t, (n = [{\n key: \"destroy\",\n value: function () {\n document.removeEventListener(\"click\", this._onClick), document.removeEventListener(\"keyup\", this._onKeyUp), document.removeEventListener(\"blur\", this._onBlur), this._onEvent({\n target: document.body\n });\n }\n }, {\n key: \"_onEvent\",\n value: function (e) {\n e = e.target, e = e === this.target || !(!this.target.contains(e) && !this.target.contains(document.activeElement));\n e ? this.focusFlag || (this.onFocus && this.onFocus({\n type: \"focus\",\n target: this.target\n }), this.focusFlag = !0) : (this.focusFlag || this.firstEventFlag) && (this.onBlur && this.onBlur({\n type: \"blur\",\n target: this.target\n }), this.focusFlag = !1, this.firstEventFlag) && (this.firstEventFlag = !1);\n }\n }]) && r(e.prototype, n), i && r(e, i), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), t;\n }();\n },\n 3161: function (e, t, o) {\n \"use strict\";\n\n var n = o(8170),\n i = o(8037),\n r = o(8038).treeModeMixins,\n s = o(8458).textModeMixins,\n a = o(341).previewModeMixins,\n l = o(9791),\n c = l.clear,\n h = l.extend,\n d = l.getInnerText,\n u = l.getInternetExplorerVersion,\n g = l.parse,\n l = o(2744).tryRequireAjv,\n p = o(2558).showTransformModal,\n m = o(6210).showSortModal,\n f = l();\n function C(e, t, n) {\n if (!(this instanceof C)) throw new Error('JSONEditor constructor called without \"new\".');\n var i = u();\n if (-1 !== i && i < 9) throw new Error(\"Unsupported browser, IE9 or newer required. Please install the newest version of your browser.\");\n t && (t.error && (console.warn('Option \"error\" has been renamed to \"onError\"'), t.onError = t.error, delete t.error), t.change && (console.warn('Option \"change\" has been renamed to \"onChange\"'), t.onChange = t.change, delete t.change), t.editable && (console.warn('Option \"editable\" has been renamed to \"onEditable\"'), t.onEditable = t.editable, delete t.editable), t.onChangeJSON && (\"text\" === t.mode || \"code\" === t.mode || t.modes && (-1 !== t.modes.indexOf(\"text\") || -1 !== t.modes.indexOf(\"code\"))) && console.warn('Option \"onChangeJSON\" is not applicable to modes \"text\" and \"code\". Use \"onChangeText\" or \"onChange\" instead.'), t) && Object.keys(t).forEach(function (e) {\n -1 === C.VALID_OPTIONS.indexOf(e) && console.warn('Unknown option \"' + e + '\". This option will be ignored');\n }), arguments.length && this._create(e, t, n);\n }\n \"undefined\" == typeof Promise && console.error(\"Promise undefined. Please load a Promise polyfill in the browser in order to use JSONEditor\"), C.modes = {}, C.prototype.DEBOUNCE_INTERVAL = 150, C.VALID_OPTIONS = [\"ajv\", \"schema\", \"schemaRefs\", \"templates\", \"ace\", \"theme\", \"autocomplete\", \"onChange\", \"onChangeJSON\", \"onChangeText\", \"onExpand\", \"onEditable\", \"onError\", \"onEvent\", \"onModeChange\", \"onNodeName\", \"onValidate\", \"onCreateMenu\", \"onSelectionChange\", \"onTextSelectionChange\", \"onClassName\", \"onFocus\", \"onBlur\", \"colorPicker\", \"onColorPicker\", \"timestampTag\", \"timestampFormat\", \"escapeUnicode\", \"history\", \"search\", \"mode\", \"modes\", \"name\", \"indentation\", \"sortObjectKeys\", \"navigationBar\", \"statusBar\", \"mainMenuBar\", \"languages\", \"language\", \"enableSort\", \"enableTransform\", \"limitDragging\", \"maxVisibleChilds\", \"onValidationError\", \"modalAnchor\", \"popupAnchor\", \"createQuery\", \"executeQuery\", \"queryDescription\", \"allowSchemaSuggestions\", \"showErrorTable\"], C.prototype._create = function (e, t, n) {\n this.container = e, this.options = t || {}, this.json = n || {};\n e = this.options.mode || this.options.modes && this.options.modes[0] || \"tree\";\n this.setMode(e);\n }, C.prototype.destroy = function () {}, C.prototype.set = function (e) {\n this.json = e;\n }, C.prototype.get = function () {\n return this.json;\n }, C.prototype.setText = function (e) {\n this.json = g(e);\n }, C.prototype.getText = function () {\n return JSON.stringify(this.json);\n }, C.prototype.setName = function (e) {\n this.options || (this.options = {}), this.options.name = e;\n }, C.prototype.getName = function () {\n return this.options && this.options.name;\n }, C.prototype.setMode = function (e) {\n if (e !== this.options.mode || !this.create) {\n var t = this.container,\n n = h({}, this.options),\n i = n.mode,\n o = (n.mode = e, C.modes[e]);\n if (!o) throw new Error('Unknown mode \"' + n.mode + '\"');\n var r = \"text\" === o.data,\n s = this.getName(),\n a = this[r ? \"getText\" : \"get\"]();\n if (this.destroy(), c(this), h(this, o.mixin), this.create(t, n), this.setName(s), this[r ? \"setText\" : \"set\"](a), \"function\" == typeof o.load) try {\n o.load.call(this);\n } catch (e) {\n console.error(e);\n }\n if (\"function\" == typeof n.onModeChange && e !== i) try {\n n.onModeChange(e, i);\n } catch (e) {\n console.error(e);\n }\n }\n }, C.prototype.getMode = function () {\n return this.options.mode;\n }, C.prototype._onError = function (e) {\n this.options && \"function\" == typeof this.options.onError ? this.options.onError(e) : window.alert(e.toString());\n }, C.prototype.setSchema = function (e, t) {\n if (e) {\n var n;\n try {\n this.options.ajv ? n = this.options.ajv : ((n = f({\n allErrors: !0,\n verbose: !0,\n schemaId: \"auto\",\n $data: !0\n })).addMetaSchema(o(7171)), n.addMetaSchema(o(6273)));\n } catch (e) {\n console.warn(\"Failed to create an instance of Ajv, JSON Schema validation is not available. Please use a JSONEditor bundle including Ajv, or pass an instance of Ajv as via the configuration option `ajv`.\");\n }\n if (n) {\n if (t) {\n for (var i in t) n.removeSchema(i), t[i] && n.addSchema(t[i], i);\n this.options.schemaRefs = t;\n }\n this.validateSchema = n.compile(e), this.options.schema = e, this.options.schemaRefs = t, this.validate();\n }\n } else this.validateSchema = null, this.options.schema = null, this.options.schemaRefs = null, this.validate();\n this.refresh(), \"function\" == typeof this._onSchemaChange && this._onSchemaChange(e, t);\n }, C.prototype.validate = function () {}, C.prototype.refresh = function () {}, (C.registerMode = function (e) {\n var t;\n if (Array.isArray(e)) for (o = 0; o < e.length; o++) C.registerMode(e[o]);else {\n if (!(\"mode\" in e)) throw new Error('Property \"mode\" missing');\n if (!(\"mixin\" in e)) throw new Error('Property \"mixin\" missing');\n if (!(\"data\" in e)) throw new Error('Property \"data\" missing');\n var n = e.mode;\n if (n in C.modes) throw new Error('Mode \"' + n + '\" already registered');\n if (\"function\" != typeof e.mixin.create) throw new Error('Required function \"create\" missing on mixin');\n for (var i = [\"setMode\", \"registerMode\", \"modes\"], o = 0; o < i.length; o++) if ((t = i[o]) in e.mixin) throw new Error('Reserved property \"' + t + '\" not allowed in mixin');\n C.modes[n] = e;\n }\n })(r), C.registerMode(s), C.registerMode(a), C.ace = n, C.Ajv = f, C.VanillaPicker = i, C.showTransformModal = p, C.showSortModal = m, C.getInnerText = d, e.exports = C.default = C;\n },\n 6617: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n x: function () {\n return r;\n }\n });\n var u = n(897),\n g = n(7907);\n function o(e) {\n return (o = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function i(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, function (e) {\n e = function (e, t) {\n if (\"object\" !== o(e) || null === e) return e;\n var n = e[Symbol.toPrimitive];\n if (void 0 === n) return (\"string\" === t ? String : Number)(e);\n n = n.call(e, t || \"default\");\n if (\"object\" !== o(n)) return n;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }(e, \"string\");\n return \"symbol\" === o(e) ? e : String(e);\n }(i.key), i);\n }\n }\n var r = function () {\n function d(e, t, n, i) {\n if (!(this instanceof d)) throw new TypeError(\"Cannot call a class as a function\");\n for (var o = {\n code: {\n text: (0, g.Iu)(\"modeCodeText\"),\n title: (0, g.Iu)(\"modeCodeTitle\"),\n click: function () {\n i(\"code\");\n }\n },\n form: {\n text: (0, g.Iu)(\"modeFormText\"),\n title: (0, g.Iu)(\"modeFormTitle\"),\n click: function () {\n i(\"form\");\n }\n },\n text: {\n text: (0, g.Iu)(\"modeTextText\"),\n title: (0, g.Iu)(\"modeTextTitle\"),\n click: function () {\n i(\"text\");\n }\n },\n tree: {\n text: (0, g.Iu)(\"modeTreeText\"),\n title: (0, g.Iu)(\"modeTreeTitle\"),\n click: function () {\n i(\"tree\");\n }\n },\n view: {\n text: (0, g.Iu)(\"modeViewText\"),\n title: (0, g.Iu)(\"modeViewTitle\"),\n click: function () {\n i(\"view\");\n }\n },\n preview: {\n text: (0, g.Iu)(\"modePreviewText\"),\n title: (0, g.Iu)(\"modePreviewTitle\"),\n click: function () {\n i(\"preview\");\n }\n }\n }, r = [], s = 0; s < t.length; s++) {\n var a = t[s],\n l = o[a];\n if (!l) throw new Error('Unknown mode \"' + a + '\"');\n l.className = \"jsoneditor-type-modes\" + (n === a ? \" jsoneditor-selected\" : \"\"), r.push(l);\n }\n var c = o[n];\n if (!c) throw new Error('Unknown mode \"' + n + '\"');\n var c = c.text,\n h = document.createElement(\"button\"),\n c = (h.type = \"button\", h.className = \"jsoneditor-modes jsoneditor-separator\", h.textContent = c + \" ▾\", h.title = (0, g.Iu)(\"modeEditorTitle\"), h.onclick = function () {\n new u.x(r).show(h, e);\n }, document.createElement(\"div\"));\n c.className = \"jsoneditor-modes\", c.style.position = \"relative\", c.appendChild(h), e.appendChild(c), this.dom = {\n container: e,\n box: h,\n frame: c\n };\n }\n var e, t, n;\n return e = d, (t = [{\n key: \"focus\",\n value: function () {\n this.dom.box.focus();\n }\n }, {\n key: \"destroy\",\n value: function () {\n this.dom && this.dom.frame && this.dom.frame.parentNode && this.dom.frame.parentNode.removeChild(this.dom.frame), this.dom = null;\n }\n }]) && i(e.prototype, t), n && i(e, n), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), d;\n }();\n },\n 8170: function (e, t, n) {\n var i;\n if (window.ace) i = window.ace;else try {\n i = n(6225), n(4091), n(3330), n(4317);\n var o = n(7923);\n i.config.setModuleUrl(\"ace/mode/json_worker\", o);\n } catch (e) {}\n e.exports = i;\n },\n 4864: function () {\n window.ace.define(\"ace/theme/jsoneditor\", [\"require\", \"exports\", \"module\", \"ace/lib/dom\"], function (e, t, n) {\n t.isDark = !1, t.cssClass = \"ace-jsoneditor\", t.cssText = '.ace-jsoneditor .ace_gutter {\\nbackground: #ebebeb;\\ncolor: #333\\n}\\n\\n.ace-jsoneditor.ace_editor {\\nline-height: 1.3;\\nbackground-color: #fff;\\n}\\n.ace-jsoneditor .ace_print-margin {\\nwidth: 1px;\\nbackground: #e8e8e8\\n}\\n.ace-jsoneditor .ace_scroller {\\nbackground-color: #FFFFFF\\n}\\n.ace-jsoneditor .ace_text-layer {\\ncolor: gray\\n}\\n.ace-jsoneditor .ace_variable {\\ncolor: #1a1a1a\\n}\\n.ace-jsoneditor .ace_cursor {\\nborder-left: 2px solid #000000\\n}\\n.ace-jsoneditor .ace_overwrite-cursors .ace_cursor {\\nborder-left: 0px;\\nborder-bottom: 1px solid #000000\\n}\\n.ace-jsoneditor .ace_marker-layer .ace_selection {\\nbackground: lightgray\\n}\\n.ace-jsoneditor.ace_multiselect .ace_selection.ace_start {\\nbox-shadow: 0 0 3px 0px #FFFFFF;\\nborder-radius: 2px\\n}\\n.ace-jsoneditor .ace_marker-layer .ace_step {\\nbackground: rgb(255, 255, 0)\\n}\\n.ace-jsoneditor .ace_marker-layer .ace_bracket {\\nmargin: -1px 0 0 -1px;\\nborder: 1px solid #BFBFBF\\n}\\n.ace-jsoneditor .ace_marker-layer .ace_active-line {\\nbackground: #FFFBD1\\n}\\n.ace-jsoneditor .ace_gutter-active-line {\\nbackground-color : #dcdcdc\\n}\\n.ace-jsoneditor .ace_marker-layer .ace_selected-word {\\nborder: 1px solid lightgray\\n}\\n.ace-jsoneditor .ace_invisible {\\ncolor: #BFBFBF\\n}\\n.ace-jsoneditor .ace_keyword,\\n.ace-jsoneditor .ace_meta,\\n.ace-jsoneditor .ace_support.ace_constant.ace_property-value {\\ncolor: #AF956F\\n}\\n.ace-jsoneditor .ace_keyword.ace_operator {\\ncolor: #484848\\n}\\n.ace-jsoneditor .ace_keyword.ace_other.ace_unit {\\ncolor: #96DC5F\\n}\\n.ace-jsoneditor .ace_constant.ace_language {\\ncolor: darkorange\\n}\\n.ace-jsoneditor .ace_constant.ace_numeric {\\ncolor: red\\n}\\n.ace-jsoneditor .ace_constant.ace_character.ace_entity {\\ncolor: #BF78CC\\n}\\n.ace-jsoneditor .ace_invalid {\\ncolor: #FFFFFF;\\nbackground-color: #FF002A;\\n}\\n.ace-jsoneditor .ace_fold {\\nbackground-color: #AF956F;\\nborder-color: #000000\\n}\\n.ace-jsoneditor .ace_storage,\\n.ace-jsoneditor .ace_support.ace_class,\\n.ace-jsoneditor .ace_support.ace_function,\\n.ace-jsoneditor .ace_support.ace_other,\\n.ace-jsoneditor .ace_support.ace_type {\\ncolor: #C52727\\n}\\n.ace-jsoneditor .ace_string {\\ncolor: green\\n}\\n.ace-jsoneditor .ace_comment {\\ncolor: #BCC8BA\\n}\\n.ace-jsoneditor .ace_entity.ace_name.ace_tag,\\n.ace-jsoneditor .ace_entity.ace_other.ace_attribute-name {\\ncolor: #606060\\n}\\n.ace-jsoneditor .ace_markup.ace_underline {\\ntext-decoration: underline\\n}\\n.ace-jsoneditor .ace_indent-guide {\\nbackground: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y\\n}', e(\"../lib/dom\").importCssString(t.cssText, t.cssClass);\n });\n },\n 6589: function (e, t) {\n (n = {\n trace: function () {},\n yy: {},\n symbols_: {\n error: 2,\n JSONString: 3,\n STRING: 4,\n JSONNumber: 5,\n NUMBER: 6,\n JSONNullLiteral: 7,\n NULL: 8,\n JSONBooleanLiteral: 9,\n TRUE: 10,\n FALSE: 11,\n JSONText: 12,\n JSONValue: 13,\n EOF: 14,\n JSONObject: 15,\n JSONArray: 16,\n \"{\": 17,\n \"}\": 18,\n JSONMemberList: 19,\n JSONMember: 20,\n \":\": 21,\n \",\": 22,\n \"[\": 23,\n \"]\": 24,\n JSONElementList: 25,\n $accept: 0,\n $end: 1\n },\n terminals_: {\n 2: \"error\",\n 4: \"STRING\",\n 6: \"NUMBER\",\n 8: \"NULL\",\n 10: \"TRUE\",\n 11: \"FALSE\",\n 14: \"EOF\",\n 17: \"{\",\n 18: \"}\",\n 21: \":\",\n 22: \",\",\n 23: \"[\",\n 24: \"]\"\n },\n productions_: [0, [3, 1], [5, 1], [7, 1], [9, 1], [9, 1], [12, 2], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [13, 1], [15, 2], [15, 3], [20, 3], [19, 1], [19, 3], [16, 2], [16, 3], [25, 1], [25, 3]],\n performAction: function (e, t, n, i, o, r, s) {\n var a = r.length - 1;\n switch (o) {\n case 1:\n this.$ = e.replace(/\\\\(\\\\|\")/g, \"$1\").replace(/\\\\n/g, \"\\n\").replace(/\\\\r/g, \"\\r\").replace(/\\\\t/g, \"\\t\").replace(/\\\\v/g, \"\\v\").replace(/\\\\f/g, \"\\f\").replace(/\\\\b/g, \"\\b\");\n break;\n case 2:\n this.$ = Number(e);\n break;\n case 3:\n this.$ = null;\n break;\n case 4:\n this.$ = !0;\n break;\n case 5:\n this.$ = !1;\n break;\n case 6:\n return this.$ = r[a - 1];\n case 13:\n this.$ = {};\n break;\n case 14:\n this.$ = r[a - 1];\n break;\n case 15:\n this.$ = [r[a - 2], r[a]];\n break;\n case 16:\n this.$ = {}, this.$[r[a][0]] = r[a][1];\n break;\n case 17:\n this.$ = r[a - 2], r[a - 2][r[a][0]] = r[a][1];\n break;\n case 18:\n this.$ = [];\n break;\n case 19:\n this.$ = r[a - 1];\n break;\n case 20:\n this.$ = [r[a]];\n break;\n case 21:\n this.$ = r[a - 2], r[a - 2].push(r[a]);\n }\n },\n table: [{\n 3: 5,\n 4: [1, 12],\n 5: 6,\n 6: [1, 13],\n 7: 3,\n 8: [1, 9],\n 9: 4,\n 10: [1, 10],\n 11: [1, 11],\n 12: 1,\n 13: 2,\n 15: 7,\n 16: 8,\n 17: [1, 14],\n 23: [1, 15]\n }, {\n 1: [3]\n }, {\n 14: [1, 16]\n }, {\n 14: [2, 7],\n 18: [2, 7],\n 22: [2, 7],\n 24: [2, 7]\n }, {\n 14: [2, 8],\n 18: [2, 8],\n 22: [2, 8],\n 24: [2, 8]\n }, {\n 14: [2, 9],\n 18: [2, 9],\n 22: [2, 9],\n 24: [2, 9]\n }, {\n 14: [2, 10],\n 18: [2, 10],\n 22: [2, 10],\n 24: [2, 10]\n }, {\n 14: [2, 11],\n 18: [2, 11],\n 22: [2, 11],\n 24: [2, 11]\n }, {\n 14: [2, 12],\n 18: [2, 12],\n 22: [2, 12],\n 24: [2, 12]\n }, {\n 14: [2, 3],\n 18: [2, 3],\n 22: [2, 3],\n 24: [2, 3]\n }, {\n 14: [2, 4],\n 18: [2, 4],\n 22: [2, 4],\n 24: [2, 4]\n }, {\n 14: [2, 5],\n 18: [2, 5],\n 22: [2, 5],\n 24: [2, 5]\n }, {\n 14: [2, 1],\n 18: [2, 1],\n 21: [2, 1],\n 22: [2, 1],\n 24: [2, 1]\n }, {\n 14: [2, 2],\n 18: [2, 2],\n 22: [2, 2],\n 24: [2, 2]\n }, {\n 3: 20,\n 4: [1, 12],\n 18: [1, 17],\n 19: 18,\n 20: 19\n }, {\n 3: 5,\n 4: [1, 12],\n 5: 6,\n 6: [1, 13],\n 7: 3,\n 8: [1, 9],\n 9: 4,\n 10: [1, 10],\n 11: [1, 11],\n 13: 23,\n 15: 7,\n 16: 8,\n 17: [1, 14],\n 23: [1, 15],\n 24: [1, 21],\n 25: 22\n }, {\n 1: [2, 6]\n }, {\n 14: [2, 13],\n 18: [2, 13],\n 22: [2, 13],\n 24: [2, 13]\n }, {\n 18: [1, 24],\n 22: [1, 25]\n }, {\n 18: [2, 16],\n 22: [2, 16]\n }, {\n 21: [1, 26]\n }, {\n 14: [2, 18],\n 18: [2, 18],\n 22: [2, 18],\n 24: [2, 18]\n }, {\n 22: [1, 28],\n 24: [1, 27]\n }, {\n 22: [2, 20],\n 24: [2, 20]\n }, {\n 14: [2, 14],\n 18: [2, 14],\n 22: [2, 14],\n 24: [2, 14]\n }, {\n 3: 20,\n 4: [1, 12],\n 20: 29\n }, {\n 3: 5,\n 4: [1, 12],\n 5: 6,\n 6: [1, 13],\n 7: 3,\n 8: [1, 9],\n 9: 4,\n 10: [1, 10],\n 11: [1, 11],\n 13: 30,\n 15: 7,\n 16: 8,\n 17: [1, 14],\n 23: [1, 15]\n }, {\n 14: [2, 19],\n 18: [2, 19],\n 22: [2, 19],\n 24: [2, 19]\n }, {\n 3: 5,\n 4: [1, 12],\n 5: 6,\n 6: [1, 13],\n 7: 3,\n 8: [1, 9],\n 9: 4,\n 10: [1, 10],\n 11: [1, 11],\n 13: 31,\n 15: 7,\n 16: 8,\n 17: [1, 14],\n 23: [1, 15]\n }, {\n 18: [2, 17],\n 22: [2, 17]\n }, {\n 18: [2, 15],\n 22: [2, 15]\n }, {\n 22: [2, 21],\n 24: [2, 21]\n }],\n defaultActions: {\n 16: [2, 6]\n },\n parseError: function (e, t) {\n throw new Error(e);\n },\n parse: function (e) {\n var t = this,\n n = [0],\n i = [null],\n o = [],\n r = this.table,\n s = \"\",\n a = 0,\n l = 0,\n c = 0,\n h = (this.lexer.setInput(e), this.lexer.yy = this.yy, this.yy.lexer = this.lexer, void 0 === this.lexer.yylloc && (this.lexer.yylloc = {}), this.lexer.yylloc);\n function d() {\n var e = t.lexer.lex() || 1;\n return e = \"number\" != typeof e ? t.symbols_[e] || e : e;\n }\n o.push(h), \"function\" == typeof this.yy.parseError && (this.parseError = this.yy.parseError);\n for (var u, g, p, m, f, C, y, v, I, b = {};;) {\n if (p = n[n.length - 1], void 0 === (m = this.defaultActions[p] || (null == u && (u = d()), r[p] && r[p][u])) || !m.length || !m[0]) {\n if (!c) {\n for (f in v = [], r[p]) this.terminals_[f] && 2 < f && v.push(\"'\" + this.terminals_[f] + \"'\");\n var A = \"\",\n A = this.lexer.showPosition ? \"Parse error on line \" + (a + 1) + \":\\n\" + this.lexer.showPosition() + \"\\nExpecting \" + v.join(\", \") + \", got '\" + this.terminals_[u] + \"'\" : \"Parse error on line \" + (a + 1) + \": Unexpected \" + (1 == u ? \"end of input\" : \"'\" + (this.terminals_[u] || u) + \"'\");\n this.parseError(A, {\n text: this.lexer.match,\n token: this.terminals_[u] || u,\n line: this.lexer.yylineno,\n loc: h,\n expected: v\n });\n }\n if (3 == c) {\n if (1 == u) throw new Error(A || \"Parsing halted.\");\n l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, u = d();\n }\n for (;;) {\n if (2..toString() in r[p]) break;\n if (0 == p) throw new Error(A || \"Parsing halted.\");\n I = 1, n.length = n.length - 2 * I, i.length = i.length - I, o.length = o.length - I, p = n[n.length - 1];\n }\n g = u, u = 2, m = r[p = n[n.length - 1]] && r[p][2], c = 3;\n }\n if (m[0] instanceof Array && 1 < m.length) throw new Error(\"Parse Error: multiple actions possible at state: \" + p + \", token: \" + u);\n switch (m[0]) {\n case 1:\n n.push(u), i.push(this.lexer.yytext), o.push(this.lexer.yylloc), n.push(m[1]), u = null, g ? (u = g, g = null) : (l = this.lexer.yyleng, s = this.lexer.yytext, a = this.lexer.yylineno, h = this.lexer.yylloc, 0 < c && c--);\n break;\n case 2:\n if (C = this.productions_[m[1]][1], b.$ = i[i.length - C], b._$ = {\n first_line: o[o.length - (C || 1)].first_line,\n last_line: o[o.length - 1].last_line,\n first_column: o[o.length - (C || 1)].first_column,\n last_column: o[o.length - 1].last_column\n }, void 0 !== (y = this.performAction.call(b, s, l, a, this.yy, m[1], i, o))) return y;\n C && (n = n.slice(0, -1 * C * 2), i = i.slice(0, -1 * C), o = o.slice(0, -1 * C)), n.push(this.productions_[m[1]][0]), i.push(b.$), o.push(b._$), y = r[n[n.length - 2]][n[n.length - 1]], n.push(y);\n break;\n case 3:\n return !0;\n }\n }\n return !0;\n }\n }).lexer = {\n EOF: 1,\n parseError: function (e, t) {\n if (!this.yy.parseError) throw new Error(e);\n this.yy.parseError(e, t);\n },\n setInput: function (e) {\n return this._input = e, this._more = this._less = this.done = !1, this.yylineno = this.yyleng = 0, this.yytext = this.matched = this.match = \"\", this.conditionStack = [\"INITIAL\"], this.yylloc = {\n first_line: 1,\n first_column: 0,\n last_line: 1,\n last_column: 0\n }, this;\n },\n input: function () {\n var e = this._input[0];\n return this.yytext += e, this.yyleng++, this.match += e, this.matched += e, e.match(/\\n/) && this.yylineno++, this._input = this._input.slice(1), e;\n },\n unput: function (e) {\n return this._input = e + this._input, this;\n },\n more: function () {\n return this._more = !0, this;\n },\n less: function (e) {\n this._input = this.match.slice(e) + this._input;\n },\n pastInput: function () {\n var e = this.matched.substr(0, this.matched.length - this.match.length);\n return (20 < e.length ? \"...\" : \"\") + e.substr(-20).replace(/\\n/g, \"\");\n },\n upcomingInput: function () {\n var e = this.match;\n return e.length < 20 && (e += this._input.substr(0, 20 - e.length)), (e.substr(0, 20) + (20 < e.length ? \"...\" : \"\")).replace(/\\n/g, \"\");\n },\n showPosition: function () {\n var e = this.pastInput(),\n t = new Array(e.length + 1).join(\"-\");\n return e + this.upcomingInput() + \"\\n\" + t + \"^\";\n },\n next: function () {\n if (this.done) return this.EOF;\n this._input || (this.done = !0), this._more || (this.yytext = \"\", this.match = \"\");\n for (var e, t, n, i, o = this._currentRules(), r = 0; r < o.length && (!(t = this._input.match(this.rules[o[r]])) || e && !(t[0].length > e[0].length) || (e = t, n = r, this.options.flex)); r++);\n return e ? ((i = e[0].match(/\\n.*/g)) && (this.yylineno += i.length), this.yylloc = {\n first_line: this.yylloc.last_line,\n last_line: this.yylineno + 1,\n first_column: this.yylloc.last_column,\n last_column: i ? i[i.length - 1].length - 1 : this.yylloc.last_column + e[0].length\n }, this.yytext += e[0], this.match += e[0], this.yyleng = this.yytext.length, this._more = !1, this._input = this._input.slice(e[0].length), this.matched += e[0], i = this.performAction.call(this, this.yy, this, o[n], this.conditionStack[this.conditionStack.length - 1]), this.done && this._input && (this.done = !1), i || void 0) : \"\" === this._input ? this.EOF : void this.parseError(\"Lexical error on line \" + (this.yylineno + 1) + \". Unrecognized text.\\n\" + this.showPosition(), {\n text: \"\",\n token: null,\n line: this.yylineno\n });\n },\n lex: function () {\n var e = this.next();\n return void 0 !== e ? e : this.lex();\n },\n begin: function (e) {\n this.conditionStack.push(e);\n },\n popState: function () {\n return this.conditionStack.pop();\n },\n _currentRules: function () {\n return this.conditions[this.conditionStack[this.conditionStack.length - 1]].rules;\n },\n topState: function () {\n return this.conditionStack[this.conditionStack.length - 2];\n },\n pushState: function (e) {\n this.begin(e);\n },\n options: {},\n performAction: function (e, t, n, i) {\n switch (n) {\n case 0:\n break;\n case 1:\n return 6;\n case 2:\n return t.yytext = t.yytext.substr(1, t.yyleng - 2), 4;\n case 3:\n return 17;\n case 4:\n return 18;\n case 5:\n return 23;\n case 6:\n return 24;\n case 7:\n return 22;\n case 8:\n return 21;\n case 9:\n return 10;\n case 10:\n return 11;\n case 11:\n return 8;\n case 12:\n return 14;\n case 13:\n return \"INVALID\";\n }\n },\n rules: [/^(?:\\s+)/, /^(?:(-?([0-9]|[1-9][0-9]+))(\\.[0-9]+)?([eE][-+]?[0-9]+)?\\b)/, /^(?:\"(?:\\\\[\\\\\"bfnrt/]|\\\\u[a-fA-F0-9]{4}|[^\\\\\\0-\\x09\\x0a-\\x1f\"])*\")/, /^(?:\\{)/, /^(?:\\})/, /^(?:\\[)/, /^(?:\\])/, /^(?:,)/, /^(?::)/, /^(?:true\\b)/, /^(?:false\\b)/, /^(?:null\\b)/, /^(?:$)/, /^(?:.)/],\n conditions: {\n INITIAL: {\n rules: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],\n inclusive: !0\n }\n }\n };\n var n;\n t.parser = n, t.parse = n.parse.bind(n);\n },\n 3879: function (e) {\n \"use strict\";\n\n function i() {}\n i.prototype = {\n on: function (e, t) {\n this._events = this._events || {}, this._events[e] = this._events[e] || [], this._events[e].push(t);\n },\n off: function (e, t) {\n this._events = this._events || {}, e in this._events != !1 && this._events[e].splice(this._events[e].indexOf(t), 1);\n },\n emit: function (e) {\n if (this._events = this._events || {}, e in this._events != !1) for (var t = 0; t < this._events[e].length; t++) this._events[e][t].apply(this, Array.prototype.slice.call(arguments, 1));\n }\n }, i.mixin = function (e) {\n for (var t = [\"on\", \"off\", \"emit\"], n = 0; n < t.length; n++) \"function\" == typeof e ? e.prototype[t[n]] = i.prototype[t[n]] : e[t[n]] = i.prototype[t[n]];\n return e;\n };\n var u = {\n escapeRegExp: function (e) {\n var t = /[\\\\^$.*+?()[\\]{}|]/g,\n n = new RegExp(t.source);\n return e && n.test(e) ? e.replace(t, \"\\\\$&\") : e;\n },\n extend: function (e, t) {\n for (var n in t) {\n var i;\n t.hasOwnProperty(n) && ((i = t[n]) && \"[object Object]\" === Object.prototype.toString.call(i) ? (e[n] = e[n] || {}, u.extend(e[n], i)) : e[n] = i);\n }\n return e;\n },\n each: function (e, t, n) {\n if (\"[object Object]\" === Object.prototype.toString.call(e)) for (var i in e) Object.prototype.hasOwnProperty.call(e, i) && t.call(n, i, e[i], e);else for (var o = 0, r = e.length; o < r; o++) t.call(n, o, e[o], e);\n },\n createElement: function (e, t) {\n var n,\n i = document.createElement(e);\n if (t && \"[object Object]\" === Object.prototype.toString.call(t)) for (n in t) n in i ? i[n] = t[n] : \"html\" === n ? i.innerHTML = t[n] : i.setAttribute(n, t[n]);\n return i;\n },\n hasClass: function (e, t) {\n if (e) return e.classList ? e.classList.contains(t) : !!e.className && !!e.className.match(new RegExp(\"(\\\\s|^)\" + t + \"(\\\\s|$)\"));\n },\n addClass: function (e, t) {\n u.hasClass(e, t) || (e.classList ? e.classList.add(t) : e.className = e.className.trim() + \" \" + t);\n },\n removeClass: function (e, t) {\n u.hasClass(e, t) && (e.classList ? e.classList.remove(t) : e.className = e.className.replace(new RegExp(\"(^|\\\\s)\" + t.split(\" \").join(\"|\") + \"(\\\\s|$)\", \"gi\"), \" \"));\n },\n closest: function (e, t) {\n return e && e !== document.body && (t(e) ? e : u.closest(e.parentNode, t));\n },\n isInt: function (e) {\n return \"number\" == typeof e && isFinite(e) && Math.floor(e) === e;\n },\n debounce: function (i, o, r) {\n var s;\n return function () {\n var e = this,\n t = arguments,\n n = r && !s;\n clearTimeout(s), s = setTimeout(function () {\n s = null, r || i.apply(e, t);\n }, o), n && i.apply(e, t);\n };\n },\n rect: function (e, t) {\n var n = window,\n e = e.getBoundingClientRect(),\n i = t ? n.pageXOffset : 0,\n t = t ? n.pageYOffset : 0;\n return {\n bottom: e.bottom + t,\n height: e.height,\n left: e.left + i,\n right: e.right + i,\n top: e.top + t,\n width: e.width\n };\n },\n includes: function (e, t) {\n return -1 < e.indexOf(t);\n },\n startsWith: function (e, t) {\n return e.substr(0, t.length) === t;\n },\n truncate: function (e) {\n for (; e.firstChild;) e.removeChild(e.firstChild);\n }\n };\n function h(e, t) {\n return e.hasOwnProperty(t) && (!0 === e[t] || e[t].length);\n }\n function g(e, t, n) {\n e.parentNode ? e.parentNode.parentNode || t.appendChild(e.parentNode) : t.appendChild(e), u.removeClass(e, \"excluded\"), n || (e.textContent = e.textContent);\n }\n function o() {\n var n, e;\n this.items.length && (n = document.createDocumentFragment(), this.config.pagination ? (e = this.pages.slice(0, this.pageIndex), u.each(e, function (e, t) {\n u.each(t, function (e, t) {\n g(t, n, this.customOption);\n }, this);\n }, this)) : u.each(this.items, function (e, t) {\n g(t, n, this.customOption);\n }, this), n.childElementCount && (u.removeClass(this.items[this.navIndex], \"active\"), this.navIndex = (n.querySelector(\".selectr-option.selected\") || n.querySelector(\".selectr-option\")).idx, u.addClass(this.items[this.navIndex], \"active\")), this.tree.appendChild(n));\n }\n function d(e, t) {\n t = t || e;\n var n = {\n class: \"selectr-option\",\n role: \"treeitem\",\n \"aria-selected\": !1\n };\n return this.customOption ? n.html = this.config.renderOption(t) : n.textContent = e.textContent, (t = u.createElement(\"li\", n)).idx = e.idx, this.items.push(t), e.defaultSelected && this.defaultSelected.push(e.idx), e.disabled && (t.disabled = !0, u.addClass(t, \"disabled\")), t;\n }\n function r() {\n var n,\n e = this.tree,\n t = e.scrollTop;\n e.scrollHeight - e.offsetHeight <= t && this.pageIndex < this.pages.length && (n = document.createDocumentFragment(), u.each(this.pages[this.pageIndex], function (e, t) {\n g(t, n, this.customOption);\n }, this), e.appendChild(n), this.pageIndex++, this.emit(\"selectr.paginate\", {\n items: this.items.length,\n total: this.data.length,\n page: this.pageIndex,\n pages: this.pages.length\n }));\n }\n function s() {\n (this.config.searchable || this.config.taggable) && (this.input.value = null, this.searching = !1, this.config.searchable && u.removeClass(this.inputContainer, \"active\"), u.hasClass(this.container, \"notice\") && (u.removeClass(this.container, \"notice\"), u.addClass(this.container, \"open\"), this.input.focus()), u.each(this.items, function (e, t) {\n u.removeClass(t, \"excluded\"), this.customOption || (t.textContent = t.textContent);\n }, this));\n }\n function t(e, t) {\n if (!e) throw new Error(\"You must supply either a HTMLSelectElement or a CSS3 selector string.\");\n if (\"string\" == typeof (this.el = e) && (this.el = document.querySelector(e)), null === this.el) throw new Error(\"The element you passed to Selectr can not be found.\");\n if (\"select\" !== this.el.nodeName.toLowerCase()) throw new Error(\"The element you passed to Selectr is not a HTMLSelectElement.\");\n this.render(t);\n }\n t.prototype.render = function (e) {\n var t;\n this.rendered || ((this.el.selectr = this).config = u.extend({\n defaultSelected: !0,\n width: \"auto\",\n disabled: !1,\n disabledMobile: !1,\n searchable: !0,\n clearable: !1,\n sortSelected: !1,\n allowDeselect: !1,\n closeOnScroll: !1,\n nativeDropdown: !1,\n nativeKeyboard: !1,\n placeholder: \"Select an option...\",\n taggable: !1,\n tagPlaceholder: \"Enter a tag...\",\n messages: {\n noResults: \"No results.\",\n noOptions: \"No options available.\",\n maxSelections: \"A maximum of {max} items can be selected.\",\n tagDuplicate: \"That tag is already in use.\",\n searchPlaceholder: \"Search options...\"\n }\n }, e), this.originalType = this.el.type, this.originalIndex = this.el.tabIndex, this.defaultSelected = [], this.originalOptionCount = this.el.options.length, (this.config.multiple || this.config.taggable) && (this.el.multiple = !0), this.disabled = h(this.config, \"disabled\"), this.opened = !1, this.config.taggable && (this.config.searchable = !1), this.navigating = !1, this.mobileDevice = !1, !this.config.disabledMobile && /Android|webOS|iPhone|iPad|BlackBerry|Windows Phone|Opera Mini|IEMobile|Mobile/i.test(navigator.userAgent) && (this.mobileDevice = !0), this.customOption = this.config.hasOwnProperty(\"renderOption\") && \"function\" == typeof this.config.renderOption, this.customSelected = this.config.hasOwnProperty(\"renderSelection\") && \"function\" == typeof this.config.renderSelection, this.supportsEventPassiveOption = this.detectEventPassiveOption(), i.mixin(this), function () {\n this.requiresPagination = this.config.pagination && 0 < this.config.pagination, h(this.config, \"width\") && (u.isInt(this.config.width) ? this.width = this.config.width + \"px\" : \"auto\" === this.config.width ? this.width = \"100%\" : u.includes(this.config.width, \"%\") && (this.width = this.config.width)), this.container = u.createElement(\"div\", {\n class: \"selectr-container\"\n }), this.config.customClass && u.addClass(this.container, this.config.customClass), this.mobileDevice ? u.addClass(this.container, \"selectr-mobile\") : u.addClass(this.container, \"selectr-desktop\"), this.el.tabIndex = -1, this.config.nativeDropdown || this.mobileDevice ? u.addClass(this.el, \"selectr-visible\") : u.addClass(this.el, \"selectr-hidden\"), this.selected = u.createElement(\"div\", {\n class: \"selectr-selected\",\n disabled: this.disabled,\n tabIndex: 0,\n \"aria-expanded\": !1\n }), this.label = u.createElement(this.el.multiple ? \"ul\" : \"span\", {\n class: \"selectr-label\"\n });\n var e = u.createElement(\"div\", {\n class: \"selectr-options-container\"\n });\n if (this.tree = u.createElement(\"ul\", {\n class: \"selectr-options\",\n role: \"tree\",\n \"aria-hidden\": !0,\n \"aria-expanded\": !1\n }), this.notice = u.createElement(\"div\", {\n class: \"selectr-notice\"\n }), this.el.setAttribute(\"aria-hidden\", !0), this.disabled && (this.el.disabled = !0), this.el.multiple ? (u.addClass(this.label, \"selectr-tags\"), u.addClass(this.container, \"multiple\"), this.tags = [], this.selectedValues = this.config.defaultSelected ? this.getSelectedProperties(\"value\") : [], this.selectedIndexes = this.getSelectedProperties(\"idx\")) : (this.selectedValue = null, this.selectedIndex = -1), this.selected.appendChild(this.label), this.config.clearable && (this.selectClear = u.createElement(\"button\", {\n class: \"selectr-clear\",\n type: \"button\"\n }), this.container.appendChild(this.selectClear), u.addClass(this.container, \"clearable\")), this.config.taggable) {\n var t = u.createElement(\"li\", {\n class: \"input-tag\"\n });\n if (this.input = u.createElement(\"input\", {\n class: \"selectr-tag-input\",\n placeholder: this.config.tagPlaceholder,\n tagIndex: 0,\n autocomplete: \"off\",\n autocorrect: \"off\",\n autocapitalize: \"off\",\n spellcheck: \"false\",\n role: \"textbox\",\n type: \"search\"\n }), t.appendChild(this.input), this.label.appendChild(t), u.addClass(this.container, \"taggable\"), this.tagSeperators = [\",\"], this.config.tagSeperators) {\n this.tagSeperators = this.tagSeperators.concat(this.config.tagSeperators);\n for (var n = [], i = 0; i < this.tagSeperators.length; i++) n.push(u.escapeRegExp(this.tagSeperators[i]));\n this.tagSeperatorsRegex = new RegExp(n.join(\"|\"), \"i\");\n } else this.tagSeperatorsRegex = new RegExp(\",\", \"i\");\n }\n this.config.searchable && (this.input = u.createElement(\"input\", {\n class: \"selectr-input\",\n tagIndex: -1,\n autocomplete: \"off\",\n autocorrect: \"off\",\n autocapitalize: \"off\",\n spellcheck: \"false\",\n role: \"textbox\",\n type: \"search\",\n placeholder: this.config.messages.searchPlaceholder\n }), this.inputClear = u.createElement(\"button\", {\n class: \"selectr-input-clear\",\n type: \"button\"\n }), this.inputContainer = u.createElement(\"div\", {\n class: \"selectr-input-container\"\n }), this.inputContainer.appendChild(this.input), this.inputContainer.appendChild(this.inputClear), e.appendChild(this.inputContainer)), e.appendChild(this.notice), e.appendChild(this.tree), this.items = [], this.options = [], this.el.options.length && (this.options = [].slice.call(this.el.options));\n var o,\n r,\n s,\n a = !1,\n l = 0;\n this.el.children.length && u.each(this.el.children, function (e, t) {\n \"OPTGROUP\" === t.nodeName ? (a = u.createElement(\"ul\", {\n class: \"selectr-optgroup\",\n role: \"group\",\n html: \"
  • \" + t.label + \"
  • \"\n }), u.each(t.children, function (e, t) {\n t.idx = l, a.appendChild(d.call(this, t, a)), l++;\n }, this)) : (t.idx = l, d.call(this, t), l++);\n }, this), this.config.data && Array.isArray(this.config.data) && (o = !(this.data = []), a = !1, l = 0, u.each(this.config.data, function (e, t) {\n h(t, \"children\") ? (o = u.createElement(\"optgroup\", {\n label: t.text\n }), a = u.createElement(\"ul\", {\n class: \"selectr-optgroup\",\n role: \"group\",\n html: \"
  • \" + t.text + \"
  • \"\n }), u.each(t.children, function (e, t) {\n (r = new Option(t.text, t.value, !1, t.hasOwnProperty(\"selected\") && !0 === t.selected)).disabled = h(t, \"disabled\"), this.options.push(r), o.appendChild(r), r.idx = l, a.appendChild(d.call(this, r, t)), this.data[l] = t, l++;\n }, this), this.el.appendChild(o)) : ((r = new Option(t.text, t.value, !1, t.hasOwnProperty(\"selected\") && !0 === t.selected)).disabled = h(t, \"disabled\"), this.options.push(r), r.idx = l, d.call(this, r, t), this.data[l] = t, l++);\n }, this)), this.setSelected(!0);\n for (var c = this.navIndex = 0; c < this.items.length; c++) if (s = this.items[c], !u.hasClass(s, \"disabled\")) {\n u.addClass(s, \"active\"), this.navIndex = c;\n break;\n }\n this.requiresPagination && (this.pageIndex = 1, this.paginate()), this.container.appendChild(this.selected), this.container.appendChild(e), this.placeEl = u.createElement(\"div\", {\n class: \"selectr-placeholder\"\n }), this.setPlaceholder(), this.selected.appendChild(this.placeEl), this.disabled && this.disable(), this.el.parentNode.insertBefore(this.container, this.el), this.container.appendChild(this.el);\n }.call(this), this.bindEvents(), this.update(), this.optsRect = u.rect(this.tree), this.rendered = !0, this.el.multiple || (this.el.selectedIndex = this.selectedIndex), t = this, setTimeout(function () {\n t.emit(\"selectr.init\");\n }, 20));\n }, t.prototype.getSelected = function () {\n return this.el.querySelectorAll(\"option:checked\");\n }, t.prototype.getSelectedProperties = function (t) {\n var e = this.getSelected();\n return [].slice.call(e).map(function (e) {\n return e[t];\n }).filter(function (e) {\n return null != e;\n });\n }, t.prototype.detectEventPassiveOption = function () {\n var e = !1;\n try {\n var t = Object.defineProperty({}, \"passive\", {\n get: function () {\n e = !0;\n }\n });\n window.addEventListener(\"test\", null, t);\n } catch (e) {}\n return e;\n }, t.prototype.bindEvents = function () {\n var n,\n i = this;\n this.events = {}, this.events.dismiss = function (e) {\n e = e.target;\n this.container.contains(e) || !this.opened && !u.hasClass(this.container, \"notice\") || this.close();\n }.bind(this), this.events.navigate = function (e) {\n if (e = e || window.event, this.items.length && this.opened && u.includes([13, 38, 40], e.which)) {\n if (e.preventDefault(), 13 === e.which) return !(this.noResults || this.config.taggable && 0 < this.input.value.length) && this.change(this.navIndex);\n var t,\n n = this.items[this.navIndex],\n i = this.navIndex;\n switch (e.which) {\n case 38:\n (t = 0) < this.navIndex && this.navIndex--;\n break;\n case 40:\n this.navIndex < this.items.length - (t = 1) && this.navIndex++;\n }\n for (this.navigating = !0; u.hasClass(this.items[this.navIndex], \"disabled\") || u.hasClass(this.items[this.navIndex], \"excluded\");) {\n if (!(0 < this.navIndex && this.navIndex < this.items.length - 1)) {\n this.navIndex = i;\n break;\n }\n if (t ? this.navIndex++ : this.navIndex--, this.searching) {\n if (this.navIndex > this.tree.lastElementChild.idx) {\n this.navIndex = this.tree.lastElementChild.idx;\n break;\n }\n if (this.navIndex < this.tree.firstElementChild.idx) {\n this.navIndex = this.tree.firstElementChild.idx;\n break;\n }\n }\n }\n e = u.rect(this.items[this.navIndex]);\n t ? (0 === this.navIndex ? this.tree.scrollTop = 0 : e.top + e.height > this.optsRect.top + this.optsRect.height && (this.tree.scrollTop = this.tree.scrollTop + (e.top + e.height - (this.optsRect.top + this.optsRect.height))), this.navIndex === this.tree.childElementCount - 1 && this.requiresPagination && r.call(this)) : 0 === this.navIndex ? this.tree.scrollTop = 0 : e.top - this.optsRect.top < 0 && (this.tree.scrollTop = this.tree.scrollTop + (e.top - this.optsRect.top)), n && u.removeClass(n, \"active\"), u.addClass(this.items[this.navIndex], \"active\");\n } else this.navigating = !1;\n }.bind(this), this.events.reset = this.reset.bind(this), (this.config.nativeDropdown || this.mobileDevice) && (this.container.addEventListener(\"touchstart\", function (e) {\n e.changedTouches[0].target === i.el && i.toggle();\n }, !!this.supportsEventPassiveOption && {\n passive: !0\n }), this.container.addEventListener(\"click\", function (e) {\n e.target === i.el && i.toggle();\n }), this.el.addEventListener(\"change\", function (e) {\n e.__selfTriggered || (i.el.multiple ? (e = i.getSelectedProperties(\"idx\"), e = function (e, t) {\n for (var n, i = [], o = e.slice(0), r = 0; r < t.length; r++) -1 < (n = o.indexOf(t[r])) ? o.splice(n, 1) : i.push(t[r]);\n return [i, o];\n }(i.selectedIndexes, e), u.each(e[0], function (e, t) {\n i.select(t);\n }, i), u.each(e[1], function (e, t) {\n i.deselect(t);\n }, i)) : -1 < i.el.selectedIndex && i.select(i.el.selectedIndex));\n })), this.config.nativeDropdown && this.container.addEventListener(\"keydown\", function (e) {\n \"Enter\" === e.key && i.selected === document.activeElement && (i.toggle(), setTimeout(function () {\n i.el.focus();\n }, 200));\n }), this.selected.addEventListener(\"click\", function (e) {\n i.disabled || i.toggle(), e.preventDefault();\n }), this.config.nativeKeyboard && (n = \"\", this.selected.addEventListener(\"keydown\", function (e) {\n var t;\n i.disabled || i.selected !== document.activeElement || e.altKey || e.ctrlKey || e.metaKey || (\" \" === e.key || !i.opened && -1 < [\"Enter\", \"ArrowUp\", \"ArrowDown\"].indexOf(e.key) ? (i.toggle(), e.preventDefault(), e.stopPropagation()) : e.key.length <= 2 && String[String.fromCodePoint ? \"fromCodePoint\" : \"fromCharCode\"](e.key[String.codePointAt ? \"codePointAt\" : \"charCodeAt\"](0)) === e.key && (i.config.multiple ? (i.open(), i.config.searchable && (i.input.value = e.key, i.input.focus(), i.search(null, !0))) : (n += e.key, (t = i.search(n, !0)) && t.length && (i.clear(), i.setValue(t[0].value)), setTimeout(function () {\n n = \"\";\n }, 1e3)), e.preventDefault(), e.stopPropagation()));\n }), this.container.addEventListener(\"keyup\", function (e) {\n i.opened && \"Escape\" === e.key && (i.close(), e.stopPropagation(), i.selected.focus());\n })), this.label.addEventListener(\"click\", function (e) {\n u.hasClass(e.target, \"selectr-tag-remove\") && i.deselect(e.target.parentNode.idx);\n }), this.selectClear && this.selectClear.addEventListener(\"click\", this.clear.bind(this)), this.tree.addEventListener(\"mousedown\", function (e) {\n e.preventDefault();\n }), this.tree.addEventListener(\"click\", function (e) {\n var t = u.closest(e.target, function (e) {\n return e && u.hasClass(e, \"selectr-option\");\n });\n t && !u.hasClass(t, \"disabled\") && (u.hasClass(t, \"selected\") ? (i.el.multiple || !i.el.multiple && i.config.allowDeselect) && i.deselect(t.idx) : i.select(t.idx), i.opened && !i.el.multiple) && i.close(), e.preventDefault(), e.stopPropagation();\n }), this.tree.addEventListener(\"mouseover\", function (e) {\n !u.hasClass(e.target, \"selectr-option\") || u.hasClass(e.target, \"disabled\") || (u.removeClass(i.items[i.navIndex], \"active\"), u.addClass(e.target, \"active\"), i.navIndex = [].slice.call(i.items).indexOf(e.target));\n }), this.config.searchable && (this.input.addEventListener(\"focus\", function (e) {\n i.searching = !0;\n }), this.input.addEventListener(\"blur\", function (e) {\n i.searching = !1;\n }), this.input.addEventListener(\"keyup\", function (e) {\n i.search(), i.config.taggable || (this.value.length ? u.addClass(this.parentNode, \"active\") : u.removeClass(this.parentNode, \"active\"));\n }), this.inputClear.addEventListener(\"click\", function (e) {\n i.input.value = null, s.call(i), i.tree.childElementCount || o.call(i);\n })), this.config.taggable && this.input.addEventListener(\"keyup\", function (e) {\n var t, n;\n i.search(), i.config.taggable && this.value.length && (t = this.value.trim()).length && (13 === e.which || i.tagSeperatorsRegex.test(t)) && (e = t.replace(i.tagSeperatorsRegex, \"\"), (n = (e = (e = u.escapeRegExp(e)).trim()).length ? i.add({\n value: e,\n textContent: e,\n selected: !0\n }, !0) : n) ? (i.close(), s.call(i)) : (this.value = \"\", i.setMessage(i.config.messages.tagDuplicate)));\n }), this.update = u.debounce(function () {\n i.opened && i.config.closeOnScroll && i.close(), i.width && (i.container.style.width = i.width), i.invert();\n }, 50), this.requiresPagination && (this.paginateItems = u.debounce(function () {\n r.call(this);\n }, 50), this.tree.addEventListener(\"scroll\", this.paginateItems.bind(this))), document.addEventListener(\"click\", this.events.dismiss), window.addEventListener(\"keydown\", this.events.navigate), window.addEventListener(\"resize\", this.update), window.addEventListener(\"scroll\", this.update), this.on(\"selectr.destroy\", function () {\n document.removeEventListener(\"click\", this.events.dismiss), window.removeEventListener(\"keydown\", this.events.navigate), window.removeEventListener(\"resize\", this.update), window.removeEventListener(\"scroll\", this.update);\n }), this.el.form && (this.el.form.addEventListener(\"reset\", this.events.reset), this.on(\"selectr.destroy\", function () {\n this.el.form.removeEventListener(\"reset\", this.events.reset);\n }));\n }, t.prototype.setSelected = function (e) {\n var n;\n this.config.data || this.el.multiple || !this.el.options.length || (0 !== this.el.selectedIndex || this.el.options[0].defaultSelected || this.config.defaultSelected || (this.el.selectedIndex = -1), this.selectedIndex = this.el.selectedIndex, -1 < this.selectedIndex && this.select(this.selectedIndex)), this.config.multiple && \"select-one\" === this.originalType && !this.config.data && this.el.options[0].selected && !this.el.options[0].defaultSelected && (this.el.options[0].selected = !1), u.each(this.options, function (e, t) {\n t.selected && t.defaultSelected && this.select(t.idx);\n }, this), this.config.selectedValue && this.setValue(this.config.selectedValue), this.config.data && (!this.el.multiple && this.config.defaultSelected && this.el.selectedIndex < 0 && 0 < this.config.data.length && this.select(0), n = 0, u.each(this.config.data, function (e, t) {\n h(t, \"children\") ? u.each(t.children, function (e, t) {\n t.hasOwnProperty(\"selected\") && !0 === t.selected && this.select(n), n++;\n }, this) : (t.hasOwnProperty(\"selected\") && !0 === t.selected && this.select(n), n++);\n }, this));\n }, t.prototype.destroy = function () {\n this.rendered && (this.emit(\"selectr.destroy\"), \"select-one\" === this.originalType && (this.el.multiple = !1), this.config.data && (this.el.innerHTML = \"\"), u.removeClass(this.el, \"selectr-hidden\"), this.container.parentNode.replaceChild(this.el, this.container), this.rendered = !1, delete this.el.selectr);\n }, t.prototype.change = function (e) {\n var t = this.items[e],\n n = this.options[e];\n n.disabled || (n.selected && u.hasClass(t, \"selected\") ? this.deselect(e) : this.select(e), this.opened && !this.el.multiple && this.close());\n }, t.prototype.select = function (i) {\n var e = this.items[i],\n t = [].slice.call(this.el.options),\n n = this.options[i];\n if (this.el.multiple) {\n if (u.includes(this.selectedIndexes, i)) return !1;\n if (this.config.maxSelections && this.tags.length === this.config.maxSelections) return this.setMessage(this.config.messages.maxSelections.replace(\"{max}\", this.config.maxSelections), !0), !1;\n this.selectedValues.push(n.value), this.selectedIndexes.push(i), !function (e) {\n var l,\n c = this,\n n = document.createDocumentFragment(),\n t = this.options[e.idx],\n i = this.data ? this.data[e.idx] : t,\n o = {\n class: \"selectr-tag\"\n },\n i = (this.customSelected ? o.html = this.config.renderSelection(i) : o.textContent = t.textContent, u.createElement(\"li\", o)),\n o = u.createElement(\"button\", {\n class: \"selectr-tag-remove\",\n type: \"button\"\n });\n i.appendChild(o), i.idx = e.idx, i.tag = t.value, this.tags.push(i), this.config.sortSelected ? (o = this.tags.slice(), l = function (e, i) {\n e.replace(/(\\d+)|(\\D+)/g, function (e, t, n) {\n i.push([t || 1 / 0, n || \"\"]);\n });\n }, o.sort(function (e, t) {\n var n,\n i,\n o = [],\n r = [];\n for (!0 === c.config.sortSelected ? (n = e.tag, i = t.tag) : \"text\" === c.config.sortSelected && (n = e.textContent, i = t.textContent), l(n, o), l(i, r); o.length && r.length;) {\n var s = o.shift(),\n a = r.shift(),\n s = s[0] - a[0] || s[1].localeCompare(a[1]);\n if (s) return s;\n }\n return o.length - r.length;\n }), u.each(o, function (e, t) {\n n.appendChild(t);\n }), this.label.innerHTML = \"\") : n.appendChild(i), this.config.taggable ? this.label.insertBefore(n, this.input.parentNode) : this.label.appendChild(n);\n }.call(this, e);\n } else {\n var o = this.data ? this.data[i] : n;\n this.customSelected ? this.label.innerHTML = this.config.renderSelection(o) : this.label.textContent = n.textContent, this.selectedValue = n.value, this.selectedIndex = i, u.each(this.options, function (e, t) {\n var n = this.items[e];\n e !== i && (n && u.removeClass(n, \"selected\"), t.selected = !1, t.removeAttribute(\"selected\"));\n }, this);\n }\n u.includes(t, n) || this.el.add(n), e.setAttribute(\"aria-selected\", !0), u.addClass(e, \"selected\"), u.addClass(this.container, \"has-selected\"), n.selected = !0, n.setAttribute(\"selected\", \"\"), this.emit(\"selectr.change\", n), this.emit(\"selectr.select\", n), \"createEvent\" in document ? ((o = document.createEvent(\"HTMLEvents\")).initEvent(\"change\", !0, !0), o.__selfTriggered = !0, this.el.dispatchEvent(o)) : this.el.fireEvent(\"onchange\");\n }, t.prototype.deselect = function (e, t) {\n var n = this.items[e],\n i = this.options[e];\n if (this.el.multiple) {\n var o = this.selectedIndexes.indexOf(e),\n o = (this.selectedIndexes.splice(o, 1), this.selectedValues.indexOf(i.value));\n this.selectedValues.splice(o, 1), !function (n) {\n var i = !1;\n u.each(this.tags, function (e, t) {\n t.idx === n.idx && (i = t);\n }, this), i && (this.label.removeChild(i), this.tags.splice(this.tags.indexOf(i), 1));\n }.call(this, n), this.tags.length || u.removeClass(this.container, \"has-selected\");\n } else {\n if (!t && !this.config.clearable && !this.config.allowDeselect) return !1;\n this.label.innerHTML = \"\", this.selectedValue = null, this.el.selectedIndex = this.selectedIndex = -1, u.removeClass(this.container, \"has-selected\");\n }\n this.items[e].setAttribute(\"aria-selected\", !1), u.removeClass(this.items[e], \"selected\"), i.selected = !1, i.removeAttribute(\"selected\"), this.emit(\"selectr.change\", null), this.emit(\"selectr.deselect\", i), \"createEvent\" in document ? ((o = document.createEvent(\"HTMLEvents\")).initEvent(\"change\", !0, !0), o.__selfTriggered = !0, this.el.dispatchEvent(o)) : this.el.fireEvent(\"onchange\");\n }, t.prototype.setValue = function (n) {\n var i = Array.isArray(n);\n if (i || (n = n.toString().trim()), !this.el.multiple && i) return !1;\n u.each(this.options, function (e, t) {\n (i && -1 < n.indexOf(t.value) || t.value === n) && this.change(t.idx);\n }, this);\n }, t.prototype.getValue = function (e, t) {\n var n, i;\n return this.el.multiple ? e ? this.selectedIndexes.length && (i = {\n values: []\n }, u.each(this.selectedIndexes, function (e, t) {\n t = this.options[t];\n i.values[e] = {\n value: t.value,\n text: t.textContent\n };\n }, this)) : i = this.selectedValues.slice() : i = e ? {\n value: (n = this.options[this.selectedIndex]).value,\n text: n.textContent\n } : this.selectedValue, i = e && t ? JSON.stringify(i) : i;\n }, t.prototype.add = function (n, i) {\n if (n) {\n if (this.data = this.data || [], this.items = this.items || [], this.options = this.options || [], Array.isArray(n)) u.each(n, function (e, t) {\n this.add(t, i);\n }, this);else if (\"[object Object]\" === Object.prototype.toString.call(n)) {\n if (i) {\n var o = !1;\n if (u.each(this.options, function (e, t) {\n t.value.toLowerCase() === n.value.toLowerCase() && (o = !0);\n }), o) return !1;\n }\n var e = u.createElement(\"option\", n);\n return this.data.push(n), this.mobileDevice && this.el.add(e), this.options.push(e), e.idx = 0 < this.options.length ? this.options.length - 1 : 0, d.call(this, e), n.selected && this.select(e.idx), this.setPlaceholder(), e;\n }\n return this.config.pagination && this.paginate(), !0;\n }\n }, t.prototype.remove = function (e) {\n var n,\n i = [];\n Array.isArray(e) ? u.each(e, function (e, t) {\n u.isInt(t) ? i.push(this.getOptionByIndex(t)) : \"string\" == typeof t && i.push(this.getOptionByValue(t));\n }, this) : u.isInt(e) ? i.push(this.getOptionByIndex(e)) : \"string\" == typeof e && i.push(this.getOptionByValue(e)), i.length && (u.each(i, function (e, t) {\n n = t.idx, this.el.remove(t), this.options.splice(n, 1);\n t = this.items[n].parentNode;\n t && t.removeChild(this.items[n]), this.items.splice(n, 1), u.each(this.options, function (e, t) {\n t.idx = e, this.items[e].idx = e;\n }, this);\n }, this), this.setPlaceholder(), this.config.pagination) && this.paginate();\n }, t.prototype.removeAll = function () {\n this.clear(!0), u.each(this.el.options, function (e, t) {\n this.el.remove(t);\n }, this), u.truncate(this.tree), this.items = [], this.options = [], this.data = [], this.navIndex = 0, this.requiresPagination && (this.requiresPagination = !1, this.pageIndex = 1, this.pages = []), this.setPlaceholder();\n }, t.prototype.search = function (a, e) {\n var l, c, h, d, t;\n if (!this.navigating) return l = !1, a || (a = this.input.value, l = !0, this.removeMessage(), u.truncate(this.tree)), c = [], h = document.createDocumentFragment(), 0 < (a = a.trim().toLowerCase()).length ? (d = e ? u.startsWith : u.includes, u.each(this.options, function (e, t) {\n var n,\n i,\n o,\n r,\n s = this.items[t.idx];\n d(t.textContent.trim().toLowerCase(), a) && !t.disabled ? (c.push({\n text: t.textContent,\n value: t.value\n }), l && (g(s, h, this.customOption), u.removeClass(s, \"excluded\"), !this.customOption) && (n = a, o = (t = t).textContent, n = new RegExp(n, \"ig\"), r = n.exec(o)) && (t.innerHTML = \"\", (i = document.createElement(\"span\")).classList.add(\"selectr-match\"), i.textContent = r[0], t.appendChild(document.createTextNode(o.substring(0, r.index))), t.appendChild(i), t.appendChild(document.createTextNode(o.substring(n.lastIndex))))) : l && u.addClass(s, \"excluded\");\n }, this), l && (h.childElementCount ? (e = this.items[this.navIndex], t = h.querySelector(\".selectr-option:not(.excluded)\"), this.noResults = !1, u.removeClass(e, \"active\"), this.navIndex = t.idx, u.addClass(t, \"active\")) : this.config.taggable || (this.noResults = !0, this.setMessage(this.config.messages.noResults)), this.tree.appendChild(h))) : o.call(this), c;\n }, t.prototype.toggle = function () {\n this.disabled || (this.opened ? this.close() : this.open());\n }, t.prototype.open = function () {\n var e = this;\n if (!this.options.length) return !1;\n this.opened || this.emit(\"selectr.open\"), this.opened = !0, this.mobileDevice || this.config.nativeDropdown ? (u.addClass(this.container, \"native-open\"), this.config.data && u.each(this.options, function (e, t) {\n this.el.add(t);\n }, this)) : (u.addClass(this.container, \"open\"), o.call(this), this.invert(), this.tree.scrollTop = 0, u.removeClass(this.container, \"notice\"), this.selected.setAttribute(\"aria-expanded\", !0), this.tree.setAttribute(\"aria-hidden\", !1), this.tree.setAttribute(\"aria-expanded\", !0), this.config.searchable && !this.config.taggable && setTimeout(function () {\n e.input.focus(), e.input.tabIndex = 0;\n }, 10));\n }, t.prototype.close = function () {\n var e;\n this.opened && this.emit(\"selectr.close\"), this.opened = !1, this.navigating = !1, this.mobileDevice || this.config.nativeDropdown ? u.removeClass(this.container, \"native-open\") : (e = u.hasClass(this.container, \"notice\"), this.config.searchable && !e && (this.input.blur(), this.input.tabIndex = -1, this.searching = !1), e && (u.removeClass(this.container, \"notice\"), this.notice.textContent = \"\"), u.removeClass(this.container, \"open\"), u.removeClass(this.container, \"native-open\"), this.selected.setAttribute(\"aria-expanded\", !1), this.tree.setAttribute(\"aria-hidden\", !0), this.tree.setAttribute(\"aria-expanded\", !1), u.truncate(this.tree), s.call(this));\n }, t.prototype.enable = function () {\n this.disabled = !1, this.el.disabled = !1, this.selected.tabIndex = this.originalIndex, this.el.multiple && u.each(this.tags, function (e, t) {\n t.lastElementChild.tabIndex = 0;\n }), u.removeClass(this.container, \"selectr-disabled\");\n }, t.prototype.disable = function (e) {\n e || (this.el.disabled = !0), this.selected.tabIndex = -1, this.el.multiple && u.each(this.tags, function (e, t) {\n t.lastElementChild.tabIndex = -1;\n }), this.disabled = !0, u.addClass(this.container, \"selectr-disabled\");\n }, t.prototype.reset = function () {\n this.disabled || (this.clear(), this.setSelected(!0), u.each(this.defaultSelected, function (e, t) {\n this.select(t);\n }, this), this.emit(\"selectr.reset\"));\n }, t.prototype.clear = function (e, t) {\n var n;\n this.el.multiple ? this.selectedIndexes.length && (n = this.selectedIndexes.slice(), t ? this.deselect(n.slice(-1)[0]) : u.each(n, function (e, t) {\n this.deselect(t);\n }, this)) : -1 < this.selectedIndex && this.deselect(this.selectedIndex, e), this.emit(\"selectr.clear\");\n }, t.prototype.serialise = function (e) {\n var i = [];\n return u.each(this.options, function (e, t) {\n var n = {\n value: t.value,\n text: t.textContent\n };\n t.selected && (n.selected = !0), t.disabled && (n.disabled = !0), i[e] = n;\n }), e ? JSON.stringify(i) : i;\n }, t.prototype.serialize = function (e) {\n return this.serialise(e);\n }, t.prototype.setPlaceholder = function (e) {\n e = e || this.config.placeholder || this.el.getAttribute(\"placeholder\"), this.options.length || (e = this.config.messages.noOptions), this.placeEl.innerHTML = e;\n }, t.prototype.paginate = function () {\n var n;\n if (this.items.length) return (n = this).pages = this.items.map(function (e, t) {\n return t % n.config.pagination == 0 ? n.items.slice(t, t + n.config.pagination) : null;\n }).filter(function (e) {\n return e;\n }), this.pages;\n }, t.prototype.setMessage = function (e, t) {\n t && this.close(), u.addClass(this.container, \"notice\"), this.notice.textContent = e;\n }, t.prototype.removeMessage = function () {\n u.removeClass(this.container, \"notice\"), this.notice.innerHTML = \"\";\n }, t.prototype.invert = function () {\n var e = u.rect(this.selected),\n t = this.tree.parentNode.offsetHeight,\n n = window.innerHeight;\n e.top + e.height + t > n ? (u.addClass(this.container, \"inverted\"), this.isInverted = !0) : (u.removeClass(this.container, \"inverted\"), this.isInverted = !1), this.optsRect = u.rect(this.tree);\n }, t.prototype.getOptionByIndex = function (e) {\n return this.options[e];\n }, t.prototype.getOptionByValue = function (e) {\n for (var t = !1, n = 0, i = this.options.length; n < i; n++) if (this.options[n].value.trim() === e.toString().trim()) {\n t = this.options[n];\n break;\n }\n return t;\n }, e.exports = t;\n },\n 4188: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n EX: function () {\n return o;\n },\n WF: function () {\n return r;\n },\n oW: function () {\n return s;\n },\n qD: function () {\n return i;\n }\n });\n var i = document.body,\n o = 10485760,\n r = 2e4,\n s = 2147483648;\n },\n 2602: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n w: function () {\n return i;\n }\n });\n var u = n(9791);\n function i(n, e, i) {\n var t,\n o = 3 < arguments.length && void 0 !== arguments[3] && arguments[3],\n r = \"function\" == typeof (a = n).getRootNode ? a.getRootNode() : window,\n s = {},\n a = n.getBoundingClientRect(),\n l = e.getBoundingClientRect(),\n c = document.createElement(\"div\");\n function h() {\n if (c && c.parentNode) {\n for (var e in c.parentNode.removeChild(c), s) t = e, Object.prototype.hasOwnProperty.call(s, t) && ((t = s[e]) && (0, u.removeEventListener)(r, e, t), delete s[e]);\n \"function\" == typeof i && i(n);\n }\n var t;\n }\n function d(e) {\n (e = e.target) === c || (0, u.isChildOf)(e, c) || h();\n }\n return c.className = \"jsoneditor-anchor\", c.style.position = \"absolute\", c.style.left = a.left - l.left + \"px\", c.style.top = a.top - l.top + \"px\", c.style.width = a.width - 2 + \"px\", c.style.height = a.height - 2 + \"px\", c.style.boxSizing = \"border-box\", e.appendChild(c), s.mousedown = (0, u.addEventListener)(r, \"mousedown\", d), s.mousewheel = (0, u.addEventListener)(r, \"mousewheel\", d), o && (t = null, c.onmouseover = function () {\n clearTimeout(t), t = null;\n }, c.onmouseout = function () {\n t = t || setTimeout(h, 200);\n }), c.destroy = h, c;\n }\n },\n 7923: function (e) {\n e.exports = \"data:application/javascript;base64,Im5vIHVzZSBzdHJpY3QiOwohKGZ1bmN0aW9uKHdpbmRvdykgewppZiAodHlwZW9mIHdpbmRvdy53aW5kb3cgIT0gInVuZGVmaW5lZCIgJiYgd2luZG93LmRvY3VtZW50KQogICAgcmV0dXJuOwppZiAod2luZG93LnJlcXVpcmUgJiYgd2luZG93LmRlZmluZSkKICAgIHJldHVybjsKCmlmICghd2luZG93LmNvbnNvbGUpIHsKICAgIHdpbmRvdy5jb25zb2xlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1zZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApOwogICAgICAgIHBvc3RNZXNzYWdlKHt0eXBlOiAibG9nIiwgZGF0YTogbXNnc30pOwogICAgfTsKICAgIHdpbmRvdy5jb25zb2xlLmVycm9yID0KICAgIHdpbmRvdy5jb25zb2xlLndhcm4gPSAKICAgIHdpbmRvdy5jb25zb2xlLmxvZyA9CiAgICB3aW5kb3cuY29uc29sZS50cmFjZSA9IHdpbmRvdy5jb25zb2xlOwp9CndpbmRvdy53aW5kb3cgPSB3aW5kb3c7CndpbmRvdy5hY2UgPSB3aW5kb3c7Cgp3aW5kb3cub25lcnJvciA9IGZ1bmN0aW9uKG1lc3NhZ2UsIGZpbGUsIGxpbmUsIGNvbCwgZXJyKSB7CiAgICBwb3N0TWVzc2FnZSh7dHlwZTogImVycm9yIiwgZGF0YTogewogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UsCiAgICAgICAgZGF0YTogZXJyICYmIGVyci5kYXRhLAogICAgICAgIGZpbGU6IGZpbGUsCiAgICAgICAgbGluZTogbGluZSwgCiAgICAgICAgY29sOiBjb2wsCiAgICAgICAgc3RhY2s6IGVyciAmJiBlcnIuc3RhY2sKICAgIH19KTsKfTsKCndpbmRvdy5ub3JtYWxpemVNb2R1bGUgPSBmdW5jdGlvbihwYXJlbnRJZCwgbW9kdWxlTmFtZSkgewogICAgLy8gbm9ybWFsaXplIHBsdWdpbiByZXF1aXJlcwogICAgaWYgKG1vZHVsZU5hbWUuaW5kZXhPZigiISIpICE9PSAtMSkgewogICAgICAgIHZhciBjaHVua3MgPSBtb2R1bGVOYW1lLnNwbGl0KCIhIik7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5ub3JtYWxpemVNb2R1bGUocGFyZW50SWQsIGNodW5rc1swXSkgKyAiISIgKyB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBjaHVua3NbMV0pOwogICAgfQogICAgLy8gbm9ybWFsaXplIHJlbGF0aXZlIHJlcXVpcmVzCiAgICBpZiAobW9kdWxlTmFtZS5jaGFyQXQoMCkgPT0gIi4iKSB7CiAgICAgICAgdmFyIGJhc2UgPSBwYXJlbnRJZC5zcGxpdCgiLyIpLnNsaWNlKDAsIC0xKS5qb2luKCIvIik7CiAgICAgICAgbW9kdWxlTmFtZSA9IChiYXNlID8gYmFzZSArICIvIiA6ICIiKSArIG1vZHVsZU5hbWU7CiAgICAgICAgCiAgICAgICAgd2hpbGUgKG1vZHVsZU5hbWUuaW5kZXhPZigiLiIpICE9PSAtMSAmJiBwcmV2aW91cyAhPSBtb2R1bGVOYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgIG1vZHVsZU5hbWUgPSBtb2R1bGVOYW1lLnJlcGxhY2UoL15cLlwvLywgIiIpLnJlcGxhY2UoL1wvXC5cLy8sICIvIikucmVwbGFjZSgvW15cL10rXC9cLlwuXC8vLCAiIik7CiAgICAgICAgfQogICAgfQogICAgCiAgICByZXR1cm4gbW9kdWxlTmFtZTsKfTsKCndpbmRvdy5yZXF1aXJlID0gZnVuY3Rpb24gcmVxdWlyZShwYXJlbnRJZCwgaWQpIHsKICAgIGlmICghaWQpIHsKICAgICAgICBpZCA9IHBhcmVudElkOwogICAgICAgIHBhcmVudElkID0gbnVsbDsKICAgIH0KICAgIGlmICghaWQuY2hhckF0KQogICAgICAgIHRocm93IG5ldyBFcnJvcigid29ya2VyLmpzIHJlcXVpcmUoKSBhY2NlcHRzIG9ubHkgKHBhcmVudElkLCBpZCkgYXMgYXJndW1lbnRzIik7CgogICAgaWQgPSB3aW5kb3cubm9ybWFsaXplTW9kdWxlKHBhcmVudElkLCBpZCk7CgogICAgdmFyIG1vZHVsZSA9IHdpbmRvdy5yZXF1aXJlLm1vZHVsZXNbaWRdOwogICAgaWYgKG1vZHVsZSkgewogICAgICAgIGlmICghbW9kdWxlLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgIG1vZHVsZS5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICAgIG1vZHVsZS5leHBvcnRzID0gbW9kdWxlLmZhY3RvcnkoKS5leHBvcnRzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbW9kdWxlLmV4cG9ydHM7CiAgICB9CiAgIAogICAgaWYgKCF3aW5kb3cucmVxdWlyZS50bG5zKQogICAgICAgIHJldHVybiBjb25zb2xlLmxvZygidW5hYmxlIHRvIGxvYWQgIiArIGlkKTsKICAgIAogICAgdmFyIHBhdGggPSByZXNvbHZlTW9kdWxlSWQoaWQsIHdpbmRvdy5yZXF1aXJlLnRsbnMpOwogICAgaWYgKHBhdGguc2xpY2UoLTMpICE9ICIuanMiKSBwYXRoICs9ICIuanMiOwogICAgCiAgICB3aW5kb3cucmVxdWlyZS5pZCA9IGlkOwogICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7fTsgLy8gcHJldmVudCBpbmZpbml0ZSBsb29wIG9uIGJyb2tlbiBtb2R1bGVzCiAgICBpbXBvcnRTY3JpcHRzKHBhdGgpOwogICAgcmV0dXJuIHdpbmRvdy5yZXF1aXJlKHBhcmVudElkLCBpZCk7Cn07CmZ1bmN0aW9uIHJlc29sdmVNb2R1bGVJZChpZCwgcGF0aHMpIHsKICAgIHZhciB0ZXN0UGF0aCA9IGlkLCB0YWlsID0gIiI7CiAgICB3aGlsZSAodGVzdFBhdGgpIHsKICAgICAgICB2YXIgYWxpYXMgPSBwYXRoc1t0ZXN0UGF0aF07CiAgICAgICAgaWYgKHR5cGVvZiBhbGlhcyA9PSAic3RyaW5nIikgewogICAgICAgICAgICByZXR1cm4gYWxpYXMgKyB0YWlsOwogICAgICAgIH0gZWxzZSBpZiAoYWxpYXMpIHsKICAgICAgICAgICAgcmV0dXJuICBhbGlhcy5sb2NhdGlvbi5yZXBsYWNlKC9cLyokLywgIi8iKSArICh0YWlsIHx8IGFsaWFzLm1haW4gfHwgYWxpYXMubmFtZSk7CiAgICAgICAgfSBlbHNlIGlmIChhbGlhcyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgIH0KICAgICAgICB2YXIgaSA9IHRlc3RQYXRoLmxhc3RJbmRleE9mKCIvIik7CiAgICAgICAgaWYgKGkgPT09IC0xKSBicmVhazsKICAgICAgICB0YWlsID0gdGVzdFBhdGguc3Vic3RyKGkpICsgdGFpbDsKICAgICAgICB0ZXN0UGF0aCA9IHRlc3RQYXRoLnNsaWNlKDAsIGkpOwogICAgfQogICAgcmV0dXJuIGlkOwp9CndpbmRvdy5yZXF1aXJlLm1vZHVsZXMgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9OwoKd2luZG93LmRlZmluZSA9IGZ1bmN0aW9uKGlkLCBkZXBzLCBmYWN0b3J5KSB7CiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7CiAgICAgICAgZmFjdG9yeSA9IGRlcHM7CiAgICAgICAgaWYgKHR5cGVvZiBpZCAhPSAic3RyaW5nIikgewogICAgICAgICAgICBkZXBzID0gaWQ7CiAgICAgICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICBmYWN0b3J5ID0gaWQ7CiAgICAgICAgZGVwcyA9IFtdOwogICAgICAgIGlkID0gd2luZG93LnJlcXVpcmUuaWQ7CiAgICB9CiAgICAKICAgIGlmICh0eXBlb2YgZmFjdG9yeSAhPSAiZnVuY3Rpb24iKSB7CiAgICAgICAgd2luZG93LnJlcXVpcmUubW9kdWxlc1tpZF0gPSB7CiAgICAgICAgICAgIGV4cG9ydHM6IGZhY3RvcnksCiAgICAgICAgICAgIGluaXRpYWxpemVkOiB0cnVlCiAgICAgICAgfTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKCFkZXBzLmxlbmd0aCkKICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBkZXBlbmRlbmNpZXMsIHdlIGluamVjdCAicmVxdWlyZSIsICJleHBvcnRzIiBhbmQKICAgICAgICAvLyAibW9kdWxlIiBhcyBkZXBlbmRlbmNpZXMsIHRvIHByb3ZpZGUgQ29tbW9uSlMgY29tcGF0aWJpbGl0eS4KICAgICAgICBkZXBzID0gWyJyZXF1aXJlIiwgImV4cG9ydHMiLCAibW9kdWxlIl07CgogICAgdmFyIHJlcSA9IGZ1bmN0aW9uKGNoaWxkSWQpIHsKICAgICAgICByZXR1cm4gd2luZG93LnJlcXVpcmUoaWQsIGNoaWxkSWQpOwogICAgfTsKCiAgICB3aW5kb3cucmVxdWlyZS5tb2R1bGVzW2lkXSA9IHsKICAgICAgICBleHBvcnRzOiB7fSwKICAgICAgICBmYWN0b3J5OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIG1vZHVsZSA9IHRoaXM7CiAgICAgICAgICAgIHZhciByZXR1cm5FeHBvcnRzID0gZmFjdG9yeS5hcHBseSh0aGlzLCBkZXBzLnNsaWNlKDAsIGZhY3RvcnkubGVuZ3RoKS5tYXAoZnVuY3Rpb24oZGVwKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGRlcCkgewogICAgICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgInJlcXVpcmUiLCAiZXhwb3J0cyIgYW5kICJtb2R1bGUiIGFyZW4ndCBhY3R1YWwKICAgICAgICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMsIHdlIG11c3QgaGFuZGxlIHRoZW0gc2VwZXJhdGVseS4KICAgICAgICAgICAgICAgICAgICBjYXNlICJyZXF1aXJlIjogcmV0dXJuIHJlcTsKICAgICAgICAgICAgICAgICAgICBjYXNlICJleHBvcnRzIjogcmV0dXJuIG1vZHVsZS5leHBvcnRzOwogICAgICAgICAgICAgICAgICAgIGNhc2UgIm1vZHVsZSI6ICByZXR1cm4gbW9kdWxlOwogICAgICAgICAgICAgICAgICAgIC8vIEJ1dCBmb3IgYWxsIG90aGVyIGRlcGVuZGVuY2llcywgd2UgY2FuIGp1c3QgZ28gYWhlYWQgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZSB0aGVtLgogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6ICAgICAgICByZXR1cm4gcmVxKGRlcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKHJldHVybkV4cG9ydHMpCiAgICAgICAgICAgICAgICBtb2R1bGUuZXhwb3J0cyA9IHJldHVybkV4cG9ydHM7CiAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CiAgICAgICAgfQogICAgfTsKfTsKd2luZG93LmRlZmluZS5hbWQgPSB7fTsKd2luZG93LnJlcXVpcmUudGxucyA9IHt9Owp3aW5kb3cuaW5pdEJhc2VVcmxzICA9IGZ1bmN0aW9uIGluaXRCYXNlVXJscyh0b3BMZXZlbE5hbWVzcGFjZXMpIHsKICAgIGZvciAodmFyIGkgaW4gdG9wTGV2ZWxOYW1lc3BhY2VzKQogICAgICAgIHRoaXMucmVxdWlyZS50bG5zW2ldID0gdG9wTGV2ZWxOYW1lc3BhY2VzW2ldOwp9OwoKd2luZG93LmluaXRTZW5kZXIgPSBmdW5jdGlvbiBpbml0U2VuZGVyKCkgewoKICAgIHZhciBFdmVudEVtaXR0ZXIgPSB3aW5kb3cucmVxdWlyZSgiYWNlL2xpYi9ldmVudF9lbWl0dGVyIikuRXZlbnRFbWl0dGVyOwogICAgdmFyIG9vcCA9IHdpbmRvdy5yZXF1aXJlKCJhY2UvbGliL29vcCIpOwogICAgCiAgICB2YXIgU2VuZGVyID0gZnVuY3Rpb24oKSB7fTsKICAgIAogICAgKGZ1bmN0aW9uKCkgewogICAgICAgIAogICAgICAgIG9vcC5pbXBsZW1lbnQodGhpcywgRXZlbnRFbWl0dGVyKTsKICAgICAgICAgICAgICAgIAogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBmdW5jdGlvbihkYXRhLCBjYWxsYmFja0lkKSB7CiAgICAgICAgICAgIHBvc3RNZXNzYWdlKHsKICAgICAgICAgICAgICAgIHR5cGU6ICJjYWxsIiwKICAgICAgICAgICAgICAgIGlkOiBjYWxsYmFja0lkLAogICAgICAgICAgICAgICAgZGF0YTogZGF0YQogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgCiAgICAgICAgdGhpcy5lbWl0ID0gZnVuY3Rpb24obmFtZSwgZGF0YSkgewogICAgICAgICAgICBwb3N0TWVzc2FnZSh7CiAgICAgICAgICAgICAgICB0eXBlOiAiZXZlbnQiLAogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGRhdGE6IGRhdGEKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAKICAgIH0pLmNhbGwoU2VuZGVyLnByb3RvdHlwZSk7CiAgICAKICAgIHJldHVybiBuZXcgU2VuZGVyKCk7Cn07Cgp2YXIgbWFpbiA9IHdpbmRvdy5tYWluID0gbnVsbDsKdmFyIHNlbmRlciA9IHdpbmRvdy5zZW5kZXIgPSBudWxsOwoKd2luZG93Lm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgIHZhciBtc2cgPSBlLmRhdGE7CiAgICBpZiAobXNnLmV2ZW50ICYmIHNlbmRlcikgewogICAgICAgIHNlbmRlci5fc2lnbmFsKG1zZy5ldmVudCwgbXNnLmRhdGEpOwogICAgfQogICAgZWxzZSBpZiAobXNnLmNvbW1hbmQpIHsKICAgICAgICBpZiAobWFpblttc2cuY29tbWFuZF0pCiAgICAgICAgICAgIG1haW5bbXNnLmNvbW1hbmRdLmFwcGx5KG1haW4sIG1zZy5hcmdzKTsKICAgICAgICBlbHNlIGlmICh3aW5kb3dbbXNnLmNvbW1hbmRdKQogICAgICAgICAgICB3aW5kb3dbbXNnLmNvbW1hbmRdLmFwcGx5KHdpbmRvdywgbXNnLmFyZ3MpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGNvbW1hbmQ6IiArIG1zZy5jb21tYW5kKTsKICAgIH0KICAgIGVsc2UgaWYgKG1zZy5pbml0KSB7CiAgICAgICAgd2luZG93LmluaXRCYXNlVXJscyhtc2cudGxucyk7CiAgICAgICAgc2VuZGVyID0gd2luZG93LnNlbmRlciA9IHdpbmRvdy5pbml0U2VuZGVyKCk7CiAgICAgICAgdmFyIGNsYXp6ID0gdGhpcy5yZXF1aXJlKG1zZy5tb2R1bGUpW21zZy5jbGFzc25hbWVdOwogICAgICAgIG1haW4gPSB3aW5kb3cubWFpbiA9IG5ldyBjbGF6eihzZW5kZXIpOwogICAgfQp9Owp9KSh0aGlzKTsKCmFjZS5kZWZpbmUoImFjZS9saWIvb29wIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMuaW5oZXJpdHMgPSBmdW5jdGlvbiAoY3Rvciwgc3VwZXJDdG9yKSB7CiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvcjsKICAgIGN0b3IucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShzdXBlckN0b3IucHJvdG90eXBlLCB7CiAgICAgICAgY29uc3RydWN0b3I6IHsKICAgICAgICAgICAgdmFsdWU6IGN0b3IsCiAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLAogICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSwKICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgfQogICAgfSk7Cn07CmV4cG9ydHMubWl4aW4gPSBmdW5jdGlvbiAob2JqLCBtaXhpbikgewogICAgZm9yICh2YXIga2V5IGluIG1peGluKSB7CiAgICAgICAgb2JqW2tleV0gPSBtaXhpbltrZXldOwogICAgfQogICAgcmV0dXJuIG9iajsKfTsKZXhwb3J0cy5pbXBsZW1lbnQgPSBmdW5jdGlvbiAocHJvdG8sIG1peGluKSB7CiAgICBleHBvcnRzLm1peGluKHByb3RvLCBtaXhpbik7Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9hcHBseV9kZWx0YSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwpmdW5jdGlvbiB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsIGVycm9yVGV4dCkgewogICAgY29uc29sZS5sb2coIkludmFsaWQgRGVsdGE6IiwgZGVsdGEpOwogICAgdGhyb3cgIkludmFsaWQgRGVsdGE6ICIgKyBlcnJvclRleHQ7Cn0KZnVuY3Rpb24gcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBwb3NpdGlvbikgewogICAgcmV0dXJuIHBvc2l0aW9uLnJvdyA+PSAwICYmIHBvc2l0aW9uLnJvdyA8IGRvY0xpbmVzLmxlbmd0aCAmJgogICAgICAgIHBvc2l0aW9uLmNvbHVtbiA+PSAwICYmIHBvc2l0aW9uLmNvbHVtbiA8PSBkb2NMaW5lc1twb3NpdGlvbi5yb3ddLmxlbmd0aDsKfQpmdW5jdGlvbiB2YWxpZGF0ZURlbHRhKGRvY0xpbmVzLCBkZWx0YSkgewogICAgaWYgKGRlbHRhLmFjdGlvbiAhPSAiaW5zZXJ0IiAmJiBkZWx0YS5hY3Rpb24gIT0gInJlbW92ZSIpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuYWN0aW9uIG11c3QgYmUgJ2luc2VydCcgb3IgJ3JlbW92ZSciKTsKICAgIGlmICghKGRlbHRhLmxpbmVzIGluc3RhbmNlb2YgQXJyYXkpKQogICAgICAgIHRocm93RGVsdGFFcnJvcihkZWx0YSwgImRlbHRhLmxpbmVzIG11c3QgYmUgYW4gQXJyYXkiKTsKICAgIGlmICghZGVsdGEuc3RhcnQgfHwgIWRlbHRhLmVuZCkKICAgICAgICB0aHJvd0RlbHRhRXJyb3IoZGVsdGEsICJkZWx0YS5zdGFydC9lbmQgbXVzdCBiZSBhbiBwcmVzZW50Iik7CiAgICB2YXIgc3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIGlmICghcG9zaXRpb25JbkRvY3VtZW50KGRvY0xpbmVzLCBkZWx0YS5zdGFydCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuc3RhcnQgbXVzdCBiZSBjb250YWluZWQgaW4gZG9jdW1lbnQiKTsKICAgIHZhciBlbmQgPSBkZWx0YS5lbmQ7CiAgICBpZiAoZGVsdGEuYWN0aW9uID09ICJyZW1vdmUiICYmICFwb3NpdGlvbkluRG9jdW1lbnQoZG9jTGluZXMsIGVuZCkpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEuZW5kIG11c3QgY29udGFpbmVkIGluIGRvY3VtZW50IGZvciAncmVtb3ZlJyBhY3Rpb25zIik7CiAgICB2YXIgbnVtUmFuZ2VSb3dzID0gZW5kLnJvdyAtIHN0YXJ0LnJvdzsKICAgIHZhciBudW1SYW5nZUxhc3RMaW5lQ2hhcnMgPSAoZW5kLmNvbHVtbiAtIChudW1SYW5nZVJvd3MgPT0gMCA/IHN0YXJ0LmNvbHVtbiA6IDApKTsKICAgIGlmIChudW1SYW5nZVJvd3MgIT0gZGVsdGEubGluZXMubGVuZ3RoIC0gMSB8fCBkZWx0YS5saW5lc1tudW1SYW5nZVJvd3NdLmxlbmd0aCAhPSBudW1SYW5nZUxhc3RMaW5lQ2hhcnMpCiAgICAgICAgdGhyb3dEZWx0YUVycm9yKGRlbHRhLCAiZGVsdGEucmFuZ2UgbXVzdCBtYXRjaCBkZWx0YSBsaW5lcyIpOwp9CmV4cG9ydHMuYXBwbHlEZWx0YSA9IGZ1bmN0aW9uIChkb2NMaW5lcywgZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICB2YXIgc3RhcnRDb2x1bW4gPSBkZWx0YS5zdGFydC5jb2x1bW47CiAgICB2YXIgbGluZSA9IGRvY0xpbmVzW3Jvd10gfHwgIiI7CiAgICBzd2l0Y2ggKGRlbHRhLmFjdGlvbikgewogICAgICAgIGNhc2UgImluc2VydCI6CiAgICAgICAgICAgIHZhciBsaW5lcyA9IGRlbHRhLmxpbmVzOwogICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3ddID0gbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZGVsdGEubGluZXNbMF0gKyBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgYXJncyA9IFtyb3csIDFdLmNvbmNhdChkZWx0YS5saW5lcyk7CiAgICAgICAgICAgICAgICBkb2NMaW5lcy5zcGxpY2UuYXBwbHkoZG9jTGluZXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgZG9jTGluZXNbcm93XSA9IGxpbmUuc3Vic3RyaW5nKDAsIHN0YXJ0Q29sdW1uKSArIGRvY0xpbmVzW3Jvd107CiAgICAgICAgICAgICAgICBkb2NMaW5lc1tyb3cgKyBkZWx0YS5saW5lcy5sZW5ndGggLSAxXSArPSBsaW5lLnN1YnN0cmluZyhzdGFydENvbHVtbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAicmVtb3ZlIjoKICAgICAgICAgICAgdmFyIGVuZENvbHVtbiA9IGRlbHRhLmVuZC5jb2x1bW47CiAgICAgICAgICAgIHZhciBlbmRSb3cgPSBkZWx0YS5lbmQucm93OwogICAgICAgICAgICBpZiAocm93ID09PSBlbmRSb3cpIHsKICAgICAgICAgICAgICAgIGRvY0xpbmVzW3Jvd10gPSBsaW5lLnN1YnN0cmluZygwLCBzdGFydENvbHVtbikgKyBsaW5lLnN1YnN0cmluZyhlbmRDb2x1bW4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZG9jTGluZXMuc3BsaWNlKHJvdywgZW5kUm93IC0gcm93ICsgMSwgbGluZS5zdWJzdHJpbmcoMCwgc3RhcnRDb2x1bW4pICsgZG9jTGluZXNbZW5kUm93XS5zdWJzdHJpbmcoZW5kQ29sdW1uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn07Cgp9KTsKCmFjZS5kZWZpbmUoImFjZS9saWIvZXZlbnRfZW1pdHRlciIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7InVzZSBzdHJpY3QiOwp2YXIgRXZlbnRFbWl0dGVyID0ge307CnZhciBzdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbiAoKSB7IHRoaXMucHJvcGFnYXRpb25TdG9wcGVkID0gdHJ1ZTsgfTsKdmFyIHByZXZlbnREZWZhdWx0ID0gZnVuY3Rpb24gKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlOyB9OwpFdmVudEVtaXR0ZXIuX2VtaXQgPQogICAgRXZlbnRFbWl0dGVyLl9kaXNwYXRjaEV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgZSkgewogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwgKHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB7fSk7CiAgICAgICAgdGhpcy5fZGVmYXVsdEhhbmRsZXJzIHx8ICh0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB7fSk7CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXSB8fCBbXTsKICAgICAgICB2YXIgZGVmYXVsdEhhbmRsZXIgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycy5sZW5ndGggJiYgIWRlZmF1bHRIYW5kbGVyKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBlICE9ICJvYmplY3QiIHx8ICFlKQogICAgICAgICAgICBlID0ge307CiAgICAgICAgaWYgKCFlLnR5cGUpCiAgICAgICAgICAgIGUudHlwZSA9IGV2ZW50TmFtZTsKICAgICAgICBpZiAoIWUuc3RvcFByb3BhZ2F0aW9uKQogICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbiA9IHN0b3BQcm9wYWdhdGlvbjsKICAgICAgICBpZiAoIWUucHJldmVudERlZmF1bHQpCiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQgPSBwcmV2ZW50RGVmYXVsdDsKICAgICAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsaXN0ZW5lcnNbaV0oZSwgdGhpcyk7CiAgICAgICAgICAgIGlmIChlLnByb3BhZ2F0aW9uU3RvcHBlZCkKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoZGVmYXVsdEhhbmRsZXIgJiYgIWUuZGVmYXVsdFByZXZlbnRlZCkKICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRIYW5kbGVyKGUsIHRoaXMpOwogICAgfTsKRXZlbnRFbWl0dGVyLl9zaWduYWwgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBlKSB7CiAgICB2YXIgbGlzdGVuZXJzID0gKHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge30pW2V2ZW50TmFtZV07CiAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICByZXR1cm47CiAgICBsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuc2xpY2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdGVuZXJzLmxlbmd0aDsgaSsrKQogICAgICAgIGxpc3RlbmVyc1tpXShlLCB0aGlzKTsKfTsKRXZlbnRFbWl0dGVyLm9uY2UgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIF9zZWxmID0gdGhpczsKICAgIHRoaXMub24oZXZlbnROYW1lLCBmdW5jdGlvbiBuZXdDYWxsYmFjaygpIHsKICAgICAgICBfc2VsZi5vZmYoZXZlbnROYW1lLCBuZXdDYWxsYmFjayk7CiAgICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgIH0pOwogICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkgewogICAgICAgICAgICBjYWxsYmFjayA9IHJlc29sdmU7CiAgICAgICAgfSk7CiAgICB9Cn07CkV2ZW50RW1pdHRlci5zZXREZWZhdWx0SGFuZGxlciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICB2YXIgaGFuZGxlcnMgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnM7CiAgICBpZiAoIWhhbmRsZXJzKQogICAgICAgIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzID0geyBfZGlzYWJsZWRfOiB7fSB9OwogICAgaWYgKGhhbmRsZXJzW2V2ZW50TmFtZV0pIHsKICAgICAgICB2YXIgb2xkID0gaGFuZGxlcnNbZXZlbnROYW1lXTsKICAgICAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICAgICAgaWYgKCFkaXNhYmxlZCkKICAgICAgICAgICAgaGFuZGxlcnMuX2Rpc2FibGVkX1tldmVudE5hbWVdID0gZGlzYWJsZWQgPSBbXTsKICAgICAgICBkaXNhYmxlZC5wdXNoKG9sZCk7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQogICAgaGFuZGxlcnNbZXZlbnROYW1lXSA9IGNhbGxiYWNrOwp9OwpFdmVudEVtaXR0ZXIucmVtb3ZlRGVmYXVsdEhhbmRsZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgdmFyIGhhbmRsZXJzID0gdGhpcy5fZGVmYXVsdEhhbmRsZXJzOwogICAgaWYgKCFoYW5kbGVycykKICAgICAgICByZXR1cm47CiAgICB2YXIgZGlzYWJsZWQgPSBoYW5kbGVycy5fZGlzYWJsZWRfW2V2ZW50TmFtZV07CiAgICBpZiAoaGFuZGxlcnNbZXZlbnROYW1lXSA9PSBjYWxsYmFjaykgewogICAgICAgIGlmIChkaXNhYmxlZCkKICAgICAgICAgICAgdGhpcy5zZXREZWZhdWx0SGFuZGxlcihldmVudE5hbWUsIGRpc2FibGVkLnBvcCgpKTsKICAgIH0KICAgIGVsc2UgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgdmFyIGkgPSBkaXNhYmxlZC5pbmRleE9mKGNhbGxiYWNrKTsKICAgICAgICBpZiAoaSAhPSAtMSkKICAgICAgICAgICAgZGlzYWJsZWQuc3BsaWNlKGksIDEpOwogICAgfQp9OwpFdmVudEVtaXR0ZXIub24gPQogICAgRXZlbnRFbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbiAoZXZlbnROYW1lLCBjYWxsYmFjaywgY2FwdHVyaW5nKSB7CiAgICAgICAgdGhpcy5fZXZlbnRSZWdpc3RyeSA9IHRoaXMuX2V2ZW50UmVnaXN0cnkgfHwge307CiAgICAgICAgdmFyIGxpc3RlbmVycyA9IHRoaXMuX2V2ZW50UmVnaXN0cnlbZXZlbnROYW1lXTsKICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdID0gW107CiAgICAgICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGNhbGxiYWNrKSA9PSAtMSkKICAgICAgICAgICAgbGlzdGVuZXJzW2NhcHR1cmluZyA/ICJ1bnNoaWZ0IiA6ICJwdXNoIl0oY2FsbGJhY2spOwogICAgICAgIHJldHVybiBjYWxsYmFjazsKICAgIH07CkV2ZW50RW1pdHRlci5vZmYgPQogICAgRXZlbnRFbWl0dGVyLnJlbW92ZUxpc3RlbmVyID0KICAgICAgICBFdmVudEVtaXR0ZXIucmVtb3ZlRXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9ldmVudFJlZ2lzdHJ5IHx8IHt9OwogICAgICAgICAgICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRSZWdpc3RyeVtldmVudE5hbWVdOwogICAgICAgICAgICBpZiAoIWxpc3RlbmVycykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdmFyIGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoY2FsbGJhY2spOwogICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKQogICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfTsKRXZlbnRFbWl0dGVyLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsKICAgIGlmICghZXZlbnROYW1lKQogICAgICAgIHRoaXMuX2V2ZW50UmVnaXN0cnkgPSB0aGlzLl9kZWZhdWx0SGFuZGxlcnMgPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZXZlbnRSZWdpc3RyeSkKICAgICAgICB0aGlzLl9ldmVudFJlZ2lzdHJ5W2V2ZW50TmFtZV0gPSB1bmRlZmluZWQ7CiAgICBpZiAodGhpcy5fZGVmYXVsdEhhbmRsZXJzKQogICAgICAgIHRoaXMuX2RlZmF1bHRIYW5kbGVyc1tldmVudE5hbWVdID0gdW5kZWZpbmVkOwp9OwpleHBvcnRzLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3JhbmdlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBjb21wYXJlUG9pbnRzID0gZnVuY3Rpb24gKHAxLCBwMikgewogICAgcmV0dXJuIHAxLnJvdyAtIHAyLnJvdyB8fCBwMS5jb2x1bW4gLSBwMi5jb2x1bW47Cn07CnZhciBSYW5nZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIFJhbmdlKHN0YXJ0Um93LCBzdGFydENvbHVtbiwgZW5kUm93LCBlbmRDb2x1bW4pIHsKICAgICAgICB0aGlzLnN0YXJ0ID0gewogICAgICAgICAgICByb3c6IHN0YXJ0Um93LAogICAgICAgICAgICBjb2x1bW46IHN0YXJ0Q29sdW1uCiAgICAgICAgfTsKICAgICAgICB0aGlzLmVuZCA9IHsKICAgICAgICAgICAgcm93OiBlbmRSb3csCiAgICAgICAgICAgIGNvbHVtbjogZW5kQ29sdW1uCiAgICAgICAgfTsKICAgIH0KICAgIFJhbmdlLnByb3RvdHlwZS5pc0VxdWFsID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc3RhcnQucm93ID09PSByYW5nZS5zdGFydC5yb3cgJiYKICAgICAgICAgICAgdGhpcy5lbmQucm93ID09PSByYW5nZS5lbmQucm93ICYmCiAgICAgICAgICAgIHRoaXMuc3RhcnQuY29sdW1uID09PSByYW5nZS5zdGFydC5jb2x1bW4gJiYKICAgICAgICAgICAgdGhpcy5lbmQuY29sdW1uID09PSByYW5nZS5lbmQuY29sdW1uOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKCJSYW5nZTogWyIgKyB0aGlzLnN0YXJ0LnJvdyArICIvIiArIHRoaXMuc3RhcnQuY29sdW1uICsKICAgICAgICAgICAgIl0gLT4gWyIgKyB0aGlzLmVuZC5yb3cgKyAiLyIgKyB0aGlzLmVuZC5jb2x1bW4gKyAiXSIpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWlucyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDA7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAsIGVuZCA9IHJhbmdlLmVuZCwgc3RhcnQgPSByYW5nZS5zdGFydDsKICAgICAgICBjbXAgPSB0aGlzLmNvbXBhcmUoZW5kLnJvdywgZW5kLmNvbHVtbik7CiAgICAgICAgaWYgKGNtcCA9PSAxKSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY21wID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiAtMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNtcCA9IHRoaXMuY29tcGFyZShzdGFydC5yb3csIHN0YXJ0LmNvbHVtbik7CiAgICAgICAgICAgIGlmIChjbXAgPT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjbXAgPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDQyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmVQb2ludCA9IGZ1bmN0aW9uIChwKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShwLnJvdywgcC5jb2x1bW4pOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb250YWluc1JhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLnN0YXJ0KSA9PSAwICYmIHRoaXMuY29tcGFyZVBvaW50KHJhbmdlLmVuZCkgPT0gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW50ZXJzZWN0cyA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmVSYW5nZShyYW5nZSk7CiAgICAgICAgcmV0dXJuIChjbXAgPT0gLTEgfHwgY21wID09IDAgfHwgY21wID09IDEpOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pc0VuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW47CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICByZXR1cm4gdGhpcy5zdGFydC5yb3cgPT0gcm93ICYmIHRoaXMuc3RhcnQuY29sdW1uID09IGNvbHVtbjsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuc2V0U3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodHlwZW9mIHJvdyA9PSAib2JqZWN0IikgewogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93LnJvdzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRoaXMuc3RhcnQucm93ID0gcm93OwogICAgICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnNldEVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0eXBlb2Ygcm93ID09ICJvYmplY3QiKSB7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IHJvdy5jb2x1bW47CiAgICAgICAgICAgIHRoaXMuZW5kLnJvdyA9IHJvdy5yb3c7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aGlzLmVuZC5yb3cgPSByb3c7CiAgICAgICAgICAgIHRoaXMuZW5kLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgICB9CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pID09IDApIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNFbmQocm93LCBjb2x1bW4pIHx8IHRoaXMuaXNTdGFydChyb3csIGNvbHVtbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaW5zaWRlU3RhcnQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW5kKHJvdywgY29sdW1uKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5pbnNpZGVFbmQgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAodGhpcy5jb21wYXJlKHJvdywgY29sdW1uKSA9PSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzU3RhcnQocm93LCBjb2x1bW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICBpZiAoIXRoaXMuaXNNdWx0aUxpbmUoKSkgewogICAgICAgICAgICBpZiAocm93ID09PSB0aGlzLnN0YXJ0LnJvdykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8IHRoaXMuc3RhcnQuY29sdW1uID8gLTEgOiAoY29sdW1uID4gdGhpcy5lbmQuY29sdW1uID8gMSA6IDApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyb3cgPCB0aGlzLnN0YXJ0LnJvdykKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIGlmIChyb3cgPiB0aGlzLmVuZC5yb3cpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmICh0aGlzLnN0YXJ0LnJvdyA9PT0gcm93KQogICAgICAgICAgICByZXR1cm4gY29sdW1uID49IHRoaXMuc3RhcnQuY29sdW1uID8gMCA6IC0xOwogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT09IHJvdykKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbiA8PSB0aGlzLmVuZC5jb2x1bW4gPyAwIDogMTsKICAgICAgICByZXR1cm4gMDsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZVN0YXJ0ID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jb21wYXJlRW5kID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgaWYgKHRoaXMuZW5kLnJvdyA9PSByb3cgJiYgdGhpcy5lbmQuY29sdW1uID09IGNvbHVtbikgewogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29tcGFyZUluc2lkZSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPT0gcm93ICYmIHRoaXMuZW5kLmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRoaXMuc3RhcnQucm93ID09IHJvdyAmJiB0aGlzLnN0YXJ0LmNvbHVtbiA9PSBjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcGFyZShyb3csIGNvbHVtbik7CiAgICAgICAgfQogICAgfTsKICAgIFJhbmdlLnByb3RvdHlwZS5jbGlwUm93cyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIGlmICh0aGlzLmVuZC5yb3cgPiBsYXN0Um93KQogICAgICAgICAgICB2YXIgZW5kID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLmVuZC5yb3cgPCBmaXJzdFJvdykKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiBmaXJzdFJvdywgY29sdW1uOiAwIH07CiAgICAgICAgaWYgKHRoaXMuc3RhcnQucm93ID4gbGFzdFJvdykKICAgICAgICAgICAgdmFyIHN0YXJ0ID0geyByb3c6IGxhc3RSb3cgKyAxLCBjb2x1bW46IDAgfTsKICAgICAgICBlbHNlIGlmICh0aGlzLnN0YXJ0LnJvdyA8IGZpcnN0Um93KQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogZmlyc3RSb3csIGNvbHVtbjogMCB9OwogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHN0YXJ0IHx8IHRoaXMuc3RhcnQsIGVuZCB8fCB0aGlzLmVuZCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmV4dGVuZCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBjbXAgPSB0aGlzLmNvbXBhcmUocm93LCBjb2x1bW4pOwogICAgICAgIGlmIChjbXAgPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgZWxzZSBpZiAoY21wID09IC0xKQogICAgICAgICAgICB2YXIgc3RhcnQgPSB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgICAgIGVsc2UKICAgICAgICAgICAgdmFyIGVuZCA9IHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICAgICAgcmV0dXJuIFJhbmdlLmZyb21Qb2ludHMoc3RhcnQgfHwgdGhpcy5zdGFydCwgZW5kIHx8IHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuaXNFbXB0eSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gKHRoaXMuc3RhcnQucm93ID09PSB0aGlzLmVuZC5yb3cgJiYgdGhpcy5zdGFydC5jb2x1bW4gPT09IHRoaXMuZW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmlzTXVsdGlMaW5lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiAodGhpcy5zdGFydC5yb3cgIT09IHRoaXMuZW5kLnJvdyk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiBSYW5nZS5mcm9tUG9pbnRzKHRoaXMuc3RhcnQsIHRoaXMuZW5kKTsKICAgIH07CiAgICBSYW5nZS5wcm90b3R5cGUuY29sbGFwc2VSb3dzID0gZnVuY3Rpb24gKCkgewogICAgICAgIGlmICh0aGlzLmVuZC5jb2x1bW4gPT0gMCkKICAgICAgICAgICAgcmV0dXJuIG5ldyBSYW5nZSh0aGlzLnN0YXJ0LnJvdywgMCwgTWF0aC5tYXgodGhpcy5zdGFydC5yb3csIHRoaXMuZW5kLnJvdyAtIDEpLCAwKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBuZXcgUmFuZ2UodGhpcy5zdGFydC5yb3csIDAsIHRoaXMuZW5kLnJvdywgMCk7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLnRvU2NyZWVuUmFuZ2UgPSBmdW5jdGlvbiAoc2Vzc2lvbikgewogICAgICAgIHZhciBzY3JlZW5Qb3NTdGFydCA9IHNlc3Npb24uZG9jdW1lbnRUb1NjcmVlblBvc2l0aW9uKHRoaXMuc3RhcnQpOwogICAgICAgIHZhciBzY3JlZW5Qb3NFbmQgPSBzZXNzaW9uLmRvY3VtZW50VG9TY3JlZW5Qb3NpdGlvbih0aGlzLmVuZCk7CiAgICAgICAgcmV0dXJuIG5ldyBSYW5nZShzY3JlZW5Qb3NTdGFydC5yb3csIHNjcmVlblBvc1N0YXJ0LmNvbHVtbiwgc2NyZWVuUG9zRW5kLnJvdywgc2NyZWVuUG9zRW5kLmNvbHVtbik7CiAgICB9OwogICAgUmFuZ2UucHJvdG90eXBlLm1vdmVCeSA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuc3RhcnQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLnN0YXJ0LmNvbHVtbiArPSBjb2x1bW47CiAgICAgICAgdGhpcy5lbmQucm93ICs9IHJvdzsKICAgICAgICB0aGlzLmVuZC5jb2x1bW4gKz0gY29sdW1uOwogICAgfTsKICAgIHJldHVybiBSYW5nZTsKfSgpKTsKUmFuZ2UuZnJvbVBvaW50cyA9IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7CiAgICByZXR1cm4gbmV3IFJhbmdlKHN0YXJ0LnJvdywgc3RhcnQuY29sdW1uLCBlbmQucm93LCBlbmQuY29sdW1uKTsKfTsKUmFuZ2UuY29tcGFyZVBvaW50cyA9IGNvbXBhcmVQb2ludHM7ClJhbmdlLmNvbXBhcmVQb2ludHMgPSBmdW5jdGlvbiAocDEsIHAyKSB7CiAgICByZXR1cm4gcDEucm93IC0gcDIucm93IHx8IHAxLmNvbHVtbiAtIHAyLmNvbHVtbjsKfTsKZXhwb3J0cy5SYW5nZSA9IFJhbmdlOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvYW5jaG9yIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CnZhciBvb3AgPSByZXF1aXJlKCIuL2xpYi9vb3AiKTsKdmFyIEV2ZW50RW1pdHRlciA9IHJlcXVpcmUoIi4vbGliL2V2ZW50X2VtaXR0ZXIiKS5FdmVudEVtaXR0ZXI7CnZhciBBbmNob3IgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICBmdW5jdGlvbiBBbmNob3IoZG9jLCByb3csIGNvbHVtbikgewogICAgICAgIHRoaXMuJG9uQ2hhbmdlID0gdGhpcy5vbkNoYW5nZS5iaW5kKHRoaXMpOwogICAgICAgIHRoaXMuYXR0YWNoKGRvYyk7CiAgICAgICAgaWYgKHR5cGVvZiBjb2x1bW4gPT0gInVuZGVmaW5lZCIpCiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb24ocm93LnJvdywgcm93LmNvbHVtbik7CiAgICAgICAgZWxzZQogICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uKHJvdywgY29sdW1uKTsKICAgIH0KICAgIEFuY2hvci5wcm90b3R5cGUuZ2V0UG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQodGhpcy5yb3csIHRoaXMuY29sdW1uKTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmdldERvY3VtZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLmRvY3VtZW50OwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUub25DaGFuZ2UgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICBpZiAoZGVsdGEuc3RhcnQucm93ID09IGRlbHRhLmVuZC5yb3cgJiYgZGVsdGEuc3RhcnQucm93ICE9IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKGRlbHRhLnN0YXJ0LnJvdyA+IHRoaXMucm93KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIHBvaW50ID0gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHsgcm93OiB0aGlzLnJvdywgY29sdW1uOiB0aGlzLmNvbHVtbiB9LCB0aGlzLiRpbnNlcnRSaWdodCk7CiAgICAgICAgdGhpcy5zZXRQb3NpdGlvbihwb2ludC5yb3csIHBvaW50LmNvbHVtbiwgdHJ1ZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbiwgbm9DbGlwKSB7CiAgICAgICAgdmFyIHBvczsKICAgICAgICBpZiAobm9DbGlwKSB7CiAgICAgICAgICAgIHBvcyA9IHsKICAgICAgICAgICAgICAgIHJvdzogcm93LAogICAgICAgICAgICAgICAgY29sdW1uOiBjb2x1bW4KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBvcyA9IHRoaXMuJGNsaXBQb3NpdGlvblRvRG9jdW1lbnQocm93LCBjb2x1bW4pOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5yb3cgPT0gcG9zLnJvdyAmJiB0aGlzLmNvbHVtbiA9PSBwb3MuY29sdW1uKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdmFyIG9sZCA9IHsKICAgICAgICAgICAgcm93OiB0aGlzLnJvdywKICAgICAgICAgICAgY29sdW1uOiB0aGlzLmNvbHVtbgogICAgICAgIH07CiAgICAgICAgdGhpcy5yb3cgPSBwb3Mucm93OwogICAgICAgIHRoaXMuY29sdW1uID0gcG9zLmNvbHVtbjsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZSIsIHsKICAgICAgICAgICAgb2xkOiBvbGQsCiAgICAgICAgICAgIHZhbHVlOiBwb3MKICAgICAgICB9KTsKICAgIH07CiAgICBBbmNob3IucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9mZigiY2hhbmdlIiwgdGhpcy4kb25DaGFuZ2UpOwogICAgfTsKICAgIEFuY2hvci5wcm90b3R5cGUuYXR0YWNoID0gZnVuY3Rpb24gKGRvYykgewogICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2MgfHwgdGhpcy5kb2N1bWVudDsKICAgICAgICB0aGlzLmRvY3VtZW50Lm9uKCJjaGFuZ2UiLCB0aGlzLiRvbkNoYW5nZSk7CiAgICB9OwogICAgQW5jaG9yLnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uVG9Eb2N1bWVudCA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHZhciBwb3MgPSB7fTsKICAgICAgICBpZiAocm93ID49IHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgcG9zLnJvdyA9IE1hdGgubWF4KDAsIHRoaXMuZG9jdW1lbnQuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA8IDApIHsKICAgICAgICAgICAgcG9zLnJvdyA9IDA7CiAgICAgICAgICAgIHBvcy5jb2x1bW4gPSAwOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcG9zLnJvdyA9IHJvdzsKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IE1hdGgubWluKHRoaXMuZG9jdW1lbnQuZ2V0TGluZShwb3Mucm93KS5sZW5ndGgsIE1hdGgubWF4KDAsIGNvbHVtbikpOwogICAgICAgIH0KICAgICAgICBpZiAoY29sdW1uIDwgMCkKICAgICAgICAgICAgcG9zLmNvbHVtbiA9IDA7CiAgICAgICAgcmV0dXJuIHBvczsKICAgIH07CiAgICByZXR1cm4gQW5jaG9yOwp9KCkpOwpBbmNob3IucHJvdG90eXBlLiRpbnNlcnRSaWdodCA9IGZhbHNlOwpvb3AuaW1wbGVtZW50KEFuY2hvci5wcm90b3R5cGUsIEV2ZW50RW1pdHRlcik7CmZ1bmN0aW9uICRwb2ludHNJbk9yZGVyKHBvaW50MSwgcG9pbnQyLCBlcXVhbFBvaW50c0luT3JkZXIpIHsKICAgIHZhciBiQ29sSXNBZnRlciA9IGVxdWFsUG9pbnRzSW5PcmRlciA/IHBvaW50MS5jb2x1bW4gPD0gcG9pbnQyLmNvbHVtbiA6IHBvaW50MS5jb2x1bW4gPCBwb2ludDIuY29sdW1uOwogICAgcmV0dXJuIChwb2ludDEucm93IDwgcG9pbnQyLnJvdykgfHwgKHBvaW50MS5yb3cgPT0gcG9pbnQyLnJvdyAmJiBiQ29sSXNBZnRlcik7Cn0KZnVuY3Rpb24gJGdldFRyYW5zZm9ybWVkUG9pbnQoZGVsdGEsIHBvaW50LCBtb3ZlSWZFcXVhbCkgewogICAgdmFyIGRlbHRhSXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICB2YXIgZGVsdGFSb3dTaGlmdCA9IChkZWx0YUlzSW5zZXJ0ID8gMSA6IC0xKSAqIChkZWx0YS5lbmQucm93IC0gZGVsdGEuc3RhcnQucm93KTsKICAgIHZhciBkZWx0YUNvbFNoaWZ0ID0gKGRlbHRhSXNJbnNlcnQgPyAxIDogLTEpICogKGRlbHRhLmVuZC5jb2x1bW4gLSBkZWx0YS5zdGFydC5jb2x1bW4pOwogICAgdmFyIGRlbHRhU3RhcnQgPSBkZWx0YS5zdGFydDsKICAgIHZhciBkZWx0YUVuZCA9IGRlbHRhSXNJbnNlcnQgPyBkZWx0YVN0YXJ0IDogZGVsdGEuZW5kOyAvLyBDb2xsYXBzZSBpbnNlcnQgcmFuZ2UuCiAgICBpZiAoJHBvaW50c0luT3JkZXIocG9pbnQsIGRlbHRhU3RhcnQsIG1vdmVJZkVxdWFsKSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJvdzogcG9pbnQucm93LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbgogICAgICAgIH07CiAgICB9CiAgICBpZiAoJHBvaW50c0luT3JkZXIoZGVsdGFFbmQsIHBvaW50LCAhbW92ZUlmRXF1YWwpKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcm93OiBwb2ludC5yb3cgKyBkZWx0YVJvd1NoaWZ0LAogICAgICAgICAgICBjb2x1bW46IHBvaW50LmNvbHVtbiArIChwb2ludC5yb3cgPT0gZGVsdGFFbmQucm93ID8gZGVsdGFDb2xTaGlmdCA6IDApCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiB7CiAgICAgICAgcm93OiBkZWx0YVN0YXJ0LnJvdywKICAgICAgICBjb2x1bW46IGRlbHRhU3RhcnQuY29sdW1uCiAgICB9Owp9CmV4cG9ydHMuQW5jaG9yID0gQW5jaG9yOwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvZG9jdW1lbnQiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpeyJ1c2Ugc3RyaWN0IjsKdmFyIG9vcCA9IHJlcXVpcmUoIi4vbGliL29vcCIpOwp2YXIgYXBwbHlEZWx0YSA9IHJlcXVpcmUoIi4vYXBwbHlfZGVsdGEiKS5hcHBseURlbHRhOwp2YXIgRXZlbnRFbWl0dGVyID0gcmVxdWlyZSgiLi9saWIvZXZlbnRfZW1pdHRlciIpLkV2ZW50RW1pdHRlcjsKdmFyIFJhbmdlID0gcmVxdWlyZSgiLi9yYW5nZSIpLlJhbmdlOwp2YXIgQW5jaG9yID0gcmVxdWlyZSgiLi9hbmNob3IiKS5BbmNob3I7CnZhciBEb2N1bWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgIGZ1bmN0aW9uIERvY3VtZW50KHRleHRPckxpbmVzKSB7CiAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIGlmICh0ZXh0T3JMaW5lcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhpcy4kbGluZXMgPSBbIiJdOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHRleHRPckxpbmVzKSkgewogICAgICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiAwLCBjb2x1bW46IDAgfSwgdGV4dE9yTGluZXMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0T3JMaW5lcyk7CiAgICAgICAgfQogICAgfQogICAgRG9jdW1lbnQucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICB2YXIgbGVuID0gdGhpcy5nZXRMZW5ndGgoKSAtIDE7CiAgICAgICAgdGhpcy5yZW1vdmUobmV3IFJhbmdlKDAsIDAsIGxlbiwgdGhpcy5nZXRMaW5lKGxlbikubGVuZ3RoKSk7CiAgICAgICAgdGhpcy5pbnNlcnQoeyByb3c6IDAsIGNvbHVtbjogMCB9LCB0ZXh0IHx8ICIiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0VmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWxsTGluZXMoKS5qb2luKHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuY3JlYXRlQW5jaG9yID0gZnVuY3Rpb24gKHJvdywgY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmNob3IodGhpcywgcm93LCBjb2x1bW4pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kZGV0ZWN0TmV3TGluZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGV4dC5tYXRjaCgvXi4qPyhcclxufFxyfFxuKS9tKTsKICAgICAgICB0aGlzLiRhdXRvTmV3TGluZSA9IG1hdGNoID8gbWF0Y2hbMV0gOiAiXG4iOwogICAgICAgIHRoaXMuX3NpZ25hbCgiY2hhbmdlTmV3TGluZU1vZGUiKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TmV3TGluZUNoYXJhY3RlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuJG5ld0xpbmVNb2RlKSB7CiAgICAgICAgICAgIGNhc2UgIndpbmRvd3MiOgogICAgICAgICAgICAgICAgcmV0dXJuICJcclxuIjsKICAgICAgICAgICAgY2FzZSAidW5peCI6CiAgICAgICAgICAgICAgICByZXR1cm4gIlxuIjsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRhdXRvTmV3TGluZSB8fCAiXG4iOwogICAgICAgIH0KICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuc2V0TmV3TGluZU1vZGUgPSBmdW5jdGlvbiAobmV3TGluZU1vZGUpIHsKICAgICAgICBpZiAodGhpcy4kbmV3TGluZU1vZGUgPT09IG5ld0xpbmVNb2RlKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy4kbmV3TGluZU1vZGUgPSBuZXdMaW5lTW9kZTsKICAgICAgICB0aGlzLl9zaWduYWwoImNoYW5nZU5ld0xpbmVNb2RlIik7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldE5ld0xpbmVNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRuZXdMaW5lTW9kZTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaXNOZXdMaW5lID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gKHRleHQgPT0gIlxyXG4iIHx8IHRleHQgPT0gIlxyIiB8fCB0ZXh0ID09ICJcbiIpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lID0gZnVuY3Rpb24gKHJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lc1tyb3ddIHx8ICIiOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lcyA9IGZ1bmN0aW9uIChmaXJzdFJvdywgbGFzdFJvdykgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5zbGljZShmaXJzdFJvdywgbGFzdFJvdyArIDEpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRBbGxMaW5lcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lcygwLCB0aGlzLmdldExlbmd0aCgpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuZ2V0TGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aGlzLiRsaW5lcy5sZW5ndGg7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmdldFRleHRSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHJldHVybiB0aGlzLmdldExpbmVzRm9yUmFuZ2UocmFuZ2UpLmpvaW4odGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5nZXRMaW5lc0ZvclJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7CiAgICAgICAgdmFyIGxpbmVzOwogICAgICAgIGlmIChyYW5nZS5zdGFydC5yb3cgPT09IHJhbmdlLmVuZC5yb3cpIHsKICAgICAgICAgICAgbGluZXMgPSBbdGhpcy5nZXRMaW5lKHJhbmdlLnN0YXJ0LnJvdykuc3Vic3RyaW5nKHJhbmdlLnN0YXJ0LmNvbHVtbiwgcmFuZ2UuZW5kLmNvbHVtbildOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGluZXMgPSB0aGlzLmdldExpbmVzKHJhbmdlLnN0YXJ0LnJvdywgcmFuZ2UuZW5kLnJvdyk7CiAgICAgICAgICAgIGxpbmVzWzBdID0gKGxpbmVzWzBdIHx8ICIiKS5zdWJzdHJpbmcocmFuZ2Uuc3RhcnQuY29sdW1uKTsKICAgICAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSAxOwogICAgICAgICAgICBpZiAocmFuZ2UuZW5kLnJvdyAtIHJhbmdlLnN0YXJ0LnJvdyA9PSBsKQogICAgICAgICAgICAgICAgbGluZXNbbF0gPSBsaW5lc1tsXS5zdWJzdHJpbmcoMCwgcmFuZ2UuZW5kLmNvbHVtbik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaW5lczsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TGluZXMgPSBmdW5jdGlvbiAocm93LCBsaW5lcykgewogICAgICAgIGNvbnNvbGUud2FybigiVXNlIG9mIGRvY3VtZW50Lmluc2VydExpbmVzIGlzIGRlcHJlY2F0ZWQuIFVzZSB0aGUgaW5zZXJ0RnVsbExpbmVzIG1ldGhvZCBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydEZ1bGxMaW5lcyhyb3csIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlTGluZXMgPSBmdW5jdGlvbiAoZmlyc3RSb3csIGxhc3RSb3cpIHsKICAgICAgICBjb25zb2xlLndhcm4oIlVzZSBvZiBkb2N1bWVudC5yZW1vdmVMaW5lcyBpcyBkZXByZWNhdGVkLiBVc2UgdGhlIHJlbW92ZUZ1bGxMaW5lcyBtZXRob2QgaW5zdGVhZC4iKTsKICAgICAgICByZXR1cm4gdGhpcy5yZW1vdmVGdWxsTGluZXMoZmlyc3RSb3csIGxhc3RSb3cpOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbnNlcnROZXdMaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgY29uc29sZS53YXJuKCJVc2Ugb2YgZG9jdW1lbnQuaW5zZXJ0TmV3TGluZSBpcyBkZXByZWNhdGVkLiBVc2UgaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIFsnJywgJyddKSBpbnN0ZWFkLiIpOwogICAgICAgIHJldHVybiB0aGlzLmluc2VydE1lcmdlZExpbmVzKHBvc2l0aW9uLCBbIiIsICIiXSk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGV4dCkgewogICAgICAgIGlmICh0aGlzLmdldExlbmd0aCgpIDw9IDEpCiAgICAgICAgICAgIHRoaXMuJGRldGVjdE5ld0xpbmUodGV4dCk7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0TWVyZ2VkTGluZXMocG9zaXRpb24sIHRoaXMuJHNwbGl0KHRleHQpKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0SW5MaW5lID0gZnVuY3Rpb24gKHBvc2l0aW9uLCB0ZXh0KSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5wb3MocG9zaXRpb24ucm93LCBwb3NpdGlvbi5jb2x1bW4gKyB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgdGhpcy5hcHBseURlbHRhKHsKICAgICAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgICAgICBlbmQ6IGVuZCwKICAgICAgICAgICAgYWN0aW9uOiAiaW5zZXJ0IiwKICAgICAgICAgICAgbGluZXM6IFt0ZXh0XQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsaXBwZWRQb3MgPSBmdW5jdGlvbiAocm93LCBjb2x1bW4pIHsKICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5nZXRMZW5ndGgoKTsKICAgICAgICBpZiAocm93ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyb3cgPCAwKSB7CiAgICAgICAgICAgIHJvdyA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcm93ID0gbGVuZ3RoIC0gMTsKICAgICAgICAgICAgY29sdW1uID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICB2YXIgbGluZSA9IHRoaXMuZ2V0TGluZShyb3cpOwogICAgICAgIGlmIChjb2x1bW4gPT0gdW5kZWZpbmVkKQogICAgICAgICAgICBjb2x1bW4gPSBsaW5lLmxlbmd0aDsKICAgICAgICBjb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChjb2x1bW4sIDApLCBsaW5lLmxlbmd0aCk7CiAgICAgICAgcmV0dXJuIHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmNsb25lUG9zID0gZnVuY3Rpb24gKHBvcykgewogICAgICAgIHJldHVybiB7IHJvdzogcG9zLnJvdywgY29sdW1uOiBwb3MuY29sdW1uIH07CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnBvcyA9IGZ1bmN0aW9uIChyb3csIGNvbHVtbikgewogICAgICAgIHJldHVybiB7IHJvdzogcm93LCBjb2x1bW46IGNvbHVtbiB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kY2xpcFBvc2l0aW9uID0gZnVuY3Rpb24gKHBvc2l0aW9uKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuZ2V0TGVuZ3RoKCk7CiAgICAgICAgaWYgKHBvc2l0aW9uLnJvdyA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcG9zaXRpb24ucm93ID0gTWF0aC5tYXgoMCwgbGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIHBvc2l0aW9uLmNvbHVtbiA9IHRoaXMuZ2V0TGluZShsZW5ndGggLSAxKS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwb3NpdGlvbi5yb3cgPSBNYXRoLm1heCgwLCBwb3NpdGlvbi5yb3cpOwogICAgICAgICAgICBwb3NpdGlvbi5jb2x1bW4gPSBNYXRoLm1pbihNYXRoLm1heChwb3NpdGlvbi5jb2x1bW4sIDApLCB0aGlzLmdldExpbmUocG9zaXRpb24ucm93KS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmluc2VydEZ1bGxMaW5lcyA9IGZ1bmN0aW9uIChyb3csIGxpbmVzKSB7CiAgICAgICAgcm93ID0gTWF0aC5taW4oTWF0aC5tYXgocm93LCAwKSwgdGhpcy5nZXRMZW5ndGgoKSk7CiAgICAgICAgdmFyIGNvbHVtbiA9IDA7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkpIHsKICAgICAgICAgICAgbGluZXMgPSBsaW5lcy5jb25jYXQoWyIiXSk7CiAgICAgICAgICAgIGNvbHVtbiA9IDA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsaW5lcyA9IFsiIl0uY29uY2F0KGxpbmVzKTsKICAgICAgICAgICAgcm93LS07CiAgICAgICAgICAgIGNvbHVtbiA9IHRoaXMuJGxpbmVzW3Jvd10ubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLmluc2VydE1lcmdlZExpbmVzKHsgcm93OiByb3csIGNvbHVtbjogY29sdW1uIH0sIGxpbmVzKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuaW5zZXJ0TWVyZ2VkTGluZXMgPSBmdW5jdGlvbiAocG9zaXRpb24sIGxpbmVzKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gdGhpcy5jbGlwcGVkUG9zKHBvc2l0aW9uLnJvdywgcG9zaXRpb24uY29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gewogICAgICAgICAgICByb3c6IHN0YXJ0LnJvdyArIGxpbmVzLmxlbmd0aCAtIDEsCiAgICAgICAgICAgIGNvbHVtbjogKGxpbmVzLmxlbmd0aCA9PSAxID8gc3RhcnQuY29sdW1uIDogMCkgKyBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGgKICAgICAgICB9OwogICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiBzdGFydCwKICAgICAgICAgICAgZW5kOiBlbmQsCiAgICAgICAgICAgIGFjdGlvbjogImluc2VydCIsCiAgICAgICAgICAgIGxpbmVzOiBsaW5lcwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKGVuZCk7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5zdGFydC5yb3csIHJhbmdlLnN0YXJ0LmNvbHVtbik7CiAgICAgICAgdmFyIGVuZCA9IHRoaXMuY2xpcHBlZFBvcyhyYW5nZS5lbmQucm93LCByYW5nZS5lbmQuY29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0pOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlSW5MaW5lID0gZnVuY3Rpb24gKHJvdywgc3RhcnRDb2x1bW4sIGVuZENvbHVtbikgewogICAgICAgIHZhciBzdGFydCA9IHRoaXMuY2xpcHBlZFBvcyhyb3csIHN0YXJ0Q29sdW1uKTsKICAgICAgICB2YXIgZW5kID0gdGhpcy5jbGlwcGVkUG9zKHJvdywgZW5kQ29sdW1uKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgICAgIGVuZDogZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9KQogICAgICAgIH0sIHRydWUpOwogICAgICAgIHJldHVybiB0aGlzLmNsb25lUG9zKHN0YXJ0KTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmVtb3ZlRnVsbExpbmVzID0gZnVuY3Rpb24gKGZpcnN0Um93LCBsYXN0Um93KSB7CiAgICAgICAgZmlyc3RSb3cgPSBNYXRoLm1pbihNYXRoLm1heCgwLCBmaXJzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICBsYXN0Um93ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgbGFzdFJvdyksIHRoaXMuZ2V0TGVuZ3RoKCkgLSAxKTsKICAgICAgICB2YXIgZGVsZXRlRmlyc3ROZXdMaW5lID0gbGFzdFJvdyA9PSB0aGlzLmdldExlbmd0aCgpIC0gMSAmJiBmaXJzdFJvdyA+IDA7CiAgICAgICAgdmFyIGRlbGV0ZUxhc3ROZXdMaW5lID0gbGFzdFJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxOwogICAgICAgIHZhciBzdGFydFJvdyA9IChkZWxldGVGaXJzdE5ld0xpbmUgPyBmaXJzdFJvdyAtIDEgOiBmaXJzdFJvdyk7CiAgICAgICAgdmFyIHN0YXJ0Q29sID0gKGRlbGV0ZUZpcnN0TmV3TGluZSA/IHRoaXMuZ2V0TGluZShzdGFydFJvdykubGVuZ3RoIDogMCk7CiAgICAgICAgdmFyIGVuZFJvdyA9IChkZWxldGVMYXN0TmV3TGluZSA/IGxhc3RSb3cgKyAxIDogbGFzdFJvdyk7CiAgICAgICAgdmFyIGVuZENvbCA9IChkZWxldGVMYXN0TmV3TGluZSA/IDAgOiB0aGlzLmdldExpbmUoZW5kUm93KS5sZW5ndGgpOwogICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShzdGFydFJvdywgc3RhcnRDb2wsIGVuZFJvdywgZW5kQ29sKTsKICAgICAgICB2YXIgZGVsZXRlZExpbmVzID0gdGhpcy4kbGluZXMuc2xpY2UoZmlyc3RSb3csIGxhc3RSb3cgKyAxKTsKICAgICAgICB0aGlzLmFwcGx5RGVsdGEoewogICAgICAgICAgICBzdGFydDogcmFuZ2Uuc3RhcnQsCiAgICAgICAgICAgIGVuZDogcmFuZ2UuZW5kLAogICAgICAgICAgICBhY3Rpb246ICJyZW1vdmUiLAogICAgICAgICAgICBsaW5lczogdGhpcy5nZXRMaW5lc0ZvclJhbmdlKHJhbmdlKQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBkZWxldGVkTGluZXM7CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJlbW92ZU5ld0xpbmUgPSBmdW5jdGlvbiAocm93KSB7CiAgICAgICAgaWYgKHJvdyA8IHRoaXMuZ2V0TGVuZ3RoKCkgLSAxICYmIHJvdyA+PSAwKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93LCB0aGlzLmdldExpbmUocm93KS5sZW5ndGgpLAogICAgICAgICAgICAgICAgZW5kOiB0aGlzLnBvcyhyb3cgKyAxLCAwKSwKICAgICAgICAgICAgICAgIGFjdGlvbjogInJlbW92ZSIsCiAgICAgICAgICAgICAgICBsaW5lczogWyIiLCAiIl0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gKHJhbmdlLCB0ZXh0KSB7CiAgICAgICAgaWYgKCEocmFuZ2UgaW5zdGFuY2VvZiBSYW5nZSkpCiAgICAgICAgICAgIHJhbmdlID0gUmFuZ2UuZnJvbVBvaW50cyhyYW5nZS5zdGFydCwgcmFuZ2UuZW5kKTsKICAgICAgICBpZiAodGV4dC5sZW5ndGggPT09IDAgJiYgcmFuZ2UuaXNFbXB0eSgpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2Uuc3RhcnQ7CiAgICAgICAgaWYgKHRleHQgPT0gdGhpcy5nZXRUZXh0UmFuZ2UocmFuZ2UpKQogICAgICAgICAgICByZXR1cm4gcmFuZ2UuZW5kOwogICAgICAgIHRoaXMucmVtb3ZlKHJhbmdlKTsKICAgICAgICB2YXIgZW5kOwogICAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgICAgIGVuZCA9IHRoaXMuaW5zZXJ0KHJhbmdlLnN0YXJ0LCB0ZXh0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHJhbmdlLnN0YXJ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZW5kOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5hcHBseURlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmFwcGx5RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLnJldmVydERlbHRhcyA9IGZ1bmN0aW9uIChkZWx0YXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gZGVsdGFzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIHRoaXMucmV2ZXJ0RGVsdGEoZGVsdGFzW2ldKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLmFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEsIGRvTm90VmFsaWRhdGUpIHsKICAgICAgICB2YXIgaXNJbnNlcnQgPSBkZWx0YS5hY3Rpb24gPT0gImluc2VydCI7CiAgICAgICAgaWYgKGlzSW5zZXJ0ID8gZGVsdGEubGluZXMubGVuZ3RoIDw9IDEgJiYgIWRlbHRhLmxpbmVzWzBdCiAgICAgICAgICAgIDogIVJhbmdlLmNvbXBhcmVQb2ludHMoZGVsdGEuc3RhcnQsIGRlbHRhLmVuZCkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoaXNJbnNlcnQgJiYgZGVsdGEubGluZXMubGVuZ3RoID4gMjAwMDApIHsKICAgICAgICAgICAgdGhpcy4kc3BsaXRBbmRhcHBseUxhcmdlRGVsdGEoZGVsdGEsIDIwMDAwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGFwcGx5RGVsdGEodGhpcy4kbGluZXMsIGRlbHRhLCBkb05vdFZhbGlkYXRlKTsKICAgICAgICAgICAgdGhpcy5fc2lnbmFsKCJjaGFuZ2UiLCBkZWx0YSk7CiAgICAgICAgfQogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS4kc2FmZUFwcGx5RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB2YXIgZG9jTGVuZ3RoID0gdGhpcy4kbGluZXMubGVuZ3RoOwogICAgICAgIGlmIChkZWx0YS5hY3Rpb24gPT0gInJlbW92ZSIgJiYgZGVsdGEuc3RhcnQucm93IDwgZG9jTGVuZ3RoICYmIGRlbHRhLmVuZC5yb3cgPCBkb2NMZW5ndGgKICAgICAgICAgICAgfHwgZGVsdGEuYWN0aW9uID09ICJpbnNlcnQiICYmIGRlbHRhLnN0YXJ0LnJvdyA8PSBkb2NMZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhKTsKICAgICAgICB9CiAgICB9OwogICAgRG9jdW1lbnQucHJvdG90eXBlLiRzcGxpdEFuZGFwcGx5TGFyZ2VEZWx0YSA9IGZ1bmN0aW9uIChkZWx0YSwgTUFYKSB7CiAgICAgICAgdmFyIGxpbmVzID0gZGVsdGEubGluZXM7CiAgICAgICAgdmFyIGwgPSBsaW5lcy5sZW5ndGggLSBNQVggKyAxOwogICAgICAgIHZhciByb3cgPSBkZWx0YS5zdGFydC5yb3c7CiAgICAgICAgdmFyIGNvbHVtbiA9IGRlbHRhLnN0YXJ0LmNvbHVtbjsKICAgICAgICBmb3IgKHZhciBmcm9tID0gMCwgdG8gPSAwOyBmcm9tIDwgbDsgZnJvbSA9IHRvKSB7CiAgICAgICAgICAgIHRvICs9IE1BWCAtIDE7CiAgICAgICAgICAgIHZhciBjaHVuayA9IGxpbmVzLnNsaWNlKGZyb20sIHRvKTsKICAgICAgICAgICAgY2h1bmsucHVzaCgiIik7CiAgICAgICAgICAgIHRoaXMuYXBwbHlEZWx0YSh7CiAgICAgICAgICAgICAgICBzdGFydDogdGhpcy5wb3Mocm93ICsgZnJvbSwgY29sdW1uKSwKICAgICAgICAgICAgICAgIGVuZDogdGhpcy5wb3Mocm93ICsgdG8sIGNvbHVtbiA9IDApLAogICAgICAgICAgICAgICAgYWN0aW9uOiBkZWx0YS5hY3Rpb24sCiAgICAgICAgICAgICAgICBsaW5lczogY2h1bmsKICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGRlbHRhLmxpbmVzID0gbGluZXMuc2xpY2UoZnJvbSk7CiAgICAgICAgZGVsdGEuc3RhcnQucm93ID0gcm93ICsgZnJvbTsKICAgICAgICBkZWx0YS5zdGFydC5jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgdGhpcy5hcHBseURlbHRhKGRlbHRhLCB0cnVlKTsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUucmV2ZXJ0RGVsdGEgPSBmdW5jdGlvbiAoZGVsdGEpIHsKICAgICAgICB0aGlzLiRzYWZlQXBwbHlEZWx0YSh7CiAgICAgICAgICAgIHN0YXJ0OiB0aGlzLmNsb25lUG9zKGRlbHRhLnN0YXJ0KSwKICAgICAgICAgICAgZW5kOiB0aGlzLmNsb25lUG9zKGRlbHRhLmVuZCksCiAgICAgICAgICAgIGFjdGlvbjogKGRlbHRhLmFjdGlvbiA9PSAiaW5zZXJ0IiA/ICJyZW1vdmUiIDogImluc2VydCIpLAogICAgICAgICAgICBsaW5lczogZGVsdGEubGluZXMuc2xpY2UoKQogICAgICAgIH0pOwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5pbmRleFRvUG9zaXRpb24gPSBmdW5jdGlvbiAoaW5kZXgsIHN0YXJ0Um93KSB7CiAgICAgICAgdmFyIGxpbmVzID0gdGhpcy4kbGluZXMgfHwgdGhpcy5nZXRBbGxMaW5lcygpOwogICAgICAgIHZhciBuZXdsaW5lTGVuZ3RoID0gdGhpcy5nZXROZXdMaW5lQ2hhcmFjdGVyKCkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwLCBsID0gbGluZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGluZGV4IC09IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgICAgIGlmIChpbmRleCA8IDApCiAgICAgICAgICAgICAgICByZXR1cm4geyByb3c6IGksIGNvbHVtbjogaW5kZXggKyBsaW5lc1tpXS5sZW5ndGggKyBuZXdsaW5lTGVuZ3RoIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHJvdzogbCAtIDEsIGNvbHVtbjogaW5kZXggKyBsaW5lc1tsIC0gMV0ubGVuZ3RoICsgbmV3bGluZUxlbmd0aCB9OwogICAgfTsKICAgIERvY3VtZW50LnByb3RvdHlwZS5wb3NpdGlvblRvSW5kZXggPSBmdW5jdGlvbiAocG9zLCBzdGFydFJvdykgewogICAgICAgIHZhciBsaW5lcyA9IHRoaXMuJGxpbmVzIHx8IHRoaXMuZ2V0QWxsTGluZXMoKTsKICAgICAgICB2YXIgbmV3bGluZUxlbmd0aCA9IHRoaXMuZ2V0TmV3TGluZUNoYXJhY3RlcigpLmxlbmd0aDsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHZhciByb3cgPSBNYXRoLm1pbihwb3Mucm93LCBsaW5lcy5sZW5ndGgpOwogICAgICAgIGZvciAodmFyIGkgPSBzdGFydFJvdyB8fCAwOyBpIDwgcm93OyArK2kpCiAgICAgICAgICAgIGluZGV4ICs9IGxpbmVzW2ldLmxlbmd0aCArIG5ld2xpbmVMZW5ndGg7CiAgICAgICAgcmV0dXJuIGluZGV4ICsgcG9zLmNvbHVtbjsKICAgIH07CiAgICBEb2N1bWVudC5wcm90b3R5cGUuJHNwbGl0ID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5zcGxpdCgvXHJcbnxccnxcbi8pOwogICAgfTsKICAgIHJldHVybiBEb2N1bWVudDsKfSgpKTsKRG9jdW1lbnQucHJvdG90eXBlLiRhdXRvTmV3TGluZSA9ICIiOwpEb2N1bWVudC5wcm90b3R5cGUuJG5ld0xpbmVNb2RlID0gImF1dG8iOwpvb3AuaW1wbGVtZW50KERvY3VtZW50LnByb3RvdHlwZSwgRXZlbnRFbWl0dGVyKTsKZXhwb3J0cy5Eb2N1bWVudCA9IERvY3VtZW50OwoKfSk7CgphY2UuZGVmaW5lKCJhY2UvbGliL2RlZXBfY29weSIsW10sIGZ1bmN0aW9uKHJlcXVpcmUsIGV4cG9ydHMsIG1vZHVsZSl7ZXhwb3J0cy5kZWVwQ29weSA9IGZ1bmN0aW9uIGRlZXBDb3B5KG9iaikgewogICAgaWYgKHR5cGVvZiBvYmogIT09ICJvYmplY3QiIHx8ICFvYmopCiAgICAgICAgcmV0dXJuIG9iajsKICAgIHZhciBjb3B5OwogICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgIGNvcHkgPSBbXTsKICAgICAgICBmb3IgKHZhciBrZXkgPSAwOyBrZXkgPCBvYmoubGVuZ3RoOyBrZXkrKykgewogICAgICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb3B5OwogICAgfQogICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopICE9PSAiW29iamVjdCBPYmplY3RdIikKICAgICAgICByZXR1cm4gb2JqOwogICAgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikKICAgICAgICBjb3B5W2tleV0gPSBkZWVwQ29weShvYmpba2V5XSk7CiAgICByZXR1cm4gY29weTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL2xpYi9sYW5nIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKXsidXNlIHN0cmljdCI7CmV4cG9ydHMubGFzdCA9IGZ1bmN0aW9uIChhKSB7CiAgICByZXR1cm4gYVthLmxlbmd0aCAtIDFdOwp9OwpleHBvcnRzLnN0cmluZ1JldmVyc2UgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnNwbGl0KCIiKS5yZXZlcnNlKCkuam9pbigiIik7Cn07CmV4cG9ydHMuc3RyaW5nUmVwZWF0ID0gZnVuY3Rpb24gKHN0cmluZywgY291bnQpIHsKICAgIHZhciByZXN1bHQgPSAnJzsKICAgIHdoaWxlIChjb3VudCA+IDApIHsKICAgICAgICBpZiAoY291bnQgJiAxKQogICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nOwogICAgICAgIGlmIChjb3VudCA+Pj0gMSkKICAgICAgICAgICAgc3RyaW5nICs9IHN0cmluZzsKICAgIH0KICAgIHJldHVybiByZXN1bHQ7Cn07CnZhciB0cmltQmVnaW5SZWdleHAgPSAvXlxzXHMqLzsKdmFyIHRyaW1FbmRSZWdleHAgPSAvXHNccyokLzsKZXhwb3J0cy5zdHJpbmdUcmltTGVmdCA9IGZ1bmN0aW9uIChzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0cmltQmVnaW5SZWdleHAsICcnKTsKfTsKZXhwb3J0cy5zdHJpbmdUcmltUmlnaHQgPSBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpOwp9OwpleHBvcnRzLmNvcHlPYmplY3QgPSBmdW5jdGlvbiAob2JqKSB7CiAgICB2YXIgY29weSA9IHt9OwogICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgIGNvcHlba2V5XSA9IG9ialtrZXldOwogICAgfQogICAgcmV0dXJuIGNvcHk7Cn07CmV4cG9ydHMuY29weUFycmF5ID0gZnVuY3Rpb24gKGFycmF5KSB7CiAgICB2YXIgY29weSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICBpZiAoYXJyYXlbaV0gJiYgdHlwZW9mIGFycmF5W2ldID09ICJvYmplY3QiKQogICAgICAgICAgICBjb3B5W2ldID0gdGhpcy5jb3B5T2JqZWN0KGFycmF5W2ldKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGNvcHlbaV0gPSBhcnJheVtpXTsKICAgIH0KICAgIHJldHVybiBjb3B5Owp9OwpleHBvcnRzLmRlZXBDb3B5ID0gcmVxdWlyZSgiLi9kZWVwX2NvcHkiKS5kZWVwQ29weTsKZXhwb3J0cy5hcnJheVRvTWFwID0gZnVuY3Rpb24gKGFycikgewogICAgdmFyIG1hcCA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKICAgICAgICBtYXBbYXJyW2ldXSA9IDE7CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmNyZWF0ZU1hcCA9IGZ1bmN0aW9uIChwcm9wcykgewogICAgdmFyIG1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICBmb3IgKHZhciBpIGluIHByb3BzKSB7CiAgICAgICAgbWFwW2ldID0gcHJvcHNbaV07CiAgICB9CiAgICByZXR1cm4gbWFwOwp9OwpleHBvcnRzLmFycmF5UmVtb3ZlID0gZnVuY3Rpb24gKGFycmF5LCB2YWx1ZSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gYXJyYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAodmFsdWUgPT09IGFycmF5W2ldKSB7CiAgICAgICAgICAgIGFycmF5LnNwbGljZShpLCAxKTsKICAgICAgICB9CiAgICB9Cn07CmV4cG9ydHMuZXNjYXBlUmVnRXhwID0gZnVuY3Rpb24gKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oWy4qKz9eJHt9KCl8W1xdXC9cXF0pL2csICdcXCQxJyk7Cn07CmV4cG9ydHMuZXNjYXBlSFRNTCA9IGZ1bmN0aW9uIChzdHIpIHsKICAgIHJldHVybiAoIiIgKyBzdHIpLnJlcGxhY2UoLyYvZywgIiYjMzg7IikucmVwbGFjZSgvIi9nLCAiJiMzNDsiKS5yZXBsYWNlKC8nL2csICImIzM5OyIpLnJlcGxhY2UoLzwvZywgIiYjNjA7Iik7Cn07CmV4cG9ydHMuZ2V0TWF0Y2hPZmZzZXRzID0gZnVuY3Rpb24gKHN0cmluZywgcmVnRXhwKSB7CiAgICB2YXIgbWF0Y2hlcyA9IFtdOwogICAgc3RyaW5nLnJlcGxhY2UocmVnRXhwLCBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgbWF0Y2hlcy5wdXNoKHsKICAgICAgICAgICAgb2Zmc2V0OiBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aCAtIDJdLAogICAgICAgICAgICBsZW5ndGg6IHN0ci5sZW5ndGgKICAgICAgICB9KTsKICAgIH0pOwogICAgcmV0dXJuIG1hdGNoZXM7Cn07CmV4cG9ydHMuZGVmZXJyZWRDYWxsID0gZnVuY3Rpb24gKGZjbikgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIGRlZmVycmVkID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBkZWZlcnJlZC5jYW5jZWwoKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgMCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLnNjaGVkdWxlID0gZGVmZXJyZWQ7CiAgICBkZWZlcnJlZC5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICAgICAgcmV0dXJuIGRlZmVycmVkOwogICAgfTsKICAgIGRlZmVycmVkLmNhbmNlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpOwogICAgICAgIHRpbWVyID0gbnVsbDsKICAgICAgICByZXR1cm4gZGVmZXJyZWQ7CiAgICB9OwogICAgZGVmZXJyZWQuaXNQZW5kaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB0aW1lcjsKICAgIH07CiAgICByZXR1cm4gZGVmZXJyZWQ7Cn07CmV4cG9ydHMuZGVsYXllZENhbGwgPSBmdW5jdGlvbiAoZmNuLCBkZWZhdWx0VGltZW91dCkgewogICAgdmFyIHRpbWVyID0gbnVsbDsKICAgIHZhciBjYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICB0aW1lciA9IG51bGw7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgdmFyIF9zZWxmID0gZnVuY3Rpb24gKHRpbWVvdXQpIHsKICAgICAgICBpZiAodGltZXIgPT0gbnVsbCkKICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KGNhbGxiYWNrLCB0aW1lb3V0IHx8IGRlZmF1bHRUaW1lb3V0KTsKICAgIH07CiAgICBfc2VsZi5kZWxheSA9IGZ1bmN0aW9uICh0aW1lb3V0KSB7CiAgICAgICAgdGltZXIgJiYgY2xlYXJUaW1lb3V0KHRpbWVyKTsKICAgICAgICB0aW1lciA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIHRpbWVvdXQgfHwgZGVmYXVsdFRpbWVvdXQpOwogICAgfTsKICAgIF9zZWxmLnNjaGVkdWxlID0gX3NlbGY7CiAgICBfc2VsZi5jYWxsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMuY2FuY2VsKCk7CiAgICAgICAgZmNuKCk7CiAgICB9OwogICAgX3NlbGYuY2FuY2VsID0gZnVuY3Rpb24gKCkgewogICAgICAgIHRpbWVyICYmIGNsZWFyVGltZW91dCh0aW1lcik7CiAgICAgICAgdGltZXIgPSBudWxsOwogICAgfTsKICAgIF9zZWxmLmlzUGVuZGluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gdGltZXI7CiAgICB9OwogICAgcmV0dXJuIF9zZWxmOwp9OwpleHBvcnRzLnN1cHBvcnRzTG9va2JlaGluZCA9IGZ1bmN0aW9uICgpIHsKICAgIHRyeSB7CiAgICAgICAgbmV3IFJlZ0V4cCgnKD88PS4pJyk7CiAgICB9CiAgICBjYXRjaCAoZSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHJldHVybiB0cnVlOwp9OwpleHBvcnRzLnN1cHBvcnRzVW5pY29kZUZsYWcgPSBmdW5jdGlvbiAoKSB7CiAgICB0cnkgewogICAgICAgIG5ldyBSZWdFeHAoJ14uJCcsICd1Jyk7CiAgICB9CiAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gdHJ1ZTsKfTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL3dvcmtlci9taXJyb3IiLFtdLCBmdW5jdGlvbihyZXF1aXJlLCBleHBvcnRzLCBtb2R1bGUpIHsKInVzZSBzdHJpY3QiOwoKdmFyIERvY3VtZW50ID0gcmVxdWlyZSgiLi4vZG9jdW1lbnQiKS5Eb2N1bWVudDsKdmFyIGxhbmcgPSByZXF1aXJlKCIuLi9saWIvbGFuZyIpOwogICAgCnZhciBNaXJyb3IgPSBleHBvcnRzLk1pcnJvciA9IGZ1bmN0aW9uKHNlbmRlcikgewogICAgdGhpcy5zZW5kZXIgPSBzZW5kZXI7CiAgICB2YXIgZG9jID0gdGhpcy5kb2MgPSBuZXcgRG9jdW1lbnQoIiIpOwogICAgCiAgICB2YXIgZGVmZXJyZWRVcGRhdGUgPSB0aGlzLmRlZmVycmVkVXBkYXRlID0gbGFuZy5kZWxheWVkQ2FsbCh0aGlzLm9uVXBkYXRlLmJpbmQodGhpcykpOwogICAgCiAgICB2YXIgX3NlbGYgPSB0aGlzOwogICAgc2VuZGVyLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgICAgICAgaWYgKGRhdGFbMF0uc3RhcnQpIHsKICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGFzKGRhdGEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgdmFyIGQsIGVycjsgCiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShkYXRhW2krMV0pKSB7CiAgICAgICAgICAgICAgICAgICAgZCA9IHthY3Rpb246ICJpbnNlcnQiLCBzdGFydDogZGF0YVtpXSwgbGluZXM6IGRhdGFbaSsxXX07CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGQgPSB7YWN0aW9uOiAicmVtb3ZlIiwgc3RhcnQ6IGRhdGFbaV0sIGVuZDogZGF0YVtpKzFdfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgaWYgKChkLmFjdGlvbiA9PSAiaW5zZXJ0IiA/IGQuc3RhcnQgOiBkLmVuZCkucm93ID49IGRvYy4kbGluZXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gbmV3IEVycm9yKCJJbnZhbGlkIGRlbHRhIik7CiAgICAgICAgICAgICAgICAgICAgZXJyLmRhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGg6IF9zZWxmLiRwYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lc0xlbmd0aDogZG9jLiRsaW5lcy5sZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0OiBkLnN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICBlbmQ6IGQuZW5kCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgZG9jLmFwcGx5RGVsdGEoZCwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKF9zZWxmLiR0aW1lb3V0KQogICAgICAgICAgICByZXR1cm4gZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUoX3NlbGYuJHRpbWVvdXQpOwogICAgICAgIF9zZWxmLm9uVXBkYXRlKCk7CiAgICB9KTsKfTsKCihmdW5jdGlvbigpIHsKICAgIAogICAgdGhpcy4kdGltZW91dCA9IDUwMDsKICAgIAogICAgdGhpcy5zZXRUaW1lb3V0ID0gZnVuY3Rpb24odGltZW91dCkgewogICAgICAgIHRoaXMuJHRpbWVvdXQgPSB0aW1lb3V0OwogICAgfTsKICAgIAogICAgdGhpcy5zZXRWYWx1ZSA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdGhpcy5kb2Muc2V0VmFsdWUodmFsdWUpOwogICAgICAgIHRoaXMuZGVmZXJyZWRVcGRhdGUuc2NoZWR1bGUodGhpcy4kdGltZW91dCk7CiAgICB9OwogICAgCiAgICB0aGlzLmdldFZhbHVlID0gZnVuY3Rpb24oY2FsbGJhY2tJZCkgewogICAgICAgIHRoaXMuc2VuZGVyLmNhbGxiYWNrKHRoaXMuZG9jLmdldFZhbHVlKCksIGNhbGxiYWNrSWQpOwogICAgfTsKICAgIAogICAgdGhpcy5vblVwZGF0ZSA9IGZ1bmN0aW9uKCkgewogICAgfTsKICAgIAogICAgdGhpcy5pc1BlbmRpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5kZWZlcnJlZFVwZGF0ZS5pc1BlbmRpbmcoKTsKICAgIH07CiAgICAKfSkuY2FsbChNaXJyb3IucHJvdG90eXBlKTsKCn0pOwoKYWNlLmRlZmluZSgiYWNlL21vZGUvanNvbi9qc29uX3BhcnNlIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCiAgICB2YXIgYXQsICAgICAvLyBUaGUgaW5kZXggb2YgdGhlIGN1cnJlbnQgY2hhcmFjdGVyCiAgICAgICAgY2gsICAgICAvLyBUaGUgY3VycmVudCBjaGFyYWN0ZXIKICAgICAgICBlc2NhcGVlID0gewogICAgICAgICAgICAnIic6ICAnIicsCiAgICAgICAgICAgICdcXCc6ICdcXCcsCiAgICAgICAgICAgICcvJzogICcvJywKICAgICAgICAgICAgYjogICAgJ1xiJywKICAgICAgICAgICAgZjogICAgJ1xmJywKICAgICAgICAgICAgbjogICAgJ1xuJywKICAgICAgICAgICAgcjogICAgJ1xyJywKICAgICAgICAgICAgdDogICAgJ1x0JwogICAgICAgIH0sCiAgICAgICAgdGV4dCwKCiAgICAgICAgZXJyb3IgPSBmdW5jdGlvbiAobSkgewoKICAgICAgICAgICAgdGhyb3cgewogICAgICAgICAgICAgICAgbmFtZTogICAgJ1N5bnRheEVycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IG0sCiAgICAgICAgICAgICAgICBhdDogICAgICBhdCwKICAgICAgICAgICAgICAgIHRleHQ6ICAgIHRleHQKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICBuZXh0ID0gZnVuY3Rpb24gKGMpIHsKCiAgICAgICAgICAgIGlmIChjICYmIGMgIT09IGNoKSB7CiAgICAgICAgICAgICAgICBlcnJvcigiRXhwZWN0ZWQgJyIgKyBjICsgIicgaW5zdGVhZCBvZiAnIiArIGNoICsgIiciKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgY2ggPSB0ZXh0LmNoYXJBdChhdCk7CiAgICAgICAgICAgIGF0ICs9IDE7CiAgICAgICAgICAgIHJldHVybiBjaDsKICAgICAgICB9LAoKICAgICAgICBudW1iZXIgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB2YXIgbnVtYmVyLAogICAgICAgICAgICAgICAgc3RyaW5nID0gJyc7CgogICAgICAgICAgICBpZiAoY2ggPT09ICctJykgewogICAgICAgICAgICAgICAgc3RyaW5nID0gJy0nOwogICAgICAgICAgICAgICAgbmV4dCgnLScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdoaWxlIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7CiAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnLicpIHsKICAgICAgICAgICAgICAgIHN0cmluZyArPSAnLic7CiAgICAgICAgICAgICAgICB3aGlsZSAobmV4dCgpICYmIGNoID49ICcwJyAmJiBjaCA8PSAnOScpIHsKICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09PSAnZScgfHwgY2ggPT09ICdFJykgewogICAgICAgICAgICAgICAgc3RyaW5nICs9IGNoOwogICAgICAgICAgICAgICAgbmV4dCgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnLScgfHwgY2ggPT09ICcrJykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoY2ggPj0gJzAnICYmIGNoIDw9ICc5JykgewogICAgICAgICAgICAgICAgICAgIHN0cmluZyArPSBjaDsKICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbnVtYmVyID0gK3N0cmluZzsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bWJlcikpIHsKICAgICAgICAgICAgICAgIGVycm9yKCJCYWQgbnVtYmVyIik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVtYmVyOwogICAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgc3RyaW5nID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgdmFyIGhleCwKICAgICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgICBzdHJpbmcgPSAnJywKICAgICAgICAgICAgICAgIHVmZmZmOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnIicpIHsKICAgICAgICAgICAgICAgIHdoaWxlIChuZXh0KCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICciJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PT0gJ1xcJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ3UnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IDA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSArPSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGV4ID0gcGFyc2VJbnQobmV4dCgpLCAxNik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0Zpbml0ZShoZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1ZmZmZiA9IHVmZmZmICogMTYgKyBoZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSh1ZmZmZik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIGVzY2FwZWVbY2hdID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICs9IGVzY2FwZWVbY2hdOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJcbiIgfHwgY2ggPT0gIlxyIikgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKz0gY2g7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgc3RyaW5nIik7CiAgICAgICAgfSwKCiAgICAgICAgd2hpdGUgPSBmdW5jdGlvbiAoKSB7CgogICAgICAgICAgICB3aGlsZSAoY2ggJiYgY2ggPD0gJyAnKSB7CiAgICAgICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICB3b3JkID0gZnVuY3Rpb24gKCkgewoKICAgICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgIG5leHQoJ3QnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3InKTsKICAgICAgICAgICAgICAgIG5leHQoJ3UnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICBjYXNlICdmJzoKICAgICAgICAgICAgICAgIG5leHQoJ2YnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2EnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2wnKTsKICAgICAgICAgICAgICAgIG5leHQoJ3MnKTsKICAgICAgICAgICAgICAgIG5leHQoJ2UnKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgY2FzZSAnbic6CiAgICAgICAgICAgICAgICBuZXh0KCduJyk7CiAgICAgICAgICAgICAgICBuZXh0KCd1Jyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICBuZXh0KCdsJyk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlcnJvcigiVW5leHBlY3RlZCAnIiArIGNoICsgIiciKTsKICAgICAgICB9LAoKICAgICAgICB2YWx1ZSwgIC8vIFBsYWNlIGhvbGRlciBmb3IgdGhlIHZhbHVlIGZ1bmN0aW9uLgoKICAgICAgICBhcnJheSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBhcnJheSA9IFtdOwoKICAgICAgICAgICAgaWYgKGNoID09PSAnWycpIHsKICAgICAgICAgICAgICAgIG5leHQoJ1snKTsKICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgIG5leHQoJ10nKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXk7ICAgLy8gZW1wdHkgYXJyYXkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUoKSk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICddJykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCddJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnLCcpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXJyb3IoIkJhZCBhcnJheSIpOwogICAgICAgIH0sCgogICAgICAgIG9iamVjdCA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgICAgIHZhciBrZXksCiAgICAgICAgICAgICAgICBvYmplY3QgPSB7fTsKCiAgICAgICAgICAgIGlmIChjaCA9PT0gJ3snKSB7CiAgICAgICAgICAgICAgICBuZXh0KCd7Jyk7CiAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsgICAvLyBlbXB0eSBvYmplY3QKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlIChjaCkgewogICAgICAgICAgICAgICAgICAgIGtleSA9IHN0cmluZygpOwogICAgICAgICAgICAgICAgICAgIHdoaXRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCgnOicpOwogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoJ0R1cGxpY2F0ZSBrZXkgIicgKyBrZXkgKyAnIicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlKCk7CiAgICAgICAgICAgICAgICAgICAgd2hpdGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICd9JykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0KCd9Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG5leHQoJywnKTsKICAgICAgICAgICAgICAgICAgICB3aGl0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVycm9yKCJCYWQgb2JqZWN0Iik7CiAgICAgICAgfTsKCiAgICB2YWx1ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAgICAgd2hpdGUoKTsKICAgICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgICAgY2FzZSAneyc6CiAgICAgICAgICAgIHJldHVybiBvYmplY3QoKTsKICAgICAgICBjYXNlICdbJzoKICAgICAgICAgICAgcmV0dXJuIGFycmF5KCk7CiAgICAgICAgY2FzZSAnIic6CiAgICAgICAgICAgIHJldHVybiBzdHJpbmcoKTsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgcmV0dXJuIG51bWJlcigpOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHJldHVybiBjaCA+PSAnMCcgJiYgY2ggPD0gJzknID8gbnVtYmVyKCkgOiB3b3JkKCk7CiAgICAgICAgfQogICAgfTsKCiAgICByZXR1cm4gZnVuY3Rpb24gKHNvdXJjZSwgcmV2aXZlcikgewogICAgICAgIHZhciByZXN1bHQ7CgogICAgICAgIHRleHQgPSBzb3VyY2U7CiAgICAgICAgYXQgPSAwOwogICAgICAgIGNoID0gJyAnOwogICAgICAgIHJlc3VsdCA9IHZhbHVlKCk7CiAgICAgICAgd2hpdGUoKTsKICAgICAgICBpZiAoY2gpIHsKICAgICAgICAgICAgZXJyb3IoIlN5bnRheCBlcnJvciIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHR5cGVvZiByZXZpdmVyID09PSAnZnVuY3Rpb24nID8gZnVuY3Rpb24gd2Fsayhob2xkZXIsIGtleSkgewogICAgICAgICAgICB2YXIgaywgdiwgdmFsdWUgPSBob2xkZXJba2V5XTsKICAgICAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIGZvciAoayBpbiB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdiA9IHdhbGsodmFsdWUsIGspOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtrXSA9IHY7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdmFsdWVba107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJldml2ZXIuY2FsbChob2xkZXIsIGtleSwgdmFsdWUpOwogICAgICAgIH0oeycnOiByZXN1bHR9LCAnJykgOiByZXN1bHQ7CiAgICB9Owp9KTsKCmFjZS5kZWZpbmUoImFjZS9tb2RlL2pzb25fd29ya2VyIixbXSwgZnVuY3Rpb24ocmVxdWlyZSwgZXhwb3J0cywgbW9kdWxlKSB7CiJ1c2Ugc3RyaWN0IjsKCnZhciBvb3AgPSByZXF1aXJlKCIuLi9saWIvb29wIik7CnZhciBNaXJyb3IgPSByZXF1aXJlKCIuLi93b3JrZXIvbWlycm9yIikuTWlycm9yOwp2YXIgcGFyc2UgPSByZXF1aXJlKCIuL2pzb24vanNvbl9wYXJzZSIpOwoKdmFyIEpzb25Xb3JrZXIgPSBleHBvcnRzLkpzb25Xb3JrZXIgPSBmdW5jdGlvbihzZW5kZXIpIHsKICAgIE1pcnJvci5jYWxsKHRoaXMsIHNlbmRlcik7CiAgICB0aGlzLnNldFRpbWVvdXQoMjAwKTsKfTsKCm9vcC5pbmhlcml0cyhKc29uV29ya2VyLCBNaXJyb3IpOwoKKGZ1bmN0aW9uKCkgewoKICAgIHRoaXMub25VcGRhdGUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLmRvYy5nZXRWYWx1ZSgpOwogICAgICAgIHZhciBlcnJvcnMgPSBbXTsKICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAodmFsdWUpCiAgICAgICAgICAgICAgICBwYXJzZSh2YWx1ZSk7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICB2YXIgcG9zID0gdGhpcy5kb2MuaW5kZXhUb1Bvc2l0aW9uKGUuYXQtMSk7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKHsKICAgICAgICAgICAgICAgIHJvdzogcG9zLnJvdywKICAgICAgICAgICAgICAgIGNvbHVtbjogcG9zLmNvbHVtbiwKICAgICAgICAgICAgICAgIHRleHQ6IGUubWVzc2FnZSwKICAgICAgICAgICAgICAgIHR5cGU6ICJlcnJvciIKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VuZGVyLmVtaXQoImFubm90YXRlIiwgZXJyb3JzKTsKICAgIH07Cgp9KS5jYWxsKEpzb25Xb3JrZXIucHJvdG90eXBlKTsKCn0pOwo=\";\n },\n 7907: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n Iu: function () {\n return h;\n },\n cC: function () {\n return c;\n },\n m0: function () {\n return l;\n }\n });\n n(4987);\n var r = {\n en: {\n array: \"Array\",\n auto: \"Auto\",\n appendText: \"Append\",\n appendTitle: \"Append a new field with type 'auto' after this field (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"Select the type of the field to be appended\",\n appendTitleAuto: \"Append a new field with type 'auto' (Ctrl+Shift+Ins)\",\n ascending: \"Ascending\",\n ascendingTitle: \"Sort the childs of this ${type} in ascending order\",\n actionsMenu: \"Click to open the actions menu (Ctrl+M)\",\n cannotParseFieldError: \"Cannot parse field into JSON\",\n cannotParseValueError: \"Cannot parse value into JSON\",\n collapseAll: \"Collapse all fields\",\n compactTitle: \"Compact JSON data, remove all whitespaces (Ctrl+Shift+I)\",\n descending: \"Descending\",\n descendingTitle: \"Sort the childs of this ${type} in descending order\",\n drag: \"Drag to move this field (Alt+Shift+Arrows)\",\n duplicateKey: \"duplicate key\",\n duplicateText: \"Duplicate\",\n duplicateTitle: \"Duplicate selected fields (Ctrl+D)\",\n duplicateField: \"Duplicate this field (Ctrl+D)\",\n duplicateFieldError: \"Duplicate field name\",\n empty: \"empty\",\n expandAll: \"Expand all fields\",\n expandTitle: \"Click to expand/collapse this field (Ctrl+E). \\nCtrl+Click to expand/collapse including all childs.\",\n formatTitle: \"Format JSON data, with proper indentation and line feeds (Ctrl+I)\",\n insert: \"Insert\",\n insertTitle: \"Insert a new field with type 'auto' before this field (Ctrl+Ins)\",\n insertSub: \"Select the type of the field to be inserted\",\n object: \"Object\",\n ok: \"Ok\",\n redo: \"Redo (Ctrl+Shift+Z)\",\n removeText: \"Remove\",\n removeTitle: \"Remove selected fields (Ctrl+Del)\",\n removeField: \"Remove this field (Ctrl+Del)\",\n repairTitle: \"Repair JSON: fix quotes and escape characters, remove comments and JSONP notation, turn JavaScript objects into JSON.\",\n searchTitle: \"Search fields and values\",\n searchNextResultTitle: \"Next result (Enter)\",\n searchPreviousResultTitle: \"Previous result (Shift + Enter)\",\n selectNode: \"Select a node...\",\n showAll: \"show all\",\n showMore: \"show more\",\n showMoreStatus: \"displaying ${visibleChilds} of ${totalChilds} items.\",\n sort: \"Sort\",\n sortTitle: \"Sort the childs of this ${type}\",\n sortTitleShort: \"Sort contents\",\n sortFieldLabel: \"Field:\",\n sortDirectionLabel: \"Direction:\",\n sortFieldTitle: \"Select the nested field by which to sort the array or object\",\n sortAscending: \"Ascending\",\n sortAscendingTitle: \"Sort the selected field in ascending order\",\n sortDescending: \"Descending\",\n sortDescendingTitle: \"Sort the selected field in descending order\",\n string: \"String\",\n transform: \"Transform\",\n transformTitle: \"Filter, sort, or transform the childs of this ${type}\",\n transformTitleShort: \"Filter, sort, or transform contents\",\n extract: \"Extract\",\n extractTitle: \"Extract this ${type}\",\n transformQueryTitle: \"Enter a JMESPath query\",\n transformWizardLabel: \"Wizard\",\n transformWizardFilter: \"Filter\",\n transformWizardSortBy: \"Sort by\",\n transformWizardSelectFields: \"Select fields\",\n transformQueryLabel: \"Query\",\n transformPreviewLabel: \"Preview\",\n type: \"Type\",\n typeTitle: \"Change the type of this field\",\n openUrl: \"Ctrl+Click or Ctrl+Enter to open url in new window\",\n undo: \"Undo last action (Ctrl+Z)\",\n validationCannotMove: \"Cannot move a field into a child of itself\",\n autoType: 'Field type \"auto\". The field type is automatically determined from the value and can be a string, number, boolean, or null.',\n objectType: 'Field type \"object\". An object contains an unordered set of key/value pairs.',\n arrayType: 'Field type \"array\". An array contains an ordered collection of values.',\n stringType: 'Field type \"string\". Field type is not determined from the value, but always returned as string.',\n modeEditorTitle: \"Switch Editor Mode\",\n modeCodeText: \"Code\",\n modeCodeTitle: \"Switch to code highlighter\",\n modeFormText: \"Form\",\n modeFormTitle: \"Switch to form editor\",\n modeTextText: \"Text\",\n modeTextTitle: \"Switch to plain text editor\",\n modeTreeText: \"Tree\",\n modeTreeTitle: \"Switch to tree editor\",\n modeViewText: \"View\",\n modeViewTitle: \"Switch to tree view\",\n modePreviewText: \"Preview\",\n modePreviewTitle: \"Switch to preview mode\",\n examples: \"Examples\",\n default: \"Default\",\n containsInvalidProperties: \"Contains invalid properties\",\n containsInvalidItems: \"Contains invalid items\"\n },\n es: {\n array: \"Matriz\",\n auto: \"Auto\",\n appendText: \"Agregar\",\n appendTitle: \"Agregue un nuevo campo con el tipo 'auto' después de este campo (Ctrl + Shift + Ins)\",\n appendSubmenuTitle: \"Seleccione el tipo de campo que se agregará\",\n appendTitleAuto: \"Agregue un nuevo campo con el tipo 'auto' (Ctrl + Shift + Ins)\",\n ascending: \"Ascendente\",\n ascendingTitle: \"Ordene los elementos secundarios de este ${type} en orden ascendente\",\n actionsMenu: \"Haga clic para abrir el menú de acciones (Ctrl + M)\",\n cannotParseFieldError: \"No se puede parsear el campo en JSON\",\n cannotParseValueError: \"No se puede parsear el valor en JSON\",\n collapseAll: \"Contraer todos los campos\",\n compactTitle: \"Compactar datos JSON, eliminar todos los espacios en blanco (Ctrl + Shift + I)\",\n descending: \"Descendente\",\n descendingTitle: \"Ordene los hijos de este ${type} en orden descendente\",\n drag: \"Arrastre para mover este campo (Alt + Mayús + Flechas)\",\n duplicateKey: \"llave duplicada\",\n duplicateText: \"Duplicar\",\n duplicateTitle: \"Duplicar campos seleccionados (Ctrl + D)\",\n duplicateField: \"Duplicar este campo (Ctrl + D)\",\n duplicateFieldError: \"Nombre de campo duplicado\",\n empty: \"vacio\",\n expandAll: \"Expandir todos los campos\",\n expandTitle: \"Haga clic para expandir/contraer este campo (Ctrl + E). \\n Ctrl+Clic para expandir/contraer incluyendo todos los niños.\",\n formatTitle: \"Formatee los datos JSON, con la sangría y los avances de línea adecuados (Ctrl + I)\",\n insert: \"Insertar\",\n insertTitle: \"Inserte un nuevo campo con el tipo 'auto' antes de este campo (Ctrl + Ins)\",\n insertSub: \"Seleccione el tipo de campo a insertar\",\n object: \"Objeto\",\n ok: \"Ok\",\n redo: \"Rehacer (Ctrl+Mayús+Z)\",\n removeText: \"Eliminar\",\n removeTitle: \"Eliminar campos seleccionados (Ctrl+Supr)\",\n removeField: \"Eliminar este campo (Ctrl+Supr)\",\n repairTitle: \"Reparar JSON: corrija comillas y caracteres de escape, elimine comentarios y notación JSONP, convierta objetos JavaScript en JSON.\",\n searchTitle: \"Campos de búsqueda y valores\",\n searchNextResultTitle: \"Siguiente resultado (Entrar)\",\n searchPreviousResultTitle: \"Resultado anterior (Shift + Enter)\",\n selectNode: \"Seleccione un nodo...\",\n showAll: \"mostrar todo\",\n showMore: \"mostrar más\",\n showMoreStatus: \"mostrando ${visibleChilds} de ${totalChilds} elementos.\",\n sort: \"Ordenar\",\n sortTitle: \"Ordene los hijos de este ${type}\",\n sortTitleShort: \"Ordenar contenidos\",\n sortFieldLabel: \"Campo:\",\n sortDirectionLabel: \"Dirección:\",\n sortFieldTitle: \"Seleccione el campo anidado por el cual ordenar la matriz u objeto\",\n sortAscending: \"Ascendente\",\n sortAscendingTitle: \"Ordenar el campo seleccionado en orden ascendente\",\n sortDescending: \"Descendente\",\n sortDescendingTitle: \"Ordenar por el campo seleccionado, en orden descendente\",\n string: \"Texto\",\n transform: \"Transformar\",\n transformTitle: \"Filtrar, ordenar o transformar los hijos de este ${type}\",\n transformTitleShort: \"Filtrar, ordenar o transformar contenidos\",\n extract: \"Extraer\",\n extractTitle: \"Extrae este ${type}\",\n transformQueryTitle: \"Ingrese una consulta JMESPath\",\n transformWizardLabel: \"Wizard\",\n transformWizardFilter: \"Filtro\",\n transformWizardSortBy: \"Ordenar por\",\n transformWizardSelectFields: \"Seleccione un campo\",\n transformQueryLabel: \"Consulta\",\n transformPreviewLabel: \"Vista Previa\",\n type: \"Tipo\",\n typeTitle: \"Cambiar el tipo de campo\",\n openUrl: \"Ctrl+Click o Ctrl+Enter para abrir la URL en una nueva ventana\",\n undo: \"Deshacer la última acción (Ctrl+Z)\",\n validationCannotMove: \"No se puede mover un campo a un hijo de sí mismo.\",\n autoType: 'Field type \"auto\". The field type is automatically determined from the value and can be a string, number, boolean, or null.',\n objectType: 'Tipo de campo \"objeto\". Un objeto contiene un conjunto desordenado de pares clave/valor.',\n arrayType: 'Tipo de campo \"matriz\". Una matriz contiene una colección ordenada de valores.',\n stringType: 'Tipo de campo \"cadena\". El tipo de campo no se determina a partir del valor, pero siempre se devuelve como una cadena.',\n modeEditorTitle: \"Cambiar modo de editor\",\n modeCodeText: \"Codigo\",\n modeCodeTitle: \"Cambiar al resaltador de código\",\n modeFormText: \"Formulario\",\n modeFormTitle: \"Cambiar al editor de formularios\",\n modeTextText: \"Texto\",\n modeTextTitle: \"Cambiar al editor de texto sin formato\",\n modeTreeText: \"Arbol\",\n modeTreeTitle: \"Cambiar al editor de árbol\",\n modeViewText: \"Vista\",\n modeViewTitle: \"Cambiar a la vista de árbol\",\n modePreviewText: \"Vista Previa\",\n modePreviewTitle: \"Cambiar al modo de vista previa\",\n examples: \"Ejemplos\",\n default: \"Predeterminado\",\n containsInvalidProperties: \"Contiene propiedades no validas\",\n containsInvalidItems: \"Contiene items no validos\"\n },\n \"zh-CN\": {\n array: \"数组\",\n auto: \"自动\",\n appendText: \"追加\",\n appendTitle: \"在此字段后追加一个类型为“auto”的新字段 (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"选择要追加的字段类型\",\n appendTitleAuto: \"追加类型为“auto”的新字段 (Ctrl+Shift+Ins)\",\n ascending: \"升序\",\n ascendingTitle: \"升序排列${type}的子节点\",\n actionsMenu: \"点击打开动作菜单(Ctrl+M)\",\n cannotParseFieldError: \"无法将字段解析为JSON\",\n cannotParseValueError: \"无法将值解析为JSON\",\n collapseAll: \"缩进所有字段\",\n compactTitle: \"压缩JSON数据,删除所有空格 (Ctrl+Shift+I)\",\n descending: \"降序\",\n descendingTitle: \"降序排列${type}的子节点\",\n drag: \"拖拽移动该节点(Alt+Shift+Arrows)\",\n duplicateKey: \"重复键\",\n duplicateText: \"复制\",\n duplicateTitle: \"复制选中字段(Ctrl+D)\",\n duplicateField: \"复制该字段(Ctrl+D)\",\n duplicateFieldError: \"重复的字段名称\",\n empty: \"清空\",\n expandAll: \"展开所有字段\",\n expandTitle: \"点击 展开/收缩 该字段(Ctrl+E). \\nCtrl+Click 展开/收缩 包含所有子节点.\",\n formatTitle: \"使用适当的缩进和换行符格式化JSON数据 (Ctrl+I)\",\n insert: \"插入\",\n insertTitle: \"在此字段前插入类型为“auto”的新字段 (Ctrl+Ins)\",\n insertSub: \"选择要插入的字段类型\",\n object: \"对象\",\n ok: \"Ok\",\n redo: \"重做 (Ctrl+Shift+Z)\",\n removeText: \"移除\",\n removeTitle: \"移除选中字段 (Ctrl+Del)\",\n removeField: \"移除该字段 (Ctrl+Del)\",\n repairTitle: \"修复JSON:修复引号和转义符,删除注释和JSONP表示法,将JavaScript对象转换为JSON。\",\n selectNode: \"选择一个节点...\",\n showAll: \"展示全部\",\n showMore: \"展示更多\",\n showMoreStatus: \"显示${totalChilds}的${visibleChilds}项目.\",\n sort: \"排序\",\n sortTitle: \"排序${type}的子节点\",\n sortTitleShort: \"内容排序\",\n sortFieldLabel: \"字段:\",\n sortDirectionLabel: \"方向:\",\n sortFieldTitle: \"选择用于对数组或对象排序的嵌套字段\",\n sortAscending: \"升序排序\",\n sortAscendingTitle: \"按照该字段升序排序\",\n sortDescending: \"降序排序\",\n sortDescendingTitle: \"按照该字段降序排序\",\n string: \"字符串\",\n transform: \"变换\",\n transformTitle: \"筛选,排序,或者转换${type}的子节点\",\n transformTitleShort: \"筛选,排序,或者转换内容\",\n extract: \"提取\",\n extractTitle: \"提取这个 ${type}\",\n transformQueryTitle: \"输入JMESPath查询\",\n transformWizardLabel: \"向导\",\n transformWizardFilter: \"筛选\",\n transformWizardSortBy: \"排序\",\n transformWizardSelectFields: \"选择字段\",\n transformQueryLabel: \"查询\",\n transformPreviewLabel: \"预览\",\n type: \"类型\",\n typeTitle: \"更改字段类型\",\n openUrl: \"Ctrl+Click 或者 Ctrl+Enter 在新窗口打开链接\",\n undo: \"撤销上次动作 (Ctrl+Z)\",\n validationCannotMove: \"无法将字段移入其子节点\",\n autoType: '字段类型 \"auto\". 字段类型由值自动确定 可以为 string,number,boolean,或者 null.',\n objectType: '字段类型 \"object\". 对象包含一组无序的键/值对.',\n arrayType: '字段类型 \"array\". 数组包含值的有序集合.',\n stringType: '字段类型 \"string\". 字段类型由值自动确定,但始终作为字符串返回.',\n modeCodeText: \"代码\",\n modeCodeTitle: \"切换至代码高亮\",\n modeFormText: \"表单\",\n modeFormTitle: \"切换至表单编辑\",\n modeTextText: \"文本\",\n modeTextTitle: \"切换至文本编辑\",\n modeTreeText: \"树\",\n modeTreeTitle: \"切换至树编辑\",\n modeViewText: \"视图\",\n modeViewTitle: \"切换至树视图\",\n modePreviewText: \"预览\",\n modePreviewTitle: \"切换至预览模式\",\n examples: \"例子\",\n default: \"缺省\",\n containsInvalidProperties: \"包含无效的属性\",\n containsInvalidItems: \"包含无效项目\"\n },\n \"pt-BR\": {\n array: \"Lista\",\n auto: \"Automatico\",\n appendText: \"Adicionar\",\n appendTitle: \"Adicionar novo campo com tipo 'auto' depois deste campo (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"Selecione o tipo do campo a ser adicionado\",\n appendTitleAuto: \"Adicionar novo campo com tipo 'auto' (Ctrl+Shift+Ins)\",\n ascending: \"Ascendente\",\n ascendingTitle: \"Organizar filhor do tipo ${type} em crescente\",\n actionsMenu: \"Clique para abrir o menu de ações (Ctrl+M)\",\n cannotParseFieldError: \"Não é possível analisar o campo no JSON\",\n cannotParseValueError: \"Não é possível analisar o valor em JSON\",\n collapseAll: \"Fechar todos campos\",\n compactTitle: \"Dados JSON compactos, remova todos os espaços em branco (Ctrl+Shift+I)\",\n descending: \"Descendente\",\n descendingTitle: \"Organizar o filhos do tipo ${type} em decrescente\",\n duplicateKey: \"chave duplicada\",\n drag: \"Arraste para mover este campo (Alt+Shift+Arrows)\",\n duplicateText: \"Duplicar\",\n duplicateTitle: \"Duplicar campos selecionados (Ctrl+D)\",\n duplicateField: \"Duplicar este campo (Ctrl+D)\",\n duplicateFieldError: \"Nome do campo duplicado\",\n empty: \"vazio\",\n expandAll: \"Expandir todos campos\",\n expandTitle: \"Clique para expandir/encolher este campo (Ctrl+E). \\nCtrl+Click para expandir/encolher incluindo todos os filhos.\",\n formatTitle: \"Formate dados JSON, com recuo e feeds de linha adequados (Ctrl+I)\",\n insert: \"Inserir\",\n insertTitle: \"Inserir um novo campo do tipo 'auto' antes deste campo (Ctrl+Ins)\",\n insertSub: \"Selecionar o tipo de campo a ser inserido\",\n object: \"Objeto\",\n ok: \"Ok\",\n redo: \"Refazer (Ctrl+Shift+Z)\",\n removeText: \"Remover\",\n removeTitle: \"Remover campos selecionados (Ctrl+Del)\",\n removeField: \"Remover este campo (Ctrl+Del)\",\n repairTitle: \"Repare JSON: corrija aspas e caracteres de escape, remova comentários e notação JSONP, transforme objetos JavaScript em JSON.\",\n selectNode: \"Selecione um nódulo...\",\n showAll: \"mostrar todos\",\n showMore: \"mostrar mais\",\n showMoreStatus: \"exibindo ${visibleChilds} de ${totalChilds} itens.\",\n sort: \"Organizar\",\n sortTitle: \"Organizar os filhos deste ${type}\",\n sortTitleShort: \"Organizar os filhos\",\n sortFieldLabel: \"Campo:\",\n sortDirectionLabel: \"Direção:\",\n sortFieldTitle: \"Selecione um campo filho pelo qual ordenar o array ou objeto\",\n sortAscending: \"Ascendente\",\n sortAscendingTitle: \"Ordenar o campo selecionado por ordem ascendente\",\n sortDescending: \"Descendente\",\n sortDescendingTitle: \"Ordenar o campo selecionado por ordem descendente\",\n string: \"Texto\",\n transform: \"Transformar\",\n transformTitle: \"Filtrar, ordenar ou transformar os filhos deste ${type}\",\n transformTitleShort: \"Filtrar, ordenar ou transformar conteúdos\",\n transformQueryTitle: \"Insira uma expressão JMESPath\",\n transformWizardLabel: \"Assistente\",\n transformWizardFilter: \"Filtro\",\n transformWizardSortBy: \"Ordenar por\",\n transformWizardSelectFields: \"Selecionar campos\",\n transformQueryLabel: \"Expressão\",\n transformPreviewLabel: \"Visualizar\",\n type: \"Tipo\",\n typeTitle: \"Mudar o tipo deste campo\",\n openUrl: \"Ctrl+Click ou Ctrl+Enter para abrir link em nova janela\",\n undo: \"Desfazer último ação (Ctrl+Z)\",\n validationCannotMove: \"Não pode mover um campo como filho dele mesmo\",\n autoType: 'Campo do tipo \"auto\". O tipo do campo é determinao automaticamente a partir do seu valor e pode ser texto, número, verdade/falso ou nulo.',\n objectType: 'Campo do tipo \"objeto\". Um objeto contém uma lista de pares com chave e valor.',\n arrayType: 'Campo do tipo \"lista\". Uma lista contem uma coleção de valores ordenados.',\n stringType: 'Campo do tipo \"string\". Campo do tipo nao é determinado através do seu valor, mas sempre retornara um texto.',\n examples: \"Exemplos\",\n default: \"Revelia\",\n containsInvalidProperties: \"Contém propriedades inválidas\",\n containsInvalidItems: \"Contém itens inválidos\"\n },\n tr: {\n array: \"Dizin\",\n auto: \"Otomatik\",\n appendText: \"Ekle\",\n appendTitle: \"Bu alanın altına 'otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"Eklenecek alanın tipini seç\",\n appendTitleAuto: \"'Otomatik' tipinde yeni bir alan ekle (Ctrl+Shift+Ins)\",\n ascending: \"Artan\",\n ascendingTitle: \"${type}'ın alt tiplerini artan düzende sırala\",\n actionsMenu: \"Aksiyon menüsünü açmak için tıklayın (Ctrl+M)\",\n collapseAll: \"Tüm alanları kapat\",\n descending: \"Azalan\",\n descendingTitle: \"${type}'ın alt tiplerini azalan düzende sırala\",\n drag: \"Bu alanı taşımak için sürükleyin (Alt+Shift+Arrows)\",\n duplicateKey: \"Var olan anahtar\",\n duplicateText: \"Aşağıya kopyala\",\n duplicateTitle: \"Seçili alanlardan bir daha oluştur (Ctrl+D)\",\n duplicateField: \"Bu alandan bir daha oluştur (Ctrl+D)\",\n duplicateFieldError: \"Duplicate field name\",\n cannotParseFieldError: \"Alan JSON'a ayrıştırılamıyor\",\n cannotParseValueError: \"JSON'a değer ayrıştırılamıyor\",\n empty: \"boş\",\n expandAll: \"Tüm alanları aç\",\n expandTitle: \"Bu alanı açmak/kapatmak için tıkla (Ctrl+E). \\nAlt alanlarda dahil tüm alanları açmak için Ctrl+Click \",\n insert: \"Ekle\",\n insertTitle: \"Bu alanın üstüne 'otomatik' tipinde yeni bir alan ekle (Ctrl+Ins)\",\n insertSub: \"Araya eklenecek alanın tipini seç\",\n object: \"Nesne\",\n ok: \"Tamam\",\n redo: \"Yeniden yap (Ctrl+Shift+Z)\",\n removeText: \"Kaldır\",\n removeTitle: \"Seçilen alanları kaldır (Ctrl+Del)\",\n removeField: \"Bu alanı kaldır (Ctrl+Del)\",\n selectNode: \"Bir nesne seç...\",\n showAll: \"tümünü göster\",\n showMore: \"daha fazla göster\",\n showMoreStatus: \"${totalChilds} alanın ${visibleChilds} alt alanları gösteriliyor\",\n sort: \"Sırala\",\n sortTitle: \"${type}'ın alt alanlarını sırala\",\n sortTitleShort: \"İçerikleri sırala\",\n sortFieldLabel: \"Alan:\",\n sortDirectionLabel: \"Yön:\",\n sortFieldTitle: \"Diziyi veya nesneyi sıralamak için iç içe geçmiş alanı seçin\",\n sortAscending: \"Artan\",\n sortAscendingTitle: \"Seçili alanı artan düzende sırala\",\n sortDescending: \"Azalan\",\n sortDescendingTitle: \"Seçili alanı azalan düzende sırala\",\n string: \"Karakter Dizisi\",\n transform: \"Dönüştür\",\n transformTitle: \"${type}'ın alt alanlarını filtrele, sırala veya dönüştür\",\n transformTitleShort: \"İçerikleri filterele, sırala veya dönüştür\",\n transformQueryTitle: \"JMESPath sorgusu gir\",\n transformWizardLabel: \"Sihirbaz\",\n transformWizardFilter: \"Filtre\",\n transformWizardSortBy: \"Sırala\",\n transformWizardSelectFields: \"Alanları seç\",\n transformQueryLabel: \"Sorgu\",\n transformPreviewLabel: \"Önizleme\",\n type: \"Tip\",\n typeTitle: \"Bu alanın tipini değiştir\",\n openUrl: \"URL'i yeni bir pencerede açmak için Ctrl+Click veya Ctrl+Enter\",\n undo: \"Son değişikliği geri al (Ctrl+Z)\",\n validationCannotMove: \"Alt alan olarak taşınamıyor\",\n autoType: 'Alan tipi \"otomatik\". Alan türü otomatik olarak değerden belirlenirve bir dize, sayı, boolean veya null olabilir.',\n objectType: 'Alan tipi \"nesne\". Bir nesne, sıralanmamış bir anahtar / değer çifti kümesi içerir.',\n arrayType: 'Alan tipi \"dizi\". Bir dizi, düzenli değerler koleksiyonu içerir.',\n stringType: 'Alan tipi \"karakter dizisi\". Alan türü değerden belirlenmez,ancak her zaman karakter dizisi olarak döndürülür.',\n modeCodeText: \"Kod\",\n modeCodeTitle: \"Kod vurgulayıcıya geç\",\n modeFormText: \"Form\",\n modeFormTitle: \"Form düzenleyiciye geç\",\n modeTextText: \"Metin\",\n modeTextTitle: \"Düz metin düzenleyiciye geç\",\n modeTreeText: \"Ağaç\",\n modeTreeTitle: \"Ağaç düzenleyiciye geç\",\n modeViewText: \"Görünüm\",\n modeViewTitle: \"Ağaç görünümüne geç\",\n examples: \"Örnekler\",\n default: \"Varsayılan\",\n containsInvalidProperties: \"Geçersiz özellikler içeriyor\",\n containsInvalidItems: \"Geçersiz öğeler içeriyor\"\n },\n ja: {\n array: \"配列\",\n auto: \"オート\",\n appendText: \"追加\",\n appendTitle: '次のフィールドに\"オート\"のフィールドを追加 (Ctrl+Shift+Ins)',\n appendSubmenuTitle: \"追加するフィールドの型を選択してください\",\n appendTitleAuto: '\"オート\"のフィールドを追加 (Ctrl+Shift+Ins)',\n ascending: \"昇順\",\n ascendingTitle: \"${type}の子要素を昇順に並べ替え\",\n actionsMenu: \"クリックしてアクションメニューを開く (Ctrl+M)\",\n collapseAll: \"すべてを折りたたむ\",\n descending: \"降順\",\n descendingTitle: \"${type}の子要素を降順に並べ替え\",\n drag: \"ドラッグして選択中のフィールドを移動 (Alt+Shift+Arrows)\",\n duplicateKey: \"複製キー\",\n duplicateText: \"複製\",\n duplicateTitle: \"選択中のフィールドを複製 (Ctrl+D)\",\n duplicateField: \"選択中のフィールドを複製 (Ctrl+D)\",\n duplicateFieldError: \"フィールド名が重複しています\",\n cannotParseFieldError: \"JSONのフィールドを解析できません\",\n cannotParseValueError: \"JSONの値を解析できません\",\n empty: \"空\",\n expandAll: \"すべてを展開\",\n expandTitle: \"クリックしてフィールドを展開/折りたたむ (Ctrl+E). \\nCtrl+Click ですべての子要素を展開/折りたたむ\",\n insert: \"挿入\",\n insertTitle: \"選択中のフィールドの前に新しいフィールドを挿入 (Ctrl+Ins)\",\n insertSub: \"挿入するフィールドの型を選択\",\n object: \"オブジェクト\",\n ok: \"実行\",\n redo: \"やり直す (Ctrl+Shift+Z)\",\n removeText: \"削除\",\n removeTitle: \"選択中のフィールドを削除 (Ctrl+Del)\",\n removeField: \"選択中のフィールドを削除 (Ctrl+Del)\",\n selectNode: \"ノードを選択...\",\n showAll: \"すべてを表示\",\n showMore: \"もっと見る\",\n showMoreStatus: \"${totalChilds}個のアイテムのうち ${visibleChilds}個を表示しています。\",\n sort: \"並べ替え\",\n sortTitle: \"${type}の子要素を並べ替え\",\n sortTitleShort: \"並べ替え\",\n sortFieldLabel: \"フィールド:\",\n sortDirectionLabel: \"順序:\",\n sortFieldTitle: \"配列またはオブジェクトを並び替えるためのフィールドを選択\",\n sortAscending: \"昇順\",\n sortAscendingTitle: \"選択中のフィールドを昇順に並び替え\",\n sortDescending: \"降順\",\n sortDescendingTitle: \"選択中のフィールドを降順に並び替え\",\n string: \"文字列\",\n transform: \"変換\",\n transformTitle: \"${type}の子要素をフィルター・並び替え・変換する\",\n transformTitleShort: \"内容をフィルター・並び替え・変換する\",\n extract: \"抽出\",\n extractTitle: \"${type}を抽出\",\n transformQueryTitle: \"JMESPathクエリを入力\",\n transformWizardLabel: \"ウィザード\",\n transformWizardFilter: \"フィルター\",\n transformWizardSortBy: \"並び替え\",\n transformWizardSelectFields: \"フィールドを選択\",\n transformQueryLabel: \"クエリ\",\n transformPreviewLabel: \"プレビュー\",\n type: \"型\",\n typeTitle: \"選択中のフィールドの型を変更\",\n openUrl: \"Ctrl+Click または Ctrl+Enter で 新規ウィンドウでURLを開く\",\n undo: \"元に戻す (Ctrl+Z)\",\n validationCannotMove: \"子要素に移動できません \",\n autoType: \"オート: フィールドの型は値から自動的に決定されます。 (文字列・数値・ブール・null)\",\n objectType: \"オブジェクト: オブジェクトは順序が決まっていないキーと値のペア組み合わせです。\",\n arrayType: \"配列: 配列は順序が決まっている値の集合体です。\",\n stringType: \"文字列: フィールド型は値から決定されませんが、常に文字列として返されます。\",\n modeCodeText: \"コードモード\",\n modeCodeTitle: \"ハイライトモードに切り替え\",\n modeFormText: \"フォームモード\",\n modeFormTitle: \"フォームモードに切り替え\",\n modeTextText: \"テキストモード\",\n modeTextTitle: \"テキストモードに切り替え\",\n modeTreeText: \"ツリーモード\",\n modeTreeTitle: \"ツリーモードに切り替え\",\n modeViewText: \"ビューモード\",\n modeViewTitle: \"ビューモードに切り替え\",\n modePreviewText: \"プレビュー\",\n modePreviewTitle: \"プレビューに切り替え\",\n examples: \"例\",\n default: \"デフォルト\",\n containsInvalidProperties: \"無効なプロパティが含まれています\",\n containsInvalidItems: \"無効なアイテムが含まれています\"\n },\n \"fr-FR\": {\n array: \"Liste\",\n auto: \"Auto\",\n appendText: \"Ajouter\",\n appendTitle: \"Ajouter un champ de type 'auto' après ce champ (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"Sélectionner le type du champ à ajouter\",\n appendTitleAuto: \"Ajouter un champ de type 'auto' (Ctrl+Shift+Ins)\",\n ascending: \"Ascendant\",\n ascendingTitle: \"Trier les enfants de ce ${type} par ordre ascendant\",\n actionsMenu: \"Ouvrir le menu des actions (Ctrl+M)\",\n collapseAll: \"Regrouper\",\n descending: \"Descendant\",\n descendingTitle: \"Trier les enfants de ce ${type} par ordre descendant\",\n drag: \"Déplacer (Alt+Shift+Arrows)\",\n duplicateKey: \"Dupliquer la clé\",\n duplicateText: \"Dupliquer\",\n duplicateTitle: \"Dupliquer les champs sélectionnés (Ctrl+D)\",\n duplicateField: \"Dupliquer ce champ (Ctrl+D)\",\n duplicateFieldError: \"Dupliquer le nom de champ\",\n cannotParseFieldError: \"Champ impossible à parser en JSON\",\n cannotParseValueError: \"Valeur impossible à parser en JSON\",\n empty: \"vide\",\n expandAll: \"Étendre\",\n expandTitle: \"Étendre/regrouper ce champ (Ctrl+E). \\nCtrl+Click pour étendre/regrouper avec tous les champs.\",\n insert: \"Insérer\",\n insertTitle: \"Insérer un champ de type 'auto' avant ce champ (Ctrl+Ins)\",\n insertSub: \"Sélectionner le type de champ à insérer\",\n object: \"Objet\",\n ok: \"Ok\",\n redo: \"Rejouer (Ctrl+Shift+Z)\",\n removeText: \"Supprimer\",\n removeTitle: \"Supprimer les champs sélectionnés (Ctrl+Del)\",\n removeField: \"Supprimer ce champ (Ctrl+Del)\",\n searchTitle: \"Rechercher champs et valeurs\",\n searchNextResultTitle: \"Résultat suivant (Enter)\",\n searchPreviousResultTitle: \"Résultat précédent (Shift + Enter)\",\n selectNode: \"Sélectionner un nœud...\",\n showAll: \"voir tout\",\n showMore: \"voir plus\",\n showMoreStatus: \"${visibleChilds} éléments affichés de ${totalChilds}.\",\n sort: \"Trier\",\n sortTitle: \"Trier les champs de ce ${type}\",\n sortTitleShort: \"Trier\",\n sortFieldLabel: \"Champ:\",\n sortDirectionLabel: \"Direction:\",\n sortFieldTitle: \"Sélectionner les champs permettant de trier les listes et objet\",\n sortAscending: \"Ascendant\",\n sortAscendingTitle: \"Trier les champs sélectionnés par ordre ascendant\",\n sortDescending: \"Descendant\",\n sortDescendingTitle: \"Trier les champs sélectionnés par ordre descendant\",\n string: \"Chaîne\",\n transform: \"Transformer\",\n transformTitle: \"Filtrer, trier, or transformer les enfants de ce ${type}\",\n transformTitleShort: \"Filtrer, trier ou transformer le contenu\",\n extract: \"Extraire\",\n extractTitle: \"Extraire ce ${type}\",\n transformQueryTitle: \"Saisir une requête JMESPath\",\n transformWizardLabel: \"Assistant\",\n transformWizardFilter: \"Filtrer\",\n transformWizardSortBy: \"Trier par\",\n transformWizardSelectFields: \"Sélectionner les champs\",\n transformQueryLabel: \"Requête\",\n transformPreviewLabel: \"Prévisualisation\",\n type: \"Type\",\n typeTitle: \"Changer le type de ce champ\",\n openUrl: \"Ctrl+Click ou Ctrl+Enter pour ouvrir l'url dans une autre fenêtre\",\n undo: \"Annuler la dernière action (Ctrl+Z)\",\n validationCannotMove: \"Cannot move a field into a child of itself\",\n autoType: 'Champe de type \"auto\". Ce type de champ est automatiquement déterminé en fonction de la valeur et peut être de type \"chaîne\", \"nombre\", \"booléen\" ou null.',\n objectType: 'Champ de type \"objet\". Un objet contient un ensemble non ordonné de paires clé/valeur.',\n arrayType: 'Champ de type \"liste\". Une liste contient une collection ordonnée de valeurs.',\n stringType: 'Champ de type \"chaîne\". Ce type de champ n\\'est pas déterminé en fonction de la valeur, mais retourne systématiquement une chaîne de caractères.',\n modeEditorTitle: \"Changer mode d'édition\",\n modeCodeText: \"Code\",\n modeCodeTitle: \"Activer surlignage code\",\n modeFormText: \"Formulaire\",\n modeFormTitle: \"Activer formulaire\",\n modeTextText: \"Texte\",\n modeTextTitle: \"Activer éditeur texte\",\n modeTreeText: \"Arbre\",\n modeTreeTitle: \"Activer éditeur arbre\",\n modeViewText: \"Lecture seule\",\n modeViewTitle: \"Activer vue arbre\",\n modePreviewText: \"Prévisualisation\",\n modePreviewTitle: \"Activer mode prévisualiser\",\n examples: \"Exemples\",\n default: \"Défaut\",\n containsInvalidProperties: \"Contient des propriétés non valides\",\n containsInvalidItems: \"Contient des éléments invalides\"\n },\n de: {\n array: \"Auflistung\",\n auto: \"Auto\",\n appendText: \"anhängen\",\n appendTitle: \"Fügen Sie nach diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Umschalt+Ein)\",\n appendSubmenuTitle: \"Wählen Sie den Typ des neuen Feldes\",\n appendTitleAuto: \"Ein neues Feld vom Typ 'auto' hinzufügen (Strg+Umschalt+Ein)\",\n ascending: \"Aufsteigend\",\n ascendingTitle: \"Sortieren Sie die Elemente dieses ${type} in aufsteigender Reihenfolge\",\n actionsMenu: \"Klicken Sie zum Öffnen des Aktionsmenüs (Strg+M)\",\n cannotParseFieldError: \"Feld kann nicht in JSON geparst werden\",\n cannotParseValueError: \"Wert kann nicht in JSON geparst werden\",\n collapseAll: \"Alle Felder zuklappen\",\n compactTitle: \"JSON-Daten verdichten, alle Leerzeichen entfernen (Strg+Umschalt+\\\\)\",\n descending: \"Absteigend\",\n descendingTitle: \"Sortieren Sie die Elemente dieses ${type} in absteigender Reihenfolge\",\n drag: \"Ziehen, um dieses Feld zu verschieben (Alt+Umschalt+Pfeile)\",\n duplicateKey: \"Doppelter Schlüssel\",\n duplicateText: \"Duplikat\",\n duplicateTitle: \"Ausgewählte Felder duplizieren (Strg+D)\",\n duplicateField: \"Dieses Feld duplizieren (Strg+D)\",\n duplicateFieldError: \"Doppelter Feldname\",\n empty: \"leer\",\n expandAll: \"Alle Felder anzeigen\",\n expandTitle: \"Klicken Sie, um dieses Feld zu erweitern/zu kollabieren (Strg+E). \\nStrg+Klicken Sie, um dieses Feld einschließlich aller Elemente zu erweitern/zu kollabieren.\",\n formatTitle: \"JSON-Daten mit korrekter Einrückung und Zeilenvorschüben formatieren (Strg+\\\\)\",\n insert: \"einfügen\",\n insertTitle: \"Fügen Sie vor diesem Feld ein neues Feld mit dem Typ 'auto' ein (Strg+Einfg)\",\n insertSub: \"Wählen Sie den Typ des neuen Feldes\",\n object: \"Objekt\",\n ok: \"Ok\",\n redo: \"Wiederholen (Strg+Umschalt+Z)\",\n removeText: \"entfernen\",\n removeTitle: \"Ausgewählte Felder entfernen (Strg+Entf)\",\n removeField: \"Dieses Feld entfernen (Strg+Entf)\",\n repairTitle: \"JSON reparieren: Anführungszeichen und Escape-Zeichen korrigieren, Kommentare und JSONP-Notation entfernen, JavaScript-Objekte in JSON umwandeln.\",\n searchTitle: \"Suchfelder und Werte\",\n searchNextResultTitle: \"Nächstes Ergebnis (Enter)\",\n searchPreviousResultTitle: \"Vorheriges Ergebnis (Umschalt + Eingabe)\",\n selectNode: \"Wählen Sie einen Knoten aus...\",\n showAll: \"alle anzeigen\",\n showMore: \"mehr anzeigen\",\n showMoreStatus: \"Anzeige von ${visibleChilds} von ${totalChilds}-Elementen.\",\n sort: \"Sortieren\",\n sortTitle: \"Sortieren Sie die Elemente dieses ${type}\",\n sortTitleShort: \"Inhalt sortieren\",\n sortFieldLabel: \"Feld:\",\n sortDirectionLabel: \"Richtung:\",\n sortFieldTitle: \"Wählen Sie das verschachtelte Feld, nach dem das Array oder Objekt sortiert werden soll.\",\n sortAscending: \"Aufsteigend\",\n sortAscendingTitle: \"Sortieren Sie das ausgewählte Feld in aufsteigender Reihenfolge\",\n sortDescending: \"Absteigend\",\n sortDescendingTitle: \"Sortieren Sie das ausgewählte Feld in absteigender Reihenfolge\",\n string: \"Zeichenfolge\",\n transform: \"Verwandeln\",\n transformTitle: \"Die Elemente dieses ${type} filtern, sortieren oder transformieren\",\n transformTitleShort: \"Inhalte filtern, sortieren oder transformieren\",\n extract: \"Auszug\",\n extractTitle: \"Extrahieren Sie diesen ${type}\",\n transformQueryTitle: \"Eine JMESPath-Abfrage eingeben\",\n transformWizardLabel: \"Zauberer\",\n transformWizardFilter: \"Filter\",\n transformWizardSortBy: \"Sortieren nach\",\n transformWizardSelectFields: \"Felder auswählen\",\n transformQueryLabel: \"Anfrage\",\n transformPreviewLabel: \"Vorschau\",\n type: \"Geben Sie ein.\",\n typeTitle: \"Ändern Sie den Typ dieses Feldes\",\n openUrl: \"Strg+Klicken oder Strg+Eingabe, um die URL in einem neuen Fenster zu öffnen\",\n undo: \"Letzte Aktion rückgängig machen (Strg+Z)\",\n validationCannotMove: \"Kann ein Feld nicht in ein Kind seiner selbst verschieben\",\n autoType: 'Feldtyp \"auto\". Der Feldtyp wird automatisch aus dem Wert bestimmt und kann ein String, eine Zahl, boolesch oder null sein.',\n objectType: 'Feldtyp \"Objekt\". Ein Objekt enthält eine ungeordnete Menge von Schlüssel/Wert-Paaren.',\n arrayType: 'Feldtyp \"Array\". Ein Array enthält eine geordnete Sammlung von Werten.',\n stringType: 'Feldtyp \"Zeichenfolge\". Der Feldtyp wird nicht aus dem Wert bestimmt, sondern immer als Zeichenfolge zurückgegeben.',\n modeEditorTitle: \"Editor-Modus umschalten\",\n modeCodeText: \"Code\",\n modeCodeTitle: \"Umschalten auf Code-Highlighter\",\n modeFormText: \"Formular\",\n modeFormTitle: \"Zum Formular-Editor wechseln\",\n modeTextText: \"Text\",\n modeTextTitle: \"Zum Editor für einfachen Text wechseln\",\n modeTreeText: \"Baum\",\n modeTreeTitle: \"Zum Baum-Editor wechseln\",\n modeViewText: \"Siehe\",\n modeViewTitle: \"Zur Baumansicht wechseln\",\n modePreviewText: \"Vorschau\",\n modePreviewTitle: \"In den Vorschau-Modus wechseln\",\n examples: \"Beispiele\",\n default: \"Standardmäßig\",\n containsInvalidProperties: \"Enthält ungültige Eigenschaften\",\n containsInvalidItems: \"Enthält ungültige Elemente\"\n },\n ru: {\n array: \"Массив\",\n auto: \"Авто\",\n appendText: \"Добавить\",\n appendTitle: \"Добавить новое поле с типом 'авто' после этого поля (Ctrl+Shift+Ins)\",\n appendSubmenuTitle: \"Выбрать тип поля для добавления\",\n appendTitleAuto: \"Добавить новое поле с типом 'авто' (Ctrl+Shift+Ins)\",\n ascending: \"По возрастанию\",\n ascendingTitle: \"Сортировать ${type} по возрастанию\",\n actionsMenu: \"Нажмите для открытия меню действий (Ctrl+M)\",\n cannotParseFieldError: \"Невозможно преобразовать поле в JSON\",\n cannotParseValueError: \"Невозможно преобразовать значение в JSON\",\n collapseAll: \"Свернуть все\",\n compactTitle: \"Минификация JSON (Ctrl+Shift+I)\",\n descending: \"По убыванию\",\n descendingTitle: \"Сортировать ${type} по убыванию\",\n drag: \"Потяните для перемещения этого поля (Alt+Shift+Arrows)\",\n duplicateKey: \"повторяющийся ключ\",\n duplicateText: \"Дублировать\",\n duplicateTitle: \"Дублирование полей (Ctrl+D)\",\n duplicateField: \"Дублировать поле (Ctrl+D)\",\n duplicateFieldError: \"Дублирование названия поля\",\n empty: \"пустой\",\n expandAll: \"Развернуть все\",\n expandTitle: \"Нажмите для раскрытия/скрытия поля (Ctrl+E)\\nили Ctrl+Click для раскрытия/скрытия всех потомков.\",\n formatTitle: \"Форматирование JSON (Ctrl+I)\",\n insert: \"Вставить\",\n insertTitle: \"Вставить новое поле с типом 'авто' перед этим полем (Ctrl+Ins)\",\n insertSub: \"Выбрать тип поля для вставки\",\n object: \"Объект\",\n ok: \"ОК\",\n redo: \"Повторить (Ctrl+Shift+Z)\",\n removeText: \"Удалить\",\n removeTitle: \"Удалить выбранные поля (Ctrl+Del)\",\n removeField: \"Удалить поле (Ctrl+Del)\",\n repairTitle: \"Восстановите JSON: исправьте кавычки и escape-символы, удалите комментарии и нотацию JSONP, модифицируйте объекты JavaScript в JSON.\",\n searchTitle: \"Поиск\",\n searchNextResultTitle: \"Следующий результат (Enter)\",\n searchPreviousResultTitle: \"Предыдущий результат (Shift + Enter)\",\n selectNode: \"Выбор узла...\",\n showAll: \"показать все\",\n showMore: \"больше\",\n showMoreStatus: \"${visibleChilds} из ${totalChilds}\",\n sort: \"Сортировка\",\n sortTitle: \"Сортировка потомков типа ${type}\",\n sortTitleShort: \"Сортировка содержимого\",\n sortFieldLabel: \"Поле:\",\n sortDirectionLabel: \"Направление:\",\n sortFieldTitle: \"Выберите поле для сортировки массива или объекта\",\n sortAscending: \"По возрастанию\",\n sortAscendingTitle: \"Сортировка выбранного поря по возрастанию\",\n sortDescending: \"По убыванию\",\n sortDescendingTitle: \"Сортировка выбранного поря по убыванию\",\n string: \"Строка\",\n transform: \"Модификация\",\n transformTitle: \"Фильтрация, сортировка или модификация данных типа ${type}\",\n transformTitleShort: \"Фильтрация, сортировка или модификация данных\",\n extract: \"Извлечение\",\n extractTitle: \"Извлечь тип ${type}\",\n transformQueryTitle: \"Введите JMESpath запрос\",\n transformWizardLabel: \"Мастер\",\n transformWizardFilter: \"Фильтр\",\n transformWizardSortBy: \"Сортировка\",\n transformWizardSelectFields: \"Поля\",\n transformQueryLabel: \"Запрос\",\n transformPreviewLabel: \"Просмотр\",\n type: \"Тип\",\n typeTitle: \"Изменить тип этого поля\",\n openUrl: \"Ctrl+Click или Ctrl+Enter для открытия url в новом окне\",\n undo: \"Отменить (Ctrl+Z)\",\n validationCannotMove: \"Поле не может быть перемещено в потомка\",\n autoType: \"Тип поля автоматически определяется по значению и может быть строкой, числом, логическим значением или null.\",\n objectType: \"Объект содержит неупорядоченный набор пар ключ/значение.\",\n arrayType: \"Массив содержит упорядоченный набор значений.\",\n stringType: \"Тип поля не определяется из значения, но всегда возвращается как строка.\",\n modeEditorTitle: \"Переключение режима редактора\",\n modeCodeText: \"Код\",\n modeCodeTitle: \"Переключить в режим редактора кода\",\n modeFormText: \"Форма\",\n modeFormTitle: \"Переключить в режим формы\",\n modeTextText: \"Текст\",\n modeTextTitle: \"Переключить в режим редактора текста\",\n modeTreeText: \"Дерево\",\n modeTreeTitle: \"Переключить в режим редактора дерева\",\n modeViewText: \"Просмотр дерева\",\n modeViewTitle: \"Переключить в режим просмотра дерева\",\n modePreviewText: \"Просмотр\",\n modePreviewTitle: \"Переключить в режим просмотра\",\n examples: \"Примеры\",\n default: \"По умолчанию\",\n containsInvalidProperties: \"Содержит недопустимые свойства\",\n containsInvalidItems: \"Содержит недопустимые элементы\"\n },\n ko: {\n array: \"배열\",\n auto: \"자동\",\n appendText: \"추가\",\n appendTitle: '선택한 요소 아래에 \"자동\" 요소를 추가합니다. (Ctrl + Shift + Ins)',\n appendSubmenuTitle: \"추가할 요소의 유형을 선택해주세요.\",\n appendTitleAuto: '\"자동\" 요소를 추가합니다. (Ctrl + Shift + Ins)',\n ascending: \"오름차순\",\n ascendingTitle: \"선택한 ${type}의 하위 요소를 오름차순 정렬합니다.\",\n actionsMenu: \"메뉴 열기 (Ctrl + M)\",\n cannotParseFieldError: \"JSON의 요소를 해석할 수 없습니다.\",\n cannotParseValueError: \"JSON의 값을 해석할 수 없습니다.\",\n collapseAll: \"모두 접기\",\n compactTitle: \"모든 공백을 제거하여 JSON 데이터를 작게 만듭니다. (Ctrl + Shift + I)\",\n descending: \"내림차순\",\n descendingTitle: \"선택한 ${type}의 하위 요소를 내림차순으로 정렬\",\n drag: \"드래그하여 요소를 이동합니다. (Alt + Shift + Arrows)\",\n duplicateKey: \"복제키\",\n duplicateText: \"복제\",\n duplicateTitle: \"선택한 요소를 복제합니다. (Ctrl + D)\",\n duplicateField: \"선택한 요소를 복제합니다. (Ctrl + D)\",\n duplicateFieldError: \"요소 이름이 중복되었습니다.\",\n empty: \"비어있음\",\n expandAll: \"모두 열기\",\n expandTitle: \"클릭하여 요소를 열거나 닫습니다. (Ctrl + E) \\nCtrl + Click으로 모든 하위 요소를 열거나 닫습니다.\",\n formatTitle: \"적절한 들여쓰기 및 줄바꿈으로 JSON 데이터를 정형화합니다. (Ctrl + I)\",\n insert: \"삽입\",\n insertTitle: \"선택한 요소 위에 새요소를 삽입합니다. (Ctrl + Ins)\",\n insertSub: \"삽입할 요소의 유형을 선택해주세요.\",\n object: \"객체\",\n ok: \"확인\",\n redo: \"다시 실행 (Ctrl + Shift + Z)\",\n removeText: \"삭제\",\n removeTitle: \"선택한 요소를 삭제합니다. (Ctrl + Del)\",\n removeField: \"선택한 요소를 삭제합니다. (Ctrl + Del)\",\n repairTitle: \"JSON 교정: JSON 내의 주석과 JSONP 표기법을 지우고 따옴표와 이스케이프 문자를 수정합니다.\",\n searchTitle: \"요소 또는 값 찾기\",\n searchNextResultTitle: \"다음으로 찾기 (Enter)\",\n searchPreviousResultTitle: \"이전으로 찾기 (Shift + Enter)\",\n selectNode: \"요소를 선택해주세요...\",\n showAll: \"모두보기\",\n showMore: \"더보기\",\n showMoreStatus: \"${totalChilds} 개의 항목 중 ${visibleChilds} 개를 표시합니다.\",\n sort: \"정렬\",\n sortTitle: \"선택한 ${type}의 하위 요소를 정렬합니다.\",\n sortTitleShort: \"정렬\",\n sortFieldLabel: \"요소:\",\n sortDirectionLabel: \"순서:\",\n sortFieldTitle: \"배열이나 객체를 정렬하는 요소를 선택해주세요.\",\n sortAscending: \"오름차순\",\n sortAscendingTitle: \"선택한 요소를 오름차순으로 정렬합니다.\",\n sortDescending: \"내림차순\",\n sortDescendingTitle: \"선택한 요소를 내림차순으로 정렬합니다.\",\n string: \"문자\",\n transform: \"변환\",\n transformTitle: \"선택한 ${type}의 하위 요소를 필터하거나 정렬 또는 변환합니다.\",\n transformTitleShort: \"내용을 필터하거나 정렬 또는 변환합니다.\",\n extract: \"추출\",\n extractTitle: \"선택한 ${type}의 값을 최상위에 위치시킵니다.\",\n transformQueryTitle: \"JMESPath 쿼리를 입력해주세요.\",\n transformWizardLabel: \"마법사\",\n transformWizardFilter: \"필터\",\n transformWizardSortBy: \"정렬\",\n transformWizardSelectFields: \"요소를 선택해주세요.\",\n transformQueryLabel: \"쿼리\",\n transformPreviewLabel: \"미리보기\",\n type: \"유형\",\n typeTitle: \"선택한 요소의 유형을 변경합니다.\",\n openUrl: \"Ctrl + Click 또는 Ctrl + Enter로 새 창에서 URL 열기\",\n undo: \"실행 취소 (Ctrl + Z)\",\n validationCannotMove: \"하위 요소로 이동할 수 없습니다.\",\n autoType: \"자동: 요소의 형식이 값의 유형으로 결정됩니다. 문자, 숫자, 부울, 또는 null만 허용됩니다.\",\n objectType: \"객체: 순서대로 나열되지 않은 이름/값 쌍으로 이루어진 집합입니다.\",\n arrayType: \"배열: 순서대로 나열된 값의 집합입니다.\",\n stringType: \"문자: 요소의 유형이 값에서 결정되지 않지만 항상 문자로 반환됩니다.\",\n modeEditorTitle: \"편집기 유형 변경\",\n modeCodeText: \"코드\",\n modeCodeTitle: \"형식 교정을 도와주는 기능이 포함된 문자 편집기\",\n modeFormText: \"입력 양식\",\n modeFormTitle: \"정해진 요소에 값을 입력하는 편집기\",\n modeTextText: \"문자\",\n modeTextTitle: \"단순 문자 편집기\",\n modeTreeText: \"트리\",\n modeTreeTitle: \"트리 구조로 표시되는 편집기\",\n modeViewText: \"보기\",\n modeViewTitle: \"읽기전용 트리 구조로 JSON을 표시\",\n modePreviewText: \"미리보기\",\n modePreviewTitle: \"읽기전용 문자로 JSON을 표시\",\n examples: \"예제\",\n default: \"기본값\",\n containsInvalidProperties: \"잘못된 속성이 포함되어 있습니다.\",\n containsInvalidItems: \"잘못된 항목이 포함되어 있습니다\"\n }\n },\n i = Object.keys(r),\n s = \"en\",\n o = \"undefined\" != typeof navigator ? navigator.language || navigator.userLanguage : void 0,\n a = i.find(function (e) {\n return e === o;\n }) || s;\n function l(t) {\n var e;\n t && ((e = i.find(function (e) {\n return e === t;\n })) ? a = e : console.error(\"Language not found\"));\n }\n function c(e) {\n if (e) for (var t in e) !function (t) {\n i.find(function (e) {\n return e === t;\n }) || i.push(t), r[t] = Object.assign({}, r[s], r[t], e[t]);\n }(t);\n }\n function h(e, t, n) {\n var i = r[n = n || a][e] || r[s][e] || e;\n if (t) for (var o in t) i = i.replace(\"${\" + o + \"}\", t[o]);\n return i;\n }\n },\n 6056: function (e, t, n) {\n \"use strict\";\n\n n.d(t, {\n J: function () {\n return r;\n },\n r: function () {\n return o;\n }\n });\n var t = n(5156),\n i = n.n(t),\n s = n(9791);\n function o(e, t) {\n var n,\n i = t.sort,\n o = t.filter,\n t = t.projection,\n r = \"\";\n return o ? (n = \"@\" !== o.field ? [\"0\"].concat((0, s.parsePath)(\".\" + o.field)) : [\"0\"], n = \"string\" == typeof (0, s.get)(e, n) ? o.value : (0, s.parseString)(o.value), r += \"[? \" + o.field + \" \" + o.relation + \" `\" + JSON.stringify(n) + \"`]\") : r += Array.isArray(e) ? \"[*]\" : \"@\", i && (\"desc\" === i.direction ? r += \" | reverse(sort_by(@, &\" + i.field + \"))\" : r += \" | sort_by(@, &\" + i.field + \")\"), t && (\"]\" !== r[r.length - 1] && (r += \" | [*]\"), 1 === t.fields.length ? r += \".\" + t.fields[0] : 1 < t.fields.length && (r += \".{\" + t.fields.map(function (e) {\n var t = e.split(\".\");\n return t[t.length - 1] + \": \" + e;\n }).join(\", \") + \"}\")), r;\n }\n function r(e, t) {\n return i().search(e, t);\n }\n },\n 4987: function () {\n function e(e) {\n void 0 === e || \"remove\" in e || Object.defineProperty(e, \"remove\", {\n configurable: !0,\n enumerable: !0,\n writable: !0,\n value: function () {\n void 0 !== this.parentNode && this.parentNode.removeChild(this);\n }\n });\n }\n \"undefined\" != typeof Element && (void 0 !== window.Element && e(window.Element.prototype), void 0 !== window.CharacterData && e(window.CharacterData.prototype), void 0 !== window.DocumentType) && e(window.DocumentType.prototype), Array.prototype.findIndex || Object.defineProperty(Array.prototype, \"findIndex\", {\n value: function (e) {\n for (var t = 0; t < this.length; t++) {\n var n = this[t];\n if (e.call(this, n, t, this)) return t;\n }\n return -1;\n },\n configurable: !0,\n writable: !0\n }), Array.prototype.find || Object.defineProperty(Array.prototype, \"find\", {\n value: function (e) {\n e = this.findIndex(e);\n return this[e];\n },\n configurable: !0,\n writable: !0\n }), String.prototype.trim || (String.prototype.trim = function () {\n return this.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g, \"\");\n });\n },\n 341: function (e, t, n) {\n \"use strict\";\n\n n.r(t), n.d(t, {\n previewModeMixins: function () {\n return f;\n }\n });\n var i = n(1262),\n s = n(4188),\n o = n(6436),\n r = n(2474);\n function a(e) {\n return (a = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function l(e, t) {\n for (var n = 0; n < t.length; n++) {\n var i = t[n];\n i.enumerable = i.enumerable || !1, i.configurable = !0, \"value\" in i && (i.writable = !0), Object.defineProperty(e, function (e) {\n e = function (e, t) {\n if (\"object\" !== a(e) || null === e) return e;\n var n = e[Symbol.toPrimitive];\n if (void 0 === n) return (\"string\" === t ? String : Number)(e);\n n = n.call(e, t || \"default\");\n if (\"object\" !== a(n)) return n;\n throw new TypeError(\"@@toPrimitive must return a primitive value.\");\n }(e, \"string\");\n return \"symbol\" === a(e) ? e : String(e);\n }(i.key), i);\n }\n }\n var c = function () {\n function i(e, t, n) {\n if (!(this instanceof i)) throw new TypeError(\"Cannot call a class as a function\");\n this.onChange = e, this.calculateItemSize = t || function () {\n return 1;\n }, this.limit = n, this.items = [], this.index = -1;\n }\n var e, t, n;\n return e = i, (t = [{\n key: \"add\",\n value: function (e) {\n for (; this._calculateHistorySize() > this.limit && 1 < this.items.length;) this.items.shift(), this.index--;\n this.items = this.items.slice(0, this.index + 1), this.items.push(e), this.index++, this.onChange();\n }\n }, {\n key: \"_calculateHistorySize\",\n value: function () {\n var t = this.calculateItemSize,\n n = 0;\n return this.items.forEach(function (e) {\n n += t(e);\n }), n;\n }\n }, {\n key: \"undo\",\n value: function () {\n if (this.canUndo()) return this.index--, this.onChange(), this.items[this.index];\n }\n }, {\n key: \"redo\",\n value: function () {\n if (this.canRedo()) return this.index++, this.onChange(), this.items[this.index];\n }\n }, {\n key: \"canUndo\",\n value: function () {\n return 0 < this.index;\n }\n }, {\n key: \"canRedo\",\n value: function () {\n return this.index < this.items.length - 1;\n }\n }, {\n key: \"clear\",\n value: function () {\n this.items = [], this.index = -1, this.onChange();\n }\n }]) && l(e.prototype, t), n && l(e, n), Object.defineProperty(e, \"prototype\", {\n writable: !1\n }), i;\n }(),\n h = n(7907),\n d = n(6056),\n u = n(6617),\n g = n(6210),\n p = n(2558),\n t = n(8458),\n m = n(9791),\n n = t.textModeMixins[0].mixin,\n t = {\n create: function (e) {\n var t = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n n = (void 0 === t.statusBar && (t.statusBar = !0), t.mainMenuBar = !1 !== t.mainMenuBar, t.enableSort = !1 !== t.enableSort, t.enableTransform = !1 !== t.enableTransform, t.createQuery = t.createQuery || d.r, t.executeQuery = t.executeQuery || d.J, \"number\" == typeof (this.options = t).indentation ? this.indentation = Number(t.indentation) : this.indentation = 2, (0, h.cC)(this.options.languages), (0, h.m0)(this.options.language), this.mode = \"preview\", this),\n e = (this.container = e, this.dom = {}, this.json = void 0, this.text = \"\", this._debouncedValidate = (0, m.debounce)(this.validate.bind(this), this.DEBOUNCE_INTERVAL), this.width = e.clientWidth, this.height = e.clientHeight, this.frame = document.createElement(\"div\"), this.frame.className = \"jsoneditor jsoneditor-mode-preview\", this.frame.onclick = function (e) {\n e.preventDefault();\n }, {\n target: this.frame,\n onFocus: this.options.onFocus || null,\n onBlur: this.options.onBlur || null\n }),\n e = (this.frameFocusTracker = new r.R(e), this.content = document.createElement(\"div\"), this.content.className = \"jsoneditor-outer\", this.dom.busy = document.createElement(\"div\"), this.dom.busy.className = \"jsoneditor-busy\", this.dom.busyContent = document.createElement(\"span\"), this.dom.busyContent.textContent = \"busy...\", this.dom.busy.appendChild(this.dom.busyContent), this.content.appendChild(this.dom.busy), this.dom.previewContent = document.createElement(\"pre\"), this.dom.previewContent.className = \"jsoneditor-preview\", this.dom.previewText = document.createTextNode(\"\"), this.dom.previewContent.appendChild(this.dom.previewText), this.content.appendChild(this.dom.previewContent), this.options.mainMenuBar && ((0, m.addClassName)(this.content, \"has-main-menu-bar\"), this.menu = document.createElement(\"div\"), this.menu.className = \"jsoneditor-menu\", this.frame.appendChild(this.menu), (e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-format\", e.title = (0, h.Iu)(\"formatTitle\"), this.menu.appendChild(e), e.onclick = function () {\n n.executeWithBusyMessage(function () {\n try {\n n.format();\n } catch (e) {\n n._onError(e);\n }\n }, \"formatting...\");\n }, (e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-compact\", e.title = (0, h.Iu)(\"compactTitle\"), this.menu.appendChild(e), e.onclick = function () {\n n.executeWithBusyMessage(function () {\n try {\n n.compact();\n } catch (e) {\n n._onError(e);\n }\n }, \"compacting...\");\n }, this.options.enableSort && ((e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-sort\", e.title = (0, h.Iu)(\"sortTitleShort\"), e.onclick = function () {\n n._showSortModal();\n }, this.menu.appendChild(e)), this.options.enableTransform && ((e = document.createElement(\"button\")).type = \"button\", e.title = (0, h.Iu)(\"transformTitleShort\"), e.className = \"jsoneditor-transform\", e.onclick = function () {\n n._showTransformModal();\n }, this.dom.transform = e, this.menu.appendChild(e)), (e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-repair\", e.title = (0, h.Iu)(\"repairTitle\"), this.menu.appendChild(e), !(e.onclick = function () {\n void 0 === n.json && n.executeWithBusyMessage(function () {\n try {\n n.repair();\n } catch (e) {\n n._onError(e);\n }\n }, \"repairing...\");\n }) !== this.options.history && (this.history = new c(function () {\n n.dom.undo.disabled = !n.history.canUndo(), n.dom.redo.disabled = !n.history.canRedo();\n }, function (e) {\n return 2 * e.text.length;\n }, s.oW), (e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-undo jsoneditor-separator\", e.title = (0, h.Iu)(\"undo\"), e.onclick = function () {\n var e = n.history.undo();\n e && n._applyHistory(e);\n }, this.menu.appendChild(e), this.dom.undo = e, (e = document.createElement(\"button\")).type = \"button\", e.className = \"jsoneditor-redo\", e.title = (0, h.Iu)(\"redo\"), e.onclick = function () {\n var e = n.history.redo();\n e && n._applyHistory(e);\n }, this.menu.appendChild(e), this.dom.redo = e, this.history.onChange()), this.options) && this.options.modes && this.options.modes.length && (this.modeSwitcher = new u.x(this.menu, this.options.modes, this.options.mode, function (e) {\n try {\n n.setMode(e), n.modeSwitcher.focus();\n } catch (e) {\n n._onError(e);\n }\n })), Array.isArray(this.options.showErrorTable) ? this.options.showErrorTable.includes(this.mode) : !0 === this.options.showErrorTable);\n this.errorTable = new o.Q({\n errorTableVisible: e,\n onToggleVisibility: function () {\n n.validate();\n },\n onFocusLine: null,\n onChangeHeight: function (e) {\n e = e + (n.dom.statusBar ? n.dom.statusBar.clientHeight : 0) + 1;\n n.content.style.marginBottom = -e + \"px\", n.content.style.paddingBottom = e + \"px\";\n }\n }), this.frame.appendChild(this.content), this.frame.appendChild(this.errorTable.getErrorTable()), this.container.appendChild(this.frame), t.statusBar && ((0, m.addClassName)(this.content, \"has-status-bar\"), e = document.createElement(\"div\"), (this.dom.statusBar = e).className = \"jsoneditor-statusbar\", this.frame.appendChild(e), this.dom.fileSizeInfo = document.createElement(\"span\"), this.dom.fileSizeInfo.className = \"jsoneditor-size-info\", this.dom.fileSizeInfo.innerText = \"\", e.appendChild(this.dom.fileSizeInfo), this.dom.arrayInfo = document.createElement(\"span\"), this.dom.arrayInfo.className = \"jsoneditor-size-info\", this.dom.arrayInfo.innerText = \"\", e.appendChild(this.dom.arrayInfo), e.appendChild(this.errorTable.getErrorCounter()), e.appendChild(this.errorTable.getWarningIcon()), e.appendChild(this.errorTable.getErrorIcon())), this._renderPreview(), this.setSchema(this.options.schema, this.options.schemaRefs);\n },\n _renderPreview: function () {\n var e = this.getText();\n this.dom.previewText.nodeValue = (0, m.limitCharacters)(e, s.WF), this.dom.fileSizeInfo && (this.dom.fileSizeInfo.innerText = \"Size: \" + (0, m.formatSize)(e.length)), this.dom.arrayInfo && (Array.isArray(this.json) ? this.dom.arrayInfo.innerText = \"Array: \" + this.json.length + \" items\" : this.dom.arrayInfo.innerText = \"\");\n },\n _onChange: function () {\n if (this._debouncedValidate(), this.options.onChange) try {\n this.options.onChange();\n } catch (e) {\n console.error(\"Error in onChange callback: \", e);\n }\n if (this.options.onChangeJSON) try {\n this.options.onChangeJSON(this.get());\n } catch (e) {\n console.error(\"Error in onChangeJSON callback: \", e);\n }\n if (this.options.onChangeText) try {\n this.options.onChangeText(this.getText());\n } catch (e) {\n console.error(\"Error in onChangeText callback: \", e);\n }\n }\n },\n f = (t._showSortModal = function () {\n var r = this;\n this.executeWithBusyMessage(function () {\n var e = r.options.modalAnchor || s.qD,\n o = r.get();\n r._renderPreview(), (0, g.showSortModal)(e, o, function (i) {\n r.executeWithBusyMessage(function () {\n var e, t, n;\n e = o, t = i, Array.isArray(e) && (n = (0, m.sort)(e, t.path, t.direction), r.sortedBy = t, r._setAndFireOnChange(n)), (0, m.isObject)(e) && (n = (0, m.sortObjectKeys)(e, t.direction), r.sortedBy = t, r._setAndFireOnChange(n));\n }, \"sorting...\");\n }, r.sortedBy);\n }, \"parsing...\");\n }, t._showTransformModal = function () {\n var r = this;\n this.executeWithBusyMessage(function () {\n var e = r.options,\n t = e.createQuery,\n n = e.executeQuery,\n i = e.modalAnchor,\n e = e.queryDescription,\n o = r.get();\n r._renderPreview(), (0, p.showTransformModal)({\n container: i || s.qD,\n json: o,\n queryDescription: e,\n createQuery: t,\n executeQuery: n,\n onTransform: function (t) {\n r.executeWithBusyMessage(function () {\n var e = n(o, t);\n r._setAndFireOnChange(e);\n }, \"transforming...\");\n }\n });\n }, \"parsing...\");\n }, t.destroy = function () {\n this.frame && this.container && this.frame.parentNode === this.container && this.container.removeChild(this.frame), this.modeSwitcher && (this.modeSwitcher.destroy(), this.modeSwitcher = null), this._debouncedValidate = null, this.history && (this.history.clear(), this.history = null), this.frameFocusTracker.destroy();\n }, t.compact = function () {\n var e = this.get(),\n t = JSON.stringify(e);\n this._setTextAndFireOnChange(t, e);\n }, t.format = function () {\n var e = this.get(),\n t = JSON.stringify(e, null, this.indentation);\n this._setTextAndFireOnChange(t, e);\n }, t.repair = function () {\n var e = this.getText();\n try {\n var t = (0, i.K)(e);\n this._setTextAndFireOnChange(t);\n } catch (e) {}\n }, t.focus = function () {\n this.dom.transform.focus();\n }, t.set = function (e) {\n this.history && this.history.clear(), this._set(e);\n }, t.update = function (e) {\n this._set(e);\n }, t._set = function (e) {\n this.text = void 0, this.json = e, this._renderPreview(), this._pushHistory(), this._debouncedValidate();\n }, t._setAndFireOnChange = function (e) {\n this._set(e), this._onChange();\n }, t.get = function () {\n var e;\n return void 0 === this.json && (e = this.getText(), this.json = (0, m.parse)(e)), this.json;\n }, t.getText = function () {\n return void 0 === this.text && (this.text = JSON.stringify(this.json, null, this.indentation), !0 === this.options.escapeUnicode) && (this.text = (0, m.escapeUnicodeChars)(this.text)), this.text;\n }, t.setText = function (e) {\n this.history && this.history.clear(), this._setText(e);\n }, t.updateText = function (e) {\n this.getText() !== e && this._setText(e);\n }, t._setText = function (e, t) {\n var n;\n !0 === this.options.escapeUnicode ? this.text = (0, m.escapeUnicodeChars)(e) : this.text = e, this.json = t, this._renderPreview(), void 0 === this.json ? (n = this).executeWithBusyMessage(function () {\n try {\n n.json = n.get(), n._renderPreview(), n._pushHistory();\n } catch (e) {}\n }, \"parsing...\") : this._pushHistory(), this._debouncedValidate();\n }, t._setTextAndFireOnChange = function (e, t) {\n this._setText(e, t), this._onChange();\n }, t._applyHistory = function (e) {\n this.json = e.json, this.text = e.text, this._renderPreview(), this._debouncedValidate();\n }, t._pushHistory = function () {\n var e;\n this.history && (e = {\n text: this.text,\n json: this.json\n }, this.history.add(e));\n }, t.executeWithBusyMessage = function (e, t) {\n var n;\n this.getText().length > s.EX ? ((0, m.addClassName)((n = this).frame, \"busy\"), n.dom.busyContent.innerText = t, setTimeout(function () {\n e(), (0, m.removeClassName)(n.frame, \"busy\"), n.dom.busyContent.innerText = \"\";\n }, 100)) : e();\n }, t.validate = n.validate, t._renderErrors = n._renderErrors, [{\n mode: \"preview\",\n mixin: t,\n data: \"json\"\n }]);\n },\n 6210: function (e, t, n) {\n \"use strict\";\n\n n.r(t), n.d(t, {\n showSortModal: function () {\n return s;\n }\n });\n var t = n(483),\n i = n.n(t),\n o = n(7907),\n r = n(9791);\n function s(e, t, s, n) {\n var a = Array.isArray(t) ? (0, r.getChildPaths)(t) : [\"\"],\n l = n && n.path && (0, r.contains)(a, n.path) ? n.path : a[0],\n c = n && n.direction || \"asc\",\n t = '
    ' + (0, o.Iu)(\"sort\") + \"
    \" + (0, o.Iu)(\"sortFieldLabel\") + '
    ' + (0, o.Iu)(\"sortDirectionLabel\") + '
    ';\n i()({\n parent: e,\n content: t,\n overlayClass: \"jsoneditor-modal-overlay\",\n overlayStyles: {\n backgroundColor: \"rgb(1,1,1)\",\n opacity: .3\n },\n modalClass: \"jsoneditor-modal jsoneditor-modal-sort\"\n }).afterCreate(function (t) {\n var e = t.modalElem().querySelector(\"form\"),\n n = t.modalElem().querySelector(\"#ok\"),\n i = t.modalElem().querySelector(\"#field\"),\n o = t.modalElem().querySelector(\"#direction\");\n function r(e) {\n o.value = e, o.className = \"jsoneditor-button-group jsoneditor-button-group-value-\" + o.value;\n }\n a.forEach(function (e) {\n var t,\n n = document.createElement(\"option\");\n n.text = \"\" === (t = e) ? \"@\" : \".\" === t[0] ? t.slice(1) : t, n.value = e, i.appendChild(n);\n }), i.value = l || a[0], r(c || \"asc\"), o.onclick = function (e) {\n r(e.target.getAttribute(\"data-value\"));\n }, n.onclick = function (e) {\n e.preventDefault(), e.stopPropagation(), t.close(), s({\n path: i.value,\n direction: o.value\n });\n }, e && (e.onsubmit = n.onclick);\n }).afterClose(function (e) {\n e.destroy();\n }).show();\n }\n },\n 2558: function (e, t, n) {\n \"use strict\";\n\n n.r(t), n.d(t, {\n showTransformModal: function () {\n return s;\n }\n });\n var t = n(483),\n i = n.n(t),\n t = n(3879),\n x = n.n(t),\n o = n(7907);\n function I(e) {\n return (I = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (e) {\n return typeof e;\n } : function (e) {\n return e && \"function\" == typeof Symbol && e.constructor === Symbol && e !== Symbol.prototype ? \"symbol\" : typeof e;\n })(e);\n }\n function k(e, t, n, i) {\n if (\"boolean\" == typeof e || e instanceof Boolean || null === e || \"number\" == typeof e || e instanceof Number || \"string\" == typeof e || e instanceof String || e instanceof Date) return JSON.stringify(e);\n if (Array.isArray(e)) {\n for (var o = e, r = t, s = n, a = i, l = r ? s + r : void 0, c = r ? \"[\\n\" : \"[\", h = 0; h < o.length; h++) {\n var d = o[h];\n if (r && (c += l), c += void 0 !== d && \"function\" != typeof d ? k(d, r, l, a) : \"null\", h < o.length - 1 && (c += r ? \",\\n\" : \",\"), c.length > a) return c + \"...\";\n }\n return c += r ? \"\\n\" + s + \"]\" : \"]\";\n }\n if (e && \"object\" === I(e)) {\n var u,\n g = e,\n p = t,\n s = n,\n m = i,\n f = p ? s + p : void 0,\n C = !0,\n y = p ? \"{\\n\" : \"{\";\n if (\"function\" == typeof g.toJSON) return k(g.toJSON(), p, s, m);\n for (u in g) if (function (e, t) {\n return Object.prototype.hasOwnProperty.call(e, t);\n }(g, u)) {\n var v = g[u];\n if (C ? C = !1 : y += p ? \",\\n\" : \",\", (y = (y += p ? f + '\"' + u + '\": ' : '\"' + u + '\":') + k(v, p, f, m)).length > m) return y + \"...\";\n }\n return y += p ? \"\\n\" + s + \"}\" : \"}\";\n }\n }\n function E(e, t) {\n for (var n = \"\"; 0 < t--;) n += e;\n return n;\n }\n var T = n(9791),\n R = n(4188),\n r = 'Enter a JMESPath query to filter, sort, or transform the JSON data.
    To learn JMESPath, go to the interactive tutorial.';\n function s(e) {\n var t = e.container,\n I = e.json,\n n = e.queryDescription,\n n = void 0 === n ? r : n,\n b = e.createQuery,\n A = e.executeQuery,\n w = e.onTransform,\n S = I,\n e = '