@norwegian/core-components 7.3.2 → 7.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -406,8 +406,13 @@ export class FilterComponent extends NasComponentBase {
406
406
  }
407
407
  ngOnInit() {
408
408
  if (this.enableTripSwitch) {
409
- this.tripTypeInit = true;
410
- this.defaultTripType = this.tripType;
409
+ this.tripType = this.tripType !== TripType.oneWay && this.tripType !== TripType.twoWayReturn ? TripType.twoWayReturn : this.tripType;
410
+ if (this.nasFormControlNameTripType) {
411
+ const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
412
+ if (tripTypeControl) {
413
+ tripTypeControl.patchValue(this.tripType);
414
+ }
415
+ }
411
416
  }
412
417
  if (!this.nasFormGroup) {
413
418
  return;
@@ -426,7 +431,7 @@ export class FilterComponent extends NasComponentBase {
426
431
  if (this.nasFormControlNameTripType) {
427
432
  const tripTypeControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
428
433
  if (tripTypeControl) {
429
- this.tripType = this.tripTypeInit ? this.defaultTripType : this.tripType;
434
+ this.tripType = tripTypeControl.value;
430
435
  this.inboundDisabled = tripTypeControl.value === TripType.oneWay;
431
436
  if (this.nasFormControlNameInbound) {
432
437
  const inboundControl = this.nasFormGroup.get(this.nasFormControlNameInbound);
@@ -913,20 +918,11 @@ export class FilterComponent extends NasComponentBase {
913
918
  this.tripSwitch.open = false;
914
919
  }
915
920
  });
916
- if (this.tripType === tripType) {
917
- return;
918
- }
919
- if (this.tripTypeInit) {
920
- this.tripType = this.defaultTripType;
921
- }
922
- else {
923
- this.tripType = tripType;
924
- }
921
+ this.tripType = tripType;
925
922
  if (this.nasFormGroup && this.nasFormControlNameTripType) {
926
923
  const tripSwitchControl = this.nasFormGroup.get(this.nasFormControlNameTripType);
927
924
  tripSwitchControl.patchValue(this.tripType);
928
925
  }
929
- this.tripTypeInit = false;
930
926
  }
931
927
  onTransitChange(directOnly) {
932
928
  setTimeout(() => {
@@ -1047,11 +1043,11 @@ export class FilterComponent extends NasComponentBase {
1047
1043
  }
1048
1044
  }
1049
1045
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: FilterComponent, deps: [{ token: i1.DeviceHelper }, { token: i2.SortService }, { token: i3.AbandonedBasketService }, { token: i4.DateHelper }, { token: i0.ElementRef }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component }); }
1050
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.5", type: FilterComponent, selector: "nas-filter", inputs: { airportRelations: "airportRelations", ariaLabelClear: "ariaLabelClear", ariaLabelSubtract: "ariaLabelSubtract", ariaLabelBackdrop: "ariaLabelBackdrop", ariaLabelAdd: "ariaLabelAdd", allowedOriginAirports: "allowedOriginAirports", allowedDestinationAirports: "allowedDestinationAirports", displayLatestSearches: "displayLatestSearches", useSwitch: "useSwitch", displayClosestAirports: "displayClosestAirports", originAirportCode: "originAirportCode", destinationAirportCode: "destinationAirportCode", passengerSelectLabel: "passengerSelectLabel", maxPaxCount: "maxPaxCount", passengers: "passengers", minAdultCount: "minAdultCount", tripSwitchRoundTripLabel: "tripSwitchRoundTripLabel", tripSwitchOneWayLabel: "tripSwitchOneWayLabel", directOnlyLabel: "directOnlyLabel", directTransitLabel: "directTransitLabel", minimizeOnMobile: "minimizeOnMobile", expandedAccordionMobile: "expandedAccordionMobile", defaultSummarySeparator: "defaultSummarySeparator", lastSummarySeparator: "lastSummarySeparator", passengerSelectTitle: "passengerSelectTitle", passengerSelectAdultsLabel: "passengerSelectAdultsLabel", passengerSelectYouthsLabel: "passengerSelectYouthsLabel", passengerSelectYoungAdultsLabel: "passengerSelectYoungAdultsLabel", passengerSelectChildrenLabel: "passengerSelectChildrenLabel", passengerSelectInfantsLabel: "passengerSelectInfantsLabel", groupBookingLabel: "groupBookingLabel", allAirportsLabel: "allAirportsLabel", latestSearchesLabel: "latestSearchesLabel", closestAirportsLabel: "closestAirportsLabel", selectOriginFirstLabel: "selectOriginFirstLabel", labelOrigin: "labelOrigin", placeholderOrigin: "placeholderOrigin", labelDestination: "labelDestination", geolocationLabel: "geolocationLabel", geolocationBlockedLabel: "geolocationBlockedLabel", placeholderDestination: "placeholderDestination", keepSelection: "keepSelection", editSearchTitle: "editSearchTitle", nasFormGroup: "nasFormGroup", nasFormControlNameOrigin: "nasFormControlNameOrigin", nasFormControlNameDestination: "nasFormControlNameDestination", nasFormControlNameTripType: "nasFormControlNameTripType", nasFormControlNameDirectOnly: "nasFormControlNameDirectOnly", nasFormControlNameOutbound: "nasFormControlNameOutbound", nasFormControlNameInbound: "nasFormControlNameInbound", nasFormControlGroupBooking: "nasFormControlGroupBooking", overrideOrigin: "overrideOrigin", enableSuggestions: "enableSuggestions", closestAirports: "closestAirports", minimize: "minimize", airports: "airports", tripType: "tripType", directOnly: "directOnly", groupBookingLimit: "groupBookingLimit", ariaLabelPreviousMonth: "ariaLabelPreviousMonth", ariaLabelNextMonth: "ariaLabelNextMonth", noAvailableFlightsLabel: "noAvailableFlightsLabel", availableFlightsLabel: "availableFlightsLabel", disablePastSelection: "disablePastSelection", outboundLabel: "outboundLabel", inboundLabel: "inboundLabel", availability: "availability", outboundAvailableDates: "outboundAvailableDates", inboundAvailableDates: "inboundAvailableDates", times: "times", dateDisplayFormat: "dateDisplayFormat", timeDisplayFormat: "timeDisplayFormat", locale: "locale", compact: "compact", outboundDisabled: "outboundDisabled", inboundDisabled: "inboundDisabled", enableDatepickers: "enableDatepickers", minimizingLabel: "minimizingLabel", maximizingLabel: "maximizingLabel", directOnlyMobileLabel: "directOnlyMobileLabel", orLabel: "orLabel", passengersTitleLabel: "passengersTitleLabel", invalidDestinationText: "invalidDestinationText", outboundSelectedDate: "outboundSelectedDate", inboundSelectedDate: "inboundSelectedDate", enableDestinationSelect: "enableDestinationSelect", enablePassengersSelect: "enablePassengersSelect", enableTripSwitch: "enableTripSwitch", enableTransitSwitch: "enableTransitSwitch", datePickerComboInlineFlex: "datePickerComboInlineFlex", airportSelectOutboundId: "airportSelectOutboundId", airportSelectInboundId: "airportSelectInboundId", passengerSelectId: "passengerSelectId", datePickerOutboundId: "datePickerOutboundId", datePickerInboundId: "datePickerInboundId", tripTypeId: "tripTypeId", transitTypeId: "transitTypeId" }, outputs: { originOpenChange: "originOpenChange", destinationOpenChange: "destinationOpenChange", passengerSelectOpenChange: "passengerSelectOpenChange", originChange: "originChange", destinationChange: "destinationChange", passengersChange: "passengersChange", tripTypeChange: "tripTypeChange", directOnlyChange: "directOnlyChange", outboundSelectedDateChange: "outboundSelectedDateChange", inboundSelectedDateChange: "inboundSelectedDateChange", outboundOpenChange: "outboundOpenChange", inboundOpenChange: "inboundOpenChange", outboundMonthChange: "outboundMonthChange", inboundMonthChange: "inboundMonthChange", focusOnNextChange: "focusOnNextChange", positionChange: "positionChange" }, viewQueries: [{ propertyName: "passengerSelectDropdown", first: true, predicate: ["passengerSelectDropdown"], descendants: true }, { propertyName: "passengerSelect", first: true, predicate: ["passengerSelect"], descendants: true }, { propertyName: "tripSwitch", first: true, predicate: ["tripSwitch"], descendants: true }, { propertyName: "transitSwitch", first: true, predicate: ["transitSwitch"], descendants: true }, { propertyName: "airportSelect", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "datepickerCombo", first: true, predicate: ["datepickerCombo"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "tripTypeOneway", first: true, predicate: ["tripTypeOneway"], descendants: true }, { propertyName: "tripTypeRoundTrip", first: true, predicate: ["tripTypeRoundTrip"], descendants: true }, { propertyName: "transitTypeDirectOnly", first: true, predicate: ["transitTypeDirectOnly"], descendants: true }, { propertyName: "transitTypeTransit", first: true, predicate: ["transitTypeTransit"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\" simple\n containerOnToggle transparent [expanded]=\"expandedAccordionMobile\" [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\" *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}\n</div>\n\n<ng-template #filterTemplate>\n <div #container [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select *ngIf=\"airports && airportRelations && (enableDestinationSelect)\" #airportSelect combo\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\" \n [outboundId]=\"airportSelectOutboundId\" [inboundId]=\"airportSelectInboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\" [airports]=\"airports\" [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\" [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\" [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\" [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\" [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\" (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-airport-select *ngIf=\"airports && (!enableDestinationSelect)\" #airportSelect\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [outboundId]=\"airportSelectOutboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\" [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\" [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\" [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [nasClass]=\"getFilterClass('suggestions', !exists(enableDatepickers) && 'flex-end')\" [suggestions]=\"getSuggestions()\" [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <ng-container *ngIf=\"enablePassengersSelect\">\n <div [nasClass]=\"getClass('passengers')\">\n <button (click)=\"onPassengerSelectOpen($event)\" [id]=\"passengerSelectId\"\n [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\"\n [type]=\"'small'\"></nas-icon></div>\n </button>\n <div *ngIf=\"openPassengerSelect\" [nasClass]=\"getClass('passengers-selection')\">\n <nas-passenger-select [ariaLabelAdd]=\"ariaLabelAdd\" [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\" [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\" [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\" [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\" [title]=\"passengerSelectTitle\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\" [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\" (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openPassengerSelect\"></nas-backdrop>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTripSwitch\">\n <form [nasClass]=\"getClass('radio', !exists(enableDatepickers) && 'flex-end')\">\n <nas-radio #tripTypeRoundTrip [id]=\"tripTypeInputId + '__round-trip'\" [name]=\"'tripType'\" [value]=\"2\" (checkedChange)=\"onTripTypeChange(2)\" [checked]=\"defaultTripType === 2\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio>\n <nas-radio #tripTypeOneway [id]=\"tripTypeInputId + '__one-way'\" [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\" [checked]=\"defaultTripType === 1\">\n {{tripSwitchOneWayLabel}}\n </nas-radio>\n </form>\n </ng-container>\n <ng-container *ngIf=\"exists(enableDatepickers)\">\n <div [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo #datepickerCombo compact \n [outboundId]=\"datePickerOutboundId\" [inboundId]=\"datePickerInboundId\" [inlineFlex]=\"inlineFlex\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\" [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\" [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\" [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\" [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\" [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\" [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\" [times]=\"times\" [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\" [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\" (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\" (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\" [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\" [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTransitSwitch\">\n <div [nasClass]=\"getClass('transit-type')\">\n <nas-button *ngIf=\"directOnlyLabel && directTransitLabel\" #transitSwitch block light\n [id]=\"transitTypeInputId\" [iconType]=\"'chevron-down'\" [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type-selection')\">\n <button [id]=\"transitTypeInputId + '__direct'\" [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\" type=\"button\"\n #transitTypeDirectOnly (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button [id]=\"transitTypeInputId + '__transit'\" type=\"button\" #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openTransitTypeSelect\"></nas-backdrop>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter{position:relative;z-index:6}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light{border:2px solid #15273F}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:hover,.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:focus{background-color:#fff}.nas-filter ::ng-deep .nas-filter__transit .nas-button__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button__icon{transform:rotate(180deg)}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button{background-color:#ebf4ff!important;border:2px solid #15273F;z-index:5}.nas-filter__title{margin-top:24px;font-size:32px;line-height:40px}.nas-filter__radio{display:flex;gap:24px;padding:12px}.nas-filter__radio--flex-end{order:4!important}.nas-filter__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #15273F;padding:9px 14px;width:100%;height:67px}.nas-filter__passengers-button--active{background-color:#ebf4ff!important;position:relative;z-index:5}.nas-filter__label{flex-direction:column;text-align:left;display:flex;justify-content:center}.nas-filter__label p{margin:0}.nas-filter__button-title{font-weight:700;font-size:14px}.nas-filter__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter__transit-type-selection{z-index:4;position:absolute;width:100%;border-left:2px solid #15273F;border-right:2px solid #15273F;border-bottom:2px solid #15273F}.nas-filter__transit-type-selection button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter__transit-type-selection ::ng-deep .nas-backdrop{z-index:-1}.nas-filter__passengers{margin-top:8px}.nas-filter__filters:has(.nas-filter__radio--flex-end){display:flex;flex-direction:column}.nas-filter__filters .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--md .nas-filter__airport-select ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--md .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md .nas-filter__radio{order:0;width:100%;padding-left:0}.nas-filter__filters--md .nas-filter__date-combo{order:1;flex:1 1 48.5%}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--md .nas-filter__passengers{order:2;flex:1 1 24%;position:relative;height:68px;margin:0}.nas-filter__filters--md .nas-filter__passengers .nas-filter__passengers-button{height:68px}.nas-filter__filters--md .nas-filter__passengers .nas-filter__button-title{line-height:18px}.nas-filter__filters--md .nas-filter__transit-type{order:3;flex:1 1 24%;position:relative}.nas-filter__filters--md .nas-filter__transit-type ::ng-deep .nas-button{height:68px;margin:0}.nas-filter__filters--md:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--lg{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--lg .nas-filter__airport-select{order:0;flex:0 0 48%}.nas-filter__filters--lg .nas-filter__suggestions{order:8;flex:0 0 100%}.nas-filter__filters--lg .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--lg .nas-filter__suggestions--flex-end{margin-bottom:0;order:4}.nas-filter__filters--lg .nas-filter__passengers{order:2;margin-top:0;position:relative;flex:0 0 24.5%}.nas-filter__filters--lg .nas-filter__passengers .nas-filter__passengers-button{height:67px}.nas-filter__filters--lg .nas-filter__transit-type{order:3;flex:0 0 24.4%;position:relative}.nas-filter__filters--lg .nas-filter__transit-type ::ng-deep .nas-button{height:67px;margin:0}.nas-filter__filters--lg .nas-filter__date-combo{order:1;flex:0 0 49.5%}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--lg .nas-filter__radio{order:4;flex:0 0 49%;padding:9px 0 0}.nas-filter__filters--lg:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:46.5%;transform:rotate(90deg)}.nas-filter__filters--lg.nas-filter__filters--minimized .nas-filter__airport-select{order:0;flex:0 0 100%}.nas-filter__filters--lg.nas-filter__filters--minimized ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:48%;transform:rotate(90deg)}.nas-filter__filters--lg.nas-filter__filters--minimized .nas-filter__radio{order:0;flex:0 0 100%;padding:12px 0}.nas-filter__suggestions{flex-basis:100%;position:relative}.nas-filter__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter__toggler{font-family:NorwegianTextPro,Arial,Apercu,Helvetica Neue,Helvetica,sans-serif;font-weight:400;font-size:18px;line-height:24px;color:#15273f;margin-top:6px;z-index:1}.nas-filter__toggler .nas-filter__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter__toggler .nas-filter__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1;display:flex;flex-direction:column}.travel-details--lg{flex-direction:row;flex-wrap:wrap;flex:0 0 50%}.travel-details--lg .nas-filter__passengers{order:0;flex:1 1 auto;height:68px}.travel-details--lg .nas-filter__transit-type{order:0;flex:1 1 auto;position:relative}.travel-details--lg .nas-filter__transit-type ::ng-deep .nas-button{height:68px;margin:0}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #E9E7E4}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:24px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:24px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f1f1f1}.travel-details__action--border{border-bottom:2px #E9E7E4}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0;width:100%;border-bottom:3px solid #E9E7E4}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-filter__filters .nas-passenger-select__title{padding:8px 16px 0}::ng-deep .nas-filter__filters .nas-passenger-select__list{position:absolute!important;width:100%}::ng-deep .nas-filter__filters .nas-passenger-select__list-item{padding:8px 16px!important}::ng-deep .nas-filter__filters .nas-radio{margin:0!important}::ng-deep .nas-filter__filters .nas-button{margin-top:6px}::ng-deep .nas-filter__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important;position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker--compact{position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo--side-by-side .nas-datepicker-combo__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter__filters .nas-airport-select__input-line{border-top:none!important}::ng-deep .nas-filter__filters .nas-airport-select-combo__separator{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter__filters .nas-datepicker-combo__separator{display:none}::ng-deep .nas-filter__rotate{transform:rotate(180deg)}::ng-deep .nas-filter__rotate-enter,::ng-deep .nas-filter__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__input-line{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select-combo__separator{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results-wrapper{margin-top:0}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results{top:-3px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__icon{bottom:18px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select:after{display:none}::ng-deep .nas-filter__airport-select .nas-airport-select__input-line{display:none}::ng-deep .nas-filter__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter__origin-combined{border-bottom:3px solid #E9E7E4;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter__origin-combined{display:flex;flex:none}::ng-deep .nas-filter__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter__backdrop{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;color:transparent;background-color:#0b14202b;animation:passenger-backdrop .7s ease-out both}::ng-deep .nas-filter__passengers-selection{position:absolute;z-index:4;width:100%}::ng-deep .nas-filter__passengers-selection ::ng-deep .nas-backdrop{z-index:-1}@keyframes passenger-backdrop{0%{opacity:0}}::ng-deep .lower-z-index{z-index:1!important;position:relative}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.AirportSelectComponent, selector: "nas-airport-select", inputs: ["outboundId", "inboundId", "airports", "airportRelations", "latestSearchesOrigin", "latestSearchesDestination", "closestAirports", "allowedOriginAiports", "allowedDestinationAirports", "displayLatestSearches", "displayClosestAirports", "combo", "useSwitch", "allAirportsLabel", "latestSearchesLabel", "closestAirportsLabel", "geolocationLabel", "geolocationBlockedLabel", "selectOriginFirstLabel", "invalidDestinationText", "labelOrigin", "placeholderOrigin", "labelDestination", "placeholderDestination", "keepSelection", "nasFormControlNameOrigin", "nasFormControlNameDestination", "nasFormGroup", "originAirportCode", "destinationAirportCode", "ariaLabelClear", "ariaLabelBackdrop"], outputs: ["originChange", "originOpenChange", "destinationChange", "destinationOpenChange", "focusOnNext", "positionChange"] }, { kind: "component", type: i8.PassengerSelectComponent, selector: "nas-passenger-select", inputs: ["passengers", "maxPaxCount", "minAdultCount", "groupBookingLimit", "title", "adultsLabel", "childrenLabel", "infantsLabel", "youthsLabel", "youngAdultsLabel", "groupBookingLabel", "nasFormGroup", "nasFormControlGroupBooking", "ariaLabelSubtract", "ariaLabelAdd"], outputs: ["passengersChange", "focusOnNext", "focusOnPrevious"] }, { kind: "component", type: i9.AccordionComponent, selector: "nas-accordion", inputs: ["expanded", "title", "badge", "icon", "simple", "spaced", "small", "inverted", "containerOnToggle", "nopadding", "transparent", "approve", "primary", "warning", "badgeInfo", "badgeSuccess", "badgeWarning", "badgeError", "cssClass", "cssStyle"], outputs: ["toggleChange"] }, { kind: "component", type: i10.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i12.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange"] }, { kind: "component", type: i13.SuggestionsComponent, selector: "nas-suggestions", inputs: ["suggestions", "orLabel"], outputs: ["airportSelect"] }, { kind: "component", type: i14.DatepickerComboComponent, selector: "nas-datepicker-combo", inputs: ["outboundId", "inboundId", "ariaLabelBackdrop", "outboundOpen", "inboundOpen", "noAvailableFlightsLabel", "availableFlightsLabel", "disablePastSelection", "outboundDisabled", "inboundDisabled", "outboundOnly", "outboundLabel", "inboundLabel", "timepickerLabel", "availability", "outboundAvailableDates", "inboundAvailableDates", "times", "dateDisplayFormat", "timeDisplayFormat", "locale", "compact", "nasFormGroup", "nasFormControlNameOutbound", "nasFormControlNameInbound", "outboundSelectedDate", "inboundSelectedDate", "disableBackdrop", "outboundSelectedTime", "inboundSelectedTime", "ariaLabelPreviousMonth", "ariaLabelNextMonth", "inboundLowerLimitDateOffset", "inlineFlex"], outputs: ["outboundSelectedDateChange", "inboundSelectedDateChange", "outboundOpenChange", "inboundOpenChange", "outboundMonthChange", "inboundMonthChange", "focusOnNextChange", "focusOnPreviousChange"] }, { kind: "component", type: i15.RadioComponent, selector: "nas-radio", inputs: ["id", "value", "name", "error", "disabled", "strong", "block", "spaceless", "tabIndex", "required", "aria-label", "aria-describedby", "aria-labelledby", "checked", "nasFormControlName", "nasFormGroup"], outputs: ["checkedChange"] }, { kind: "component", type: i16.BackdropComponent, selector: "nas-backdrop", inputs: ["showBackdrop", "ariaLabelBackdrop"], outputs: ["showBackdropChange"] }] }); }
1046
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.1.5", type: FilterComponent, selector: "nas-filter", inputs: { airportRelations: "airportRelations", ariaLabelClear: "ariaLabelClear", ariaLabelSubtract: "ariaLabelSubtract", ariaLabelBackdrop: "ariaLabelBackdrop", ariaLabelAdd: "ariaLabelAdd", allowedOriginAirports: "allowedOriginAirports", allowedDestinationAirports: "allowedDestinationAirports", displayLatestSearches: "displayLatestSearches", useSwitch: "useSwitch", displayClosestAirports: "displayClosestAirports", originAirportCode: "originAirportCode", destinationAirportCode: "destinationAirportCode", passengerSelectLabel: "passengerSelectLabel", maxPaxCount: "maxPaxCount", passengers: "passengers", minAdultCount: "minAdultCount", tripSwitchRoundTripLabel: "tripSwitchRoundTripLabel", tripSwitchOneWayLabel: "tripSwitchOneWayLabel", directOnlyLabel: "directOnlyLabel", directTransitLabel: "directTransitLabel", minimizeOnMobile: "minimizeOnMobile", inlineOnDesktop: "inlineOnDesktop", expandedAccordionMobile: "expandedAccordionMobile", defaultSummarySeparator: "defaultSummarySeparator", lastSummarySeparator: "lastSummarySeparator", passengerSelectTitle: "passengerSelectTitle", passengerSelectAdultsLabel: "passengerSelectAdultsLabel", passengerSelectYouthsLabel: "passengerSelectYouthsLabel", passengerSelectYoungAdultsLabel: "passengerSelectYoungAdultsLabel", passengerSelectChildrenLabel: "passengerSelectChildrenLabel", passengerSelectInfantsLabel: "passengerSelectInfantsLabel", groupBookingLabel: "groupBookingLabel", allAirportsLabel: "allAirportsLabel", latestSearchesLabel: "latestSearchesLabel", closestAirportsLabel: "closestAirportsLabel", selectOriginFirstLabel: "selectOriginFirstLabel", labelOrigin: "labelOrigin", placeholderOrigin: "placeholderOrigin", labelDestination: "labelDestination", geolocationLabel: "geolocationLabel", geolocationBlockedLabel: "geolocationBlockedLabel", placeholderDestination: "placeholderDestination", keepSelection: "keepSelection", editSearchTitle: "editSearchTitle", nasFormGroup: "nasFormGroup", nasFormControlNameOrigin: "nasFormControlNameOrigin", nasFormControlNameDestination: "nasFormControlNameDestination", nasFormControlNameTripType: "nasFormControlNameTripType", nasFormControlNameDirectOnly: "nasFormControlNameDirectOnly", nasFormControlNameOutbound: "nasFormControlNameOutbound", nasFormControlNameInbound: "nasFormControlNameInbound", nasFormControlGroupBooking: "nasFormControlGroupBooking", overrideOrigin: "overrideOrigin", enableSuggestions: "enableSuggestions", closestAirports: "closestAirports", minimize: "minimize", airports: "airports", tripType: "tripType", directOnly: "directOnly", groupBookingLimit: "groupBookingLimit", ariaLabelPreviousMonth: "ariaLabelPreviousMonth", ariaLabelNextMonth: "ariaLabelNextMonth", noAvailableFlightsLabel: "noAvailableFlightsLabel", availableFlightsLabel: "availableFlightsLabel", disablePastSelection: "disablePastSelection", outboundLabel: "outboundLabel", inboundLabel: "inboundLabel", availability: "availability", outboundAvailableDates: "outboundAvailableDates", inboundAvailableDates: "inboundAvailableDates", times: "times", dateDisplayFormat: "dateDisplayFormat", timeDisplayFormat: "timeDisplayFormat", locale: "locale", compact: "compact", outboundDisabled: "outboundDisabled", inboundDisabled: "inboundDisabled", enableDatepickers: "enableDatepickers", minimizingLabel: "minimizingLabel", maximizingLabel: "maximizingLabel", directOnlyMobileLabel: "directOnlyMobileLabel", orLabel: "orLabel", passengersTitleLabel: "passengersTitleLabel", invalidDestinationText: "invalidDestinationText", outboundSelectedDate: "outboundSelectedDate", inboundSelectedDate: "inboundSelectedDate", enableDestinationSelect: "enableDestinationSelect", enablePassengersSelect: "enablePassengersSelect", enableTripSwitch: "enableTripSwitch", enableTransitSwitch: "enableTransitSwitch", datePickerComboInlineFlex: "datePickerComboInlineFlex", airportSelectOutboundId: "airportSelectOutboundId", airportSelectInboundId: "airportSelectInboundId", passengerSelectId: "passengerSelectId", datePickerOutboundId: "datePickerOutboundId", datePickerInboundId: "datePickerInboundId", tripTypeId: "tripTypeId", transitTypeId: "transitTypeId" }, outputs: { originOpenChange: "originOpenChange", destinationOpenChange: "destinationOpenChange", passengerSelectOpenChange: "passengerSelectOpenChange", originChange: "originChange", destinationChange: "destinationChange", passengersChange: "passengersChange", tripTypeChange: "tripTypeChange", directOnlyChange: "directOnlyChange", outboundSelectedDateChange: "outboundSelectedDateChange", inboundSelectedDateChange: "inboundSelectedDateChange", outboundOpenChange: "outboundOpenChange", inboundOpenChange: "inboundOpenChange", outboundMonthChange: "outboundMonthChange", inboundMonthChange: "inboundMonthChange", focusOnNextChange: "focusOnNextChange", positionChange: "positionChange" }, viewQueries: [{ propertyName: "passengerSelectDropdown", first: true, predicate: ["passengerSelectDropdown"], descendants: true }, { propertyName: "passengerSelect", first: true, predicate: ["passengerSelect"], descendants: true }, { propertyName: "tripSwitch", first: true, predicate: ["tripSwitch"], descendants: true }, { propertyName: "transitSwitch", first: true, predicate: ["transitSwitch"], descendants: true }, { propertyName: "airportSelect", first: true, predicate: ["airportSelect"], descendants: true }, { propertyName: "datepickerCombo", first: true, predicate: ["datepickerCombo"], descendants: true }, { propertyName: "container", first: true, predicate: ["container"], descendants: true }, { propertyName: "tripTypeOneway", first: true, predicate: ["tripTypeOneway"], descendants: true }, { propertyName: "tripTypeRoundTrip", first: true, predicate: ["tripTypeRoundTrip"], descendants: true }, { propertyName: "transitTypeDirectOnly", first: true, predicate: ["transitTypeDirectOnly"], descendants: true }, { propertyName: "transitTypeTransit", first: true, predicate: ["transitTypeTransit"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\" simple\n containerOnToggle transparent [expanded]=\"expandedAccordionMobile\" [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\" *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}\n</div>\n\n<ng-template #filterTemplate>\n <div #container [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized', exists(inlineOnDesktop) && 'inline'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select *ngIf=\"airports && airportRelations && (enableDestinationSelect)\" #airportSelect combo\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\" \n [outboundId]=\"airportSelectOutboundId\" [inboundId]=\"airportSelectInboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\" [airports]=\"airports\" [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\" [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\" [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\" [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\" [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\" (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-airport-select *ngIf=\"airports && (!enableDestinationSelect)\" #airportSelect\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [outboundId]=\"airportSelectOutboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\" [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\" [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\" [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [nasClass]=\"getFilterClass('suggestions', !exists(enableDatepickers) && 'flex-end')\" [suggestions]=\"getSuggestions()\" [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <form *ngIf=\"enableTripSwitch\" [nasClass]=\"getClass('radio', !exists(enableDatepickers) && 'flex-end')\">\n <nas-radio #tripTypeRoundTrip [id]=\"tripTypeInputId + '__round-trip'\" [name]=\"'tripType'\" [value]=\"2\" (checkedChange)=\"onTripTypeChange(2)\" [checked]=\"tripType === 2\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio>\n <nas-radio #tripTypeOneway [id]=\"tripTypeInputId + '__one-way'\" [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\" [checked]=\"tripType === 1\">\n {{tripSwitchOneWayLabel}}\n </nas-radio>\n </form>\n <div *ngIf=\"exists(enableDatepickers)\" [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo #datepickerCombo compact \n [outboundId]=\"datePickerOutboundId\" [inboundId]=\"datePickerInboundId\" [inlineFlex]=\"inlineFlex\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\" [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\" [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\" [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\" [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\" [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\" [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\" [times]=\"times\" [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\" [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\" (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\" (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\" [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\" [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo>\n </div>\n <div *ngIf=\"enablePassengersSelect || enableTransitSwitch\" [nasClass]=\"getClass('dropdown-wrapper')\">\n <div *ngIf=\"enablePassengersSelect\" [nasClass]=\"getClass('passengers')\">\n <button (click)=\"onPassengerSelectOpen($event)\" [id]=\"passengerSelectId\"\n [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\"\n [type]=\"'small'\"></nas-icon></div>\n </button>\n <div *ngIf=\"openPassengerSelect\" [nasClass]=\"getClass('passengers-selection')\">\n <nas-passenger-select [ariaLabelAdd]=\"ariaLabelAdd\" [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\" [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\" [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\" [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\" [title]=\"passengerSelectTitle\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\" [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\" (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openPassengerSelect\"></nas-backdrop>\n </div>\n </div>\n <div *ngIf=\"enableTransitSwitch\" [nasClass]=\"getClass('transit-type')\">\n <nas-button *ngIf=\"directOnlyLabel && directTransitLabel\" #transitSwitch block light\n [id]=\"transitTypeInputId\" [iconType]=\"'chevron-down'\" [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type-selection')\">\n <button [id]=\"transitTypeInputId + '__direct'\" [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\" type=\"button\"\n #transitTypeDirectOnly (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button [id]=\"transitTypeInputId + '__transit'\" type=\"button\" #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openTransitTypeSelect\"></nas-backdrop>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter{position:relative;z-index:6}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light{border:2px solid #15273F}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:hover,.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:focus{background-color:#fff}.nas-filter ::ng-deep .nas-filter__transit .nas-button__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button__icon{transform:rotate(180deg)}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button{background-color:#ebf4ff!important;border:2px solid #15273F;z-index:5}.nas-filter__title{margin-top:24px;font-size:32px;line-height:40px}.nas-filter__radio{display:flex;gap:24px;padding:12px}.nas-filter__radio--flex-end{order:4!important}.nas-filter__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #15273F;padding:9px 14px;width:100%;height:67px}.nas-filter__passengers-button--active{background-color:#ebf4ff!important;position:relative;z-index:5}.nas-filter__label{flex-direction:column;text-align:left;display:flex;justify-content:center}.nas-filter__label p{margin:0}.nas-filter__button-title{font-weight:700;font-size:14px}.nas-filter__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter__transit-type-selection{z-index:4;position:absolute;width:100%;border-left:2px solid #15273F;border-right:2px solid #15273F;border-bottom:2px solid #15273F}.nas-filter__transit-type-selection button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter__transit-type-selection ::ng-deep .nas-backdrop{z-index:-1}.nas-filter__passengers{margin-top:8px}.nas-filter__filters:has(.nas-filter__radio--flex-end){display:flex;flex-direction:column}.nas-filter__filters .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md,.nas-filter__filters--lg{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--md .nas-filter__airport-select,.nas-filter__filters--lg .nas-filter__airport-select{flex:0 0 100%}.nas-filter__filters--md .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher,.nas-filter__filters--lg .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:48%;transform:rotate(90deg)}.nas-filter__filters--md .nas-filter__suggestions,.nas-filter__filters--lg .nas-filter__suggestions{flex:0 0 100%}.nas-filter__filters--md .nas-filter__suggestions ::ng-deep .nas-suggestions,.nas-filter__filters--lg .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md .nas-filter__suggestions--flex-end,.nas-filter__filters--lg .nas-filter__suggestions--flex-end{margin-bottom:0}.nas-filter__filters--md .nas-filter__dropdown-wrapper,.nas-filter__filters--lg .nas-filter__dropdown-wrapper{display:flex;gap:8px;flex:1 1 49%}.nas-filter__filters--md .nas-filter__passengers,.nas-filter__filters--lg .nas-filter__passengers{margin-top:0;position:relative;flex:1 1 24.5%}.nas-filter__filters--md .nas-filter__passengers .nas-filter__passengers-button,.nas-filter__filters--lg .nas-filter__passengers .nas-filter__passengers-button{height:67px}.nas-filter__filters--md .nas-filter__transit-type,.nas-filter__filters--lg .nas-filter__transit-type{flex:1 1 24.4%;position:relative}.nas-filter__filters--md .nas-filter__transit-type ::ng-deep .nas-button,.nas-filter__filters--lg .nas-filter__transit-type ::ng-deep .nas-button{height:67px;margin:0}.nas-filter__filters--md .nas-filter__date-combo,.nas-filter__filters--lg .nas-filter__date-combo{flex:1 1 49%}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--md .nas-filter__radio,.nas-filter__filters--lg .nas-filter__radio{flex:0 0 100%;padding:9px 0}.nas-filter__filters--md:has(.nas-filter__radio--flex-end),.nas-filter__filters--lg:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--md ::ng-deep .nas-airport-select-combo,.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--md ::ng-deep .nas-airport-select-combo__switcher,.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:46.5%;transform:rotate(90deg)}.nas-filter__filters--md .nas-filter__passengers ::ng-deep .nas-passenger-select__list{width:100%;min-width:250px}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__airport-select{order:0;flex:1}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher{left:46%}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__date-combo,.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__dropdown-wrapper{order:0;flex:1}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__radio{order:1;flex:1 1 100%}.nas-filter__suggestions{flex-basis:100%;position:relative}.nas-filter__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter__toggler{font-family:NorwegianTextPro,Arial,Apercu,Helvetica Neue,Helvetica,sans-serif;font-weight:400;font-size:18px;line-height:24px;color:#15273f;margin-top:6px;z-index:1}.nas-filter__toggler .nas-filter__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter__toggler .nas-filter__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1;display:flex;flex-direction:column}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #E9E7E4}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:24px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:24px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f1f1f1}.travel-details__action--border{border-bottom:2px #E9E7E4}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0;width:100%;border-bottom:3px solid #E9E7E4}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-filter__filters .nas-passenger-select__title{padding:8px 16px 0}::ng-deep .nas-filter__filters .nas-passenger-select__list{position:absolute!important;width:100%}::ng-deep .nas-filter__filters .nas-passenger-select__list-item{padding:8px 16px!important}::ng-deep .nas-filter__filters .nas-radio{margin:0!important}::ng-deep .nas-filter__filters .nas-button{margin-top:6px}::ng-deep .nas-filter__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important;position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker--compact{position:unset;margin-bottom:0}::ng-deep .nas-filter__filters .nas-filter__date-combo--side-by-side .nas-datepicker-combo__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter__filters .nas-airport-select__input-line{border-top:none!important}::ng-deep .nas-filter__filters .nas-airport-select-combo__separator{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter__filters .nas-datepicker-combo__separator{display:none}::ng-deep .nas-filter__rotate{transform:rotate(180deg)}::ng-deep .nas-filter__rotate-enter,::ng-deep .nas-filter__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__input-line{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select-combo__separator{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results-wrapper{margin-top:0}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results{top:-3px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__icon{bottom:18px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select:after{display:none}::ng-deep .nas-filter__airport-select .nas-airport-select__input-line{display:none}::ng-deep .nas-filter__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter__origin-combined{border-bottom:3px solid #E9E7E4;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter__origin-combined{display:flex;flex:none}::ng-deep .nas-filter__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter__backdrop{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;color:transparent;background-color:#0b14202b;animation:passenger-backdrop .7s ease-out both}::ng-deep .nas-filter__passengers-selection{position:absolute;z-index:4;width:100%}::ng-deep .nas-filter__passengers-selection ::ng-deep .nas-backdrop{z-index:-1}@keyframes passenger-backdrop{0%{opacity:0}}::ng-deep .lower-z-index{z-index:1!important;position:relative}\n"], dependencies: [{ kind: "directive", type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i5.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i6.NasClassDirective, selector: "[nasClass]", inputs: ["nasClass", "attr.class"] }, { kind: "component", type: i7.AirportSelectComponent, selector: "nas-airport-select", inputs: ["outboundId", "inboundId", "airports", "airportRelations", "latestSearchesOrigin", "latestSearchesDestination", "closestAirports", "allowedOriginAiports", "allowedDestinationAirports", "displayLatestSearches", "displayClosestAirports", "combo", "useSwitch", "allAirportsLabel", "latestSearchesLabel", "closestAirportsLabel", "geolocationLabel", "geolocationBlockedLabel", "selectOriginFirstLabel", "invalidDestinationText", "labelOrigin", "placeholderOrigin", "labelDestination", "placeholderDestination", "keepSelection", "nasFormControlNameOrigin", "nasFormControlNameDestination", "nasFormGroup", "originAirportCode", "destinationAirportCode", "ariaLabelClear", "ariaLabelBackdrop"], outputs: ["originChange", "originOpenChange", "destinationChange", "destinationOpenChange", "focusOnNext", "positionChange"] }, { kind: "component", type: i8.PassengerSelectComponent, selector: "nas-passenger-select", inputs: ["passengers", "maxPaxCount", "minAdultCount", "groupBookingLimit", "title", "adultsLabel", "childrenLabel", "infantsLabel", "youthsLabel", "youngAdultsLabel", "groupBookingLabel", "nasFormGroup", "nasFormControlGroupBooking", "ariaLabelSubtract", "ariaLabelAdd"], outputs: ["passengersChange", "focusOnNext", "focusOnPrevious"] }, { kind: "component", type: i9.AccordionComponent, selector: "nas-accordion", inputs: ["expanded", "title", "badge", "icon", "simple", "spaced", "small", "inverted", "containerOnToggle", "nopadding", "transparent", "approve", "primary", "warning", "badgeInfo", "badgeSuccess", "badgeWarning", "badgeError", "cssClass", "cssStyle"], outputs: ["toggleChange"] }, { kind: "component", type: i10.IconComponent, selector: "nas-icon", inputs: ["icon", "type", "isIndicator", "lightCircularBackground", "cssClass"] }, { kind: "directive", type: i11.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i11.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "component", type: i12.ButtonComponent, selector: "nas-button", inputs: ["primary", "secondary", "link", "light", "large", "block", "flex", "compact", "right", "spaceless", "href", "trackingvalue", "canContinueOnDisabled", "disabled", "type", "cssClass", "ariaLabel", "cssStyle", "tabindex", "overrideBaseCssClass", "useRouterLink", "id", "target", "icon", "iconLeft", "iconType", "buttonlink"], outputs: ["clickChange"] }, { kind: "component", type: i13.SuggestionsComponent, selector: "nas-suggestions", inputs: ["suggestions", "orLabel"], outputs: ["airportSelect"] }, { kind: "component", type: i14.DatepickerComboComponent, selector: "nas-datepicker-combo", inputs: ["outboundId", "inboundId", "ariaLabelBackdrop", "outboundOpen", "inboundOpen", "noAvailableFlightsLabel", "availableFlightsLabel", "disablePastSelection", "outboundDisabled", "inboundDisabled", "outboundOnly", "outboundLabel", "inboundLabel", "timepickerLabel", "availability", "outboundAvailableDates", "inboundAvailableDates", "times", "dateDisplayFormat", "timeDisplayFormat", "locale", "compact", "nasFormGroup", "nasFormControlNameOutbound", "nasFormControlNameInbound", "outboundSelectedDate", "inboundSelectedDate", "disableBackdrop", "outboundSelectedTime", "inboundSelectedTime", "ariaLabelPreviousMonth", "ariaLabelNextMonth", "inboundLowerLimitDateOffset", "inlineFlex"], outputs: ["outboundSelectedDateChange", "inboundSelectedDateChange", "outboundOpenChange", "inboundOpenChange", "outboundMonthChange", "inboundMonthChange", "focusOnNextChange", "focusOnPreviousChange"] }, { kind: "component", type: i15.RadioComponent, selector: "nas-radio", inputs: ["id", "value", "name", "error", "disabled", "strong", "block", "spaceless", "tabIndex", "required", "aria-label", "aria-describedby", "aria-labelledby", "checked", "nasFormControlName", "nasFormGroup"], outputs: ["checkedChange"] }, { kind: "component", type: i16.BackdropComponent, selector: "nas-backdrop", inputs: ["showBackdrop", "ariaLabelBackdrop"], outputs: ["showBackdropChange"] }] }); }
1051
1047
  }
1052
1048
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImport: i0, type: FilterComponent, decorators: [{
1053
1049
  type: Component,
1054
- args: [{ selector: 'nas-filter', template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\" simple\n containerOnToggle transparent [expanded]=\"expandedAccordionMobile\" [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\" *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}\n</div>\n\n<ng-template #filterTemplate>\n <div #container [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select *ngIf=\"airports && airportRelations && (enableDestinationSelect)\" #airportSelect combo\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\" \n [outboundId]=\"airportSelectOutboundId\" [inboundId]=\"airportSelectInboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\" [airports]=\"airports\" [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\" [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\" [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\" [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\" [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\" (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-airport-select *ngIf=\"airports && (!enableDestinationSelect)\" #airportSelect\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [outboundId]=\"airportSelectOutboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\" [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\" [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\" [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [nasClass]=\"getFilterClass('suggestions', !exists(enableDatepickers) && 'flex-end')\" [suggestions]=\"getSuggestions()\" [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <ng-container *ngIf=\"enablePassengersSelect\">\n <div [nasClass]=\"getClass('passengers')\">\n <button (click)=\"onPassengerSelectOpen($event)\" [id]=\"passengerSelectId\"\n [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\"\n [type]=\"'small'\"></nas-icon></div>\n </button>\n <div *ngIf=\"openPassengerSelect\" [nasClass]=\"getClass('passengers-selection')\">\n <nas-passenger-select [ariaLabelAdd]=\"ariaLabelAdd\" [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\" [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\" [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\" [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\" [title]=\"passengerSelectTitle\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\" [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\" (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openPassengerSelect\"></nas-backdrop>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTripSwitch\">\n <form [nasClass]=\"getClass('radio', !exists(enableDatepickers) && 'flex-end')\">\n <nas-radio #tripTypeRoundTrip [id]=\"tripTypeInputId + '__round-trip'\" [name]=\"'tripType'\" [value]=\"2\" (checkedChange)=\"onTripTypeChange(2)\" [checked]=\"defaultTripType === 2\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio>\n <nas-radio #tripTypeOneway [id]=\"tripTypeInputId + '__one-way'\" [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\" [checked]=\"defaultTripType === 1\">\n {{tripSwitchOneWayLabel}}\n </nas-radio>\n </form>\n </ng-container>\n <ng-container *ngIf=\"exists(enableDatepickers)\">\n <div [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo #datepickerCombo compact \n [outboundId]=\"datePickerOutboundId\" [inboundId]=\"datePickerInboundId\" [inlineFlex]=\"inlineFlex\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\" [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\" [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\" [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\" [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\" [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\" [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\" [times]=\"times\" [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\" [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\" (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\" (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\" [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\" [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo>\n </div>\n </ng-container>\n <ng-container *ngIf=\"enableTransitSwitch\">\n <div [nasClass]=\"getClass('transit-type')\">\n <nas-button *ngIf=\"directOnlyLabel && directTransitLabel\" #transitSwitch block light\n [id]=\"transitTypeInputId\" [iconType]=\"'chevron-down'\" [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type-selection')\">\n <button [id]=\"transitTypeInputId + '__direct'\" [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\" type=\"button\"\n #transitTypeDirectOnly (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button [id]=\"transitTypeInputId + '__transit'\" type=\"button\" #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openTransitTypeSelect\"></nas-backdrop>\n </div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter{position:relative;z-index:6}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light{border:2px solid #15273F}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:hover,.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:focus{background-color:#fff}.nas-filter ::ng-deep .nas-filter__transit .nas-button__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button__icon{transform:rotate(180deg)}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button{background-color:#ebf4ff!important;border:2px solid #15273F;z-index:5}.nas-filter__title{margin-top:24px;font-size:32px;line-height:40px}.nas-filter__radio{display:flex;gap:24px;padding:12px}.nas-filter__radio--flex-end{order:4!important}.nas-filter__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #15273F;padding:9px 14px;width:100%;height:67px}.nas-filter__passengers-button--active{background-color:#ebf4ff!important;position:relative;z-index:5}.nas-filter__label{flex-direction:column;text-align:left;display:flex;justify-content:center}.nas-filter__label p{margin:0}.nas-filter__button-title{font-weight:700;font-size:14px}.nas-filter__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter__transit-type-selection{z-index:4;position:absolute;width:100%;border-left:2px solid #15273F;border-right:2px solid #15273F;border-bottom:2px solid #15273F}.nas-filter__transit-type-selection button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter__transit-type-selection ::ng-deep .nas-backdrop{z-index:-1}.nas-filter__passengers{margin-top:8px}.nas-filter__filters:has(.nas-filter__radio--flex-end){display:flex;flex-direction:column}.nas-filter__filters .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--md .nas-filter__airport-select ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--md .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md .nas-filter__radio{order:0;width:100%;padding-left:0}.nas-filter__filters--md .nas-filter__date-combo{order:1;flex:1 1 48.5%}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--md .nas-filter__passengers{order:2;flex:1 1 24%;position:relative;height:68px;margin:0}.nas-filter__filters--md .nas-filter__passengers .nas-filter__passengers-button{height:68px}.nas-filter__filters--md .nas-filter__passengers .nas-filter__button-title{line-height:18px}.nas-filter__filters--md .nas-filter__transit-type{order:3;flex:1 1 24%;position:relative}.nas-filter__filters--md .nas-filter__transit-type ::ng-deep .nas-button{height:68px;margin:0}.nas-filter__filters--md:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--lg{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--lg .nas-filter__airport-select{order:0;flex:0 0 48%}.nas-filter__filters--lg .nas-filter__suggestions{order:8;flex:0 0 100%}.nas-filter__filters--lg .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--lg .nas-filter__suggestions--flex-end{margin-bottom:0;order:4}.nas-filter__filters--lg .nas-filter__passengers{order:2;margin-top:0;position:relative;flex:0 0 24.5%}.nas-filter__filters--lg .nas-filter__passengers .nas-filter__passengers-button{height:67px}.nas-filter__filters--lg .nas-filter__transit-type{order:3;flex:0 0 24.4%;position:relative}.nas-filter__filters--lg .nas-filter__transit-type ::ng-deep .nas-button{height:67px;margin:0}.nas-filter__filters--lg .nas-filter__date-combo{order:1;flex:0 0 49.5%}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--lg .nas-filter__radio{order:4;flex:0 0 49%;padding:9px 0 0}.nas-filter__filters--lg:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:46.5%;transform:rotate(90deg)}.nas-filter__filters--lg.nas-filter__filters--minimized .nas-filter__airport-select{order:0;flex:0 0 100%}.nas-filter__filters--lg.nas-filter__filters--minimized ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:48%;transform:rotate(90deg)}.nas-filter__filters--lg.nas-filter__filters--minimized .nas-filter__radio{order:0;flex:0 0 100%;padding:12px 0}.nas-filter__suggestions{flex-basis:100%;position:relative}.nas-filter__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter__toggler{font-family:NorwegianTextPro,Arial,Apercu,Helvetica Neue,Helvetica,sans-serif;font-weight:400;font-size:18px;line-height:24px;color:#15273f;margin-top:6px;z-index:1}.nas-filter__toggler .nas-filter__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter__toggler .nas-filter__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1;display:flex;flex-direction:column}.travel-details--lg{flex-direction:row;flex-wrap:wrap;flex:0 0 50%}.travel-details--lg .nas-filter__passengers{order:0;flex:1 1 auto;height:68px}.travel-details--lg .nas-filter__transit-type{order:0;flex:1 1 auto;position:relative}.travel-details--lg .nas-filter__transit-type ::ng-deep .nas-button{height:68px;margin:0}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #E9E7E4}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:24px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:24px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f1f1f1}.travel-details__action--border{border-bottom:2px #E9E7E4}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0;width:100%;border-bottom:3px solid #E9E7E4}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-filter__filters .nas-passenger-select__title{padding:8px 16px 0}::ng-deep .nas-filter__filters .nas-passenger-select__list{position:absolute!important;width:100%}::ng-deep .nas-filter__filters .nas-passenger-select__list-item{padding:8px 16px!important}::ng-deep .nas-filter__filters .nas-radio{margin:0!important}::ng-deep .nas-filter__filters .nas-button{margin-top:6px}::ng-deep .nas-filter__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important;position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker--compact{position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo--side-by-side .nas-datepicker-combo__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter__filters .nas-airport-select__input-line{border-top:none!important}::ng-deep .nas-filter__filters .nas-airport-select-combo__separator{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter__filters .nas-datepicker-combo__separator{display:none}::ng-deep .nas-filter__rotate{transform:rotate(180deg)}::ng-deep .nas-filter__rotate-enter,::ng-deep .nas-filter__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__input-line{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select-combo__separator{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results-wrapper{margin-top:0}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results{top:-3px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__icon{bottom:18px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select:after{display:none}::ng-deep .nas-filter__airport-select .nas-airport-select__input-line{display:none}::ng-deep .nas-filter__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter__origin-combined{border-bottom:3px solid #E9E7E4;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter__origin-combined{display:flex;flex:none}::ng-deep .nas-filter__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter__backdrop{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;color:transparent;background-color:#0b14202b;animation:passenger-backdrop .7s ease-out both}::ng-deep .nas-filter__passengers-selection{position:absolute;z-index:4;width:100%}::ng-deep .nas-filter__passengers-selection ::ng-deep .nas-backdrop{z-index:-1}@keyframes passenger-backdrop{0%{opacity:0}}::ng-deep .lower-z-index{z-index:1!important;position:relative}\n"] }]
1050
+ args: [{ selector: 'nas-filter', template: "<nas-accordion *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile); else filterTemplate\" simple\n containerOnToggle transparent [expanded]=\"expandedAccordionMobile\" [title]=\"editSearchTitle\"\n (toggleChange)=\"onAccordionToggleChange($event)\">\n <ng-container *ngTemplateOutlet=\"filterTemplate\"></ng-container>\n</nas-accordion>\n<div class=\"container\" *ngIf=\"deviceHelper?.isMobile() && exists(minimizeOnMobile) && displaySummary\">{{getSummary()}}\n</div>\n\n<ng-template #filterTemplate>\n <div #container [nasClass]=\"getContainerClass()\">\n <div [nasClass]=\"getFilterClass('filters', [exists(minimize) && 'minimized', exists(inlineOnDesktop) && 'inline'])\">\n <ng-container *ngIf=\"airports?.length > 0\">\n <nas-airport-select *ngIf=\"airports && airportRelations && (enableDestinationSelect)\" #airportSelect combo\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\" \n [outboundId]=\"airportSelectOutboundId\" [inboundId]=\"airportSelectInboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\"\n [nasFormControlNameDestination]=\"nasFormControlNameDestination\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getAirportSelectClass()\" [airports]=\"airports\" [allowedOriginAiports]=\"allowedOriginAirports\"\n [allowedDestinationAirports]=\"allowedDestinationAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [latestSearchesDestination]=\"latestSearchesDestination\"\n [displayLatestSearches]=\"displayLatestSearches\" [displayClosestAirports]=\"displayClosestAirports\"\n [originAirportCode]=\"originAirportCode\" [destinationAirportCode]=\"destinationAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [labelDestination]=\"labelDestination\"\n [geolocationLabel]=\"geolocationLabel\" [geolocationBlockedLabel]=\"geolocationBlockedLabel\"\n [placeholderDestination]=\"placeholderDestination\" [keepSelection]=\"keepSelection\"\n [invalidDestinationText]=\"invalidDestinationText\" (originChange)=\"setSelectedOriginAirport($event)\"\n (destinationChange)=\"onDestinationChange($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (destinationOpenChange)=\"onDestinationOpen($event)\"\n (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-airport-select *ngIf=\"airports && (!enableDestinationSelect)\" #airportSelect\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [outboundId]=\"airportSelectOutboundId\" [ariaLabelClear]=\"ariaLabelClear\" [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOrigin]=\"nasFormControlNameOrigin\" [useSwitch]=\"useSwitch\"\n [nasClass]=\"getClass('airport-origin-select')\" [airports]=\"airports\"\n [allowedOriginAiports]=\"allowedOriginAirports\" [airportRelations]=\"airportRelations\"\n [latestSearchesOrigin]=\"latestSearchesOrigin\" [displayLatestSearches]=\"displayLatestSearches\"\n [displayClosestAirports]=\"displayClosestAirports\" [originAirportCode]=\"originAirportCode\"\n [allAirportsLabel]=\"allAirportsLabel\" [latestSearchesLabel]=\"latestSearchesLabel\"\n [closestAirportsLabel]=\"closestAirportsLabel\" [closestAirports]=\"closestAirports\"\n [selectOriginFirstLabel]=\"selectOriginFirstLabel\" [labelOrigin]=\"labelOrigin\"\n [placeholderOrigin]=\"placeholderOrigin\" [geolocationLabel]=\"geolocationLabel\"\n [geolocationBlockedLabel]=\"geolocationBlockedLabel\" [keepSelection]=\"keepSelection\"\n (originChange)=\"setSelectedOriginAirport($event)\" (focusOnNext)=\"setFocusOnPassengerSelect($event)\"\n (originOpenChange)=\"onOriginOpen($event)\" (positionChange)=\"getClosestAirports($event)\"></nas-airport-select>\n <nas-suggestions *ngIf=\"(closestAirports || latestSearchesOrigin) && exists(enableSuggestions)\"\n [ngClass]=\"{ 'lower-z-index': openPassengerSelect || inboundOpen || outboundOpen }\"\n [nasClass]=\"getFilterClass('suggestions', !exists(enableDatepickers) && 'flex-end')\" [suggestions]=\"getSuggestions()\" [orLabel]=\"orLabel\"\n (airportSelect)=\"setSelectedOriginAirport($event)\"></nas-suggestions>\n </ng-container>\n <ng-container *ngIf=\"shouldMaximize()\">\n <form *ngIf=\"enableTripSwitch\" [nasClass]=\"getClass('radio', !exists(enableDatepickers) && 'flex-end')\">\n <nas-radio #tripTypeRoundTrip [id]=\"tripTypeInputId + '__round-trip'\" [name]=\"'tripType'\" [value]=\"2\" (checkedChange)=\"onTripTypeChange(2)\" [checked]=\"tripType === 2\">\n {{tripSwitchRoundTripLabel}}\n </nas-radio>\n <nas-radio #tripTypeOneway [id]=\"tripTypeInputId + '__one-way'\" [name]=\"'tripType'\" [value]=\"1\" (checkedChange)=\"onTripTypeChange(1)\" [checked]=\"tripType === 1\">\n {{tripSwitchOneWayLabel}}\n </nas-radio>\n </form>\n <div *ngIf=\"exists(enableDatepickers)\" [nasClass]=\"getDatePickersClass()\">\n <nas-datepicker-combo #datepickerCombo compact \n [outboundId]=\"datePickerOutboundId\" [inboundId]=\"datePickerInboundId\" [inlineFlex]=\"inlineFlex\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlNameOutbound]=\"nasFormControlNameOutbound\"\n [nasFormControlNameInbound]=\"nasFormControlNameInbound\" [availability]=\"availability\"\n [availableFlightsLabel]=\"availableFlightsLabel\" [dateDisplayFormat]=\"dateDisplayFormat\"\n [disablePastSelection]=\"disablePastSelection\" [locale]=\"locale\"\n [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\" [inboundAvailableDates]=\"inboundAvailableDates\"\n [inboundLabel]=\"inboundLabel\" [noAvailableFlightsLabel]=\"noAvailableFlightsLabel\"\n [outboundAvailableDates]=\"outboundAvailableDates\" [outboundLabel]=\"outboundLabel\"\n [timeDisplayFormat]=\"timeDisplayFormat\" [times]=\"times\" [outboundDisabled]=\"outboundDisabled\"\n [inboundDisabled]=\"inboundDisabled\" [outboundOnly]=\"tripType === 1\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" [ariaLabelPreviousMonth]=\"ariaLabelPreviousMonth\"\n [ariaLabelNextMonth]=\"ariaLabelNextMonth\" (focusOnNextChange)=\"onFocusOnNextChange($event)\"\n (focusOnPreviousChange)=\"onDatepickerFocusOnPrevious($event)\"\n (inboundMonthChange)=\"onInboundMonthChange($event)\" (outboundMonthChange)=\"onOutboundMonthChange($event)\"\n [(outboundOpen)]=\"outboundOpen\" [(inboundOpen)]=\"inboundOpen\"\n [(inboundSelectedDate)]=\"inboundSelectedDate\" [(outboundSelectedDate)]=\"outboundSelectedDate\">\n </nas-datepicker-combo>\n </div>\n <div *ngIf=\"enablePassengersSelect || enableTransitSwitch\" [nasClass]=\"getClass('dropdown-wrapper')\">\n <div *ngIf=\"enablePassengersSelect\" [nasClass]=\"getClass('passengers')\">\n <button (click)=\"onPassengerSelectOpen($event)\" [id]=\"passengerSelectId\"\n [nasClass]=\"getClass('passengers-button', openPassengerSelect && 'active')\">\n <div [nasClass]=\"getClass('label')\">\n <p [nasClass]=\"getClass('button-title')\">{{passengersTitleLabel}}</p>\n <p>{{passengerSelectLabel}}</p>\n </div>\n <div [nasClass]=\"getClass('traveler-icon')\"><nas-icon [icon]=\"'my-profile-compact'\"\n [type]=\"'small'\"></nas-icon></div>\n </button>\n <div *ngIf=\"openPassengerSelect\" [nasClass]=\"getClass('passengers-selection')\">\n <nas-passenger-select [ariaLabelAdd]=\"ariaLabelAdd\" [ariaLabelSubtract]=\"ariaLabelSubtract\"\n [adultsLabel]=\"passengerSelectAdultsLabel\" [youthsLabel]=\"passengerSelectYouthsLabel\"\n [youngAdultsLabel]=\"passengerSelectYoungAdultsLabel\" [childrenLabel]=\"passengerSelectChildrenLabel\"\n [infantsLabel]=\"passengerSelectInfantsLabel\" [maxPaxCount]=\"maxPaxCount\"\n [minAdultCount]=\"minAdultCount\" [title]=\"passengerSelectTitle\" [nasFormGroup]=\"nasFormGroup\"\n [nasFormControlGroupBooking]=\"nasFormControlGroupBooking\" [groupBookingLabel]=\"groupBookingLabel\"\n [groupBookingLimit]=\"groupBookingLimit\" (focusOnNext)=\"onPassengersSelectFocusOnNext()\"\n (focusOnPrevious)=\"onPassengersSelectFocusOnPrevious()\"\n [(passengers)]=\"passengers\"></nas-passenger-select>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openPassengerSelect\"></nas-backdrop>\n </div>\n </div>\n <div *ngIf=\"enableTransitSwitch\" [nasClass]=\"getClass('transit-type')\">\n <nas-button *ngIf=\"directOnlyLabel && directTransitLabel\" #transitSwitch block light\n [id]=\"transitTypeInputId\" [iconType]=\"'chevron-down'\" [label]=\"getTransitLabel()\"\n [nasClass]=\"getClass('transit', openTransitTypeSelect && 'active')\"\n [ariaLabelBackdrop]=\"ariaLabelBackdrop\" (click)=\"onTransitSwitchOpen($event)\"\n (keydown)=\"transitKeyDown($event)\">{{ getTransitLabel() }}\n </nas-button>\n <div *ngIf=\"openTransitTypeSelect\" [nasClass]=\"getClass('transit-type-selection')\">\n <button [id]=\"transitTypeInputId + '__direct'\" [nasClass]=\"getTravelDetailsClass('action', directOnly && 'active')\" type=\"button\"\n #transitTypeDirectOnly (click)=\"onTransitChange(true)\">{{ directOnlyLabel }}\n </button>\n <button [id]=\"transitTypeInputId + '__transit'\" type=\"button\" #transitTypeTransit\n [nasClass]=\"getTravelDetailsClass('action', !directOnly && 'active')\"\n (click)=\"onTransitChange(false)\">{{ directTransitLabel }}\n </button>\n <nas-backdrop [ariaLabelBackdrop]=\"ariaLabelBackdrop\"\n [(showBackdrop)]=\"openTransitTypeSelect\"></nas-backdrop>\n </div>\n </div>\n </div>\n </ng-container>\n </div>\n </div>\n</ng-template>", styles: ["@keyframes fade-in{0%{opacity:0}}@keyframes fade-in-down{0%{opacity:0;transform:translateY(-30px)}}@keyframes fade-in-left{0%{opacity:0;transform:translate(-30px)}}@keyframes fade-in-right{0%{opacity:0;transform:translate(30px)}}@keyframes fade-out{to{opacity:0}}@keyframes flip-in{0%{opacity:0;transform:rotateX(-90deg)}40%{opacity:1;transform:rotateX(10deg)}}@keyframes flip-out{to{opacity:0;transform:rotateX(-90deg)}}@keyframes pop-in-from-top{0%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-100,1,1);opacity:0}6.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-30.227,1,1)}13.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,1.76,1,1)}20%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,7.08,1,1)}26.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,3.838,1,1)}33.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.902,1,1);opacity:1}40%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.237,1,1)}46.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.312,1,1)}53.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.141,1,1)}60%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.021,1,1)}66.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.015,1,1)}73.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.013,1,1)}80%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,.005,1,1)}86.67%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,0,1,1)}93.33%{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}to{transform:matrix3d(1,0,0,0,0,1,0,0,0,0,1,0,0,-.001,1,1);-webkit-transform:translate3d(0,0,0)}}.nas-filter{position:relative;z-index:6}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light{border:2px solid #15273F}.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:hover,.nas-filter ::ng-deep .nas-filter__transit .nas-button--light:focus{background-color:#fff}.nas-filter ::ng-deep .nas-filter__transit .nas-button__content{gap:0;justify-content:space-between;font-weight:400}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button__icon{transform:rotate(180deg)}.nas-filter ::ng-deep .nas-filter__transit--active .nas-button{background-color:#ebf4ff!important;border:2px solid #15273F;z-index:5}.nas-filter__title{margin-top:24px;font-size:32px;line-height:40px}.nas-filter__radio{display:flex;gap:24px;padding:12px}.nas-filter__radio--flex-end{order:4!important}.nas-filter__passengers-button{display:flex;justify-content:space-between;background-color:#fff;border:2px solid #15273F;padding:9px 14px;width:100%;height:67px}.nas-filter__passengers-button--active{background-color:#ebf4ff!important;position:relative;z-index:5}.nas-filter__label{flex-direction:column;text-align:left;display:flex;justify-content:center}.nas-filter__label p{margin:0}.nas-filter__button-title{font-weight:700;font-size:14px}.nas-filter__traveler-icon{transform:scale(.85);margin-top:12px}.nas-filter__transit-type-selection{z-index:4;position:absolute;width:100%;border-left:2px solid #15273F;border-right:2px solid #15273F;border-bottom:2px solid #15273F}.nas-filter__transit-type-selection button:first-child{border-bottom:2px solid #E9E7E4}.nas-filter__transit-type-selection ::ng-deep .nas-backdrop{z-index:-1}.nas-filter__passengers{margin-top:8px}.nas-filter__filters:has(.nas-filter__radio--flex-end){display:flex;flex-direction:column}.nas-filter__filters .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md,.nas-filter__filters--lg{display:flex;flex-wrap:wrap;flex-direction:row;gap:8px}.nas-filter__filters--md .nas-filter__airport-select,.nas-filter__filters--lg .nas-filter__airport-select{flex:0 0 100%}.nas-filter__filters--md .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher,.nas-filter__filters--lg .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:48%;transform:rotate(90deg)}.nas-filter__filters--md .nas-filter__suggestions,.nas-filter__filters--lg .nas-filter__suggestions{flex:0 0 100%}.nas-filter__filters--md .nas-filter__suggestions ::ng-deep .nas-suggestions,.nas-filter__filters--lg .nas-filter__suggestions ::ng-deep .nas-suggestions{margin:0}.nas-filter__filters--md .nas-filter__suggestions--flex-end,.nas-filter__filters--lg .nas-filter__suggestions--flex-end{margin-bottom:0}.nas-filter__filters--md .nas-filter__dropdown-wrapper,.nas-filter__filters--lg .nas-filter__dropdown-wrapper{display:flex;gap:8px;flex:1 1 49%}.nas-filter__filters--md .nas-filter__passengers,.nas-filter__filters--lg .nas-filter__passengers{margin-top:0;position:relative;flex:1 1 24.5%}.nas-filter__filters--md .nas-filter__passengers .nas-filter__passengers-button,.nas-filter__filters--lg .nas-filter__passengers .nas-filter__passengers-button{height:67px}.nas-filter__filters--md .nas-filter__transit-type,.nas-filter__filters--lg .nas-filter__transit-type{flex:1 1 24.4%;position:relative}.nas-filter__filters--md .nas-filter__transit-type ::ng-deep .nas-button,.nas-filter__filters--lg .nas-filter__transit-type ::ng-deep .nas-button{height:67px;margin:0}.nas-filter__filters--md .nas-filter__date-combo,.nas-filter__filters--lg .nas-filter__date-combo{flex:1 1 49%}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls{border-left:2px solid #6F6F6F}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound .nas-datepicker__date-picker-wrapper .nas-datepicker__controls--active{border-left:2px solid currentColor}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker__date-picker-wrapper,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker .nas-datepicker--compact{position:relative}.nas-filter__filters--md .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound,.nas-filter__filters--lg .nas-filter__date-combo ::ng-deep .nas-datepicker-combo__date-picker--inbound{margin-left:8px}.nas-filter__filters--md .nas-filter__radio,.nas-filter__filters--lg .nas-filter__radio{flex:0 0 100%;padding:9px 0}.nas-filter__filters--md:has(.nas-filter__radio--flex-end),.nas-filter__filters--lg:has(.nas-filter__radio--flex-end){display:flex;flex-direction:row}.nas-filter__filters--md ::ng-deep .nas-airport-select-combo,.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo{flex-direction:row}.nas-filter__filters--md ::ng-deep .nas-airport-select-combo__switcher,.nas-filter__filters--lg ::ng-deep .nas-airport-select-combo__switcher{top:20%;left:46.5%;transform:rotate(90deg)}.nas-filter__filters--md .nas-filter__passengers ::ng-deep .nas-passenger-select__list{width:100%;min-width:250px}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__airport-select{order:0;flex:1}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__airport-select ::ng-deep .nas-airport-select-combo__switcher{left:46%}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__date-combo,.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__dropdown-wrapper{order:0;flex:1}.nas-filter__filters--lg.nas-filter__filters--inline .nas-filter__radio{order:1;flex:1 1 100%}.nas-filter__suggestions{flex-basis:100%;position:relative}.nas-filter__airport-select{order:0;flex:0 0 100%;position:relative}.nas-filter__toggler{font-family:NorwegianTextPro,Arial,Apercu,Helvetica Neue,Helvetica,sans-serif;font-weight:400;font-size:18px;line-height:24px;color:#15273f;margin-top:6px;z-index:1}.nas-filter__toggler .nas-filter__toggle-action{cursor:pointer;margin-top:2px;float:right}.nas-filter__toggler .nas-filter__direct-only{display:inline-block}.travel-details{position:relative;margin:0;z-index:1;display:flex;flex-direction:column}.travel-details__list{margin-top:12px}.travel-details__list-item{display:flex;align-items:center;justify-content:space-between;padding:6px 0 0}.travel-details__list-item:not(:last-child){padding:6px 0 9px;border-bottom:2px solid #E9E7E4}.travel-details__label{flex-grow:2;margin:0 6px 0 0}.travel-details__title{font-size:18px;line-height:24px;display:block;min-width:124px}.travel-details__title--small{font-size:16px;line-height:24px;margin:0}.travel-details__action{padding:12px;width:100%;background-color:#fff;font-weight:700}.travel-details__action:hover,.travel-details__action:focus{background-color:#f1f1f1}.travel-details__action--border{border-bottom:2px #E9E7E4}.travel-details__action:focus{outline:none;z-index:1}.travel-details__icon{margin-bottom:9px}.travel-details__dropdown{margin-right:0}.travel-details__dropdown:after{content:\"\";position:absolute;bottom:-3px;left:0;width:100%;border-bottom:3px solid #E9E7E4}.travel-details__dropdown--trip-type{order:1;flex:1;margin-right:3px;margin-bottom:3px}.travel-details__dropdown--transit-type{order:2;flex:1;margin-bottom:3px}.travel-details__dropdown--passengers{order:3;flex:1 0 100%;margin-bottom:3px}.travel-details__transit-icon{position:relative;display:flex;justify-content:center;width:calc(100% - 48px);margin:12px auto;height:24px;background-color:inherit}.travel-details__transit-icon:before{content:\"\";position:absolute;height:2px;left:0;width:100%;top:calc(50% - 1px);background-color:currentColor}.travel-details__transit-icon:after{content:\"\";position:absolute;width:10px;height:10px;right:0;top:calc(50% - 5px);border-top:2px solid currentColor;border-right:2px solid currentColor;transform:rotate(45deg)}.travel-details__transit-icon-stop{position:relative;top:calc(50% - 5px);width:10px;height:10px;border:2px solid currentColor;border-radius:50%;background-color:inherit}@media (min-width: 1000px){.travel-details--no-border:after{border-bottom:none}}::ng-deep .nas-filter__filters .nas-passenger-select__title{padding:8px 16px 0}::ng-deep .nas-filter__filters .nas-passenger-select__list{position:absolute!important;width:100%}::ng-deep .nas-filter__filters .nas-passenger-select__list-item{padding:8px 16px!important}::ng-deep .nas-filter__filters .nas-radio{margin:0!important}::ng-deep .nas-filter__filters .nas-button{margin-top:6px}::ng-deep .nas-filter__filters .travel-details--no-border:after{display:none}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker__date-picker-wrapper{border-bottom:none!important;position:unset}::ng-deep .nas-filter__filters .nas-filter__date-combo .nas-datepicker--compact{position:unset;margin-bottom:0}::ng-deep .nas-filter__filters .nas-filter__date-combo--side-by-side .nas-datepicker-combo__separator{display:block;border-bottom:none!important}::ng-deep .nas-filter__filters .nas-airport-select__input-line{border-top:none!important}::ng-deep .nas-filter__filters .nas-airport-select-combo__separator{border-bottom:none!important}::ng-deep .nas-filter__filters .nas-dropdown__toggle{height:64px!important}::ng-deep .nas-filter__filters .nas-datepicker-combo__separator{display:none}::ng-deep .nas-filter__rotate{transform:rotate(180deg)}::ng-deep .nas-filter__rotate-enter,::ng-deep .nas-filter__rotate-leave-active{transform-origin:center top;transform-style:preserve-3d;-webkit-backface-visibility:hidden;backface-visibility:hidden}::ng-deep .nas-filter__rotate-enter{animation:flip-in .55s ease both}::ng-deep .nas-filter__rotate-leave-active{animation:flip-out .2s ease-out both}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__input-line{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select-combo__separator{border-top:none}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results-wrapper{margin-top:0}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__results{top:-3px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select__icon{bottom:18px}::ng-deep .nas-filter__airport-select--no-border .nas-airport-select:after{display:none}::ng-deep .nas-filter__airport-select .nas-airport-select__input-line{display:none}::ng-deep .nas-filter__airport-origin-select{width:100%;max-width:100%}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{max-width:100%}@media (min-width: 640px){::ng-deep .nas-filter__airport-origin-select{max-width:360px;flex:auto;margin-right:3px}::ng-deep .nas-filter__airport-origin-select .nas-airport-select:only-child{width:auto;max-width:360px}}::ng-deep .nas-filter__origin-combined{border-bottom:3px solid #E9E7E4;order:3;flex:0 0 100%;display:flex;flex-wrap:wrap}@media (min-width: 1000px){::ng-deep .nas-filter__origin-combined{display:flex;flex:none}::ng-deep .nas-filter__origin-combined .nas-dropdown__toggle nas-icon{float:none!important}}::ng-deep .nas-filter__backdrop{display:block;position:fixed;z-index:2;top:0;left:0;width:100%;height:100%;color:transparent;background-color:#0b14202b;animation:passenger-backdrop .7s ease-out both}::ng-deep .nas-filter__passengers-selection{position:absolute;z-index:4;width:100%}::ng-deep .nas-filter__passengers-selection ::ng-deep .nas-backdrop{z-index:-1}@keyframes passenger-backdrop{0%{opacity:0}}::ng-deep .lower-z-index{z-index:1!important;position:relative}\n"] }]
1055
1051
  }], ctorParameters: function () { return [{ type: i1.DeviceHelper }, { type: i2.SortService }, { type: i3.AbandonedBasketService }, { type: i4.DateHelper }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }]; }, propDecorators: { passengerSelectDropdown: [{
1056
1052
  type: ViewChild,
1057
1053
  args: ['passengerSelectDropdown']
@@ -1127,6 +1123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImpor
1127
1123
  type: Input
1128
1124
  }], minimizeOnMobile: [{
1129
1125
  type: Input
1126
+ }], inlineOnDesktop: [{
1127
+ type: Input
1130
1128
  }], expandedAccordionMobile: [{
1131
1129
  type: Input
1132
1130
  }], defaultSummarySeparator: [{
@@ -1312,4 +1310,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.1.5", ngImpor
1312
1310
  }], positionChange: [{
1313
1311
  type: Output
1314
1312
  }] } });
1315
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBSVYsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWV0RSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFZjs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxnQkFBZ0I7SUFnQ25ELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFjO1FBQzdCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcs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aUJBQWlCO3NCQUF6QixLQUFLO2dCQVFHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFRRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU9HLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFPRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBUUYsb0JBQW9CO3NCQUR2QixLQUFLO2dCQXFCRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBb0JHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFPRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU9HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFPRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBUUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQVFHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFRRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBUUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQVFHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFTRyxVQUFVO3NCQUFsQixLQUFLO2dCQVFHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBT0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQU9HLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBT0csaUJBQWlCO3NCQUExQixNQUFNO2dCQU9HLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBT0csaUJBQWlCO3NCQUExQixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTm9yd2VnaWFuIEFpciBTaHV0dGxlLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEhvc3RMaXN0ZW5lcixcbiAgQWZ0ZXJWaWV3SW5pdCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBGb3JtR3JvdXAgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyaXBUeXBlIH0gZnJvbSAnLi9lbnVtcy90cmlwLXR5cGUuZW51bSc7XG5pbXBvcnQgeyBOYXNDb21wb25lbnRCYXNlIH0gZnJvbSAnLi4vLi4vY29yZS9iYXNlL25hcy1jb21wb25lbnQuYmFzZSc7XG5pbXBvcnQgeyBBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9hYmFuZG9uZWQtYmFza2V0LWl0ZW0ubW9kZWwnO1xuaW1wb3J0IHsgQ2xhc3NNb2RlbCB9IGZyb20gJy4uLy4uL2NvcmUvbW9kZWxzL2NsYXNzLm1vZGVsJztcbmltcG9ydCB7IFV0Y0RhdGUgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy91dGMtZGF0ZS5tb2RlbCc7XG5pbXBvcnQgeyBBYmFuZG9uZWRCYXNrZXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9hYmFuZG9uZWQtYmFza2V0L2FiYW5kb25lZC1iYXNrZXQuc2VydmljZSc7XG5pbXBvcnQgeyBEYXRlSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9kYXRlL2RhdGUtaGVscGVyLnNlcnZpY2UnO1xuaW1wb3J0IHsgRGV2aWNlSGVscGVyIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9kZXZpY2UvZGV2aWNlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNvcnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29yZS9zZXJ2aWNlcy9zb3J0L3NvcnQuc2VydmljZSc7XG5pbXBvcnQgeyBBaXJwb3J0TW9kZWwgfSBmcm9tICcuLi9haXJwb3J0LXNlbGVjdC9tb2RlbHMvYWlycG9ydC5tb2RlbCc7XG5pbXBvcnQgeyBEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJy4uL2Ryb3Bkb3duL2Ryb3Bkb3duLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBQYXNzZW5nZXJzTW9kZWwgfSBmcm9tICcuLi9wYXNzZW5nZXItc2VsZWN0L21vZGVscy9wYXNzZW5nZXJzLm1vZGVsJztcbmltcG9ydCB7IFBhc3NlbmdlclNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL3Bhc3Nlbmdlci1zZWxlY3QvcGFzc2VuZ2VyLXNlbGVjdC5jb21wb25lbnQnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlckNvbWJvQ29tcG9uZW50IH0gZnJvbSAnLi4vZGF0ZXBpY2tlci1jb21iby9kYXRlcGlja2VyLWNvbWJvLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBBaXJwb3J0U2VsZWN0Q29tcG9uZW50IH0gZnJvbSAnLi4vYWlycG9ydC1zZWxlY3QvYWlycG9ydC1zZWxlY3QuY29tcG9uZW50JztcblxubGV0IG5leHRJZCA9IDA7XG5cbi8qKlxuICogQGRlc2NyaXB0aW9uXG4gKiBOb3J3ZWdpYW4gRmlsdGVyIENvbXBvbmVudCB8IEZ1bmN0aW9uYWwgfCBOZXcgZGVzaWduXG4gKi9cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ25hcy1maWx0ZXInLFxuICB0ZW1wbGF0ZVVybDogJy4vZmlsdGVyLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZmlsdGVyLmNvbXBvbmVudC5zY3NzJ10sXG59KVxuZXhwb3J0IGNsYXNzIEZpbHRlckNvbXBvbmVudCBleHRlbmRzIE5hc0NvbXBvbmVudEJhc2UgaW1wbGVtZW50cyBPbkluaXQsIEFmdGVyVmlld0NoZWNrZWQsIEFmdGVyVmlld0luaXQge1xuICBAVmlld0NoaWxkKCdwYXNzZW5nZXJTZWxlY3REcm9wZG93bicpXG4gIHBhc3NlbmdlclNlbGVjdERyb3Bkb3duOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgncGFzc2VuZ2VyU2VsZWN0JykgcGFzc2VuZ2VyU2VsZWN0OiBQYXNzZW5nZXJTZWxlY3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBTd2l0Y2gnKSB0cmlwU3dpdGNoOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFN3aXRjaCcpIHRyYW5zaXRTd2l0Y2g6IERyb3Bkb3duQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdhaXJwb3J0U2VsZWN0JykgYWlycG9ydFNlbGVjdDogQWlycG9ydFNlbGVjdENvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnZGF0ZXBpY2tlckNvbWJvJykgZGF0ZXBpY2tlckNvbWJvOiBEYXRlcGlja2VyQ29tYm9Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2NvbnRhaW5lcicpIGNvbnRhaW5lcjogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVPbmV3YXknKSB0cmlwVHlwZU9uZXdheTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJpcFR5cGVSb3VuZFRyaXAnKSB0cmlwVHlwZVJvdW5kVHJpcDogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFR5cGVEaXJlY3RPbmx5JykgdHJhbnNpdFR5cGVEaXJlY3RPbmx5OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCd0cmFuc2l0VHlwZVRyYW5zaXQnKSB0cmFuc2l0VHlwZVRyYW5zaXQ6IEVsZW1lbnRSZWY7XG5cbiAgbGF0ZXN0U2VhcmNoZXNPcmlnaW46IEFycmF5PEFpcnBvcnRNb2RlbD47XG4gIGxhdGVzdFNlYXJjaGVzRGVzdGluYXRpb246IEFycmF5PEFpcnBvcnRNb2RlbD47XG4gIGRpc3BsYXlTdW1tYXJ5ID0gdHJ1ZTtcbiAgbmF0aXZlRWxlbWVudDogSFRNTEVsZW1lbnQ7XG4gIGluYm91bmRMb3dlckxpbWl0RGF0ZTogVXRjRGF0ZTtcbiAgY29udGFpbmVyV2lkdGggPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMCk7XG4gIG1heGltaXplID0gZmFsc2U7XG4gIGlzTmFzR3JvdXBWYWxpZCA9IGZhbHNlO1xuICBpbmxpbmVGbGV4ID0gMDtcbiAgb3BlblBhc3NlbmdlclNlbGVjdCA9IGZhbHNlO1xuICBvcGVuVHJhbnNpdFR5cGVTZWxlY3QgPSBmYWxzZTtcbiAgY29tcG9uZW50SWQ6IG51bWJlcjtcbiAgdHJpcFN3aXRjaEZvY3VzVGltZW91dDogYW55O1xuICBleHBhbmRlZEFjY29yZGlvbk1vYmlsZVZhbHVlOiBib29sZWFuO1xuICB0cmlwVHlwZUluaXQ6IGJvb2xlYW47XG4gIGRlZmF1bHRUcmlwVHlwZTogVHJpcFR5cGU7XG4gIG91dGJvdW5kRGF0ZU9ubHk6IGJvb2xlYW47XG5cbiAgZ2V0IG91dGJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZE9wZW5WYWx1ZTtcbiAgfVxuICBzZXQgb3V0Ym91bmRPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub3V0Ym91bmRPcGVuVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLm91dGJvdW5kT3BlbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIGdldCBpbmJvdW5kT3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5pbmJvdW5kT3BlblZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kT3Blbih2YWx1ZTogYm9vbGVhbikge1xuICAgIGlmICh0aGlzLmluYm91bmRPcGVuVmFsdWUgPT09IHZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICB0aGlzLmNsb3NlRHJvcGRvd25zKCk7XG5cbiAgICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNsZWFyVGltZW91dCh0aGlzLmluYm91bmRPcGVuVGltZW91dCBhcyBudW1iZXIpO1xuXG4gICAgdGhpcy5pbmJvdW5kT3BlblRpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZE9wZW5WYWx1ZSA9IHZhbHVlO1xuICAgIH0pO1xuXG4gICAgdGhpcy5pbmJvdW5kT3BlbkNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIHByaXZhdGUgaW5ib3VuZE9wZW5UaW1lb3V0OiBhbnk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAcmVxdWlyZWRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcmVjb3JkIGNvbnRhaW5pbmcga2V5cyB3aXRoIGFsbCBhaXJwb3J0IGNvZGVzIHdpdGggY29ycmVzcG9uZGluZyBhcnJheSBvZiBhaXJwb3J0IGNvZGVzIGNvbm5lY3RlZCB0byB0aGUga2V5LlxuICAgKi9cbiAgQElucHV0KCkgYWlycG9ydFJlbGF0aW9uczogUmVjb3JkPHN0cmluZywgQXJyYXk8c3RyaW5nPj47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWRkcyAnYXJpYS1sYWJlbCcgb24gdGhlIGNsZWFyIGJ1dHRvbiBpbnNpZGUgdGhlIGFpcnBvcnQgc2VsZWN0IGlucHV0cy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbENsZWFyOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIHN1YnRyYWN0IGJ1dHRvbnMuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxTdWJ0cmFjdDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgJ2FyaWEtbGFiZWwnIHRvIHRoZSBiYWNrZHJvcHMuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxCYWNrZHJvcDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBhZGQgYnV0dG9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbEFkZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGlzdCBvZiBhaXJwb3J0cyB0aGF0IHNob3VsZCBiZSBkaXNwbGF5ZWQgaW4gdGhlIG9yaWdpbiBkcm9wZG93bi5cbiAgICogSWYgbm90IGluY2x1ZGVkLCBhbGwgYWlycG9ydHMgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd2VkT3JpZ2luQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gYXJyYXkgb2YgYWlycG9ydHMgdGhhdCBhcmUgcmVzdHJpY3RlZCBmb3IgZGVzdGluYXRpb24gYWlycG9ydHMuIEl0IHdpbGwgZGVmYXVsdCB0byBhaXJwb3J0cyBpZiBub3Qgc2V0LlxuICAgKi9cbiAgQElucHV0KCkgYWxsb3dlZERlc3RpbmF0aW9uQWlycG9ydHM6IEFycmF5PEFpcnBvcnRNb2RlbD47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBib29sZWFuIGluZGljYXRpbmcgaWYgYWlycG9ydHMgdGhhdCB0aGUgdXNlciBhbGxyZWFkeSBoYXMgc2VhcmggZm9yIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5TGF0ZXN0U2VhcmNoZXM6IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogRGlzcGxheSBzd2l0Y2ggVUkgdG8gaW50ZXJjaGFuZ2Ugb3JpZ2luIGFuZCBkZXN0aW5hdGlvbiBhaXJwb3J0LlxuICAgKi9cbiAgQElucHV0KCkgdXNlU3dpdGNoPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhaXJwb3J0cyB0aGF0IGFyZSBjbG9zZSB0byB0aGUgdXNlciBzaG91bGQgYmUgZGlzcGxheWVkLlxuICAgKi9cbiAgQElucHV0KCkgZGlzcGxheUNsb3Nlc3RBaXJwb3J0czogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgYWlycG9ydCBjb2RlIG9mIHRoZSBvcmlnaW4gYWlycG9ydC4gSXQgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIG9yaWdpbiBhaXJwb3J0IGJhc2VkIG9uIHRoaXMgdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKSBvcmlnaW5BaXJwb3J0Q29kZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBhaXJwb3J0IGNvZGUgb2YgdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQuIEl0IHdpbGwgc2V0IHRoZSBzZWxlY3RlZCBkZXN0aW5hdGlvbiBhaXJwb3J0IGJhc2VkIG9uIHRoaXMgdmFsdWUuXG4gICAqL1xuICBASW5wdXQoKSBkZXN0aW5hdGlvbkFpcnBvcnRDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSB0b3RhbCBtYXhpbXVtIGFtb3VudCBvZiBwYXNzZW5nZXJzIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWF4UGF4Q291bnQ6IG51bWJlcjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBhcnJheSBvZiBkaWZmZXJlbnQgcGFzc2VuZ2VyIHR5cGVzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgcGFzc2VuZ2VycygpOiBBcnJheTxQYXNzZW5nZXJzTW9kZWw+IHtcbiAgICByZXR1cm4gdGhpcy5wYXNzZW5nZXJzVmFsdWU7XG4gIH1cbiAgc2V0IHBhc3NlbmdlcnModmFsdWU6IEFycmF5PFBhc3NlbmdlcnNNb2RlbD4pIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5wYXNzZW5nZXJzVmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnBhc3NlbmdlcnNDaGFuZ2UuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYWR1bHRzIHRoYXQgY2FuIGJlIHNlbGVjdGVkIGluIHRoZSBwYXNzZW5nZXIgc2VsZWN0IGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgbWluQWR1bHRDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIHJvdW5kIHRyaXAgc2VsZWN0aW9uIGluIHRoZSB0cmlwIHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHRyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIG9uZSB3YXkgc2VsZWN0aW9uIGluIHRoZSB0cmlwIHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHRyaXBTd2l0Y2hPbmVXYXlMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIGRpcmVjdCBvbmx5IHNlbGVjdGlvbiBpbiB0aGUgdHJhbnNpdCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciBib3RoIGRpcmVjdCBhbmQgdHJhbnNpdCBzZWxlY3Rpb24gaW4gdGhlIHRyYW5zaXQgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgZGlyZWN0VHJhbnNpdExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5kaWNhdGVzIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIGJlIG1pbmltaXplZCBvbiBtb2JpbGUgc2NyZWVuIHNpemVzLlxuICAgKi9cbiAgQElucHV0KCkgbWluaW1pemVPbk1vYmlsZT86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5kaWNhdGVzIGlmIHRoZSBlZGl0IHNlYXJjaCBvZiBhY2NvcmRpb24gc2hvdWxkIGJlIGV4cGVuZGVkIG9uIG1vYmlsZSBzY3JlZW4gc2l6ZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTtcbiAgfVxuICBzZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBzZXBhcmF0b3IgZm9yIHRoZSBmaWx0ZXIgc3VtbWFyeSB0aGF0IGlzIGRpc3BheWVkIGlmIG1pbmltaXplT25Nb2JpbGUgaXMgdHJ1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICogMSB0cmF2ZWxsZXIsIHJvdW5kIHRyaXAgYW5kIGRpcmVjdC90cmFuc2l0XG4gICAqL1xuICBASW5wdXQoKSBkZWZhdWx0U3VtbWFyeVNlcGFyYXRvciA9ICcnO1xuXG4gIC8qKlxuICAgKiBBIHNlcGFyYXRvciBmb3IgdGhlIGZpbHRlciBzdW1tYXJ5IGlzIGFyZSBkaXNwYXllZCBpZiBtaW5pbWl6ZU9uTW9iaWxlIGlzIHRydWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIDEgdHJhdmVsbGVyLCByb3VuZCB0cmlwIGFuZCBkaXJlY3QvdHJhbnNpdFxuICAgKi9cbiAgQElucHV0KCkgbGFzdFN1bW1hcnlTZXBhcmF0b3IgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRpdGxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdXRocyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdXRoc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdW5nIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdW5nQWR1bHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgY2hpbGRyZW4gcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RDaGlsZHJlbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGluZmFudHMgcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RJbmZhbnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgd2hlbiB0b3RhbCBudW1iZXIgb2Ygc2VsZWN0ZWQgcGFzc2VuZ2VycyBleGNlZWRzIHRoZSBncm91cCBib29raW5nIGxpbWl0XG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgYWxsIGFpcnBvcnRzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBhbGxBaXJwb3J0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgbGF0ZXN0IHNlYXJjaGVzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgY2xvc2VzdCBhaXJwb3J0cyBpbiB0aGUgYWlycG9ydCBzZWxlY3QgZHJvcCBkb3duIGxpc3RzLlxuICAgKi9cbiAgQElucHV0KCkgY2xvc2VzdEFpcnBvcnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGluIHRoZSBhaXJwb3J0IHNlbGVjdCwgaWYgdGhlXG4gICAqIHVzZXIgdHJpZXMgdG8gc2VsZWN0IGEgZGVzdGluYXRpb24gYWlycG9ydCB3aXRob3V0IHNlbGVjdGluZyBhbiBvcmlnaW4gYWlycG9ydC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE9yaWdpbkZpcnN0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbE9yaWdpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGFwcGVhciBvbiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlck9yaWdpbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBkZXN0aW5hdGlvbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxEZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBpbiBteSBsb2NhdGlvbiBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKSBnZW9sb2NhdGlvbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIGluIG15IGxvY2F0aW9uLCBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QgaWYgdXNlciBoYXMgZGVuaWVkIGdlb2xvY2F0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHBsYWNlaG9sZGVyIHRoYXQgd2lsbCBhcHBlYXIgb24gdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckRlc3RpbmF0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBtb2RpZmllciB0aGF0IHdpbGwgYWxsb3cgYWx3YXlzIGtlZXBpbmcgdGhlIHNlbGVjdGVkIGFpcnBvcnQuXG4gICAqIFRoZSBsYXN0IHNlbGVjdGVkIGFpcnBvcnQgd2lsbCBiZSBzaG93biBvbmNlIHVzZXIgY2xlYXJzIHRoZSBzZWxlY3Rpb24gYW5kIGJsdXIuXG4gICAqL1xuICBASW5wdXQoKSBrZWVwU2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdGl0bGUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGVkaXQgc2VhcmNoIGFjY29yZGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRTZWFyY2hUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgdGhlIHBhcmVudCdzIGZvcm0gZ3JvdXAuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IGlzIHJlcXVpZXJlZCB0byBiZSBmaWxsZWQgaWYgbmFzRm9ybUNvbnRyb2xOYW1lIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHk6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZUluYm91bmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1ha2UgbGF0ZXN0IHNlYXJjaGVzIGFuZCBnZW9sb2NhdGlvbiBvdmVycmlkZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBvcmlnaW4gYWlycG9ydCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlT3JpZ2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgZmlsdGVyIGRpc3BsYXkgc3VnZ2VzdGVkIGFpcnBvcnRzIGJhc2VkIG9uIGdlb2xvY2F0aW9uIGFuZCBsYXRlc3Qgc2VhcmNoZXMuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVTdWdnZXN0aW9ucz86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgZ2V0IGNsb3Nlc3RBaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZTtcbiAgfVxuICBzZXQgY2xvc2VzdEFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgaWYgKCFhaXJwb3J0cyB8fCBhaXJwb3J0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMub3ZlcnJpZGVPcmlnaW4pKSB7XG4gICAgICB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID0gYWlycG9ydHNbMF0uY29kZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgb25seSBkaXNwbGF5IGFpcnBvcnQgc2VsZWN0aW9uLiBXaGVuIGEgY2l0eSBwYWlyIGlzIHNlbGVjdGVkLCB0aGUgcmVzdCBvZiB0aGUgZmlsdGVyIHdpbGwgYmUgdmlzaWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXplPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWxsIGFpcnBvcnRzIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgaW50byB0aGUgZHJvcGRvd24gbGlzdHMuXG4gICAqIElmIGRpc3BsYXlMYXRlc3RTZWFyY2hlcyBpcyB0cnVlLCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIGxhdGVzdCBzZWFyY2hlcyBmcm9tIHRoZSBhYmFuZG9uZWQgYmFza2V0LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFpcnBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgdGhpcy5haXJwb3J0c1ZhbHVlID0gYWlycG9ydHM7XG5cbiAgICBpZiAodGhpcy5leGlzdHModGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMpKSB7XG4gICAgICBjb25zdCBhYmFuZG9uZWRCYXNrZXQgPSB0aGlzLmFiYW5kb25lZEJhc2tldFNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgICB0aGlzLnNldExhdGVzdFNlYXJjaGVzKGFiYW5kb25lZEJhc2tldCwgdGhpcy5haXJwb3J0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRyaXBUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlVmFsdWU7XG4gIH1cbiAgc2V0IHRyaXBUeXBlKHRyaXBUeXBlOiBUcmlwVHlwZSkge1xuICAgIGlmICh0cmlwVHlwZSA9PT0gdGhpcy50cmlwVHlwZVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlwVHlwZVZhbHVlID0gdHJpcFR5cGU7XG4gICAgXG4gICAgdGhpcy50cmlwVHlwZUNoYW5nZS5lbWl0KHRoaXMudHJpcFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpcmVjdE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0T25seVZhbHVlO1xuICB9XG4gIHNldCBkaXJlY3RPbmx5KGRpcmVjdE9ubHk6IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0T25seSA9PT0gdGhpcy5kaXJlY3RPbmx5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpcmVjdE9ubHlWYWx1ZSA9IGRpcmVjdE9ubHk7XG4gICAgdGhpcy5kaXJlY3RPbmx5Q2hhbmdlLmVtaXQodGhpcy5kaXJlY3RPbmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBsaW1pdCBmb3Igd2hlbiB0aGUgdG90YWwgYW1vdW50IG9mIHBhc3NlbmdlcnMgZXhjZWVkcyB0byBiZSBhIGdyb3VwIGJvb2tpbmcuXG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMaW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBwcmV2aW91cyBtb250aCBidXR0b24gaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsUHJldmlvdXNNb250aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBuZXh0IG1vbnRoIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxOZXh0TW9udGg6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBvcmlnaW4gZHJvcGRvd24gc2VsZWN0b3Igb3BlbnMgb3IgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgb3JpZ2luIGRyb3Bkb3duIHNlbGVjdG9yIG9wZW5zIG9yIGNsb3Nlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93biBvcGVucyBvciBjbG9zZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgcGFzc2VuZ2VyU2VsZWN0T3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBzZWxlY3RlZCBvcmlnaW4gYWlycG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGFpcnBvcnQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgYSBwYXNzZW5nZXIgc2VsZWN0aW9uIGNoYW5nZSBpcyBwZXJmb3JtZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcGFzc2VuZ2Vyc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8UGFzc2VuZ2Vyc01vZGVsPj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQE91dHB1dCgpIHRyaXBUeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmlwVHlwZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQE91dHB1dCgpIGRpcmVjdE9ubHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIG5vIGF2YWlsYWJsZSBmbGlnaHRzLlxuICAgKi9cbiAgQElucHV0KCkgbm9BdmFpbGFibGVGbGlnaHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgYXZhaWxhYmxlIGZsaWdodHMuXG4gICAqL1xuICBASW5wdXQoKSBhdmFpbGFibGVGbGlnaHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNhYmxlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBkYXRlcyBpbiB0aGUgcGFzdC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0U2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBvdXRib3VuZCBkYXRlcGlja2VyLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBpbmJvdW5kIGRhdGVwaWNrZXIuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBkYXRlcGlja2VycyBpbiBhdmFpbGFiaWxpdHkgbW9kZSB3aGVyZSBhdmFpbGFibGUgZGF0ZXMgY2FuIGJlIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgYXZhaWxhYmlsaXR5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEF2YWlsYWJsZSBkYXRlcyBmb3Igb3V0Ym91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZEF2YWlsYWJsZURhdGVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBdmFpbGFibGUgZGF0ZXMgZm9yIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kQXZhaWxhYmxlRGF0ZXM6IEFycmF5PFV0Y0RhdGU+O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIElmIHNldCwgRW5hYmxlcyB0aGUgdGltZSBkcm9wZG93biBzZWxlY3RvciBhbG9uZ3NpZGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgd2hlbiB1c2VyIGhhcyBzZWxlY3RlZCB0aGUgZGF0ZSBhbmQgaXQgaXMgYmVpbmcgc2hvd24gaW4gdGhlIGlucHV0IGJveCBmb3IgdGhlIGRhdGUgcGlja2VyLlxuICAgKiBQbGVhc2UgbG9vayBhdCB0aGUgYW5ndWxhciBEYXRlIHBpcGUgZm9yIHZhbGlkIGZvcm1hdHMgYW5kIHZhcmlhdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlRGlzcGxheUZvcm1hdCA9ICdFRUUgZCwgTU1NJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgdGltZSBkaXNwbGF5IGZvcm1hdC5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVEaXNwbGF5Rm9ybWF0ID0gJ0hIOm1tJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBMT0NBTEVfSUQsIHdoaWNoIGlzIGVuLVVTIGJ5IGRlZmF1bHQuXG4gICAqIFRoaXMgcmVxdWlyZXMgdGhhdCByZWdpc3RlckxvY2FsZURhdGEgaXMgY2FsbGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgbG9jYWxlLlxuICAgKi9cbiAgQElucHV0KCkgbG9jYWxlID0gJ2VuLUdCJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIG1vZGlmaWVyIHRvIHJlbW92ZSB0aGUgcGFkZGluZyBhbmQgbWFyZ2lucyBhcm91bmQgdGhlIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb21wYWN0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IG91dGJvdW5kIGRhdGVzLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmREaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNhYmxlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBpbmJvdW5kIGRhdGVzLlxuICAgKi9cbiAgQElucHV0KCkgaW5ib3VuZERpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNob3cvQWRkIGRhdGUgcGlja2VyIGNvbWJvIGludG8gdGhlIGZpbHRlciBpZiBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZURhdGVwaWNrZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsZSBpY29uIGZvciBtaW5pbWl6aW5nIGZpbHRlci5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXppbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsZSBpY29uIGZvciBtYXhpbWl6aW5nIGZpbHRlci5cbiAgICovXG4gIEBJbnB1dCgpIG1heGltaXppbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsaW5nIHRyYW5zaXQgdHlwZSB3aGVuIGZpbHRlciBpcyBtaW5pbWl6ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TW9iaWxlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgJ29yJyBpbiB0aGUgc3VnZ2VzdGlvbmVkIGFpcnBvcnRzLlxuICAgKi9cbiAgQElucHV0KCkgb3JMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciAnVHJhdmVsZXJzJyBpbiB0aGUgcGFzc2VuZ2VycyBzZWxlY3QgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgcGFzc2VuZ2Vyc1RpdGxlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBkZXN0aW5hdGlvbnMgZHJvcGRvd24gbGlzdCB3aGVuIG9yaWdpbiBhaXJwb3J0IGlzIG5vdCBzZXQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkRGVzdGluYXRpb25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgZGF0ZWZvciBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBvdXRib3VuZFNlbGVjdGVkRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZVZhbHVlO1xuICB9XG4gIHNldCBvdXRib3VuZFNlbGVjdGVkRGF0ZShkYXRlOiBVdGNEYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgZGF0ZWZvciBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGluYm91bmRTZWxlY3RlZERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kU2VsZWN0ZWREYXRlKGRhdGU6IFV0Y0RhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlID0gZGF0ZTtcbiAgICAgIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSBkZXN0aW5hdGlvbiBpbnB1dCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgcGFzc2VuZ2VyIHNlbGVjdCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVBhc3NlbmdlcnNTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdpbGwgZGlzcGxheSB0aGUgdHJpcCBzd2l0Y2gsIHNldCB0aGlzIHRvIGZhbHNlIHRvIHJlbW92ZSBpdC4gSXQncyB0cnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVUcmlwU3dpdGNoID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgdGhlIHRyYW5zaXQgc3dpdGNoLCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlVHJhbnNpdFN3aXRjaCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgYW5kIGluYm91bmQgZGF0ZXMgd2lsbCBicmVhayBob3Jpem9udGFsbHkuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlUGlja2VyQ29tYm9JbmxpbmVGbGV4ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3Igb3V0Ym91bmQgQWlycG9ydCBTZWxlY3QgXG4gICAqL1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0T3V0Ym91bmRJZDogc3RyaW5nO1xuXG4gICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgaW5ib3VuZCBBaXJwb3J0IFNlbGVjdFxuICAgKi9cbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdEluYm91bmRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgSUQgb2YgdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGZvciBQYXNzZW5nZXIgU2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgb3V0Ym91bmQgZGF0ZXBpY2tlciBJRCBvZiB0aGUgbmF0aXZlIGlucHV0IGVsZW1lbnQgZm9yIERhdGUgcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBkYXRlUGlja2VyT3V0Ym91bmRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgaW5ib3VuZCBkYXRlcGlja2VyIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgRGF0ZSBwaWNrZXJcbiAgICovXG4gIEBJbnB1dCgpIGRhdGVQaWNrZXJJbmJvdW5kSWQ6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgSUQgb2YgdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGZvciBUcmlwIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIHRyaXBUeXBlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgVHJhbnNpdCB0eXBlXG4gICAqL1xuICBASW5wdXQoKSB0cmFuc2l0VHlwZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gc2VsZWN0ZWQgZGF0ZWhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIG91dGJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQE91dHB1dCgpIG91dGJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaGVuIHNlbGVjdGVkIGRhdGVoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRTZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE91dGJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE91dGJvdW5kIGNhbGVuZGFyIGNoYW5nZXMgbW9udGguXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5ib3VuZCBjYWxlbmRhciBjaGFuZ2VzIG1vbnRoLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBhIHVzZXIgaGFzIGFjdGl2ZWx5IGNoYW5nZWQgdGhlIGRhdGUuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9jdXNPbk5leHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBnZW9sb2NhdGlvbiBvZiB0aGUgdXNlci4gV2lsbCBiZSBlbWl0dGVkIGlmICdlbmFibGVTdWdnZXN0aW9ucycgaXMgdHJ1ZS5cbiAgICovXG4gIEBPdXRwdXQoKSBwb3NpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R2VvbG9jYXRpb25Qb3NpdGlvbj4oKTtcblxuICBnZXQgaW5ib3VuZFNlbGVjdGVkTW9udGgoKTogVXRjRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZTtcbiAgfVxuICBzZXQgaW5ib3VuZFNlbGVjdGVkTW9udGgobW9udGg6IFV0Y0RhdGUpIHtcbiAgICBpZiAodGhpcy5kYXRlU2VydmljZS5pc1NhbWVNb250aChtb250aCwgdGhpcy5pbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XG4gICAgICB0aGlzLmluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWUgPSBtb250aDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwYXNzZW5nZXJTZWxlY3RJbnB1dElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFzc2VuZ2VyU2VsZWN0SWQgPyB0aGlzLnBhc3NlbmdlclNlbGVjdElkIDogYG5hcy1maWx0ZXJfX3Bhc3Nlbmdlci1zZWxlY3QtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cbiAgXG4gIGdldCB0cmlwVHlwZUlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmlwVHlwZUlkID8gdGhpcy50cmlwVHlwZUlkIDogYG5hcy1maWx0ZXJfX3RyaXAtdHlwZS0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIGdldCB0cmFuc2l0VHlwZUlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2l0VHlwZUlkID8gdGhpcy50cmFuc2l0VHlwZUlkIDogYG5hcy1maWx0ZXJfX3RyYW5zaXQtdHlwZS0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIHByaXZhdGUgb3V0Ym91bmRTZWxlY3RlZERhdGVWYWx1ZTogVXRjRGF0ZTtcbiAgcHJpdmF0ZSBpbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZTogVXRjRGF0ZTtcbiAgcHJpdmF0ZSBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBwcml2YXRlIHRyaXBUeXBlVmFsdWU6IFRyaXBUeXBlO1xuICBwcml2YXRlIGRpcmVjdE9ubHlWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBvdXRib3VuZE9wZW5WYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIGluYm91bmRPcGVuVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYXNzZW5nZXJzVmFsdWUgPSBuZXcgQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPigpO1xuICBwcml2YXRlIGZvY3VzQXN5bmNUaW1vdXQ6IGFueTtcbiAgcHJpdmF0ZSB0cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRldmljZUhlbHBlcjogRGV2aWNlSGVscGVyLFxuICAgIHB1YmxpYyBzb3J0U2VydmljZTogU29ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhYmFuZG9uZWRCYXNrZXRTZXJ2aWNlOiBBYmFuZG9uZWRCYXNrZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVNlcnZpY2U6IERhdGVIZWxwZXIsXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcignbmFzLWZpbHRlcicpO1xuICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmNvbXBvbmVudElkID0gbmV4dElkKys7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmVuYWJsZVRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFR5cGVJbml0ID0gdHJ1ZTtcbiAgICAgIHRoaXMuZGVmYXVsdFRyaXBUeXBlID0gdGhpcy50cmlwVHlwZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLm5hc0Zvcm1Hcm91cCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMubmFzRm9ybUdyb3VwLnN0YXR1c0NoYW5nZXMuc3Vic2NyaWJlKCh4KSA9PiB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5pc05hc0dyb3VwVmFsaWQgPSAvdHJ1ZS9pLnRlc3QoeCk7XG4gICAgICB9KTtcbiAgICB9KTtcblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpIHtcbiAgICAgIGNvbnN0IGRpcmVjdE9ubHlDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHlcbiAgICAgICk7XG5cbiAgICAgIGlmIChkaXJlY3RPbmx5Q29udHJvbCkge1xuICAgICAgICB0aGlzLmRpcmVjdE9ubHkgPSBkaXJlY3RPbmx5Q29udHJvbC52YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZSkge1xuICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlXG4gICAgICApO1xuXG4gICAgICBpZiAodHJpcFR5cGVDb250cm9sKSB7XG4gICAgICAgIHRoaXMudHJpcFR5cGUgPSB0aGlzLnRyaXBUeXBlSW5pdCA/IHRoaXMuZGVmYXVsdFRyaXBUeXBlIDogdGhpcy50cmlwVHlwZTtcbiAgICAgICAgdGhpcy5pbmJvdW5kRGlzYWJsZWQgPSB0cmlwVHlwZUNvbnRyb2wudmFsdWUgPT09IFRyaXBUeXBlLm9uZVdheTtcblxuICAgICAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kKSB7XG4gICAgICAgICAgY29uc3QgaW5ib3VuZENvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZUluYm91bmRcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGluYm91bmRDb250cm9sICYmIHRoaXMuaW5ib3VuZERpc2FibGVkKSB7XG4gICAgICAgICAgICBpbmJvdW5kQ29udHJvbC5kaXNhYmxlKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdHJpcFR5cGVDb250cm9sLnZhbHVlQ2hhbmdlcy5zdWJzY3JpYmUoKHZhbHVlOiBUcmlwVHlwZSkgPT4ge1xuICAgICAgICAgIHRoaXMuaW5ib3VuZERpc2FibGVkID0gdmFsdWUgPT09IFRyaXBUeXBlLm9uZVdheTtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlID0gdmFsdWU7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHkpIHtcbiAgICAgIGNvbnN0IGRpcmVjdE9ubHlDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHlcbiAgICAgICk7XG4gICAgICBpZiAoZGlyZWN0T25seUNvbnRyb2wpIHtcbiAgICAgICAgZGlyZWN0T25seUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICB0aGlzLmRpcmVjdE9ubHkgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgbmdBZnRlclZpZXdDaGVja2VkKCk6IHZvaWQge1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGgubmV4dChcbiAgICAgICh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aFxuICAgICk7XG5cbiAgICB3aW5kb3cub25yZXNpemUgPSAoKSA9PiB7XG4gICAgICB0aGlzLmNvbnRhaW5lcldpZHRoLm5leHQoXG4gICAgICAgICh0aGlzLmNvbnRhaW5lci5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50KS5vZmZzZXRXaWR0aFxuICAgICAgKTtcbiAgICB9O1xuICB9XG5cbiAgZ2V0Q2xvc2VzdEFpcnBvcnRzKHBvc2l0aW9uOiBHZW9sb2NhdGlvblBvc2l0aW9uKTogdm9pZCB7XG4gICAgdGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHBvc2l0aW9uKTtcbiAgfVxuXG4gIGdldEZpbHRlckNsYXNzKGVsZW1lbnQ/OiBzdHJpbmcsIG1vZGlmaWVyc0lucHV0PzogYW55KTogQ2xhc3NNb2RlbCB7XG4gICAgbGV0IG1vZGlmaWVycyA9IG1vZGlmaWVyc0lucHV0IHx8IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kaWZpZXJzSW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICBtb2RpZmllcnNJbnB1dCBpbnN0YW5jZW9mIFN0cmluZ1xuICAgICkge1xuICAgICAgbW9kaWZpZXJzID0gW21vZGlmaWVyc0lucHV0XTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aHMgPSBbXTtcblxuICAgIGlmICh0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkpIHtcbiAgICAgIHdpZHRocy5wdXNoKCdtZCcpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoRGVza3RvcCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpKSB7XG4gICAgICB3aWR0aHMucHVzaCgnbGcnKTtcbiAgICB9XG5cbiAgICBtb2RpZmllcnMgPSBbLi4ubW9kaWZpZXJzLCAuLi53aWR0aHNdO1xuXG4gICAgcmV0dXJuIHRoaXMuZ2V0Q2xhc3MoZWxlbWVudCwgbW9kaWZpZXJzKTtcbiAgfVxuXG4gIGdldEFpcnBvcnRTZWxlY3RDbGFzcygpOiBDbGFzc01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRDbGFzcygnYWlycG9ydC1zZWxlY3QnLCBbXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoRGVza3RvcCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdsZycsXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ21kJyxcbiAgICAgIHRoaXMuZXhpc3RzKHRoaXMuZW5hYmxlRGF0ZXBpY2tlcnMpICYmICduby1ib3JkZXInLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0U3VnZ2VzdGlvbnMoKTogQXJyYXk8QWlycG9ydE1vZGVsPiB7XG4gICAgY29uc3Qgc3VnZ2VzdGlvbnMgPSBBcnJheS5mcm9tKFxuICAgICAgbmV3IFNldChbXG4gICAgICAgIC4uLih0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luXG4gICAgICAgICAgPyB0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luLmZpbHRlcihcbiAgICAgICAgICAgICh4KSA9PiB4LmNvZGUgIT09IHRoaXMub3JpZ2luQWlycG9ydENvZGVcbiAgICAgICAgICApXG4gICAgICAgICAgOiBbXSksXG4gICAgICAgIC4uLih0aGlzLmNsb3Nlc3RBaXJwb3J0c1xuICAgICAgICAgID8gdGhpcy5jbG9zZXN0QWlycG9ydHMuZmlsdGVyKFxuICAgICAgICAgICAgKHgpID0+IHguY29kZSAhPT0gdGhpcy5vcmlnaW5BaXJwb3J0Q29kZVxuICAgICAgICAgIClcbiAgICAgICAgICA6IFtdKSxcbiAgICAgIF0pXG4gICAgKTtcblxuICAgIHJldHVybiBzdWdnZXN0aW9ucy5zbGljZSgwLCAzKTtcbiAgfVxuXG4gIGdldERhdGVQaWNrZXJzQ2xhc3MoKTogQ2xhc3NNb2RlbCB7XG4gICAgcmV0dXJuIHRoaXMuZ2V0RmlsdGVyQ2xhc3MoJ2RhdGUtY29tYm8nLCBbXG4gICAgICB0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSAmJiAnbWluaW1pemVkJyxcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSA+IDUwMCAmJiAnc2lkZS1ieS1zaWRlJyxcbiAgICBdKTtcbiAgfVxuXG4gIGdldFRyYXZlbERldGFpbHNDbGFzcyhlbGVtZW50Pzogc3RyaW5nLCBtb2RpZmllcnNJbnB1dD86IGFueSk6IENsYXNzTW9kZWwge1xuICAgIGxldCBtb2RpZmllcnMgPSBtb2RpZmllcnNJbnB1dCB8fCBuZXcgQXJyYXk8c3RyaW5nPigpO1xuXG4gICAgaWYgKFxuICAgICAgdHlwZW9mIG1vZGlmaWVyc0lucHV0ID09PSAnc3RyaW5nJyB8fFxuICAgICAgbW9kaWZpZXJzSW5wdXQgaW5zdGFuY2VvZiBTdHJpbmdcbiAgICApIHtcbiAgICAgIG1vZGlmaWVycyA9IFttb2RpZmllcnNJbnB1dF07XG4gICAgfVxuXG4gICAgY29uc3Qgd2lkdGhzID0gW1xuICAgICAgdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdtZCcsXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoRGVza3RvcCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpICYmICdsZycsXG4gICAgXTtcblxuICAgIG1vZGlmaWVycyA9IFsuLi5tb2RpZmllcnMsIC4uLndpZHRoc107XG5cbiAgICBjb25zdCB0cmF2ZWxEZXRhaWxzQmFzZSA9IG5ldyBOYXNDb21wb25lbnRCYXNlKCd0cmF2ZWwtZGV0YWlscycpO1xuICAgIHJldHVybiB0cmF2ZWxEZXRhaWxzQmFzZS5nZXRDbGFzcyhlbGVtZW50LCBtb2RpZmllcnMpO1xuICB9XG5cbiAgb25JbmJvdW5kTW9udGhDaGFuZ2UobW9udGg6IFV0Y0RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmluYm91bmRNb250aENoYW5nZS5lbWl0KG1vbnRoKTtcbiAgfVxuICBvbk91dGJvdW5kTW9udGhDaGFuZ2UobW9udGg6IFV0Y0RhdGUpOiB2b2lkIHtcbiAgICB0aGlzLm91dGJvdW5kTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XG4gIH1cblxuICBvblBhc3NlbmdlcnNTZWxlY3RGb2N1c09uUHJldmlvdXMoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICB0aGlzLnNlbGVjdFByZXZpb3VzQ29udHJvbCgpO1xuICAgIH1cbiAgfVxuXG4gIHBhc3NlbmdlcktleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkgfHwgdGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5mb2N1c09uQWlycG9ydFNlbGVjdEJhY2t3YXJkcygpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzT25OZXh0Q2hhbmdlLmVtaXQoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5IHx8IHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT1cbiAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQubmF0aXZlRWxlbWVudFxuICAgICAgICApIHtcbiAgICAgICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuKSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0VzY2FwZSc6XG4gICAgICAgIHRoaXMub25QYXNzZW5nZXJTZWxlY3RPcGVuKCk7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQoXG4gICAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50XG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJpcFN3aXRjaEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlT25ld2F5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyaXBUeXBlT25ld2F5Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgICB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSB8fCAhdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RQcmV2aW91c0NvbnRyb2woKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZXZlbnQua2V5ID09PSAnVGFiJykge1xuICAgICAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy50cmlwU3dpdGNoLm9wZW4pIHtcbiAgICAgICAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmFuc2l0U3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKGZhbHNlKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudCh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRyYW5zaXRLZXlEb3duKGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgc3dpdGNoIChldmVudC5rZXkpIHtcbiAgICAgIGNhc2UgJ0Fycm93UmlnaHQnOlxuICAgICAgICBpZiAoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCA9PT0gdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJhbnNpdFR5cGVEaXJlY3RPbmx5Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyYW5zaXRUeXBlRGlyZWN0T25seS5uYXRpdmVFbGVtZW50XG4gICAgICAgICkge1xuICAgICAgICAgIHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ1RhYic6XG4gICAgICBjYXNlICdFbnRlcic6XG4gICAgICAgIGlmIChldmVudC5zaGlmdEtleSkge1xuICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyg8YW55PnRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4oIXRoaXMudHJhbnNpdFN3aXRjaC5vcGVuKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHRDaGFuZ2UuZW1pdCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKGZhbHNlKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudCh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIG9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25OZXh0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZSgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmMoPGFueT50aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfVxuICB9XG5cbiAgZm9jdXNBc3luYyhyZWZFbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuZm9jdXNBc3luY1RpbW91dCk7XG5cbiAgICB0aGlzLmZvY3VzQXN5bmNUaW1vdXQgPSBzZXRUaW1lb3V0KCgpID0+XG4gICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHJlZkVsZW1lbnQpXG4gICAgKTtcbiAgfVxuXG4gIG9uRGF0ZXBpY2tlckZvY3VzT25QcmV2aW91cyhldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgdGhpcy5mb2N1c09uQWlycG9ydFNlbGVjdEJhY2t3YXJkcygpO1xuICB9XG5cbiAgc2VsZWN0UHJldmlvdXNDb250cm9sKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT25seSkge1xuICAgICAgICB0aGlzLm91dGJvdW5kT3BlbiA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmluYm91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMuYWlycG9ydFNlbGVjdC5jb21ibykpIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uRGVzdGluYXRpb25PcGVuKHRydWUpO1xuICAgICAgICBpZiAoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24pIHtcbiAgICAgICAgICB0aGlzLmZvY3VzQXN5bmMoXG4gICAgICAgICAgICAoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duRGVzdGluYXRpb24pLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9uT3JpZ2luT3Blbih0cnVlKTtcbiAgICAgICAgaWYgKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bk9yaWdpbikge1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyhcbiAgICAgICAgICAgICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0XG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG9uRm9jdXNPbk5leHRDaGFuZ2UoZXZlbnQ6IEtleWJvYXJkRXZlbnQgfCBNb3VzZUV2ZW50KTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkgJiYgdGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KFxuICAgICAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50XG4gICAgICAgICAgKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaXNNb2JpbGVEaXNwbGF5KCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoTW9iaWxlKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSk7XG4gIH1cblxuICBpc1RhYmxldERpc3BsYXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIG9uT3JpZ2luT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24ub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCAmJiAhdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlTWF4aW1pemUoKTtcbiAgICB9XG5cbiAgICB0aGlzLm9yaWdpbk9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcblxuICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xuICB9XG5cbiAgdmFsaWRhdGVBaXJwb3J0VmFsdWVzKCk6IGJvb2xlYW4ge1xuICAgIGlmICghdGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IG9yaWdpblNuYXBzaG90ID0gdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbjtcbiAgICBjb25zdCBkZXN0aW5hdGlvblNuYXBzaG90ID0gdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uO1xuICAgIGlmIChcbiAgICAgIG9yaWdpblNuYXBzaG90ICYmXG4gICAgICBkZXN0aW5hdGlvblNuYXBzaG90ICYmXG4gICAgICBvcmlnaW5TbmFwc2hvdC5jb2RlICYmXG4gICAgICBvcmlnaW5TbmFwc2hvdC5jb2RlLmxlbmd0aCAmJlxuICAgICAgZGVzdGluYXRpb25TbmFwc2hvdC5jb2RlICYmXG4gICAgICBkZXN0aW5hdGlvblNuYXBzaG90LmNvZGUubGVuZ3RoXG4gICAgKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdXBkYXRlTWF4aW1pemUoKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm1heGltaXplID0gdGhpcy52YWxpZGF0ZUFpcnBvcnRWYWx1ZXMoKTtcbiAgICB9KTtcbiAgfVxuXG4gIG9uRGVzdGluYXRpb25PcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICF0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1heGltaXplKCk7XG4gICAgfVxuICAgIHRoaXMuZGVzdGluYXRpb25PcGVuQ2hhbmdlLmVtaXQob3Blbik7XG4gIH1cblxuICBvblBhc3NlbmdlclNlbGVjdE9wZW4oKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuUGFzc2VuZ2VyU2VsZWN0ID0gIXRoaXMub3BlblBhc3NlbmdlclNlbGVjdDtcbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3Blbikge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3Blbikge1xuICAgICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnBhc3NlbmdlclNlbGVjdE9wZW5DaGFuZ2UuZW1pdCh0aGlzLm9wZW5QYXNzZW5nZXJTZWxlY3QpO1xuXG4gICAgaWYgKHRoaXMub3BlblBhc3NlbmdlclNlbGVjdCkge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdD8ubnVtYmVyRmllbGRzLmZpcnN0KSB7XG4gICAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3QubnVtYmVyRmllbGRzLmZpcnN0LmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgICAgfSwgMzAwKTtcbiAgICB9XG4gIH1cblxuICBvblRyaXBTd2l0Y2hPcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50cmlwU3dpdGNoRm9jdXNUaW1lb3V0KTtcblxuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBvcGVuO1xuXG4gICAgaWYgKG9wZW4pIHtcbiAgICAgIHRoaXMudHJpcFN3aXRjaEZvY3VzVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnRyaXBUeXBlUm91bmRUcmlwLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25UcmFuc2l0U3dpdGNoT3BlbihvcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3QgPSAhdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3Q7XG4gICAgY2xlYXJUaW1lb3V0KHRoaXMudHJhbnNpdFN3aXRjaEZvY3VzVGltZW91dCk7XG5cbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gb3BlbjtcbiAgICB9XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJhbnNpdFR5cGVUcmFuc2l0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDIwMCk7XG4gICAgfVxuICB9XG5cbiAgb25PcmlnaW5DaGFuZ2UoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5vcmlnaW5DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldFNlbGVjdGVkT3JpZ2luQWlycG9ydChhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICBpZiAoIWFpcnBvcnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm9uT3JpZ2luQ2hhbmdlKGFpcnBvcnQpO1xuXG4gICAgaWYgKHRoaXMub3JpZ2luQWlycG9ydENvZGUgPT09IGFpcnBvcnQuY29kZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSBhaXJwb3J0LmNvZGU7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBvbkRlc3RpbmF0aW9uQ2hhbmdlKGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdGluYXRpb25DaGFuZ2UuZW1pdChhaXJwb3J0KTtcbiAgfVxuXG4gIHNldEZvY3VzT25QYXNzZW5nZXJTZWxlY3QoZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKCg8YW55PnRoaXMuZGF0ZXBpY2tlckNvbWJvLmRhdGVwaWNrZXJPdXRib3VuZCkuaW5wdXQpO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vblRyaXBTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgICB0aGlzLmZvY3VzQXN5bmModGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5pc1RhYmxldERpc3BsYXkoKSAmJiB0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICBjb25zdCBjdXJyZW50RWxlbWVudFJlZiA9IHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudDtcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KGN1cnJlbnRFbGVtZW50UmVmKSk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBzZXRGb2N1c09uTmF0aXZlRWxlbWVudChlbGVtZW50OiBFbGVtZW50UmVmKTogdm9pZCB7XG4gICAgZWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gIH1cblxuICBvblRyaXBUeXBlQ2hhbmdlKHRyaXBUeXBlOiBUcmlwVHlwZSk6IHZvaWQge1xuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYodGhpcy50cmlwVHlwZSA9PT0gdHJpcFR5cGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZih0aGlzLnRyaXBUeXBlSW5pdCkge1xuICAgICAgdGhpcy50cmlwVHlwZSA9IHRoaXMuZGVmYXVsdFRyaXBUeXBlO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLnRyaXBUeXBlID0gdHJpcFR5cGU7XG4gICAgfVxuICAgIFxuICAgIGlmICh0aGlzLm5hc0Zvcm1Hcm91cCAmJiB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlKSB7XG4gICAgICBjb25zdCB0cmlwU3dpdGNoQ29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldChcbiAgICAgICAgdGhpcy5uYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZVxuICAgICAgKTtcbiAgICAgIHRyaXBTd2l0Y2hDb250cm9sLnBhdGNoVmFsdWUodGhpcy50cmlwVHlwZSk7XG4gICAgfVxuXG4gICAgdGhpcy50cmlwVHlwZUluaXQgPSBmYWxzZTtcbiAgfVxuXG4gIG9uVHJhbnNpdENoYW5nZShkaXJlY3RPbmx5OiBib29sZWFuKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcmVjdE9ubHkgPSBkaXJlY3RPbmx5O1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHlcbiAgICAgICk7XG4gICAgICB0cmlwVHlwZUNvbnRyb2wucGF0Y2hWYWx1ZShkaXJlY3RPbmx5KTtcbiAgICB9XG4gICAgdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3QgPSAhdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3Q7XG4gIH1cblxuICBnZXRUcmF2ZWxEZXRhaWxzVHJpcFN3aXRjaEljb25DbGFzcyhtb2RpZmllcnM/OiBhbnkpOiBBcnJheTxDbGFzc01vZGVsPiB7XG4gICAgY29uc3QgaWNvbk1lZGl1bUJhc2UgPSBuZXcgTmFzQ29tcG9uZW50QmFzZSgnaWNvbi1tZWRpdW0nKTtcblxuICAgIHJldHVybiBbXG4gICAgICBpY29uTWVkaXVtQmFzZS5nZXRDbGFzcygnJywgbW9kaWZpZXJzKSxcbiAgICAgIHRoaXMuZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdpY29uJyksXG4gICAgXTtcbiAgfVxuXG4gIGdldFRyaXBTd2l0Y2hMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlID09PSBUcmlwVHlwZS50d29XYXlSZXR1cm5cbiAgICAgID8gdGhpcy50cmlwU3dpdGNoUm91bmRUcmlwTGFiZWxcbiAgICAgIDogdGhpcy50cmlwU3dpdGNoT25lV2F5TGFiZWw7XG4gIH1cblxuICBnZXRUcmFuc2l0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RPbmx5ID8gdGhpcy5kaXJlY3RPbmx5TGFiZWwgOiB0aGlzLmRpcmVjdFRyYW5zaXRMYWJlbDtcbiAgfVxuXG4gIG9uQWNjb3JkaW9uVG9nZ2xlQ2hhbmdlKGV4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3VtbWFyeSA9ICFleHBhbmRlZDtcbiAgfVxuXG4gIGdldFN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgYCR7dGhpcy5wYXNzZW5nZXJTZWxlY3RMYWJlbH0ke3RoaXMuZGVmYXVsdFN1bW1hcnlTZXBhcmF0b3J9YCArXG4gICAgICBgJHt0aGlzLmdldFRyaXBTd2l0Y2hMYWJlbCgpLnRvTG93ZXJDYXNlKCl9JHt0aGlzLmxhc3RTdW1tYXJ5U2VwYXJhdG9yXG4gICAgICB9JHt0aGlzLmdldFRyYW5zaXRMYWJlbCgpLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gIH1cblxuICBzaG91bGRNYXhpbWl6ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0ICYmXG4gICAgICB0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGUgJiZcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbiAmJlxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICF0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICh0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiB8fCB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW1pemU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSkge1xuICAgICAgaWYgKHRoaXMubWF4aW1pemUpIHtcbiAgICAgICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNOYXNHcm91cFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmFpcnBvcnRTZWxlY3QuY29tYm8pKSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25EZXN0aW5hdGlvbk9wZW4odHJ1ZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bkRlc3RpbmF0aW9uLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbk9yaWdpbk9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmMoXG4gICAgICAgICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TGF0ZXN0U2VhcmNoZXMoYWJhbmRvbmVkQmFza2V0OiBBcnJheTxBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWw+LCBhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPik6IHZvaWQge1xuICAgIGlmICghYWJhbmRvbmVkQmFza2V0IHx8ICFhaXJwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBBcnJheTxBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWJhbmRvbmVkQmFza2V0KSB7XG4gICAgICBpZiAoIXVuaXF1ZS5zb21lKCh4KSA9PiB4LmRlc3RpbmF0aW9uQ29kZSA9PT0gaXRlbS5kZXN0aW5hdGlvbkNvZGUpKSB7XG4gICAgICAgIHVuaXF1ZS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbkNvZGVzID0gdW5pcXVlLm1hcCgoeCkgPT4geC5vcmlnaW5Db2RlKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkNvZGVzID0gdW5pcXVlLm1hcCgoeCkgPT4geC5kZXN0aW5hdGlvbkNvZGUpO1xuXG4gICAgY29uc3QgbGF0ZXN0U2VhcmNoZXNPcmlnaW4gPSBhaXJwb3J0cy5maWx0ZXIoKGFpcnBvcnQpID0+XG4gICAgICB1bmlxdWUuc29tZShcbiAgICAgICAgKHgpID0+IHgub3JpZ2luQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uID0gYWlycG9ydHMuZmlsdGVyKChhaXJwb3J0KSA9PlxuICAgICAgdW5pcXVlLnNvbWUoXG4gICAgICAgICh4KSA9PiB4LmRlc3RpbmF0aW9uQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBjb2RlID0gJ2NvZGUnO1xuICAgIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4gPSB0aGlzLnNvcnRTZXJ2aWNlXG4gICAgICAuc29ydEJ5T2JqZWN0KGxhdGVzdFNlYXJjaGVzT3JpZ2luLCBvcmlnaW5Db2RlcywgY29kZSlcbiAgICAgIC5zbGljZSgwLCAzKTtcblxuICAgIGlmICh0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luICYmIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4ubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5leGlzdHModGhpcy5vdmVycmlkZU9yaWdpbikpIHtcbiAgICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSB0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luWzBdLmNvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5sYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uID0gdGhpcy5zb3J0U2VydmljZVxuICAgICAgLnNvcnRCeU9iamVjdChsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbkNvZGVzLCBjb2RlKVxuICAgICAgLnNsaWNlKDAsIDMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZURyb3Bkb3ducygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPG5hcy1hY2NvcmRpb24gKm5nSWY9XCJkZXZpY2VIZWxwZXI/LmlzTW9iaWxlKCkgJiYgZXhpc3RzKG1pbmltaXplT25Nb2JpbGUpOyBlbHNlIGZpbHRlclRlbXBsYXRlXCIgc2ltcGxlXG4gIGNvbnRhaW5lck9uVG9nZ2xlIHRyYW5zcGFyZW50IFtleHBhbmRlZF09XCJleHBhbmRlZEFjY29yZGlvbk1vYmlsZVwiIFt0aXRsZV09XCJlZGl0U2VhcmNoVGl0bGVcIlxuICAodG9nZ2xlQ2hhbmdlKT1cIm9uQWNjb3JkaW9uVG9nZ2xlQ2hhbmdlKCRldmVudClcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25hcy1hY2NvcmRpb24+XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCIgKm5nSWY9XCJkZXZpY2VIZWxwZXI/LmlzTW9iaWxlKCkgJiYgZXhpc3RzKG1pbmltaXplT25Nb2JpbGUpICYmIGRpc3BsYXlTdW1tYXJ5XCI+e3tnZXRTdW1tYXJ5KCl9fVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyVGVtcGxhdGU+XG4gIDxkaXYgI2NvbnRhaW5lciBbbmFzQ2xhc3NdPVwiZ2V0Q29udGFpbmVyQ2xhc3MoKVwiPlxuICAgIDxkaXYgW25hc0NsYXNzXT1cImdldEZpbHRlckNsYXNzKCdmaWx0ZXJzJywgW2V4aXN0cyhtaW5pbWl6ZSkgJiYgJ21pbmltaXplZCddKVwiPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImFpcnBvcnRzPy5sZW5ndGggPiAwXCI+XG4gICAgICAgIDxuYXMtYWlycG9ydC1zZWxlY3QgKm5nSWY9XCJhaXJwb3J0cyAmJiBhaXJwb3J0UmVsYXRpb25zICYmIChlbmFibGVEZXN0aW5hdGlvblNlbGVjdClcIiAjYWlycG9ydFNlbGVjdCBjb21ib1xuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2xvd2VyLXotaW5kZXgnOiBvcGVuUGFzc2VuZ2VyU2VsZWN0IHx8IGluYm91bmRPcGVuIHx8IG91dGJvdW5kT3BlbiB9XCIgXG4gICAgICAgICAgW291dGJvdW5kSWRdPVwiYWlycG9ydFNlbGVjdE91dGJvdW5kSWRcIiBbaW5ib3VuZElkXT1cImFpcnBvcnRTZWxlY3RJbmJvdW5kSWRcIiBbYXJpYUxhYmVsQ2xlYXJdPVwiYXJpYUxhYmVsQ2xlYXJcIiBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIiBbbmFzRm9ybUdyb3VwXT1cIm5hc0Zvcm1Hcm91cFwiXG4gICAgICAgICAgW25hc0Zvcm1Db250cm9sTmFtZU9yaWdpbl09XCJuYXNGb3JtQ29udHJvbE5hbWVPcmlnaW5cIlxuICAgICAgICAgIFtuYXNGb3JtQ29udHJvbE5hbWVEZXN0aW5hdGlvbl09XCJuYXNGb3JtQ29udHJvbE5hbWVEZXN0aW5hdGlvblwiIFt1c2VTd2l0Y2hdPVwidXNlU3dpdGNoXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0QWlycG9ydFNlbGVjdENsYXNzKClcIiBbYWlycG9ydHNdPVwiYWlycG9ydHNcIiBbYWxsb3dlZE9yaWdpbkFpcG9ydHNdPVwiYWxsb3dlZE9yaWdpbkFpcnBvcnRzXCJcbiAgICAgICAgICBbYWxsb3dlZERlc3RpbmF0aW9uQWlycG9ydHNdPVwiYWxsb3dlZERlc3RpbmF0aW9uQWlycG9ydHNcIiBbYWlycG9ydFJlbGF0aW9uc109XCJhaXJwb3J0UmVsYXRpb25zXCJcbiAgICAgICAgICBbbGF0ZXN0U2VhcmNoZXNPcmlnaW5dPVwibGF0ZXN0U2VhcmNoZXNPcmlnaW5cIiBbbGF0ZXN0U2VhcmNoZXNEZXN0aW5hdGlvbl09XCJsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uXCJcbiAgICAgICAgICBbZGlzcGxheUxhdGVzdFNlYXJjaGVzXT1cImRpc3BsYXlMYXRlc3RTZWFyY2hlc1wiIFtkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzXT1cImRpc3BsYXlDbG9zZXN0QWlycG9ydHNcIlxuICAgICAgICAgIFtvcmlnaW5BaXJwb3J0Q29kZV09XCJvcmlnaW5BaXJwb3J0Q29kZVwiIFtkZXN0aW5hdGlvbkFpcnBvcnRDb2RlXT1cImRlc3RpbmF0aW9uQWlycG9ydENvZGVcIlxuICAgICAgICAgIFthbGxBaXJwb3J0c0xhYmVsXT1cImFsbEFpcnBvcnRzTGFiZWxcIiBbbGF0ZXN0U2VhcmNoZXNMYWJlbF09XCJsYXRlc3RTZWFyY2hlc0xhYmVsXCJcbiAgICAgICAgICBbY2xvc2VzdEFpcnBvcnRzTGFiZWxdPVwiY2xvc2VzdEFpcnBvcnRzTGFiZWxcIiBbY2xvc2VzdEFpcnBvcnRzXT1cImNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgICAgW3NlbGVjdE9yaWdpbkZpcnN0TGFiZWxdPVwic2VsZWN0T3JpZ2luRmlyc3RMYWJlbFwiIFtsYWJlbE9yaWdpbl09XCJsYWJlbE9yaWdpblwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyT3JpZ2luXT1cInBsYWNlaG9sZGVyT3JpZ2luXCIgW2xhYmVsRGVzdGluYXRpb25dPVwibGFiZWxEZXN0aW5hdGlvblwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uTGFiZWxdPVwiZ2VvbG9jYXRpb25MYWJlbFwiIFtnZW9sb2NhdGlvbkJsb2NrZWRMYWJlbF09XCJnZW9sb2NhdGlvbkJsb2NrZWRMYWJlbFwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyRGVzdGluYXRpb25dPVwicGxhY2Vob2xkZXJEZXN0aW5hdGlvblwiIFtrZWVwU2VsZWN0aW9uXT1cImtlZXBTZWxlY3Rpb25cIlxuICAgICAgICAgIFtpbnZhbGlkRGVzdGluYXRpb25UZXh0XT1cImludmFsaWREZXN0aW5hdGlvblRleHRcIiAob3JpZ2luQ2hhbmdlKT1cInNldFNlbGVjdGVkT3JpZ2luQWlycG9ydCgkZXZlbnQpXCJcbiAgICAgICAgICAoZGVzdGluYXRpb25DaGFuZ2UpPVwib25EZXN0aW5hdGlvbkNoYW5nZSgkZXZlbnQpXCIgKGZvY3VzT25OZXh0KT1cInNldEZvY3VzT25QYXNzZW5nZXJTZWxlY3QoJGV2ZW50KVwiXG4gICAgICAgICAgKG9yaWdpbk9wZW5DaGFuZ2UpPVwib25PcmlnaW5PcGVuKCRldmVudClcIiAoZGVzdGluYXRpb25PcGVuQ2hhbmdlKT1cIm9uRGVzdGluYXRpb25PcGVuKCRldmVudClcIlxuICAgICAgICAgIChwb3NpdGlvbkNoYW5nZSk9XCJnZXRDbG9zZXN0QWlycG9ydHMoJGV2ZW50KVwiPjwvbmFzLWFpcnBvcnQtc2VsZWN0PlxuICAgICAgICA8bmFzLWFpcnBvcnQtc2VsZWN0ICpuZ0lmPVwiYWlycG9ydHMgJiYgKCFlbmFibGVEZXN0aW5hdGlvblNlbGVjdClcIiAjYWlycG9ydFNlbGVjdFxuICAgICAgICAgIFtuZ0NsYXNzXT1cInsgJ2xvd2VyLXotaW5kZXgnOiBvcGVuUGFzc2VuZ2VyU2VsZWN0IHx8IGluYm91bmRPcGVuIHx8IG91dGJvdW5kT3BlbiB9XCJcbiAgICAgICAgICBbb3V0Ym91bmRJZF09XCJhaXJwb3J0U2VsZWN0T3V0Ym91bmRJZFwiIFthcmlhTGFiZWxDbGVhcl09XCJhcmlhTGFiZWxDbGVhclwiIFthcmlhTGFiZWxCYWNrZHJvcF09XCJhcmlhTGFiZWxCYWNrZHJvcFwiIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luXT1cIm5hc0Zvcm1Db250cm9sTmFtZU9yaWdpblwiIFt1c2VTd2l0Y2hdPVwidXNlU3dpdGNoXCJcbiAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2FpcnBvcnQtb3JpZ2luLXNlbGVjdCcpXCIgW2FpcnBvcnRzXT1cImFpcnBvcnRzXCJcbiAgICAgICAgICBbYWxsb3dlZE9yaWdpbkFpcG9ydHNdPVwiYWxsb3dlZE9yaWdpbkFpcnBvcnRzXCIgW2FpcnBvcnRSZWxhdGlvbnNdPVwiYWlycG9ydFJlbGF0aW9uc1wiXG4gICAgICAgICAgW2xhdGVzdFNlYXJjaGVzT3JpZ2luXT1cImxhdGVzdFNlYXJjaGVzT3JpZ2luXCIgW2Rpc3BsYXlMYXRlc3RTZWFyY2hlc109XCJkaXNwbGF5TGF0ZXN0U2VhcmNoZXNcIlxuICAgICAgICAgIFtkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzXT1cImRpc3BsYXlDbG9zZXN0QWlycG9ydHNcIiBbb3JpZ2luQWlycG9ydENvZGVdPVwib3JpZ2luQWlycG9ydENvZGVcIlxuICAgICAgICAgIFthbGxBaXJwb3J0c0xhYmVsXT1cImFsbEFpcnBvcnRzTGFiZWxcIiBbbGF0ZXN0U2VhcmNoZXNMYWJlbF09XCJsYXRlc3RTZWFyY2hlc0xhYmVsXCJcbiAgICAgICAgICBbY2xvc2VzdEFpcnBvcnRzTGFiZWxdPVwiY2xvc2VzdEFpcnBvcnRzTGFiZWxcIiBbY2xvc2VzdEFpcnBvcnRzXT1cImNsb3Nlc3RBaXJwb3J0c1wiXG4gICAgICAgICAgW3NlbGVjdE9yaWdpbkZpcnN0TGFiZWxdPVwic2VsZWN0T3JpZ2luRmlyc3RMYWJlbFwiIFtsYWJlbE9yaWdpbl09XCJsYWJlbE9yaWdpblwiXG4gICAgICAgICAgW3BsYWNlaG9sZGVyT3JpZ2luXT1cInBsYWNlaG9sZGVyT3JpZ2luXCIgW2dlb2xvY2F0aW9uTGFiZWxdPVwiZ2VvbG9jYXRpb25MYWJlbFwiXG4gICAgICAgICAgW2dlb2xvY2F0aW9uQmxvY2tlZExhYmVsXT1cImdlb2xvY2F0aW9uQmxvY2tlZExhYmVsXCIgW2tlZXBTZWxlY3Rpb25dPVwia2VlcFNlbGVjdGlvblwiXG4gICAgICAgICAgKG9yaWdpbkNoYW5nZSk9XCJzZXRTZWxlY3RlZE9yaWdpbkFpcnBvcnQoJGV2ZW50KVwiIChmb2N1c09uTmV4dCk9XCJzZXRGb2N1c09uUGFzc2VuZ2VyU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIChvcmlnaW5PcGVuQ2hhbmdlKT1cIm9uT3JpZ2luT3BlbigkZXZlbnQpXCIgKHBvc2l0aW9uQ2hhbmdlKT1cImdldENsb3Nlc3RBaXJwb3J0cygkZXZlbnQpXCI+PC9uYXMtYWlycG9ydC1zZWxlY3Q+XG4gICAgICAgIDxuYXMtc3VnZ2VzdGlvbnMgKm5nSWY9XCIoY2xvc2VzdEFpcnBvcnRzIHx8IGxhdGVzdFNlYXJjaGVzT3JpZ2luKSAmJiBleGlzdHMoZW5hYmxlU3VnZ2VzdGlvbnMpXCJcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb3dlci16LWluZGV4Jzogb3BlblBhc3NlbmdlclNlbGVjdCB8fCBpbmJvdW5kT3BlbiB8fCBvdXRib3VuZE9wZW4gfVwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldEZpbHRlckNsYXNzKCdzdWdnZXN0aW9ucycsICFleGlzdHMoZW5hYmxlRGF0ZXBpY2tlcnMpICYmICdmbGV4LWVuZCcpXCIgW3N1Z2dlc3Rpb25zXT1cImdldFN1Z2dlc3Rpb25zKClcIiBbb3JMYWJlbF09XCJvckxhYmVsXCJcbiAgICAgICAgICAoYWlycG9ydFNlbGVjdCk9XCJzZXRTZWxlY3RlZE9yaWdpbkFpcnBvcnQoJGV2ZW50KVwiPjwvbmFzLXN1Z2dlc3Rpb25zPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwic2hvdWxkTWF4aW1pemUoKVwiPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlUGFzc2VuZ2Vyc1NlbGVjdFwiPlxuICAgICAgICAgIDxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCdwYXNzZW5nZXJzJylcIj5cbiAgICAgICAgICAgIDxidXR0b24gKGNsaWNrKT1cIm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigkZXZlbnQpXCIgW2lkXT1cInBhc3NlbmdlclNlbGVjdElkXCJcbiAgICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdwYXNzZW5nZXJzLWJ1dHRvbicsIG9wZW5QYXNzZW5nZXJTZWxlY3QgJiYgJ2FjdGl2ZScpXCI+XG4gICAgICAgICAgICAgIDxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCdsYWJlbCcpXCI+XG4gICAgICAgICAgICAgICAgPHAgW25hc0NsYXNzXT1cImdldENsYXNzKCdidXR0b24tdGl0bGUnKVwiPnt7cGFzc2VuZ2Vyc1RpdGxlTGFiZWx9fTwvcD5cbiAgICAgICAgICAgICAgICA8cD57e3Bhc3NlbmdlclNlbGVjdExhYmVsfX08L3A+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8ZGl2IFtuYXNDbGFzc109XCJnZXRDbGFzcygndHJhdmVsZXItaWNvbicpXCI+PG5hcy1pY29uIFtpY29uXT1cIidteS1wcm9maWxlLWNvbXBhY3QnXCJcbiAgICAgICAgICAgICAgICAgIFt0eXBlXT1cIidzbWFsbCdcIj48L25hcy1pY29uPjwvZGl2PlxuICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3BlblBhc3NlbmdlclNlbGVjdFwiIFtuYXNDbGFzc109XCJnZXRDbGFzcygncGFzc2VuZ2Vycy1zZWxlY3Rpb24nKVwiPlxuICAgICAgICAgICAgICA8bmFzLXBhc3Nlbmdlci1zZWxlY3QgW2FyaWFMYWJlbEFkZF09XCJhcmlhTGFiZWxBZGRcIiBbYXJpYUxhYmVsU3VidHJhY3RdPVwiYXJpYUxhYmVsU3VidHJhY3RcIlxuICAgICAgICAgICAgICAgIFthZHVsdHNMYWJlbF09XCJwYXNzZW5nZXJTZWxlY3RBZHVsdHNMYWJlbFwiIFt5b3V0aHNMYWJlbF09XCJwYXNzZW5nZXJTZWxlY3RZb3V0aHNMYWJlbFwiXG4gICAgICAgICAgICAgICAgW3lvdW5nQWR1bHRzTGFiZWxdPVwicGFzc2VuZ2VyU2VsZWN0WW91bmdBZHVsdHNMYWJlbFwiIFtjaGlsZHJlbkxhYmVsXT1cInBhc3NlbmdlclNlbGVjdENoaWxkcmVuTGFiZWxcIlxuICAgICAgICAgICAgICAgIFtpbmZhbnRzTGFiZWxdPVwicGFzc2VuZ2VyU2VsZWN0SW5mYW50c0xhYmVsXCIgW21heFBheENvdW50XT1cIm1heFBheENvdW50XCJcbiAgICAgICAgICAgICAgICBbbWluQWR1bHRDb3VudF09XCJtaW5BZHVsdENvdW50XCIgW3RpdGxlXT1cInBhc3NlbmdlclNlbGVjdFRpdGxlXCIgW25hc0Zvcm1Hcm91cF09XCJuYXNGb3JtR3JvdXBcIlxuICAgICAgICAgICAgICAgIFtuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZ109XCJuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZ1wiIFtncm91cEJvb2tpbmdMYWJlbF09XCJncm91cEJvb2tpbmdMYWJlbFwiXG4gICAgICAgICAgICAgICAgW2dyb3VwQm9va2luZ0xpbWl0XT1cImdyb3VwQm9va2luZ0xpbWl0XCIgKGZvY3VzT25OZXh0KT1cIm9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25OZXh0KClcIlxuICAgICAgICAgICAgICAgIChmb2N1c09uUHJldmlvdXMpPVwib25QYXNzZW5nZXJzU2VsZWN0Rm9jdXNPblByZXZpb3VzKClcIlxuICAgICAgICAgICAgICAgIFsocGFzc2VuZ2VycyldPVwicGFzc2VuZ2Vyc1wiPjwvbmFzLXBhc3Nlbmdlci1zZWxlY3Q+XG4gICAgICAgICAgICAgICAgIDxuYXMtYmFja2Ryb3AgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCJcbiAgICAgICAgICAgICAgICBbKHNob3dCYWNrZHJvcCldPVwib3BlblBhc3NlbmdlclNlbGVjdFwiPjwvbmFzLWJhY2tkcm9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlVHJpcFN3aXRjaFwiPlxuICAgICAgICAgIDxmb3JtIFtuYXNDbGFzc109XCJnZXRDbGFzcygncmFkaW8nLCAhZXhpc3RzKGVuYWJsZURhdGVwaWNrZXJzKSAmJiAnZmxleC1lbmQnKVwiPlxuICAgICAgICAgICAgPG5hcy1yYWRpbyAjdHJpcFR5cGVSb3VuZFRyaXAgW2lkXT1cInRyaXBUeXBlSW5wdXRJZCArICdfX3JvdW5kLXRyaXAnXCIgW25hbWVdPVwiJ3RyaXBUeXBlJ1wiIFt2YWx1ZV09XCIyXCIgKGNoZWNrZWRDaGFuZ2UpPVwib25UcmlwVHlwZUNoYW5nZSgyKVwiIFtjaGVja2VkXT1cImRlZmF1bHRUcmlwVHlwZSA9PT0gMlwiPlxuICAgICAgICAgICAgICB7e3RyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbH19XG4gICAgICAgICAgICA8L25hcy1yYWRpbz5cbiAgICAgICAgICAgIDxuYXMtcmFkaW8gI3RyaXBUeXBlT25ld2F5IFtpZF09XCJ0cmlwVHlwZUlucHV0SWQgKyAnX19vbmUtd2F5J1wiIFtuYW1lXT1cIid0cmlwVHlwZSdcIiBbdmFsdWVdPVwiMVwiIChjaGVja2VkQ2hhbmdlKT1cIm9uVHJpcFR5cGVDaGFuZ2UoMSlcIiBbY2hlY2tlZF09XCJkZWZhdWx0VHJpcFR5cGUgPT09IDFcIj5cbiAgICAgICAgICAgICAge3t0cmlwU3dpdGNoT25lV2F5TGFiZWx9fVxuICAgICAgICAgICAgPC9uYXMtcmFkaW8+XG4gICAgICAgICAgPC9mb3JtPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV4aXN0cyhlbmFibGVEYXRlcGlja2VycylcIj5cbiAgICAgICAgICA8ZGl2IFtuYXNDbGFzc109XCJnZXREYXRlUGlja2Vyc0NsYXNzKClcIj5cbiAgICAgICAgICAgIDxuYXMtZGF0ZXBpY2tlci1jb21ibyAjZGF0ZXBpY2tlckNvbWJvIGNvbXBhY3QgXG4gICAgICAgICAgICAgIFtvdXRib3VuZElkXT1cImRhdGVQaWNrZXJPdXRib3VuZElkXCIgW2luYm91bmRJZF09XCJkYXRlUGlja2VySW5ib3VuZElkXCIgW2lubGluZUZsZXhdPVwiaW5saW5lRmxleFwiIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICAgICAgW25hc0Zvcm1Db250cm9sTmFtZU91dGJvdW5kXT1cIm5hc0Zvcm1Db250cm9sTmFtZU91dGJvdW5kXCJcbiAgICAgICAgICAgICAgW25hc0Zvcm1Db250cm9sTmFtZUluYm91bmRdPVwibmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZFwiIFthdmFpbGFiaWxpdHldPVwiYXZhaWxhYmlsaXR5XCJcbiAgICAgICAgICAgICAgW2F2YWlsYWJsZUZsaWdodHNMYWJlbF09XCJhdmFpbGFibGVGbGlnaHRzTGFiZWxcIiBbZGF0ZURpc3BsYXlGb3JtYXRdPVwiZGF0ZURpc3BsYXlGb3JtYXRcIlxuICAgICAgICAgICAgICBbZGlzYWJsZVBhc3RTZWxlY3Rpb25dPVwiZGlzYWJsZVBhc3RTZWxlY3Rpb25cIiBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICAgIFtub0F2YWlsYWJsZUZsaWdodHNMYWJlbF09XCJub0F2YWlsYWJsZUZsaWdodHNMYWJlbFwiIFtpbmJvdW5kQXZhaWxhYmxlRGF0ZXNdPVwiaW5ib3VuZEF2YWlsYWJsZURhdGVzXCJcbiAgICAgICAgICAgICAgW2luYm91bmRMYWJlbF09XCJpbmJvdW5kTGFiZWxcIiBbbm9BdmFpbGFibGVGbGlnaHRzTGFiZWxdPVwibm9BdmFpbGFibGVGbGlnaHRzTGFiZWxcIlxuICAgICAgICAgICAgICBbb3V0Ym91bmRBdmFpbGFibGVEYXRlc109XCJvdXRib3VuZEF2YWlsYWJsZURhdGVzXCIgW291dGJvdW5kTGFiZWxdPVwib3V0Ym91bmRMYWJlbFwiXG4gICAgICAgICAgICAgIFt0aW1lRGlzcGxheUZvcm1hdF09XCJ0aW1lRGlzcGxheUZvcm1hdFwiIFt0aW1lc109XCJ0aW1lc1wiIFtvdXRib3VuZERpc2FibGVkXT1cIm91dGJvdW5kRGlzYWJsZWRcIlxuICAgICAgICAgICAgICBbaW5ib3VuZERpc2FibGVkXT1cImluYm91bmREaXNhYmxlZFwiIFtvdXRib3VuZE9ubHldPVwidHJpcFR5cGUgPT09IDFcIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIiBbYXJpYUxhYmVsUHJldmlvdXNNb250aF09XCJhcmlhTGFiZWxQcmV2aW91c01vbnRoXCJcbiAgICAgICAgICAgICAgW2FyaWFMYWJlbE5leHRNb250aF09XCJhcmlhTGFiZWxOZXh0TW9udGhcIiAoZm9jdXNPbk5leHRDaGFuZ2UpPVwib25Gb2N1c09uTmV4dENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGZvY3VzT25QcmV2aW91c0NoYW5nZSk9XCJvbkRhdGVwaWNrZXJGb2N1c09uUHJldmlvdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAgIChpbmJvdW5kTW9udGhDaGFuZ2UpPVwib25JbmJvdW5kTW9udGhDaGFuZ2UoJGV2ZW50KVwiIChvdXRib3VuZE1vbnRoQ2hhbmdlKT1cIm9uT3V0Ym91bmRNb250aENoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgWyhvdXRib3VuZE9wZW4pXT1cIm91dGJvdW5kT3BlblwiIFsoaW5ib3VuZE9wZW4pXT1cImluYm91bmRPcGVuXCJcbiAgICAgICAgICAgICAgWyhpbmJvdW5kU2VsZWN0ZWREYXRlKV09XCJpbmJvdW5kU2VsZWN0ZWREYXRlXCIgWyhvdXRib3VuZFNlbGVjdGVkRGF0ZSldPVwib3V0Ym91bmRTZWxlY3RlZERhdGVcIj5cbiAgICAgICAgICAgIDwvbmFzLWRhdGVwaWNrZXItY29tYm8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiZW5hYmxlVHJhbnNpdFN3aXRjaFwiPlxuICAgICAgICAgIDxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmFuc2l0LXR5cGUnKVwiPlxuICAgICAgICAgICAgPG5hcy1idXR0b24gKm5nSWY9XCJkaXJlY3RPbmx5TGFiZWwgJiYgZGlyZWN0VHJhbnNpdExhYmVsXCIgI3RyYW5zaXRTd2l0Y2ggYmxvY2sgbGlnaHRcbiAgICAgICAgICAgICAgW2lkXT1cInRyYW5zaXRUeXBlSW5wdXRJZFwiIFtpY29uVHlwZV09XCInY2hldnJvbi1kb3duJ1wiIFtsYWJlbF09XCJnZXRUcmFuc2l0TGFiZWwoKVwiXG4gICAgICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRDbGFzcygndHJhbnNpdCcsIG9wZW5UcmFuc2l0VHlwZVNlbGVjdCAmJiAnYWN0aXZlJylcIlxuICAgICAgICAgICAgICBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIiAoY2xpY2spPVwib25UcmFuc2l0U3dpdGNoT3BlbigkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKGtleWRvd24pPVwidHJhbnNpdEtleURvd24oJGV2ZW50KVwiPnt7IGdldFRyYW5zaXRMYWJlbCgpIH19XG4gICAgICAgICAgICA8L25hcy1idXR0b24+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwib3BlblRyYW5zaXRUeXBlU2VsZWN0XCIgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmFuc2l0LXR5cGUtc2VsZWN0aW9uJylcIj5cbiAgICAgICAgICAgICAgPGJ1dHRvbiBbaWRdPVwidHJhbnNpdFR5cGVJbnB1dElkICsgJ19fZGlyZWN0J1wiIFtuYXNDbGFzc109XCJnZXRUcmF2ZWxEZXRhaWxzQ2xhc3MoJ2FjdGlvbicsIGRpcmVjdE9ubHkgJiYgJ2FjdGl2ZScpXCIgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgI3RyYW5zaXRUeXBlRGlyZWN0T25seSAoY2xpY2spPVwib25UcmFuc2l0Q2hhbmdlKHRydWUpXCI+e3sgZGlyZWN0T25seUxhYmVsIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtpZF09XCJ0cmFuc2l0VHlwZUlucHV0SWQgKyAnX190cmFuc2l0J1wiIHR5cGU9XCJidXR0b25cIiAjdHJhbnNpdFR5cGVUcmFuc2l0XG4gICAgICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldFRyYXZlbERldGFpbHNDbGFzcygnYWN0aW9uJywgIWRpcmVjdE9ubHkgJiYgJ2FjdGl2ZScpXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwib25UcmFuc2l0Q2hhbmdlKGZhbHNlKVwiPnt7IGRpcmVjdFRyYW5zaXRMYWJlbCB9fVxuICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgPG5hcy1iYWNrZHJvcCBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIlxuICAgICAgICAgICAgICAgIFsoc2hvd0JhY2tkcm9wKV09XCJvcGVuVHJhbnNpdFR5cGVTZWxlY3RcIj48L25hcy1iYWNrZHJvcD5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cbjwvbmctdGVtcGxhdGU+Il19
1313
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsdGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUtY29tcG9uZW50cy9zcmMvbGliL2NvbXBvbmVudHMvZmlsdGVyL2ZpbHRlci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlLWNvbXBvbmVudHMvc3JjL2xpYi9jb21wb25lbnRzL2ZpbHRlci9maWx0ZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHO0FBRUgsT0FBTyxFQUVMLFNBQVMsRUFFVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixTQUFTLEdBR1YsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN2QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDbEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sb0NBQW9DLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWV0RSxJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7QUFFZjs7O0dBR0c7QUFNSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxnQkFBZ0I7SUE2Qm5ELElBQUksWUFBWTtRQUNkLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2hDLENBQUM7SUFDRCxJQUFJLFlBQVksQ0FBQyxLQUFjO1FBQzdCLElBQUksSUFBSSxDQUFDLGlCQUFpQixLQUFLLEtBQUssRUFBRTtZQUNwQyxPQUFPO1NBQ1I7UUFFRCxJQUFJLEtBQUssRUFBRTtZQUNULElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUV0QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUU7Z0JBQ3RCLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztnQkFDdEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEdBQUcs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LEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU9HLGVBQWU7c0JBQXZCLEtBQUs7Z0JBT0csaUJBQWlCO3NCQUF6QixLQUFLO2dCQVFHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBUUcsZUFBZTtzQkFBdkIsS0FBSztnQkFRRyxxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBT0csT0FBTztzQkFBZixLQUFLO2dCQU9HLG9CQUFvQjtzQkFBNUIsS0FBSztnQkFPRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBUUYsb0JBQW9CO3NCQUR2QixLQUFLO2dCQXFCRixtQkFBbUI7c0JBRHRCLEtBQUs7Z0JBb0JHLHVCQUF1QjtzQkFBL0IsS0FBSztnQkFPRyxzQkFBc0I7c0JBQTlCLEtBQUs7Z0JBT0csZ0JBQWdCO3NCQUF4QixLQUFLO2dCQU9HLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFPRyx5QkFBeUI7c0JBQWpDLEtBQUs7Z0JBUUcsdUJBQXVCO3NCQUEvQixLQUFLO2dCQVFHLHNCQUFzQjtzQkFBOUIsS0FBSztnQkFRRyxpQkFBaUI7c0JBQXpCLEtBQUs7Z0JBUUcsb0JBQW9CO3NCQUE1QixLQUFLO2dCQVFHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFTRyxVQUFVO3NCQUFsQixLQUFLO2dCQVFHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBT0ksMEJBQTBCO3NCQUFuQyxNQUFNO2dCQU9HLHlCQUF5QjtzQkFBbEMsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBT0csaUJBQWlCO3NCQUExQixNQUFNO2dCQU9HLG1CQUFtQjtzQkFBNUIsTUFBTTtnQkFPRyxrQkFBa0I7c0JBQTNCLE1BQU07Z0JBT0csaUJBQWlCO3NCQUExQixNQUFNO2dCQU9HLGNBQWM7c0JBQXZCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgTm9yd2VnaWFuIEFpciBTaHV0dGxlLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICovXG5cbmltcG9ydCB7XG4gIEFmdGVyVmlld0NoZWNrZWQsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIEFmdGVyVmlld0luaXQsXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBUcmlwVHlwZSB9IGZyb20gJy4vZW51bXMvdHJpcC10eXBlLmVudW0nO1xuaW1wb3J0IHsgTmFzQ29tcG9uZW50QmFzZSB9IGZyb20gJy4uLy4uL2NvcmUvYmFzZS9uYXMtY29tcG9uZW50LmJhc2UnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0SXRlbU1vZGVsIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvYWJhbmRvbmVkLWJhc2tldC1pdGVtLm1vZGVsJztcbmltcG9ydCB7IENsYXNzTW9kZWwgfSBmcm9tICcuLi8uLi9jb3JlL21vZGVscy9jbGFzcy5tb2RlbCc7XG5pbXBvcnQgeyBVdGNEYXRlIH0gZnJvbSAnLi4vLi4vY29yZS9tb2RlbHMvdXRjLWRhdGUubW9kZWwnO1xuaW1wb3J0IHsgQWJhbmRvbmVkQmFza2V0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvYWJhbmRvbmVkLWJhc2tldC9hYmFuZG9uZWQtYmFza2V0LnNlcnZpY2UnO1xuaW1wb3J0IHsgRGF0ZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGF0ZS9kYXRlLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IERldmljZUhlbHBlciB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvZGV2aWNlL2RldmljZS1oZWxwZXIuc2VydmljZSc7XG5pbXBvcnQgeyBTb3J0U2VydmljZSB9IGZyb20gJy4uLy4uL2NvcmUvc2VydmljZXMvc29ydC9zb3J0LnNlcnZpY2UnO1xuaW1wb3J0IHsgQWlycG9ydE1vZGVsIH0gZnJvbSAnLi4vYWlycG9ydC1zZWxlY3QvbW9kZWxzL2FpcnBvcnQubW9kZWwnO1xuaW1wb3J0IHsgRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICcuLi9kcm9wZG93bi9kcm9wZG93bi5jb21wb25lbnQnO1xuaW1wb3J0IHsgUGFzc2VuZ2Vyc01vZGVsIH0gZnJvbSAnLi4vcGFzc2VuZ2VyLXNlbGVjdC9tb2RlbHMvcGFzc2VuZ2Vycy5tb2RlbCc7XG5pbXBvcnQgeyBQYXNzZW5nZXJTZWxlY3RDb21wb25lbnQgfSBmcm9tICcuLi9wYXNzZW5nZXItc2VsZWN0L3Bhc3Nlbmdlci1zZWxlY3QuY29tcG9uZW50JztcbmltcG9ydCB7IERhdGVwaWNrZXJDb21ib0NvbXBvbmVudCB9IGZyb20gJy4uL2RhdGVwaWNrZXItY29tYm8vZGF0ZXBpY2tlci1jb21iby5jb21wb25lbnQnO1xuaW1wb3J0IHsgQWlycG9ydFNlbGVjdENvbXBvbmVudCB9IGZyb20gJy4uL2FpcnBvcnQtc2VsZWN0L2FpcnBvcnQtc2VsZWN0LmNvbXBvbmVudCc7XG5cbmxldCBuZXh0SWQgPSAwO1xuXG4vKipcbiAqIEBkZXNjcmlwdGlvblxuICogTm9yd2VnaWFuIEZpbHRlciBDb21wb25lbnQgfCBGdW5jdGlvbmFsIHwgTmV3IGRlc2lnblxuICovXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduYXMtZmlsdGVyJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2ZpbHRlci5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsczogWycuL2ZpbHRlci5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBGaWx0ZXJDb21wb25lbnQgZXh0ZW5kcyBOYXNDb21wb25lbnRCYXNlIGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdDaGVja2VkLCBBZnRlclZpZXdJbml0IHtcbiAgQFZpZXdDaGlsZCgncGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24nKVxuICBwYXNzZW5nZXJTZWxlY3REcm9wZG93bjogRHJvcGRvd25Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3Bhc3NlbmdlclNlbGVjdCcpIHBhc3NlbmdlclNlbGVjdDogUGFzc2VuZ2VyU2VsZWN0Q29tcG9uZW50O1xuICBAVmlld0NoaWxkKCd0cmlwU3dpdGNoJykgdHJpcFN3aXRjaDogRHJvcGRvd25Db21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ3RyYW5zaXRTd2l0Y2gnKSB0cmFuc2l0U3dpdGNoOiBEcm9wZG93bkNvbXBvbmVudDtcbiAgQFZpZXdDaGlsZCgnYWlycG9ydFNlbGVjdCcpIGFpcnBvcnRTZWxlY3Q6IEFpcnBvcnRTZWxlY3RDb21wb25lbnQ7XG4gIEBWaWV3Q2hpbGQoJ2RhdGVwaWNrZXJDb21ibycpIGRhdGVwaWNrZXJDb21ibzogRGF0ZXBpY2tlckNvbWJvQ29tcG9uZW50O1xuICBAVmlld0NoaWxkKCdjb250YWluZXInKSBjb250YWluZXI6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBUeXBlT25ld2F5JykgdHJpcFR5cGVPbmV3YXk6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyaXBUeXBlUm91bmRUcmlwJykgdHJpcFR5cGVSb3VuZFRyaXA6IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ3RyYW5zaXRUeXBlRGlyZWN0T25seScpIHRyYW5zaXRUeXBlRGlyZWN0T25seTogRWxlbWVudFJlZjtcbiAgQFZpZXdDaGlsZCgndHJhbnNpdFR5cGVUcmFuc2l0JykgdHJhbnNpdFR5cGVUcmFuc2l0OiBFbGVtZW50UmVmO1xuXG4gIGxhdGVzdFNlYXJjaGVzT3JpZ2luOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBkaXNwbGF5U3VtbWFyeSA9IHRydWU7XG4gIG5hdGl2ZUVsZW1lbnQ6IEhUTUxFbGVtZW50O1xuICBpbmJvdW5kTG93ZXJMaW1pdERhdGU6IFV0Y0RhdGU7XG4gIGNvbnRhaW5lcldpZHRoID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDApO1xuICBtYXhpbWl6ZSA9IGZhbHNlO1xuICBpc05hc0dyb3VwVmFsaWQgPSBmYWxzZTtcbiAgaW5saW5lRmxleCA9IDA7XG4gIG9wZW5QYXNzZW5nZXJTZWxlY3QgPSBmYWxzZTtcbiAgb3BlblRyYW5zaXRUeXBlU2VsZWN0ID0gZmFsc2U7XG4gIGNvbXBvbmVudElkOiBudW1iZXI7XG4gIHRyaXBTd2l0Y2hGb2N1c1RpbWVvdXQ6IGFueTtcbiAgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTogYm9vbGVhbjtcblxuICBnZXQgb3V0Ym91bmRPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLm91dGJvdW5kT3BlblZhbHVlO1xuICB9XG4gIHNldCBvdXRib3VuZE9wZW4odmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodGhpcy5vdXRib3VuZE9wZW5WYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bnMoKTtcblxuICAgICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vdXRib3VuZE9wZW5WYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMub3V0Ym91bmRPcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgZ2V0IGluYm91bmRPcGVuKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmluYm91bmRPcGVuVmFsdWU7XG4gIH1cbiAgc2V0IGluYm91bmRPcGVuKHZhbHVlOiBib29sZWFuKSB7XG4gICAgaWYgKHRoaXMuaW5ib3VuZE9wZW5WYWx1ZSA9PT0gdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY2xvc2VEcm9wZG93bnMoKTtcblxuICAgICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY2xlYXJUaW1lb3V0KHRoaXMuaW5ib3VuZE9wZW5UaW1lb3V0IGFzIG51bWJlcik7XG5cbiAgICB0aGlzLmluYm91bmRPcGVuVGltZW91dCA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kT3BlblZhbHVlID0gdmFsdWU7XG4gICAgfSk7XG5cbiAgICB0aGlzLmluYm91bmRPcGVuQ2hhbmdlLmVtaXQodmFsdWUpO1xuICB9XG5cbiAgcHJpdmF0ZSBpbmJvdW5kT3BlblRpbWVvdXQ6IGFueTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSByZWNvcmQgY29udGFpbmluZyBrZXlzIHdpdGggYWxsIGFpcnBvcnQgY29kZXMgd2l0aCBjb3JyZXNwb25kaW5nIGFycmF5IG9mIGFpcnBvcnQgY29kZXMgY29ubmVjdGVkIHRvIHRoZSBrZXkuXG4gICAqL1xuICBASW5wdXQoKSBhaXJwb3J0UmVsYXRpb25zOiBSZWNvcmQ8c3RyaW5nLCBBcnJheTxzdHJpbmc+PjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBZGRzICdhcmlhLWxhYmVsJyBvbiB0aGUgY2xlYXIgYnV0dG9uIGluc2lkZSB0aGUgYWlycG9ydCBzZWxlY3QgaW5wdXRzLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQ2xlYXI6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBUklBIGxhYmVsIGZvciB0aGUgc3VidHJhY3QgYnV0dG9ucy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbFN1YnRyYWN0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWRkcyAnYXJpYS1sYWJlbCcgdG8gdGhlIGJhY2tkcm9wcy5cbiAgICovXG4gIEBJbnB1dCgpIGFyaWFMYWJlbEJhY2tkcm9wOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQVJJQSBsYWJlbCBmb3IgdGhlIGFkZCBidXR0b25zLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsQWRkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsaXN0IG9mIGFpcnBvcnRzIHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZCBpbiB0aGUgb3JpZ2luIGRyb3Bkb3duLlxuICAgKiBJZiBub3QgaW5jbHVkZWQsIGFsbCBhaXJwb3J0cyB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGFsbG93ZWRPcmlnaW5BaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBhcnJheSBvZiBhaXJwb3J0cyB0aGF0IGFyZSByZXN0cmljdGVkIGZvciBkZXN0aW5hdGlvbiBhaXJwb3J0cy4gSXQgd2lsbCBkZWZhdWx0IHRvIGFpcnBvcnRzIGlmIG5vdCBzZXQuXG4gICAqL1xuICBASW5wdXQoKSBhbGxvd2VkRGVzdGluYXRpb25BaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBhaXJwb3J0cyB0aGF0IHRoZSB1c2VyIGFsbHJlYWR5IGhhcyBzZWFyaCBmb3Igc2hvdWxkIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc3BsYXlMYXRlc3RTZWFyY2hlczogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNwbGF5IHN3aXRjaCBVSSB0byBpbnRlcmNoYW5nZSBvcmlnaW4gYW5kIGRlc3RpbmF0aW9uIGFpcnBvcnQuXG4gICAqL1xuICBASW5wdXQoKSB1c2VTd2l0Y2g/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgYm9vbGVhbiBpbmRpY2F0aW5nIGlmIGFpcnBvcnRzIHRoYXQgYXJlIGNsb3NlIHRvIHRoZSB1c2VyIHNob3VsZCBiZSBkaXNwbGF5ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBhaXJwb3J0IGNvZGUgb2YgdGhlIG9yaWdpbiBhaXJwb3J0LiBJdCB3aWxsIHNldCB0aGUgc2VsZWN0ZWQgb3JpZ2luIGFpcnBvcnQgYmFzZWQgb24gdGhpcyB2YWx1ZS5cbiAgICovXG4gIEBJbnB1dCgpIG9yaWdpbkFpcnBvcnRDb2RlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIGFpcnBvcnQgY29kZSBvZiB0aGUgZGVzdGluYXRpb24gYWlycG9ydC4gSXQgd2lsbCBzZXQgdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGFpcnBvcnQgYmFzZWQgb24gdGhpcyB2YWx1ZS5cbiAgICovXG4gIEBJbnB1dCgpIGRlc3RpbmF0aW9uQWlycG9ydENvZGU6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIHRvdGFsIG1heGltdW0gYW1vdW50IG9mIHBhc3NlbmdlcnMgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBtYXhQYXhDb3VudDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGFycmF5IG9mIGRpZmZlcmVudCBwYXNzZW5nZXIgdHlwZXMgdGhhdCB3aWxsIGJlIGRpc3BsYXllZC5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBwYXNzZW5nZXJzKCk6IEFycmF5PFBhc3NlbmdlcnNNb2RlbD4ge1xuICAgIHJldHVybiB0aGlzLnBhc3NlbmdlcnNWYWx1ZTtcbiAgfVxuICBzZXQgcGFzc2VuZ2Vycyh2YWx1ZTogQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPikge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLnBhc3NlbmdlcnNWYWx1ZSA9IHZhbHVlO1xuICAgIHRoaXMucGFzc2VuZ2Vyc0NoYW5nZS5lbWl0KHZhbHVlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBtaW5pbXVtIGFtb3VudCBvZiBhZHVsdHMgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBtaW5BZHVsdENvdW50OiBudW1iZXI7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3Igcm91bmQgdHJpcCBzZWxlY3Rpb24gaW4gdGhlIHRyaXAgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgdHJpcFN3aXRjaFJvdW5kVHJpcExhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3Igb25lIHdheSBzZWxlY3Rpb24gaW4gdGhlIHRyaXAgc3dpdGNoIGRyb3Bkb3duLlxuICAgKi9cbiAgQElucHV0KCkgdHJpcFN3aXRjaE9uZVdheUxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgZGlyZWN0IG9ubHkgc2VsZWN0aW9uIGluIHRoZSB0cmFuc2l0IHN3aXRjaCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIGRpcmVjdE9ubHlMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgZm9yIGJvdGggZGlyZWN0IGFuZCB0cmFuc2l0IHNlbGVjdGlvbiBpbiB0aGUgdHJhbnNpdCBzd2l0Y2ggZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RUcmFuc2l0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmRpY2F0ZXMgaWYgdGhlIGZpbHRlciBzaG91bGQgYmUgbWluaW1pemVkIG9uIG1vYmlsZSBzY3JlZW4gc2l6ZXMuXG4gICAqL1xuICBASW5wdXQoKSBtaW5pbWl6ZU9uTW9iaWxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmRpY2F0ZXMgaWYgYWxsIGlucHV0cyBpbiB0aGUgZmlsdGVyIHNob3VsZCBiZSBmbGV4IGlubGluZS5cbiAgICovXG4gIEBJbnB1dCgpIGlubGluZU9uRGVza3RvcD86IGJvb2xlYW47XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5kaWNhdGVzIGlmIHRoZSBlZGl0IHNlYXJjaCBvZiBhY2NvcmRpb24gc2hvdWxkIGJlIGV4cGVuZGVkIG9uIG1vYmlsZSBzY3JlZW4gc2l6ZXMuXG4gICAqL1xuICBASW5wdXQoKVxuICBnZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZTtcbiAgfVxuICBzZXQgZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGUodmFsdWU6IGJvb2xlYW4pIHtcbiAgICBpZiAodmFsdWUgPT09IHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuZXhwYW5kZWRBY2NvcmRpb25Nb2JpbGVWYWx1ZSA9IHZhbHVlO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBzZXBhcmF0b3IgZm9yIHRoZSBmaWx0ZXIgc3VtbWFyeSB0aGF0IGlzIGRpc3BheWVkIGlmIG1pbmltaXplT25Nb2JpbGUgaXMgdHJ1ZS5cbiAgICpcbiAgICogIyMjIEV4YW1wbGVcbiAgICogMSB0cmF2ZWxsZXIsIHJvdW5kIHRyaXAgYW5kIGRpcmVjdC90cmFuc2l0XG4gICAqL1xuICBASW5wdXQoKSBkZWZhdWx0U3VtbWFyeVNlcGFyYXRvciA9ICcnO1xuXG4gIC8qKlxuICAgKiBBIHNlcGFyYXRvciBmb3IgdGhlIGZpbHRlciBzdW1tYXJ5IGlzIGFyZSBkaXNwYXllZCBpZiBtaW5pbWl6ZU9uTW9iaWxlIGlzIHRydWUuXG4gICAqXG4gICAqICMjIyBFeGFtcGxlXG4gICAqIDEgdHJhdmVsbGVyLCByb3VuZCB0cmlwIGFuZCBkaXJlY3QvdHJhbnNpdFxuICAgKi9cbiAgQElucHV0KCkgbGFzdFN1bW1hcnlTZXBhcmF0b3IgPSAnJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRpdGxlIHRoYXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFRpdGxlOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdXRocyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdXRoc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIHlvdW5nIGFkdWx0cyBwYXNzZW5nZXIgdHlwZSBpbiB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93bi5cbiAgICovXG4gIEBJbnB1dCgpIHBhc3NlbmdlclNlbGVjdFlvdW5nQWR1bHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIGZvciB0aGUgY2hpbGRyZW4gcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RDaGlsZHJlbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCBmb3IgdGhlIGluZmFudHMgcGFzc2VuZ2VyIHR5cGUgaW4gdGhlIHBhc3NlbmdlciBzZWxlY3QgZHJvcGRvd24uXG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RJbmZhbnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgd2hlbiB0b3RhbCBudW1iZXIgb2Ygc2VsZWN0ZWQgcGFzc2VuZ2VycyBleGNlZWRzIHRoZSBncm91cCBib29raW5nIGxpbWl0XG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBvbiB0b3Agb2YgYWxsIGFpcnBvcnRzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBhbGxBaXJwb3J0c0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgbGF0ZXN0IHNlYXJjaGVzIGluIHRoZSBhaXJwb3J0IHNlbGVjdCBkcm9wIGRvd24gbGlzdHMuXG4gICAqL1xuICBASW5wdXQoKSBsYXRlc3RTZWFyY2hlc0xhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgY2xvc2VzdCBhaXJwb3J0cyBpbiB0aGUgYWlycG9ydCBzZWxlY3QgZHJvcCBkb3duIGxpc3RzLlxuICAgKi9cbiAgQElucHV0KCkgY2xvc2VzdEFpcnBvcnRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgaW4gdGhlIGRlc3RpbmF0aW9uIGlucHV0IGZpZWxkIGluIHRoZSBhaXJwb3J0IHNlbGVjdCwgaWYgdGhlXG4gICAqIHVzZXIgdHJpZXMgdG8gc2VsZWN0IGEgZGVzdGluYXRpb24gYWlycG9ydCB3aXRob3V0IHNlbGVjdGluZyBhbiBvcmlnaW4gYWlycG9ydC5cbiAgICovXG4gIEBJbnB1dCgpIHNlbGVjdE9yaWdpbkZpcnN0TGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIG9uIHRvcCBvZiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBsYWJlbE9yaWdpbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgcGxhY2Vob2xkZXIgdGhhdCB3aWxsIGFwcGVhciBvbiB0aGUgb3JpZ2luIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlck9yaWdpbiA9ICcnO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxhYmVsIHRoYXQgd2lsbCBhcHBlYXIgb24gdG9wIG9mIHRoZSBkZXN0aW5hdGlvbiBhaXJwb3J0IGlucHV0IGZpZWxkLlxuICAgKi9cbiAgQElucHV0KCkgbGFiZWxEZXN0aW5hdGlvbjogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgbGFiZWwgdGhhdCB3aWxsIGFwcGVhciBpbiBteSBsb2NhdGlvbiBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QuXG4gICAqL1xuICBASW5wdXQoKSBnZW9sb2NhdGlvbkxhYmVsOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBsYWJlbCB0aGF0IHdpbGwgYXBwZWFyIGluIG15IGxvY2F0aW9uLCBpbiB0aGUgZHJvcCBkb3duIGxpc3QgaW4gYWlycG9ydCBzZWxlY3QgaWYgdXNlciBoYXMgZGVuaWVkIGdlb2xvY2F0aW9uLlxuICAgKi9cbiAgQElucHV0KCkgZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHBsYWNlaG9sZGVyIHRoYXQgd2lsbCBhcHBlYXIgb24gdGhlIGRlc3RpbmF0aW9uIGFpcnBvcnQgaW5wdXQgZmllbGQuXG4gICAqL1xuICBASW5wdXQoKSBwbGFjZWhvbGRlckRlc3RpbmF0aW9uID0gJyc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQSBtb2RpZmllciB0aGF0IHdpbGwgYWxsb3cgYWx3YXlzIGtlZXBpbmcgdGhlIHNlbGVjdGVkIGFpcnBvcnQuXG4gICAqIFRoZSBsYXN0IHNlbGVjdGVkIGFpcnBvcnQgd2lsbCBiZSBzaG93biBvbmNlIHVzZXIgY2xlYXJzIHRoZSBzZWxlY3Rpb24gYW5kIGJsdXIuXG4gICAqL1xuICBASW5wdXQoKSBrZWVwU2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEEgdGl0bGUgdGhhdCB3aWxsIGJlIGFzc2lnbmVkIHRvIGVkaXQgc2VhcmNoIGFjY29yZGlvbi5cbiAgICovXG4gIEBJbnB1dCgpIGVkaXRTZWFyY2hUaXRsZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFkZHMgdGhlIHBhcmVudCdzIGZvcm0gZ3JvdXAuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IGlzIHJlcXVpZXJlZCB0byBiZSBmaWxsZWQgaWYgbmFzRm9ybUNvbnRyb2xOYW1lIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUdyb3VwOiBGb3JtR3JvdXA7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhIGZvcm1Db250cm9sTmFtZSBkaXJlY3RpdmUgdG8gdGhlIGlucHV0LlxuICAgKiBJdCByZXF1aXJlcyB0aGF0IHRoZSBjb25zdW1lciBpbmNsdWRlZCBSZWFjdGl2ZUZvcm1zTW9kdWxlIGluIGl0J3MgbW9kdWxlLlxuICAgKiBJdCByZXF1aWVycyB0aGF0IHRoZSBuYXNGb3JtR3JvdXAgaW5wdXQgaXMgZmlsbGVkLlxuICAgKi9cbiAgQElucHV0KCkgbmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb246IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHk6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNldHMgYSBmb3JtQ29udHJvbE5hbWUgZGlyZWN0aXZlIHRvIHRoZSBpbnB1dC5cbiAgICogSXQgcmVxdWlyZXMgdGhhdCB0aGUgY29uc3VtZXIgaW5jbHVkZWQgUmVhY3RpdmVGb3Jtc01vZHVsZSBpbiBpdCdzIG1vZHVsZS5cbiAgICogSXQgcmVxdWllcnMgdGhhdCB0aGUgbmFzRm9ybUdyb3VwIGlucHV0IGlzIGZpbGxlZC5cbiAgICovXG4gIEBJbnB1dCgpIG5hc0Zvcm1Db250cm9sTmFtZUluYm91bmQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIGEgZm9ybUNvbnRyb2xOYW1lIGRpcmVjdGl2ZSB0byB0aGUgaW5wdXQuXG4gICAqIEl0IHJlcXVpcmVzIHRoYXQgdGhlIGNvbnN1bWVyIGluY2x1ZGVkIFJlYWN0aXZlRm9ybXNNb2R1bGUgaW4gaXQncyBtb2R1bGUuXG4gICAqIEl0IHJlcXVpZXJzIHRoYXQgdGhlIG5hc0Zvcm1Hcm91cCBpbnB1dCBpcyBmaWxsZWQuXG4gICAqL1xuICBASW5wdXQoKSBuYXNGb3JtQ29udHJvbEdyb3VwQm9va2luZzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE1ha2UgbGF0ZXN0IHNlYXJjaGVzIGFuZCBnZW9sb2NhdGlvbiBvdmVycmlkZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBvcmlnaW4gYWlycG9ydCBzZWxlY3Rvci5cbiAgICovXG4gIEBJbnB1dCgpIG92ZXJyaWRlT3JpZ2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgbWFrZSB0aGUgZmlsdGVyIGRpc3BsYXkgc3VnZ2VzdGVkIGFpcnBvcnRzIGJhc2VkIG9uIGdlb2xvY2F0aW9uIGFuZCBsYXRlc3Qgc2VhcmNoZXMuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVTdWdnZXN0aW9ucz86IGJvb2xlYW47XG5cbiAgQElucHV0KClcbiAgZ2V0IGNsb3Nlc3RBaXJwb3J0cygpIHtcbiAgICByZXR1cm4gdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZTtcbiAgfVxuICBzZXQgY2xvc2VzdEFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgaWYgKCFhaXJwb3J0cyB8fCBhaXJwb3J0cy5sZW5ndGggPCAxKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jbG9zZXN0QWlycG9ydHNWYWx1ZSA9IGFpcnBvcnRzO1xuXG4gICAgaWYgKHRoaXMuZXhpc3RzKHRoaXMub3ZlcnJpZGVPcmlnaW4pKSB7XG4gICAgICB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlID0gYWlycG9ydHNbMF0uY29kZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGlzIHdpbGwgb25seSBkaXNwbGF5IGFpcnBvcnQgc2VsZWN0aW9uLiBXaGVuIGEgY2l0eSBwYWlyIGlzIHNlbGVjdGVkLCB0aGUgcmVzdCBvZiB0aGUgZmlsdGVyIHdpbGwgYmUgdmlzaWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXplPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQWxsIGFpcnBvcnRzIHRoYXQgd2lsbCBiZSBwb3B1bGF0ZWQgaW50byB0aGUgZHJvcGRvd24gbGlzdHMuXG4gICAqIElmIGRpc3BsYXlMYXRlc3RTZWFyY2hlcyBpcyB0cnVlLCBpdCB3aWxsIHRyeSB0byBnZXQgdGhlIGxhdGVzdCBzZWFyY2hlcyBmcm9tIHRoZSBhYmFuZG9uZWQgYmFza2V0LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGFpcnBvcnRzKCkge1xuICAgIHJldHVybiB0aGlzLmFpcnBvcnRzVmFsdWU7XG4gIH1cbiAgc2V0IGFpcnBvcnRzKGFpcnBvcnRzOiBBcnJheTxBaXJwb3J0TW9kZWw+KSB7XG4gICAgdGhpcy5haXJwb3J0c1ZhbHVlID0gYWlycG9ydHM7XG5cbiAgICBpZiAodGhpcy5leGlzdHModGhpcy5kaXNwbGF5TGF0ZXN0U2VhcmNoZXMpKSB7XG4gICAgICBjb25zdCBhYmFuZG9uZWRCYXNrZXQgPSB0aGlzLmFiYW5kb25lZEJhc2tldFNlcnZpY2UuZ2V0QWxsKCk7XG4gICAgICB0aGlzLnNldExhdGVzdFNlYXJjaGVzKGFiYW5kb25lZEJhc2tldCwgdGhpcy5haXJwb3J0cyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IHRyaXBUeXBlKCkge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlVmFsdWU7XG4gIH1cbiAgc2V0IHRyaXBUeXBlKHRyaXBUeXBlOiBUcmlwVHlwZSkge1xuICAgIGlmICh0cmlwVHlwZSA9PT0gdGhpcy50cmlwVHlwZVZhbHVlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy50cmlwVHlwZVZhbHVlID0gdHJpcFR5cGU7XG4gICAgXG4gICAgdGhpcy50cmlwVHlwZUNoYW5nZS5lbWl0KHRoaXMudHJpcFR5cGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGRpcmVjdE9ubHkoKSB7XG4gICAgcmV0dXJuIHRoaXMuZGlyZWN0T25seVZhbHVlO1xuICB9XG4gIHNldCBkaXJlY3RPbmx5KGRpcmVjdE9ubHk6IGJvb2xlYW4pIHtcbiAgICBpZiAoZGlyZWN0T25seSA9PT0gdGhpcy5kaXJlY3RPbmx5VmFsdWUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLmRpcmVjdE9ubHlWYWx1ZSA9IGRpcmVjdE9ubHk7XG4gICAgdGhpcy5kaXJlY3RPbmx5Q2hhbmdlLmVtaXQodGhpcy5kaXJlY3RPbmx5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBsaW1pdCBmb3Igd2hlbiB0aGUgdG90YWwgYW1vdW50IG9mIHBhc3NlbmdlcnMgZXhjZWVkcyB0byBiZSBhIGdyb3VwIGJvb2tpbmcuXG4gICAqL1xuICBASW5wdXQoKSBncm91cEJvb2tpbmdMaW1pdDogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBwcmV2aW91cyBtb250aCBidXR0b24gaW4gdGhlIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KCkgYXJpYUxhYmVsUHJldmlvdXNNb250aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFSSUEgbGFiZWwgZm9yIHRoZSBuZXh0IG1vbnRoIGJ1dHRvbiBpbiB0aGUgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBhcmlhTGFiZWxOZXh0TW9udGg6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBvcmlnaW4gZHJvcGRvd24gc2VsZWN0b3Igb3BlbnMgb3IgY2xvc2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgb3JpZ2luIGRyb3Bkb3duIHNlbGVjdG9yIG9wZW5zIG9yIGNsb3Nlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbk9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEFuIGV2ZW50IHRoYXQgaXMgZmlyZWQgZXZlcnkgdGltZSB0aGUgcGFzc2VuZ2VyIHNlbGVjdCBkcm9wZG93biBvcGVucyBvciBjbG9zZXMuXG4gICAqL1xuICBAT3V0cHV0KCkgcGFzc2VuZ2VyU2VsZWN0T3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogQW4gZXZlbnQgdGhhdCBpcyBmaXJlZCBldmVyeSB0aW1lIHRoZSBzZWxlY3RlZCBvcmlnaW4gYWlycG9ydCBjaGFuZ2VzLlxuICAgKi9cbiAgQE91dHB1dCgpIG9yaWdpbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uIGFpcnBvcnQgY2hhbmdlcy5cbiAgICovXG4gIEBPdXRwdXQoKSBkZXN0aW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QWlycG9ydE1vZGVsPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBbiBldmVudCB0aGF0IGlzIGZpcmVkIGV2ZXJ5IHRpbWUgYSBwYXNzZW5nZXIgc2VsZWN0aW9uIGNoYW5nZSBpcyBwZXJmb3JtZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgcGFzc2VuZ2Vyc0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8QXJyYXk8UGFzc2VuZ2Vyc01vZGVsPj4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB0aGUgc2VsZWN0ZWQgdHJpcCB0eXBlLlxuICAgKi9cbiAgQE91dHB1dCgpIHRyaXBUeXBlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxUcmlwVHlwZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2V0cyBhbmQgZ2V0cyB3aGV0aGVyIHRoZSBzZWxlY3RlZCB0cmFuc2l0IHR5cGUgaXMgZGlyZWN0IG9ubHkgb3Igbm90LlxuICAgKi9cbiAgQE91dHB1dCgpIGRpcmVjdE9ubHlDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogTGFiZWwgZm9yIG5vIGF2YWlsYWJsZSBmbGlnaHRzLlxuICAgKi9cbiAgQElucHV0KCkgbm9BdmFpbGFibGVGbGlnaHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgYXZhaWxhYmxlIGZsaWdodHMuXG4gICAqL1xuICBASW5wdXQoKSBhdmFpbGFibGVGbGlnaHRzTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNhYmxlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBkYXRlcyBpbiB0aGUgcGFzdC5cbiAgICovXG4gIEBJbnB1dCgpIGRpc2FibGVQYXN0U2VsZWN0aW9uOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBvdXRib3VuZCBkYXRlcGlja2VyLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmRMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciBpbmJvdW5kIGRhdGVwaWNrZXIuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBTZXRzIHRoZSBkYXRlcGlja2VycyBpbiBhdmFpbGFiaWxpdHkgbW9kZSB3aGVyZSBhdmFpbGFibGUgZGF0ZXMgY2FuIGJlIGFkZGVkLlxuICAgKi9cbiAgQElucHV0KCkgYXZhaWxhYmlsaXR5OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIEF2YWlsYWJsZSBkYXRlcyBmb3Igb3V0Ym91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBvdXRib3VuZEF2YWlsYWJsZURhdGVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBdmFpbGFibGUgZGF0ZXMgZm9yIGluYm91bmQgY2FsZW5kYXIuXG4gICAqL1xuICBASW5wdXQoKSBpbmJvdW5kQXZhaWxhYmxlRGF0ZXM6IEFycmF5PFV0Y0RhdGU+O1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIElmIHNldCwgRW5hYmxlcyB0aGUgdGltZSBkcm9wZG93biBzZWxlY3RvciBhbG9uZ3NpZGUgZGF0ZXBpY2tlci5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVzOiBBcnJheTxVdGNEYXRlPjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgZGlzcGxheSBmb3JtYXQgb2YgdGhlIGRhdGUgd2hlbiB1c2VyIGhhcyBzZWxlY3RlZCB0aGUgZGF0ZSBhbmQgaXQgaXMgYmVpbmcgc2hvd24gaW4gdGhlIGlucHV0IGJveCBmb3IgdGhlIGRhdGUgcGlja2VyLlxuICAgKiBQbGVhc2UgbG9vayBhdCB0aGUgYW5ndWxhciBEYXRlIHBpcGUgZm9yIHZhbGlkIGZvcm1hdHMgYW5kIHZhcmlhdGlvbnMuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlRGlzcGxheUZvcm1hdCA9ICdFRUUgZCwgTU1NJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgdGltZSBkaXNwbGF5IGZvcm1hdC5cbiAgICovXG4gIEBJbnB1dCgpIHRpbWVEaXNwbGF5Rm9ybWF0ID0gJ0hIOm1tJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBMT0NBTEVfSUQsIHdoaWNoIGlzIGVuLVVTIGJ5IGRlZmF1bHQuXG4gICAqIFRoaXMgcmVxdWlyZXMgdGhhdCByZWdpc3RlckxvY2FsZURhdGEgaXMgY2FsbGVkIHdpdGggdGhlIHJlc3BlY3RpdmUgbG9jYWxlLlxuICAgKi9cbiAgQElucHV0KCkgbG9jYWxlID0gJ2VuLUdCJztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIG1vZGlmaWVyIHRvIHJlbW92ZSB0aGUgcGFkZGluZyBhbmQgbWFyZ2lucyBhcm91bmQgdGhlIGVsZW1lbnQuXG4gICAqL1xuICBASW5wdXQoKSBjb21wYWN0OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIERpc2FibGUgcG9zc2liaWxpdHkgdG8gc2VsZWN0IG91dGJvdW5kIGRhdGVzLlxuICAgKi9cbiAgQElucHV0KCkgb3V0Ym91bmREaXNhYmxlZDogYm9vbGVhbjtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBEaXNhYmxlIHBvc3NpYmlsaXR5IHRvIHNlbGVjdCBpbmJvdW5kIGRhdGVzLlxuICAgKi9cbiAgQElucHV0KCkgaW5ib3VuZERpc2FibGVkOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFNob3cvQWRkIGRhdGUgcGlja2VyIGNvbWJvIGludG8gdGhlIGZpbHRlciBpZiBzZXQgdG8gdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZURhdGVwaWNrZXJzOiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsZSBpY29uIGZvciBtaW5pbWl6aW5nIGZpbHRlci5cbiAgICovXG4gIEBJbnB1dCgpIG1pbmltaXppbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsZSBpY29uIGZvciBtYXhpbWl6aW5nIGZpbHRlci5cbiAgICovXG4gIEBJbnB1dCgpIG1heGltaXppbmdMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgdGhlIHRvZ2dsaW5nIHRyYW5zaXQgdHlwZSB3aGVuIGZpbHRlciBpcyBtaW5pbWl6ZWQuXG4gICAqL1xuICBASW5wdXQoKSBkaXJlY3RPbmx5TW9iaWxlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBMYWJlbCBmb3IgJ29yJyBpbiB0aGUgc3VnZ2VzdGlvbmVkIGFpcnBvcnRzLlxuICAgKi9cbiAgQElucHV0KCkgb3JMYWJlbDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIExhYmVsIGZvciAnVHJhdmVsZXJzJyBpbiB0aGUgcGFzc2VuZ2VycyBzZWxlY3QgYnV0dG9uLlxuICAgKi9cbiAgQElucHV0KCkgcGFzc2VuZ2Vyc1RpdGxlTGFiZWw6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBBIHRleHQgdGhhdCBhcHBlYXJzIGluIHRoZSBkZXN0aW5hdGlvbnMgZHJvcGRvd24gbGlzdCB3aGVuIG9yaWdpbiBhaXJwb3J0IGlzIG5vdCBzZXQuXG4gICAqL1xuICBASW5wdXQoKSBpbnZhbGlkRGVzdGluYXRpb25UZXh0OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgZGF0ZWZvciBvdXRib3VuZCBjYWxlbmRhci5cbiAgICovXG4gIEBJbnB1dCgpXG4gIGdldCBvdXRib3VuZFNlbGVjdGVkRGF0ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZVZhbHVlO1xuICB9XG4gIHNldCBvdXRib3VuZFNlbGVjdGVkRGF0ZShkYXRlOiBVdGNEYXRlKSB7XG4gICAgaWYgKCFkYXRlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICB0aGlzLm91dGJvdW5kU2VsZWN0ZWREYXRlVmFsdWUgPSBkYXRlO1xuICAgICAgdGhpcy5vdXRib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogU2VsZWN0ZWQgZGF0ZWZvciBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQElucHV0KClcbiAgZ2V0IGluYm91bmRTZWxlY3RlZERhdGUoKSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlO1xuICB9XG4gIHNldCBpbmJvdW5kU2VsZWN0ZWREYXRlKGRhdGU6IFV0Y0RhdGUpIHtcbiAgICBpZiAoIWRhdGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZVZhbHVlID0gZGF0ZTtcbiAgICAgIHRoaXMuaW5ib3VuZFNlbGVjdGVkRGF0ZUNoYW5nZS5lbWl0KGRhdGUpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2lsbCBkaXNwbGF5IHRoZSBkZXN0aW5hdGlvbiBpbnB1dCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgcGFzc2VuZ2VyIHNlbGVjdCwgc2V0IHRoaXMgdG8gZmFsc2UgdG8gcmVtb3ZlIGl0LiBJdCdzIHRydWUgYnkgZGVmYXVsdC5cbiAgICovXG4gIEBJbnB1dCgpIGVuYWJsZVBhc3NlbmdlcnNTZWxlY3QgPSB0cnVlO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdpbGwgZGlzcGxheSB0aGUgdHJpcCBzd2l0Y2gsIHNldCB0aGlzIHRvIGZhbHNlIHRvIHJlbW92ZSBpdC4gSXQncyB0cnVlIGJ5IGRlZmF1bHQuXG4gICAqL1xuICBASW5wdXQoKSBlbmFibGVUcmlwU3dpdGNoID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaWxsIGRpc3BsYXkgdGhlIHRyYW5zaXQgc3dpdGNoLCBzZXQgdGhpcyB0byBmYWxzZSB0byByZW1vdmUgaXQuIEl0J3MgdHJ1ZSBieSBkZWZhdWx0LlxuICAgKi9cbiAgQElucHV0KCkgZW5hYmxlVHJhbnNpdFN3aXRjaCA9IHRydWU7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBJbnB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogT3V0Ym91bmQgYW5kIGluYm91bmQgZGF0ZXMgd2lsbCBicmVhayBob3Jpem9udGFsbHkuXG4gICAqL1xuICBASW5wdXQoKSBkYXRlUGlja2VyQ29tYm9JbmxpbmVGbGV4ID0gdHJ1ZTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3Igb3V0Ym91bmQgQWlycG9ydCBTZWxlY3QgXG4gICAqL1xuICBASW5wdXQoKSBhaXJwb3J0U2VsZWN0T3V0Ym91bmRJZDogc3RyaW5nO1xuXG4gICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgaW5ib3VuZCBBaXJwb3J0IFNlbGVjdFxuICAgKi9cbiAgQElucHV0KCkgYWlycG9ydFNlbGVjdEluYm91bmRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgSUQgb2YgdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGZvciBQYXNzZW5nZXIgU2VsZWN0XG4gICAqL1xuICBASW5wdXQoKSBwYXNzZW5nZXJTZWxlY3RJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgb3V0Ym91bmQgZGF0ZXBpY2tlciBJRCBvZiB0aGUgbmF0aXZlIGlucHV0IGVsZW1lbnQgZm9yIERhdGUgcGlja2VyXG4gICAqL1xuICBASW5wdXQoKSBkYXRlUGlja2VyT3V0Ym91bmRJZDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgaW5ib3VuZCBkYXRlcGlja2VyIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgRGF0ZSBwaWNrZXJcbiAgICovXG4gIEBJbnB1dCgpIGRhdGVQaWNrZXJJbmJvdW5kSWQ6IHN0cmluZztcblxuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgSW5wdXRcbiAgICogQHJlcXVpcmVkXG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBUaGUgSUQgb2YgdGhlIG5hdGl2ZSBpbnB1dCBlbGVtZW50IGZvciBUcmlwIHR5cGVcbiAgICovXG4gIEBJbnB1dCgpIHRyaXBUeXBlSWQ6IHN0cmluZztcblxuICAvKipcbiAgICogQHByb3BlcnR5IElucHV0XG4gICAqIEByZXF1aXJlZFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogVGhlIElEIG9mIHRoZSBuYXRpdmUgaW5wdXQgZWxlbWVudCBmb3IgVHJhbnNpdCB0eXBlXG4gICAqL1xuICBASW5wdXQoKSB0cmFuc2l0VHlwZUlkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFdoZW4gc2VsZWN0ZWQgZGF0ZWhhcyBiZWVuIGNoYW5nZWQgb24gdGhlIG91dGJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQE91dHB1dCgpIG91dGJvdW5kU2VsZWN0ZWREYXRlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxVdGNEYXRlPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBXaGVuIHNlbGVjdGVkIGRhdGVoYXMgYmVlbiBjaGFuZ2VkIG9uIHRoZSBpbmJvdW5kIGNhbGVuZGFyLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRTZWxlY3RlZERhdGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFV0Y0RhdGU+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE91dGJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRPcGVuQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gIC8qKlxuICAgKiBAcHJvcGVydHkgT3V0cHV0XG4gICAqIEBkZXNjcmlwdGlvblxuICAgKiBJbmJvdW5kIGRhdGVwaWNrZXIgaXMgb3BlbiBvciBjbG9zZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgaW5ib3VuZE9wZW5DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPGJvb2xlYW4+KCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIE91dGJvdW5kIGNhbGVuZGFyIGNoYW5nZXMgbW9udGguXG4gICAqL1xuICBAT3V0cHV0KCkgb3V0Ym91bmRNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogSW5ib3VuZCBjYWxlbmRhciBjaGFuZ2VzIG1vbnRoLlxuICAgKi9cbiAgQE91dHB1dCgpIGluYm91bmRNb250aENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8VXRjRGF0ZT4oKTtcblxuICAvKipcbiAgICogQHByb3BlcnR5IE91dHB1dFxuICAgKiBAZGVzY3JpcHRpb25cbiAgICogV2hlbiBhIHVzZXIgaGFzIGFjdGl2ZWx5IGNoYW5nZWQgdGhlIGRhdGUuXG4gICAqL1xuICBAT3V0cHV0KCkgZm9jdXNPbk5leHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgLyoqXG4gICAqIEBwcm9wZXJ0eSBPdXRwdXRcbiAgICogQGRlc2NyaXB0aW9uXG4gICAqIFRoZSBnZW9sb2NhdGlvbiBvZiB0aGUgdXNlci4gV2lsbCBiZSBlbWl0dGVkIGlmICdlbmFibGVTdWdnZXN0aW9ucycgaXMgdHJ1ZS5cbiAgICovXG4gIEBPdXRwdXQoKSBwb3NpdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8R2VvbG9jYXRpb25Qb3NpdGlvbj4oKTtcblxuICBnZXQgaW5ib3VuZFNlbGVjdGVkTW9udGgoKTogVXRjRGF0ZSB7XG4gICAgcmV0dXJuIHRoaXMuaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZTtcbiAgfVxuICBzZXQgaW5ib3VuZFNlbGVjdGVkTW9udGgobW9udGg6IFV0Y0RhdGUpIHtcbiAgICBpZiAodGhpcy5kYXRlU2VydmljZS5pc1NhbWVNb250aChtb250aCwgdGhpcy5pbmJvdW5kU2VsZWN0ZWRNb250aFZhbHVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5pbmJvdW5kTW9udGhDaGFuZ2UuZW1pdChtb250aCk7XG4gICAgICB0aGlzLmluYm91bmRTZWxlY3RlZE1vbnRoVmFsdWUgPSBtb250aDtcbiAgICB9KTtcbiAgfVxuXG4gIGdldCBwYXNzZW5nZXJTZWxlY3RJbnB1dElkKCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHRoaXMucGFzc2VuZ2VyU2VsZWN0SWQgPyB0aGlzLnBhc3NlbmdlclNlbGVjdElkIDogYG5hcy1maWx0ZXJfX3Bhc3Nlbmdlci1zZWxlY3QtJHt0aGlzLmNvbXBvbmVudElkfWA7XG4gIH1cbiAgXG4gIGdldCB0cmlwVHlwZUlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmlwVHlwZUlkID8gdGhpcy50cmlwVHlwZUlkIDogYG5hcy1maWx0ZXJfX3RyaXAtdHlwZS0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIGdldCB0cmFuc2l0VHlwZUlucHV0SWQoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2l0VHlwZUlkID8gdGhpcy50cmFuc2l0VHlwZUlkIDogYG5hcy1maWx0ZXJfX3RyYW5zaXQtdHlwZS0ke3RoaXMuY29tcG9uZW50SWR9YDtcbiAgfVxuXG4gIHByaXZhdGUgb3V0Ym91bmRTZWxlY3RlZERhdGVWYWx1ZTogVXRjRGF0ZTtcbiAgcHJpdmF0ZSBpbmJvdW5kU2VsZWN0ZWREYXRlVmFsdWU6IFV0Y0RhdGU7XG4gIHByaXZhdGUgaW5ib3VuZFNlbGVjdGVkTW9udGhWYWx1ZTogVXRjRGF0ZTtcbiAgcHJpdmF0ZSBhaXJwb3J0c1ZhbHVlOiBBcnJheTxBaXJwb3J0TW9kZWw+O1xuICBwcml2YXRlIHRyaXBUeXBlVmFsdWU6IFRyaXBUeXBlO1xuICBwcml2YXRlIGRpcmVjdE9ubHlWYWx1ZTogYm9vbGVhbjtcbiAgcHJpdmF0ZSBjbG9zZXN0QWlycG9ydHNWYWx1ZTogQXJyYXk8QWlycG9ydE1vZGVsPjtcbiAgcHJpdmF0ZSBvdXRib3VuZE9wZW5WYWx1ZSA9IGZhbHNlO1xuICBwcml2YXRlIGluYm91bmRPcGVuVmFsdWUgPSBmYWxzZTtcbiAgcHJpdmF0ZSBwYXNzZW5nZXJzVmFsdWUgPSBuZXcgQXJyYXk8UGFzc2VuZ2Vyc01vZGVsPigpO1xuICBwcml2YXRlIGZvY3VzQXN5bmNUaW1vdXQ6IGFueTtcbiAgcHJpdmF0ZSB0cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0OiBhbnk7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHVibGljIGRldmljZUhlbHBlcjogRGV2aWNlSGVscGVyLFxuICAgIHB1YmxpYyBzb3J0U2VydmljZTogU29ydFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhYmFuZG9uZWRCYXNrZXRTZXJ2aWNlOiBBYmFuZG9uZWRCYXNrZXRTZXJ2aWNlLFxuICAgIHByaXZhdGUgZGF0ZVNlcnZpY2U6IERhdGVIZWxwZXIsXG4gICAgcHVibGljIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsXG4gICAgcHVibGljIGNoYW5nZURldGVjdG9yOiBDaGFuZ2VEZXRlY3RvclJlZlxuICApIHtcbiAgICBzdXBlcignbmFzLWZpbHRlcicpO1xuICAgIHRoaXMubmF0aXZlRWxlbWVudCA9IGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudDtcbiAgICB0aGlzLmNvbXBvbmVudElkID0gbmV4dElkKys7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZih0aGlzLmVuYWJsZVRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJpcFR5cGUgPSB0aGlzLnRyaXBUeXBlICE9PSBUcmlwVHlwZS5vbmVXYXkgJiYgdGhpcy50cmlwVHlwZSAhPT0gVHJpcFR5cGUudHdvV2F5UmV0dXJuID8gVHJpcFR5cGUudHdvV2F5UmV0dXJuIDogdGhpcy50cmlwVHlwZTtcblxuICAgICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpIHtcbiAgICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpO1xuICAgICAgICBpZih0cmlwVHlwZUNvbnRyb2wpIHtcbiAgICAgICAgICB0cmlwVHlwZUNvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLnRyaXBUeXBlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmICghdGhpcy5uYXNGb3JtR3JvdXApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0aGlzLm5hc0Zvcm1Hcm91cC5zdGF0dXNDaGFuZ2VzLnN1YnNjcmliZSgoeCkgPT4ge1xuICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMuaXNOYXNHcm91cFZhbGlkID0gL3RydWUvaS50ZXN0KHgpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBpZiAodGhpcy5uYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5KSB7XG4gICAgICBjb25zdCBkaXJlY3RPbmx5Q29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldChcbiAgICAgICAgdGhpcy5uYXNGb3JtQ29udHJvbE5hbWVEaXJlY3RPbmx5XG4gICAgICApO1xuXG4gICAgICBpZiAoZGlyZWN0T25seUNvbnRyb2wpIHtcbiAgICAgICAgdGhpcy5kaXJlY3RPbmx5ID0gZGlyZWN0T25seUNvbnRyb2wudmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpIHtcbiAgICAgIGNvbnN0IHRyaXBUeXBlQ29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldChcbiAgICAgICAgdGhpcy5uYXNGb3JtQ29udHJvbE5hbWVUcmlwVHlwZVxuICAgICAgKTtcblxuICAgICAgaWYgKHRyaXBUeXBlQ29udHJvbCkge1xuICAgICAgICB0aGlzLnRyaXBUeXBlID0gdHJpcFR5cGVDb250cm9sLnZhbHVlO1xuICAgICAgICB0aGlzLmluYm91bmREaXNhYmxlZCA9IHRyaXBUeXBlQ29udHJvbC52YWx1ZSA9PT0gVHJpcFR5cGUub25lV2F5O1xuXG4gICAgICAgIGlmICh0aGlzLm5hc0Zvcm1Db250cm9sTmFtZUluYm91bmQpIHtcbiAgICAgICAgICBjb25zdCBpbmJvdW5kQ29udHJvbCA9IHRoaXMubmFzRm9ybUdyb3VwLmdldChcbiAgICAgICAgICAgIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBpZiAoaW5ib3VuZENvbnRyb2wgJiYgdGhpcy5pbmJvdW5kRGlzYWJsZWQpIHtcbiAgICAgICAgICAgIGluYm91bmRDb250cm9sLmRpc2FibGUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0cmlwVHlwZUNvbnRyb2wudmFsdWVDaGFuZ2VzLnN1YnNjcmliZSgodmFsdWU6IFRyaXBUeXBlKSA9PiB7XG4gICAgICAgICAgdGhpcy5pbmJvdW5kRGlzYWJsZWQgPSB2YWx1ZSA9PT0gVHJpcFR5cGUub25lV2F5O1xuICAgICAgICAgIHRoaXMudHJpcFR5cGUgPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgZGlyZWN0T25seUNvbnRyb2wgPSB0aGlzLm5hc0Zvcm1Hcm91cC5nZXQoXG4gICAgICAgIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seVxuICAgICAgKTtcbiAgICAgIGlmIChkaXJlY3RPbmx5Q29udHJvbCkge1xuICAgICAgICBkaXJlY3RPbmx5Q29udHJvbC52YWx1ZUNoYW5nZXMuc3Vic2NyaWJlKCh2YWx1ZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIHRoaXMuZGlyZWN0T25seSA9IHZhbHVlO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICBuZ0FmdGVyVmlld0NoZWNrZWQoKTogdm9pZCB7XG4gICAgdGhpcy5jb250YWluZXJXaWR0aC5uZXh0KFxuICAgICAgKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoXG4gICAgKTtcblxuICAgIHdpbmRvdy5vbnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgIHRoaXMuY29udGFpbmVyV2lkdGgubmV4dChcbiAgICAgICAgKHRoaXMuY29udGFpbmVyLm5hdGl2ZUVsZW1lbnQgYXMgSFRNTEVsZW1lbnQpLm9mZnNldFdpZHRoXG4gICAgICApO1xuICAgIH07XG4gIH1cblxuICBnZXRDbG9zZXN0QWlycG9ydHMocG9zaXRpb246IEdlb2xvY2F0aW9uUG9zaXRpb24pOiB2b2lkIHtcbiAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlLmVtaXQocG9zaXRpb24pO1xuICB9XG5cbiAgZ2V0RmlsdGVyQ2xhc3MoZWxlbWVudD86IHN0cmluZywgbW9kaWZpZXJzSW5wdXQ/OiBhbnkpOiBDbGFzc01vZGVsIHtcbiAgICBsZXQgbW9kaWZpZXJzID0gbW9kaWZpZXJzSW5wdXQgfHwgbmV3IEFycmF5PHN0cmluZz4oKTtcblxuICAgIGlmIChcbiAgICAgIHR5cGVvZiBtb2RpZmllcnNJbnB1dCA9PT0gJ3N0cmluZycgfHxcbiAgICAgIG1vZGlmaWVyc0lucHV0IGluc3RhbmNlb2YgU3RyaW5nXG4gICAgKSB7XG4gICAgICBtb2RpZmllcnMgPSBbbW9kaWZpZXJzSW5wdXRdO1xuICAgIH1cblxuICAgIGNvbnN0IHdpZHRocyA9IFtdO1xuXG4gICAgaWYgKHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSkge1xuICAgICAgd2lkdGhzLnB1c2goJ21kJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkpIHtcbiAgICAgIHdpZHRocy5wdXNoKCdsZycpO1xuICAgIH1cblxuICAgIG1vZGlmaWVycyA9IFsuLi5tb2RpZmllcnMsIC4uLndpZHRoc107XG5cbiAgICByZXR1cm4gdGhpcy5nZXRDbGFzcyhlbGVtZW50LCBtb2RpZmllcnMpO1xuICB9XG5cbiAgZ2V0QWlycG9ydFNlbGVjdENsYXNzKCk6IENsYXNzTW9kZWwge1xuICAgIHJldHVybiB0aGlzLmdldENsYXNzKCdhaXJwb3J0LXNlbGVjdCcsIFtcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ2xnJyxcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhUYWJsZXQodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKSAmJiAnbWQnLFxuICAgICAgdGhpcy5leGlzdHModGhpcy5lbmFibGVEYXRlcGlja2VycykgJiYgJ25vLWJvcmRlcicsXG4gICAgXSk7XG4gIH1cblxuICBnZXRTdWdnZXN0aW9ucygpOiBBcnJheTxBaXJwb3J0TW9kZWw+IHtcbiAgICBjb25zdCBzdWdnZXN0aW9ucyA9IEFycmF5LmZyb20oXG4gICAgICBuZXcgU2V0KFtcbiAgICAgICAgLi4uKHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW5cbiAgICAgICAgICA/IHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4uZmlsdGVyKFxuICAgICAgICAgICAgKHgpID0+IHguY29kZSAhPT0gdGhpcy5vcmlnaW5BaXJwb3J0Q29kZVxuICAgICAgICAgIClcbiAgICAgICAgICA6IFtdKSxcbiAgICAgICAgLi4uKHRoaXMuY2xvc2VzdEFpcnBvcnRzXG4gICAgICAgICAgPyB0aGlzLmNsb3Nlc3RBaXJwb3J0cy5maWx0ZXIoXG4gICAgICAgICAgICAoeCkgPT4geC5jb2RlICE9PSB0aGlzLm9yaWdpbkFpcnBvcnRDb2RlXG4gICAgICAgICAgKVxuICAgICAgICAgIDogW10pLFxuICAgICAgXSlcbiAgICApO1xuXG4gICAgcmV0dXJuIHN1Z2dlc3Rpb25zLnNsaWNlKDAsIDMpO1xuICB9XG5cbiAgZ2V0RGF0ZVBpY2tlcnNDbGFzcygpOiBDbGFzc01vZGVsIHtcbiAgICByZXR1cm4gdGhpcy5nZXRGaWx0ZXJDbGFzcygnZGF0ZS1jb21ibycsIFtcbiAgICAgIHRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpICYmICdtaW5pbWl6ZWQnLFxuICAgICAgdGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpID4gNTAwICYmICdzaWRlLWJ5LXNpZGUnLFxuICAgIF0pO1xuICB9XG5cbiAgZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKGVsZW1lbnQ/OiBzdHJpbmcsIG1vZGlmaWVyc0lucHV0PzogYW55KTogQ2xhc3NNb2RlbCB7XG4gICAgbGV0IG1vZGlmaWVycyA9IG1vZGlmaWVyc0lucHV0IHx8IG5ldyBBcnJheTxzdHJpbmc+KCk7XG5cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgbW9kaWZpZXJzSW5wdXQgPT09ICdzdHJpbmcnIHx8XG4gICAgICBtb2RpZmllcnNJbnB1dCBpbnN0YW5jZW9mIFN0cmluZ1xuICAgICkge1xuICAgICAgbW9kaWZpZXJzID0gW21vZGlmaWVyc0lucHV0XTtcbiAgICB9XG5cbiAgICBjb25zdCB3aWR0aHMgPSBbXG4gICAgICB0aGlzLmRldmljZUhlbHBlci5pc1dpZHRoVGFibGV0KHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ21kJyxcbiAgICAgIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhEZXNrdG9wKHRoaXMuY29udGFpbmVyV2lkdGguZ2V0VmFsdWUoKSkgJiYgJ2xnJyxcbiAgICBdO1xuXG4gICAgbW9kaWZpZXJzID0gWy4uLm1vZGlmaWVycywgLi4ud2lkdGhzXTtcblxuICAgIGNvbnN0IHRyYXZlbERldGFpbHNCYXNlID0gbmV3IE5hc0NvbXBvbmVudEJhc2UoJ3RyYXZlbC1kZXRhaWxzJyk7XG4gICAgcmV0dXJuIHRyYXZlbERldGFpbHNCYXNlLmdldENsYXNzKGVsZW1lbnQsIG1vZGlmaWVycyk7XG4gIH1cblxuICBvbkluYm91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuaW5ib3VuZE1vbnRoQ2hhbmdlLmVtaXQobW9udGgpO1xuICB9XG4gIG9uT3V0Ym91bmRNb250aENoYW5nZShtb250aDogVXRjRGF0ZSk6IHZvaWQge1xuICAgIHRoaXMub3V0Ym91bmRNb250aENoYW5nZS5lbWl0KG1vbnRoKTtcbiAgfVxuXG4gIG9uUGFzc2VuZ2Vyc1NlbGVjdEZvY3VzT25QcmV2aW91cygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgdGhpcy5vblRyYW5zaXRTd2l0Y2hPcGVuKHRydWUpO1xuICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKHRoaXMuaXNUYWJsZXREaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMuc2VsZWN0UHJldmlvdXNDb250cm9sKCk7XG4gICAgfVxuICB9XG5cbiAgcGFzc2VuZ2VyS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdUYWInOlxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkpIHtcbiAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSB8fCB0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgIHRoaXMuZm9jdXNPbk5leHRDaGFuZ2UuZW1pdCgpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRW50ZXInOlxuICAgICAgICBpZiAoZXZlbnQuc2hpZnRLZXkgfHwgdGhpcy5pc01vYmlsZURpc3BsYXkoKSkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PVxuICAgICAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudC5uYXRpdmVFbGVtZW50XG4gICAgICAgICkge1xuICAgICAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4pIHtcbiAgICAgICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25QYXNzZW5nZXJTZWxlY3RPcGVuKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnRXNjYXBlJzpcbiAgICAgICAgdGhpcy5vblBhc3NlbmdlclNlbGVjdE9wZW4oKTtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5zZXRGb2N1c09uTmF0aXZlRWxlbWVudChcbiAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnRcbiAgICAgICAgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25UcmlwU3dpdGNoS2V5RG93bihldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIHN3aXRjaCAoZXZlbnQua2V5KSB7XG4gICAgICBjYXNlICdBcnJvd1JpZ2h0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJpcFR5cGVPbmV3YXkubmF0aXZlRWxlbWVudCkge1xuICAgICAgICAgIHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpIHx8ICF0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdFByZXZpb3VzQ29udHJvbCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmIChldmVudC5rZXkgPT09ICdUYWInKSB7XG4gICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnRyaXBTd2l0Y2gub3Blbikge1xuICAgICAgICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyYW5zaXRTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4oZmFsc2UpO1xuICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgdHJhbnNpdEtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpOiB2b2lkIHtcbiAgICBzd2l0Y2ggKGV2ZW50LmtleSkge1xuICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgIGlmIChkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0aGlzLnRyYW5zaXRUeXBlVHJhbnNpdC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0VHlwZURpcmVjdE9ubHkubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnQXJyb3dMZWZ0JzpcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMudHJhbnNpdFR5cGVEaXJlY3RPbmx5Lm5hdGl2ZUVsZW1lbnRcbiAgICAgICAgKSB7XG4gICAgICAgICAgdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnVGFiJzpcbiAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7XG4gICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKDxhbnk+dGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlRWxlbWVudCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMub25UcmFuc2l0U3dpdGNoT3BlbighdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4pO1xuICAgICAgICAgICAgdGhpcy5mb2N1c09uTmV4dENoYW5nZS5lbWl0KCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ1RhYicpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdFc2NhcGUnOlxuICAgICAgICB0aGlzLm9uVHJhbnNpdFN3aXRjaE9wZW4oZmFsc2UpO1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLnNldEZvY3VzT25OYXRpdmVFbGVtZW50KHRoaXMudHJhbnNpdFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgb25QYXNzZW5nZXJzU2VsZWN0Rm9jdXNPbk5leHQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNNb2JpbGVEaXNwbGF5KCkpIHtcbiAgICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24udG9nZ2xlKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyg8YW55PnRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICB9XG4gIH1cblxuICBmb2N1c0FzeW5jKHJlZkVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICBjbGVhclRpbWVvdXQodGhpcy5mb2N1c0FzeW5jVGltb3V0KTtcblxuICAgIHRoaXMuZm9jdXNBc3luY1RpbW91dCA9IHNldFRpbWVvdXQoKCkgPT5cbiAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQocmVmRWxlbWVudClcbiAgICApO1xuICB9XG5cbiAgb25EYXRlcGlja2VyRm9jdXNPblByZXZpb3VzKGV2ZW50OiBLZXlib2FyZEV2ZW50IHwgTW91c2VFdmVudCk6IHZvaWQge1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICB0aGlzLmZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk7XG4gIH1cblxuICBzZWxlY3RQcmV2aW91c0NvbnRyb2woKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPbmx5KSB7XG4gICAgICAgIHRoaXMub3V0Ym91bmRPcGVuID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuaW5ib3VuZE9wZW4gPSB0cnVlO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodGhpcy5haXJwb3J0U2VsZWN0KSB7XG4gICAgICBpZiAodGhpcy5leGlzdHModGhpcy5haXJwb3J0U2VsZWN0LmNvbWJvKSkge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25EZXN0aW5hdGlvbk9wZW4odHJ1ZSk7XG4gICAgICAgIGlmICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25EZXN0aW5hdGlvbikge1xuICAgICAgICAgIHRoaXMuZm9jdXNBc3luYyhcbiAgICAgICAgICAgICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25EZXN0aW5hdGlvbikuaW5wdXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25PcmlnaW5PcGVuKHRydWUpO1xuICAgICAgICBpZiAoPGFueT50aGlzLmFpcnBvcnRTZWxlY3QuYWlycG9ydFNlbGVjdERyb3Bkb3duT3JpZ2luKSB7XG4gICAgICAgICAgdGhpcy5mb2N1c0FzeW5jKFxuICAgICAgICAgICAgKDxhbnk+dGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bk9yaWdpbikuaW5wdXRcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgb25Gb2N1c09uTmV4dENoYW5nZShldmVudDogS2V5Ym9hcmRFdmVudCB8IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc01vYmlsZURpc3BsYXkoKSAmJiB0aGlzLnRyaXBTd2l0Y2gpIHtcbiAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpKSB7XG4gICAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICB0aGlzLm9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpO1xuICAgICAgICAgIHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQoXG4gICAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLnRvZ2dsZUVsZW1lbnRcbiAgICAgICAgICApO1xuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgdGhpcy5mb2N1c0FzeW5jKHRoaXMudHJpcFN3aXRjaC50b2dnbGVFbGVtZW50KTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBpc01vYmlsZURpc3BsYXkoKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIHRoaXMuZGV2aWNlSGVscGVyLmlzV2lkdGhNb2JpbGUodGhpcy5jb250YWluZXJXaWR0aC5nZXRWYWx1ZSgpKTtcbiAgfVxuXG4gIGlzVGFibGV0RGlzcGxheSgpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5kZXZpY2VIZWxwZXIuaXNXaWR0aFRhYmxldCh0aGlzLmNvbnRhaW5lcldpZHRoLmdldFZhbHVlKCkpO1xuICB9XG5cbiAgb25PcmlnaW5PcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8uaW5ib3VuZE9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAodGhpcy5haXJwb3J0U2VsZWN0ICYmICF0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3Blbikge1xuICAgICAgdGhpcy51cGRhdGVNYXhpbWl6ZSgpO1xuICAgIH1cblxuICAgIHRoaXMub3JpZ2luT3BlbkNoYW5nZS5lbWl0KG9wZW4pO1xuXG4gICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XG4gIH1cblxuICB2YWxpZGF0ZUFpcnBvcnRWYWx1ZXMoKTogYm9vbGVhbiB7XG4gICAgaWYgKCF0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgY29uc3Qgb3JpZ2luU25hcHNob3QgPSB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luO1xuICAgIGNvbnN0IGRlc3RpbmF0aW9uU25hcHNob3QgPSB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb247XG4gICAgaWYgKFxuICAgICAgb3JpZ2luU25hcHNob3QgJiZcbiAgICAgIGRlc3RpbmF0aW9uU25hcHNob3QgJiZcbiAgICAgIG9yaWdpblNuYXBzaG90LmNvZGUgJiZcbiAgICAgIG9yaWdpblNuYXBzaG90LmNvZGUubGVuZ3RoICYmXG4gICAgICBkZXN0aW5hdGlvblNuYXBzaG90LmNvZGUgJiZcbiAgICAgIGRlc3RpbmF0aW9uU25hcHNob3QuY29kZS5sZW5ndGhcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICB1cGRhdGVNYXhpbWl6ZSgpOiB2b2lkIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMubWF4aW1pemUgPSB0aGlzLnZhbGlkYXRlQWlycG9ydFZhbHVlcygpO1xuICAgIH0pO1xuICB9XG5cbiAgb25EZXN0aW5hdGlvbk9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QgJiYgIXRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbk9wZW4pIHtcbiAgICAgIHRoaXMudXBkYXRlTWF4aW1pemUoKTtcbiAgICB9XG4gICAgdGhpcy5kZXN0aW5hdGlvbk9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcbiAgfVxuXG4gIG9uUGFzc2VuZ2VyU2VsZWN0T3BlbigpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5QYXNzZW5nZXJTZWxlY3QgPSAhdGhpcy5vcGVuUGFzc2VuZ2VyU2VsZWN0O1xuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmRhdGVwaWNrZXJDb21ibykge1xuICAgICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuKSB7XG4gICAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLm91dGJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMucGFzc2VuZ2VyU2VsZWN0T3BlbkNoYW5nZS5lbWl0KHRoaXMub3BlblBhc3NlbmdlclNlbGVjdCk7XG5cbiAgICBpZiAodGhpcy5vcGVuUGFzc2VuZ2VyU2VsZWN0KSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0Py5udW1iZXJGaWVsZHMuZmlyc3QpIHtcbiAgICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdC5udW1iZXJGaWVsZHMuZmlyc3QuaW5wdXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9XG4gICAgICB9LCAzMDApO1xuICAgIH1cbiAgfVxuXG4gIG9uVHJpcFN3aXRjaE9wZW4ob3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLnRyaXBTd2l0Y2hGb2N1c1RpbWVvdXQpO1xuXG4gICAgaWYgKHRoaXMucGFzc2VuZ2VyU2VsZWN0RHJvcGRvd24pIHtcbiAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmICh0aGlzLnRyYW5zaXRTd2l0Y2gpIHtcbiAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuYWlycG9ydFNlbGVjdCkge1xuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0Lm9yaWdpbk9wZW4gPSBmYWxzZTtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbk9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgIHRoaXMuZGF0ZXBpY2tlckNvbWJvLmluYm91bmRPcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5vdXRib3VuZE9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IG9wZW47XG5cbiAgICBpZiAob3Blbikge1xuICAgICAgdGhpcy50cmlwU3dpdGNoRm9jdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgIHRoaXMudHJpcFR5cGVSb3VuZFRyaXAubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICBvblRyYW5zaXRTd2l0Y2hPcGVuKG9wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5UcmFuc2l0VHlwZVNlbGVjdCA9ICF0aGlzLm9wZW5UcmFuc2l0VHlwZVNlbGVjdDtcbiAgICBjbGVhclRpbWVvdXQodGhpcy50cmFuc2l0U3dpdGNoRm9jdXNUaW1lb3V0KTtcblxuICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICB0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICB0aGlzLnRyaXBTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICh0aGlzLmFpcnBvcnRTZWxlY3QpIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vcmlnaW5PcGVuID0gZmFsc2U7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICB0aGlzLmRhdGVwaWNrZXJDb21iby5pbmJvdW5kT3BlbiA9IGZhbHNlO1xuICAgICAgdGhpcy5kYXRlcGlja2VyQ29tYm8ub3V0Ym91bmRPcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJhbnNpdFN3aXRjaCkge1xuICAgICAgdGhpcy50cmFuc2l0U3dpdGNoLm9wZW4gPSBvcGVuO1xuICAgIH1cblxuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2hGb2N1c1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy50cmFuc2l0VHlwZVRyYW5zaXQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfSwgMjAwKTtcbiAgICB9XG4gIH1cblxuICBvbk9yaWdpbkNoYW5nZShhaXJwb3J0OiBBaXJwb3J0TW9kZWwpOiB2b2lkIHtcbiAgICB0aGlzLm9yaWdpbkNoYW5nZS5lbWl0KGFpcnBvcnQpO1xuICB9XG5cbiAgc2V0U2VsZWN0ZWRPcmlnaW5BaXJwb3J0KGFpcnBvcnQ6IEFpcnBvcnRNb2RlbCk6IHZvaWQge1xuICAgIGlmICghYWlycG9ydCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMub25PcmlnaW5DaGFuZ2UoYWlycG9ydCk7XG5cbiAgICBpZiAodGhpcy5vcmlnaW5BaXJwb3J0Q29kZSA9PT0gYWlycG9ydC5jb2RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5vcmlnaW5BaXJwb3J0Q29kZSA9IGFpcnBvcnQuY29kZTtcbiAgICB0aGlzLmNoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcbiAgfVxuXG4gIG9uRGVzdGluYXRpb25DaGFuZ2UoYWlycG9ydDogQWlycG9ydE1vZGVsKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0aW5hdGlvbkNoYW5nZS5lbWl0KGFpcnBvcnQpO1xuICB9XG5cbiAgc2V0Rm9jdXNPblBhc3NlbmdlclNlbGVjdChldmVudDogS2V5Ym9hcmRFdmVudCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzTW9iaWxlRGlzcGxheSgpKSB7XG4gICAgICBpZiAodGhpcy5kYXRlcGlja2VyQ29tYm8pIHtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgdGhpcy5vdXRib3VuZE9wZW4gPSB0cnVlO1xuICAgICAgICB0aGlzLmZvY3VzQXN5bmMoKDxhbnk+dGhpcy5kYXRlcGlja2VyQ29tYm8uZGF0ZXBpY2tlck91dGJvdW5kKS5pbnB1dCk7XG4gICAgICB9IGVsc2UgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB0aGlzLm9uVHJpcFN3aXRjaE9wZW4odHJ1ZSk7XG4gICAgICAgIHRoaXMuZm9jdXNBc3luYyh0aGlzLnRyaXBTd2l0Y2gudG9nZ2xlRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmICh0aGlzLmlzVGFibGV0RGlzcGxheSgpICYmIHRoaXMuZGF0ZXBpY2tlckNvbWJvKSB7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5vdXRib3VuZE9wZW4gPSB0cnVlO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aGlzLnBhc3NlbmdlclNlbGVjdERyb3Bkb3duKSB7XG4gICAgICAgIHRoaXMub25QYXNzZW5nZXJTZWxlY3RPcGVuKCk7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRFbGVtZW50UmVmID0gdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi50b2dnbGVFbGVtZW50O1xuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHRoaXMuc2V0Rm9jdXNPbk5hdGl2ZUVsZW1lbnQoY3VycmVudEVsZW1lbnRSZWYpKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICAgIHRoaXMub25UcmlwU3dpdGNoT3Blbih0cnVlKTtcbiAgICAgICAgdGhpcy50cmlwU3dpdGNoLnRvZ2dsZUVsZW1lbnQubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHNldEZvY3VzT25OYXRpdmVFbGVtZW50KGVsZW1lbnQ6IEVsZW1lbnRSZWYpOiB2b2lkIHtcbiAgICBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgfVxuXG4gIG9uVHJpcFR5cGVDaGFuZ2UodHJpcFR5cGU6IFRyaXBUeXBlKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50cmlwU3dpdGNoKSB7XG4gICAgICAgIHRoaXMudHJpcFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLnRyaXBUeXBlID0gdHJpcFR5cGU7XG4gICAgXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lVHJpcFR5cGUpIHtcbiAgICAgIGNvbnN0IHRyaXBTd2l0Y2hDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZVRyaXBUeXBlXG4gICAgICApO1xuICAgICAgdHJpcFN3aXRjaENvbnRyb2wucGF0Y2hWYWx1ZSh0aGlzLnRyaXBUeXBlKTtcbiAgICB9XG5cbiAgfVxuXG4gIG9uVHJhbnNpdENoYW5nZShkaXJlY3RPbmx5OiBib29sZWFuKTogdm9pZCB7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICAgIHRoaXMudHJhbnNpdFN3aXRjaC5vcGVuID0gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB0aGlzLmRpcmVjdE9ubHkgPSBkaXJlY3RPbmx5O1xuXG4gICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwICYmIHRoaXMubmFzRm9ybUNvbnRyb2xOYW1lRGlyZWN0T25seSkge1xuICAgICAgY29uc3QgdHJpcFR5cGVDb250cm9sID0gdGhpcy5uYXNGb3JtR3JvdXAuZ2V0KFxuICAgICAgICB0aGlzLm5hc0Zvcm1Db250cm9sTmFtZURpcmVjdE9ubHlcbiAgICAgICk7XG4gICAgICB0cmlwVHlwZUNvbnRyb2wucGF0Y2hWYWx1ZShkaXJlY3RPbmx5KTtcbiAgICB9XG4gICAgdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3QgPSAhdGhpcy5vcGVuVHJhbnNpdFR5cGVTZWxlY3Q7XG4gIH1cblxuICBnZXRUcmF2ZWxEZXRhaWxzVHJpcFN3aXRjaEljb25DbGFzcyhtb2RpZmllcnM/OiBhbnkpOiBBcnJheTxDbGFzc01vZGVsPiB7XG4gICAgY29uc3QgaWNvbk1lZGl1bUJhc2UgPSBuZXcgTmFzQ29tcG9uZW50QmFzZSgnaWNvbi1tZWRpdW0nKTtcblxuICAgIHJldHVybiBbXG4gICAgICBpY29uTWVkaXVtQmFzZS5nZXRDbGFzcygnJywgbW9kaWZpZXJzKSxcbiAgICAgIHRoaXMuZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdpY29uJyksXG4gICAgXTtcbiAgfVxuXG4gIGdldFRyaXBTd2l0Y2hMYWJlbCgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLnRyaXBUeXBlID09PSBUcmlwVHlwZS50d29XYXlSZXR1cm5cbiAgICAgID8gdGhpcy50cmlwU3dpdGNoUm91bmRUcmlwTGFiZWxcbiAgICAgIDogdGhpcy50cmlwU3dpdGNoT25lV2F5TGFiZWw7XG4gIH1cblxuICBnZXRUcmFuc2l0TGFiZWwoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gdGhpcy5kaXJlY3RPbmx5ID8gdGhpcy5kaXJlY3RPbmx5TGFiZWwgOiB0aGlzLmRpcmVjdFRyYW5zaXRMYWJlbDtcbiAgfVxuXG4gIG9uQWNjb3JkaW9uVG9nZ2xlQ2hhbmdlKGV4cGFuZGVkOiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5kaXNwbGF5U3VtbWFyeSA9ICFleHBhbmRlZDtcbiAgfVxuXG4gIGdldFN1bW1hcnkoKTogc3RyaW5nIHtcbiAgICByZXR1cm4gKFxuICAgICAgYCR7dGhpcy5wYXNzZW5nZXJTZWxlY3RMYWJlbH0ke3RoaXMuZGVmYXVsdFN1bW1hcnlTZXBhcmF0b3J9YCArXG4gICAgICBgJHt0aGlzLmdldFRyaXBTd2l0Y2hMYWJlbCgpLnRvTG93ZXJDYXNlKCl9JHt0aGlzLmxhc3RTdW1tYXJ5U2VwYXJhdG9yXG4gICAgICB9JHt0aGlzLmdldFRyYW5zaXRMYWJlbCgpLnRvTG93ZXJDYXNlKCl9YFxuICAgICk7XG4gIH1cblxuICBzaG91bGRNYXhpbWl6ZSgpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuZXhpc3RzKHRoaXMubWluaW1pemUpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0ICYmXG4gICAgICB0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGUgJiZcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5kZXN0aW5hdGlvbiAmJlxuICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmRlc3RpbmF0aW9uLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICF0aGlzLmVuYWJsZURlc3RpbmF0aW9uU2VsZWN0ICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luICYmXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luLmNvZGVcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSBpZiAoXG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3QgJiZcbiAgICAgICh0aGlzLmFpcnBvcnRTZWxlY3Qub3JpZ2luT3BlbiB8fCB0aGlzLmFpcnBvcnRTZWxlY3QuZGVzdGluYXRpb25PcGVuKVxuICAgICkge1xuICAgICAgcmV0dXJuIHRoaXMubWF4aW1pemU7XG4gICAgfSBlbHNlIGlmICh0aGlzLmV4aXN0cyh0aGlzLm1pbmltaXplKSkge1xuICAgICAgaWYgKHRoaXMubWF4aW1pemUpIHtcbiAgICAgICAgaWYgKHRoaXMubmFzRm9ybUdyb3VwKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuaXNOYXNHcm91cFZhbGlkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvY3VzT25BaXJwb3J0U2VsZWN0QmFja3dhcmRzKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmV4aXN0cyh0aGlzLmFpcnBvcnRTZWxlY3QuY29tYm8pKSB7XG4gICAgICB0aGlzLmFpcnBvcnRTZWxlY3Qub25EZXN0aW5hdGlvbk9wZW4odHJ1ZSk7XG4gICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgdGhpcy5haXJwb3J0U2VsZWN0LmFpcnBvcnRTZWxlY3REcm9wZG93bkRlc3RpbmF0aW9uLmlucHV0Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0sIDEwMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuYWlycG9ydFNlbGVjdC5vbk9yaWdpbk9wZW4odHJ1ZSk7XG4gICAgICB0aGlzLmZvY3VzQXN5bmMoXG4gICAgICAgICg8YW55PnRoaXMuYWlycG9ydFNlbGVjdC5haXJwb3J0U2VsZWN0RHJvcGRvd25PcmlnaW4pLmlucHV0XG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgc2V0TGF0ZXN0U2VhcmNoZXMoYWJhbmRvbmVkQmFza2V0OiBBcnJheTxBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWw+LCBhaXJwb3J0czogQXJyYXk8QWlycG9ydE1vZGVsPik6IHZvaWQge1xuICAgIGlmICghYWJhbmRvbmVkQmFza2V0IHx8ICFhaXJwb3J0cykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGNvbnN0IHVuaXF1ZSA9IG5ldyBBcnJheTxBYmFuZG9uZWRCYXNrZXRJdGVtTW9kZWw+KCk7XG5cbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgYWJhbmRvbmVkQmFza2V0KSB7XG4gICAgICBpZiAoIXVuaXF1ZS5zb21lKCh4KSA9PiB4LmRlc3RpbmF0aW9uQ29kZSA9PT0gaXRlbS5kZXN0aW5hdGlvbkNvZGUpKSB7XG4gICAgICAgIHVuaXF1ZS5wdXNoKGl0ZW0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IG9yaWdpbkNvZGVzID0gdW5pcXVlLm1hcCgoeCkgPT4geC5vcmlnaW5Db2RlKTtcbiAgICBjb25zdCBkZXN0aW5hdGlvbkNvZGVzID0gdW5pcXVlLm1hcCgoeCkgPT4geC5kZXN0aW5hdGlvbkNvZGUpO1xuXG4gICAgY29uc3QgbGF0ZXN0U2VhcmNoZXNPcmlnaW4gPSBhaXJwb3J0cy5maWx0ZXIoKGFpcnBvcnQpID0+XG4gICAgICB1bmlxdWUuc29tZShcbiAgICAgICAgKHgpID0+IHgub3JpZ2luQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uID0gYWlycG9ydHMuZmlsdGVyKChhaXJwb3J0KSA9PlxuICAgICAgdW5pcXVlLnNvbWUoXG4gICAgICAgICh4KSA9PiB4LmRlc3RpbmF0aW9uQ29kZS50b0xvd2VyQ2FzZSgpID09PSBhaXJwb3J0LmNvZGUudG9Mb3dlckNhc2UoKVxuICAgICAgKVxuICAgICk7XG5cbiAgICBjb25zdCBjb2RlID0gJ2NvZGUnO1xuICAgIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4gPSB0aGlzLnNvcnRTZXJ2aWNlXG4gICAgICAuc29ydEJ5T2JqZWN0KGxhdGVzdFNlYXJjaGVzT3JpZ2luLCBvcmlnaW5Db2RlcywgY29kZSlcbiAgICAgIC5zbGljZSgwLCAzKTtcblxuICAgIGlmICh0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luICYmIHRoaXMubGF0ZXN0U2VhcmNoZXNPcmlnaW4ubGVuZ3RoID4gMCAmJlxuICAgICAgdGhpcy5leGlzdHModGhpcy5vdmVycmlkZU9yaWdpbikpIHtcbiAgICAgIHRoaXMub3JpZ2luQWlycG9ydENvZGUgPSB0aGlzLmxhdGVzdFNlYXJjaGVzT3JpZ2luWzBdLmNvZGU7XG4gICAgfVxuXG4gICAgdGhpcy5sYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uID0gdGhpcy5zb3J0U2VydmljZVxuICAgICAgLnNvcnRCeU9iamVjdChsYXRlc3RTZWFyY2hlc0Rlc3RpbmF0aW9uLCBkZXN0aW5hdGlvbkNvZGVzLCBjb2RlKVxuICAgICAgLnNsaWNlKDAsIDMpO1xuICB9XG5cbiAgcHJpdmF0ZSBjbG9zZURyb3Bkb3ducygpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bikge1xuICAgICAgdGhpcy5wYXNzZW5nZXJTZWxlY3REcm9wZG93bi5vcGVuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMudHJpcFN3aXRjaCkge1xuICAgICAgdGhpcy50cmlwU3dpdGNoLm9wZW4gPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy50cmFuc2l0U3dpdGNoKSB7XG4gICAgICB0aGlzLnRyYW5zaXRTd2l0Y2gub3BlbiA9IGZhbHNlO1xuICAgIH1cbiAgfVxufVxuIiwiPG5hcy1hY2NvcmRpb24gKm5nSWY9XCJkZXZpY2VIZWxwZXI/LmlzTW9iaWxlKCkgJiYgZXhpc3RzKG1pbmltaXplT25Nb2JpbGUpOyBlbHNlIGZpbHRlclRlbXBsYXRlXCIgc2ltcGxlXG4gIGNvbnRhaW5lck9uVG9nZ2xlIHRyYW5zcGFyZW50IFtleHBhbmRlZF09XCJleHBhbmRlZEFjY29yZGlvbk1vYmlsZVwiIFt0aXRsZV09XCJlZGl0U2VhcmNoVGl0bGVcIlxuICAodG9nZ2xlQ2hhbmdlKT1cIm9uQWNjb3JkaW9uVG9nZ2xlQ2hhbmdlKCRldmVudClcIj5cbiAgPG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cImZpbHRlclRlbXBsYXRlXCI+PC9uZy1jb250YWluZXI+XG48L25hcy1hY2NvcmRpb24+XG48ZGl2IGNsYXNzPVwiY29udGFpbmVyXCIgKm5nSWY9XCJkZXZpY2VIZWxwZXI/LmlzTW9iaWxlKCkgJiYgZXhpc3RzKG1pbmltaXplT25Nb2JpbGUpICYmIGRpc3BsYXlTdW1tYXJ5XCI+e3tnZXRTdW1tYXJ5KCl9fVxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZmlsdGVyVGVtcGxhdGU+XG4gIDxkaXYgI2NvbnRhaW5lciBbbmFzQ2xhc3NdPVwiZ2V0Q29udGFpbmVyQ2xhc3MoKVwiPlxuICAgIDxkaXYgW25hc0NsYXNzXT1cImdldEZpbHRlckNsYXNzKCdmaWx0ZXJzJywgW2V4aXN0cyhtaW5pbWl6ZSkgJiYgJ21pbmltaXplZCcsIGV4aXN0cyhpbmxpbmVPbkRlc2t0b3ApICYmICdpbmxpbmUnXSlcIj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJhaXJwb3J0cz8ubGVuZ3RoID4gMFwiPlxuICAgICAgICA8bmFzLWFpcnBvcnQtc2VsZWN0ICpuZ0lmPVwiYWlycG9ydHMgJiYgYWlycG9ydFJlbGF0aW9ucyAmJiAoZW5hYmxlRGVzdGluYXRpb25TZWxlY3QpXCIgI2FpcnBvcnRTZWxlY3QgY29tYm9cbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb3dlci16LWluZGV4Jzogb3BlblBhc3NlbmdlclNlbGVjdCB8fCBpbmJvdW5kT3BlbiB8fCBvdXRib3VuZE9wZW4gfVwiIFxuICAgICAgICAgIFtvdXRib3VuZElkXT1cImFpcnBvcnRTZWxlY3RPdXRib3VuZElkXCIgW2luYm91bmRJZF09XCJhaXJwb3J0U2VsZWN0SW5ib3VuZElkXCIgW2FyaWFMYWJlbENsZWFyXT1cImFyaWFMYWJlbENsZWFyXCIgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCIgW25hc0Zvcm1Hcm91cF09XCJuYXNGb3JtR3JvdXBcIlxuICAgICAgICAgIFtuYXNGb3JtQ29udHJvbE5hbWVPcmlnaW5dPVwibmFzRm9ybUNvbnRyb2xOYW1lT3JpZ2luXCJcbiAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb25dPVwibmFzRm9ybUNvbnRyb2xOYW1lRGVzdGluYXRpb25cIiBbdXNlU3dpdGNoXT1cInVzZVN3aXRjaFwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldEFpcnBvcnRTZWxlY3RDbGFzcygpXCIgW2FpcnBvcnRzXT1cImFpcnBvcnRzXCIgW2FsbG93ZWRPcmlnaW5BaXBvcnRzXT1cImFsbG93ZWRPcmlnaW5BaXJwb3J0c1wiXG4gICAgICAgICAgW2FsbG93ZWREZXN0aW5hdGlvbkFpcnBvcnRzXT1cImFsbG93ZWREZXN0aW5hdGlvbkFpcnBvcnRzXCIgW2FpcnBvcnRSZWxhdGlvbnNdPVwiYWlycG9ydFJlbGF0aW9uc1wiXG4gICAgICAgICAgW2xhdGVzdFNlYXJjaGVzT3JpZ2luXT1cImxhdGVzdFNlYXJjaGVzT3JpZ2luXCIgW2xhdGVzdFNlYXJjaGVzRGVzdGluYXRpb25dPVwibGF0ZXN0U2VhcmNoZXNEZXN0aW5hdGlvblwiXG4gICAgICAgICAgW2Rpc3BsYXlMYXRlc3RTZWFyY2hlc109XCJkaXNwbGF5TGF0ZXN0U2VhcmNoZXNcIiBbZGlzcGxheUNsb3Nlc3RBaXJwb3J0c109XCJkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzXCJcbiAgICAgICAgICBbb3JpZ2luQWlycG9ydENvZGVdPVwib3JpZ2luQWlycG9ydENvZGVcIiBbZGVzdGluYXRpb25BaXJwb3J0Q29kZV09XCJkZXN0aW5hdGlvbkFpcnBvcnRDb2RlXCJcbiAgICAgICAgICBbYWxsQWlycG9ydHNMYWJlbF09XCJhbGxBaXJwb3J0c0xhYmVsXCIgW2xhdGVzdFNlYXJjaGVzTGFiZWxdPVwibGF0ZXN0U2VhcmNoZXNMYWJlbFwiXG4gICAgICAgICAgW2Nsb3Nlc3RBaXJwb3J0c0xhYmVsXT1cImNsb3Nlc3RBaXJwb3J0c0xhYmVsXCIgW2Nsb3Nlc3RBaXJwb3J0c109XCJjbG9zZXN0QWlycG9ydHNcIlxuICAgICAgICAgIFtzZWxlY3RPcmlnaW5GaXJzdExhYmVsXT1cInNlbGVjdE9yaWdpbkZpcnN0TGFiZWxcIiBbbGFiZWxPcmlnaW5dPVwibGFiZWxPcmlnaW5cIlxuICAgICAgICAgIFtwbGFjZWhvbGRlck9yaWdpbl09XCJwbGFjZWhvbGRlck9yaWdpblwiIFtsYWJlbERlc3RpbmF0aW9uXT1cImxhYmVsRGVzdGluYXRpb25cIlxuICAgICAgICAgIFtnZW9sb2NhdGlvbkxhYmVsXT1cImdlb2xvY2F0aW9uTGFiZWxcIiBbZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWxdPVwiZ2VvbG9jYXRpb25CbG9ja2VkTGFiZWxcIlxuICAgICAgICAgIFtwbGFjZWhvbGRlckRlc3RpbmF0aW9uXT1cInBsYWNlaG9sZGVyRGVzdGluYXRpb25cIiBba2VlcFNlbGVjdGlvbl09XCJrZWVwU2VsZWN0aW9uXCJcbiAgICAgICAgICBbaW52YWxpZERlc3RpbmF0aW9uVGV4dF09XCJpbnZhbGlkRGVzdGluYXRpb25UZXh0XCIgKG9yaWdpbkNoYW5nZSk9XCJzZXRTZWxlY3RlZE9yaWdpbkFpcnBvcnQoJGV2ZW50KVwiXG4gICAgICAgICAgKGRlc3RpbmF0aW9uQ2hhbmdlKT1cIm9uRGVzdGluYXRpb25DaGFuZ2UoJGV2ZW50KVwiIChmb2N1c09uTmV4dCk9XCJzZXRGb2N1c09uUGFzc2VuZ2VyU2VsZWN0KCRldmVudClcIlxuICAgICAgICAgIChvcmlnaW5PcGVuQ2hhbmdlKT1cIm9uT3JpZ2luT3BlbigkZXZlbnQpXCIgKGRlc3RpbmF0aW9uT3BlbkNoYW5nZSk9XCJvbkRlc3RpbmF0aW9uT3BlbigkZXZlbnQpXCJcbiAgICAgICAgICAocG9zaXRpb25DaGFuZ2UpPVwiZ2V0Q2xvc2VzdEFpcnBvcnRzKCRldmVudClcIj48L25hcy1haXJwb3J0LXNlbGVjdD5cbiAgICAgICAgPG5hcy1haXJwb3J0LXNlbGVjdCAqbmdJZj1cImFpcnBvcnRzICYmICghZW5hYmxlRGVzdGluYXRpb25TZWxlY3QpXCIgI2FpcnBvcnRTZWxlY3RcbiAgICAgICAgICBbbmdDbGFzc109XCJ7ICdsb3dlci16LWluZGV4Jzogb3BlblBhc3NlbmdlclNlbGVjdCB8fCBpbmJvdW5kT3BlbiB8fCBvdXRib3VuZE9wZW4gfVwiXG4gICAgICAgICAgW291dGJvdW5kSWRdPVwiYWlycG9ydFNlbGVjdE91dGJvdW5kSWRcIiBbYXJpYUxhYmVsQ2xlYXJdPVwiYXJpYUxhYmVsQ2xlYXJcIiBbYXJpYUxhYmVsQmFja2Ryb3BdPVwiYXJpYUxhYmVsQmFja2Ryb3BcIiBbbmFzRm9ybUdyb3VwXT1cIm5hc0Zvcm1Hcm91cFwiXG4gICAgICAgICAgW25hc0Zvcm1Db250cm9sTmFtZU9yaWdpbl09XCJuYXNGb3JtQ29udHJvbE5hbWVPcmlnaW5cIiBbdXNlU3dpdGNoXT1cInVzZVN3aXRjaFwiXG4gICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCdhaXJwb3J0LW9yaWdpbi1zZWxlY3QnKVwiIFthaXJwb3J0c109XCJhaXJwb3J0c1wiXG4gICAgICAgICAgW2FsbG93ZWRPcmlnaW5BaXBvcnRzXT1cImFsbG93ZWRPcmlnaW5BaXJwb3J0c1wiIFthaXJwb3J0UmVsYXRpb25zXT1cImFpcnBvcnRSZWxhdGlvbnNcIlxuICAgICAgICAgIFtsYXRlc3RTZWFyY2hlc09yaWdpbl09XCJsYXRlc3RTZWFyY2hlc09yaWdpblwiIFtkaXNwbGF5TGF0ZXN0U2VhcmNoZXNdPVwiZGlzcGxheUxhdGVzdFNlYXJjaGVzXCJcbiAgICAgICAgICBbZGlzcGxheUNsb3Nlc3RBaXJwb3J0c109XCJkaXNwbGF5Q2xvc2VzdEFpcnBvcnRzXCIgW29yaWdpbkFpcnBvcnRDb2RlXT1cIm9yaWdpbkFpcnBvcnRDb2RlXCJcbiAgICAgICAgICBbYWxsQWlycG9ydHNMYWJlbF09XCJhbGxBaXJwb3J0c0xhYmVsXCIgW2xhdGVzdFNlYXJjaGVzTGFiZWxdPVwibGF0ZXN0U2VhcmNoZXNMYWJlbFwiXG4gICAgICAgICAgW2Nsb3Nlc3RBaXJwb3J0c0xhYmVsXT1cImNsb3Nlc3RBaXJwb3J0c0xhYmVsXCIgW2Nsb3Nlc3RBaXJwb3J0c109XCJjbG9zZXN0QWlycG9ydHNcIlxuICAgICAgICAgIFtzZWxlY3RPcmlnaW5GaXJzdExhYmVsXT1cInNlbGVjdE9yaWdpbkZpcnN0TGFiZWxcIiBbbGFiZWxPcmlnaW5dPVwibGFiZWxPcmlnaW5cIlxuICAgICAgICAgIFtwbGFjZWhvbGRlck9yaWdpbl09XCJwbGFjZWhvbGRlck9yaWdpblwiIFtnZW9sb2NhdGlvbkxhYmVsXT1cImdlb2xvY2F0aW9uTGFiZWxcIlxuICAgICAgICAgIFtnZW9sb2NhdGlvbkJsb2NrZWRMYWJlbF09XCJnZW9sb2NhdGlvbkJsb2NrZWRMYWJlbFwiIFtrZWVwU2VsZWN0aW9uXT1cImtlZXBTZWxlY3Rpb25cIlxuICAgICAgICAgIChvcmlnaW5DaGFuZ2UpPVwic2V0U2VsZWN0ZWRPcmlnaW5BaXJwb3J0KCRldmVudClcIiAoZm9jdXNPbk5leHQpPVwic2V0Rm9jdXNPblBhc3NlbmdlclNlbGVjdCgkZXZlbnQpXCJcbiAgICAgICAgICAob3JpZ2luT3BlbkNoYW5nZSk9XCJvbk9yaWdpbk9wZW4oJGV2ZW50KVwiIChwb3NpdGlvbkNoYW5nZSk9XCJnZXRDbG9zZXN0QWlycG9ydHMoJGV2ZW50KVwiPjwvbmFzLWFpcnBvcnQtc2VsZWN0PlxuICAgICAgICA8bmFzLXN1Z2dlc3Rpb25zICpuZ0lmPVwiKGNsb3Nlc3RBaXJwb3J0cyB8fCBsYXRlc3RTZWFyY2hlc09yaWdpbikgJiYgZXhpc3RzKGVuYWJsZVN1Z2dlc3Rpb25zKVwiXG4gICAgICAgICAgW25nQ2xhc3NdPVwieyAnbG93ZXItei1pbmRleCc6IG9wZW5QYXNzZW5nZXJTZWxlY3QgfHwgaW5ib3VuZE9wZW4gfHwgb3V0Ym91bmRPcGVuIH1cIlxuICAgICAgICAgIFtuYXNDbGFzc109XCJnZXRGaWx0ZXJDbGFzcygnc3VnZ2VzdGlvbnMnLCAhZXhpc3RzKGVuYWJsZURhdGVwaWNrZXJzKSAmJiAnZmxleC1lbmQnKVwiIFtzdWdnZXN0aW9uc109XCJnZXRTdWdnZXN0aW9ucygpXCIgW29yTGFiZWxdPVwib3JMYWJlbFwiXG4gICAgICAgICAgKGFpcnBvcnRTZWxlY3QpPVwic2V0U2VsZWN0ZWRPcmlnaW5BaXJwb3J0KCRldmVudClcIj48L25hcy1zdWdnZXN0aW9ucz5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInNob3VsZE1heGltaXplKClcIj5cbiAgICAgICAgPGZvcm0gKm5nSWY9XCJlbmFibGVUcmlwU3dpdGNoXCIgW25hc0NsYXNzXT1cImdldENsYXNzKCdyYWRpbycsICFleGlzdHMoZW5hYmxlRGF0ZXBpY2tlcnMpICYmICdmbGV4LWVuZCcpXCI+XG4gICAgICAgICAgPG5hcy1yYWRpbyAjdHJpcFR5cGVSb3VuZFRyaXAgW2lkXT1cInRyaXBUeXBlSW5wdXRJZCArICdfX3JvdW5kLXRyaXAnXCIgW25hbWVdPVwiJ3RyaXBUeXBlJ1wiIFt2YWx1ZV09XCIyXCIgKGNoZWNrZWRDaGFuZ2UpPVwib25UcmlwVHlwZUNoYW5nZSgyKVwiIFtjaGVja2VkXT1cInRyaXBUeXBlID09PSAyXCI+XG4gICAgICAgICAgICB7e3RyaXBTd2l0Y2hSb3VuZFRyaXBMYWJlbH19XG4gICAgICAgICAgPC9uYXMtcmFkaW8+XG4gICAgICAgICAgPG5hcy1yYWRpbyAjdHJpcFR5cGVPbmV3YXkgW2lkXT1cInRyaXBUeXBlSW5wdXRJZCArICdfX29uZS13YXknXCIgW25hbWVdPVwiJ3RyaXBUeXBlJ1wiIFt2YWx1ZV09XCIxXCIgKGNoZWNrZWRDaGFuZ2UpPVwib25UcmlwVHlwZUNoYW5nZSgxKVwiIFtjaGVja2VkXT1cInRyaXBUeXBlID09PSAxXCI+XG4gICAgICAgICAgICB7e3RyaXBTd2l0Y2hPbmVXYXlMYWJlbH19XG4gICAgICAgICAgPC9uYXMtcmFkaW8+XG4gICAgICAgIDwvZm9ybT5cbiAgICAgICAgPGRpdiAqbmdJZj1cImV4aXN0cyhlbmFibGVEYXRlcGlja2VycylcIiBbbmFzQ2xhc3NdPVwiZ2V0RGF0ZVBpY2tlcnNDbGFzcygpXCI+XG4gICAgICAgICAgPG5hcy1kYXRlcGlja2VyLWNvbWJvICNkYXRlcGlja2VyQ29tYm8gY29tcGFjdCBcbiAgICAgICAgICAgIFtvdXRib3VuZElkXT1cImRhdGVQaWNrZXJPdXRib3VuZElkXCIgW2luYm91bmRJZF09XCJkYXRlUGlja2VySW5ib3VuZElkXCIgW2lubGluZUZsZXhdPVwiaW5saW5lRmxleFwiIFtuYXNGb3JtR3JvdXBdPVwibmFzRm9ybUdyb3VwXCJcbiAgICAgICAgICAgIFtuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZF09XCJuYXNGb3JtQ29udHJvbE5hbWVPdXRib3VuZFwiXG4gICAgICAgICAgICBbbmFzRm9ybUNvbnRyb2xOYW1lSW5ib3VuZF09XCJuYXNGb3JtQ29udHJvbE5hbWVJbmJvdW5kXCIgW2F2YWlsYWJpbGl0eV09XCJhdmFpbGFiaWxpdHlcIlxuICAgICAgICAgICAgW2F2YWlsYWJsZUZsaWdodHNMYWJlbF09XCJhdmFpbGFibGVGbGlnaHRzTGFiZWxcIiBbZGF0ZURpc3BsYXlGb3JtYXRdPVwiZGF0ZURpc3BsYXlGb3JtYXRcIlxuICAgICAgICAgICAgW2Rpc2FibGVQYXN0U2VsZWN0aW9uXT1cImRpc2FibGVQYXN0U2VsZWN0aW9uXCIgW2xvY2FsZV09XCJsb2NhbGVcIlxuICAgICAgICAgICAgW25vQXZhaWxhYmxlRmxpZ2h0c0xhYmVsXT1cIm5vQXZhaWxhYmxlRmxpZ2h0c0xhYmVsXCIgW2luYm91bmRBdmFpbGFibGVEYXRlc109XCJpbmJvdW5kQXZhaWxhYmxlRGF0ZXNcIlxuICAgICAgICAgICAgW2luYm91bmRMYWJlbF09XCJpbmJvdW5kTGFiZWxcIiBbbm9BdmFpbGFibGVGbGlnaHRzTGFiZWxdPVwibm9BdmFpbGFibGVGbGlnaHRzTGFiZWxcIlxuICAgICAgICAgICAgW291dGJvdW5kQXZhaWxhYmxlRGF0ZXNdPVwib3V0Ym91bmRBdmFpbGFibGVEYXRlc1wiIFtvdXRib3VuZExhYmVsXT1cIm91dGJvdW5kTGFiZWxcIlxuICAgICAgICAgICAgW3RpbWVEaXNwbGF5Rm9ybWF0XT1cInRpbWVEaXNwbGF5Rm9ybWF0XCIgW3RpbWVzXT1cInRpbWVzXCIgW291dGJvdW5kRGlzYWJsZWRdPVwib3V0Ym91bmREaXNhYmxlZFwiXG4gICAgICAgICAgICBbaW5ib3VuZERpc2FibGVkXT1cImluYm91bmREaXNhYmxlZFwiIFtvdXRib3VuZE9ubHldPVwidHJpcFR5cGUgPT09IDFcIlxuICAgICAgICAgICAgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCIgW2FyaWFMYWJlbFByZXZpb3VzTW9udGhdPVwiYXJpYUxhYmVsUHJldmlvdXNNb250aFwiXG4gICAgICAgICAgICBbYXJpYUxhYmVsTmV4dE1vbnRoXT1cImFyaWFMYWJlbE5leHRNb250aFwiIChmb2N1c09uTmV4dENoYW5nZSk9XCJvbkZvY3VzT25OZXh0Q2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKGZvY3VzT25QcmV2aW91c0NoYW5nZSk9XCJvbkRhdGVwaWNrZXJGb2N1c09uUHJldmlvdXMoJGV2ZW50KVwiXG4gICAgICAgICAgICAoaW5ib3VuZE1vbnRoQ2hhbmdlKT1cIm9uSW5ib3VuZE1vbnRoQ2hhbmdlKCRldmVudClcIiAob3V0Ym91bmRNb250aENoYW5nZSk9XCJvbk91dGJvdW5kTW9udGhDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICBbKG91dGJvdW5kT3BlbildPVwib3V0Ym91bmRPcGVuXCIgWyhpbmJvdW5kT3BlbildPVwiaW5ib3VuZE9wZW5cIlxuICAgICAgICAgICAgWyhpbmJvdW5kU2VsZWN0ZWREYXRlKV09XCJpbmJvdW5kU2VsZWN0ZWREYXRlXCIgWyhvdXRib3VuZFNlbGVjdGVkRGF0ZSldPVwib3V0Ym91bmRTZWxlY3RlZERhdGVcIj5cbiAgICAgICAgICA8L25hcy1kYXRlcGlja2VyLWNvbWJvPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cImVuYWJsZVBhc3NlbmdlcnNTZWxlY3QgfHwgZW5hYmxlVHJhbnNpdFN3aXRjaFwiIFtuYXNDbGFzc109XCJnZXRDbGFzcygnZHJvcGRvd24td3JhcHBlcicpXCI+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImVuYWJsZVBhc3NlbmdlcnNTZWxlY3RcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3Bhc3NlbmdlcnMnKVwiPlxuICAgICAgICAgICAgPGJ1dHRvbiAoY2xpY2spPVwib25QYXNzZW5nZXJTZWxlY3RPcGVuKCRldmVudClcIiBbaWRdPVwicGFzc2VuZ2VyU2VsZWN0SWRcIlxuICAgICAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3Bhc3NlbmdlcnMtYnV0dG9uJywgb3BlblBhc3NlbmdlclNlbGVjdCAmJiAnYWN0aXZlJylcIj5cbiAgICAgICAgICAgICAgPGRpdiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2xhYmVsJylcIj5cbiAgICAgICAgICAgICAgICA8cCBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ2J1dHRvbi10aXRsZScpXCI+e3twYXNzZW5nZXJzVGl0bGVMYWJlbH19PC9wPlxuICAgICAgICAgICAgICAgIDxwPnt7cGFzc2VuZ2VyU2VsZWN0TGFiZWx9fTwvcD5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmF2ZWxlci1pY29uJylcIj48bmFzLWljb24gW2ljb25dPVwiJ215LXByb2ZpbGUtY29tcGFjdCdcIlxuICAgICAgICAgICAgICAgICAgW3R5cGVdPVwiJ3NtYWxsJ1wiPjwvbmFzLWljb24+PC9kaXY+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcGVuUGFzc2VuZ2VyU2VsZWN0XCIgW25hc0NsYXNzXT1cImdldENsYXNzKCdwYXNzZW5nZXJzLXNlbGVjdGlvbicpXCI+XG4gICAgICAgICAgICAgIDxuYXMtcGFzc2VuZ2VyLXNlbGVjdCBbYXJpYUxhYmVsQWRkXT1cImFyaWFMYWJlbEFkZFwiIFthcmlhTGFiZWxTdWJ0cmFjdF09XCJhcmlhTGFiZWxTdWJ0cmFjdFwiXG4gICAgICAgICAgICAgICAgW2FkdWx0c0xhYmVsXT1cInBhc3NlbmdlclNlbGVjdEFkdWx0c0xhYmVsXCIgW3lvdXRoc0xhYmVsXT1cInBhc3NlbmdlclNlbGVjdFlvdXRoc0xhYmVsXCJcbiAgICAgICAgICAgICAgICBbeW91bmdBZHVsdHNMYWJlbF09XCJwYXNzZW5nZXJTZWxlY3RZb3VuZ0FkdWx0c0xhYmVsXCIgW2NoaWxkcmVuTGFiZWxdPVwicGFzc2VuZ2VyU2VsZWN0Q2hpbGRyZW5MYWJlbFwiXG4gICAgICAgICAgICAgICAgW2luZmFudHNMYWJlbF09XCJwYXNzZW5nZXJTZWxlY3RJbmZhbnRzTGFiZWxcIiBbbWF4UGF4Q291bnRdPVwibWF4UGF4Q291bnRcIlxuICAgICAgICAgICAgICAgIFttaW5BZHVsdENvdW50XT1cIm1pbkFkdWx0Q291bnRcIiBbdGl0bGVdPVwicGFzc2VuZ2VyU2VsZWN0VGl0bGVcIiBbbmFzRm9ybUdyb3VwXT1cIm5hc0Zvcm1Hcm91cFwiXG4gICAgICAgICAgICAgICAgW25hc0Zvcm1Db250cm9sR3JvdXBCb29raW5nXT1cIm5hc0Zvcm1Db250cm9sR3JvdXBCb29raW5nXCIgW2dyb3VwQm9va2luZ0xhYmVsXT1cImdyb3VwQm9va2luZ0xhYmVsXCJcbiAgICAgICAgICAgICAgICBbZ3JvdXBCb29raW5nTGltaXRdPVwiZ3JvdXBCb29raW5nTGltaXRcIiAoZm9jdXNPbk5leHQpPVwib25QYXNzZW5nZXJzU2VsZWN0Rm9jdXNPbk5leHQoKVwiXG4gICAgICAgICAgICAgICAgKGZvY3VzT25QcmV2aW91cyk9XCJvblBhc3NlbmdlcnNTZWxlY3RGb2N1c09uUHJldmlvdXMoKVwiXG4gICAgICAgICAgICAgICAgWyhwYXNzZW5nZXJzKV09XCJwYXNzZW5nZXJzXCI+PC9uYXMtcGFzc2VuZ2VyLXNlbGVjdD5cbiAgICAgICAgICAgICAgICAgIDxuYXMtYmFja2Ryb3AgW2FyaWFMYWJlbEJhY2tkcm9wXT1cImFyaWFMYWJlbEJhY2tkcm9wXCJcbiAgICAgICAgICAgICAgICBbKHNob3dCYWNrZHJvcCldPVwib3BlblBhc3NlbmdlclNlbGVjdFwiPjwvbmFzLWJhY2tkcm9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiAqbmdJZj1cImVuYWJsZVRyYW5zaXRTd2l0Y2hcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3RyYW5zaXQtdHlwZScpXCI+XG4gICAgICAgICAgICA8bmFzLWJ1dHRvbiAqbmdJZj1cImRpcmVjdE9ubHlMYWJlbCAmJiBkaXJlY3RUcmFuc2l0TGFiZWxcIiAjdHJhbnNpdFN3aXRjaCBibG9jayBsaWdodFxuICAgICAgICAgICAgICBbaWRdPVwidHJhbnNpdFR5cGVJbnB1dElkXCIgW2ljb25UeXBlXT1cIidjaGV2cm9uLWRvd24nXCIgW2xhYmVsXT1cImdldFRyYW5zaXRMYWJlbCgpXCJcbiAgICAgICAgICAgICAgW25hc0NsYXNzXT1cImdldENsYXNzKCd0cmFuc2l0Jywgb3BlblRyYW5zaXRUeXBlU2VsZWN0ICYmICdhY3RpdmUnKVwiXG4gICAgICAgICAgICAgIFthcmlhTGFiZWxCYWNrZHJvcF09XCJhcmlhTGFiZWxCYWNrZHJvcFwiIChjbGljayk9XCJvblRyYW5zaXRTd2l0Y2hPcGVuKCRldmVudClcIlxuICAgICAgICAgICAgICAoa2V5ZG93bik9XCJ0cmFuc2l0S2V5RG93bigkZXZlbnQpXCI+e3sgZ2V0VHJhbnNpdExhYmVsKCkgfX1cbiAgICAgICAgICAgIDwvbmFzLWJ1dHRvbj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCJvcGVuVHJhbnNpdFR5cGVTZWxlY3RcIiBbbmFzQ2xhc3NdPVwiZ2V0Q2xhc3MoJ3RyYW5zaXQtdHlwZS1zZWxlY3Rpb24nKVwiPlxuICAgICAgICAgICAgICA8YnV0dG9uIFtpZF09XCJ0cmFuc2l0VHlwZUlucHV0SWQgKyAnX19kaXJlY3QnXCIgW25hc0NsYXNzXT1cImdldFRyYXZlbERldGFpbHNDbGFzcygnYWN0aW9uJywgZGlyZWN0T25seSAmJiAnYWN0aXZlJylcIiB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAjdHJhbnNpdFR5cGVEaXJlY3RPbmx5IChjbGljayk9XCJvblRyYW5zaXRDaGFuZ2UodHJ1ZSlcIj57eyBkaXJlY3RPbmx5TGFiZWwgfX1cbiAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgIDxidXR0b24gW2lkXT1cInRyYW5zaXRUeXBlSW5wdXRJZCArICdfX3RyYW5zaXQnXCIgdHlwZT1cImJ1dHRvblwiICN0cmFuc2l0VHlwZVRyYW5zaXRcbiAgICAgICAgICAgICAgICBbbmFzQ2xhc3NdPVwiZ2V0VHJhdmVsRGV0YWlsc0NsYXNzKCdhY3Rpb24nLCAhZGlyZWN0T25seSAmJiAnYWN0aXZlJylcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJvblRyYW5zaXRDaGFuZ2UoZmFsc2UpXCI+e3sgZGlyZWN0VHJhbnNpdExhYmVsIH19XG4gICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8bmFzLWJhY2tkcm9wIFthcmlhTGFiZWxCYWNrZHJvcF09XCJhcmlhTGFiZWxCYWNrZHJvcFwiXG4gICAgICAgICAgICAgICAgWyhzaG93QmFja2Ryb3ApXT1cIm9wZW5UcmFuc2l0VHlwZVNlbGVjdFwiPjwvbmFzLWJhY2tkcm9wPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIDwvZGl2PlxuPC9uZy10ZW1wbGF0ZT4iXX0=