@wavemaker/app-ng-runtime 11.11.7-rc.6211 → 11.12.0-next.28182

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.
@@ -595,10 +595,7 @@
595
595
  // if prev datavalue is not equal to current datavalue then clear the modelByKey and queryModel
596
596
  if (!lodashEs.isObject(val) && this.prevDatavalue !== val) {
597
597
  this._modelByKey = undefined;
598
- if (this.queryModel === '' || this.queryModel === undefined) {
599
- this.query = '';
600
- }
601
- this.queryModel = '';
598
+ this.query = this.queryModel = '';
602
599
  }
603
600
  // if the datafield is ALLFILEDS do not fetch the records
604
601
  // update the query model with the values we have
@@ -989,9 +986,7 @@
989
986
  // resetting the queryModel only when prevDatavalue is equal to data
990
987
  if (this.prevDatavalue !== data) {
991
988
  this.queryModel = undefined;
992
- if (!data || data === '') {
993
- this.query = '';
994
- }
989
+ this.query = '';
995
990
  return;
996
991
  }
997
992
  }
@@ -1006,15 +1001,6 @@
1006
1001
  this.typeahead.keyUpEventEmitter.emit(this.query);
1007
1002
  }
1008
1003
  }
1009
- handleInputBlur($event) {
1010
- this.queryModel = [{
1011
- key: this.query,
1012
- value: this.query,
1013
- label: this.query
1014
- }];
1015
- this._modelByValue = this.query;
1016
- this.datavalue = this.query;
1017
- }
1018
1004
  notifySubscriber() {
1019
1005
  const parentEl = $(this.nativeElement).closest('.app-composite-widget.caption-floating');
1020
1006
  if (parentEl.length > 0) {
@@ -1152,7 +1138,6 @@
1152
1138
  super.ngAfterViewInit();
1153
1139
  i3.styler(this.nativeElement, this);
1154
1140
  this.containerTarget = i3.getContainerTargetClass(this.nativeElement);
1155
- this.nativeElement.querySelector('input')?.addEventListener('blur', this.handleInputBlur.bind(this));
1156
1141
  }
1157
1142
  ngAfterViewChecked() {
1158
1143
  const searchInputEl = $('.app-search-input');
@@ -273,10 +273,7 @@ export class SearchComponent extends DatasetAwareFormComponent {
273
273
  // if prev datavalue is not equal to current datavalue then clear the modelByKey and queryModel
274
274
  if (!isObject(val) && this.prevDatavalue !== val) {
275
275
  this._modelByKey = undefined;
276
- if (this.queryModel === '' || this.queryModel === undefined) {
277
- this.query = '';
278
- }
279
- this.queryModel = '';
276
+ this.query = this.queryModel = '';
280
277
  }
281
278
  // if the datafield is ALLFILEDS do not fetch the records
282
279
  // update the query model with the values we have
@@ -667,9 +664,7 @@ export class SearchComponent extends DatasetAwareFormComponent {
667
664
  // resetting the queryModel only when prevDatavalue is equal to data
668
665
  if (this.prevDatavalue !== data) {
669
666
  this.queryModel = undefined;
670
- if (!data || data === '') {
671
- this.query = '';
672
- }
667
+ this.query = '';
673
668
  return;
674
669
  }
675
670
  }
@@ -684,15 +679,6 @@ export class SearchComponent extends DatasetAwareFormComponent {
684
679
  this.typeahead.keyUpEventEmitter.emit(this.query);
685
680
  }
686
681
  }
687
- handleInputBlur($event) {
688
- this.queryModel = [{
689
- key: this.query,
690
- value: this.query,
691
- label: this.query
692
- }];
693
- this._modelByValue = this.query;
694
- this.datavalue = this.query;
695
- }
696
682
  notifySubscriber() {
697
683
  const parentEl = $(this.nativeElement).closest('.app-composite-widget.caption-floating');
698
684
  if (parentEl.length > 0) {
@@ -830,7 +816,6 @@ export class SearchComponent extends DatasetAwareFormComponent {
830
816
  super.ngAfterViewInit();
831
817
  styler(this.nativeElement, this);
832
818
  this.containerTarget = getContainerTargetClass(this.nativeElement);
833
- this.nativeElement.querySelector('input')?.addEventListener('blur', this.handleInputBlur.bind(this));
834
819
  }
835
820
  ngAfterViewChecked() {
836
821
  const searchInputEl = $('.app-search-input');
@@ -953,4 +938,4 @@ export class SearchComponent extends DatasetAwareFormComponent {
953
938
  args: ['liElements']
954
939
  }] }); })();
955
940
  (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(SearchComponent, { className: "SearchComponent", filePath: "search.component.ts", lineNumber: 72 }); })();
956
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9iYXNpYy9zZWFyY2gvc3JjL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvc2VhcmNoL3NyYy9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBR0gsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBOEIsa0JBQWtCLEVBQWtCLGVBQWUsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXpILE9BQU8sRUFBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM1RyxPQUFPLEVBQ0gs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ZUFBZTs7aUZBU2xGLGVBQWU7Y0FYM0IsU0FBUzs2QkFDSSxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxZQUNsRixZQUFZLGFBRVg7b0JBQ1AsU0FBUyxrQkFBa0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO29CQUNuRCxTQUFTLGtCQUFrQixhQUFhLEVBQUUsSUFBSSxDQUFDO29CQUMvQyxrQkFBa0IsaUJBQWlCO2lCQUN0Qzs7c0JBK0VJLFNBQVM7dUJBQUMsZ0JBQWdCOztzQkFDMUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBNUNWLFNBQVM7a0JBQXZDLFNBQVM7bUJBQUMsa0JBQWtCO1lBQ0wsU0FBUztrQkFBaEMsU0FBUzttQkFBQyxXQUFXO1lBQ00sVUFBVTtrQkFBckMsWUFBWTttQkFBQyxZQUFZOztrRkFyQ2pCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgV21Db21wb25lbnRzTW9kdWxlIH0gZnJvbSBcIkB3bS9jb21wb25lbnRzL2Jhc2VcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vc2Nyb2xsYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgUXVlcnlMaXN0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7ZnJvbSwgT2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1lcmdlTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7VHlwZWFoZWFkQ29udGFpbmVyQ29tcG9uZW50LCBUeXBlYWhlYWREaXJlY3RpdmUsIFR5cGVhaGVhZE1hdGNoLCBUeXBlYWhlYWRNb2R1bGV9IGZyb20gJ25neC1ib290c3RyYXAvdHlwZWFoZWFkJztcblxuaW1wb3J0IHthZGRDbGFzcywgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sIEFwcCwgRGF0YVNvdXJjZSwgaXNEZWZpbmVkLCBpc01vYmlsZSwgdG9Cb29sZWFufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFMTEZJRUxEUyxcbiAgICBjb252ZXJ0RGF0YVRvT2JqZWN0LFxuICAgIERhdGFTZXRJdGVtLFxuICAgIGV4dHJhY3REYXRhQXNBcnJheSxcbiAgICBnZXRDb250YWluZXJUYXJnZXRDbGFzcyxcbiAgICBnZXRVbmlxT2Jqc0J5RGF0YUZpZWxkLFxuICAgIHByb3ZpZGVBcyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgc3R5bGVyLFxuICAgIHRyYW5zZm9ybUZvcm1EYXRhXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50fSBmcm9tICdAd20vY29tcG9uZW50cy9pbnB1dCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJQcm9wc30gZnJvbSAnLi9zZWFyY2gucHJvcHMnO1xuaW1wb3J0IHtEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXJDb25maWd9IGZyb20gJy4vZGF0YS1wcm92aWRlci9kYXRhLXByb3ZpZGVyJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2UsXG4gICAgZmluZCxcbiAgICBnZXQsXG4gICAgaW5jbHVkZXMsXG4gICAgaXNBcnJheSxcbiAgICBpc0VtcHR5LFxuICAgIGlzRXF1YWwsXG4gICAgaXNPYmplY3QsXG4gICAgaXNVbmRlZmluZWQsXG4gICAgbWFwLFxuICAgIHNwbGl0LFxuICAgIHRvU3RyaW5nLFxuICAgIHRyaW1cbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0geyB3aWRnZXRUeXBlOiAnd20tc2VhcmNoJywgaG9zdENsYXNzOiAnaW5wdXQtZ3JvdXAnIH07XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBXbUNvbXBvbmVudHNNb2R1bGUsIEZvcm1zTW9kdWxlLCBTY3JvbGxhYmxlRGlyZWN0aXZlLCBUeXBlYWhlYWRNb2R1bGVdLFxuICAgIHNlbGVjdG9yOiAnW3dtU2VhcmNoXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBcyhTZWFyY2hDb21wb25lbnQsIE5HX1ZBTFVFX0FDQ0VTU09SLCB0cnVlKSxcbiAgICAgICAgcHJvdmlkZUFzKFNlYXJjaENvbXBvbmVudCwgTkdfVkFMSURBVE9SUywgdHJ1ZSksXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihTZWFyY2hDb21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuICAgIHB1YmxpYyBjYXNlc2Vuc2l0aXZlOiBib29sZWFuO1xuICAgIHB1YmxpYyBzZWFyY2hrZXk6IHN0cmluZztcbiAgICBwdWJsaWMgcXVlcnlNb2RlbDogQXJyYXk8RGF0YVNldEl0ZW0+IHwgc3RyaW5nO1xuICAgIHB1YmxpYyBxdWVyeSA9ICcnO1xuICAgIHB1YmxpYyBsaW1pdDogYW55O1xuICAgIHB1YmxpYyBzaG93c2VhcmNoaWNvbjogYm9vbGVhbjtcbiAgICBwdWJsaWMgbWluY2hhcnM6IG51bWJlcjtcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xuICAgIHB1YmxpYyBuYXZzZWFyY2hiYXI6IGFueTtcbiAgICBwdWJsaWMgZGVib3VuY2V0aW1lOiBudW1iZXI7XG4gICAgcHVibGljIGhpbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgYXJpYWxhYmVsOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGFwcDogQXBwO1xuICAgIHByaXZhdGUgdHlwZWFoZWFkRGF0YVNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgcGFnZXNpemU6IGFueTtcbiAgICBwcml2YXRlIHBhZ2UgPSAxO1xuICAgIHB1YmxpYyBfbG9hZGluZ0l0ZW1zOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBJRGF0YVByb3ZpZGVyO1xuICAgIHByaXZhdGUgcmVzdWx0OiBBcnJheTxhbnk+OyAvLyBjb250YWlucyB0aGUgc2VhcmNoIHJlc3VsdCBpLmUuIG1hdGNoZXNcbiAgICBwcml2YXRlIGZvcm1hdHRlZERhdGFzZXQ6IGFueTtcbiAgICBwcml2YXRlIGlzZm9ybWZpZWxkOiBib29sZWFuO1xuICAgIHByaXZhdGUgJHR5cGVhaGVhZEV2ZW50OiBFdmVudDtcblxuICAgIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGFydEluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIGJpbmRkaXNwbGF5bGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZWFoZWFkQ29udGFpbmVyOiBUeXBlYWhlYWRDb250YWluZXJDb21wb25lbnQ7XG4gICAgcHVibGljIGNvbnRhaW5lclRhcmdldDogc3RyaW5nO1xuICAgIHB1YmxpYyBjbGVhcnNlYXJjaGljb25jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWNrc2VhcmNoaWNvbmNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHNlYXJjaGljb25jbGFzczogc3RyaW5nO1xuXG4gICAgQFZpZXdDaGlsZChUeXBlYWhlYWREaXJlY3RpdmUpIHR5cGVhaGVhZDogVHlwZWFoZWFkRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ3VsRWxlbWVudCcpIHVsRWxlbWVudDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkcmVuKCdsaUVsZW1lbnRzJykgbGlFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gICAgcHJpdmF0ZSBhbGxvd29ubHlzZWxlY3Q6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjbGFzczogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgZGF0YW9wdGlvbnM6IGFueTtcbiAgICBwdWJsaWMgZHJvcGRvd25FbDogYW55O1xuICAgIHByaXZhdGUgX2xhc3RRdWVyeTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2xhc3RSZXN1bHQ6IGFueTtcbiAgICBwcml2YXRlIF9pc09wZW46IGJvb2xlYW47IC8vIHNldCB0byB0cnVlIHdoZW4gZHJvcGRvd24gaXMgb3BlblxuICAgIHByaXZhdGUgc2hvd0Nsb3NlYnRuOiBib29sZWFuO1xuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlRHY6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55O1xuICAgIHByaXZhdGUgaXNTY3JvbGxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBhcmVudEVsOiBhbnk7XG4gICAgcHJpdmF0ZSBwb3NpdGlvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgZWxJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgbGlzdGVuUXVlcnk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZG9tVXBkYXRlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlYXJjaG9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzaG93Y2xlYXI6IGJvb2xlYW47XG4gICAgcHVibGljIG1hdGNobW9kZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY2xlYXJEYXRhOiBib29sZWFuO1xuXG5cbiAgICAvLyBnZXR0ZXIgc2V0dGVyIGlzIGFkZGVkIHRvIHBhc3MgdGhlIGRhdGFzb3VyY2UgdG8gc2VhcmNoY29tcG9uZW50LlxuICAgIGdldCBkYXRhc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YXNvdXJjZTtcbiAgICB9XG5cbiAgICBzZXQgZGF0YXNvdXJjZShudikge1xuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gbnY7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGF2YWx1ZSB8fCB0aGlzLnRvQmVQcm9jZXNzZWREYXRhdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlQnlEYXRhdmFsdWUoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhdmFsdWUuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXZhbHVlLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG4gICAgICAgIC8vIHRoaXMgZmxhZyB3aWxsIG5vdCBhbGxvdyB0aGUgZW1wdHkgZGF0YWZpZWxkIHZhbHVlcy5cbiAgICAgICAgdGhpcy5hbGxvd2VtcHR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgICAgICBhZGRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdhcHAtc2VhcmNoJywgdHJ1ZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbnMgZm9yIHRoZSBjaGFuZ2UgaW4gdGhlIG5nTW9kZWwgb24gZXZlcnkgc2VhcmNoIGFuZCByZXRyaWV2ZXMgdGhlIGRhdGEgYXMgb2JzZXJ2YWJsZS5cbiAgICAgICAgICogVGhpcyBvYnNlcnZhYmxlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSB0eXBlYWhlYWQuXG4gICAgICAgICAqIEB0eXBlIHtPYnNlcnZhYmxlPGFueT59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGVhaGVhZERhdGFTb3VyY2UgPSBPYnNlcnZhYmxlXG4gICAgICAgICAgICAuY3JlYXRlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUnVucyBvbiBldmVyeSBzZWFyY2hcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5RdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodGhpcy5xdWVyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9uIGtleWRvd24sIHdoaWxlIHNjcm9sbGluZyB0aGUgZHJvcGRvd24gaXRlbXMsIHdoZW4gbGFzdCBpdGVtIGlzIHJlYWNoZWQgbmV4dCBjYWxsIGlzIHRyaWdnZXJlZFxuICAgICAgICAgICAgICAgIC8vIHVubGVzcyB0aGUgY2FsbCBpcyByZXNvbHZlZCwgd2UgYXJlIGFibGUgdG8gc2Nyb2xsIG5leHQgdG8gZmlyc3QgaXRlbSBhbmQgc29vblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvd3MgZmxpY2tlcmluZyBmcm9tIGZpcnN0IGl0ZW0gdG8gbmV4dCBuZXcgaXRlbXMgYXBwZW5kZWQuXG4gICAgICAgICAgICAgICAgLy8gQnkgc2V0dGluZyBjb250YWluZXIgdG8gdW5kZWZpbmVkLCBrZXkgZXZlbnRzIGNoYW5nZXMgd2lsbCBiZSBzdG9wcGVkIHdoaWxlIGxvYWRpbmcgaXRlbXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5fY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5taW5jaGFycyA9PT0gMCB8fCAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lmxlbmd0aCA+PSB0aGlzLm1pbmNoYXJzKSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKHRva2VuOiBzdHJpbmcpID0+IHRoaXMuZ2V0RGF0YVNvdXJjZUFzT2JzZXJ2YWJsZSh0b2tlbikpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyID0gbmV3IERhdGFQcm92aWRlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGRlZmF1bHQgZGF0YXZhbHVlIGlzIG5vdCBmb3VuZCB3aXRoaW4gdGhlIGRhdGFzZXQsIGEgZmlsdGVyIGNhbGwgaXMgbWFkZSB0byBnZXQgdGhlIHJlY29yZCB1c2luZyBmZXRjaERlZmF1bHRNb2RlbC5cbiAgICAgICAgICogYWZ0ZXIgZ2V0dGluZyB0aGUgcmVzcG9uc2UsIHNldCB0aGUgcXVlcnlNb2RlbCBhbmQgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBkYXRhdmFsdWVTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGF2YWx1ZSQuc3Vic2NyaWJlKCh2YWw6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSAoaXNBcnJheSh2YWwpID8gdmFsWzBdIDogdmFsKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnlNb2RlbCA9ICcnO1xuICAgICAgICAgICAgICAgIC8vIG9uIGNsZWFyIG9yIHJlc2V0IGZpbHRlciwgZW1wdHkgdGhlIGxhc3RSZXN1bHRzIHRvIGZldGNoIG5ldyByZWNvcmRzLlxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Vuc3Vic2NyaWJlRHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gaWYgcHJldiBkYXRhdmFsdWUgaXMgbm90IGVxdWFsIHRvIGN1cnJlbnQgZGF0YXZhbHVlIHRoZW4gY2xlYXIgdGhlIG1vZGVsQnlLZXkgYW5kIHF1ZXJ5TW9kZWxcbiAgICAgICAgICAgICAgICBpZiAoIWlzT2JqZWN0KHZhbCkgJiYgKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlNb2RlbCA9PT0gJycgfHwgdGhpcy5xdWVyeU1vZGVsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfSB0aGlzLnF1ZXJ5TW9kZWwgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhlIGRhdGFmaWVsZCBpcyBBTExGSUxFRFMgZG8gbm90IGZldGNoIHRoZSByZWNvcmRzXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRoZSBxdWVyeSBtb2RlbCB3aXRoIHRoZSB2YWx1ZXMgd2UgaGF2ZVxuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnlEYXRhdmFsdWUodmFsKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdHVybiBvbiBzaG93Q2xvc2VCdG4gd2hlbiBhIGRlZmF1bHQgdmFsdWUgaXMgZ2l2ZW5cbiAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJEZXN0cm95TGlzdGVuZXIoKCkgPT4gZGF0YXZhbHVlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuXG4gICAgICAgIGNvbnN0IGRhdGFzZXRTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGFzZXQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgdGhlIG5leHQgaXRlbSBpbmRleC5cbiAgICAgICAgICAgIHRoaXMuc3RhcnRJbmRleCA9IHRoaXMuZGF0YXNldEl0ZW1zLmxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWUgPSB0aGlzLmRhdGF2YWx1ZSB8fCB0aGlzLnRvQmVQcm9jZXNzZWREYXRhdmFsdWU7XG4gICAgICAgICAgICAvLyBpbnZva2luZyB1cGRhdGVCeURhdGFzZXQgb25seSB3aGVuIGRhdGF2YWx1ZSBpcyBwcmVzZW50LCBhcyBlbnRlcmVkIHZhbHVlIGkuZS4gcXVlcnkgaXMgc2V0dGluZyBiYWNrIHRvICcnXG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKGRlZmF1bHRWYWx1ZSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YXNldChkZWZhdWx0VmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBkYXRhc2V0U3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xuICAgIH1cblxuICAgIC8vIG9uIGNsZWFyLCB0cmlnZ2VyIHNlYXJjaCB3aXRoIHBhZ2Ugc2l6ZSAxXG4gICAgcHJpdmF0ZSBjbGVhclNlYXJjaCgkZXZlbnQsIGxvYWRPbkNsZWFyKSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgdGhpcy5vbklucHV0Q2hhbmdlKCRldmVudCk7XG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IGZhbHNlO1xuICAgICAgICBpZiAobG9hZE9uQ2xlYXIpIHtcbiAgICAgICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVEdiA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NsZWFyc2VhcmNoJyk7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAvLyB3aGVuIHNlYXJjaCBpbnB1dCBpcyBjbGVhcmVkLCBmb2N1cyBvbiB0aGUgaW5wdXQgZmllbGRcbiAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuYXBwLXNlYXJjaC1pbnB1dCcpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBmdW5jdGlvbiB0byAgY2xlYXIgdGhlIGlucHV0IHZhbHVlXG4gICAgcHVibGljIGNsZWFyVGV4dCgpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIENsb3NlIHRoZSBmdWxsIHNjcmVlbiBtb2RlIGluIG1vYmlsZSB2aWV3IG9mIGF1dG8gY29tcGxldGVcbiAgICBwcml2YXRlIGNsb3NlU2VhcmNoKCkge1xuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYWdlID0gMTtcbiAgICAgICAgLy8gYWZ0ZXIgY2xvc2luZyB0aGUgc2VhcmNoLCBpbnNlcnQgdGhlIGVsZW1lbnQgYXQgaXRzIHByZXZpb3VzIHBvc2l0aW9uIChlbEluZGV4KVxuICAgICAgICB0aGlzLmluc2VydEF0SW5kZXgodGhpcy5lbEluZGV4KTtcbiAgICAgICAgdGhpcy5lbEluZGV4ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLnBhcmVudEVsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKCdmdWxsLXNjcmVlbicpO1xuICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5fZG9tVXBkYXRlZCA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVEdiA9IHRydWU7XG4gICAgICAgIHRoaXMudHlwZWFoZWFkLmhpZGUoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHJlbmRlck1vYmlsZUF1dG9Db21wbGV0ZSgpIHtcbiAgICAgICAgLy8gR2V0IHRoZSBwYXJlbnQgZWxlbWVudCBvZiB0aGUgc2VhcmNoIGVsZW1lbnQgd2hpY2ggY2FuIGJlIG5leHQgb3IgcHJldiBlbGVtZW50LCBpZiBib3RoIGFyZSBlbXB0eSB0aGVuIGdldCB0aGUgcGFyZW50IG9mIGVsZW1lbnQuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMuZWxJbmRleCkpIHtcbiAgICAgICAgICAgIHRoaXMucGFyZW50RWwgPSB0aGlzLiRlbGVtZW50LnBhcmVudCgpO1xuICAgICAgICAgICAgdGhpcy5lbEluZGV4ID0gdGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmluZGV4KHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgLy8gdGhpcyBmbGFnIGlzIHNldCB0byBub3RpZnkgdGhhdCB0aGUgdHlwZWFoZWFkLWNvbnRhaW5lciBkb20gaGFzIGNoYW5nZWQgaXRzIHBvc2l0aW9uXG4gICAgICAgICAgICB0aGlzLl9kb21VcGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIEFkZCBmdWxsIHNjcmVlbiBjbGFzcyBvbiBmb2N1cyBvZiB0aGUgaW5wdXQgZWxlbWVudC5cbiAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3MoJ2Z1bGwtc2NyZWVuJyk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBwb3NpdGlvbiB0byBzZXQgdGhlIGhlaWdodCB0byBhdXRvXG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ2lubGluZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMucG9zaXRpb24pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGZvY3VzIGlzIGxvc3Qgd2hlbiBlbGVtZW50IGlzIGNoYW5nZWQgdG8gZnVsbC1zY3JlZW4sIGtleWRvd24gdG8gc2VsZWN0IG5leHQgaXRlbXMgd2lsbCBub3Qgd29ya1xuICAgICAgICAvLyBIZW5jZSBleHBsaWNpdGx5IGZvY3VzaW5nIHRoZSBpbnB1dFxuICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5maW5kKCcuYXBwLXNlYXJjaC1pbnB1dCcpLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGdldERhdGFTb3VyY2VBc09ic2VydmFibGUocXVlcnk6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XG4gICAgICAgIC8vIHNob3cgZHJvcGRvd24gb25seSB3aGVuIHRoZXJlIGlzIGNoYW5nZSBpbiBxdWVyeS4gVGhpcyBzaG91bGQgbm90IGFwcGx5IHdoZW4gZGF0YW9wdGlvbnMgd2l0aCBmaWx0ZXJGaWVsZHMgYXJlIHVwZGF0ZWQuXG4gICAgICAgIC8vIHdoZW4gbGFzdFJlc3VsdCBpcyBub3QgYXZhaWxhYmxlIGkuZS4gc3RpbGwgdGhlIGZpcnN0IGNhbGwgaXMgcGVuZGluZyBhbmQgc2Vjb25kIHF1ZXJ5IGlzIGludm9rZWQgdGhlbiBkbyBub3QgcmV0dXJuLlxuICAgICAgICBpZiAodGhpcy5fbGFzdFF1ZXJ5ID09PSBxdWVyeSAmJiAhZ2V0KHRoaXMuZGF0YW9wdGlvbnMsICdmaWx0ZXJGaWVsZHMnKSAmJiBpc0RlZmluZWQodGhpcy5fbGFzdFJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMuX2xhc3RSZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLypcbiAgICAgICAgICAgICBXTVMtMTkxNzc6IE9uIGZvY3VzIG9mIGlucHV0IGZpZWxkIGZvciBhdXRvY29tcGxldGUgdHlwZSwgZG8gbm90IHRyaWdnZXIgYXBpIGNhbGwgd2hlblxuICAgICAgICAgICAgICAgICBhKSBzZWFyY2hrZXkgYW5kIGRpc3BsYXlleHByZXNzaW9uIGFyZSBkaWZmZXJlbnRcbiAgICAgICAgICAgICAgICAgYikgYmluZGRpc3BsYXlsYWJlbCBjb250YWlucyBtdWx0aXBsZSB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgYykgYmluZGRpc3BsYXlsYWJlbCBjb250YWlucyBzaW5nbGUgdmFsdWUgd2hpY2ggZG9lcyBub3QgbWF0Y2ggd2l0aCBzZWFyY2hrZXlcbiAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYgdGhpcy5zZWFyY2hrZXkgJiYgdGhpcy5xdWVyeSAmJiB0aGlzLmRhdGF2YWx1ZSkge1xuICAgICAgICAgICAgbGV0IGJpbmREaXNwbGF5TGFiZWxBcnJheSA9IFtdO1xuICAgICAgICAgICAgY29uc3Qgc2VhcmNoS2V5QXJyYXkgPSBzcGxpdCh0aGlzLnNlYXJjaGtleSwgJywnKTtcbiAgICAgICAgICAgIGxldCBkaXNwbGF5bGFiZWw7XG4gICAgICAgICAgICBpZiAodGhpcy5iaW5kZGlzcGxheWxhYmVsKSB7XG4gICAgICAgICAgICAgICAgYmluZERpc3BsYXlMYWJlbEFycmF5ID0gc3BsaXQodGhpcy5iaW5kZGlzcGxheWxhYmVsLCAnKycpO1xuICAgICAgICAgICAgICAgIGlmIChiaW5kRGlzcGxheUxhYmVsQXJyYXkubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghaW5jbHVkZXMoYmluZERpc3BsYXlMYWJlbEFycmF5WzBdLCAnfCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWdleCA9IC9cXFsoLio/KVxcXS87XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5bGFiZWwgPSByZWdleC5leGVjKGJpbmREaXNwbGF5TGFiZWxBcnJheVswXSlbMV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5bGFiZWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKChiaW5kRGlzcGxheUxhYmVsQXJyYXkubGVuZ3RoID4gMSB8fCAoZGlzcGxheWxhYmVsICYmICFpbmNsdWRlcyhzZWFyY2hLZXlBcnJheSwgZGlzcGxheWxhYmVsKSlcbiAgICAgICAgICAgICAgICB8fCAodGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiAmJiAhaW5jbHVkZXMoc2VhcmNoS2V5QXJyYXksIHRoaXMuZGlzcGxheWV4cHJlc3Npb24pKSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHRoaXMucXVlcnk7XG4gICAgICAgIHJldHVybiBmcm9tKHRoaXMuZ2V0RGF0YVNvdXJjZShxdWVyeSkpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCBoYW5kbGVFdmVudChub2RlOiBIVE1MRWxlbWVudCwgZXZlbnROYW1lOiBzdHJpbmcsIGV2ZW50Q2FsbGJhY2s6IEZ1bmN0aW9uLCBsb2NhbHM6IGFueSkge1xuICAgICAgICBpZiAoIWluY2x1ZGVzKFsnYmx1cicsICdmb2N1cycsICdzZWxlY3QnLCAnc3VibWl0JywgJ2NoYW5nZSddLCBldmVudE5hbWUpKSB7XG4gICAgICAgICAgICBzdXBlci5oYW5kbGVFdmVudChub2RlLCBldmVudE5hbWUsIGV2ZW50Q2FsbGJhY2ssIGxvY2Fscyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBoaWdobGlnaHQgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGRyb3Bkb3duIG1hdGNoaW5nIHRoZSBxdWVyeS5cbiAgICBwcml2YXRlIGhpZ2hsaWdodChtYXRjaDogVHlwZWFoZWFkTWF0Y2gsIHF1ZXJ5OiBzdHJpbmcpIHtcbiAgICAgICAgaWYgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyKSB7XG4gICAgICAgICAgICAvLyBoaWdobGlnaHQgb2YgY2hhcnMgd2lsbCB3b3JrIG9ubHkgd2hlbiBsYWJlbCBhcmUgc3RyaW5ncy5cbiAgICAgICAgICAgIChtYXRjaCBhcyBhbnkpLnZhbHVlID0gbWF0Y2guaXRlbS5sYWJlbC50b1N0cmluZygpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmhpZ2hsaWdodChtYXRjaCwgcXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gaW5zZXJ0cyB0aGUgZWxlbWVudCBhdCB0aGUgaW5kZXggcG9zaXRpb25cbiAgICBwcml2YXRlIGluc2VydEF0SW5kZXgoaSkge1xuICAgICAgICBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbC5wcmVwZW5kKHRoaXMuJGVsZW1lbnQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgJGVsQXRJbmRleCA9IHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5lcShpKTtcbiAgICAgICAgICAgIGlmICgkZWxBdEluZGV4Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuaW5zZXJ0QmVmb3JlKHRoaXMucGFyZW50RWwuY2hpbGRyZW4oKS5lcShpKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuaW5zZXJ0QWZ0ZXIodGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmVxKGkgLSAxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgd2lkZ2V0IGlzIG9mIHR5cGUgYXV0b2NvbXBsZXRlIGluIG1vYmlsZSB2aWV3LyBhcHBcbiAgICBwdWJsaWMgaXNNb2JpbGVBdXRvQ29tcGxldGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdhdXRvY29tcGxldGUnICYmIGlzTW9iaWxlKCk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGVudGVyZWQgaW4gdGhlIGlucHV0IGFuZCB0aGUgdmlldyBpcyBub3QgbW9iaWxlXG4gICAgcHVibGljIGlzUXVlcnlFbnRlcmVkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zaG93Y2xlYXIgJiYgdGhpcy5zaG93Q2xvc2VidG47XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBsb2FkTW9yZURhdGEoaW5jcmVtZW50UGFnZT86IGJvb2xlYW4pIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAvLyBJbmNyZWFzZSB0aGUgcGFnZSBudW1iZXIgYW5kIHRyaWdnZXIgZm9yY2UgcXVlcnkgdXBkYXRlXG4gICAgICAgIHRoaXMucGFnZSA9IGluY3JlbWVudFBhZ2UgPyB0aGlzLnBhZ2UgKyAxIDogdGhpcy5wYWdlO1xuXG4gICAgICAgIHRoaXMuaXNTY3JvbGxlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IHRydWU7XG5cbiAgICAgICAgLy8gd2hlbiBpbnZva2luZyBuZXcgc2V0IG9mIHJlc3VsdHMsIHJlc2V0IHRoZSBsYXN0UXVlcnkuXG4gICAgICAgIGlmIChpbmNyZW1lbnRQYWdlKSB7XG4gICAgICAgICAgICB0aGlzLl9sYXN0UXVlcnkgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB0cmlnZ2VyIHRoZSB0eXBlYWhlYWQgY2hhbmdlIG1hbnVhbGx5IHRvIGZldGNoIHRoZSBuZXh0IHNldCBvZiByZXN1bHRzLlxuICAgICAgICB0aGlzLnR5cGVhaGVhZC5vbklucHV0KHtcbiAgICAgICAgICAgIHRhcmdldDoge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB0cmltKHRoaXMucXVlcnkpIHx8ICcwJyAvLyBkdW1teSBkYXRhIHRvIG5vdGlmeSB0aGUgb2JzZXJ2YWJsZXNcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gb24gZm9jdXNvdXQsIHN1YnNjcmliZSB0byB0aGUgZGF0YXZhbHVlIGNoYW5nZXMgYWdhaW5cbiAgICBwcml2YXRlIG9uRm9jdXNPdXQoKSB7XG4gICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlRHYgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgIC8vIHJlc2V0IHRoZSBwYWdlIHZhbHVlIG9uIGZvY3Vzb3V0LlxuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICAvLyBpZiBkb21VcGRhdGVkIGlzIHRydWUgdGhlbiBkbyBub3QgaGlkZSB0aGUgZHJvcGRvd24gaW4gdGhlIGZ1bGxzY3JlZW5cbiAgICAgICAgaWYgKCF0aGlzLl9kb21VcGRhdGVkICYmIHRoaXMuX2lzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlO1xuICAgICAgICAvLyBvbiBvdXRzaWRlIGNsaWNrLCB0eXBlYWhlYWQgaXMgaGlkZGVuLiBUbyBhdm9pZCB0aGlzLCB3aGVuIGZ1bGxzY3JlZW4gaXMgc2V0LCBvdmVycmlkZGluZyBpc0ZvY3VzZWQgZmxhZyBvbiB0aGUgdHlwZWFoZWFkIGNvbnRhaW5lclxuICAgICAgICBpZiAodGhpcy5fZG9tVXBkYXRlZCAmJiB0aGlzLnR5cGVhaGVhZCAmJiAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fY29udGFpbmVyKSB7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fY29udGFpbmVyLmlzRm9jdXNlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIG9uSW5wdXRDaGFuZ2UoJGV2ZW50KSB7XG4gICAgICAgIC8vIHJlc2V0IGFsbCB0aGUgcHJldmlvdXMgcGFnZSBkZXRhaWxzIGluIG9yZGVyIHRvIGZldGNoIG5ldyBzZXQgb2YgcmVzdWx0LlxuICAgICAgICB0aGlzLnJlc3VsdCA9IFtdO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKTtcbiAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8vIHdoZW4gaW5wdXQgaXMgY2xlYXJlZCwgcmVzZXQgdGhlIGRhdGF2YWx1ZVxuICAgICAgICBpZiAodGhpcy5xdWVyeSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9ICcnO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gJyc7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVByZXZEYXRhdmFsdWUodGhpcy5fbGFzdFF1ZXJ5KTtcbiAgICAgICAgICAgIHRoaXMuaW52b2tlT25DaGFuZ2UodGhpcy5fbW9kZWxCeVZhbHVlLCB7fSwgdHJ1ZSk7XG5cbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnY2xlYXInLCB7ICRldmVudCB9KTtcblxuICAgICAgICAgICAgLy8gdHJpZ2dlciBvblN1Ym1pdCBvbmx5IHdoZW4gdGhlIHNlYXJjaCBpbnB1dCBpcyBjbGVhcmVkIG9mZiBhbmQgZG8gbm90IHRyaWdnZXIgd2hlbiB0YWIgaXMgcHJlc3NlZC5cbiAgICAgICAgICAgIGlmICgkZXZlbnQgJiYgJGV2ZW50LndoaWNoICE9PSA5KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCB7ICRldmVudCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGludm9raW5nIGNoYW5nZSBldmVudCBvbiBldmVyeSBpbnB1dCB2YWx1ZSBjaGFuZ2UuXG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2NoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAkZXZlbnQ6ICRldmVudCxcbiAgICAgICAgICAgICAgICBuZXdWYWw6IHRoaXMuX21vZGVsQnlWYWx1ZSB8fCB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIG9sZFZhbDogKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgfVxuXG4gICAgLy8gVHJpZ2dlcmVkIGZvciBlbnRlciBldmVudFxuICAgIHByaXZhdGUgaGFuZGxlRW50ZXJFdmVudCgkZXZlbnQpIHtcbiAgICAgICAgLy8gc3VibWl0IGV2ZW50IHRyaWdnZXJlZCB3aGVuIHRoZXJlIGlzIG5vIHNlYXJjaCByZXN1bHRzXG4gICAgICAgIGlmICghZ2V0KHRoaXMudHlwZWFoZWFkLCAnbWF0Y2hlcy5sZW5ndGgnKSkge1xuICAgICAgICAgICAgdGhpcy5vblNlYXJjaFNlbGVjdCgkZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIFRyaWdnZXJyZWQgd2hlbiB0eXBlYWhlYWQgb3B0aW9uIGlzIHNlbGVjdGVkLlxuICAgIHByaXZhdGUgb25TZWFyY2hTZWxlY3QoJGV2ZW50OiBFdmVudCkge1xuICAgICAgICBsZXQgaXRlbTtcbiAgICAgICAgLy8gV01TLTIyNTMzOiBCZWZvcmUgYWRkaW5nIGFjdGl2ZSB0eXBlYWhlYWQgZWwsIGNoZWNrIGlmIHRoZSBlbnRlcmVkIHF1ZXJ5IG1hdGNoZXMgd2l0aCB0aGUgYWN0aXZlIGVsIG9yIG5vdFxuICAgICAgICBjb25zdCBpc1F1ZXJ5TWF0Y2ggPSB0aGlzLnR5cGVhaGVhZENvbnRhaW5lcj8uYWN0aXZlPy52YWx1ZSA9PT0gdGhpcy5xdWVyeTtcblxuICAgICAgICBpZiAodGhpcy50eXBlYWhlYWRDb250YWluZXIgJiYgdGhpcy50eXBlYWhlYWRDb250YWluZXIuYWN0aXZlICYmIGlzUXVlcnlNYXRjaCkge1xuICAgICAgICAgICAgaXRlbSA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLmFjdGl2ZS5pdGVtO1xuICAgICAgICB9XG4gICAgICAgICRldmVudCA9IHRoaXMuZXZlbnREYXRhKCRldmVudCwgaXRlbSB8fCB7fSk7XG5cbiAgICAgICAgLy8gc2VhcmNoT24gaXMgc2V0IGFzIG9uQnRuQ2xpY2ssIHRoZW4gaW52b2tlIHRoZSBzZWFyY2ggYXBpIGNhbGwgbWFudWFsbHkuXG4gICAgICAgIGlmICghdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKSkge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IHRydWU7XG4gICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSB0eXBlYWhlYWQgY2hhbmdlIG1hbnVhbGx5IHRvIGZldGNoIHRoZSBuZXh0IHNldCBvZiByZXN1bHRzLlxuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQub25JbnB1dCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5IC8vIGR1bW15IGRhdGEgdG8gbm90aWZ5IHRoZSBvYnNlcnZhYmxlc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIHdoZW4gbWF0Y2hlcyBhcmUgYXZhaWxhYmxlLlxuICAgICAgICBpZiAodGhpcy50eXBlYWhlYWRDb250YWluZXIgJiYgdGhpcy5saUVsZW1lbnRzLmxlbmd0aCAmJiBpc1F1ZXJ5TWF0Y2gpIHtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdEFjdGl2ZU1hdGNoKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB0aGlzLnF1ZXJ5O1xuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdzdWJtaXQnLCB7ICRldmVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgaW52b2tlT25CZWZvcmVTZXJ2aWNlQ2FsbChpbnB1dERhdGEpIHtcbiAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdiZWZvcmVzZXJ2aWNlY2FsbCcsIHsgaW5wdXREYXRhIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25Ecm9wZG93bk9wZW4oKSB7XG4gICAgICAgIGlmICh0aGlzLmNsZWFyRGF0YSkge1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHNldHRpbmcgdGhlIHVsRWxlbWVudHMsIGxpRWxlbWVudCBvbiB0eXBlYWhlYWRDb250YWluZXIuXG4gICAgICAgIC8vIGFzIHdlIGFyZSB1c2luZyBjdXN0b21PcHRpb24gdGVtcGxhdGUsIGxpRWxlbWVudHMgYXJlIG5vdCBhdmFpbGFibGUgb24gdHlwZWFoZWFkQ29udGFpbmVyIHNvIGFwcGVuZCB0aGVtIGV4cGxpY2l0bHkuXG4gICAgICAgIGNvbnN0IGZuID0gZGVib3VuY2UoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5faXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyID0gdGhpcy50eXBlYWhlYWQuX2NvbnRhaW5lciB8fCAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5fdHlwZWFoZWFkLmluc3RhbmNlO1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyIGFzIGFueSkubGlFbGVtZW50cyA9IHRoaXMubGlFbGVtZW50cztcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciBhcyBhbnkpLnVsRWxlbWVudCA9IHRoaXMudWxFbGVtZW50O1xuICAgICAgICAgICAgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24oJCgndHlwZWFoZWFkLWNvbnRhaW5lcicpLCB0aGlzLm5hdGl2ZUVsZW1lbnQsICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLl90eXBlYWhlYWQsICQoJ3R5cGVhaGVhZC1jb250YWluZXIgLmRyb3Bkb3duLW1lbnUnKSk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgZm4oKTtcblxuICAgICAgICAvLyBvcGVuIGZ1bGwtc2NyZWVuIHNlYXJjaCB2aWV3XG4gICAgICAgIGlmICh0aGlzLmlzTW9iaWxlQXV0b0NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyTW9iaWxlQXV0b0NvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBkcm9wZG93bkVsID0gdGhpcy5kcm9wZG93bkVsLmNsb3Nlc3QoJ3R5cGVhaGVhZC1jb250YWluZXInKTtcblxuICAgICAgICAgICAgZHJvcGRvd25FbC5pbnNlcnRBZnRlcih0aGlzLiRlbGVtZW50LmZpbmQoJ2lucHV0JykuZmlyc3QoKSk7XG4gICAgICAgICAgICBjb25zdCBzY3JlZW5IZWlnaHQgPSB0aGlzLiRlbGVtZW50LmNsb3Nlc3QoJy5hcHAtY29udGVudCcpLmhlaWdodCgpO1xuICAgICAgICAgICAgZHJvcGRvd25FbC5jc3MoeyBwb3NpdGlvbjogJ3JlbGF0aXZlJywgdG9wOiAwLCBoZWlnaHQ6IHNjcmVlbkhlaWdodCArICdweCcgfSk7XG4gICAgICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9IHRoaXMucXVlcnkgJiYgdGhpcy5xdWVyeSAhPT0gJyc7XG5cbiAgICAgICAgICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkgJiYgIXRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJTZWFyY2goKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgc2VsZWN0TmV4dCgpIHtcbiAgICAgICAgY29uc3QgbWF0Y2hlcyA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLm1hdGNoZXM7XG5cbiAgICAgICAgaWYgKCFtYXRjaGVzKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaW5kZXggPSBtYXRjaGVzLmluZGV4T2YodGhpcy50eXBlYWhlYWRDb250YWluZXIuYWN0aXZlKTtcblxuICAgICAgICAvLyBvbiBrZXlkb3duLCBpZiBzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBhbmQgbmV4dCBwYWdlIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZmV0Y2ggbmV4dCBwYWdlIGl0ZW1zLlxuICAgICAgICBpZiAoIXRoaXMuX2xvYWRpbmdJdGVtcyAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSAmJiBpbmRleCArIDEgPiBtYXRjaGVzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgIC8vIGluZGV4IGlzIHNhdmVkIGluIG9yZGVyIHRvIHNlbGVjdCB0aGUgbGFzdFNlbGVjdGVkIGl0ZW0gaW4gdGhlIGRyb3Bkb3duIGFmdGVyIGZldGNoaW5nIG5leHQgcGFnZSBpdGVtcy5cbiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRMYXN0QWN0aXZlTWF0Y2hBc1NlbGVjdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyIGFzIGFueSkuX2FjdGl2ZSA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLm1hdGNoZXNbdGhpcy5sYXN0U2VsZWN0ZWRJbmRleF07XG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5uZXh0QWN0aXZlTWF0Y2goKTtcbiAgICAgICAgICAgIHRoaXMubGFzdFNlbGVjdGVkSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHRyaWdnZXJTZWFyY2goKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlIHx8ICF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgdHlwZUFoZWFkRHJvcERvd24gPSB0aGlzLmRyb3Bkb3duRWw7XG4gICAgICAgIGNvbnN0ICRsYXN0SXRlbSA9IHR5cGVBaGVhZERyb3BEb3duLmZpbmQoJ2xpJykubGFzdCgpO1xuXG4gICAgICAgIC8vIENoZWNrIGlmIGxhc3QgaXRlbSBpcyBub3QgYmVsb3cgdGhlIGZ1bGwgc2NyZWVuXG4gICAgICAgIGlmICgkbGFzdEl0ZW0ubGVuZ3RoICYmIHR5cGVBaGVhZERyb3BEb3duLmxlbmd0aCAmJiAodHlwZUFoZWFkRHJvcERvd24uaGVpZ2h0KCkgKyB0eXBlQWhlYWREcm9wRG93bi5wb3NpdGlvbigpLnRvcCA+ICRsYXN0SXRlbS5oZWlnaHQoKSArICRsYXN0SXRlbS5wb3NpdGlvbigpLnRvcCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpc1VwZGF0ZU9uS2V5UHJlc3MoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNlYXJjaG9uID09PSAndHlwaW5nJztcbiAgICB9XG5cbiAgICBwcml2YXRlIGRlYm91bmNlRGVmYXVsdFF1ZXJ5KGRhdGEpIHtcbiAgICAgICAgdGhpcy5fZGVmYXVsdFF1ZXJ5SW52b2tlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuZ2V0RGF0YVNvdXJjZShkYXRhLCB0cnVlKS50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5TW9kZWxbMF0ubGFiZWwgfHwgJyc7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdGhpcy5xdWVyeU1vZGVsWzBdLnZhbHVlO1xuICAgICAgICAgICAgICAgIHRoaXMuX21vZGVsQnlLZXkgPSB0aGlzLnF1ZXJ5TW9kZWxbMF0ua2V5O1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5jbGVhckRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAoZ2V0KCh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLCAnX3R5cGVhaGVhZC5pc1Nob3duJykpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCeURhdGF2YWx1ZShkYXRhKSB7XG4gICAgICAgIHRoaXMudXBkYXRlQnlEYXRhc2V0KGRhdGEpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJ5RGF0YVNvdXJjZShkYXRhKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJ5RGF0YVNvdXJjZShkYXRhKSB7XG4gICAgICAgIC8vIHZhbHVlIGlzIHByZXNlbnQgYnV0IHRoZSBjb3JyZXNwb25kaW5nIGtleSBpcyBub3QgZm91bmQgdGhlbiBmZXRjaCBuZXh0IHNldFxuICAgICAgICAvLyBtb2RlbEJ5S2V5IHdpbGwgYmUgc2V0IG9ubHkgd2hlbiBkYXRhdmFsdWUgaXMgYXZhaWxhYmxlIGluc2lkZSB0aGUgbG9jYWxEYXRhIG90aGVyd2lzZSBtYWtlIGEgTi93IGNhbGwuXG4gICAgICAgIGlmIChpc0RlZmluZWQoZGF0YSkgJiYgIWlzT2JqZWN0KGRhdGEpICYmIHRoaXMuZGF0YXNvdXJjZSAmJiAhaXNEZWZpbmVkKHRoaXMuX21vZGVsQnlLZXkpICYmIHRoaXMuZGF0YWZpZWxkICE9PSBBTExGSUVMRFMpIHtcbiAgICAgICAgICAgIC8vIEF2b2lkIG1ha2luZyBkZWZhdWx0IHF1ZXJ5IGlmIHF1ZXJ5TW9kZWwgYWxyZWFkeSBleGlzdHMuXG4gICAgICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMucXVlcnlNb2RlbCkgJiYgIWlzRW1wdHkodGhpcy5xdWVyeU1vZGVsKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRGF0YXZhbHVlRnJvbVF1ZXJ5TW9kZWwoKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIE1ha2UgZGVmYXVsdCBxdWVyeSBjYWxsIG9ubHkgd2hlbiBkYXRhc291cmNlIHN1cHBvcnRzIENSVUQgKGxpdmUgdmFyaWFibGUpLlxuICAgICAgICAgICAgaWYgKCF0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkICYmIHRoaXMuZGF0YXNvdXJjZS5leGVjdXRlKERhdGFTb3VyY2UuT3BlcmF0aW9uLlNVUFBPUlRTX0NSVUQpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZURlZmF1bHRRdWVyeShkYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIHVwZGF0ZXMgdGhlIG1vZGVsIHZhbHVlIHVzaW5nIHF1ZXJ5TW9kZWxcbiAgICBwcml2YXRlIHVwZGF0ZURhdGF2YWx1ZUZyb21RdWVyeU1vZGVsKCkge1xuICAgICAgICBpZiAoaXNEZWZpbmVkKHRoaXMucXVlcnlNb2RlbCkpIHtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IGlzQXJyYXkodGhpcy5xdWVyeU1vZGVsKSA/ICh0aGlzLnF1ZXJ5TW9kZWxbMF0gYXMgRGF0YVNldEl0ZW0pLnZhbHVlIDogdGhpcy5xdWVyeU1vZGVsO1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IGlzQXJyYXkodGhpcy5xdWVyeU1vZGVsKSA/ICh0aGlzLnF1ZXJ5TW9kZWxbMF0gYXMgRGF0YVNldEl0ZW0pLmtleSA6IHRoaXMucXVlcnlNb2RlbDtcbiAgICAgICAgICAgIHRoaXMudG9CZVByb2Nlc3NlZERhdGF2YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQnlEYXRhc2V0KGRhdGE6IGFueSkge1xuICAgICAgICAvLyBkZWZhdWx0IHF1ZXJ5IGlzIGFscmVhZHkgaW52b2tlZCB0aGVuIGRvIG5vdCBtYWtlIG90aGVyIGRlZmF1bHQgcXVlcnkgY2FsbC5cbiAgICAgICAgLy8gRm9yIGxvY2FsIHNlYXJjaCBpLmUuIHNlYXJjaGtleSBpcyB1bmRlZmluZWQsIGRvIG5vdCByZXR1cm4sIHZlcmlmeSB0aGUgZGF0YXZhbHVlIGFnYWluc3QgdGhlIGRhdGFzZXRJdGVtcyAuXG4gICAgICAgIGlmICh0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkICYmIHRoaXMuc2VhcmNoa2V5KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc2VsZWN0ZWRJdGVtID0gZmluZCh0aGlzLmRhdGFzZXRJdGVtcywgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIHJldHVybiAoaXNPYmplY3QoaXRlbS52YWx1ZSkgPyBpc0VxdWFsKGl0ZW0udmFsdWUsIGRhdGEpIDogKHRvU3RyaW5nKGl0ZW0udmFsdWUpKS50b0xvd2VyQ2FzZSgpID09PSAodG9TdHJpbmcoZGF0YSkpLnRvTG93ZXJDYXNlKCkpO1xuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzZXQgdGhlIGRlZmF1bHQgb25seSB3aGVuIGl0IGlzIGF2YWlsYWJsZSBpbiBkYXRhc2V0LlxuICAgICAgICBpZiAoc2VsZWN0ZWRJdGVtKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSBbc2VsZWN0ZWRJdGVtXTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGFmaWVsZCA9PT0gQUxMRklFTERTICYmIGlzT2JqZWN0KGRhdGEpKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB0aGlzLmdldFRyYW5zZm9ybWVkRGF0YShleHRyYWN0RGF0YUFzQXJyYXkoZGF0YSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gcmVzZXR0aW5nIHRoZSBxdWVyeU1vZGVsIG9ubHkgd2hlbiBwcmV2RGF0YXZhbHVlIGlzIGVxdWFsIHRvIGRhdGFcbiAgICAgICAgICAgIGlmICgodGhpcyBhcyBhbnkpLnByZXZEYXRhdmFsdWUgIT09IGRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5TW9kZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgaWYgKCFkYXRhIHx8IGRhdGEgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlRGF0YXZhbHVlRnJvbVF1ZXJ5TW9kZWwoKTtcblxuICAgICAgICAvLyBTaG93IHRoZSBsYWJlbCB2YWx1ZSBvbiBpbnB1dC5cbiAgICAgICAgdGhpcy5fbGFzdFF1ZXJ5ID0gdGhpcy5xdWVyeSA9IGlzRGVmaW5lZCh0aGlzLnF1ZXJ5TW9kZWwpICYmIHRoaXMucXVlcnlNb2RlbC5sZW5ndGggPyBnZXQodGhpcy5xdWVyeU1vZGVsWzBdLCAnbGFiZWwnKSA6ICcnO1xuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBsYXN0IHNlYXJjaCByZXN1bHRzIHRoZW4gb3BlbiBkcm9wZG93biBvbiBmb2N1c1xuICAgIHByaXZhdGUgaGFuZGxlRm9jdXMoJGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzZWFyY2gnICYmIHRoaXMucXVlcnkgPT09IHRoaXMuX2xhc3RRdWVyeSAmJiB0aGlzLl9sYXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5rZXlVcEV2ZW50RW1pdHRlci5lbWl0KHRoaXMucXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUlucHV0Qmx1cigkZXZlbnQ6IEZvY3VzRXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IFt7XG4gICAgICAgICAgICAgICAga2V5OiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLnF1ZXJ5LFxuICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLnF1ZXJ5XG4gICAgICAgICAgICB9XTtcbiAgICAgICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IHRoaXMucXVlcnk7XG4gICAgICAgICAgICB0aGlzLmRhdGF2YWx1ZSA9IHRoaXMucXVlcnk7XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeVN1YnNjcmliZXIoKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoJy5hcHAtY29tcG9zaXRlLXdpZGdldC5jYXB0aW9uLWZsb2F0aW5nJyk7XG4gICAgICAgIGlmIChwYXJlbnRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ2NhcHRpb25Qb3NpdGlvbkFuaW1hdGUnLCB7ZGlzcGxheVZhbDogdHJ1ZSwgbmF0aXZlRWw6IHBhcmVudEVsfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHByb3ZpZGVzIHRoZSBmaWx0ZXJlZCBkYXRhIGZyb20gdGhlIGRhdGFzb3VyY2UuXG4gICAgcHVibGljIGdldERhdGFTb3VyY2UocXVlcnk6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsIHNlYXJjaE9uRGF0YUZpZWxkPzogYm9vbGVhbiwgbmV4dEl0ZW1JbmRleD86IG51bWJlcik6IFByb21pc2U8RGF0YVNldEl0ZW1bXT4ge1xuICAgICAgICAvLyBGb3IgZGVmYXVsdCBxdWVyeSwgc2VhcmNoT25EYXRhRmllbGQgaXMgc2V0IHRvIHRydWUsIHRoZW4gZG8gbm90IG1ha2UgYSBuL3cgY2FsbCB3aGVuIGRhdGFmaWVsZCBpcyBBTExGSUVMRFNcbiAgICAgICAgaWYgKHNlYXJjaE9uRGF0YUZpZWxkICYmIHRoaXMuZGF0YWZpZWxkID09PSBBTExGSUVMRFMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3IgZGVmYXVsdCBkYXRhdmFsdWUsIHNlYXJjaCBrZXkgYXMgdG8gYmUgb24gZGF0YWZpZWxkIHRvIGdldCB0aGUgZGVmYXVsdCBkYXRhIGZyb20gdGhlIGZpbHRlciBjYWxsLlxuICAgICAgICBjb25zdCBkYXRhQ29uZmlnOiBJRGF0YVByb3ZpZGVyQ29uZmlnID0ge1xuICAgICAgICAgICAgZGF0YXNldDogdGhpcy5kYXRhc2V0ID8gY29udmVydERhdGFUb09iamVjdCh0aGlzLmRhdGFzZXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYmluZGRhdGFzZXQ6IHRoaXMuYmluZGRhdGFzZXQsXG4gICAgICAgICAgICBkYXRhc291cmNlOiB0aGlzLmRhdGFzb3VyY2UsXG4gICAgICAgICAgICBkYXRhZmllbGQ6IHRoaXMuZGF0YWZpZWxkLFxuICAgICAgICAgICAgaGFzRGF0YTogdGhpcy5kYXRhc2V0ICYmIHRoaXMuZGF0YXNldC5sZW5ndGgsXG4gICAgICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgICAgICBpc0xvY2FsRmlsdGVyOiAhdGhpcy5zZWFyY2hrZXksXG4gICAgICAgICAgICBzZWFyY2hLZXk6IHNlYXJjaE9uRGF0YUZpZWxkID8gdGhpcy5kYXRhZmllbGQgOiB0aGlzLnNlYXJjaGtleSxcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VhcmNoIGNhbGwgbWF0Y2ggbW9kZSBzaG91bGQgYmUgc3RhcnRpZ25vcmVjYXNlXG4gICAgICAgICAgICBtYXRjaE1vZGU6IHNlYXJjaE9uRGF0YUZpZWxkID8gJ3N0YXJ0aWdub3JlY2FzZScgOiB0aGlzLm1hdGNobW9kZSxcbiAgICAgICAgICAgIGNhc2VzZW5zaXRpdmU6IHRoaXMuY2FzZXNlbnNpdGl2ZSxcbiAgICAgICAgICAgIGlzZm9ybWZpZWxkOiB0aGlzLmlzZm9ybWZpZWxkLFxuICAgICAgICAgICAgb3JkZXJieTogdGhpcy5vcmRlcmJ5LFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgICAgICBwYWdlc2l6ZTogdGhpcy5wYWdlc2l6ZSxcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIG9uQmVmb3Jlc2VydmljZWNhbGw6IHRoaXMuaW52b2tlT25CZWZvcmVTZXJ2aWNlQ2FsbC5iaW5kKHRoaXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRhdGFDb25maWcuZGF0YW9wdGlvbnMgPSB0aGlzLmRhdGFvcHRpb25zO1xuICAgICAgICAgICAgZGF0YUNvbmZpZy52aWV3UGFyZW50ID0gdGhpcy52aWV3UGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyKGRhdGFDb25maWcpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIGZyb20gZGF0YVByb3ZpZGVyIHJldHVybnMgYWx3YXlzIGRhdGEgb2JqZWN0LlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YSB8fCByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAvLyBmb3Igc2VydmljZSB2YXJpYWJsZSwgdXBkYXRpbmcgdGhlIGRhdGFzZXQgb25seSBpZiBpdCBpcyBub3QgZGVmaW5lZCBvciBlbXB0eVxuICAgICAgICAgICAgICAgIGlmICgoIWlzRGVmaW5lZCh0aGlzLmRhdGFzZXQpIHx8ICF0aGlzLmRhdGFzZXQubGVuZ3RoKSAmJiB0aGlzLmRhdGFQcm92aWRlci51cGRhdGVEYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5oYXNNb3JlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGFzZXQgPSB0aGlzLmZvcm1hdHRlZERhdGFzZXQuY29uY2F0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGFzZXQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNldHRpbmcgdGhlIG9wdGlvbnNsaW1pdCBhcyB0aGUgbWF0Y2hlcyBtb3JlIHRoYW4gMjAgd2lsbCBiZSBpZ25vcmVkIGlmIG9wdGlvbnNsaW1pdCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1hdHRlZERhdGFzZXQubGVuZ3RoID4gMjAgJiYgIWlzRGVmaW5lZCh0aGlzLmxpbWl0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC50eXBlYWhlYWRPcHRpb25zTGltaXQgPSB0aGlzLmZvcm1hdHRlZERhdGFzZXQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEluIG1vYmlsZSwgdHJpZ2dlciB0aGUgc2VhcmNoIGJ5IGRlZmF1bHQgdW50aWwgdGhlIHJlc3VsdHMgaGF2ZSBoZWlnaHQgdXB0byBwYWdlIGhlaWdodC4gT3RoZXIgcmVzdWx0cyBjYW4gYmUgZmV0Y2hlZCBieSBzY3JvbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzT3BlbiAmJiB0aGlzLmlzTW9iaWxlQXV0b0NvbXBsZXRlKCkgJiYgIWlzVW5kZWZpbmVkKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpICYmICF0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclNlYXJjaCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMuZ2V0VHJhbnNmb3JtZWREYXRhKHRoaXMuZm9ybWF0dGVkRGF0YXNldCwgbmV4dEl0ZW1JbmRleCk7XG5cbiAgICAgICAgICAgICAgICAvLyByZXN1bHQgY29udGFpbnMgdGhlIGRhdGFmaWVsZCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gbWFwKHRyYW5zZm9ybWVkRGF0YSwgJ3ZhbHVlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgKGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TGFzdEFjdGl2ZU1hdGNoQXNTZWxlY3RlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAzMCkpKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXaGVuIG5vIHJlc3VsdCBpcyBmb3VuZCwgc2V0IHRoZSBkYXRhdmFsdWUgdG8gdW5kZWZpbmVkLlxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IChxdWVyeSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvbiBmb2N1c291dCBpLmUuIG9uIG90aGVyIHdpZGdldCBmb2N1cywgaWYgbi93IGlzIHBlbmRpbmcgbG9hZGluZyBpY29uIGlzIHNob3duLCB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlIHRoZW4gZHJvcGRvd24gaXMgc2hvd24gYWdhaW4uXG4gICAgICAgICAgICAgICAgLy8gb24gdW5zdWJzY3JpYmluZyBkbyBub3Qgc2hvdyB0aGUgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdW5zdWJzY3JpYmVEdikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcGFyZW50IGNvbnRleHQgaS5lLiBQYWdlIGNvbnRleHQgYW5kIG5vdCBwYXJlbnQgY29tcG9uZW50J3MgY29udGV4dC5cbiAgICBwcml2YXRlIGdldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCAmJiBnZXQoY29udGV4dCwgJ3dpZGdldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250ZXh0KGNvbnRleHQudmlld1BhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYW5zZm9ybWVkRGF0YShkYXRhOiBhbnksIGl0ZW1JbmRleD86IG51bWJlciwgaXNjdXN0b20/OiBib29sZWFuKTogRGF0YVNldEl0ZW1bXSB7XG4gICAgICAgIGlmIChpc0RlZmluZWQoaXRlbUluZGV4KSkge1xuICAgICAgICAgICAgaXRlbUluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm1Gb3JtRGF0YShcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCh0aGlzLnZpZXdQYXJlbnQpLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRoaXMuZGF0YWZpZWxkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZDogdGhpcy5kaXNwbGF5bGFiZWwgfHwgdGhpcy5kaXNwbGF5ZmllbGQsXG4gICAgICAgICAgICAgICAgZGlzcGxheUV4cHI6IGlzY3VzdG9tID8gJycgOiB0aGlzLmRpc3BsYXlleHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGJpbmREaXNwbGF5RXhwcjogaXNjdXN0b20gPyAnJyA6IHRoaXMuYmluZGRpc3BsYXlsYWJlbCxcbiAgICAgICAgICAgICAgICBiaW5kRGlzcGxheUltZ1NyYzogdGhpcy5iaW5kZGlzcGxheWltYWdlc3JjLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlJbWdTcmM6IHRoaXMuZGlzcGxheWltYWdlc3JjXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbUluZGV4LFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZ2V0VW5pcU9ianNCeURhdGFGaWVsZCh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZGF0YWZpZWxkLCB0aGlzLmRpc3BsYXlmaWVsZCB8fCB0aGlzLmRpc3BsYXlsYWJlbCwgdG9Cb29sZWFuKHRoaXMuYWxsb3dlbXB0eSkpO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbnNMaXN0VGVtcGxhdGUgbGlzdGVucyB0byB0aGUgc2Nyb2xsIGV2ZW50IGFuZCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLlxuICAgIHB1YmxpYyBvblNjcm9sbCgkc2Nyb2xsRWw6IEVsZW1lbnQsIGV2dDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSAkc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgICAgY2xpZW50SGVpZ2h0ID0gJHNjcm9sbEVsLmNsaWVudEhlaWdodDtcblxuICAgICAgICAvLyBJZiBzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBhbmQgbm8gcmVxdWVzdCBpcyBpbiBwcm9ncmVzcyBhbmQgbmV4dCBwYWdlIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZmV0Y2ggbmV4dCBwYWdlIGl0ZW1zLlxuICAgICAgICBpZiAoIXRoaXMuX2xvYWRpbmdJdGVtcyAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSAmJiAoJHNjcm9sbEVsLnNjcm9sbFRvcCArIGNsaWVudEhlaWdodCA+PSB0b3RhbEhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMubWluY2hhcnMpKSB7XG4gICAgICAgICAgICAvLyBmb3IgYXV0b2NvbXBsZXRlIHNldCB0aGUgbWluY2hhcnMgdG8gMFxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbmNoYXJzID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5jaGFycyA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKTtcblxuICAgICAgICAvLyBieSBkZWZhdWx0IGZvciBhdXRvY29tcGxldGUgZG8gbm90IHNob3cgdGhlIHNlYXJjaCBpY29uXG4gICAgICAgIC8vIGJ5IGRlZmF1bHQgc2hvdyB0aGUgc2VhcmNoaWNvbiBmb3IgdHlwZSA9IHNlYXJjaFxuICAgICAgICB0aGlzLnNob3dzZWFyY2hpY29uID0gaXNEZWZpbmVkKHRoaXMuc2hvd3NlYXJjaGljb24pID8gdGhpcy5zaG93c2VhcmNoaWNvbiA6ICh0aGlzLnR5cGUgPT09ICdzZWFyY2gnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcblxuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJUYXJnZXQgPSBnZXRDb250YWluZXJUYXJnZXRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgICAgICB0aGlzLm5hdGl2ZUVsZW1lbnQucXVlcnlTZWxlY3RvcignaW5wdXQnKT8uYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuaGFuZGxlSW5wdXRCbHVyLmJpbmQodGhpcykpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaElucHV0RWwgPSAkKCcuYXBwLXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpZiAoc2VhcmNoSW5wdXRFbCkge1xuICAgICAgICAgICAgc2VhcmNoSW5wdXRFbC5yZW1vdmVBdHRyKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50RGF0YSgkZXZlbnQsIGl0ZW0pIHtcbiAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgJGV2ZW50WydkYXRhJ10gPSB7XG4gICAgICAgICAgICAgICAgaXRlbSAgOiBpdGVtLmRhdGFPYmplY3QsXG4gICAgICAgICAgICAgICAgbW9kZWwgOiBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICAgIGxhYmVsIDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICBxdWVyeSA6IHRoaXMucXVlcnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJGV2ZW50O1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXJlZCBvbiBzZWxlY3Qgb24gb3B0aW9uIGZyb20gdGhlIGxpc3QuIFNldCB0aGUgcXVlcnlNb2RlbCwgcXVlcnkgYW5kIG1vZGVsQnlLZXkgZnJvbSB0aGUgbWF0Y2hlZCBpdGVtLlxuICAgIHB1YmxpYyB0eXBlYWhlYWRPblNlbGVjdChtYXRjaDogVHlwZWFoZWFkTWF0Y2gsICRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IG1hdGNoLml0ZW07XG4gICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IGl0ZW07XG4gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gaXRlbS5sYWJlbDtcbiAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgICAgICAkZXZlbnQgPSAkZXZlbnQgfHwgdGhpcy4kdHlwZWFoZWFkRXZlbnQ7XG5cbiAgICAgICAgLy8gQXMgaXRlbS5rZXkgY2FuIHZhcnkgZnJvbSBrZXkgaW4gdGhlIGRhdGFzZXRJdGVtc1xuICAgICAgICB0aGlzLl9tb2RlbEJ5S2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IGl0ZW0udmFsdWU7XG5cbiAgICAgICAgJGV2ZW50ID0gdGhpcy5ldmVudERhdGEoJGV2ZW50LCBpdGVtKTtcblxuICAgICAgICB0aGlzLmludm9rZU9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCAkZXZlbnQgfHwge30pO1xuICAgICAgICAvLyB1cGRhdGluZyB0aGUgdmFyaWFibGUgYm91bmQgdG8gZGVmYXVsdCB2YWx1ZSBhcyBpbnZva2VPbkNoYW5nZSBpcyBub3QgdXBkYXRpbmcgdGhlIHZhcmlhYmxlLlxuICAgICAgICBpZiAodGhpcy5kYXRhdmFsdWUgIT09ICh0aGlzIGFzIGFueSkucHJldkRhdGF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZFZhcmlhYmxlKHRoaXMuZGF0YXZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0JywgeyAkZXZlbnQsIHNlbGVjdGVkVmFsdWU6IHRoaXMuZGF0YXZhbHVlIH0pO1xuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIHsgJGV2ZW50IH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJldkRhdGF2YWx1ZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXk6IHN0cmluZywgbnY6IGFueSwgb3Y6IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAndGFiaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWNrd2FyZCBjb21wYXRhYmlsaXR5IGZyb20gMTAuMy4xIHRvIDEwLjMuMlxuICAgICAgICAvLyAxMC4zLjEgd2UgaGFkIGRpc3BsYXlsYWJlbCBhcyBtb2RhbCB2YWx1ZVxuICAgICAgICAvLyBGcm9tIDEwLjMuMiBvbndvcmRzIHdlIHdpbGwgYmUgaGF2aW5nIGRpc3BsYXlleHByZXNpb24gYXMgbW9kYWwgdmFsdWVcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYga2V5ID09PSAnZGlzcGxheWxhYmVsJyAmJiB0aGlzLmRpc3BsYXlsYWJlbCAmJiAoIXRoaXMuZGlzcGxheWV4cHJlc3Npb24gfHwgKHRoaXMuZGlzcGxheWV4cHJlc3Npb24gJiYgIXRoaXMuZGF0YXNvdXJjZSkpKSAge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiA9IHRoaXMuZGlzcGxheWxhYmVsO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5bGFiZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGRhdGFvcHRpb25zIGFyZSBwcm92aWRlZCBhbmQgdGhlcmUgaXMgbm8gZGlzcGxheWxhYmVsIGdpdmVuIHRoZW4gZGlzcGxheWxhYmVsIGlzIHNldCBhcyB0aGUgcmVsYXRlZGZpZWxkXG4gICAgICAgIGlmIChrZXkgPT09ICdkaXNwbGF5bGFiZWwnICYmIHRoaXMuZGF0YW9wdGlvbnMgJiYgdGhpcy5iaW5kZGlzcGxheWxhYmVsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gZ2V0KHRoaXMuX21vZGVsQnlWYWx1ZSwgbnYpIHx8IHRoaXMuX21vZGVsQnlWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gc2VhcmNoIGlzIGRpc2FibGVkLCBkbyBub3QgbG9hZCBhbnkgbW9yZSBkYXRhIG9yIGp1c3QgY2xlYXIgdGhlIGRhdGEgdGhhdCBpcyBhbHJlYWR5IGluIHByb2Nlc3Mgb3IgbG9hZGVkLlxuICAgICAgICBpZiAoa2V5ID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBpZiAobnYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChnZXQoKHRoaXMudHlwZWFoZWFkIGFzIGFueSksICdfdHlwZWFoZWFkLmlzU2hvd24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNjdXN0b21JdGVtVGVtcGxhdGUgbGV0LW1vZGVsPVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LXF1ZXJ5PVwicXVlcnlcIiBsZXQtbWF0Y2g9XCJtYXRjaFwiPlxuICA8IS0tIERlZmF1bHQgaXRlbSB0ZW1wbGF0ZSAtLT5cbiAgQGlmICghY29udGVudCkge1xuICAgIDxhPlxuICAgICAgQGlmIChtb2RlbC5pbWdTcmMpIHtcbiAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmltZ1NyY1wiIGFsdD1cIlNlYXJjaFwiIFtzdHlsZS53aWR0aF09XCJpbWFnZXdpZHRoXCI+XG4gICAgICB9XG4gICAgICA8c3BhbiBbdGl0bGVdPVwibW9kZWwubGFiZWxcIiBbaW5uZXJIdG1sXT1cImhpZ2hsaWdodChtYXRjaCwgcXVlcnkpIHx8IG1vZGVsLmxhYmVsXCI+PC9zcGFuPlxuICAgIDwvYT5cbiAgfVxuICA8IS0tIEN1c3RvbSBwYXJ0aWFsIHRlbXBsYXRlIC0tPlxuICBAaWYgKGNvbnRlbnQpIHtcbiAgICA8YSBbbmdDbGFzc109XCJ7Y3VzdG9tVGVtcGxhdGU6IGNvbnRlbnR9XCIgcGFydGlhbENvbnRhaW5lciBbd21JdGVtVGVtcGxhdGVdPVwiY29udGVudFwiIFt1c2VyQ29tcG9uZW50UGFyYW1zXT1cIm1hdGNoLml0ZW1cIj5cbiAgICAgIDxkaXYgcGFydGlhbC1jb250YWluZXItdGFyZ2V0PjwvZGl2PlxuICAgIDwvYT5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjdXN0b21MaXN0VGVtcGxhdGUgbGV0LW1hdGNoZXM9XCJtYXRjaGVzXCIgbGV0LWl0ZW1UZW1wbGF0ZT1cIml0ZW1UZW1wbGF0ZVwiIGxldC1xdWVyeT1cInF1ZXJ5XCI+XG4gIDx1bCAjdWxFbGVtZW50IGNsYXNzPVwiYXBwLXNlYXJjaCBkcm9wZG93bi1tZW51XCIgc2Nyb2xsYWJsZT5cbiAgICBAZm9yIChtYXRjaCBvZiBtYXRjaGVzOyB0cmFjayBtYXRjaDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxsaSAjbGlFbGVtZW50cyBbbmdDbGFzc109XCJ7YWN0aXZlOiB0eXBlYWhlYWRDb250YWluZXIgJiYgdHlwZWFoZWFkQ29udGFpbmVyLmlzQWN0aXZlKG1hdGNoKSwgJ2xpc3QtZ3JvdXAtaGVhZGVyJzogbWF0Y2ggJiYgbWF0Y2guaXNIZWFkZXIoKX1cIlxuICAgICAgICAobW91c2VlbnRlcik9XCJ0eXBlYWhlYWRDb250YWluZXIuc2VsZWN0QWN0aXZlKG1hdGNoKTtcIlxuICAgICAgICAoY2xpY2spPVwibWF0Y2ggJiYgIW1hdGNoLmlzSGVhZGVyKCkgJiYgdHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdE1hdGNoKG1hdGNoLCAkZXZlbnQpOyAkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7IG5vdGlmeVN1YnNjcmliZXIoKTtcIj5cbiAgICAgICAgPCEtLSBpdGVtVGVtcGxhdGUgY29tZXMgZnJvbSB0aGUgPGlucHV0PiAtLT5cbiAgICAgICAgQGlmIChtYXRjaC5pc0hlYWRlcigpKSB7XG4gICAgICAgICAgPGg0IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj57e21hdGNoLnZhbHVlfX08L2g0PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIW1hdGNoLmlzSGVhZGVyKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IG1hdGNoLml0ZW0sIGluZGV4OiBpLCBtYXRjaDogbWF0Y2gsIHF1ZXJ5OiBxdWVyeX1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9saT5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiIFtoaWRkZW5dPVwiX2xvYWRpbmdJdGVtcyB8fCAhKGRhdGFjb21wbGV0ZW1zZyAmJiBkYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSlcIj5cbiAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJkYXRhY29tcGxldGVtc2dcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiIFtoaWRkZW5dPVwiIV9sb2FkaW5nSXRlbXNcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2lyY2xlLW8tbm90Y2ggZmEtc3BpblwiPjwvaT5cbiAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJsb2FkaW5nZGF0YW1zZ1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC91bD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS1UaGlzIHRlbXBsYXRlIGlzIGZvciBzZWFyY2ggaW5zaWRlIG1vYmlsZSBuYXZiYXIuLS0+XG5AaWYgKG5hdnNlYXJjaGJhcikge1xuICA8aW5wdXQgW3RpdGxlXT1cInF1ZXJ5IHx8ICcnXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImFwcC10ZXh0Ym94IGZvcm0tY29udHJvbCBsaXN0LW9mLW9ianMgYXBwLXNlYXJjaC1pbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgZm9jdXMtdGFyZ2V0XG4gICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hY2Nlc3NrZXldPVwic2hvcnRjdXRrZXlcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgWyhuZ01vZGVsKV09XCJxdWVyeVwiXG4gICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbdHlwZWFoZWFkXT1cInR5cGVhaGVhZERhdGFTb3VyY2VcIlxuICAgIFt0eXBlYWhlYWRXYWl0TXNdPVwiZGVib3VuY2V0aW1lXCJcbiAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cImN1c3RvbUl0ZW1UZW1wbGF0ZVwiXG4gICAgW29wdGlvbnNMaXN0VGVtcGxhdGVdPVwiY3VzdG9tTGlzdFRlbXBsYXRlXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJsaXN0ZW5RdWVyeSA9IHRydWVcIlxuICAgIChrZXlkb3duLmVudGVyKT1cIiR0eXBlYWhlYWRFdmVudCA9ICRldmVudDtoYW5kbGVFbnRlckV2ZW50KCRldmVudClcIlxuICAgIChrZXlkb3duLmFycm93ZG93bik9XCJzZWxlY3ROZXh0KCRldmVudClcIlxuICAgIChibHVyKT1cImludm9rZU9uVG91Y2hlZCgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwiaGFuZGxlRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1cyk9XCJfdW5zdWJzY3JpYmVEdiA9IGZhbHNlOyBsaXN0ZW5RdWVyeSA9IHRydWU7IGhhbmRsZUZvY3VzKCRldmVudCk7IGludm9rZU9uRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIlxuICAgIFt0eXBlYWhlYWRNaW5MZW5ndGhdPVwibWluY2hhcnNcIlxuICAgIFt0eXBlYWhlYWRPcHRpb25zTGltaXRdPVwibGltaXRcIlxuICAgICh0eXBlYWhlYWRMb2FkaW5nKT1cIl9sb2FkaW5nSXRlbXNcIlxuICAgICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcbiAgICB0eXBlYWhlYWRPcHRpb25GaWVsZD1cImxhYmVsXCJcbiAgICBbdHlwZWFoZWFkR3JvdXBGaWVsZF09XCJncm91cGJ5ID8gJ2dyb3VwYnknIDogbnVsbFwiXG4gICAgW3R5cGVhaGVhZEFzeW5jXT1cInRydWVcIlxuICAgIFt0eXBlYWhlYWRTY3JvbGxhYmxlXT1cInRydWVcIlxuICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgIFt0eXBlYWhlYWRPcHRpb25zSW5TY3JvbGxhYmxlVmlld109XCJvcHRpb25zbGltaXRpbnNjcm9sbGFibGV2aWV3XCJcbiAgICBbZHJvcHVwXT1cImRyb3B1cFwiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8ICdTZWFyY2ggZmllbGQnXCIvPlxuICA8aSBjbGFzcz1cImJ0bi1jbG9zZSB3aSB3aS1jYW5jZWxcIiBbaGlkZGVuXT1cIiFzaG93Q2xvc2VidG5cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KTtcIj48L2k+XG59IEBlbHNlIHtcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWljb24gZm9ybS1jb250cm9sLWZlZWRiYWNrIGJhY2stYnRuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKGNsaWNrKT1cImNsb3NlU2VhcmNoKClcIj48aSBjbGFzcz1cImFwcC1pY29uIHt7YmFja3NlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5CYWNrIGJ1dHRvbjwvc3Bhbj5cbiAgPGlucHV0IFt0aXRsZV09XCJxdWVyeSB8fCAnJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhcHAtdGV4dGJveCBmb3JtLWNvbnRyb2wgbGlzdC1vZi1vYmpzIGFwcC1zZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgIGZvY3VzLXRhcmdldFxuICAgIFtjb250YWluZXJdPVwiY29udGFpbmVyVGFyZ2V0IHx8ICcud20tYXBwJ1wiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hY2Nlc3NrZXldPVwic2hvcnRjdXRrZXlcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgWyhuZ01vZGVsKV09XCJxdWVyeVwiXG4gICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbdHlwZWFoZWFkXT1cInR5cGVhaGVhZERhdGFTb3VyY2VcIlxuICAgIFt0eXBlYWhlYWRXYWl0TXNdPVwiZGVib3VuY2V0aW1lXCJcbiAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cImN1c3RvbUl0ZW1UZW1wbGF0ZVwiXG4gICAgW29wdGlvbnNMaXN0VGVtcGxhdGVdPVwiY3VzdG9tTGlzdFRlbXBsYXRlXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJsaXN0ZW5RdWVyeSA9IHRydWVcIlxuICAgIChrZXlkb3duLmVudGVyKT1cIiR0eXBlYWhlYWRFdmVudCA9ICRldmVudDtoYW5kbGVFbnRlckV2ZW50KCRldmVudClcIlxuICAgIChrZXlkb3duLmFycm93ZG93bik9XCJzZWxlY3ROZXh0KCRldmVudClcIlxuICAgIChibHVyKT1cImludm9rZU9uVG91Y2hlZCgkZXZlbnQpOyBvbkZvY3VzT3V0KClcIlxuICAgIChjbGljayk9XCJoYW5kbGVGb2N1cygkZXZlbnQpO1wiXG4gICAgKGZvY3VzKT1cIl91bnN1YnNjcmliZUR2ID0gZmFsc2U7IGxpc3RlblF1ZXJ5ID0gdHJ1ZTsgaGFuZGxlRm9jdXMoJGV2ZW50KTsgaW52b2tlT25Gb2N1cygkZXZlbnQpXCJcbiAgICBbdHlwZWFoZWFkTWluTGVuZ3RoXT1cIm1pbmNoYXJzXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0xpbWl0XT1cImxpbWl0XCJcbiAgICAodHlwZWFoZWFkTG9hZGluZyk9XCJfbG9hZGluZ0l0ZW1zXCJcbiAgICAodHlwZWFoZWFkT25TZWxlY3QpPVwidHlwZWFoZWFkT25TZWxlY3QoJGV2ZW50KVwiXG4gICAgdHlwZWFoZWFkT3B0aW9uRmllbGQ9XCJsYWJlbFwiXG4gICAgW3R5cGVhaGVhZEdyb3VwRmllbGRdPVwiZ3JvdXBieSA/ICdncm91cGJ5JyA6IG51bGxcIlxuICAgIFt0eXBlYWhlYWRBc3luY109XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwib3B0aW9uc2xpbWl0aW5zY3JvbGxhYmxldmlld1wiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbZHJvcHVwXT1cImRyb3B1cFwiXG4gICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFsYWJlbCB8fCAnU2VhcmNoIGZpZWxkJ1wiPlxuICA8aW5wdXQgY2xhc3M9XCJtb2RlbC1ob2xkZXJcIiBuZy1tb2RlbD1cInByb3h5TW9kZWxcIiBuZy1yZXF1aXJlZD1cInJlcXVpcmVkXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICBAaWYgKF9sb2FkaW5nSXRlbXMpIHtcbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhIGZhLWNpcmNsZS1vLW5vdGNoIGZhLXNwaW4gZm9ybS1jb250cm9sLWZlZWRiYWNrXCI+PC9zcGFuPlxuICB9XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFjayBjbGVhci1idG5cIiBbbmdDbGFzc109XCJ7J3Nob3ctYnRuJzogaXNRdWVyeUVudGVyZWQoKX1cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50LCB0cnVlKVwiPjxpIGNsYXNzPVwiYXBwLWljb24ge3tjbGVhcnNlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbGVhciBidXR0b248L3NwYW4+XG4gIEBpZiAoc2hvd3NlYXJjaGljb24pIHtcbiAgICA8c3BhbiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogZGlzYWJsZWR9XCIgY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgPGZvcm0+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJTZWFyY2hcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjbGFzcz1cImFwcC1zZWFyY2gtYnV0dG9uIGJ0biBidG4taWNvblwiIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgIChjbGljayk9XCJvblNlYXJjaFNlbGVjdCgkZXZlbnQpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiB7e3NlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L3NwYW4+XG4gICAgfVxuICB9XG4gIDwhLS1UaGlzIHRlbXBsYXRlIGlzIGZvciBib3RoIHdlYiBhbmQgZnVsbHNjcmVlbiBtb2RlIGluIG1vYmlsZS4tLT5cbiJdfQ==
941
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvbXBvbmVudHMvd2lkZ2V0cy9iYXNpYy9zZWFyY2gvc3JjL3NlYXJjaC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21wb25lbnRzL3dpZGdldHMvYmFzaWMvc2VhcmNoL3NyYy9zZWFyY2guY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM3RCxPQUFPLEVBR0gsU0FBUyxFQUNULFNBQVMsRUFDVCxVQUFVLEVBQ1YsTUFBTSxFQUNOLFFBQVEsRUFFUixRQUFRLEVBQ1IsU0FBUyxFQUNULFNBQVMsRUFDVCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFDLGFBQWEsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhFLE9BQU8sRUFBQyxJQUFJLEVBQUUsVUFBVSxFQUFFLEVBQUUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUMxQyxPQUFPLEVBQUMsTUFBTSxFQUFFLFFBQVEsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRWhELE9BQU8sRUFBOEIsa0JBQWtCLEVBQWtCLGVBQWUsRUFBQyxNQUFNLHlCQUF5QixDQUFDO0FBRXpILE9BQU8sRUFBQyxRQUFRLEVBQUUsdUJBQXVCLEVBQUUsR0FBRyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFNBQVMsRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM1RyxPQUFPLEVBQ0gsU0FBUyxFQUNULG1CQUFtQixFQUVuQixrQkFBa0IsRUFDbEIsdUJBQXVCLEVBQ3ZCLHNCQUFzQixFQUN0QixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLE1BQU0sRUFDTixpQkFBaUIsRUFDcEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzQkFBc0IsQ0FBQztBQUUvRCxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFDN0MsT0FBTyxFQUFDLFlBQVksRUFBcUMsTUFBTSwrQkFBK0IsQ0FBQztBQUMvRixPQUFPLEVBQ0gsUUFBUSxFQUNSLElBQUksRUFDSixHQUFHLEVBQ0gsUUFBUSxFQUNSLE9BQU8sRUFDUCxPQUFPLEVBQ1AsT0FBTyxFQUNQLFFBQVEsRUFDUixXQUFXLEVBQ1gsR0FBRyxFQUNILEtBQUssRUFDTCxRQUFRLEVBQ1IsSUFBSSxFQUNQLE1BQU0sV0FBVyxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztJQ25EWCx5QkFBa0U7Ozs7SUFBM0IsMENBQTBCO0lBQTVELHVEQUFvQjs7O0lBRjdCLHlCQUFHO0lBQ0Qsb0dBQW9CO0lBR3BCLDBCQUF3RjtJQUMxRixpQkFBSTs7Ozs7OztJQUpGLGNBRUM7SUFGRCwwQ0FFQztJQUNLLGNBQXFCO0lBQUMsQUFBdEIsc0NBQXFCLHdGQUFxRDs7O0lBS2xGLDRCQUF3SDtJQUN0SCx5QkFBb0M7SUFDdEMsaUJBQUk7Ozs7SUFGaUYsQUFBM0IsQUFBdkQsb0VBQXFDLGtDQUE0QyxzQ0FBbUM7OztJQUR6SCxBQVRBLGlGQUFnQix1RUFTRDs7O0lBVGYsMENBT0M7SUFFRCxjQUlDO0lBSkQseUNBSUM7OztJQVdPLDhCQUF3QjtJQUFBLFlBQWU7SUFBQSxpQkFBSzs7O0lBQXBCLGNBQWU7SUFBZixvQ0FBZTs7O0lBR3ZDLDRCQUVlOzs7Ozs7OztJQURiLEFBRFksbURBQWlDLDBHQUN1Qzs7OztJQVQxRixpQ0FFdUk7SUFBckksQUFEQSwyTkFBYyxnREFBc0MsS0FBRSxpTUFDbkMsbUJBQWdCLElBQUksdURBQTZDLHlEQUE0Qix5QkFBa0IsS0FBRTtJQUtwSSxBQUhBLDRGQUF3Qix5RkFHQztJQUszQixpQkFBSzs7OztJQVpXLGdLQUE4SDtJQUk1SSxlQUVDO0lBRkQsOENBRUM7SUFDRCxjQUlDO0lBSkQsK0NBSUM7OztJQWJQLGdDQUEyRDtJQUN6RCxrSEFjQztJQUNELCtCQUE4RjtJQUM1RiwyQkFBNkM7SUFDL0MsaUJBQU07SUFDTiwrQkFBOEM7SUFFNUMsQUFEQSx3QkFBNEMsZUFDQTtJQUVoRCxBQURFLGlCQUFNLEVBQ0g7Ozs7SUF0QkgsZUFjQztJQWRELDBCQWNDO0lBQ21CLGVBQXlFO0lBQXpFLDRHQUF5RTtJQUNyRixjQUErQjtJQUEvQixvREFBK0I7SUFFbkIsY0FBeUI7SUFBekIsOENBQXlCO0lBRXJDLGVBQThCO0lBQTlCLG1EQUE4Qjs7OztJQU94QyxpQ0FrQ21EO0lBNUJqRCxrU0FBbUI7SUFrQm5CLEFBREEsQUFIQSxBQURBLEFBREEsQUFEQSxBQURBLEFBREEsQUFEQSxBQURBLHlMQUFTLDRCQUFxQixLQUFDLCtMQUNOLElBQUksS0FBQyw2TkFDWSwrQkFBd0IsS0FBQyxvTUFDOUMseUJBQWtCLEtBQUMsMEtBQ2hDLDhCQUF1QixLQUFDLDRLQUN2QiwwQkFBbUIsS0FBRSw4S0FDSixLQUFLLHVCQUFnQixJQUFJLEVBQUUsMEJBQW1CLHdCQUFFLDRCQUFxQixLQUFFLDRLQUNyRixtQkFBWSxLQUFDLHFOQUdTLG9NQUNiLGdDQUF5QixLQUFDO0lBeEJqRCxpQkFrQ21EO0lBQ25ELDZCQUEwRjtJQUEvQixxTEFBUywwQkFBbUIsS0FBRTtJQUFDLGlCQUFJOzs7OztJQWhDNUYsQUFIc0csQUFBakcsMENBQXFCLHlDQUE2Ryw2QkFHbEg7SUFHckIsNENBQW1CO0lBMEJuQixBQURBLEFBREEsQUFEQSxBQURBLEFBREEsQUFEQSxBQUpBLEFBREEsQUFUQSxBQURBLEFBREEsQUFEQSxBQURBLEFBREEsNERBQXFDLDZCQUNoQix5Q0FDWSx3Q0FDRCxpREFDWSwrQ0FDRix1Q0FTWCx1Q0FDQSwwREFJbUIsd0JBQzNCLDZCQUNLLDBCQUNILHlFQUN3Qyx5QkFDaEQsNkJBQ0k7O0lBR1csY0FBd0I7SUFBeEIsNkNBQXdCOzs7SUF3Q3hELDJCQUEyRjs7OztJQU92RixBQURGLEFBREYsZ0NBQW1FLFdBQzNELGlCQUUrQjtJQUFqQywwTUFBUyw2QkFBc0IsS0FBQztJQUNoQyxvQkFBNEM7SUFFaEQsQUFERSxBQUQ4QyxpQkFBUyxFQUNoRCxFQUNGOzs7SUFOSCxxRUFBa0M7SUFFYixlQUFxQjtJQUFyQiwwQ0FBcUI7SUFFdkMsY0FBb0M7SUFBcEMsa0VBQW9DOzs7O0lBL0MvQyxrQ0FBcUg7SUFBeEIsb0xBQVMsb0JBQWEsS0FBQztJQUFDLG9CQUFnRDtJQUFBLGlCQUFTO0lBQzlLLGdDQUFzQjtJQUFBLDJCQUFXO0lBQUEsaUJBQU87SUFDeEMsaUNBaUNrRDtJQTNCaEQsa1NBQW1CO0lBaUJuQixBQURBLEFBSEEsQUFEQSxBQURBLEFBREEsQUFEQSxBQURBLEFBREEseUxBQVMsNEJBQXFCLEtBQUMsK0xBQ04sSUFBSSxLQUFDLDZOQUNZLCtCQUF3QixLQUFDLG9NQUM5Qyx5QkFBa0IsS0FBQyxvSkFDaEMsOEJBQXVCLHdCQUFFLG1CQUFZLEtBQUMsNEtBQ3JDLDBCQUFtQixLQUFFLDhLQUNKLEtBQUssdUJBQWdCLElBQUksRUFBRSwwQkFBbUIsd0JBQUUsNEJBQXFCLEtBQUMscU5BRzlELG9NQUNiLGdDQUF5QixLQUFDO0lBdkJqRCxpQkFpQ2tEO0lBQ2xELDRCQUEwRztJQUMxRyx3RkFBcUI7SUFHckIsa0NBQTBKO0lBQXBDLDBMQUFTLDJCQUFvQixJQUFJLENBQUMsS0FBQztJQUFDLG9CQUFpRDtJQUFBLGlCQUFTO0lBQ3BOLGdDQUFzQjtJQUFBLDZCQUFZO0lBQUEsaUJBQU87SUFDekMsMEZBQXNCOzs7OztJQTFDa0csY0FBd0M7SUFBeEMsc0VBQXdDO0lBRXpKLGVBQXFCO0lBRzFCLEFBREEsQUFGc0csQUFBakcsMENBQXFCLHlDQUE2RyxrREFFN0YsNkJBQ3JCO0lBR3JCLDRDQUFtQjtJQXlCbkIsQUFEQSxBQURBLEFBREEsQUFEQSxBQURBLEFBREEsQUFKQSxBQURBLEFBUkEsQUFEQSxBQURBLEFBREEsQUFEQSxBQURBLDREQUFxQyw2QkFDaEIseUNBQ1ksd0NBQ0QsaURBQ1ksK0NBQ0YsdUNBUVgsdUNBQ0EsMERBSW1CLHdCQUMzQiw2QkFDSywwQkFDSCx5RUFDd0MsNkJBQzVDLHlCQUNKOztJQUluQixlQUVDO0lBRkQsK0NBRUM7SUFDMEUsY0FBMEM7SUFBMUMsOEVBQTBDO0lBQXdDLGNBQXlDO0lBQXpDLHVFQUF5QztJQUV0TSxlQVFHO0lBUkgsaURBUUc7O0FENUVMLE1BQU0sYUFBYSxHQUFHLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFhNUUsTUFBTSxPQUFPLGVBQWdCLFNBQVEseUJBQXlCO2FBQ25ELG9CQUFlLEdBQUcsYUFBYSxFQUFFLEFBQWxCLENBQW1CO0lBOER6QyxvRUFBb0U7SUFDcEUsSUFBSSxVQUFVO1FBQ1YsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzVCLENBQUM7SUFFRCxJQUFJLFVBQVUsQ0FBQyxFQUFFO1FBQ2IsSUFBSSxDQUFDLFdBQVcsR0FBRyxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsc0JBQXNCLENBQUM7UUFDM0QsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ2pDLENBQUM7SUFFRCxZQUNJLEdBQWEsRUFDYixHQUFRLEVBQzRCLGFBQWEsRUFDZixXQUFXLEVBQ0wsZUFBb0I7UUFFNUQsS0FBSyxDQUFDLEdBQUcsRUFBRSxhQUFhLEVBQUUsZUFBZSxDQUFDLENBQUM7UUFKUCxrQkFBYSxHQUFiLGFBQWEsQ0FBQTtRQUNmLGdCQUFXLEdBQVgsV0FBVyxDQUFBO1FBekUxQyxVQUFLLEdBQUcsRUFBRSxDQUFDO1FBYVYsU0FBSSxHQUFHLENBQUMsQ0FBQztRQWdFYix1REFBdUQ7UUFDdkQsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixRQUFRLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFakQ7Ozs7V0FJRztRQUNILElBQUksQ0FBQyxtQkFBbUIsR0FBRyxVQUFVO2FBQ2hDLE1BQU0sQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3RCLHVCQUF1QjtZQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztnQkFDbkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7Z0JBQzFCLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzlCLENBQUM7WUFDRCxtR0FBbUc7WUFDbkcsaUZBQWlGO1lBQ2pGLG9FQUFvRTtZQUNwRSw0RkFBNEY7WUFDNUYsSUFBSSxJQUFJLENBQUMsaUJBQWlCLEVBQUUsQ0FBQztnQkFDekIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLEdBQUcsU0FBUyxDQUFDO1lBQzFDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ0gsTUFBTSxDQUFDLEdBQUcsRUFBRTtZQUNSLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7UUFDdkYsQ0FBQyxDQUFDLEVBQ0YsUUFBUSxDQUFDLENBQUMsS0FBYSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FDckUsQ0FBQztRQUVOLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxZQUFZLEVBQUUsQ0FBQztRQUV2Qzs7O1dBR0c7UUFDSCxNQUFNLHFCQUFxQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsR0FBMkIsRUFBRSxFQUFFO1lBRXBGLE1BQU0sS0FBSyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBVyxDQUFDO1lBRXRELElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxLQUFLLEtBQUssRUFBRSxFQUFFLENBQUM7Z0JBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO2dCQUN4QixtQkFBbUI7Z0JBQ25CLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUM7Z0JBQ2xDLHdFQUF3RTtnQkFDeEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxTQUFTLENBQUM7Z0JBQzdCLE9BQU87WUFDWCxDQUFDO1lBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxjQUFjLEVBQUUsQ0FBQztnQkFDdkIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQztnQkFDbEMsK0ZBQStGO2dCQUMvRixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFLLElBQVksQ0FBQyxhQUFhLEtBQUssR0FBRyxFQUFFLENBQUM7b0JBQ3hELElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO29CQUM3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxVQUFVLEdBQUcsRUFBRSxDQUFDO2dCQUN0QyxDQUFDO2dCQUNELHlEQUF5RDtnQkFDekQsaURBQWlEO2dCQUNqRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDaEMsQ0FBQztZQUVELHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztRQUM1QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO1FBRXhFLE1BQU0sbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFO1lBQ3JELDJCQUEyQjtZQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDO1lBQzNDLElBQUksQ0FBQyxXQUFXLEdBQUcsU0FBUyxDQUFDO1lBQzdCLE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLHNCQUFzQixDQUFDO1lBQ25FLDZHQUE2RztZQUM3RyxJQUFJLFNBQVMsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO2dCQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQyxDQUFDO1lBQ3ZDLENBQUM7UUFDTCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQzFFLENBQUM7SUFFRCw0Q0FBNEM7SUFDcEMsV0FBVyxDQUFDLE1BQU0sRUFBRSxXQUFXO1FBQ25DLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3pCLElBQUksV0FBVyxFQUFFLENBQUM7WUFDZCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QixJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssQ0FBQztZQUM1QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDeEIsQ0FBQztRQUNELElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztRQUMzQix5REFBeUQ7UUFDekQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNULElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7SUFFRCxxQ0FBcUM7SUFDOUIsU0FBUztRQUNaLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQ2hCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO0lBQzlCLENBQUM7SUFFRCw2REFBNkQ7SUFDckQsV0FBVztRQUNmLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxJQUFJLEdBQUcsQ0FBQyxDQUFDO1FBQ2Qsa0ZBQWtGO1FBQ2xGLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1FBQ3pCLElBQUksQ0FBQyxRQUFRLEdBQUcsU0FBUyxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ3pDLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQzdCLENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztRQUN6QixJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksQ0FBQztRQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyx3QkFBd0I7UUFDNUIsb0lBQW9JO1FBQ3BJLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDM0IsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7UUFDRCxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztZQUN6Qyx1RkFBdUY7WUFDdkYsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUM7WUFDeEIsdURBQXVEO1lBQ3ZELElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBRXRDLHlDQUF5QztZQUN6QyxJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssUUFBUSxFQUFFLENBQUM7Z0JBQzdCLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUMxQyxDQUFDO1FBQ0wsQ0FBQztRQUNELG1HQUFtRztRQUNuRyxzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDcEQsQ0FBQztJQUNMLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxLQUFhO1FBQzNDLDBIQUEwSDtRQUMxSCx3SEFBd0g7UUFDeEgsSUFBSSxJQUFJLENBQUMsVUFBVSxLQUFLLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLGNBQWMsQ0FBQyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQztZQUNyRyxJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQztZQUMzQixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVEOzs7OztVQUtFO1FBQ0YsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ2pGLElBQUkscUJBQXFCLEdBQUcsRUFBRSxDQUFDO1lBQy9CLE1BQU0sY0FBYyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELElBQUksWUFBWSxDQUFDO1lBQ2pCLElBQUksSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7Z0JBQ3hCLHFCQUFxQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQzFELElBQUkscUJBQXFCLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyQyxJQUFJLENBQUMsUUFBUSxDQUFDLHFCQUFxQixDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQzNDLE1BQU0sS0FBSyxHQUFHLFdBQVcsQ0FBQzt3QkFDMUIsWUFBWSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztvQkFDM0QsQ0FBQzt5QkFBTSxDQUFDO3dCQUNKLFlBQVksR0FBRyxJQUFJLENBQUM7b0JBQ3hCLENBQUM7Z0JBQ0wsQ0FBQztZQUNMLENBQUM7WUFDRCxJQUFJLENBQUMscUJBQXFCLENBQUMsTUFBTSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksSUFBSSxDQUFDLFFBQVEsQ0FBQyxjQUFjLEVBQUUsWUFBWSxDQUFDLENBQUM7bUJBQzNGLENBQUMsSUFBSSxDQUFDLGlCQUFpQixJQUFJLENBQUMsUUFBUSxDQUFDLGNBQWMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDcEYsSUFBSSxDQUFDLGFBQWEsR0FBRyxLQUFLLENBQUM7Z0JBQzNCLE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQ2xCLENBQUM7UUFDTCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQzdCLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMzQyxDQUFDO0lBRVMsV0FBVyxDQUFDLElBQWlCLEVBQUUsU0FBaUIsRUFBRSxhQUF1QixFQUFFLE1BQVc7UUFDNUYsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxRQUFRLENBQUMsRUFBRSxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ3hFLEtBQUssQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLFNBQVMsRUFBRSxhQUFhLEVBQUUsTUFBTSxDQUFDLENBQUM7UUFDOUQsQ0FBQztJQUNMLENBQUM7SUFFRCwrREFBK0Q7SUFDdkQsU0FBUyxDQUFDLEtBQXFCLEVBQUUsS0FBYTtRQUNsRCxJQUFJLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQzFCLDREQUE0RDtZQUMzRCxLQUFhLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsRUFBRSxDQUFDO1lBQ25ELE9BQU8sSUFBSSxDQUFDLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDM0QsQ0FBQztJQUNMLENBQUM7SUFFRCw0Q0FBNEM7SUFDcEMsYUFBYSxDQUFDLENBQUM7UUFDbkIsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDVixJQUFJLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDekMsQ0FBQzthQUFNLENBQUM7WUFDSixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNsRCxJQUFJLFVBQVUsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDcEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUMvRCxDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDbEUsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRUQsa0VBQWtFO0lBQzNELG9CQUFvQjtRQUN2QixPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssY0FBYyxJQUFJLFFBQVEsRUFBRSxDQUFDO0lBQ3RELENBQUM7SUFFRCx3RUFBd0U7SUFDakUsY0FBYztRQUNqQixPQUFPLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQztJQUMvQyxDQUFDO0lBRU8sWUFBWSxDQUFDLGFBQXVCO1FBQ3hDLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMvQixPQUFPO1FBQ1gsQ0FBQztRQUNELDBEQUEwRDtRQUMxRCxJQUFJLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFFdEQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUM7UUFFMUIseURBQXlEO1FBQ3pELElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7UUFDaEMsQ0FBQztRQUVELDBFQUEwRTtRQUMxRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQztZQUNuQixNQUFNLEVBQUU7Z0JBQ0osS0FBSyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxDQUFDLHVDQUF1QzthQUN6RTtTQUNKLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCx3REFBd0Q7SUFDaEQsVUFBVTtRQUNkLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLG9DQUFvQztRQUNwQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLHdFQUF3RTtRQUN4RSxJQUFJLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDN0IsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ3JCLHNJQUFzSTtRQUN0SSxJQUFJLElBQUksQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSyxJQUFJLENBQUMsU0FBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUMxRSxJQUFJLENBQUMsU0FBaUIsQ0FBQyxVQUFVLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN4RCxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWEsQ0FBQyxNQUFNO1FBQ3hCLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsTUFBTSxHQUFHLEVBQUUsQ0FBQztRQUNqQixJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsQ0FBQztRQUNkLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7UUFDN0MsSUFBSSxDQUFDLGFBQWEsR0FBRyxTQUFTLENBQUM7UUFFL0IsNkNBQTZDO1FBQzdDLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQztZQUNyQixJQUFJLENBQUMsYUFBYSxHQUFHLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQzFDLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFbEQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFFOUMscUdBQXFHO1lBQ3JHLElBQUksTUFBTSxJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssQ0FBQyxFQUFFLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1lBQ25ELENBQUM7UUFDTCxDQUFDO2FBQU0sQ0FBQztZQUNKLHFEQUFxRDtZQUNyRCxJQUFJLENBQUMsbUJBQW1CLENBQUMsUUFBUSxFQUFFO2dCQUMvQixNQUFNLEVBQUUsTUFBTTtnQkFDZCxNQUFNLEVBQUUsSUFBSSxDQUFDLGFBQWEsSUFBSSxJQUFJLENBQUMsS0FBSztnQkFDeEMsTUFBTSxFQUFHLElBQVksQ0FBQyxhQUFhO2FBQ3RDLENBQUMsQ0FBQztRQUNQLENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsNEJBQTRCO0lBQ3BCLGdCQUFnQixDQUFDLE1BQU07UUFDM0IseURBQXlEO1FBQ3pELElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7WUFDekMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNoQyxDQUFDO0lBQ0wsQ0FBQztJQUNELGdEQUFnRDtJQUN4QyxjQUFjLENBQUMsTUFBYTtRQUNoQyxJQUFJLElBQUksQ0FBQztRQUNULDZHQUE2RztRQUM3RyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsTUFBTSxFQUFFLEtBQUssS0FBSyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRTNFLElBQUksSUFBSSxDQUFDLGtCQUFrQixJQUFJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLElBQUksWUFBWSxFQUFFLENBQUM7WUFDNUUsSUFBSSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBQy9DLENBQUM7UUFDRCxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRTVDLDJFQUEyRTtRQUMzRSxJQUFJLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLEVBQUUsQ0FBQztZQUM3QixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQztZQUN4QiwwRUFBMEU7WUFDMUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUM7Z0JBQ25CLE1BQU0sRUFBRTtvQkFDSixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyx1Q0FBdUM7aUJBQzVEO2FBQ0osQ0FBQyxDQUFDO1lBQ0gsT0FBTztRQUNYLENBQUM7UUFDRCw4QkFBOEI7UUFDOUIsSUFBSSxJQUFJLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLElBQUksWUFBWSxFQUFFLENBQUM7WUFDcEUsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDaEQsQ0FBQzthQUFNLENBQUM7WUFDSixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUM7WUFDN0IsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkQsQ0FBQztJQUNMLENBQUM7SUFFTyx5QkFBeUIsQ0FBQyxTQUFTO1FBQ3ZDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxFQUFFLFNBQVMsRUFBRSxDQUFDLENBQUM7SUFDakUsQ0FBQztJQUVPLGNBQWM7UUFDbEIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUMxQixDQUFDO1FBQ0QsMkRBQTJEO1FBQzNELHVIQUF1SDtRQUN2SCxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1lBQ3BCLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSyxJQUFJLENBQUMsU0FBaUIsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ2xHLElBQUksQ0FBQyxrQkFBMEIsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQztZQUM3RCxJQUFJLENBQUMsa0JBQTBCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7WUFDNUQsdUJBQXVCLENBQUMsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsRUFBRyxJQUFJLENBQUMsU0FBaUIsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxDQUFDLG9DQUFvQyxDQUFDLENBQUMsQ0FBQztRQUV2SixDQUFDLENBQUMsQ0FBQztRQUVILEVBQUUsRUFBRSxDQUFDO1FBRUwsK0JBQStCO1FBQy9CLElBQUksSUFBSSxDQUFDLG9CQUFvQixFQUFFLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDekMsSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDcEMsQ0FBQztZQUNELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7WUFFbEUsVUFBVSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVELE1BQU0sWUFBWSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLGNBQWMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ3BFLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLFlBQVksR0FBRyxJQUFJLEVBQUUsQ0FBQyxDQUFDO1lBQzlFLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUVwRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUM5RSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsQ0FBQztRQUNMLENBQUM7SUFDTCxDQUFDO0lBRU8sVUFBVTtRQUNkLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxPQUFPLENBQUM7UUFFaEQsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ1gsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUU5RCxxR0FBcUc7UUFDckcsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSSxLQUFLLEdBQUcsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDekYsMEdBQTBHO1lBQzFHLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxLQUFLLENBQUM7WUFDL0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0wsQ0FBQztJQUVPLDRCQUE0QjtRQUNoQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBQ3hCLElBQUksQ0FBQyxrQkFBMEIsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQztZQUNuRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztRQUN2QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGFBQWE7UUFDakIsSUFBSSxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDekUsT0FBTztRQUNYLENBQUM7UUFDRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDMUMsTUFBTSxTQUFTLEdBQUcsaUJBQWlCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBRXRELGtEQUFrRDtRQUNsRCxJQUFJLFNBQVMsQ0FBQyxNQUFNLElBQUksaUJBQWlCLENBQUMsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsTUFBTSxFQUFFLEdBQUcsaUJBQWlCLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxHQUFHLFNBQVMsQ0FBQyxNQUFNLEVBQUUsR0FBRyxTQUFTLENBQUMsUUFBUSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsSyxJQUFJLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVCLENBQUM7SUFDTCxDQUFDO0lBRU8sa0JBQWtCO1FBQ3RCLE9BQU8sSUFBSSxDQUFDLFFBQVEsS0FBSyxRQUFRLENBQUM7SUFDdEMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLElBQUk7UUFDN0IsSUFBSSxDQUFDLG9CQUFvQixHQUFHLElBQUksQ0FBQztRQUNqQyxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUM3QyxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxRQUFRLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQzlELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7Z0JBQzlDLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsYUFBYSxHQUFHLFNBQVMsQ0FBQztnQkFDL0IsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7Z0JBQzVCLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxDQUFDO1lBQ3BCLENBQUM7WUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDakIsSUFBSSxHQUFHLENBQUUsSUFBSSxDQUFDLFNBQWlCLEVBQUUsb0JBQW9CLENBQUMsRUFBRSxDQUFDO29CQUNyRCxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO2dCQUMxQixDQUFDO1lBQ0wsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVPLGlCQUFpQixDQUFDLElBQUk7UUFDMUIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzQixJQUFJLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVPLGtCQUFrQixDQUFDLElBQUk7UUFDM0IsOEVBQThFO1FBQzlFLDBHQUEwRztRQUMxRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3hILDJEQUEyRDtZQUMzRCxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7Z0JBQzFELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO2dCQUNyQyxPQUFPO1lBQ1gsQ0FBQztZQUVELDhFQUE4RTtZQUM5RSxJQUFJLENBQUMsSUFBSSxDQUFDLG9CQUFvQixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUUsQ0FBQztnQkFDNUYsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3BDLENBQUM7UUFDTCxDQUFDO0lBQ0wsQ0FBQztJQUVELDJDQUEyQztJQUNuQyw2QkFBNkI7UUFDakMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBaUIsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDNUcsSUFBSSxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBRSxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7WUFDeEcsSUFBSSxDQUFDLHNCQUFzQixHQUFHLFNBQVMsQ0FBQztRQUM1QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLGVBQWUsQ0FBQyxJQUFTO1FBQzdCLDhFQUE4RTtRQUM5RSwrR0FBK0c7UUFDL0csSUFBSSxJQUFJLENBQUMsb0JBQW9CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQzlDLE9BQU87UUFDWCxDQUFDO1FBQ0QsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNsRCxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztRQUN4SSxDQUFDLENBQUMsQ0FBQztRQUVILHdEQUF3RDtRQUN4RCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLFVBQVUsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3hELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDeEUsQ0FBQzthQUFNLENBQUM7WUFDSixvRUFBb0U7WUFDcEUsSUFBSyxJQUFZLENBQUMsYUFBYSxLQUFLLElBQUksRUFBRSxDQUFDO2dCQUN2QyxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQztnQkFDNUIsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7Z0JBQ2hCLE9BQU87WUFDWCxDQUFDO1FBQ0wsQ0FBQztRQUNELElBQUksQ0FBQyw2QkFBNkIsRUFBRSxDQUFDO1FBRXJDLGlDQUFpQztRQUNqQyxJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1SCxJQUFJLENBQUMsWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztJQUM1QyxDQUFDO0lBRUQsNkRBQTZEO0lBQ3JELFdBQVcsQ0FBQyxNQUFNO1FBQ3RCLElBQUksSUFBSSxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxDQUFDLEtBQUssS0FBSyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztZQUM5RSxJQUFJLENBQUMsU0FBaUIsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQy9ELENBQUM7SUFDTCxDQUFDO0lBRU0sZ0JBQWdCO1FBQ25CLE1BQU0sUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsT0FBTyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7UUFDekYsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLHdCQUF3QixFQUFFLEVBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFDLENBQUMsQ0FBQztRQUN0RixDQUFDO0lBQ0wsQ0FBQztJQUVELHFGQUFxRjtJQUM5RSxhQUFhLENBQUMsS0FBNkIsRUFBRSxpQkFBMkIsRUFBRSxhQUFzQjtRQUNuRywrR0FBK0c7UUFDL0csSUFBSSxpQkFBaUIsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMvQixDQUFDO1FBRUQsd0dBQXdHO1FBQ3hHLE1BQU0sVUFBVSxHQUF3QjtZQUNwQyxPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTO1lBQ3JFLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztZQUM3QixVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDM0IsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTO1lBQ3pCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTTtZQUM1QyxLQUFLLEVBQUUsS0FBSztZQUNaLGFBQWEsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQzlCLFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFDOUQsMkRBQTJEO1lBQzNELFNBQVMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQ2pFLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVc7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztZQUNqQixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7U0FDakUsQ0FBQztRQUVGLElBQUksSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ25CLFVBQVUsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztZQUMxQyxVQUFVLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDNUMsQ0FBQztRQUVELElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1FBRTFCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDO2FBQ3RDLElBQUksQ0FBQyxDQUFDLFFBQWEsRUFBRSxFQUFFO1lBQ3BCLHlEQUF5RDtZQUN6RCxRQUFRLEdBQUcsUUFBUSxDQUFDLElBQUksSUFBSSxRQUFRLENBQUM7WUFDckMsZ0ZBQWdGO1lBQ2hGLElBQUksQ0FBQyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7Z0JBQ3hGLElBQUksQ0FBQyxPQUFPLEdBQUcsUUFBUSxDQUFDO1lBQzVCLENBQUM7WUFFRCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ2hDLElBQUksQ0FBQyxnQkFBZ0IsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ25FLENBQUM7aUJBQU0sQ0FBQztnQkFDSixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsUUFBUSxDQUFDO1lBQ3JDLENBQUM7WUFFRCxvSEFBb0g7WUFDcEgsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDOUQsSUFBSSxDQUFDLFNBQVMsQ0FBQyxxQkFBcUIsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDO1lBQ3hFLENBQUM7WUFFRCxxSUFBcUk7WUFDakksSUFBSSxJQUFJLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUNqSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDekIsQ0FBQztZQUVELE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFdEYsd0NBQXdDO1lBQ3BDLElBQUksQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLGVBQWUsRUFBRSxPQUFPLENBQUMsQ0FBQztZQUNoRCxPQUFPLGVBQWUsQ0FBQztRQUMzQixDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsRUFBRTtZQUNULElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLE9BQU8sRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUNBLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ1osSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ2xCLENBQUMsUUFBUSxDQUFDLEdBQUcsRUFBRTtvQkFDWCxJQUFJLENBQUMsNEJBQTRCLEVBQUUsQ0FBQztnQkFDeEMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDVixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUM1QixDQUFDO1lBQ0QsMkRBQTJEO1lBQzNELElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksQ0FBQyxhQUFhLEdBQUcsU0FBUyxDQUFDO2dCQUMvQixJQUFJLENBQUMsVUFBVSxHQUFJLEtBQWdCLENBQUM7WUFDeEMsQ0FBQztZQUNELHdJQUF3STtZQUN4SSw0Q0FBNEM7WUFDNUMsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sR0FBRyxFQUFFLENBQUM7WUFDaEIsQ0FBQztZQUNELElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1lBQzNCLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDO1lBQzFCLE9BQU8sTUFBTSxDQUFDO1FBQ2xCLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVELCtGQUErRjtJQUN2RixVQUFVLENBQUMsT0FBTztRQUN0QixJQUFJLE9BQU8sSUFBSSxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxFQUFFLENBQUM7WUFDcEMsT0FBTyxJQUFJLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxPQUFPLENBQUM7SUFDbkIsQ0FBQztJQUVNLGtCQUFrQixDQUFDLElBQVMsRUFBRSxTQUFrQixFQUFFLFFBQWtCO1FBQ3ZFLElBQUksU0FBUyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUM7WUFDdkIsU0FBUyxFQUFFLENBQUM7UUFDaEIsQ0FBQztRQUVELE1BQU0sZUFBZSxHQUFHLGlCQUFpQixDQUNyQyxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFDaEMsSUFBSSxFQUNKLElBQUksQ0FBQyxTQUFTLEVBQ2Q7WUFDSSxZQUFZLEVBQUUsSUFBSSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsWUFBWTtZQUNwRCxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUI7WUFDbkQsZUFBZSxFQUFFLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCO1lBQ3RELGlCQUFpQixFQUFFLElBQUksQ0FBQyxtQkFBbUI7WUFDM0MsYUFBYSxFQUFFLElBQUksQ0FBQyxlQUFlO1NBQ3RDLEVBQ0QsU0FBUyxFQUNULElBQUksQ0FDUCxDQUFDO1FBQ0YsT0FBTyxzQkFBc0IsQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQ3ZJLENBQUM7SUFFRCw4RUFBOEU7SUFDdkUsUUFBUSxDQUFDLFNBQWtCLEVBQUUsR0FBVTtRQUMxQyxNQUFNLFdBQVcsR0FBRyxTQUFTLENBQUMsWUFBWSxFQUN0QyxZQUFZLEdBQUcsU0FBUyxDQUFDLFlBQVksQ0FBQztRQUUxQyx1SEFBdUg7UUFDdkgsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLEdBQUcsWUFBWSxJQUFJLFdBQVcsQ0FBQyxFQUFFLENBQUM7WUFDOUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDO0lBQ0wsQ0FBQztJQUVNLFFBQVE7UUFDWCxLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7UUFFakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUM1Qix5Q0FBeUM7WUFDekMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztZQUN0QixDQUFDO2lCQUFNLENBQUM7Z0JBQ0osSUFBSSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7WUFDdEIsQ0FBQztRQUNMLENBQUM7UUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1FBRTdDLDBEQUEwRDtRQUMxRCxtREFBbUQ7UUFDbkQsSUFBSSxDQUFDLGNBQWMsR0FBRyxTQUFTLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUFDLENBQUM7SUFDMUcsQ0FBQztJQUVNLGVBQWU7UUFDbEIsS0FBSyxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXhCLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBNEIsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNoRCxJQUFJLENBQUMsZUFBZSxHQUFHLHVCQUF1QixDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztJQUN2RSxDQUFDO0lBRU0sa0JBQWtCO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLENBQUMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQzdDLElBQUksYUFBYSxFQUFFLENBQUM7WUFDaEIsYUFBYSxDQUFDLFVBQVUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0wsQ0FBQztJQUVPLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSTtRQUMxQixJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxHQUFHO2dCQUNiLElBQUksRUFBSSxJQUFJLENBQUMsVUFBVTtnQkFDdkIsS0FBSyxFQUFHLElBQUksQ0FBQyxLQUFLO2dCQUNsQixLQUFLLEVBQUcsSUFBSSxDQUFDLEtBQUs7Z0JBQ2xCLEtBQUssRUFBRyxJQUFJLENBQUMsS0FBSzthQUNyQixDQUFDO1FBQ04sQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7SUFFRCwrR0FBK0c7SUFDeEcsaUJBQWlCLENBQUMsS0FBcUIsRUFBRSxNQUFhO1FBQ3pELE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7UUFDckIsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3hDLE1BQU0sR0FBRyxNQUFNLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQztRQUV4QyxvREFBb0Q7UUFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDO1FBQzVCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztRQUVoQyxNQUFNLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFdEMsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxNQUFNLElBQUksRUFBRSxDQUFDLENBQUM7UUFDbEQsK0ZBQStGO1FBQy9GLElBQUksSUFBSSxDQUFDLFNBQVMsS0FBTSxJQUFZLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDakQsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM3QyxDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxhQUFhLENBQUMsRUFBRSxDQUFDO1lBQ3hDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUN2QixDQUFDO1FBQ0QsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFDOUUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFFL0MsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsR0FBVyxFQUFFLEVBQU8sRUFBRSxFQUFPO1FBQzFDLElBQUksR0FBRyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQ3JCLE9BQU87UUFDWCxDQUFDO1FBRUQsK0NBQStDO1FBQy9DLDRDQUE0QztRQUM1Qyx3RUFBd0U7UUFDeEUsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLGNBQWMsSUFBSSxHQUFHLEtBQUssY0FBYyxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxFQUFHLENBQUM7WUFDNUosSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUM7WUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUM7UUFDbEMsQ0FBQztRQUVELGdIQUFnSDtRQUNoSCxJQUFJLEdBQUcsS0FBSyxjQUFjLElBQUksSUFBSSxDQUFDLFdBQVcsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLEtBQUssSUFBSSxFQUFFLENBQUM7WUFDL0UsSUFBSSxDQUFDLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLENBQUMsSUFBSSxJQUFJLENBQUMsYUFBYSxDQUFDO1FBQ25FLENBQUM7UUFFRCxrSEFBa0g7UUFDbEgsSUFBSSxHQUFHLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckIsSUFBSSxFQUFFLEtBQUssS0FBSyxFQUFFLENBQUM7Z0JBQ2YsSUFBSSxDQUFDLFNBQVMsR0FBRyxLQUFLLENBQUM7WUFDM0IsQ0FBQztpQkFBTSxDQUFDO2dCQUNKLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO2dCQUN0QixJQUFJLEdBQUcsQ0FBRSxJQUFJLENBQUMsU0FBaUIsRUFBRSxvQkFBb0IsQ0FBQyxFQUFFLENBQUM7b0JBQ3JELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQzFCLENBQUM7WUFDTCxDQUFDO1FBQ0wsQ0FBQztRQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEVBQUUsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQ3hDLENBQUM7Z0hBbjBCUSxlQUFlLHdGQTZFVCxnQkFBZ0Isd0JBQ2hCLGNBQWMsd0JBQ2pCLGtCQUFrQjtvRUEvRXJCLGVBQWU7MkJBbUNiLGtCQUFrQjs7Ozs7Ozs7Z0VBekNsQjtnQkFDUCxTQUFTLENBQUMsZUFBZSxFQUFFLGlCQUFpQixFQUFFLElBQUksQ0FBQztnQkFDbkQsU0FBUyxDQUFDLGVBQWUsRUFBRSxhQUFhLEVBQUUsSUFBSSxDQUFDO2dCQUMvQyxrQkFBa0IsQ0FBQyxlQUFlLENBQUM7YUFDdEM7WUNjSCxBQXJDRixBQTVCQSxBQWxCQSxpSEFBd0csb0dBa0JDLGtEQTRCckYsbURBcUNYOztZQXJDVCxlQXlGRztZQXpGSCwwQ0F5Rkc7NEJEekVTLFlBQVksbUNBQUUsa0JBQWtCLG9IQUFFLFdBQVcsaUhBQUUsbUJBQW1CLEVBQUUsZUFBZTs7aUZBU2xGLGVBQWU7Y0FYM0IsU0FBUzs2QkFDSSxJQUFJLFdBQ1AsQ0FBQyxZQUFZLEVBQUUsa0JBQWtCLEVBQUUsV0FBVyxFQUFFLG1CQUFtQixFQUFFLGVBQWUsQ0FBQyxZQUNsRixZQUFZLGFBRVg7b0JBQ1AsU0FBUyxrQkFBa0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDO29CQUNuRCxTQUFTLGtCQUFrQixhQUFhLEVBQUUsSUFBSSxDQUFDO29CQUMvQyxrQkFBa0IsaUJBQWlCO2lCQUN0Qzs7c0JBK0VJLFNBQVM7dUJBQUMsZ0JBQWdCOztzQkFDMUIsU0FBUzt1QkFBQyxjQUFjOztzQkFDeEIsTUFBTTt1QkFBQyxrQkFBa0I7O3NCQUFHLFFBQVE7cUJBNUNWLFNBQVM7a0JBQXZDLFNBQVM7bUJBQUMsa0JBQWtCO1lBQ0wsU0FBUztrQkFBaEMsU0FBUzttQkFBQyxXQUFXO1lBQ00sVUFBVTtrQkFBckMsWUFBWTttQkFBQyxZQUFZOztrRkFyQ2pCLGVBQWUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgV21Db21wb25lbnRzTW9kdWxlIH0gZnJvbSBcIkB3bS9jb21wb25lbnRzL2Jhc2VcIjtcbmltcG9ydCB7IEZvcm1zTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgU2Nyb2xsYWJsZURpcmVjdGl2ZSB9IGZyb20gJy4vc2Nyb2xsYWJsZS5kaXJlY3RpdmUnO1xuaW1wb3J0IHtcbiAgICBBZnRlclZpZXdDaGVja2VkLFxuICAgIEFmdGVyVmlld0luaXQsXG4gICAgQXR0cmlidXRlLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEluamVjdCxcbiAgICBJbmplY3RvcixcbiAgICBPbkluaXQsXG4gICAgT3B0aW9uYWwsXG4gICAgUXVlcnlMaXN0LFxuICAgIFZpZXdDaGlsZCxcbiAgICBWaWV3Q2hpbGRyZW5cbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge05HX1ZBTElEQVRPUlMsIE5HX1ZBTFVFX0FDQ0VTU09SfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7ZnJvbSwgT2JzZXJ2YWJsZSwgb2Z9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtmaWx0ZXIsIG1lcmdlTWFwfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7VHlwZWFoZWFkQ29udGFpbmVyQ29tcG9uZW50LCBUeXBlYWhlYWREaXJlY3RpdmUsIFR5cGVhaGVhZE1hdGNoLCBUeXBlYWhlYWRNb2R1bGV9IGZyb20gJ25neC1ib290c3RyYXAvdHlwZWFoZWFkJztcblxuaW1wb3J0IHthZGRDbGFzcywgYWRqdXN0Q29udGFpbmVyUG9zaXRpb24sIEFwcCwgRGF0YVNvdXJjZSwgaXNEZWZpbmVkLCBpc01vYmlsZSwgdG9Cb29sZWFufSBmcm9tICdAd20vY29yZSc7XG5pbXBvcnQge1xuICAgIEFMTEZJRUxEUyxcbiAgICBjb252ZXJ0RGF0YVRvT2JqZWN0LFxuICAgIERhdGFTZXRJdGVtLFxuICAgIGV4dHJhY3REYXRhQXNBcnJheSxcbiAgICBnZXRDb250YWluZXJUYXJnZXRDbGFzcyxcbiAgICBnZXRVbmlxT2Jqc0J5RGF0YUZpZWxkLFxuICAgIHByb3ZpZGVBcyxcbiAgICBwcm92aWRlQXNXaWRnZXRSZWYsXG4gICAgc3R5bGVyLFxuICAgIHRyYW5zZm9ybUZvcm1EYXRhXG59IGZyb20gJ0B3bS9jb21wb25lbnRzL2Jhc2UnO1xuaW1wb3J0IHtEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50fSBmcm9tICdAd20vY29tcG9uZW50cy9pbnB1dCc7XG5cbmltcG9ydCB7cmVnaXN0ZXJQcm9wc30gZnJvbSAnLi9zZWFyY2gucHJvcHMnO1xuaW1wb3J0IHtEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXIsIElEYXRhUHJvdmlkZXJDb25maWd9IGZyb20gJy4vZGF0YS1wcm92aWRlci9kYXRhLXByb3ZpZGVyJztcbmltcG9ydCB7XG4gICAgZGVib3VuY2UsXG4gICAgZmluZCxcbiAgICBnZXQsXG4gICAgaW5jbHVkZXMsXG4gICAgaXNBcnJheSxcbiAgICBpc0VtcHR5LFxuICAgIGlzRXF1YWwsXG4gICAgaXNPYmplY3QsXG4gICAgaXNVbmRlZmluZWQsXG4gICAgbWFwLFxuICAgIHNwbGl0LFxuICAgIHRvU3RyaW5nLFxuICAgIHRyaW1cbn0gZnJvbSBcImxvZGFzaC1lc1wiO1xuXG5jb25zdCBXSURHRVRfQ09ORklHID0geyB3aWRnZXRUeXBlOiAnd20tc2VhcmNoJywgaG9zdENsYXNzOiAnaW5wdXQtZ3JvdXAnIH07XG5cbkBDb21wb25lbnQoe1xuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBXbUNvbXBvbmVudHNNb2R1bGUsIEZvcm1zTW9kdWxlLCBTY3JvbGxhYmxlRGlyZWN0aXZlLCBUeXBlYWhlYWRNb2R1bGVdLFxuICAgIHNlbGVjdG9yOiAnW3dtU2VhcmNoXScsXG4gICAgdGVtcGxhdGVVcmw6ICcuL3NlYXJjaC5jb21wb25lbnQuaHRtbCcsXG4gICAgcHJvdmlkZXJzOiBbXG4gICAgICAgIHByb3ZpZGVBcyhTZWFyY2hDb21wb25lbnQsIE5HX1ZBTFVFX0FDQ0VTU09SLCB0cnVlKSxcbiAgICAgICAgcHJvdmlkZUFzKFNlYXJjaENvbXBvbmVudCwgTkdfVkFMSURBVE9SUywgdHJ1ZSksXG4gICAgICAgIHByb3ZpZGVBc1dpZGdldFJlZihTZWFyY2hDb21wb25lbnQpXG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBTZWFyY2hDb21wb25lbnQgZXh0ZW5kcyBEYXRhc2V0QXdhcmVGb3JtQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkIHtcbiAgICBzdGF0aWMgaW5pdGlhbGl6ZVByb3BzID0gcmVnaXN0ZXJQcm9wcygpO1xuICAgIHB1YmxpYyBjYXNlc2Vuc2l0aXZlOiBib29sZWFuO1xuICAgIHB1YmxpYyBzZWFyY2hrZXk6IHN0cmluZztcbiAgICBwdWJsaWMgcXVlcnlNb2RlbDogQXJyYXk8RGF0YVNldEl0ZW0+IHwgc3RyaW5nO1xuICAgIHB1YmxpYyBxdWVyeSA9ICcnO1xuICAgIHB1YmxpYyBsaW1pdDogYW55O1xuICAgIHB1YmxpYyBzaG93c2VhcmNoaWNvbjogYm9vbGVhbjtcbiAgICBwdWJsaWMgbWluY2hhcnM6IG51bWJlcjtcbiAgICBwdWJsaWMgdHlwZTogc3RyaW5nO1xuICAgIHB1YmxpYyBuYXZzZWFyY2hiYXI6IGFueTtcbiAgICBwdWJsaWMgZGVib3VuY2V0aW1lOiBudW1iZXI7XG4gICAgcHVibGljIGhpbnQ6IHN0cmluZztcbiAgICBwdWJsaWMgYXJpYWxhYmVsOiBzdHJpbmc7XG5cbiAgICBwcml2YXRlIGFwcDogQXBwO1xuICAgIHByaXZhdGUgdHlwZWFoZWFkRGF0YVNvdXJjZTogT2JzZXJ2YWJsZTxhbnk+O1xuICAgIHByaXZhdGUgcGFnZXNpemU6IGFueTtcbiAgICBwcml2YXRlIHBhZ2UgPSAxO1xuICAgIHB1YmxpYyBfbG9hZGluZ0l0ZW1zOiBib29sZWFuO1xuICAgIHByaXZhdGUgZGF0YVByb3ZpZGVyOiBJRGF0YVByb3ZpZGVyO1xuICAgIHByaXZhdGUgcmVzdWx0OiBBcnJheTxhbnk+OyAvLyBjb250YWlucyB0aGUgc2VhcmNoIHJlc3VsdCBpLmUuIG1hdGNoZXNcbiAgICBwcml2YXRlIGZvcm1hdHRlZERhdGFzZXQ6IGFueTtcbiAgICBwcml2YXRlIGlzZm9ybWZpZWxkOiBib29sZWFuO1xuICAgIHByaXZhdGUgJHR5cGVhaGVhZEV2ZW50OiBFdmVudDtcblxuICAgIHB1YmxpYyB0YWJpbmRleDogbnVtYmVyO1xuICAgIHB1YmxpYyBzdGFydEluZGV4OiBudW1iZXI7XG4gICAgcHVibGljIGJpbmRkaXNwbGF5bGFiZWw6IHN0cmluZztcbiAgICBwdWJsaWMgdHlwZWFoZWFkQ29udGFpbmVyOiBUeXBlYWhlYWRDb250YWluZXJDb21wb25lbnQ7XG4gICAgcHVibGljIGNvbnRhaW5lclRhcmdldDogc3RyaW5nO1xuICAgIHB1YmxpYyBjbGVhcnNlYXJjaGljb25jbGFzczogc3RyaW5nO1xuICAgIHB1YmxpYyBiYWNrc2VhcmNoaWNvbmNsYXNzOiBzdHJpbmc7XG4gICAgcHVibGljIHNlYXJjaGljb25jbGFzczogc3RyaW5nO1xuXG4gICAgQFZpZXdDaGlsZChUeXBlYWhlYWREaXJlY3RpdmUpIHR5cGVhaGVhZDogVHlwZWFoZWFkRGlyZWN0aXZlO1xuICAgIEBWaWV3Q2hpbGQoJ3VsRWxlbWVudCcpIHVsRWxlbWVudDogRWxlbWVudFJlZjtcbiAgICBAVmlld0NoaWxkcmVuKCdsaUVsZW1lbnRzJykgbGlFbGVtZW50czogUXVlcnlMaXN0PEVsZW1lbnRSZWY+O1xuXG4gICAgcHJpdmF0ZSBhbGxvd29ubHlzZWxlY3Q6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBjbGFzczogc3RyaW5nO1xuXG4gICAgcHJpdmF0ZSBsYXN0U2VsZWN0ZWRJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgZGF0YW9wdGlvbnM6IGFueTtcbiAgICBwdWJsaWMgZHJvcGRvd25FbDogYW55O1xuICAgIHByaXZhdGUgX2xhc3RRdWVyeTogc3RyaW5nO1xuICAgIHByaXZhdGUgX2xhc3RSZXN1bHQ6IGFueTtcbiAgICBwcml2YXRlIF9pc09wZW46IGJvb2xlYW47IC8vIHNldCB0byB0cnVlIHdoZW4gZHJvcGRvd24gaXMgb3BlblxuICAgIHByaXZhdGUgc2hvd0Nsb3NlYnRuOiBib29sZWFuO1xuICAgIHByaXZhdGUgX3Vuc3Vic2NyaWJlRHY6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZGF0YXNvdXJjZTogYW55O1xuICAgIHByaXZhdGUgaXNTY3JvbGxlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHBhcmVudEVsOiBhbnk7XG4gICAgcHJpdmF0ZSBwb3NpdGlvbjogc3RyaW5nO1xuICAgIHByaXZhdGUgZWxJbmRleDogbnVtYmVyO1xuICAgIHByaXZhdGUgbGlzdGVuUXVlcnk6IGJvb2xlYW47XG4gICAgcHJpdmF0ZSBfZG9tVXBkYXRlZDogYm9vbGVhbjtcbiAgICBwcml2YXRlIHNlYXJjaG9uOiBzdHJpbmc7XG4gICAgcHJpdmF0ZSBzaG93Y2xlYXI6IGJvb2xlYW47XG4gICAgcHVibGljIG1hdGNobW9kZTogc3RyaW5nO1xuICAgIHByaXZhdGUgY2xlYXJEYXRhOiBib29sZWFuO1xuXG5cbiAgICAvLyBnZXR0ZXIgc2V0dGVyIGlzIGFkZGVkIHRvIHBhc3MgdGhlIGRhdGFzb3VyY2UgdG8gc2VhcmNoY29tcG9uZW50LlxuICAgIGdldCBkYXRhc291cmNlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGF0YXNvdXJjZTtcbiAgICB9XG5cbiAgICBzZXQgZGF0YXNvdXJjZShudikge1xuICAgICAgICB0aGlzLl9kYXRhc291cmNlID0gbnY7XG4gICAgICAgIGNvbnN0IGRhdGEgPSB0aGlzLmRhdGF2YWx1ZSB8fCB0aGlzLnRvQmVQcm9jZXNzZWREYXRhdmFsdWU7XG4gICAgICAgIHRoaXMudXBkYXRlQnlEYXRhdmFsdWUoZGF0YSk7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIGluajogSW5qZWN0b3IsXG4gICAgICAgIGFwcDogQXBwLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhdmFsdWUuYmluZCcpIHB1YmxpYyBiaW5kZGF0YXZhbHVlLFxuICAgICAgICBAQXR0cmlidXRlKCdkYXRhc2V0LmJpbmQnKSBwdWJsaWMgYmluZGRhdGFzZXQsXG4gICAgICAgIEBJbmplY3QoJ0VYUExJQ0lUX0NPTlRFWFQnKSBAT3B0aW9uYWwoKSBleHBsaWNpdENvbnRleHQ6IGFueVxuICAgICkge1xuICAgICAgICBzdXBlcihpbmosIFdJREdFVF9DT05GSUcsIGV4cGxpY2l0Q29udGV4dCk7XG4gICAgICAgIC8vIHRoaXMgZmxhZyB3aWxsIG5vdCBhbGxvdyB0aGUgZW1wdHkgZGF0YWZpZWxkIHZhbHVlcy5cbiAgICAgICAgdGhpcy5hbGxvd2VtcHR5ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuYXBwID0gYXBwO1xuICAgICAgICBhZGRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQsICdhcHAtc2VhcmNoJywgdHJ1ZSk7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIExpc3RlbnMgZm9yIHRoZSBjaGFuZ2UgaW4gdGhlIG5nTW9kZWwgb24gZXZlcnkgc2VhcmNoIGFuZCByZXRyaWV2ZXMgdGhlIGRhdGEgYXMgb2JzZXJ2YWJsZS5cbiAgICAgICAgICogVGhpcyBvYnNlcnZhYmxlIGRhdGEgaXMgcGFzc2VkIHRvIHRoZSB0eXBlYWhlYWQuXG4gICAgICAgICAqIEB0eXBlIHtPYnNlcnZhYmxlPGFueT59XG4gICAgICAgICAqL1xuICAgICAgICB0aGlzLnR5cGVhaGVhZERhdGFTb3VyY2UgPSBPYnNlcnZhYmxlXG4gICAgICAgICAgICAuY3JlYXRlKChvYnNlcnZlcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gUnVucyBvbiBldmVyeSBzZWFyY2hcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5RdWVyeSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQodGhpcy5xdWVyeSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIG9uIGtleWRvd24sIHdoaWxlIHNjcm9sbGluZyB0aGUgZHJvcGRvd24gaXRlbXMsIHdoZW4gbGFzdCBpdGVtIGlzIHJlYWNoZWQgbmV4dCBjYWxsIGlzIHRyaWdnZXJlZFxuICAgICAgICAgICAgICAgIC8vIHVubGVzcyB0aGUgY2FsbCBpcyByZXNvbHZlZCwgd2UgYXJlIGFibGUgdG8gc2Nyb2xsIG5leHQgdG8gZmlyc3QgaXRlbSBhbmQgc29vblxuICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvd3MgZmxpY2tlcmluZyBmcm9tIGZpcnN0IGl0ZW0gdG8gbmV4dCBuZXcgaXRlbXMgYXBwZW5kZWQuXG4gICAgICAgICAgICAgICAgLy8gQnkgc2V0dGluZyBjb250YWluZXIgdG8gdW5kZWZpbmVkLCBrZXkgZXZlbnRzIGNoYW5nZXMgd2lsbCBiZSBzdG9wcGVkIHdoaWxlIGxvYWRpbmcgaXRlbXNcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5sYXN0U2VsZWN0ZWRJbmRleCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5fY29udGFpbmVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnBpcGUoXG4gICAgICAgICAgICAgICAgZmlsdGVyKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5taW5jaGFycyA9PT0gMCB8fCAodGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5Lmxlbmd0aCA+PSB0aGlzLm1pbmNoYXJzKSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgbWVyZ2VNYXAoKHRva2VuOiBzdHJpbmcpID0+IHRoaXMuZ2V0RGF0YVNvdXJjZUFzT2JzZXJ2YWJsZSh0b2tlbikpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuZGF0YVByb3ZpZGVyID0gbmV3IERhdGFQcm92aWRlcigpO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiBXaGVuIGRlZmF1bHQgZGF0YXZhbHVlIGlzIG5vdCBmb3VuZCB3aXRoaW4gdGhlIGRhdGFzZXQsIGEgZmlsdGVyIGNhbGwgaXMgbWFkZSB0byBnZXQgdGhlIHJlY29yZCB1c2luZyBmZXRjaERlZmF1bHRNb2RlbC5cbiAgICAgICAgICogYWZ0ZXIgZ2V0dGluZyB0aGUgcmVzcG9uc2UsIHNldCB0aGUgcXVlcnlNb2RlbCBhbmQgcXVlcnkuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCBkYXRhdmFsdWVTdWJzY3JpcHRpb24gPSB0aGlzLmRhdGF2YWx1ZSQuc3Vic2NyaWJlKCh2YWw6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcpID0+IHtcblxuICAgICAgICAgICAgY29uc3QgcXVlcnkgPSAoaXNBcnJheSh2YWwpID8gdmFsWzBdIDogdmFsKSBhcyBzdHJpbmc7XG5cbiAgICAgICAgICAgIGlmIChxdWVyeSA9PT0gbnVsbCB8fCBxdWVyeSA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSAnJztcbiAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgcXVlcnkuXG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnlNb2RlbCA9ICcnO1xuICAgICAgICAgICAgICAgIC8vIG9uIGNsZWFyIG9yIHJlc2V0IGZpbHRlciwgZW1wdHkgdGhlIGxhc3RSZXN1bHRzIHRvIGZldGNoIG5ldyByZWNvcmRzLlxuICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RSZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX3Vuc3Vic2NyaWJlRHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gaWYgcHJldiBkYXRhdmFsdWUgaXMgbm90IGVxdWFsIHRvIGN1cnJlbnQgZGF0YXZhbHVlIHRoZW4gY2xlYXIgdGhlIG1vZGVsQnlLZXkgYW5kIHF1ZXJ5TW9kZWxcbiAgICAgICAgICAgICAgICBpZiAoIWlzT2JqZWN0KHZhbCkgJiYgKHRoaXMgYXMgYW55KS5wcmV2RGF0YXZhbHVlICE9PSB2YWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVyeSA9IHRoaXMucXVlcnlNb2RlbCA9ICcnO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBpZiB0aGUgZGF0YWZpZWxkIGlzIEFMTEZJTEVEUyBkbyBub3QgZmV0Y2ggdGhlIHJlY29yZHNcbiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIHF1ZXJ5IG1vZGVsIHdpdGggdGhlIHZhbHVlcyB3ZSBoYXZlXG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVCeURhdGF2YWx1ZSh2YWwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0dXJuIG9uIHNob3dDbG9zZUJ0biB3aGVuIGEgZGVmYXVsdCB2YWx1ZSBpcyBnaXZlblxuICAgICAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWdpc3RlckRlc3Ryb3lMaXN0ZW5lcigoKSA9PiBkYXRhdmFsdWVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG5cbiAgICAgICAgY29uc3QgZGF0YXNldFN1YnNjcmlwdGlvbiA9IHRoaXMuZGF0YXNldCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgICAgIC8vIHNldCB0aGUgbmV4dCBpdGVtIGluZGV4LlxuICAgICAgICAgICAgdGhpcy5zdGFydEluZGV4ID0gdGhpcy5kYXRhc2V0SXRlbXMubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWYWx1ZSA9IHRoaXMuZGF0YXZhbHVlIHx8IHRoaXMudG9CZVByb2Nlc3NlZERhdGF2YWx1ZTtcbiAgICAgICAgICAgIC8vIGludm9raW5nIHVwZGF0ZUJ5RGF0YXNldCBvbmx5IHdoZW4gZGF0YXZhbHVlIGlzIHByZXNlbnQsIGFzIGVudGVyZWQgdmFsdWUgaS5lLiBxdWVyeSBpcyBzZXR0aW5nIGJhY2sgdG8gJydcbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQoZGVmYXVsdFZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQnlEYXRhc2V0KGRlZmF1bHRWYWx1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyRGVzdHJveUxpc3RlbmVyKCgpID0+IGRhdGFzZXRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XG4gICAgfVxuXG4gICAgLy8gb24gY2xlYXIsIHRyaWdnZXIgc2VhcmNoIHdpdGggcGFnZSBzaXplIDFcbiAgICBwcml2YXRlIGNsZWFyU2VhcmNoKCRldmVudCwgbG9hZE9uQ2xlYXIpIHtcbiAgICAgICAgdGhpcy5xdWVyeSA9ICcnO1xuICAgICAgICB0aGlzLm9uSW5wdXRDaGFuZ2UoJGV2ZW50KTtcbiAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gZmFsc2U7XG4gICAgICAgIGlmIChsb2FkT25DbGVhcikge1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZUR2ID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmxvYWRNb3JlRGF0YSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnY2xlYXJzZWFyY2gnKTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgIC8vIHdoZW4gc2VhcmNoIGlucHV0IGlzIGNsZWFyZWQsIGZvY3VzIG9uIHRoZSBpbnB1dCBmaWVsZFxuICAgICAgICBpZiAoJGV2ZW50KSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5hcHAtc2VhcmNoLWlucHV0JykuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGZ1bmN0aW9uIHRvICBjbGVhciB0aGUgaW5wdXQgdmFsdWVcbiAgICBwdWJsaWMgY2xlYXJUZXh0KCkge1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gZmFsc2U7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgdGhlIGZ1bGwgc2NyZWVuIG1vZGUgaW4gbW9iaWxlIHZpZXcgb2YgYXV0byBjb21wbGV0ZVxuICAgIHByaXZhdGUgY2xvc2VTZWFyY2goKSB7XG4gICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnBhZ2UgPSAxO1xuICAgICAgICAvLyBhZnRlciBjbG9zaW5nIHRoZSBzZWFyY2gsIGluc2VydCB0aGUgZWxlbWVudCBhdCBpdHMgcHJldmlvdXMgcG9zaXRpb24gKGVsSW5kZXgpXG4gICAgICAgIHRoaXMuaW5zZXJ0QXRJbmRleCh0aGlzLmVsSW5kZXgpO1xuICAgICAgICB0aGlzLmVsSW5kZXggPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMucGFyZW50RWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoJ2Z1bGwtc2NyZWVuJyk7XG4gICAgICAgIGlmICh0aGlzLl9kb21VcGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLl9kb21VcGRhdGVkID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5saXN0ZW5RdWVyeSA9IGZhbHNlO1xuICAgICAgICB0aGlzLl91bnN1YnNjcmliZUR2ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50eXBlYWhlYWQuaGlkZSgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgcmVuZGVyTW9iaWxlQXV0b0NvbXBsZXRlKCkge1xuICAgICAgICAvLyBHZXQgdGhlIHBhcmVudCBlbGVtZW50IG9mIHRoZSBzZWFyY2ggZWxlbWVudCB3aGljaCBjYW4gYmUgbmV4dCBvciBwcmV2IGVsZW1lbnQsIGlmIGJvdGggYXJlIGVtcHR5IHRoZW4gZ2V0IHRoZSBwYXJlbnQgb2YgZWxlbWVudC5cbiAgICAgICAgaWYgKCFpc0RlZmluZWQodGhpcy5lbEluZGV4KSkge1xuICAgICAgICAgICAgdGhpcy5wYXJlbnRFbCA9IHRoaXMuJGVsZW1lbnQucGFyZW50KCk7XG4gICAgICAgICAgICB0aGlzLmVsSW5kZXggPSB0aGlzLnBhcmVudEVsLmNoaWxkcmVuKCkuaW5kZXgodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICAvLyB0aGlzIGZsYWcgaXMgc2V0IHRvIG5vdGlmeSB0aGF0IHRoZSB0eXBlYWhlYWQtY29udGFpbmVyIGRvbSBoYXMgY2hhbmdlZCBpdHMgcG9zaXRpb25cbiAgICAgICAgICAgIHRoaXMuX2RvbVVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgLy8gQWRkIGZ1bGwgc2NyZWVuIGNsYXNzIG9uIGZvY3VzIG9mIHRoZSBpbnB1dCBlbGVtZW50LlxuICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5hZGRDbGFzcygnZnVsbC1zY3JlZW4nKTtcblxuICAgICAgICAgICAgLy8gQWRkIHBvc2l0aW9uIHRvIHNldCB0aGUgaGVpZ2h0IHRvIGF1dG9cbiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAnaW5saW5lJykge1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsZW1lbnQuYWRkQ2xhc3ModGhpcy5wb3NpdGlvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gZm9jdXMgaXMgbG9zdCB3aGVuIGVsZW1lbnQgaXMgY2hhbmdlZCB0byBmdWxsLXNjcmVlbiwga2V5ZG93biB0byBzZWxlY3QgbmV4dCBpdGVtcyB3aWxsIG5vdCB3b3JrXG4gICAgICAgIC8vIEhlbmNlIGV4cGxpY2l0bHkgZm9jdXNpbmcgdGhlIGlucHV0XG4gICAgICAgIGlmICh0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICB0aGlzLiRlbGVtZW50LmZpbmQoJy5hcHAtc2VhcmNoLWlucHV0JykuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0RGF0YVNvdXJjZUFzT2JzZXJ2YWJsZShxdWVyeTogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICAgICAgLy8gc2hvdyBkcm9wZG93biBvbmx5IHdoZW4gdGhlcmUgaXMgY2hhbmdlIGluIHF1ZXJ5LiBUaGlzIHNob3VsZCBub3QgYXBwbHkgd2hlbiBkYXRhb3B0aW9ucyB3aXRoIGZpbHRlckZpZWxkcyBhcmUgdXBkYXRlZC5cbiAgICAgICAgLy8gd2hlbiBsYXN0UmVzdWx0IGlzIG5vdCBhdmFpbGFibGUgaS5lLiBzdGlsbCB0aGUgZmlyc3QgY2FsbCBpcyBwZW5kaW5nIGFuZCBzZWNvbmQgcXVlcnkgaXMgaW52b2tlZCB0aGVuIGRvIG5vdCByZXR1cm4uXG4gICAgICAgIGlmICh0aGlzLl9sYXN0UXVlcnkgPT09IHF1ZXJ5ICYmICFnZXQodGhpcy5kYXRhb3B0aW9ucywgJ2ZpbHRlckZpZWxkcycpICYmIGlzRGVmaW5lZCh0aGlzLl9sYXN0UmVzdWx0KSkge1xuICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm4gb2YodGhpcy5fbGFzdFJlc3VsdCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKlxuICAgICAgICAgICAgIFdNUy0xOTE3NzogT24gZm9jdXMgb2YgaW5wdXQgZmllbGQgZm9yIGF1dG9jb21wbGV0ZSB0eXBlLCBkbyBub3QgdHJpZ2dlciBhcGkgY2FsbCB3aGVuXG4gICAgICAgICAgICAgICAgIGEpIHNlYXJjaGtleSBhbmQgZGlzcGxheWV4cHJlc3Npb24gYXJlIGRpZmZlcmVudFxuICAgICAgICAgICAgICAgICBiKSBiaW5kZGlzcGxheWxhYmVsIGNvbnRhaW5zIG11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICAgICBjKSBiaW5kZGlzcGxheWxhYmVsIGNvbnRhaW5zIHNpbmdsZSB2YWx1ZSB3aGljaCBkb2VzIG5vdCBtYXRjaCB3aXRoIHNlYXJjaGtleVxuICAgICAgICAqL1xuICAgICAgICBpZiAodGhpcy50eXBlID09PSAnYXV0b2NvbXBsZXRlJyAmJiB0aGlzLnNlYXJjaGtleSAmJiB0aGlzLnF1ZXJ5ICYmIHRoaXMuZGF0YXZhbHVlKSB7XG4gICAgICAgICAgICBsZXQgYmluZERpc3BsYXlMYWJlbEFycmF5ID0gW107XG4gICAgICAgICAgICBjb25zdCBzZWFyY2hLZXlBcnJheSA9IHNwbGl0KHRoaXMuc2VhcmNoa2V5LCAnLCcpO1xuICAgICAgICAgICAgbGV0IGRpc3BsYXlsYWJlbDtcbiAgICAgICAgICAgIGlmICh0aGlzLmJpbmRkaXNwbGF5bGFiZWwpIHtcbiAgICAgICAgICAgICAgICBiaW5kRGlzcGxheUxhYmVsQXJyYXkgPSBzcGxpdCh0aGlzLmJpbmRkaXNwbGF5bGFiZWwsICcrJyk7XG4gICAgICAgICAgICAgICAgaWYgKGJpbmREaXNwbGF5TGFiZWxBcnJheS5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpbmNsdWRlcyhiaW5kRGlzcGxheUxhYmVsQXJyYXlbMF0sICd8JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gL1xcWyguKj8pXFxdLztcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlsYWJlbCA9IHJlZ2V4LmV4ZWMoYmluZERpc3BsYXlMYWJlbEFycmF5WzBdKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlsYWJlbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoKGJpbmREaXNwbGF5TGFiZWxBcnJheS5sZW5ndGggPiAxIHx8IChkaXNwbGF5bGFiZWwgJiYgIWluY2x1ZGVzKHNlYXJjaEtleUFycmF5LCBkaXNwbGF5bGFiZWwpKVxuICAgICAgICAgICAgICAgIHx8ICh0aGlzLmRpc3BsYXlleHByZXNzaW9uICYmICFpbmNsdWRlcyhzZWFyY2hLZXlBcnJheSwgdGhpcy5kaXNwbGF5ZXhwcmVzc2lvbikpKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fbGFzdFF1ZXJ5ID0gdGhpcy5xdWVyeTtcbiAgICAgICAgcmV0dXJuIGZyb20odGhpcy5nZXREYXRhU291cmNlKHF1ZXJ5KSk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGhhbmRsZUV2ZW50KG5vZGU6IEhUTUxFbGVtZW50LCBldmVudE5hbWU6IHN0cmluZywgZXZlbnRDYWxsYmFjazogRnVuY3Rpb24sIGxvY2FsczogYW55KSB7XG4gICAgICAgIGlmICghaW5jbHVkZXMoWydibHVyJywgJ2ZvY3VzJywgJ3NlbGVjdCcsICdzdWJtaXQnLCAnY2hhbmdlJ10sIGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgIHN1cGVyLmhhbmRsZUV2ZW50KG5vZGUsIGV2ZW50TmFtZSwgZXZlbnRDYWxsYmFjaywgbG9jYWxzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGhpZ2hsaWdodCB0aGUgY2hhcmFjdGVycyBpbiB0aGUgZHJvcGRvd24gbWF0Y2hpbmcgdGhlIHF1ZXJ5LlxuICAgIHByaXZhdGUgaGlnaGxpZ2h0KG1hdGNoOiBUeXBlYWhlYWRNYXRjaCwgcXVlcnk6IHN0cmluZykge1xuICAgICAgICBpZiAodGhpcy50eXBlYWhlYWRDb250YWluZXIpIHtcbiAgICAgICAgICAgIC8vIGhpZ2hsaWdodCBvZiBjaGFycyB3aWxsIHdvcmsgb25seSB3aGVuIGxhYmVsIGFyZSBzdHJpbmdzLlxuICAgICAgICAgICAgKG1hdGNoIGFzIGFueSkudmFsdWUgPSBtYXRjaC5pdGVtLmxhYmVsLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy50eXBlYWhlYWRDb250YWluZXIuaGlnaGxpZ2h0KG1hdGNoLCBxdWVyeSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBpbnNlcnRzIHRoZSBlbGVtZW50IGF0IHRoZSBpbmRleCBwb3NpdGlvblxuICAgIHByaXZhdGUgaW5zZXJ0QXRJbmRleChpKSB7XG4gICAgICAgIGlmIChpID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLnBhcmVudEVsLnByZXBlbmQodGhpcy4kZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCAkZWxBdEluZGV4ID0gdGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmVxKGkpO1xuICAgICAgICAgICAgaWYgKCRlbEF0SW5kZXgubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5pbnNlcnRCZWZvcmUodGhpcy5wYXJlbnRFbC5jaGlsZHJlbigpLmVxKGkpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kZWxlbWVudC5pbnNlcnRBZnRlcih0aGlzLnBhcmVudEVsLmNoaWxkcmVuKCkuZXEoaSAtIDEpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGlmIHRoZSB3aWRnZXQgaXMgb2YgdHlwZSBhdXRvY29tcGxldGUgaW4gbW9iaWxlIHZpZXcvIGFwcFxuICAgIHB1YmxpYyBpc01vYmlsZUF1dG9Db21wbGV0ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYgaXNNb2JpbGUoKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgZW50ZXJlZCBpbiB0aGUgaW5wdXQgYW5kIHRoZSB2aWV3IGlzIG5vdCBtb2JpbGVcbiAgICBwdWJsaWMgaXNRdWVyeUVudGVyZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3djbGVhciAmJiB0aGlzLnNob3dDbG9zZWJ0bjtcbiAgICB9XG5cbiAgICBwcml2YXRlIGxvYWRNb3JlRGF0YShpbmNyZW1lbnRQYWdlPzogYm9vbGVhbikge1xuICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vIEluY3JlYXNlIHRoZSBwYWdlIG51bWJlciBhbmQgdHJpZ2dlciBmb3JjZSBxdWVyeSB1cGRhdGVcbiAgICAgICAgdGhpcy5wYWdlID0gaW5jcmVtZW50UGFnZSA/IHRoaXMucGFnZSArIDEgOiB0aGlzLnBhZ2U7XG5cbiAgICAgICAgdGhpcy5pc1Njcm9sbGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gdHJ1ZTtcblxuICAgICAgICAvLyB3aGVuIGludm9raW5nIG5ldyBzZXQgb2YgcmVzdWx0cywgcmVzZXQgdGhlIGxhc3RRdWVyeS5cbiAgICAgICAgaWYgKGluY3JlbWVudFBhZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2xhc3RRdWVyeSA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRyaWdnZXIgdGhlIHR5cGVhaGVhZCBjaGFuZ2UgbWFudWFsbHkgdG8gZmV0Y2ggdGhlIG5leHQgc2V0IG9mIHJlc3VsdHMuXG4gICAgICAgIHRoaXMudHlwZWFoZWFkLm9uSW5wdXQoe1xuICAgICAgICAgICAgdGFyZ2V0OiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHRyaW0odGhpcy5xdWVyeSkgfHwgJzAnIC8vIGR1bW15IGRhdGEgdG8gbm90aWZ5IHRoZSBvYnNlcnZhYmxlc1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBvbiBmb2N1c291dCwgc3Vic2NyaWJlIHRvIHRoZSBkYXRhdmFsdWUgY2hhbmdlcyBhZ2FpblxuICAgIHByaXZhdGUgb25Gb2N1c091dCgpIHtcbiAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVEdiA9IGZhbHNlO1xuICAgICAgICB0aGlzLl9sb2FkaW5nSXRlbXMgPSBmYWxzZTtcbiAgICAgICAgLy8gcmVzZXQgdGhlIHBhZ2UgdmFsdWUgb24gZm9jdXNvdXQuXG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIC8vIGlmIGRvbVVwZGF0ZWQgaXMgdHJ1ZSB0aGVuIGRvIG5vdCBoaWRlIHRoZSBkcm9wZG93biBpbiB0aGUgZnVsbHNjcmVlblxuICAgICAgICBpZiAoIXRoaXMuX2RvbVVwZGF0ZWQgJiYgdGhpcy5faXNPcGVuKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNPcGVuID0gZmFsc2U7XG4gICAgICAgIC8vIG9uIG91dHNpZGUgY2xpY2ssIHR5cGVhaGVhZCBpcyBoaWRkZW4uIFRvIGF2b2lkIHRoaXMsIHdoZW4gZnVsbHNjcmVlbiBpcyBzZXQsIG92ZXJyaWRkaW5nIGlzRm9jdXNlZCBmbGFnIG9uIHRoZSB0eXBlYWhlYWQgY29udGFpbmVyXG4gICAgICAgIGlmICh0aGlzLl9kb21VcGRhdGVkICYmIHRoaXMudHlwZWFoZWFkICYmICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLl9jb250YWluZXIpIHtcbiAgICAgICAgICAgICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLl9jb250YWluZXIuaXNGb2N1c2VkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25JbnB1dENoYW5nZSgkZXZlbnQpIHtcbiAgICAgICAgLy8gcmVzZXQgYWxsIHRoZSBwcmV2aW91cyBwYWdlIGRldGFpbHMgaW4gb3JkZXIgdG8gZmV0Y2ggbmV3IHNldCBvZiByZXN1bHQuXG4gICAgICAgIHRoaXMucmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMucGFnZSA9IDE7XG4gICAgICAgIHRoaXMubGlzdGVuUXVlcnkgPSB0aGlzLmlzVXBkYXRlT25LZXlQcmVzcygpO1xuICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gd2hlbiBpbnB1dCBpcyBjbGVhcmVkLCByZXNldCB0aGUgZGF0YXZhbHVlXG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5ID09PSAnJykge1xuICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gJyc7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSAnJztcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJldkRhdGF2YWx1ZSh0aGlzLl9sYXN0UXVlcnkpO1xuICAgICAgICAgICAgdGhpcy5pbnZva2VPbkNoYW5nZSh0aGlzLl9tb2RlbEJ5VmFsdWUsIHt9LCB0cnVlKTtcblxuICAgICAgICAgICAgdGhpcy5pbnZva2VFdmVudENhbGxiYWNrKCdjbGVhcicsIHsgJGV2ZW50IH0pO1xuXG4gICAgICAgICAgICAvLyB0cmlnZ2VyIG9uU3VibWl0IG9ubHkgd2hlbiB0aGUgc2VhcmNoIGlucHV0IGlzIGNsZWFyZWQgb2ZmIGFuZCBkbyBub3QgdHJpZ2dlciB3aGVuIHRhYiBpcyBwcmVzc2VkLlxuICAgICAgICAgICAgaWYgKCRldmVudCAmJiAkZXZlbnQud2hpY2ggIT09IDkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIHsgJGV2ZW50IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaW52b2tpbmcgY2hhbmdlIGV2ZW50IG9uIGV2ZXJ5IGlucHV0IHZhbHVlIGNoYW5nZS5cbiAgICAgICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnY2hhbmdlJywge1xuICAgICAgICAgICAgICAgICRldmVudDogJGV2ZW50LFxuICAgICAgICAgICAgICAgIG5ld1ZhbDogdGhpcy5fbW9kZWxCeVZhbHVlIHx8IHRoaXMucXVlcnksXG4gICAgICAgICAgICAgICAgb2xkVmFsOiAodGhpcyBhcyBhbnkpLnByZXZEYXRhdmFsdWVcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gKHRoaXMucXVlcnkgIT09ICcnKTtcbiAgICB9XG5cbiAgICAvLyBUcmlnZ2VyZWQgZm9yIGVudGVyIGV2ZW50XG4gICAgcHJpdmF0ZSBoYW5kbGVFbnRlckV2ZW50KCRldmVudCkge1xuICAgICAgICAvLyBzdWJtaXQgZXZlbnQgdHJpZ2dlcmVkIHdoZW4gdGhlcmUgaXMgbm8gc2VhcmNoIHJlc3VsdHNcbiAgICAgICAgaWYgKCFnZXQodGhpcy50eXBlYWhlYWQsICdtYXRjaGVzLmxlbmd0aCcpKSB7XG4gICAgICAgICAgICB0aGlzLm9uU2VhcmNoU2VsZWN0KCRldmVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gVHJpZ2dlcnJlZCB3aGVuIHR5cGVhaGVhZCBvcHRpb24gaXMgc2VsZWN0ZWQuXG4gICAgcHJpdmF0ZSBvblNlYXJjaFNlbGVjdCgkZXZlbnQ6IEV2ZW50KSB7XG4gICAgICAgIGxldCBpdGVtO1xuICAgICAgICAvLyBXTVMtMjI1MzM6IEJlZm9yZSBhZGRpbmcgYWN0aXZlIHR5cGVhaGVhZCBlbCwgY2hlY2sgaWYgdGhlIGVudGVyZWQgcXVlcnkgbWF0Y2hlcyB3aXRoIHRoZSBhY3RpdmUgZWwgb3Igbm90XG4gICAgICAgIGNvbnN0IGlzUXVlcnlNYXRjaCA9IHRoaXMudHlwZWFoZWFkQ29udGFpbmVyPy5hY3RpdmU/LnZhbHVlID09PSB0aGlzLnF1ZXJ5O1xuXG4gICAgICAgIGlmICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciAmJiB0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5hY3RpdmUgJiYgaXNRdWVyeU1hdGNoKSB7XG4gICAgICAgICAgICBpdGVtID0gdGhpcy50eXBlYWhlYWRDb250YWluZXIuYWN0aXZlLml0ZW07XG4gICAgICAgIH1cbiAgICAgICAgJGV2ZW50ID0gdGhpcy5ldmVudERhdGEoJGV2ZW50LCBpdGVtIHx8IHt9KTtcblxuICAgICAgICAvLyBzZWFyY2hPbiBpcyBzZXQgYXMgb25CdG5DbGljaywgdGhlbiBpbnZva2UgdGhlIHNlYXJjaCBhcGkgY2FsbCBtYW51YWxseS5cbiAgICAgICAgaWYgKCF0aGlzLmlzVXBkYXRlT25LZXlQcmVzcygpKSB7XG4gICAgICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdHJ1ZTtcbiAgICAgICAgICAgIC8vIHRyaWdnZXIgdGhlIHR5cGVhaGVhZCBjaGFuZ2UgbWFudWFsbHkgdG8gZmV0Y2ggdGhlIG5leHQgc2V0IG9mIHJlc3VsdHMuXG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5vbklucHV0KHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMucXVlcnkgLy8gZHVtbXkgZGF0YSB0byBub3RpZnkgdGhlIG9ic2VydmFibGVzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gd2hlbiBtYXRjaGVzIGFyZSBhdmFpbGFibGUuXG4gICAgICAgIGlmICh0aGlzLnR5cGVhaGVhZENvbnRhaW5lciAmJiB0aGlzLmxpRWxlbWVudHMubGVuZ3RoICYmIGlzUXVlcnlNYXRjaCkge1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWRDb250YWluZXIuc2VsZWN0QWN0aXZlTWF0Y2goKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHRoaXMucXVlcnk7XG4gICAgICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIHsgJGV2ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBpbnZva2VPbkJlZm9yZVNlcnZpY2VDYWxsKGlucHV0RGF0YSkge1xuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ2JlZm9yZXNlcnZpY2VjYWxsJywgeyBpbnB1dERhdGEgfSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBvbkRyb3Bkb3duT3BlbigpIHtcbiAgICAgICAgaWYgKHRoaXMuY2xlYXJEYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gc2V0dGluZyB0aGUgdWxFbGVtZW50cywgbGlFbGVtZW50IG9uIHR5cGVhaGVhZENvbnRhaW5lci5cbiAgICAgICAgLy8gYXMgd2UgYXJlIHVzaW5nIGN1c3RvbU9wdGlvbiB0ZW1wbGF0ZSwgbGlFbGVtZW50cyBhcmUgbm90IGF2YWlsYWJsZSBvbiB0eXBlYWhlYWRDb250YWluZXIgc28gYXBwZW5kIHRoZW0gZXhwbGljaXRseS5cbiAgICAgICAgY29uc3QgZm4gPSBkZWJvdW5jZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy50eXBlYWhlYWRDb250YWluZXIgPSB0aGlzLnR5cGVhaGVhZC5fY29udGFpbmVyIHx8ICh0aGlzLnR5cGVhaGVhZCBhcyBhbnkpLl90eXBlYWhlYWQuaW5zdGFuY2U7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWRDb250YWluZXIgYXMgYW55KS5saUVsZW1lbnRzID0gdGhpcy5saUVsZW1lbnRzO1xuICAgICAgICAgICAgKHRoaXMudHlwZWFoZWFkQ29udGFpbmVyIGFzIGFueSkudWxFbGVtZW50ID0gdGhpcy51bEVsZW1lbnQ7XG4gICAgICAgICAgICBhZGp1c3RDb250YWluZXJQb3NpdGlvbigkKCd0eXBlYWhlYWQtY29udGFpbmVyJyksIHRoaXMubmF0aXZlRWxlbWVudCwgKHRoaXMudHlwZWFoZWFkIGFzIGFueSkuX3R5cGVhaGVhZCwgJCgndHlwZWFoZWFkLWNvbnRhaW5lciAuZHJvcGRvd24tbWVudScpKTtcblxuICAgICAgICB9KTtcblxuICAgICAgICBmbigpO1xuXG4gICAgICAgIC8vIG9wZW4gZnVsbC1zY3JlZW4gc2VhcmNoIHZpZXdcbiAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGVBdXRvQ29tcGxldGUoKSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLiRlbGVtZW50Lmhhc0NsYXNzKCdmdWxsLXNjcmVlbicpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJNb2JpbGVBdXRvQ29tcGxldGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGRyb3Bkb3duRWwgPSB0aGlzLmRyb3Bkb3duRWwuY2xvc2VzdCgndHlwZWFoZWFkLWNvbnRhaW5lcicpO1xuXG4gICAgICAgICAgICBkcm9wZG93bkVsLmluc2VydEFmdGVyKHRoaXMuJGVsZW1lbnQuZmluZCgnaW5wdXQnKS5maXJzdCgpKTtcbiAgICAgICAgICAgIGNvbnN0IHNjcmVlbkhlaWdodCA9IHRoaXMuJGVsZW1lbnQuY2xvc2VzdCgnLmFwcC1jb250ZW50JykuaGVpZ2h0KCk7XG4gICAgICAgICAgICBkcm9wZG93bkVsLmNzcyh7IHBvc2l0aW9uOiAncmVsYXRpdmUnLCB0b3A6IDAsIGhlaWdodDogc2NyZWVuSGVpZ2h0ICsgJ3B4JyB9KTtcbiAgICAgICAgICAgIHRoaXMuc2hvd0Nsb3NlYnRuID0gdGhpcy5xdWVyeSAmJiB0aGlzLnF1ZXJ5ICE9PSAnJztcblxuICAgICAgICAgICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclNlYXJjaCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZWxlY3ROZXh0KCkge1xuICAgICAgICBjb25zdCBtYXRjaGVzID0gdGhpcy50eXBlYWhlYWRDb250YWluZXIubWF0Y2hlcztcblxuICAgICAgICBpZiAoIW1hdGNoZXMpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBpbmRleCA9IG1hdGNoZXMuaW5kZXhPZih0aGlzLnR5cGVhaGVhZENvbnRhaW5lci5hY3RpdmUpO1xuXG4gICAgICAgIC8vIG9uIGtleWRvd24sIGlmIHNjcm9sbCBpcyBhdCB0aGUgYm90dG9tIGFuZCBuZXh0IHBhZ2UgcmVjb3JkcyBhcmUgYXZhaWxhYmxlLCBmZXRjaCBuZXh0IHBhZ2UgaXRlbXMuXG4gICAgICAgIGlmICghdGhpcy5fbG9hZGluZ0l0ZW1zICYmICF0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlICYmIGluZGV4ICsgMSA+IG1hdGNoZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgLy8gaW5kZXggaXMgc2F2ZWQgaW4gb3JkZXIgdG8gc2VsZWN0IHRoZSBsYXN0U2VsZWN0ZWQgaXRlbSBpbiB0aGUgZHJvcGRvd24gYWZ0ZXIgZmV0Y2hpbmcgbmV4dCBwYWdlIGl0ZW1zLlxuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJbmRleCA9IGluZGV4O1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIHNldExhc3RBY3RpdmVNYXRjaEFzU2VsZWN0ZWQoKSB7XG4gICAgICAgIGlmICh0aGlzLmxhc3RTZWxlY3RlZEluZGV4KSB7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWRDb250YWluZXIgYXMgYW55KS5fYWN0aXZlID0gdGhpcy50eXBlYWhlYWRDb250YWluZXIubWF0Y2hlc1t0aGlzLmxhc3RTZWxlY3RlZEluZGV4XTtcbiAgICAgICAgICAgIHRoaXMudHlwZWFoZWFkQ29udGFpbmVyLm5leHRBY3RpdmVNYXRjaCgpO1xuICAgICAgICAgICAgdGhpcy5sYXN0U2VsZWN0ZWRJbmRleCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgdHJpZ2dlclNlYXJjaCgpIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UgfHwgIXRoaXMuJGVsZW1lbnQuaGFzQ2xhc3MoJ2Z1bGwtc2NyZWVuJykpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0eXBlQWhlYWREcm9wRG93biA9IHRoaXMuZHJvcGRvd25FbDtcbiAgICAgICAgY29uc3QgJGxhc3RJdGVtID0gdHlwZUFoZWFkRHJvcERvd24uZmluZCgnbGknKS5sYXN0KCk7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgbGFzdCBpdGVtIGlzIG5vdCBiZWxvdyB0aGUgZnVsbCBzY3JlZW5cbiAgICAgICAgaWYgKCRsYXN0SXRlbS5sZW5ndGggJiYgdHlwZUFoZWFkRHJvcERvd24ubGVuZ3RoICYmICh0eXBlQWhlYWREcm9wRG93bi5oZWlnaHQoKSArIHR5cGVBaGVhZERyb3BEb3duLnBvc2l0aW9uKCkudG9wID4gJGxhc3RJdGVtLmhlaWdodCgpICsgJGxhc3RJdGVtLnBvc2l0aW9uKCkudG9wKSkge1xuICAgICAgICAgICAgdGhpcy5sb2FkTW9yZURhdGEodHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGlzVXBkYXRlT25LZXlQcmVzcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2VhcmNob24gPT09ICd0eXBpbmcnO1xuICAgIH1cblxuICAgIHByaXZhdGUgZGVib3VuY2VEZWZhdWx0UXVlcnkoZGF0YSkge1xuICAgICAgICB0aGlzLl9kZWZhdWx0UXVlcnlJbnZva2VkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5nZXREYXRhU291cmNlKGRhdGEsIHRydWUpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2UubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gcmVzcG9uc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFF1ZXJ5ID0gdGhpcy5xdWVyeSA9IHRoaXMucXVlcnlNb2RlbFswXS5sYWJlbCB8fCAnJztcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSB0aGlzLnF1ZXJ5TW9kZWxbMF0udmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbW9kZWxCeUtleSA9IHRoaXMucXVlcnlNb2RlbFswXS5rZXk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5xdWVyeU1vZGVsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnkgPSAnJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmNsZWFyRGF0YSkge1xuICAgICAgICAgICAgICAgIGlmIChnZXQoKHRoaXMudHlwZWFoZWFkIGFzIGFueSksICdfdHlwZWFoZWFkLmlzU2hvd24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZUJ5RGF0YXZhbHVlKGRhdGEpIHtcbiAgICAgICAgdGhpcy51cGRhdGVCeURhdGFzZXQoZGF0YSk7XG4gICAgICAgIHRoaXMudXBkYXRlQnlEYXRhU291cmNlKGRhdGEpO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlQnlEYXRhU291cmNlKGRhdGEpIHtcbiAgICAgICAgLy8gdmFsdWUgaXMgcHJlc2VudCBidXQgdGhlIGNvcnJlc3BvbmRpbmcga2V5IGlzIG5vdCBmb3VuZCB0aGVuIGZldGNoIG5leHQgc2V0XG4gICAgICAgIC8vIG1vZGVsQnlLZXkgd2lsbCBiZSBzZXQgb25seSB3aGVuIGRhdGF2YWx1ZSBpcyBhdmFpbGFibGUgaW5zaWRlIHRoZSBsb2NhbERhdGEgb3RoZXJ3aXNlIG1ha2UgYSBOL3cgY2FsbC5cbiAgICAgICAgaWYgKGlzRGVmaW5lZChkYXRhKSAmJiAhaXNPYmplY3QoZGF0YSkgJiYgdGhpcy5kYXRhc291cmNlICYmICFpc0RlZmluZWQodGhpcy5fbW9kZWxCeUtleSkgJiYgdGhpcy5kYXRhZmllbGQgIT09IEFMTEZJRUxEUykge1xuICAgICAgICAgICAgLy8gQXZvaWQgbWFraW5nIGRlZmF1bHQgcXVlcnkgaWYgcXVlcnlNb2RlbCBhbHJlYWR5IGV4aXN0cy5cbiAgICAgICAgICAgIGlmIChpc0RlZmluZWQodGhpcy5xdWVyeU1vZGVsKSAmJiAhaXNFbXB0eSh0aGlzLnF1ZXJ5TW9kZWwpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVEYXRhdmFsdWVGcm9tUXVlcnlNb2RlbCgpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFrZSBkZWZhdWx0IHF1ZXJ5IGNhbGwgb25seSB3aGVuIGRhdGFzb3VyY2Ugc3VwcG9ydHMgQ1JVRCAobGl2ZSB2YXJpYWJsZSkuXG4gICAgICAgICAgICBpZiAoIXRoaXMuX2RlZmF1bHRRdWVyeUludm9rZWQgJiYgdGhpcy5kYXRhc291cmNlLmV4ZWN1dGUoRGF0YVNvdXJjZS5PcGVyYXRpb24uU1VQUE9SVFNfQ1JVRCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlRGVmYXVsdFF1ZXJ5KGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gdXBkYXRlcyB0aGUgbW9kZWwgdmFsdWUgdXNpbmcgcXVlcnlNb2RlbFxuICAgIHByaXZhdGUgdXBkYXRlRGF0YXZhbHVlRnJvbVF1ZXJ5TW9kZWwoKSB7XG4gICAgICAgIGlmIChpc0RlZmluZWQodGhpcy5xdWVyeU1vZGVsKSkge1xuICAgICAgICAgICAgdGhpcy5fbW9kZWxCeVZhbHVlID0gaXNBcnJheSh0aGlzLnF1ZXJ5TW9kZWwpID8gKHRoaXMucXVlcnlNb2RlbFswXSBhcyBEYXRhU2V0SXRlbSkudmFsdWUgOiB0aGlzLnF1ZXJ5TW9kZWw7XG4gICAgICAgICAgICB0aGlzLl9tb2RlbEJ5S2V5ID0gaXNBcnJheSh0aGlzLnF1ZXJ5TW9kZWwpID8gKHRoaXMucXVlcnlNb2RlbFswXSBhcyBEYXRhU2V0SXRlbSkua2V5IDogdGhpcy5xdWVyeU1vZGVsO1xuICAgICAgICAgICAgdGhpcy50b0JlUHJvY2Vzc2VkRGF0YXZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJpdmF0ZSB1cGRhdGVCeURhdGFzZXQoZGF0YTogYW55KSB7XG4gICAgICAgIC8vIGRlZmF1bHQgcXVlcnkgaXMgYWxyZWFkeSBpbnZva2VkIHRoZW4gZG8gbm90IG1ha2Ugb3RoZXIgZGVmYXVsdCBxdWVyeSBjYWxsLlxuICAgICAgICAvLyBGb3IgbG9jYWwgc2VhcmNoIGkuZS4gc2VhcmNoa2V5IGlzIHVuZGVmaW5lZCwgZG8gbm90IHJldHVybiwgdmVyaWZ5IHRoZSBkYXRhdmFsdWUgYWdhaW5zdCB0aGUgZGF0YXNldEl0ZW1zIC5cbiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRRdWVyeUludm9rZWQgJiYgdGhpcy5zZWFyY2hrZXkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzZWxlY3RlZEl0ZW0gPSBmaW5kKHRoaXMuZGF0YXNldEl0ZW1zLCAoaXRlbSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIChpc09iamVjdChpdGVtLnZhbHVlKSA/IGlzRXF1YWwoaXRlbS52YWx1ZSwgZGF0YSkgOiAodG9TdHJpbmcoaXRlbS52YWx1ZSkpLnRvTG93ZXJDYXNlKCkgPT09ICh0b1N0cmluZyhkYXRhKSkudG9Mb3dlckNhc2UoKSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNldCB0aGUgZGVmYXVsdCBvbmx5IHdoZW4gaXQgaXMgYXZhaWxhYmxlIGluIGRhdGFzZXQuXG4gICAgICAgIGlmIChzZWxlY3RlZEl0ZW0pIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IFtzZWxlY3RlZEl0ZW1dO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YWZpZWxkID09PSBBTExGSUVMRFMgJiYgaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHRoaXMuZ2V0VHJhbnNmb3JtZWREYXRhKGV4dHJhY3REYXRhQXNBcnJheShkYXRhKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyByZXNldHRpbmcgdGhlIHF1ZXJ5TW9kZWwgb25seSB3aGVuIHByZXZEYXRhdmFsdWUgaXMgZXF1YWwgdG8gZGF0YVxuICAgICAgICAgICAgaWYgKCh0aGlzIGFzIGFueSkucHJldkRhdGF2YWx1ZSAhPT0gZGF0YSkge1xuICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudXBkYXRlRGF0YXZhbHVlRnJvbVF1ZXJ5TW9kZWwoKTtcblxuICAgICAgICAvLyBTaG93IHRoZSBsYWJlbCB2YWx1ZSBvbiBpbnB1dC5cbiAgICAgICAgdGhpcy5fbGFzdFF1ZXJ5ID0gdGhpcy5xdWVyeSA9IGlzRGVmaW5lZCh0aGlzLnF1ZXJ5TW9kZWwpICYmIHRoaXMucXVlcnlNb2RlbC5sZW5ndGggPyBnZXQodGhpcy5xdWVyeU1vZGVsWzBdLCAnbGFiZWwnKSA6ICcnO1xuICAgICAgICB0aGlzLnNob3dDbG9zZWJ0biA9ICh0aGlzLnF1ZXJ5ICE9PSAnJyk7XG4gICAgfVxuXG4gICAgLy8gSWYgd2UgaGF2ZSBsYXN0IHNlYXJjaCByZXN1bHRzIHRoZW4gb3BlbiBkcm9wZG93biBvbiBmb2N1c1xuICAgIHByaXZhdGUgaGFuZGxlRm9jdXMoJGV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdzZWFyY2gnICYmIHRoaXMucXVlcnkgPT09IHRoaXMuX2xhc3RRdWVyeSAmJiB0aGlzLl9sYXN0UmVzdWx0KSB7XG4gICAgICAgICAgICAodGhpcy50eXBlYWhlYWQgYXMgYW55KS5rZXlVcEV2ZW50RW1pdHRlci5lbWl0KHRoaXMucXVlcnkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5vdGlmeVN1YnNjcmliZXIoKSB7XG4gICAgICAgIGNvbnN0IHBhcmVudEVsID0gJCh0aGlzLm5hdGl2ZUVsZW1lbnQpLmNsb3Nlc3QoJy5hcHAtY29tcG9zaXRlLXdpZGdldC5jYXB0aW9uLWZsb2F0aW5nJyk7XG4gICAgICAgIGlmIChwYXJlbnRFbC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLmFwcC5ub3RpZnkoJ2NhcHRpb25Qb3NpdGlvbkFuaW1hdGUnLCB7ZGlzcGxheVZhbDogdHJ1ZSwgbmF0aXZlRWw6IHBhcmVudEVsfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUaGlzIG1ldGhvZCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHByb3ZpZGVzIHRoZSBmaWx0ZXJlZCBkYXRhIGZyb20gdGhlIGRhdGFzb3VyY2UuXG4gICAgcHVibGljIGdldERhdGFTb3VyY2UocXVlcnk6IEFycmF5PHN0cmluZz4gfCBzdHJpbmcsIHNlYXJjaE9uRGF0YUZpZWxkPzogYm9vbGVhbiwgbmV4dEl0ZW1JbmRleD86IG51bWJlcik6IFByb21pc2U8RGF0YVNldEl0ZW1bXT4ge1xuICAgICAgICAvLyBGb3IgZGVmYXVsdCBxdWVyeSwgc2VhcmNoT25EYXRhRmllbGQgaXMgc2V0IHRvIHRydWUsIHRoZW4gZG8gbm90IG1ha2UgYSBuL3cgY2FsbCB3aGVuIGRhdGFmaWVsZCBpcyBBTExGSUVMRFNcbiAgICAgICAgaWYgKHNlYXJjaE9uRGF0YUZpZWxkICYmIHRoaXMuZGF0YWZpZWxkID09PSBBTExGSUVMRFMpIHtcbiAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShbXSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBGb3IgZGVmYXVsdCBkYXRhdmFsdWUsIHNlYXJjaCBrZXkgYXMgdG8gYmUgb24gZGF0YWZpZWxkIHRvIGdldCB0aGUgZGVmYXVsdCBkYXRhIGZyb20gdGhlIGZpbHRlciBjYWxsLlxuICAgICAgICBjb25zdCBkYXRhQ29uZmlnOiBJRGF0YVByb3ZpZGVyQ29uZmlnID0ge1xuICAgICAgICAgICAgZGF0YXNldDogdGhpcy5kYXRhc2V0ID8gY29udmVydERhdGFUb09iamVjdCh0aGlzLmRhdGFzZXQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgYmluZGRhdGFzZXQ6IHRoaXMuYmluZGRhdGFzZXQsXG4gICAgICAgICAgICBkYXRhc291cmNlOiB0aGlzLmRhdGFzb3VyY2UsXG4gICAgICAgICAgICBkYXRhZmllbGQ6IHRoaXMuZGF0YWZpZWxkLFxuICAgICAgICAgICAgaGFzRGF0YTogdGhpcy5kYXRhc2V0ICYmIHRoaXMuZGF0YXNldC5sZW5ndGgsXG4gICAgICAgICAgICBxdWVyeTogcXVlcnksXG4gICAgICAgICAgICBpc0xvY2FsRmlsdGVyOiAhdGhpcy5zZWFyY2hrZXksXG4gICAgICAgICAgICBzZWFyY2hLZXk6IHNlYXJjaE9uRGF0YUZpZWxkID8gdGhpcy5kYXRhZmllbGQgOiB0aGlzLnNlYXJjaGtleSxcbiAgICAgICAgICAgIC8vIGRlZmF1bHQgc2VhcmNoIGNhbGwgbWF0Y2ggbW9kZSBzaG91bGQgYmUgc3RhcnRpZ25vcmVjYXNlXG4gICAgICAgICAgICBtYXRjaE1vZGU6IHNlYXJjaE9uRGF0YUZpZWxkID8gJ3N0YXJ0aWdub3JlY2FzZScgOiB0aGlzLm1hdGNobW9kZSxcbiAgICAgICAgICAgIGNhc2VzZW5zaXRpdmU6IHRoaXMuY2FzZXNlbnNpdGl2ZSxcbiAgICAgICAgICAgIGlzZm9ybWZpZWxkOiB0aGlzLmlzZm9ybWZpZWxkLFxuICAgICAgICAgICAgb3JkZXJieTogdGhpcy5vcmRlcmJ5LFxuICAgICAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgICAgICBwYWdlc2l6ZTogdGhpcy5wYWdlc2l6ZSxcbiAgICAgICAgICAgIHBhZ2U6IHRoaXMucGFnZSxcbiAgICAgICAgICAgIG9uQmVmb3Jlc2VydmljZWNhbGw6IHRoaXMuaW52b2tlT25CZWZvcmVTZXJ2aWNlQ2FsbC5iaW5kKHRoaXMpXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHRoaXMuZGF0YW9wdGlvbnMpIHtcbiAgICAgICAgICAgIGRhdGFDb25maWcuZGF0YW9wdGlvbnMgPSB0aGlzLmRhdGFvcHRpb25zO1xuICAgICAgICAgICAgZGF0YUNvbmZpZy52aWV3UGFyZW50ID0gdGhpcy52aWV3UGFyZW50O1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gdGhpcy5kYXRhUHJvdmlkZXIuZmlsdGVyKGRhdGFDb25maWcpXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIHJlc3BvbnNlIGZyb20gZGF0YVByb3ZpZGVyIHJldHVybnMgYWx3YXlzIGRhdGEgb2JqZWN0LlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlID0gcmVzcG9uc2UuZGF0YSB8fCByZXNwb25zZTtcbiAgICAgICAgICAgICAgICAvLyBmb3Igc2VydmljZSB2YXJpYWJsZSwgdXBkYXRpbmcgdGhlIGRhdGFzZXQgb25seSBpZiBpdCBpcyBub3QgZGVmaW5lZCBvciBlbXB0eVxuICAgICAgICAgICAgICAgIGlmICgoIWlzRGVmaW5lZCh0aGlzLmRhdGFzZXQpIHx8ICF0aGlzLmRhdGFzZXQubGVuZ3RoKSAmJiB0aGlzLmRhdGFQcm92aWRlci51cGRhdGVEYXRhc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldCA9IHJlc3BvbnNlO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGFQcm92aWRlci5oYXNNb3JlRGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGFzZXQgPSB0aGlzLmZvcm1hdHRlZERhdGFzZXQuY29uY2F0KHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdHRlZERhdGFzZXQgPSByZXNwb25zZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5IHNldHRpbmcgdGhlIG9wdGlvbnNsaW1pdCBhcyB0aGUgbWF0Y2hlcyBtb3JlIHRoYW4gMjAgd2lsbCBiZSBpZ25vcmVkIGlmIG9wdGlvbnNsaW1pdCBpcyBub3Qgc3BlY2lmaWVkLlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmZvcm1hdHRlZERhdGFzZXQubGVuZ3RoID4gMjAgJiYgIWlzRGVmaW5lZCh0aGlzLmxpbWl0KSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC50eXBlYWhlYWRPcHRpb25zTGltaXQgPSB0aGlzLmZvcm1hdHRlZERhdGFzZXQubGVuZ3RoO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEluIG1vYmlsZSwgdHJpZ2dlciB0aGUgc2VhcmNoIGJ5IGRlZmF1bHQgdW50aWwgdGhlIHJlc3VsdHMgaGF2ZSBoZWlnaHQgdXB0byBwYWdlIGhlaWdodC4gT3RoZXIgcmVzdWx0cyBjYW4gYmUgZmV0Y2hlZCBieSBzY3JvbGxpbmdcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzT3BlbiAmJiB0aGlzLmlzTW9iaWxlQXV0b0NvbXBsZXRlKCkgJiYgIWlzVW5kZWZpbmVkKHRoaXMuZGF0YVByb3ZpZGVyLmlzTGFzdFBhZ2UpICYmICF0aGlzLmRhdGFQcm92aWRlci5pc0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclNlYXJjaCgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRGF0YSA9IHRoaXMuZ2V0VHJhbnNmb3JtZWREYXRhKHRoaXMuZm9ybWF0dGVkRGF0YXNldCwgbmV4dEl0ZW1JbmRleCk7XG5cbiAgICAgICAgICAgICAgICAvLyByZXN1bHQgY29udGFpbnMgdGhlIGRhdGFmaWVsZCB2YWx1ZXMuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVzdWx0ID0gbWFwKHRyYW5zZm9ybWVkRGF0YSwgJ3ZhbHVlJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkRGF0YTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xvYWRpbmdJdGVtcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICkudGhlbihyZXN1bHQgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzU2Nyb2xsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgKGRlYm91bmNlKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TGFzdEFjdGl2ZU1hdGNoQXNTZWxlY3RlZCgpO1xuICAgICAgICAgICAgICAgICAgICB9LCAzMCkpKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTY3JvbGxlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBXaGVuIG5vIHJlc3VsdCBpcyBmb3VuZCwgc2V0IHRoZSBkYXRhdmFsdWUgdG8gdW5kZWZpbmVkLlxuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2RlbEJ5VmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IChxdWVyeSBhcyBzdHJpbmcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBvbiBmb2N1c291dCBpLmUuIG9uIG90aGVyIHdpZGdldCBmb2N1cywgaWYgbi93IGlzIHBlbmRpbmcgbG9hZGluZyBpY29uIGlzIHNob3duLCB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlIHRoZW4gZHJvcGRvd24gaXMgc2hvd24gYWdhaW4uXG4gICAgICAgICAgICAgICAgLy8gb24gdW5zdWJzY3JpYmluZyBkbyBub3Qgc2hvdyB0aGUgcmVzdWx0cy5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdW5zdWJzY3JpYmVEdikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBbXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fbG9hZGluZ0l0ZW1zID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5fbGFzdFJlc3VsdCA9IHJlc3VsdDtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgcGFyZW50IGNvbnRleHQgaS5lLiBQYWdlIGNvbnRleHQgYW5kIG5vdCBwYXJlbnQgY29tcG9uZW50J3MgY29udGV4dC5cbiAgICBwcml2YXRlIGdldENvbnRleHQoY29udGV4dCkge1xuICAgICAgICBpZiAoY29udGV4dCAmJiBnZXQoY29udGV4dCwgJ3dpZGdldCcpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRDb250ZXh0KGNvbnRleHQudmlld1BhcmVudCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbnRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFRyYW5zZm9ybWVkRGF0YShkYXRhOiBhbnksIGl0ZW1JbmRleD86IG51bWJlciwgaXNjdXN0b20/OiBib29sZWFuKTogRGF0YVNldEl0ZW1bXSB7XG4gICAgICAgIGlmIChpc0RlZmluZWQoaXRlbUluZGV4KSkge1xuICAgICAgICAgICAgaXRlbUluZGV4Kys7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0cmFuc2Zvcm1lZERhdGEgPSB0cmFuc2Zvcm1Gb3JtRGF0YShcbiAgICAgICAgICAgIHRoaXMuZ2V0Q29udGV4dCh0aGlzLnZpZXdQYXJlbnQpLFxuICAgICAgICAgICAgZGF0YSxcbiAgICAgICAgICAgIHRoaXMuZGF0YWZpZWxkLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGRpc3BsYXlGaWVsZDogdGhpcy5kaXNwbGF5bGFiZWwgfHwgdGhpcy5kaXNwbGF5ZmllbGQsXG4gICAgICAgICAgICAgICAgZGlzcGxheUV4cHI6IGlzY3VzdG9tID8gJycgOiB0aGlzLmRpc3BsYXlleHByZXNzaW9uLFxuICAgICAgICAgICAgICAgIGJpbmREaXNwbGF5RXhwcjogaXNjdXN0b20gPyAnJyA6IHRoaXMuYmluZGRpc3BsYXlsYWJlbCxcbiAgICAgICAgICAgICAgICBiaW5kRGlzcGxheUltZ1NyYzogdGhpcy5iaW5kZGlzcGxheWltYWdlc3JjLFxuICAgICAgICAgICAgICAgIGRpc3BsYXlJbWdTcmM6IHRoaXMuZGlzcGxheWltYWdlc3JjXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaXRlbUluZGV4LFxuICAgICAgICAgICAgdGhpc1xuICAgICAgICApO1xuICAgICAgICByZXR1cm4gZ2V0VW5pcU9ianNCeURhdGFGaWVsZCh0cmFuc2Zvcm1lZERhdGEsIHRoaXMuZGF0YWZpZWxkLCB0aGlzLmRpc3BsYXlmaWVsZCB8fCB0aGlzLmRpc3BsYXlsYWJlbCwgdG9Cb29sZWFuKHRoaXMuYWxsb3dlbXB0eSkpO1xuICAgIH1cblxuICAgIC8vIE9wdGlvbnNMaXN0VGVtcGxhdGUgbGlzdGVucyB0byB0aGUgc2Nyb2xsIGV2ZW50IGFuZCB0cmlnZ2VycyB0aGlzIGZ1bmN0aW9uLlxuICAgIHB1YmxpYyBvblNjcm9sbCgkc2Nyb2xsRWw6IEVsZW1lbnQsIGV2dDogRXZlbnQpIHtcbiAgICAgICAgY29uc3QgdG90YWxIZWlnaHQgPSAkc2Nyb2xsRWwuc2Nyb2xsSGVpZ2h0LFxuICAgICAgICAgICAgY2xpZW50SGVpZ2h0ID0gJHNjcm9sbEVsLmNsaWVudEhlaWdodDtcblxuICAgICAgICAvLyBJZiBzY3JvbGwgaXMgYXQgdGhlIGJvdHRvbSBhbmQgbm8gcmVxdWVzdCBpcyBpbiBwcm9ncmVzcyBhbmQgbmV4dCBwYWdlIHJlY29yZHMgYXJlIGF2YWlsYWJsZSwgZmV0Y2ggbmV4dCBwYWdlIGl0ZW1zLlxuICAgICAgICBpZiAoIXRoaXMuX2xvYWRpbmdJdGVtcyAmJiAhdGhpcy5kYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSAmJiAoJHNjcm9sbEVsLnNjcm9sbFRvcCArIGNsaWVudEhlaWdodCA+PSB0b3RhbEhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZE1vcmVEYXRhKHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25Jbml0KCkge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuXG4gICAgICAgIGlmICghaXNEZWZpbmVkKHRoaXMubWluY2hhcnMpKSB7XG4gICAgICAgICAgICAvLyBmb3IgYXV0b2NvbXBsZXRlIHNldCB0aGUgbWluY2hhcnMgdG8gMFxuICAgICAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1pbmNoYXJzID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5taW5jaGFycyA9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxpc3RlblF1ZXJ5ID0gdGhpcy5pc1VwZGF0ZU9uS2V5UHJlc3MoKTtcblxuICAgICAgICAvLyBieSBkZWZhdWx0IGZvciBhdXRvY29tcGxldGUgZG8gbm90IHNob3cgdGhlIHNlYXJjaCBpY29uXG4gICAgICAgIC8vIGJ5IGRlZmF1bHQgc2hvdyB0aGUgc2VhcmNoaWNvbiBmb3IgdHlwZSA9IHNlYXJjaFxuICAgICAgICB0aGlzLnNob3dzZWFyY2hpY29uID0gaXNEZWZpbmVkKHRoaXMuc2hvd3NlYXJjaGljb24pID8gdGhpcy5zaG93c2VhcmNoaWNvbiA6ICh0aGlzLnR5cGUgPT09ICdzZWFyY2gnKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICBzdXBlci5uZ0FmdGVyVmlld0luaXQoKTtcblxuICAgICAgICBzdHlsZXIodGhpcy5uYXRpdmVFbGVtZW50IGFzIEhUTUxFbGVtZW50LCB0aGlzKTtcbiAgICAgICAgdGhpcy5jb250YWluZXJUYXJnZXQgPSBnZXRDb250YWluZXJUYXJnZXRDbGFzcyh0aGlzLm5hdGl2ZUVsZW1lbnQpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7XG4gICAgICAgIGNvbnN0IHNlYXJjaElucHV0RWwgPSAkKCcuYXBwLXNlYXJjaC1pbnB1dCcpO1xuICAgICAgICBpZiAoc2VhcmNoSW5wdXRFbCkge1xuICAgICAgICAgICAgc2VhcmNoSW5wdXRFbC5yZW1vdmVBdHRyKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIGV2ZW50RGF0YSgkZXZlbnQsIGl0ZW0pIHtcbiAgICAgICAgaWYgKCRldmVudCkge1xuICAgICAgICAgICAgJGV2ZW50WydkYXRhJ10gPSB7XG4gICAgICAgICAgICAgICAgaXRlbSAgOiBpdGVtLmRhdGFPYmplY3QsXG4gICAgICAgICAgICAgICAgbW9kZWwgOiBpdGVtLnZhbHVlLFxuICAgICAgICAgICAgICAgIGxhYmVsIDogaXRlbS5sYWJlbCxcbiAgICAgICAgICAgICAgICBxdWVyeSA6IHRoaXMucXVlcnlcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJGV2ZW50O1xuICAgIH1cblxuICAgIC8vIHRyaWdnZXJlZCBvbiBzZWxlY3Qgb24gb3B0aW9uIGZyb20gdGhlIGxpc3QuIFNldCB0aGUgcXVlcnlNb2RlbCwgcXVlcnkgYW5kIG1vZGVsQnlLZXkgZnJvbSB0aGUgbWF0Y2hlZCBpdGVtLlxuICAgIHB1YmxpYyB0eXBlYWhlYWRPblNlbGVjdChtYXRjaDogVHlwZWFoZWFkTWF0Y2gsICRldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgaXRlbSA9IG1hdGNoLml0ZW07XG4gICAgICAgIHRoaXMucXVlcnlNb2RlbCA9IGl0ZW07XG4gICAgICAgIGl0ZW0uc2VsZWN0ZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gaXRlbS5sYWJlbDtcbiAgICAgICAgdGhpcy5zaG93Q2xvc2VidG4gPSAodGhpcy5xdWVyeSAhPT0gJycpO1xuICAgICAgICAkZXZlbnQgPSAkZXZlbnQgfHwgdGhpcy4kdHlwZWFoZWFkRXZlbnQ7XG5cbiAgICAgICAgLy8gQXMgaXRlbS5rZXkgY2FuIHZhcnkgZnJvbSBrZXkgaW4gdGhlIGRhdGFzZXRJdGVtc1xuICAgICAgICB0aGlzLl9tb2RlbEJ5S2V5ID0gaXRlbS5rZXk7XG4gICAgICAgIHRoaXMuX21vZGVsQnlWYWx1ZSA9IGl0ZW0udmFsdWU7XG5cbiAgICAgICAgJGV2ZW50ID0gdGhpcy5ldmVudERhdGEoJGV2ZW50LCBpdGVtKTtcblxuICAgICAgICB0aGlzLmludm9rZU9uVG91Y2hlZCgpO1xuICAgICAgICB0aGlzLmludm9rZU9uQ2hhbmdlKHRoaXMuZGF0YXZhbHVlLCAkZXZlbnQgfHwge30pO1xuICAgICAgICAvLyB1cGRhdGluZyB0aGUgdmFyaWFibGUgYm91bmQgdG8gZGVmYXVsdCB2YWx1ZSBhcyBpbnZva2VPbkNoYW5nZSBpcyBub3QgdXBkYXRpbmcgdGhlIHZhcmlhYmxlLlxuICAgICAgICBpZiAodGhpcy5kYXRhdmFsdWUgIT09ICh0aGlzIGFzIGFueSkucHJldkRhdGF2YWx1ZSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZFZhcmlhYmxlKHRoaXMuZGF0YXZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy4kZWxlbWVudC5oYXNDbGFzcygnZnVsbC1zY3JlZW4nKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZVNlYXJjaCgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW52b2tlRXZlbnRDYWxsYmFjaygnc2VsZWN0JywgeyAkZXZlbnQsIHNlbGVjdGVkVmFsdWU6IHRoaXMuZGF0YXZhbHVlIH0pO1xuICAgICAgICB0aGlzLmludm9rZUV2ZW50Q2FsbGJhY2soJ3N1Ym1pdCcsIHsgJGV2ZW50IH0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJldkRhdGF2YWx1ZSh0aGlzLmRhdGF2YWx1ZSk7XG4gICAgfVxuXG4gICAgb25Qcm9wZXJ0eUNoYW5nZShrZXk6IHN0cmluZywgbnY6IGFueSwgb3Y6IGFueSkge1xuICAgICAgICBpZiAoa2V5ID09PSAndGFiaW5kZXgnKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCYWNrd2FyZCBjb21wYXRhYmlsaXR5IGZyb20gMTAuMy4xIHRvIDEwLjMuMlxuICAgICAgICAvLyAxMC4zLjEgd2UgaGFkIGRpc3BsYXlsYWJlbCBhcyBtb2RhbCB2YWx1ZVxuICAgICAgICAvLyBGcm9tIDEwLjMuMiBvbndvcmRzIHdlIHdpbGwgYmUgaGF2aW5nIGRpc3BsYXlleHByZXNpb24gYXMgbW9kYWwgdmFsdWVcbiAgICAgICAgaWYgKHRoaXMudHlwZSA9PT0gJ2F1dG9jb21wbGV0ZScgJiYga2V5ID09PSAnZGlzcGxheWxhYmVsJyAmJiB0aGlzLmRpc3BsYXlsYWJlbCAmJiAoIXRoaXMuZGlzcGxheWV4cHJlc3Npb24gfHwgKHRoaXMuZGlzcGxheWV4cHJlc3Npb24gJiYgIXRoaXMuZGF0YXNvdXJjZSkpKSAge1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5ZXhwcmVzc2lvbiA9IHRoaXMuZGlzcGxheWxhYmVsO1xuICAgICAgICAgICAgdGhpcy5kaXNwbGF5bGFiZWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB3aGVuIGRhdGFvcHRpb25zIGFyZSBwcm92aWRlZCBhbmQgdGhlcmUgaXMgbm8gZGlzcGxheWxhYmVsIGdpdmVuIHRoZW4gZGlzcGxheWxhYmVsIGlzIHNldCBhcyB0aGUgcmVsYXRlZGZpZWxkXG4gICAgICAgIGlmIChrZXkgPT09ICdkaXNwbGF5bGFiZWwnICYmIHRoaXMuZGF0YW9wdGlvbnMgJiYgdGhpcy5iaW5kZGlzcGxheWxhYmVsID09PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnF1ZXJ5ID0gZ2V0KHRoaXMuX21vZGVsQnlWYWx1ZSwgbnYpIHx8IHRoaXMuX21vZGVsQnlWYWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdoZW4gc2VhcmNoIGlzIGRpc2FibGVkLCBkbyBub3QgbG9hZCBhbnkgbW9yZSBkYXRhIG9yIGp1c3QgY2xlYXIgdGhlIGRhdGEgdGhhdCBpcyBhbHJlYWR5IGluIHByb2Nlc3Mgb3IgbG9hZGVkLlxuICAgICAgICBpZiAoa2V5ID09PSAnZGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBpZiAobnYgPT09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRhdGEgPSBmYWxzZTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jbGVhckRhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGlmIChnZXQoKHRoaXMudHlwZWFoZWFkIGFzIGFueSksICdfdHlwZWFoZWFkLmlzU2hvd24nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZC5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3VwZXIub25Qcm9wZXJ0eUNoYW5nZShrZXksIG52LCBvdik7XG4gICAgfVxufVxuIiwiPG5nLXRlbXBsYXRlICNjdXN0b21JdGVtVGVtcGxhdGUgbGV0LW1vZGVsPVwiaXRlbVwiIGxldC1pbmRleD1cImluZGV4XCIgbGV0LXF1ZXJ5PVwicXVlcnlcIiBsZXQtbWF0Y2g9XCJtYXRjaFwiPlxuICA8IS0tIERlZmF1bHQgaXRlbSB0ZW1wbGF0ZSAtLT5cbiAgQGlmICghY29udGVudCkge1xuICAgIDxhPlxuICAgICAgQGlmIChtb2RlbC5pbWdTcmMpIHtcbiAgICAgICAgPGltZyBbc3JjXT1cIm1vZGVsLmltZ1NyY1wiIGFsdD1cIlNlYXJjaFwiIFtzdHlsZS53aWR0aF09XCJpbWFnZXdpZHRoXCI+XG4gICAgICB9XG4gICAgICA8c3BhbiBbdGl0bGVdPVwibW9kZWwubGFiZWxcIiBbaW5uZXJIdG1sXT1cImhpZ2hsaWdodChtYXRjaCwgcXVlcnkpIHx8IG1vZGVsLmxhYmVsXCI+PC9zcGFuPlxuICAgIDwvYT5cbiAgfVxuICA8IS0tIEN1c3RvbSBwYXJ0aWFsIHRlbXBsYXRlIC0tPlxuICBAaWYgKGNvbnRlbnQpIHtcbiAgICA8YSBbbmdDbGFzc109XCJ7Y3VzdG9tVGVtcGxhdGU6IGNvbnRlbnR9XCIgcGFydGlhbENvbnRhaW5lciBbd21JdGVtVGVtcGxhdGVdPVwiY29udGVudFwiIFt1c2VyQ29tcG9uZW50UGFyYW1zXT1cIm1hdGNoLml0ZW1cIj5cbiAgICAgIDxkaXYgcGFydGlhbC1jb250YWluZXItdGFyZ2V0PjwvZGl2PlxuICAgIDwvYT5cbiAgfVxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNjdXN0b21MaXN0VGVtcGxhdGUgbGV0LW1hdGNoZXM9XCJtYXRjaGVzXCIgbGV0LWl0ZW1UZW1wbGF0ZT1cIml0ZW1UZW1wbGF0ZVwiIGxldC1xdWVyeT1cInF1ZXJ5XCI+XG4gIDx1bCAjdWxFbGVtZW50IGNsYXNzPVwiYXBwLXNlYXJjaCBkcm9wZG93bi1tZW51XCIgc2Nyb2xsYWJsZT5cbiAgICBAZm9yIChtYXRjaCBvZiBtYXRjaGVzOyB0cmFjayBtYXRjaDsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICAgIDxsaSAjbGlFbGVtZW50cyBbbmdDbGFzc109XCJ7YWN0aXZlOiB0eXBlYWhlYWRDb250YWluZXIgJiYgdHlwZWFoZWFkQ29udGFpbmVyLmlzQWN0aXZlKG1hdGNoKSwgJ2xpc3QtZ3JvdXAtaGVhZGVyJzogbWF0Y2ggJiYgbWF0Y2guaXNIZWFkZXIoKX1cIlxuICAgICAgICAobW91c2VlbnRlcik9XCJ0eXBlYWhlYWRDb250YWluZXIuc2VsZWN0QWN0aXZlKG1hdGNoKTtcIlxuICAgICAgICAoY2xpY2spPVwibWF0Y2ggJiYgIW1hdGNoLmlzSGVhZGVyKCkgJiYgdHlwZWFoZWFkQ29udGFpbmVyLnNlbGVjdE1hdGNoKG1hdGNoLCAkZXZlbnQpOyAkdHlwZWFoZWFkRXZlbnQgPSAkZXZlbnQ7IG5vdGlmeVN1YnNjcmliZXIoKTtcIj5cbiAgICAgICAgPCEtLSBpdGVtVGVtcGxhdGUgY29tZXMgZnJvbSB0aGUgPGlucHV0PiAtLT5cbiAgICAgICAgQGlmIChtYXRjaC5pc0hlYWRlcigpKSB7XG4gICAgICAgICAgPGg0IGNsYXNzPVwiZ3JvdXAtdGl0bGVcIj57e21hdGNoLnZhbHVlfX08L2g0PlxuICAgICAgICB9XG4gICAgICAgIEBpZiAoIW1hdGNoLmlzSGVhZGVyKCkpIHtcbiAgICAgICAgICA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIml0ZW1UZW1wbGF0ZVwiXG4gICAgICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwie2l0ZW06IG1hdGNoLml0ZW0sIGluZGV4OiBpLCBtYXRjaDogbWF0Y2gsIHF1ZXJ5OiBxdWVyeX1cIj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfVxuICAgICAgPC9saT5cbiAgICB9XG4gICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiIFtoaWRkZW5dPVwiX2xvYWRpbmdJdGVtcyB8fCAhKGRhdGFjb21wbGV0ZW1zZyAmJiBkYXRhUHJvdmlkZXIuaXNMYXN0UGFnZSlcIj5cbiAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJkYXRhY29tcGxldGVtc2dcIj48L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInN0YXR1c1wiIFtoaWRkZW5dPVwiIV9sb2FkaW5nSXRlbXNcIj5cbiAgICAgIDxpIGNsYXNzPVwiZmEgZmEtY2lyY2xlLW8tbm90Y2ggZmEtc3BpblwiPjwvaT5cbiAgICAgIDxzcGFuIFt0ZXh0Q29udGVudF09XCJsb2FkaW5nZGF0YW1zZ1wiPjwvc3Bhbj5cbiAgICA8L2Rpdj5cbiAgPC91bD5cbjwvbmctdGVtcGxhdGU+XG5cbjwhLS1UaGlzIHRlbXBsYXRlIGlzIGZvciBzZWFyY2ggaW5zaWRlIG1vYmlsZSBuYXZiYXIuLS0+XG5AaWYgKG5hdnNlYXJjaGJhcikge1xuICA8aW5wdXQgW3RpdGxlXT1cInF1ZXJ5IHx8ICcnXCIgdHlwZT1cInRleHRcIiBjbGFzcz1cImFwcC10ZXh0Ym94IGZvcm0tY29udHJvbCBsaXN0LW9mLW9ianMgYXBwLXNlYXJjaC1pbnB1dFwiIFtwbGFjZWhvbGRlcl09XCJwbGFjZWhvbGRlciB8fCAnJ1wiXG4gICAgZm9jdXMtdGFyZ2V0XG4gICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hY2Nlc3NrZXldPVwic2hvcnRjdXRrZXlcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgWyhuZ01vZGVsKV09XCJxdWVyeVwiXG4gICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbdHlwZWFoZWFkXT1cInR5cGVhaGVhZERhdGFTb3VyY2VcIlxuICAgIFt0eXBlYWhlYWRXYWl0TXNdPVwiZGVib3VuY2V0aW1lXCJcbiAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cImN1c3RvbUl0ZW1UZW1wbGF0ZVwiXG4gICAgW29wdGlvbnNMaXN0VGVtcGxhdGVdPVwiY3VzdG9tTGlzdFRlbXBsYXRlXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJsaXN0ZW5RdWVyeSA9IHRydWVcIlxuICAgIChrZXlkb3duLmVudGVyKT1cIiR0eXBlYWhlYWRFdmVudCA9ICRldmVudDtoYW5kbGVFbnRlckV2ZW50KCRldmVudClcIlxuICAgIChrZXlkb3duLmFycm93ZG93bik9XCJzZWxlY3ROZXh0KCRldmVudClcIlxuICAgIChibHVyKT1cImludm9rZU9uVG91Y2hlZCgkZXZlbnQpXCJcbiAgICAoY2xpY2spPVwiaGFuZGxlRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1cyk9XCJfdW5zdWJzY3JpYmVEdiA9IGZhbHNlOyBsaXN0ZW5RdWVyeSA9IHRydWU7IGhhbmRsZUZvY3VzKCRldmVudCk7IGludm9rZU9uRm9jdXMoJGV2ZW50KTtcIlxuICAgIChmb2N1c291dCk9XCJvbkZvY3VzT3V0KClcIlxuICAgIFt0eXBlYWhlYWRNaW5MZW5ndGhdPVwibWluY2hhcnNcIlxuICAgIFt0eXBlYWhlYWRPcHRpb25zTGltaXRdPVwibGltaXRcIlxuICAgICh0eXBlYWhlYWRMb2FkaW5nKT1cIl9sb2FkaW5nSXRlbXNcIlxuICAgICh0eXBlYWhlYWRPblNlbGVjdCk9XCJ0eXBlYWhlYWRPblNlbGVjdCgkZXZlbnQpXCJcbiAgICB0eXBlYWhlYWRPcHRpb25GaWVsZD1cImxhYmVsXCJcbiAgICBbdHlwZWFoZWFkR3JvdXBGaWVsZF09XCJncm91cGJ5ID8gJ2dyb3VwYnknIDogbnVsbFwiXG4gICAgW3R5cGVhaGVhZEFzeW5jXT1cInRydWVcIlxuICAgIFt0eXBlYWhlYWRTY3JvbGxhYmxlXT1cInRydWVcIlxuICAgIFthZGFwdGl2ZVBvc2l0aW9uXT1cInRydWVcIlxuICAgIFt0eXBlYWhlYWRPcHRpb25zSW5TY3JvbGxhYmxlVmlld109XCJvcHRpb25zbGltaXRpbnNjcm9sbGFibGV2aWV3XCJcbiAgICBbZHJvcHVwXT1cImRyb3B1cFwiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbYXR0ci5uYW1lXT1cIm5hbWVcIlxuICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYWxhYmVsIHx8ICdTZWFyY2ggZmllbGQnXCIvPlxuICA8aSBjbGFzcz1cImJ0bi1jbG9zZSB3aSB3aS1jYW5jZWxcIiBbaGlkZGVuXT1cIiFzaG93Q2xvc2VidG5cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50KTtcIj48L2k+XG59IEBlbHNlIHtcbiAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidG4gYnRuLWljb24gZm9ybS1jb250cm9sLWZlZWRiYWNrIGJhY2stYnRuXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCIgKGNsaWNrKT1cImNsb3NlU2VhcmNoKClcIj48aSBjbGFzcz1cImFwcC1pY29uIHt7YmFja3NlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5CYWNrIGJ1dHRvbjwvc3Bhbj5cbiAgPGlucHV0IFt0aXRsZV09XCJxdWVyeSB8fCAnJ1wiIHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJhcHAtdGV4dGJveCBmb3JtLWNvbnRyb2wgbGlzdC1vZi1vYmpzIGFwcC1zZWFyY2gtaW5wdXRcIiBbcGxhY2Vob2xkZXJdPVwicGxhY2Vob2xkZXIgfHwgJydcIlxuICAgIGZvY3VzLXRhcmdldFxuICAgIFtjb250YWluZXJdPVwiY29udGFpbmVyVGFyZ2V0IHx8ICcud20tYXBwJ1wiXG4gICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcbiAgICBbYXR0ci5hY2Nlc3NrZXldPVwic2hvcnRjdXRrZXlcIlxuICAgIGF1dG9jb21wbGV0ZT1cIm9mZlwiXG4gICAgWyhuZ01vZGVsKV09XCJxdWVyeVwiXG4gICAgW25nTW9kZWxPcHRpb25zXT1cIntzdGFuZGFsb25lOiB0cnVlfVwiXG4gICAgW3JlYWRvbmx5XT1cInJlYWRvbmx5XCJcbiAgICBbdHlwZWFoZWFkXT1cInR5cGVhaGVhZERhdGFTb3VyY2VcIlxuICAgIFt0eXBlYWhlYWRXYWl0TXNdPVwiZGVib3VuY2V0aW1lXCJcbiAgICBbdHlwZWFoZWFkSXRlbVRlbXBsYXRlXT1cImN1c3RvbUl0ZW1UZW1wbGF0ZVwiXG4gICAgW29wdGlvbnNMaXN0VGVtcGxhdGVdPVwiY3VzdG9tTGlzdFRlbXBsYXRlXCJcbiAgICAoaW5wdXQpPVwib25JbnB1dENoYW5nZSgkZXZlbnQpXCJcbiAgICAoa2V5ZG93bik9XCJsaXN0ZW5RdWVyeSA9IHRydWVcIlxuICAgIChrZXlkb3duLmVudGVyKT1cIiR0eXBlYWhlYWRFdmVudCA9ICRldmVudDtoYW5kbGVFbnRlckV2ZW50KCRldmVudClcIlxuICAgIChrZXlkb3duLmFycm93ZG93bik9XCJzZWxlY3ROZXh0KCRldmVudClcIlxuICAgIChibHVyKT1cImludm9rZU9uVG91Y2hlZCgkZXZlbnQpOyBvbkZvY3VzT3V0KClcIlxuICAgIChjbGljayk9XCJoYW5kbGVGb2N1cygkZXZlbnQpO1wiXG4gICAgKGZvY3VzKT1cIl91bnN1YnNjcmliZUR2ID0gZmFsc2U7IGxpc3RlblF1ZXJ5ID0gdHJ1ZTsgaGFuZGxlRm9jdXMoJGV2ZW50KTsgaW52b2tlT25Gb2N1cygkZXZlbnQpXCJcbiAgICBbdHlwZWFoZWFkTWluTGVuZ3RoXT1cIm1pbmNoYXJzXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0xpbWl0XT1cImxpbWl0XCJcbiAgICAodHlwZWFoZWFkTG9hZGluZyk9XCJfbG9hZGluZ0l0ZW1zXCJcbiAgICAodHlwZWFoZWFkT25TZWxlY3QpPVwidHlwZWFoZWFkT25TZWxlY3QoJGV2ZW50KVwiXG4gICAgdHlwZWFoZWFkT3B0aW9uRmllbGQ9XCJsYWJlbFwiXG4gICAgW3R5cGVhaGVhZEdyb3VwRmllbGRdPVwiZ3JvdXBieSA/ICdncm91cGJ5JyA6IG51bGxcIlxuICAgIFt0eXBlYWhlYWRBc3luY109XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkU2Nyb2xsYWJsZV09XCJ0cnVlXCJcbiAgICBbYWRhcHRpdmVQb3NpdGlvbl09XCJ0cnVlXCJcbiAgICBbdHlwZWFoZWFkT3B0aW9uc0luU2Nyb2xsYWJsZVZpZXddPVwib3B0aW9uc2xpbWl0aW5zY3JvbGxhYmxldmlld1wiXG4gICAgW3RhYmluZGV4XT1cInRhYmluZGV4XCJcbiAgICBbZHJvcHVwXT1cImRyb3B1cFwiXG4gICAgW2F0dHIubmFtZV09XCJuYW1lXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFsYWJlbCB8fCAnU2VhcmNoIGZpZWxkJ1wiPlxuICA8aW5wdXQgY2xhc3M9XCJtb2RlbC1ob2xkZXJcIiBuZy1tb2RlbD1cInByb3h5TW9kZWxcIiBuZy1yZXF1aXJlZD1cInJlcXVpcmVkXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICBAaWYgKF9sb2FkaW5nSXRlbXMpIHtcbiAgICA8c3BhbiBhcmlhLWhpZGRlbj1cInRydWVcIiBjbGFzcz1cImZhIGZhLWNpcmNsZS1vLW5vdGNoIGZhLXNwaW4gZm9ybS1jb250cm9sLWZlZWRiYWNrXCI+PC9zcGFuPlxuICB9XG4gIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGNsYXNzPVwiYnRuIGJ0bi1pY29uIGZvcm0tY29udHJvbC1mZWVkYmFjayBjbGVhci1idG5cIiBbbmdDbGFzc109XCJ7J3Nob3ctYnRuJzogaXNRdWVyeUVudGVyZWQoKX1cIiAoY2xpY2spPVwiY2xlYXJTZWFyY2goJGV2ZW50LCB0cnVlKVwiPjxpIGNsYXNzPVwiYXBwLWljb24ge3tjbGVhcnNlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICA8c3BhbiBjbGFzcz1cInNyLW9ubHlcIj5DbGVhciBidXR0b248L3NwYW4+XG4gIEBpZiAoc2hvd3NlYXJjaGljb24pIHtcbiAgICA8c3BhbiBbbmdDbGFzc109XCJ7J2Rpc2FibGVkJzogZGlzYWJsZWR9XCIgY2xhc3M9XCJpbnB1dC1ncm91cC1hZGRvblwiPlxuICAgICAgPGZvcm0+XG4gICAgICAgIDxidXR0b24gdGl0bGU9XCJTZWFyY2hcIiBbZGlzYWJsZWRdPVwiZGlzYWJsZWRcIiBjbGFzcz1cImFwcC1zZWFyY2gtYnV0dG9uIGJ0biBidG4taWNvblwiIHR5cGU9XCJzdWJtaXRcIlxuICAgICAgICAgIChjbGljayk9XCJvblNlYXJjaFNlbGVjdCgkZXZlbnQpXCI+XG4gICAgICAgICAgPGkgY2xhc3M9XCJhcHAtaWNvbiB7e3NlYXJjaGljb25jbGFzc319XCI+PC9pPjwvYnV0dG9uPlxuICAgICAgICA8L2Zvcm0+XG4gICAgICA8L3NwYW4+XG4gICAgfVxuICB9XG4gIDwhLS1UaGlzIHRlbXBsYXRlIGlzIGZvciBib3RoIHdlYiBhbmQgZnVsbHNjcmVlbiBtb2RlIGluIG1vYmlsZS4tLT5cbiJdfQ==
@@ -582,10 +582,7 @@ class SearchComponent extends DatasetAwareFormComponent {
582
582
  // if prev datavalue is not equal to current datavalue then clear the modelByKey and queryModel
583
583
  if (!isObject(val) && this.prevDatavalue !== val) {
584
584
  this._modelByKey = undefined;
585
- if (this.queryModel === '' || this.queryModel === undefined) {
586
- this.query = '';
587
- }
588
- this.queryModel = '';
585
+ this.query = this.queryModel = '';
589
586
  }
590
587
  // if the datafield is ALLFILEDS do not fetch the records
591
588
  // update the query model with the values we have
@@ -976,9 +973,7 @@ class SearchComponent extends DatasetAwareFormComponent {
976
973
  // resetting the queryModel only when prevDatavalue is equal to data
977
974
  if (this.prevDatavalue !== data) {
978
975
  this.queryModel = undefined;
979
- if (!data || data === '') {
980
- this.query = '';
981
- }
976
+ this.query = '';
982
977
  return;
983
978
  }
984
979
  }
@@ -993,15 +988,6 @@ class SearchComponent extends DatasetAwareFormComponent {
993
988
  this.typeahead.keyUpEventEmitter.emit(this.query);
994
989
  }
995
990
  }
996
- handleInputBlur($event) {
997
- this.queryModel = [{
998
- key: this.query,
999
- value: this.query,
1000
- label: this.query
1001
- }];
1002
- this._modelByValue = this.query;
1003
- this.datavalue = this.query;
1004
- }
1005
991
  notifySubscriber() {
1006
992
  const parentEl = $(this.nativeElement).closest('.app-composite-widget.caption-floating');
1007
993
  if (parentEl.length > 0) {
@@ -1139,7 +1125,6 @@ class SearchComponent extends DatasetAwareFormComponent {
1139
1125
  super.ngAfterViewInit();
1140
1126
  styler(this.nativeElement, this);
1141
1127
  this.containerTarget = getContainerTargetClass(this.nativeElement);
1142
- this.nativeElement.querySelector('input')?.addEventListener('blur', this.handleInputBlur.bind(this));
1143
1128
  }
1144
1129
  ngAfterViewChecked() {
1145
1130
  const searchInputEl = $('.app-search-input');
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/basic/search/src/scrollable.directive.ts","../../../../../projects/components/widgets/basic/search/src/search.props.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/local-data-provider.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/remote-data-provider.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/data-provider.ts","../../../../../projects/components/widgets/basic/search/src/search.component.html","../../../../../projects/components/widgets/basic/search/src/search.component.ts","../../../../../projects/components/widgets/basic/search/src/index.ts"],"sourcesContent":["import { AfterContentInit, AfterViewInit, Directive, ElementRef, Injector } from '@angular/core';\n\nimport { SearchComponent } from './search.component';\n\ndeclare const $;\n\n@Directive({\n standalone: true,\n selector: '[scrollable]'\n})\nexport class ScrollableDirective implements AfterContentInit, AfterViewInit {\n private elementRef: ElementRef;\n\n constructor(inj: Injector, private searchRef: SearchComponent) {\n this.elementRef = inj.get(ElementRef);\n }\n\n ngAfterContentInit() {\n // add the scroll event listener on the ul element.\n this.elementRef.nativeElement.addEventListener('scroll', this.notifyParent.bind(this));\n this.searchRef.dropdownEl = $(this.elementRef.nativeElement);\n (this.searchRef as any).onDropdownOpen();\n }\n\n ngAfterViewInit() {\n if (!this.searchRef.isMobileAutoComplete()) {\n // assigning width for the dropdown.\n const typeAheadInput = this.searchRef.$element.find('input').first();\n this.searchRef.dropdownEl.width(typeAheadInput.outerWidth());\n }\n }\n\n private notifyParent(evt: Event) {\n this.searchRef.onScroll(this.elementRef.nativeElement, evt);\n }\n}\n","import {FormWidgetType} from '@wm/core';\nimport {PROP_ANY, PROP_BOOLEAN, PROP_NUMBER, PROP_STRING, register, registerFormWidget} from '@wm/components/base';\n\nexport const searchProps = new Map(\n [\n ['casesensitive', { value: false, ...PROP_BOOLEAN }],\n ['class', PROP_STRING],\n ['datacompletemsg', { value: 'No more data to load', ...PROP_STRING }],\n ['datafield', { value: 'All Fields', ...PROP_STRING }],\n ['dataoptions', PROP_ANY],\n ['dataset', PROP_ANY],\n ['datasource', PROP_ANY],\n ['datavalue', PROP_STRING],\n ['datavaluesource', PROP_ANY],\n ['dateformat', PROP_STRING],\n ['disabled', PROP_BOOLEAN],\n ['displayimagesrc', PROP_STRING],\n ['displaylabel', PROP_STRING],\n ['displayexpression', PROP_STRING],\n\n ['dropup', PROP_BOOLEAN],\n ['groupby', PROP_STRING],\n ['hint', PROP_STRING],\n ['arialabel', PROP_STRING],\n ['imagewidth', { value: '16px', ...PROP_STRING }],\n ['limit', PROP_NUMBER],\n ['loadingdatamsg', { value: 'Loading items...', ...PROP_STRING }],\n ['match', PROP_STRING],\n ['matchmode', PROP_STRING],\n ['minchars', PROP_NUMBER],\n ['name', PROP_STRING],\n ['navsearchbar', { value: false, ...PROP_BOOLEAN }],\n ['orderby', PROP_STRING],\n ['placeholder', { value: 'Search', ...PROP_STRING }],\n ['position', PROP_STRING],\n ['query', PROP_STRING],\n ['readonly', PROP_BOOLEAN],\n ['required', PROP_BOOLEAN],\n ['searchkey', PROP_STRING],\n ['searchon', { value: 'typing', ...PROP_STRING }],\n ['shortcutkey', PROP_STRING],\n ['show', { value: true, ...PROP_BOOLEAN }],\n ['showclear', { value: false, ...PROP_BOOLEAN }],\n ['showsearchicon', PROP_BOOLEAN],\n ['tabindex', { value: 0, ...PROP_NUMBER }],\n ['type', { value: 'search', ...PROP_STRING }],\n ['debouncetime', { value: 250, ...PROP_NUMBER }],\n ['width', PROP_STRING],\n ['clearsearchiconclass', {value: 'wi wi-close', ...PROP_STRING}],\n ['backsearchiconclass', {value: 'wi wi-arrow-left', ...PROP_STRING}],\n ['searchiconclass', {value: 'wm-sl-l sl-search', ...PROP_STRING}],\n ]\n);\n\nexport const registerProps = () => {\n register(\n 'wm-search',\n searchProps\n );\n registerFormWidget(\n FormWidgetType.AUTOCOMPLETE,\n new Map(searchProps)\n );\n registerFormWidget(\n FormWidgetType.TYPEAHEAD,\n new Map(searchProps)\n );\n};\n","import { IDataProvider, IDataProviderConfig } from './data-provider';\nimport {\n endsWith,\n filter,\n get,\n includes,\n isArray,\n isEqual,\n isNumber,\n isObject,\n split,\n startsWith,\n toLower,\n toString,\n values\n} from \"lodash-es\";\n\nexport class LocalDataProvider implements IDataProvider {\n private applyFilter(entry, queryText, filtername?) {\n entry = isNumber(entry) ? entry.toString() : entry;\n if (includes(filtername, 'start')) {\n return startsWith(entry, queryText);\n } else if (includes(filtername, 'end')) {\n return endsWith(entry, queryText);\n } else if (includes(filtername, 'exact')) {\n return isEqual(entry, queryText);\n }\n return includes(entry, queryText);\n }\n\n // LocalData filtering is done based on the searchkey.\n public filter(config: IDataProviderConfig): Promise<any> {\n const entries = config.dataset;\n let casesensitive = config.casesensitive;\n const matchMode = config.matchMode;\n // for supporting existing projects\n if (matchMode && !includes(matchMode, 'ignorecase')) {\n casesensitive = true;\n }\n let queryText = config.query,\n filteredData;\n\n return new Promise((resolve, reject) => {\n /**\n * If searchKey is defined, then check for match string against each item in the dataset with item's field name as the searchKey\n * return the filtered data containing the matching string.\n */\n if (config.searchKey) {\n const keys = split(config.searchKey, ',');\n\n filteredData = filter(config.dataset, (item: any) => {\n return keys.some(key => {\n let a = get(item, key),\n b = queryText;\n if (!casesensitive) {\n a = toLower(toString(a));\n b = toLower(toString(b));\n }\n return this.applyFilter(a, b, matchMode);\n });\n });\n } else {\n // local search on data with array of objects.\n // Iterate over each item and return the filtered data containing the matching string.\n if (isArray(entries) && isObject(entries[0])) {\n filteredData = filter(entries, entry => {\n let a = values(entry).join(' ');\n if (!casesensitive) {\n a = toLower(a);\n // @ts-ignore\n queryText = toLower(queryText);\n }\n return this.applyFilter(a, queryText);\n });\n } else {\n filteredData = filter(entries, entry => {\n if (!casesensitive) {\n entry = toLower(entry);\n // @ts-ignore\n queryText = toLower(queryText);\n }\n return this.applyFilter(entry, queryText, matchMode);\n });\n }\n }\n resolve({\n data: filteredData,\n hasMoreData: false,\n isLastPage: true\n });\n });\n }\n}\n","import { AppConstants, DataSource, findValueOf, getClonedObject } from '@wm/core';\n\nimport { convertDataToObject, interpolateBindExpressions } from '@wm/components/base';\nimport { IDataProvider, IDataProviderConfig } from './data-provider';\nimport {assign, get, indexOf, isArray, isEmpty, isObject, set, slice, split} from \"lodash-es\";\n\nexport class RemoteDataProvider implements IDataProvider {\n public filter(config: IDataProviderConfig): Promise<any> {\n return this.filterData(config).then(response => this.onFilterSuccess(config, response), () => this.onFilterFailure());\n }\n\n private filterData(config) {\n if (config.dataoptions) {\n const dataoptions = config.dataoptions;\n\n const requestParams = config.datasource.execute(DataSource.Operation.GET_REQUEST_PARAMS, config);\n\n // If options are specified, make specifics calls to fetch the results\n // Fetch the related field data\n if (dataoptions.relatedField) {\n return new Promise((resolve, reject) => {\n interpolateBindExpressions(config.viewParent, dataoptions.filterExpr, (filterexpressions) => {\n requestParams.filterExpr = dataoptions.filterExpr = filterexpressions;\n dataoptions.filterExpr = filterexpressions;\n\n config.datasource.execute(\n DataSource.Operation.GET_RELATED_TABLE_DATA, assign({relatedField: dataoptions.relatedField}, requestParams)\n ).then(resolve, reject);\n });\n });\n }\n // Fetch the distinct data\n if (dataoptions.distinctField) {\n return config.datasource.execute(\n DataSource.Operation.GET_DISTINCT_DATA_BY_FIELDS,\n {\n pagesize: config.limit || config.pagesize,\n page: config.page,\n fields: dataoptions.distinctField,\n entityName: dataoptions.tableName,\n filterFields: assign(dataoptions.filterFields, requestParams.filterFields),\n filterExpr: getClonedObject(dataoptions.filterExpr || {})\n\n }\n );\n }\n }\n\n // search records using the searchkey\n return config.datasource.execute(\n DataSource.Operation.SEARCH_RECORDS, config\n );\n }\n\n\n // Check if the page retrieved currently is the last page. If last page, don't send any more request\n protected isLast(page: number, dataSize: number, maxResults: number, currentResults?: number): boolean {\n // if last page info is not returned by backend and current results is less than max results, this is the last page\n if (dataSize === AppConstants.INT_MAX_VALUE) {\n return currentResults !== 0 && currentResults < maxResults;\n }\n const pageCount = ((dataSize > maxResults) ? (Math.ceil(dataSize / maxResults)) : (dataSize < 0 ? 0 : 1));\n return page === pageCount;\n }\n\n // this function transform the response data in case it is not an array\n protected getTransformedData(variable: any, data: any): any {\n const operationResult = variable.operation + 'Result'; // when output is only string it is available as oprationNameResult\n const tempResponse = data[operationResult];\n\n // in case data received is value as string then add that string value to object and convert object into array\n if (tempResponse) {\n const tempObj = {};\n set(tempObj, operationResult, tempResponse);\n data = [tempObj]; // convert data into an array having tempObj\n } else {\n // in case data received is already an object then convert it into an array\n data = [data];\n }\n\n return data;\n }\n\n protected onFilterFailure() {\n return [];\n }\n\n private isLastPageForDistinctApi(data, page, totalElements, _isLastPage) {\n return page > 1 && !_isLastPage && isEmpty(data) && totalElements === AppConstants.INT_MAX_VALUE;\n }\n\n\n // this function processes the response depending on pageOptions, isPageable and prepares the formattedDataset.\n protected onFilterSuccess(config: IDataProviderConfig, response): Promise<any> {\n let data: any = response.data;\n let formattedData: any;\n let _isLastPage: boolean;\n let page: number;\n let isPaginatedData: boolean;\n\n const expressionArray = split(config.binddataset, '.');\n const dataExpression = slice(expressionArray, indexOf(expressionArray, 'dataSet') + 1).join('.');\n const $I = '[$i]';\n\n return new Promise((resolve, reject) => {\n const pageOptions = response.pagination;\n\n if (config.datasource.execute(DataSource.Operation.IS_PAGEABLE)) {\n page = pageOptions.number + 1;\n _isLastPage = this.isLast(page, (config.limit > 0 && config.limit) || pageOptions.totalElements, pageOptions.size, pageOptions.numberOfElements);\n isPaginatedData = true;\n\n if (this.isLastPageForDistinctApi(data, page, pageOptions.totalElements, _isLastPage)) {\n _isLastPage = true;\n resolve({\n data: [],\n isLastPage: _isLastPage,\n hasMoreData: page > 1,\n isPaginatedData,\n page\n });\n return;\n }\n }\n // if data expression exists, extract the data from the expression path\n if (dataExpression) {\n if (isArray(data)) {\n const index = dataExpression.lastIndexOf($I);\n if(index > -1){\n const restExpr = dataExpression.substr(index + 5);\n formattedData = data.map(datum => findValueOf(datum, restExpr));\n }\n } else if (isObject(data)) {\n formattedData = get(data, dataExpression);\n }\n data = formattedData || data;\n }\n if (!isArray(data)) {\n data = this.getTransformedData(config.datasource, data);\n }\n // in case of no data received, resolve the promise with empty array\n if (!data.length) {\n resolve({data: [], isLastPage: _isLastPage, hasMoreData: page > 1, isPaginatedData, page});\n } else {\n resolve({data: data, isLastPage: _isLastPage, hasMoreData: page > 1, isPaginatedData, page});\n }\n });\n }\n}\n","import { DataSource } from '@wm/core';\n\nimport { LocalDataProvider } from './local-data-provider';\nimport { RemoteDataProvider } from './remote-data-provider';\n\nexport interface IDataProviderConfig {\n dataoptions?: any;\n viewParent?: any;\n dataset: any;\n datafield: string;\n binddataset?: string;\n datasource?: any;\n hasData: boolean;\n query: Array<string> | string;\n isLocalFilter: boolean;\n searchKey?: string;\n matchMode?: string;\n casesensitive?: boolean;\n isformfield?: boolean;\n orderby?: string;\n limit?: number;\n pagesize?: number;\n page: number;\n noMoredata?: boolean;\n onBeforeservicecall?: Function;\n}\n\nexport interface IDataProvider {\n hasMoreData?: boolean;\n isLastPage?: boolean;\n hasNoMoreData?: boolean;\n isPaginatedData?: boolean;\n page?: number;\n updateDataset?: boolean;\n\n filter(config: IDataProviderConfig): Promise<any>;\n}\n\nexport class DataProvider implements IDataProvider {\n\n public hasMoreData: boolean;\n public isLastPage: boolean;\n public page: number;\n public isPaginatedData: boolean;\n public updateDataset: boolean;\n\n static remoteDataProvider = new RemoteDataProvider();\n static localDataProvider = new LocalDataProvider();\n\n public filter(config: IDataProviderConfig): Promise<any> {\n\n let promise: Promise<any>;\n\n /**\n * Make call to remoteDataProvider when searchkey is available and data is not from local / model variable.\n * Otherwise use localDataProvider\n * If datasource is a serviceVariable with no input params, then perform local search.\n * when there is no dataset on the datasource when first time make a remote call to set the dataset for service variable.\n */\n const hasNoVariableDataset = config.datasource && config.datasource.execute(DataSource.Operation.IS_UPDATE_REQUIRED, config.hasData);\n if (!config.isLocalFilter && (config.dataoptions || ((config.datasource && config.datasource.execute(DataSource.Operation.IS_API_AWARE))\n && config.searchKey\n && hasNoVariableDataset))) {\n promise = DataProvider.remoteDataProvider.filter(config);\n } else {\n promise = DataProvider.localDataProvider.filter(config);\n }\n\n return promise.then(response => {\n this.updateDataset = config.datasource && !config.datasource.execute(DataSource.Operation.SUPPORTS_CRUD) && hasNoVariableDataset;\n this.hasMoreData = response.hasMoreData;\n this.isLastPage = response.isLastPage;\n this.page = response.page;\n this.isPaginatedData = response.isPaginatedData;\n\n return response;\n });\n }\n}\n","<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\" scrollable>\n @for (match of matches; track match; let i = $index) {\n <li #liElements [ngClass]=\"{active: typeaheadContainer && typeaheadContainer.isActive(match), 'list-group-header': match && match.isHeader()}\"\n (mouseenter)=\"typeaheadContainer.selectActive(match);\"\n (click)=\"match && !match.isHeader() && typeaheadContainer.selectMatch(match, $event); $typeaheadEvent = $event; notifySubscriber();\">\n <!-- itemTemplate comes from the <input> -->\n @if (match.isHeader()) {\n <h4 class=\"group-title\">{{match.value}}</h4>\n }\n @if (!match.isHeader()) {\n <ng-container [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-container>\n }\n </li>\n }\n <div class=\"status\" [hidden]=\"_loadingItems || !(datacompletemsg && dataProvider.isLastPage)\">\n <span [textContent]=\"datacompletemsg\"></span>\n </div>\n <div class=\"status\" [hidden]=\"!_loadingItems\">\n <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n <span [textContent]=\"loadingdatamsg\"></span>\n </div>\n </ul>\n</ng-template>\n\n<!--This template is for search inside mobile navbar.-->\n@if (navsearchbar) {\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n container=\"body\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event)\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event);\"\n (focusout)=\"onFocusOut()\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [dropup]=\"dropup\"\n [tabindex]=\"tabindex\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\"/>\n <i class=\"btn-close wi wi-cancel\" [hidden]=\"!showClosebtn\" (click)=\"clearSearch($event);\"></i>\n} @else {\n <button type=\"button\" class=\"btn btn-icon form-control-feedback back-btn\" aria-hidden=\"true\" (click)=\"closeSearch()\"><i class=\"app-icon {{backsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Back button</span>\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n [container]=\"containerTarget || '.wm-app'\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event); onFocusOut()\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event)\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [tabindex]=\"tabindex\"\n [dropup]=\"dropup\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\">\n <input class=\"model-holder\" ng-model=\"proxyModel\" ng-required=\"required\" tabindex=\"-1\" aria-hidden=\"true\">\n @if (_loadingItems) {\n <span aria-hidden=\"true\" class=\"fa fa-circle-o-notch fa-spin form-control-feedback\"></span>\n }\n <button type=\"button\" class=\"btn btn-icon form-control-feedback clear-btn\" [ngClass]=\"{'show-btn': isQueryEntered()}\" (click)=\"clearSearch($event, true)\"><i class=\"app-icon {{clearsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Clear button</span>\n @if (showsearchicon) {\n <span [ngClass]=\"{'disabled': disabled}\" class=\"input-group-addon\">\n <form>\n <button title=\"Search\" [disabled]=\"disabled\" class=\"app-search-button btn btn-icon\" type=\"submit\"\n (click)=\"onSearchSelect($event)\">\n <i class=\"app-icon {{searchiconclass}}\"></i></button>\n </form>\n </span>\n }\n }\n <!--This template is for both web and fullscreen mode in mobile.-->\n","import { CommonModule } from '@angular/common';\nimport { WmComponentsModule } from \"@wm/components/base\";\nimport { FormsModule } from '@angular/forms';\nimport { ScrollableDirective } from './scrollable.directive';\nimport {\n AfterViewChecked,\n AfterViewInit,\n Attribute,\n Component,\n ElementRef,\n Inject,\n Injector,\n OnInit,\n Optional,\n QueryList,\n ViewChild,\n ViewChildren\n} from '@angular/core';\nimport {NG_VALIDATORS, NG_VALUE_ACCESSOR} from '@angular/forms';\n\nimport {from, Observable, of} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {TypeaheadContainerComponent, TypeaheadDirective, TypeaheadMatch, TypeaheadModule} from 'ngx-bootstrap/typeahead';\n\nimport {addClass, adjustContainerPosition, App, DataSource, isDefined, isMobile, toBoolean} from '@wm/core';\nimport {\n ALLFIELDS,\n convertDataToObject,\n DataSetItem,\n extractDataAsArray,\n getContainerTargetClass,\n getUniqObjsByDataField,\n provideAs,\n provideAsWidgetRef,\n styler,\n transformFormData\n} from '@wm/components/base';\nimport {DatasetAwareFormComponent} from '@wm/components/input';\n\nimport {registerProps} from './search.props';\nimport {DataProvider, IDataProvider, IDataProviderConfig} from './data-provider/data-provider';\nimport {\n debounce,\n find,\n get,\n includes,\n isArray,\n isEmpty,\n isEqual,\n isObject,\n isUndefined,\n map,\n split,\n toString,\n trim\n} from \"lodash-es\";\n\nconst WIDGET_CONFIG = { widgetType: 'wm-search', hostClass: 'input-group' };\n\n@Component({\n standalone: true,\n imports: [CommonModule, WmComponentsModule, FormsModule, ScrollableDirective, TypeaheadModule],\n selector: '[wmSearch]',\n templateUrl: './search.component.html',\n providers: [\n provideAs(SearchComponent, NG_VALUE_ACCESSOR, true),\n provideAs(SearchComponent, NG_VALIDATORS, true),\n provideAsWidgetRef(SearchComponent)\n ]\n})\nexport class SearchComponent extends DatasetAwareFormComponent implements OnInit, AfterViewInit, AfterViewChecked {\n static initializeProps = registerProps();\n public casesensitive: boolean;\n public searchkey: string;\n public queryModel: Array<DataSetItem> | string;\n public query = '';\n public limit: any;\n public showsearchicon: boolean;\n public minchars: number;\n public type: string;\n public navsearchbar: any;\n public debouncetime: number;\n public hint: string;\n public arialabel: string;\n\n private app: App;\n private typeaheadDataSource: Observable<any>;\n private pagesize: any;\n private page = 1;\n public _loadingItems: boolean;\n private dataProvider: IDataProvider;\n private result: Array<any>; // contains the search result i.e. matches\n private formattedDataset: any;\n private isformfield: boolean;\n private $typeaheadEvent: Event;\n\n public tabindex: number;\n public startIndex: number;\n public binddisplaylabel: string;\n public typeaheadContainer: TypeaheadContainerComponent;\n public containerTarget: string;\n public clearsearchiconclass: string;\n public backsearchiconclass: string;\n public searchiconclass: string;\n\n @ViewChild(TypeaheadDirective) typeahead: TypeaheadDirective;\n @ViewChild('ulElement') ulElement: ElementRef;\n @ViewChildren('liElements') liElements: QueryList<ElementRef>;\n\n private allowonlyselect: boolean;\n private class: string;\n\n private lastSelectedIndex: number;\n private dataoptions: any;\n public dropdownEl: any;\n private _lastQuery: string;\n private _lastResult: any;\n private _isOpen: boolean; // set to true when dropdown is open\n private showClosebtn: boolean;\n private _unsubscribeDv: boolean;\n private _datasource: any;\n private isScrolled: boolean;\n private parentEl: any;\n private position: string;\n private elIndex: number;\n private listenQuery: boolean;\n private _domUpdated: boolean;\n private searchon: string;\n private showclear: boolean;\n public matchmode: string;\n private clearData: boolean;\n\n\n // getter setter is added to pass the datasource to searchcomponent.\n get datasource() {\n return this._datasource;\n }\n\n set datasource(nv) {\n this._datasource = nv;\n const data = this.datavalue || this.toBeProcessedDatavalue;\n this.updateByDatavalue(data);\n }\n\n constructor(\n inj: Injector,\n app: App,\n @Attribute('datavalue.bind') public binddatavalue,\n @Attribute('dataset.bind') public binddataset,\n @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any\n ) {\n super(inj, WIDGET_CONFIG, explicitContext);\n // this flag will not allow the empty datafield values.\n this.allowempty = false;\n this.app = app;\n addClass(this.nativeElement, 'app-search', true);\n\n /**\n * Listens for the change in the ngModel on every search and retrieves the data as observable.\n * This observable data is passed to the typeahead.\n * @type {Observable<any>}\n */\n this.typeaheadDataSource = Observable\n .create((observer: any) => {\n // Runs on every search\n if (this.listenQuery) {\n this._defaultQueryInvoked = false;\n this._loadingItems = true;\n observer.next(this.query);\n }\n // on keydown, while scrolling the dropdown items, when last item is reached next call is triggered\n // unless the call is resolved, we are able to scroll next to first item and soon\n // This shows flickering from first item to next new items appended.\n // By setting container to undefined, key events changes will be stopped while loading items\n if (this.lastSelectedIndex) {\n this.typeahead._container = undefined;\n }\n }).pipe(\n filter(() => {\n this._loadingItems = false;\n return (this.minchars === 0 || (this.query && this.query.length >= this.minchars));\n }),\n mergeMap((token: string) => this.getDataSourceAsObservable(token))\n );\n\n this.dataProvider = new DataProvider();\n\n /**\n * When default datavalue is not found within the dataset, a filter call is made to get the record using fetchDefaultModel.\n * after getting the response, set the queryModel and query.\n */\n const datavalueSubscription = this.datavalue$.subscribe((val: Array<string> | string) => {\n\n const query = (isArray(val) ? val[0] : val) as string;\n\n if (query === null || query === '') {\n this._modelByValue = '';\n // reset the query.\n this.query = this.queryModel = '';\n // on clear or reset filter, empty the lastResults to fetch new records.\n this._lastResult = undefined;\n return;\n }\n\n if (!this._unsubscribeDv) {\n this._defaultQueryInvoked = false;\n // if prev datavalue is not equal to current datavalue then clear the modelByKey and queryModel\n if (!isObject(val) && (this as any).prevDatavalue !== val) {\n this._modelByKey = undefined;\n if (this.queryModel === '' || this.queryModel === undefined) {\n this.query = '';\n } this.queryModel = '';\n }\n // if the datafield is ALLFILEDS do not fetch the records\n // update the query model with the values we have\n this.updateByDatavalue(val);\n }\n\n // turn on showCloseBtn when a default value is given\n this.showClosebtn = (this.query !== '');\n });\n this.registerDestroyListener(() => datavalueSubscription.unsubscribe());\n\n const datasetSubscription = this.dataset$.subscribe(() => {\n // set the next item index.\n this.startIndex = this.datasetItems.length;\n this._lastResult = undefined;\n const defaultValue = this.datavalue || this.toBeProcessedDatavalue;\n // invoking updateByDataset only when datavalue is present, as entered value i.e. query is setting back to ''\n if (isDefined(defaultValue)) {\n this.updateByDataset(defaultValue);\n }\n });\n this.registerDestroyListener(() => datasetSubscription.unsubscribe());\n }\n\n // on clear, trigger search with page size 1\n private clearSearch($event, loadOnClear) {\n this.query = '';\n this.onInputChange($event);\n this.dataProvider.isLastPage = false;\n this.listenQuery = false;\n if (loadOnClear) {\n this.listenQuery = true;\n this._unsubscribeDv = false;\n this.loadMoreData();\n }\n this.invokeEventCallback('clearsearch');\n this._loadingItems = false;\n // when search input is cleared, focus on the input field\n if ($event) {\n this.$element.find('.app-search-input').focus();\n }\n }\n\n // function to clear the input value\n public clearText() {\n this.query = '';\n this.showClosebtn = false;\n }\n\n // Close the full screen mode in mobile view of auto complete\n private closeSearch() {\n this._loadingItems = false;\n this.page = 1;\n // after closing the search, insert the element at its previous position (elIndex)\n this.insertAtIndex(this.elIndex);\n this.elIndex = undefined;\n this.parentEl = undefined;\n this.$element.removeClass('full-screen');\n if (this._domUpdated) {\n this._domUpdated = false;\n }\n this.listenQuery = false;\n this._unsubscribeDv = true;\n this.typeahead.hide();\n }\n\n private renderMobileAutoComplete() {\n // Get the parent element of the search element which can be next or prev element, if both are empty then get the parent of element.\n if (!isDefined(this.elIndex)) {\n this.parentEl = this.$element.parent();\n this.elIndex = this.parentEl.children().index(this.$element);\n }\n if (!this.$element.hasClass('full-screen')) {\n // this flag is set to notify that the typeahead-container dom has changed its position\n this._domUpdated = true;\n // Add full screen class on focus of the input element.\n this.$element.addClass('full-screen');\n\n // Add position to set the height to auto\n if (this.position === 'inline') {\n this.$element.addClass(this.position);\n }\n }\n // focus is lost when element is changed to full-screen, keydown to select next items will not work\n // Hence explicitly focusing the input\n if (this.$element.hasClass('full-screen')) {\n this.$element.find('.app-search-input').focus();\n }\n }\n\n private getDataSourceAsObservable(query: string): Observable<any> {\n // show dropdown only when there is change in query. This should not apply when dataoptions with filterFields are updated.\n // when lastResult is not available i.e. still the first call is pending and second query is invoked then do not return.\n if (this._lastQuery === query && !get(this.dataoptions, 'filterFields') && isDefined(this._lastResult)) {\n this._loadingItems = false;\n return of(this._lastResult);\n }\n\n /*\n WMS-19177: On focus of input field for autocomplete type, do not trigger api call when\n a) searchkey and displayexpression are different\n b) binddisplaylabel contains multiple values\n c) binddisplaylabel contains single value which does not match with searchkey\n */\n if (this.type === 'autocomplete' && this.searchkey && this.query && this.datavalue) {\n let bindDisplayLabelArray = [];\n const searchKeyArray = split(this.searchkey, ',');\n let displaylabel;\n if (this.binddisplaylabel) {\n bindDisplayLabelArray = split(this.binddisplaylabel, '+');\n if (bindDisplayLabelArray.length === 1) {\n if (!includes(bindDisplayLabelArray[0], '|')) {\n const regex = /\\[(.*?)\\]/;\n displaylabel = regex.exec(bindDisplayLabelArray[0])[1];\n } else {\n displaylabel = true;\n }\n }\n }\n if ((bindDisplayLabelArray.length > 1 || (displaylabel && !includes(searchKeyArray, displaylabel))\n || (this.displayexpression && !includes(searchKeyArray, this.displayexpression)))) {\n this._loadingItems = false;\n return of([]);\n }\n }\n this._lastQuery = this.query;\n return from(this.getDataSource(query));\n }\n\n protected handleEvent(node: HTMLElement, eventName: string, eventCallback: Function, locals: any) {\n if (!includes(['blur', 'focus', 'select', 'submit', 'change'], eventName)) {\n super.handleEvent(node, eventName, eventCallback, locals);\n }\n }\n\n // highlight the characters in the dropdown matching the query.\n private highlight(match: TypeaheadMatch, query: string) {\n if (this.typeaheadContainer) {\n // highlight of chars will work only when label are strings.\n (match as any).value = match.item.label.toString();\n return this.typeaheadContainer.highlight(match, query);\n }\n }\n\n // inserts the element at the index position\n private insertAtIndex(i) {\n if (i === 0) {\n this.parentEl.prepend(this.$element);\n } else {\n const $elAtIndex = this.parentEl.children().eq(i);\n if ($elAtIndex.length) {\n this.$element.insertBefore(this.parentEl.children().eq(i));\n } else {\n this.$element.insertAfter(this.parentEl.children().eq(i - 1));\n }\n }\n }\n\n // Check if the widget is of type autocomplete in mobile view/ app\n public isMobileAutoComplete() {\n return this.type === 'autocomplete' && isMobile();\n }\n\n // Check if the query is entered in the input and the view is not mobile\n public isQueryEntered() {\n return this.showclear && this.showClosebtn;\n }\n\n private loadMoreData(incrementPage?: boolean) {\n if (this.dataProvider.isLastPage) {\n return;\n }\n // Increase the page number and trigger force query update\n this.page = incrementPage ? this.page + 1 : this.page;\n\n this.isScrolled = true;\n this._loadingItems = true;\n\n // when invoking new set of results, reset the lastQuery.\n if (incrementPage) {\n this._lastQuery = undefined;\n }\n\n // trigger the typeahead change manually to fetch the next set of results.\n this.typeahead.onInput({\n target: {\n value: trim(this.query) || '0' // dummy data to notify the observables\n }\n });\n }\n\n // on focusout, subscribe to the datavalue changes again\n private onFocusOut() {\n this._unsubscribeDv = false;\n this._loadingItems = false;\n // reset the page value on focusout.\n this.page = 1;\n // if domUpdated is true then do not hide the dropdown in the fullscreen\n if (!this._domUpdated && this._isOpen) {\n this.listenQuery = false;\n }\n this._isOpen = false;\n // on outside click, typeahead is hidden. To avoid this, when fullscreen is set, overridding isFocused flag on the typeahead container\n if (this._domUpdated && this.typeahead && (this.typeahead as any)._container) {\n (this.typeahead as any)._container.isFocused = true;\n }\n }\n\n private onInputChange($event) {\n // reset all the previous page details in order to fetch new set of result.\n this.result = [];\n this.page = 1;\n this.listenQuery = this.isUpdateOnKeyPress();\n this._modelByValue = undefined;\n\n // when input is cleared, reset the datavalue\n if (this.query === '') {\n this.queryModel = '';\n this._modelByValue = '';\n this.updatePrevDatavalue(this._lastQuery);\n this.invokeOnChange(this._modelByValue, {}, true);\n\n this.invokeEventCallback('clear', { $event });\n\n // trigger onSubmit only when the search input is cleared off and do not trigger when tab is pressed.\n if ($event && $event.which !== 9) {\n this.invokeEventCallback('submit', { $event });\n }\n } else {\n // invoking change event on every input value change.\n this.invokeEventCallback('change', {\n $event: $event,\n newVal: this._modelByValue || this.query,\n oldVal: (this as any).prevDatavalue\n });\n }\n this.showClosebtn = (this.query !== '');\n }\n\n // Triggered for enter event\n private handleEnterEvent($event) {\n // submit event triggered when there is no search results\n if (!get(this.typeahead, 'matches.length')) {\n this.onSearchSelect($event);\n }\n }\n // Triggerred when typeahead option is selected.\n private onSearchSelect($event: Event) {\n let item;\n // WMS-22533: Before adding active typeahead el, check if the entered query matches with the active el or not\n const isQueryMatch = this.typeaheadContainer?.active?.value === this.query;\n\n if (this.typeaheadContainer && this.typeaheadContainer.active && isQueryMatch) {\n item = this.typeaheadContainer.active.item;\n }\n $event = this.eventData($event, item || {});\n\n // searchOn is set as onBtnClick, then invoke the search api call manually.\n if (!this.isUpdateOnKeyPress()) {\n this.listenQuery = true;\n // trigger the typeahead change manually to fetch the next set of results.\n this.typeahead.onInput({\n target: {\n value: this.query // dummy data to notify the observables\n }\n });\n return;\n }\n // when matches are available.\n if (this.typeaheadContainer && this.liElements.length && isQueryMatch) {\n this.typeaheadContainer.selectActiveMatch();\n } else {\n this.queryModel = this.query;\n this.invokeEventCallback('submit', { $event });\n }\n }\n\n private invokeOnBeforeServiceCall(inputData) {\n this.invokeEventCallback('beforeservicecall', { inputData });\n }\n\n private onDropdownOpen() {\n if (this.clearData) {\n this.typeahead.hide();\n }\n // setting the ulElements, liElement on typeaheadContainer.\n // as we are using customOption template, liElements are not available on typeaheadContainer so append them explicitly.\n const fn = debounce(() => {\n this._isOpen = true;\n this.typeaheadContainer = this.typeahead._container || (this.typeahead as any)._typeahead.instance;\n (this.typeaheadContainer as any).liElements = this.liElements;\n (this.typeaheadContainer as any).ulElement = this.ulElement;\n adjustContainerPosition($('typeahead-container'), this.nativeElement, (this.typeahead as any)._typeahead, $('typeahead-container .dropdown-menu'));\n\n });\n\n fn();\n\n // open full-screen search view\n if (this.isMobileAutoComplete()) {\n if (!this.$element.hasClass('full-screen')) {\n this.renderMobileAutoComplete();\n }\n const dropdownEl = this.dropdownEl.closest('typeahead-container');\n\n dropdownEl.insertAfter(this.$element.find('input').first());\n const screenHeight = this.$element.closest('.app-content').height();\n dropdownEl.css({ position: 'relative', top: 0, height: screenHeight + 'px' });\n this.showClosebtn = this.query && this.query !== '';\n\n if (!isUndefined(this.dataProvider.isLastPage) && !this.dataProvider.isLastPage) {\n this.triggerSearch();\n }\n }\n }\n\n private selectNext() {\n const matches = this.typeaheadContainer.matches;\n\n if (!matches) {\n return;\n }\n const index = matches.indexOf(this.typeaheadContainer.active);\n\n // on keydown, if scroll is at the bottom and next page records are available, fetch next page items.\n if (!this._loadingItems && !this.dataProvider.isLastPage && index + 1 > matches.length - 1) {\n // index is saved in order to select the lastSelected item in the dropdown after fetching next page items.\n this.lastSelectedIndex = index;\n this.loadMoreData(true);\n }\n }\n\n private setLastActiveMatchAsSelected() {\n if (this.lastSelectedIndex) {\n (this.typeaheadContainer as any)._active = this.typeaheadContainer.matches[this.lastSelectedIndex];\n this.typeaheadContainer.nextActiveMatch();\n this.lastSelectedIndex = undefined;\n }\n }\n\n private triggerSearch() {\n if (this.dataProvider.isLastPage || !this.$element.hasClass('full-screen')) {\n return;\n }\n const typeAheadDropDown = this.dropdownEl;\n const $lastItem = typeAheadDropDown.find('li').last();\n\n // Check if last item is not below the full screen\n if ($lastItem.length && typeAheadDropDown.length && (typeAheadDropDown.height() + typeAheadDropDown.position().top > $lastItem.height() + $lastItem.position().top)) {\n this.loadMoreData(true);\n }\n }\n\n private isUpdateOnKeyPress() {\n return this.searchon === 'typing';\n }\n\n private debounceDefaultQuery(data) {\n this._defaultQueryInvoked = true;\n this.getDataSource(data, true).then((response) => {\n if (response.length) {\n this.queryModel = response;\n this._lastQuery = this.query = this.queryModel[0].label || '';\n this._modelByValue = this.queryModel[0].value;\n this._modelByKey = this.queryModel[0].key;\n this.showClosebtn = (this.query !== '');\n } else {\n this._modelByValue = undefined;\n this.queryModel = undefined;\n this.query = '';\n }\n if (this.clearData) {\n if (get((this.typeahead as any), '_typeahead.isShown')) {\n this.typeahead.hide();\n }\n }\n });\n }\n\n private updateByDatavalue(data) {\n this.updateByDataset(data);\n this.updateByDataSource(data);\n }\n\n private updateByDataSource(data) {\n // value is present but the corresponding key is not found then fetch next set\n // modelByKey will be set only when datavalue is available inside the localData otherwise make a N/w call.\n if (isDefined(data) && !isObject(data) && this.datasource && !isDefined(this._modelByKey) && this.datafield !== ALLFIELDS) {\n // Avoid making default query if queryModel already exists.\n if (isDefined(this.queryModel) && !isEmpty(this.queryModel)) {\n this.updateDatavalueFromQueryModel();\n return;\n }\n\n // Make default query call only when datasource supports CRUD (live variable).\n if (!this._defaultQueryInvoked && this.datasource.execute(DataSource.Operation.SUPPORTS_CRUD)) {\n this.debounceDefaultQuery(data);\n }\n }\n }\n\n // updates the model value using queryModel\n private updateDatavalueFromQueryModel() {\n if (isDefined(this.queryModel)) {\n this._modelByValue = isArray(this.queryModel) ? (this.queryModel[0] as DataSetItem).value : this.queryModel;\n this._modelByKey = isArray(this.queryModel) ? (this.queryModel[0] as DataSetItem).key : this.queryModel;\n this.toBeProcessedDatavalue = undefined;\n }\n }\n\n private updateByDataset(data: any) {\n // default query is already invoked then do not make other default query call.\n // For local search i.e. searchkey is undefined, do not return, verify the datavalue against the datasetItems .\n if (this._defaultQueryInvoked && this.searchkey) {\n return;\n }\n const selectedItem = find(this.datasetItems, (item) => {\n return (isObject(item.value) ? isEqual(item.value, data) : (toString(item.value)).toLowerCase() === (toString(data)).toLowerCase());\n });\n\n // set the default only when it is available in dataset.\n if (selectedItem) {\n this.queryModel = [selectedItem];\n } else if (this.datafield === ALLFIELDS && isObject(data)) {\n this.queryModel = this.getTransformedData(extractDataAsArray(data));\n } else {\n // resetting the queryModel only when prevDatavalue is equal to data\n if ((this as any).prevDatavalue !== data) {\n this.queryModel = undefined;\n if (!data || data === '') {\n this.query = '';\n }\n return;\n }\n }\n this.updateDatavalueFromQueryModel();\n\n // Show the label value on input.\n this._lastQuery = this.query = isDefined(this.queryModel) && this.queryModel.length ? get(this.queryModel[0], 'label') : '';\n this.showClosebtn = (this.query !== '');\n }\n\n // If we have last search results then open dropdown on focus\n private handleFocus($event) {\n if (this.type === 'search' && this.query === this._lastQuery && this._lastResult) {\n (this.typeahead as any).keyUpEventEmitter.emit(this.query);\n }\n }\n handleInputBlur($event: FocusEvent) {\n this.queryModel = [{\n key: this.query,\n value: this.query,\n label: this.query\n }];\n this._modelByValue = this.query;\n this.datavalue = this.query;\n }\n\n public notifySubscriber() {\n const parentEl = $(this.nativeElement).closest('.app-composite-widget.caption-floating');\n if (parentEl.length > 0) {\n this.app.notify('captionPositionAnimate', {displayVal: true, nativeEl: parentEl});\n }\n }\n\n // This method returns a promise that provides the filtered data from the datasource.\n public getDataSource(query: Array<string> | string, searchOnDataField?: boolean, nextItemIndex?: number): Promise<DataSetItem[]> {\n // For default query, searchOnDataField is set to true, then do not make a n/w call when datafield is ALLFIELDS\n if (searchOnDataField && this.datafield === ALLFIELDS) {\n this._loadingItems = false;\n return Promise.resolve([]);\n }\n\n // For default datavalue, search key as to be on datafield to get the default data from the filter call.\n const dataConfig: IDataProviderConfig = {\n dataset: this.dataset ? convertDataToObject(this.dataset) : undefined,\n binddataset: this.binddataset,\n datasource: this.datasource,\n datafield: this.datafield,\n hasData: this.dataset && this.dataset.length,\n query: query,\n isLocalFilter: !this.searchkey,\n searchKey: searchOnDataField ? this.datafield : this.searchkey,\n // default search call match mode should be startignorecase\n matchMode: searchOnDataField ? 'startignorecase' : this.matchmode,\n casesensitive: this.casesensitive,\n isformfield: this.isformfield,\n orderby: this.orderby,\n limit: this.limit,\n pagesize: this.pagesize,\n page: this.page,\n onBeforeservicecall: this.invokeOnBeforeServiceCall.bind(this)\n };\n\n if (this.dataoptions) {\n dataConfig.dataoptions = this.dataoptions;\n dataConfig.viewParent = this.viewParent;\n }\n\n this._loadingItems = true;\n\n return this.dataProvider.filter(dataConfig)\n .then((response: any) => {\n // response from dataProvider returns always data object.\n response = response.data || response;\n // for service variable, updating the dataset only if it is not defined or empty\n if ((!isDefined(this.dataset) || !this.dataset.length) && this.dataProvider.updateDataset) {\n this.dataset = response;\n }\n\n if (this.dataProvider.hasMoreData) {\n this.formattedDataset = this.formattedDataset.concat(response);\n } else {\n this.formattedDataset = response;\n }\n\n // explicitly setting the optionslimit as the matches more than 20 will be ignored if optionslimit is not specified.\n if (this.formattedDataset.length > 20 && !isDefined(this.limit)) {\n this.typeahead.typeaheadOptionsLimit = this.formattedDataset.length;\n }\n\n // In mobile, trigger the search by default until the results have height upto page height. Other results can be fetched by scrolling\n if (this._isOpen && this.isMobileAutoComplete() && !isUndefined(this.dataProvider.isLastPage) && !this.dataProvider.isLastPage) {\n this.triggerSearch();\n }\n\n const transformedData = this.getTransformedData(this.formattedDataset, nextItemIndex);\n\n // result contains the datafield values.\n this.result = map(transformedData, 'value');\n return transformedData;\n }, (error) => {\n this._loadingItems = false;\n return [];\n }\n ).then(result => {\n if (this.isScrolled) {\n (debounce(() => {\n this.setLastActiveMatchAsSelected();\n }, 30))();\n this.isScrolled = false;\n }\n // When no result is found, set the datavalue to undefined.\n if (!result.length) {\n this._modelByValue = undefined;\n this.queryModel = (query as string);\n }\n // on focusout i.e. on other widget focus, if n/w is pending loading icon is shown, when data is available then dropdown is shown again.\n // on unsubscribing do not show the results.\n if (this._unsubscribeDv) {\n result = [];\n }\n this._loadingItems = false;\n this._lastResult = result;\n return result;\n });\n }\n\n // this method returns the parent context i.e. Page context and not parent component's context.\n private getContext(context) {\n if (context && get(context, 'widget')) {\n return this.getContext(context.viewParent);\n }\n return context;\n }\n\n public getTransformedData(data: any, itemIndex?: number, iscustom?: boolean): DataSetItem[] {\n if (isDefined(itemIndex)) {\n itemIndex++;\n }\n\n const transformedData = transformFormData(\n this.getContext(this.viewParent),\n data,\n this.datafield,\n {\n displayField: this.displaylabel || this.displayfield,\n displayExpr: iscustom ? '' : this.displayexpression,\n bindDisplayExpr: iscustom ? '' : this.binddisplaylabel,\n bindDisplayImgSrc: this.binddisplayimagesrc,\n displayImgSrc: this.displayimagesrc\n },\n itemIndex,\n this\n );\n return getUniqObjsByDataField(transformedData, this.datafield, this.displayfield || this.displaylabel, toBoolean(this.allowempty));\n }\n\n // OptionsListTemplate listens to the scroll event and triggers this function.\n public onScroll($scrollEl: Element, evt: Event) {\n const totalHeight = $scrollEl.scrollHeight,\n clientHeight = $scrollEl.clientHeight;\n\n // If scroll is at the bottom and no request is in progress and next page records are available, fetch next page items.\n if (!this._loadingItems && !this.dataProvider.isLastPage && ($scrollEl.scrollTop + clientHeight >= totalHeight)) {\n this.loadMoreData(true);\n }\n }\n\n public ngOnInit() {\n super.ngOnInit();\n\n if (!isDefined(this.minchars)) {\n // for autocomplete set the minchars to 0\n if (this.type === 'autocomplete') {\n this.minchars = 0;\n } else {\n this.minchars = 1;\n }\n }\n\n this.listenQuery = this.isUpdateOnKeyPress();\n\n // by default for autocomplete do not show the search icon\n // by default show the searchicon for type = search\n this.showsearchicon = isDefined(this.showsearchicon) ? this.showsearchicon : (this.type === 'search');\n }\n\n public ngAfterViewInit() {\n super.ngAfterViewInit();\n\n styler(this.nativeElement as HTMLElement, this);\n this.containerTarget = getContainerTargetClass(this.nativeElement);\n this.nativeElement.querySelector('input')?.addEventListener('blur', this.handleInputBlur.bind(this));\n }\n\n public ngAfterViewChecked() {\n const searchInputEl = $('.app-search-input');\n if (searchInputEl) {\n searchInputEl.removeAttr('aria-expanded');\n }\n }\n\n private eventData($event, item) {\n if ($event) {\n $event['data'] = {\n item : item.dataObject,\n model : item.value,\n label : item.label,\n query : this.query\n };\n }\n\n return $event;\n }\n\n // triggered on select on option from the list. Set the queryModel, query and modelByKey from the matched item.\n public typeaheadOnSelect(match: TypeaheadMatch, $event: Event): void {\n const item = match.item;\n this.queryModel = item;\n item.selected = true;\n this.query = item.label;\n this.showClosebtn = (this.query !== '');\n $event = $event || this.$typeaheadEvent;\n\n // As item.key can vary from key in the datasetItems\n this._modelByKey = item.key;\n this._modelByValue = item.value;\n\n $event = this.eventData($event, item);\n\n this.invokeOnTouched();\n this.invokeOnChange(this.datavalue, $event || {});\n // updating the variable bound to default value as invokeOnChange is not updating the variable.\n if (this.datavalue !== (this as any).prevDatavalue) {\n this.updateBoundVariable(this.datavalue);\n }\n if (this.$element.hasClass('full-screen')) {\n this.closeSearch();\n }\n this.invokeEventCallback('select', { $event, selectedValue: this.datavalue });\n this.invokeEventCallback('submit', { $event });\n\n this.updatePrevDatavalue(this.datavalue);\n }\n\n onPropertyChange(key: string, nv: any, ov: any) {\n if (key === 'tabindex') {\n return;\n }\n\n // Backward compatability from 10.3.1 to 10.3.2\n // 10.3.1 we had displaylabel as modal value\n // From 10.3.2 onwords we will be having displayexpresion as modal value\n if (this.type === 'autocomplete' && key === 'displaylabel' && this.displaylabel && (!this.displayexpression || (this.displayexpression && !this.datasource))) {\n this.displayexpression = this.displaylabel;\n this.displaylabel = undefined;\n }\n\n // when dataoptions are provided and there is no displaylabel given then displaylabel is set as the relatedfield\n if (key === 'displaylabel' && this.dataoptions && this.binddisplaylabel === null) {\n this.query = get(this._modelByValue, nv) || this._modelByValue;\n }\n\n // when search is disabled, do not load any more data or just clear the data that is already in process or loaded.\n if (key === 'disabled') {\n if (nv === false) {\n this.clearData = false;\n } else {\n this.clearData = true;\n if (get((this.typeahead as any), '_typeahead.isShown')) {\n this.typeahead.hide();\n }\n }\n }\n\n super.onPropertyChange(key, nv, ov);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.SearchComponent","filter"],"mappings":";;;;;;;;;;;;;;;;;MAUa,mBAAmB,CAAA;IAG5B,WAAY,CAAA,GAAa,EAAU,SAA0B,EAAA;QAA1B,IAAS,CAAA,SAAA,GAAT,SAAS;QACxC,IAAI,CAAC,UAAU,GAAG,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC;;IAGzC,kBAAkB,GAAA;;AAEd,QAAA,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,gBAAgB,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACtF,QAAA,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC;AAC3D,QAAA,IAAI,CAAC,SAAiB,CAAC,cAAc,EAAE;;IAG5C,eAAe,GAAA;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,oBAAoB,EAAE,EAAE;;AAExC,YAAA,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE;AACpE,YAAA,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,UAAU,EAAE,CAAC;;;AAI5D,IAAA,YAAY,CAAC,GAAU,EAAA;AAC3B,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,GAAG,CAAC;;oHAvBtD,mBAAmB,EAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,CAAA,iBAAA,CAAAA,eAAA,CAAA,CAAA,CAAA,EAAA,CAAA;oEAAnB,mBAAmB,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,YAAA,EAAA,EAAA,CAAA,CAAA,EAAA,UAAA,EAAA,IAAA,EAAA,CAAA,CAAA;;iFAAnB,mBAAmB,EAAA,CAAA;cAJ/B,SAAS;AAAC,QAAA,IAAA,EAAA,CAAA;AACT,gBAAA,UAAU,EAAE,IAAI;AACd,gBAAA,QAAQ,EAAE;AACb,aAAA;;;ACNM,MAAM,WAAW,GAAG,IAAI,GAAG,CAC9B;IACI,CAAC,eAAe,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,CAAC;IACpD,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,iBAAiB,EAAE,EAAE,KAAK,EAAE,sBAAsB,EAAE,GAAG,WAAW,EAAE,CAAC;IACtE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,GAAG,WAAW,EAAE,CAAC;IACtD,CAAC,aAAa,EAAE,QAAQ,CAAC;IACzB,CAAC,SAAS,EAAE,QAAQ,CAAC;IACrB,CAAC,YAAY,EAAE,QAAQ,CAAC;IACxB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,iBAAiB,EAAE,QAAQ,CAAC;IAC7B,CAAC,YAAY,EAAE,WAAW,CAAC;IAC3B,CAAC,UAAU,EAAE,YAAY,CAAC;IAC1B,CAAC,iBAAiB,EAAE,WAAW,CAAC;IAChC,CAAC,cAAc,EAAE,WAAW,CAAC;IAC7B,CAAC,mBAAmB,EAAE,WAAW,CAAC;IAElC,CAAC,QAAQ,EAAE,YAAY,CAAC;IACxB,CAAC,SAAS,EAAE,WAAW,CAAC;IACxB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,WAAW,EAAE,CAAC;IACjD,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,gBAAgB,EAAE,EAAE,KAAK,EAAE,kBAAkB,EAAE,GAAG,WAAW,EAAE,CAAC;IACjE,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,MAAM,EAAE,WAAW,CAAC;IACrB,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,CAAC;IACnD,CAAC,SAAS,EAAE,WAAW,CAAC;IACxB,CAAC,aAAa,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACpD,CAAC,UAAU,EAAE,WAAW,CAAC;IACzB,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,UAAU,EAAE,YAAY,CAAC;IAC1B,CAAC,UAAU,EAAE,YAAY,CAAC;IAC1B,CAAC,WAAW,EAAE,WAAW,CAAC;IAC1B,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IACjD,CAAC,aAAa,EAAE,WAAW,CAAC;IAC5B,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,YAAY,EAAE,CAAC;IAC1C,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,YAAY,EAAE,CAAC;IAChD,CAAC,gBAAgB,EAAE,YAAY,CAAC;IAChC,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,WAAW,EAAE,CAAC;IAC1C,CAAC,MAAM,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,WAAW,EAAE,CAAC;IAC7C,CAAC,cAAc,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,WAAW,EAAE,CAAC;IAChD,CAAC,OAAO,EAAE,WAAW,CAAC;IACtB,CAAC,sBAAsB,EAAE,EAAC,KAAK,EAAE,aAAa,EAAE,GAAG,WAAW,EAAC,CAAC;IAChE,CAAC,qBAAqB,EAAE,EAAC,KAAK,EAAE,kBAAkB,EAAE,GAAG,WAAW,EAAC,CAAC;IACpE,CAAC,iBAAiB,EAAE,EAAC,KAAK,EAAE,mBAAmB,EAAE,GAAG,WAAW,EAAC,CAAC;AACpE,CAAA,CACJ;AAEM,MAAM,aAAa,GAAG,MAAK;AAC9B,IAAA,QAAQ,CACJ,WAAW,EACX,WAAW,CACd;IACD,kBAAkB,CACd,cAAc,CAAC,YAAY,EAC3B,IAAI,GAAG,CAAC,WAAW,CAAC,CACvB;IACD,kBAAkB,CACd,cAAc,CAAC,SAAS,EACxB,IAAI,GAAG,CAAC,WAAW,CAAC,CACvB;AACL,CAAC;;MClDY,iBAAiB,CAAA;AAClB,IAAA,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,UAAW,EAAA;AAC7C,QAAA,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,KAAK;AAClD,QAAA,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;AAC/B,YAAA,OAAO,UAAU,CAAC,KAAK,EAAE,SAAS,CAAC;;AAChC,aAAA,IAAI,QAAQ,CAAC,UAAU,EAAE,KAAK,CAAC,EAAE;AACpC,YAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;;AAC9B,aAAA,IAAI,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE;AACtC,YAAA,OAAO,OAAO,CAAC,KAAK,EAAE,SAAS,CAAC;;AAEpC,QAAA,OAAO,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;;;AAI9B,IAAA,MAAM,CAAC,MAA2B,EAAA;AACrC,QAAA,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO;AAC9B,QAAA,IAAI,aAAa,GAAG,MAAM,CAAC,aAAa;AACxC,QAAA,MAAM,SAAS,GAAG,MAAM,CAAC,SAAS;;QAElC,IAAI,SAAS,IAAI,CAAC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC,EAAE;YACjD,aAAa,GAAG,IAAI;;AAExB,QAAA,IAAI,SAAS,GAAG,MAAM,CAAC,KAAK,EAC5B,YAAY;QAEZ,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACnC;;;AAGG;AACH,YAAA,IAAI,MAAM,CAAC,SAAS,EAAE;gBAClB,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC;gBAEzC,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,IAAS,KAAI;AAChD,oBAAA,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAG;AACnB,wBAAA,IAAI,CAAC,GAAG,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,EAClB,CAAC,GAAG,SAAS;wBACjB,IAAI,CAAC,aAAa,EAAE;4BAChB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;4BACxB,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;;wBAE5B,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC;AAC5C,qBAAC,CAAC;AACN,iBAAC,CAAC;;iBACC;;;AAGH,gBAAA,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;AAC1C,oBAAA,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,IAAG;wBACnC,IAAI,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;wBAC/B,IAAI,CAAC,aAAa,EAAE;AAChB,4BAAA,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;;AAEd,4BAAA,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;;wBAElC,OAAO,IAAI,CAAC,WAAW,CAAC,CAAC,EAAE,SAAS,CAAC;AACzC,qBAAC,CAAC;;qBACC;AACH,oBAAA,YAAY,GAAG,MAAM,CAAC,OAAO,EAAE,KAAK,IAAG;wBACnC,IAAI,CAAC,aAAa,EAAE;AAChB,4BAAA,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC;;AAEtB,4BAAA,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;;wBAElC,OAAO,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,SAAS,EAAE,SAAS,CAAC;AACxD,qBAAC,CAAC;;;AAGV,YAAA,OAAO,CAAC;AACJ,gBAAA,IAAI,EAAE,YAAY;AAClB,gBAAA,WAAW,EAAE,KAAK;AAClB,gBAAA,UAAU,EAAE;AACf,aAAA,CAAC;AACN,SAAC,CAAC;;AAET;;MCtFY,kBAAkB,CAAA;AACpB,IAAA,MAAM,CAAC,MAA2B,EAAA;AACrC,QAAA,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;;AAGjH,IAAA,UAAU,CAAC,MAAM,EAAA;AACrB,QAAA,IAAI,MAAM,CAAC,WAAW,EAAE;AACpB,YAAA,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW;AAEtC,YAAA,MAAM,aAAa,GAAG,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC;;;AAIhG,YAAA,IAAI,WAAW,CAAC,YAAY,EAAE;gBAC1B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACnC,oBAAA,0BAA0B,CAAC,MAAM,CAAC,UAAU,EAAE,WAAW,CAAC,UAAU,EAAE,CAAC,iBAAiB,KAAI;wBACxF,aAAa,CAAC,UAAU,GAAG,WAAW,CAAC,UAAU,GAAG,iBAAiB;AACrE,wBAAA,WAAW,CAAC,UAAU,GAAG,iBAAiB;AAE1C,wBAAA,MAAM,CAAC,UAAU,CAAC,OAAO,CACrB,UAAU,CAAC,SAAS,CAAC,sBAAsB,EAAE,MAAM,CAAC,EAAC,YAAY,EAAE,WAAW,CAAC,YAAY,EAAC,EAAE,aAAa,CAAC,CAC/G,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;AAC3B,qBAAC,CAAC;AACN,iBAAC,CAAC;;;AAGN,YAAA,IAAI,WAAW,CAAC,aAAa,EAAE;gBAC3B,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAC5B,UAAU,CAAC,SAAS,CAAC,2BAA2B,EAChD;AACI,oBAAA,QAAQ,EAAE,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,QAAQ;oBACzC,IAAI,EAAE,MAAM,CAAC,IAAI;oBACjB,MAAM,EAAE,WAAW,CAAC,aAAa;oBACjC,UAAU,EAAE,WAAW,CAAC,SAAS;oBACjC,YAAY,EAAE,MAAM,CAAC,WAAW,CAAC,YAAY,EAAE,aAAa,CAAC,YAAY,CAAC;oBAC1E,UAAU,EAAE,eAAe,CAAC,WAAW,CAAC,UAAU,IAAI,EAAE;AAE3D,iBAAA,CACJ;;;;AAKT,QAAA,OAAO,MAAM,CAAC,UAAU,CAAC,OAAO,CAC5B,UAAU,CAAC,SAAS,CAAC,cAAc,EAAE,MAAM,CAC9C;;;AAKK,IAAA,MAAM,CAAC,IAAY,EAAE,QAAgB,EAAE,UAAkB,EAAE,cAAuB,EAAA;;AAExF,QAAA,IAAI,QAAQ,KAAK,YAAY,CAAC,aAAa,EAAE;AACzC,YAAA,OAAO,cAAc,KAAK,CAAC,IAAI,cAAc,GAAG,UAAU;;AAE9D,QAAA,MAAM,SAAS,IAAI,CAAC,QAAQ,GAAG,UAAU,KAAK,IAAI,CAAC,IAAI,CAAC,QAAQ,GAAG,UAAU,CAAC,KAAK,QAAQ,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACzG,OAAO,IAAI,KAAK,SAAS;;;IAInB,kBAAkB,CAAC,QAAa,EAAE,IAAS,EAAA;QACjD,MAAM,eAAe,GAAG,QAAQ,CAAC,SAAS,GAAG,QAAQ,CAAC;AACtD,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC;;QAG1C,IAAI,YAAY,EAAE;YACd,MAAM,OAAO,GAAG,EAAE;AAClB,YAAA,GAAG,CAAC,OAAO,EAAE,eAAe,EAAE,YAAY,CAAC;AAC3C,YAAA,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;;aACd;;AAEH,YAAA,IAAI,GAAG,CAAC,IAAI,CAAC;;AAGjB,QAAA,OAAO,IAAI;;IAGL,eAAe,GAAA;AACrB,QAAA,OAAO,EAAE;;AAGL,IAAA,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAA;AACnE,QAAA,OAAO,IAAI,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,aAAa,KAAK,YAAY,CAAC,aAAa;;;IAK1F,eAAe,CAAC,MAA2B,EAAE,QAAQ,EAAA;AAC3D,QAAA,IAAI,IAAI,GAAQ,QAAQ,CAAC,IAAI;AAC7B,QAAA,IAAI,aAAkB;AACtB,QAAA,IAAI,WAAoB;AACxB,QAAA,IAAI,IAAY;AAChB,QAAA,IAAI,eAAwB;QAE5B,MAAM,eAAe,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,GAAG,CAAC;QACtD,MAAM,cAAc,GAAG,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;QAChG,MAAM,EAAE,GAAG,MAAM;QAEjB,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,KAAI;AACnC,YAAA,MAAM,WAAW,GAAG,QAAQ,CAAC,UAAU;AAEvC,YAAA,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,WAAW,CAAC,EAAE;AAC7D,gBAAA,IAAI,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC;AAC7B,gBAAA,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,MAAM,CAAC,KAAK,KAAK,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,gBAAgB,CAAC;gBAChJ,eAAe,GAAG,IAAI;AAEtB,gBAAA,IAAI,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,EAAE;oBACnF,WAAW,GAAG,IAAI;AAClB,oBAAA,OAAO,CAAC;AACJ,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,UAAU,EAAE,WAAW;wBACvB,WAAW,EAAE,IAAI,GAAG,CAAC;wBACrB,eAAe;wBACf;AACH,qBAAA,CAAC;oBACF;;;;YAIR,IAAI,cAAc,EAAE;AAChB,gBAAA,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE;oBACf,MAAM,KAAK,GAAG,cAAc,CAAC,WAAW,CAAC,EAAE,CAAC;AAC5C,oBAAA,IAAG,KAAK,GAAG,CAAC,CAAC,EAAC;wBACV,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC;AACjD,wBAAA,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,WAAW,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;;;AAEhE,qBAAA,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvB,oBAAA,aAAa,GAAG,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC;;AAE7C,gBAAA,IAAI,GAAG,aAAa,IAAI,IAAI;;AAEhC,YAAA,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAChB,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,CAAC;;;AAG3D,YAAA,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;gBACd,OAAO,CAAC,EAAC,IAAI,EAAE,EAAE,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,eAAe,EAAE,IAAI,EAAC,CAAC;;iBACvF;gBACH,OAAO,CAAC,EAAC,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,eAAe,EAAE,IAAI,EAAC,CAAC;;AAEpG,SAAC,CAAC;;AAET;;MC9GY,YAAY,CAAA;AAQd,IAAA,SAAA,IAAA,CAAA,kBAAkB,GAAG,IAAI,kBAAkB,EAAE,CAAC;AAC9C,IAAA,SAAA,IAAA,CAAA,iBAAiB,GAAG,IAAI,iBAAiB,EAAE,CAAC;AAE5C,IAAA,MAAM,CAAC,MAA2B,EAAA;AAErC,QAAA,IAAI,OAAqB;AAEzB;;;;;AAKG;QACH,MAAM,oBAAoB,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC;AACpI,QAAA,IAAI,CAAC,MAAM,CAAC,aAAa,KAAK,MAAM,CAAC,WAAW,KAAK,CAAC,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,YAAY,CAAC;AAChI,eAAA,MAAM,CAAC;eACP,oBAAoB,CAAC,CAAC,EAAE;YAC3B,OAAO,GAAG,YAAY,CAAC,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC;;aACrD;YACH,OAAO,GAAG,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC;;AAG3D,QAAA,OAAO,OAAO,CAAC,IAAI,CAAC,QAAQ,IAAG;YAC3B,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC,UAAU,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,IAAI,oBAAoB;AAChI,YAAA,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC,WAAW;AACvC,YAAA,IAAI,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;AACrC,YAAA,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI;AACzB,YAAA,IAAI,CAAC,eAAe,GAAG,QAAQ,CAAC,eAAe;AAE/C,YAAA,OAAO,QAAQ;AACnB,SAAC,CAAC;;;;;;;;;;;;;;ICvEF,EAAkE,CAAA,SAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,CAAA;;;;IAA3B,EAA0B,CAAA,WAAA,CAAA,OAAA,EAAA,MAAA,CAAA,UAAA,CAAA;IAA5D,EAAoB,CAAA,UAAA,CAAA,KAAA,EAAA,QAAA,CAAA,MAAA,EAAA,EAAA,CAAA,aAAA,CAAA;;;IAF7B,EAAG,CAAA,cAAA,CAAA,CAAA,EAAA,GAAA,CAAA;IACD,EAAoB,CAAA,UAAA,CAAA,CAAA,EAAA,kEAAA,EAAA,CAAA,EAAA,CAAA,EAAA,KAAA,EAAA,CAAA,CAAA;IAGpB,EAAwF,CAAA,SAAA,CAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA;IAC1F,EAAI,CAAA,YAAA,EAAA;;;;;;;IAJF,EAEC,CAAA,SAAA,EAAA;IAFD,EAEC,CAAA,aAAA,CAAA,QAAA,CAAA,MAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;IACK,EAAqB,CAAA,SAAA,EAAA;AAAC,IAAtB,sCAAqB,CAAqD,WAAA,EAAA,MAAA,CAAA,SAAA,CAAA,QAAA,EAAA,QAAA,CAAA,IAAA,QAAA,CAAA,KAAA,EAAA,EAAA,CAAA,cAAA,CAAA;;;IAKlF,EAAwH,CAAA,cAAA,CAAA,CAAA,EAAA,GAAA,EAAA,CAAA,CAAA;IACtH,EAAoC,CAAA,SAAA,CAAA,CAAA,EAAA,KAAA,EAAA,CAAA,CAAA;IACtC,EAAI,CAAA,YAAA,EAAA;;;;IAFD,EAAqC,CAAA,UAAA,CAAA,SAAA,EAAA,EAAA,CAAA,eAAA,CAAA,CAAA,EAAA,GAAA,EAAA,MAAA,CAAA,OAAA,CAAA,CAAA,CAAA,gBAAA,EAAA,MAAA,CAAA,OAAA,CAA4C,CAAmC,qBAAA,EAAA,QAAA,CAAA,IAAA,CAAA;;;AADzH,IATA,iFAAgB,CASD,CAAA,EAAA,oDAAA,EAAA,CAAA,EAAA,CAAA,EAAA,GAAA,EAAA,CAAA,CAAA;;;IATf,EAOC,CAAA,aAAA,CAAA,CAAA,MAAA,CAAA,OAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;IAED,EAIC,CAAA,SAAA,EAAA;IAJD,EAIC,CAAA,aAAA,CAAA,MAAA,CAAA,OAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;IAWO,EAAwB,CAAA,cAAA,CAAA,CAAA,EAAA,IAAA,EAAA,EAAA,CAAA;IAAA,EAAe,CAAA,MAAA,CAAA,CAAA,CAAA;IAAA,EAAK,CAAA,YAAA,EAAA;;;IAApB,EAAe,CAAA,SAAA,EAAA;IAAf,EAAe,CAAA,iBAAA,CAAA,QAAA,CAAA,KAAA,CAAA;;;IAGvC,EAEe,CAAA,kBAAA,CAAA,CAAA,EAAA,EAAA,CAAA;;;;;;;;AADb,IADY,mDAAiC,CACuC,yBAAA,EAAA,EAAA,CAAA,eAAA,CAAA,CAAA,EAAA,GAAA,EAAA,QAAA,CAAA,IAAA,EAAA,aAAA,EAAA,QAAA,EAAA,SAAA,CAAA,CAAA;;;;IAT1F,EAEuI,CAAA,cAAA,CAAA,CAAA,EAAA,IAAA,EAAA,EAAA,EAAA,CAAA,CAAA;IAArI,EADA,CAAA,UAAA,CAAA,YAAA,EAAA,SAAA,qEAAA,GAAA,EAAA,MAAA,QAAA,GAAA,EAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,SAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAc,gDAAsC,CAAE,CAAA,EAAA,CAAA,CAAA,OAAA,EAAA,SAAA,gEAAA,CAAA,MAAA,EAAA,EAAA,MAAA,QAAA,GAAA,EAAA,CAAA,aAAA,CAAA,GAAA,CAAA,CAAA,SAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,QAAA,IAAA,CACnC,mBAAgB,IAAI,MAAA,CAAA,kBAAA,CAAA,WAAA,CAAA,QAAA,EAAA,MAAA,CAA6C,CAA4B,CAAA,MAAA,CAAA,eAAA,GAAA,MAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,gBAAA,EAAkB,CAAE,CAAA,EAAA,CAAA;AAKpI,IAHA,4FAAwB,CAGC,CAAA,EAAA,0DAAA,EAAA,CAAA,EAAA,CAAA,EAAA,cAAA,EAAA,EAAA,CAAA;IAK3B,EAAK,CAAA,YAAA,EAAA;;;;IAZW,EAA8H,CAAA,UAAA,CAAA,SAAA,EAAA,EAAA,CAAA,eAAA,CAAA,CAAA,EAAA,GAAA,EAAA,MAAA,CAAA,kBAAA,IAAA,MAAA,CAAA,kBAAA,CAAA,QAAA,CAAA,QAAA,CAAA,EAAA,QAAA,IAAA,QAAA,CAAA,QAAA,EAAA,CAAA,CAAA;IAI5I,EAEC,CAAA,SAAA,CAAA,CAAA,CAAA;IAFD,EAEC,CAAA,aAAA,CAAA,QAAA,CAAA,QAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;IACD,EAIC,CAAA,SAAA,EAAA;IAJD,EAIC,CAAA,aAAA,CAAA,CAAA,QAAA,CAAA,QAAA,EAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;;;IAbP,EAA2D,CAAA,cAAA,CAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,CAAA;IACzD,EAcC,CAAA,gBAAA,CAAA,CAAA,EAAA,4CAAA,EAAA,CAAA,EAAA,CAAA,EAAA,IAAA,EAAA,EAAA,EAAA,EAAA,CAAA,yBAAA,CAAA;IACD,EAA8F,CAAA,cAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA;IAC5F,EAA6C,CAAA,SAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;IAC/C,EAAM,CAAA,YAAA,EAAA;IACN,EAA8C,CAAA,cAAA,CAAA,CAAA,EAAA,KAAA,EAAA,EAAA,CAAA;AAE5C,IADA,wBAA4C,CACA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;AAEhD,IADE,iBAAM,EACH;;;;IAtBH,EAcC,CAAA,SAAA,CAAA,CAAA,CAAA;IAdD,EAcC,CAAA,UAAA,CAAA,WAAA,CAAA;IACmB,EAAyE,CAAA,SAAA,CAAA,CAAA,CAAA;IAAzE,EAAyE,CAAA,UAAA,CAAA,QAAA,EAAA,MAAA,CAAA,aAAA,IAAA,EAAA,MAAA,CAAA,eAAA,IAAA,MAAA,CAAA,YAAA,CAAA,UAAA,CAAA,CAAA;IACrF,EAA+B,CAAA,SAAA,EAAA;IAA/B,EAA+B,CAAA,UAAA,CAAA,aAAA,EAAA,MAAA,CAAA,eAAA,CAAA;IAEnB,EAAyB,CAAA,SAAA,EAAA;IAAzB,EAAyB,CAAA,UAAA,CAAA,QAAA,EAAA,CAAA,MAAA,CAAA,aAAA,CAAA;IAErC,EAA8B,CAAA,SAAA,CAAA,CAAA,CAAA;IAA9B,EAA8B,CAAA,UAAA,CAAA,aAAA,EAAA,MAAA,CAAA,cAAA,CAAA;;;;IAOxC,EAkCmD,CAAA,cAAA,CAAA,CAAA,EAAA,OAAA,EAAA,EAAA,CAAA;IA5BjD,EAAmB,CAAA,gBAAA,CAAA,eAAA,EAAA,SAAA,qEAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,EAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,KAAA,MAAA,CAAA,KAAA,GAAA,MAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA;AAkBnB,IANA,EALA,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,6DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAS,MAAqB,CAAA,aAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,+LACN,IAAI,CAAA,CAAA,EAAA,CAAC,6NACY,MAAwB,CAAA,gBAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,oMAC9C,MAAkB,CAAA,UAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,CAChC,MAAA,EAAA,SAAA,4DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,eAAA,CAAA,MAAA,CAAuB,KAAC,CACvB,OAAA,EAAA,SAAA,6DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,WAAA,CAAA,MAAA,CAAmB,KAAE,CACJ,OAAA,EAAA,SAAA,6DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,MAAA,CAAA,cAAA,GAAA,KAAK,uBAAgB,IAAI,CAAA,CAAE,0BAAmB,CAAE,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,aAAA,CAAA,MAAA,CAAqB,KAAE,CACrF,UAAA,EAAA,SAAA,gEAAA,GAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,UAAA,EAAY,KAAC,CAGS,kBAAA,EAAA,SAAA,wEAAA,GAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,aAAA,CAAA,CAAA,EAAA,CAAA,CAAA,mBAAA,EAAA,SAAA,yEAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CACb,gCAAyB,CAAC,CAAA,EAAA,CAAA;IAxBjD,EAkCmD,CAAA,YAAA,EAAA;IACnD,EAA0F,CAAA,cAAA,CAAA,CAAA,EAAA,GAAA,EAAA,EAAA,CAAA;AAA/B,IAAA,EAAA,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,yDAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAS,0BAAmB,CAAE,CAAA,EAAA,CAAA;IAAC,EAAI,CAAA,YAAA,EAAA;;;;;IAnCvF,EAAqB,CAAA,UAAA,CAAA,OAAA,EAAA,MAAA,CAAA,KAAA,IAAA,EAAA,CAAA,CAAA,aAAA,EAAA,MAAA,CAAA,WAAA,IAAA,EAAA,CAA6G,CAGlH,UAAA,EAAA,MAAA,CAAA,QAAA,CAAA;IAGrB,EAAmB,CAAA,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,KAAA,CAAA;IACnB,EAAqC,CAAA,UAAA,CAAA,gBAAA,EAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,GAAA,CAAA,CAAA,CAAA,UAAA,EAAA,MAAA,CAAA,QAAA,CAChB,CACY,WAAA,EAAA,MAAA,CAAA,mBAAA,CAAA,CAAA,iBAAA,EAAA,MAAA,CAAA,YAAA,CACD,CACY,uBAAA,EAAA,sBAAA,CAAA,CAAA,qBAAA,EAAA,sBAAA,CACF,CASX,oBAAA,EAAA,MAAA,CAAA,QAAA,CAAA,CAAA,uBAAA,EAAA,MAAA,CAAA,KAAA,CACA,CAImB,qBAAA,EAAA,MAAA,CAAA,OAAA,GAAA,SAAA,GAAA,IAAA,CAAA,CAAA,gBAAA,EAAA,IAAA,CAC3B,CACK,qBAAA,EAAA,IAAA,CAAA,CAAA,kBAAA,EAAA,IAAA,CACH,CACwC,kCAAA,EAAA,MAAA,CAAA,4BAAA,CAAA,CAAA,QAAA,EAAA,MAAA,CAAA,MAAA,CAChD,CACI,UAAA,EAAA,MAAA,CAAA,QAAA,CAAA;;IAGW,EAAwB,CAAA,SAAA,EAAA;IAAxB,EAAwB,CAAA,UAAA,CAAA,QAAA,EAAA,CAAA,MAAA,CAAA,YAAA,CAAA;;;IAwCxD,EAA2F,CAAA,SAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;;;;IAK3F,EAAmE,CAAA,cAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA,CAAA,CAAA,EAAA,MAAA,CAC3D,CAE+B,CAAA,EAAA,QAAA,EAAA,EAAA,CAAA;AAAjC,IAAA,EAAA,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,6EAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,CAAA,CAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAS,6BAAsB,CAAC,CAAA,EAAA,CAAA;IAChC,EAA4C,CAAA,SAAA,CAAA,CAAA,EAAA,GAAA,CAAA;IAAA,EAAS,CAAA,YAAA,EAAA,EAChD,EACF;;;IANH,EAAkC,CAAA,UAAA,CAAA,SAAA,EAAA,EAAA,CAAA,eAAA,CAAA,CAAA,EAAA,GAAA,EAAA,MAAA,CAAA,QAAA,CAAA,CAAA;IAEb,EAAqB,CAAA,SAAA,CAAA,CAAA,CAAA;IAArB,EAAqB,CAAA,UAAA,CAAA,UAAA,EAAA,MAAA,CAAA,QAAA,CAAA;IAEvC,EAAoC,CAAA,SAAA,EAAA;IAApC,EAAoC,CAAA,sBAAA,CAAA,WAAA,EAAA,MAAA,CAAA,eAAA,EAAA,EAAA,CAAA;;;;IA/C/C,EAAqH,CAAA,cAAA,CAAA,CAAA,EAAA,QAAA,EAAA,EAAA,CAAA;AAAxB,IAAA,EAAA,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,8DAAA,GAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAS,oBAAa,CAAC,CAAA,EAAA,CAAA;IAAC,EAAgD,CAAA,SAAA,CAAA,CAAA,EAAA,GAAA,CAAA;IAAA,EAAS,CAAA,YAAA,EAAA;IAC9K,EAAsB,CAAA,cAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;IAAA,EAAW,CAAA,MAAA,CAAA,CAAA,EAAA,aAAA,CAAA;IAAA,EAAO,CAAA,YAAA,EAAA;IACxC,EAiCkD,CAAA,cAAA,CAAA,CAAA,EAAA,OAAA,EAAA,EAAA,CAAA;IA3BhD,EAAmB,CAAA,gBAAA,CAAA,eAAA,EAAA,SAAA,qEAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,EAAA,CAAA,kBAAA,CAAA,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,KAAA,MAAA,CAAA,KAAA,GAAA,MAAA,CAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,CAAA,EAAA,CAAA;AAiBnB,IANA,EAJA,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,6DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAS,MAAqB,CAAA,aAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,+LACN,IAAI,CAAA,CAAA,EAAA,CAAC,6NACY,MAAwB,CAAA,gBAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,oMAC9C,MAAkB,CAAA,UAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAC,CAChC,MAAA,EAAA,SAAA,4DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,MAAA,CAAA,eAAA,CAAA,MAAA,CAAuB,wBAAE,MAAY,CAAA,UAAA,EAAA,CAAA,CAAA,EAAA,CAAC,4KACrC,MAAmB,CAAA,WAAA,CAAA,MAAA,CAAA,CAAA,CAAA,EAAA,CAAE,8KACJ,KAAK,CAAA,CAAA,MAAA,CAAA,WAAA,GAAgB,IAAI,CAAA,CAAE,0BAAmB,CAAE,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,aAAA,CAAA,MAAA,CAAqB,KAAC,CAG9D,kBAAA,EAAA,SAAA,wEAAA,GAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,aAAA,CAAA,CAAA,EAAA,CAAA,CAAA,mBAAA,EAAA,SAAA,yEAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CACb,gCAAyB,CAAC,CAAA,EAAA,CAAA;IAvBjD,EAiCkD,CAAA,YAAA,EAAA;IAClD,EAA0G,CAAA,SAAA,CAAA,CAAA,EAAA,OAAA,EAAA,EAAA,CAAA;IAC1G,EAAqB,CAAA,UAAA,CAAA,CAAA,EAAA,oDAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;IAGrB,EAA0J,CAAA,cAAA,CAAA,CAAA,EAAA,QAAA,EAAA,EAAA,CAAA;IAApC,EAAS,CAAA,UAAA,CAAA,OAAA,EAAA,SAAA,8DAAA,CAAA,MAAA,EAAA,EAAA,EAAA,CAAA,aAAA,CAAA,IAAA,CAAA,CAAA,CAAA,MAAA,MAAA,GAAA,EAAA,CAAA,aAAA,EAAA,CAAA,CAAA,OAAA,EAAA,CAAA,WAAA,CAAA,MAAA,CAAA,WAAA,CAAA,MAAA,EAAoB,IAAI,CAAC,CAAC,CAAA,EAAA,CAAA;IAAC,EAAiD,CAAA,SAAA,CAAA,CAAA,EAAA,GAAA,CAAA;IAAA,EAAS,CAAA,YAAA,EAAA;IACpN,EAAsB,CAAA,cAAA,CAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;IAAA,EAAY,CAAA,MAAA,CAAA,EAAA,EAAA,cAAA,CAAA;IAAA,EAAO,CAAA,YAAA,EAAA;IACzC,EAAsB,CAAA,UAAA,CAAA,EAAA,EAAA,qDAAA,EAAA,CAAA,EAAA,CAAA,EAAA,MAAA,EAAA,EAAA,CAAA;;;;;IA1CkG,EAAwC,CAAA,SAAA,EAAA;IAAxC,EAAwC,CAAA,sBAAA,CAAA,WAAA,EAAA,MAAA,CAAA,mBAAA,EAAA,EAAA,CAAA;IAEzJ,EAAqB,CAAA,SAAA,CAAA,CAAA,CAAA;AAG1B,IAHK,EAAqB,CAAA,UAAA,CAAA,OAAA,EAAA,MAAA,CAAA,KAAA,IAAA,EAAA,CAAA,CAAA,aAAA,EAAA,MAAA,CAAA,WAAA,IAAA,EAAA,CAA6G,kDAE7F,CACrB,UAAA,EAAA,MAAA,CAAA,QAAA,CAAA;IAGrB,EAAmB,CAAA,gBAAA,CAAA,SAAA,EAAA,MAAA,CAAA,KAAA,CAAA;IACnB,EAAqC,CAAA,UAAA,CAAA,gBAAA,EAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,GAAA,CAAA,CAAA,CAAA,UAAA,EAAA,MAAA,CAAA,QAAA,CAChB,CACY,WAAA,EAAA,MAAA,CAAA,mBAAA,CAAA,CAAA,iBAAA,EAAA,MAAA,CAAA,YAAA,CACD,CACY,uBAAA,EAAA,sBAAA,CAAA,CAAA,qBAAA,EAAA,sBAAA,CACF,CAQX,oBAAA,EAAA,MAAA,CAAA,QAAA,CAAA,CAAA,uBAAA,EAAA,MAAA,CAAA,KAAA,CACA,CAImB,qBAAA,EAAA,MAAA,CAAA,OAAA,GAAA,SAAA,GAAA,IAAA,CAAA,CAAA,gBAAA,EAAA,IAAA,CAC3B,CACK,qBAAA,EAAA,IAAA,CAAA,CAAA,kBAAA,EAAA,IAAA,CACH,CACwC,kCAAA,EAAA,MAAA,CAAA,4BAAA,CAAA,CAAA,UAAA,EAAA,MAAA,CAAA,QAAA,CAC5C,CACJ,QAAA,EAAA,MAAA,CAAA,MAAA,CAAA;;IAInB,EAEC,CAAA,SAAA,CAAA,CAAA,CAAA;IAFD,EAEC,CAAA,aAAA,CAAA,MAAA,CAAA,aAAA,GAAA,CAAA,GAAA,CAAA,CAAA,CAAA;IAC0E,EAA0C,CAAA,SAAA,EAAA;IAA1C,EAA0C,CAAA,UAAA,CAAA,SAAA,EAAA,EAAA,CAAA,eAAA,CAAA,EAAA,EAAA,GAAA,EAAA,MAAA,CAAA,cAAA,EAAA,CAAA,CAAA;IAAwC,EAAyC,CAAA,SAAA,EAAA;IAAzC,EAAyC,CAAA,sBAAA,CAAA,WAAA,EAAA,MAAA,CAAA,oBAAA,EAAA,EAAA,CAAA;IAEtM,EAQG,CAAA,SAAA,CAAA,CAAA,CAAA;IARH,EAQG,CAAA,aAAA,CAAA,MAAA,CAAA,cAAA,GAAA,EAAA,GAAA,CAAA,CAAA,CAAA;;AC5EL,MAAM,aAAa,GAAG,EAAE,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,aAAa,EAAE;AAarE,MAAO,eAAgB,SAAQ,yBAAyB,CAAA;AACnD,IAAA,SAAA,IAAA,CAAA,eAAe,GAAG,aAAa,EAAhB,CAAmB;;AA+DzC,IAAA,IAAI,UAAU,GAAA;QACV,OAAO,IAAI,CAAC,WAAW;;IAG3B,IAAI,UAAU,CAAC,EAAE,EAAA;AACb,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,sBAAsB;AAC1D,QAAA,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC;;IAGhC,WACI,CAAA,GAAa,EACb,GAAQ,EAC4B,aAAa,EACf,WAAW,EACL,eAAoB,EAAA;AAE5D,QAAA,KAAK,CAAC,GAAG,EAAE,aAAa,EAAE,eAAe,CAAC;QAJN,IAAa,CAAA,aAAA,GAAb,aAAa;QACf,IAAW,CAAA,WAAA,GAAX,WAAW;QAzE1C,IAAK,CAAA,KAAA,GAAG,EAAE;QAaT,IAAI,CAAA,IAAA,GAAG,CAAC;;AAiEZ,QAAA,IAAI,CAAC,UAAU,GAAG,KAAK;AACvB,QAAA,IAAI,CAAC,GAAG,GAAG,GAAG;QACd,QAAQ,CAAC,IAAI,CAAC,aAAa,EAAE,YAAY,EAAE,IAAI,CAAC;AAEhD;;;;AAIG;QACH,IAAI,CAAC,mBAAmB,GAAG;AACtB,aAAA,MAAM,CAAC,CAAC,QAAa,KAAI;;AAEtB,YAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;AACjC,gBAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AACzB,gBAAA,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;;;;;AAM7B,YAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACxB,gBAAA,IAAI,CAAC,SAAS,CAAC,UAAU,GAAG,SAAS;;AAE7C,SAAC,CAAC,CAAC,IAAI,CACHC,QAAM,CAAC,MAAK;AACR,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;YAC1B,QAAQ,IAAI,CAAC,QAAQ,KAAK,CAAC,KAAK,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC;AACrF,SAAC,CAAC,EACF,QAAQ,CAAC,CAAC,KAAa,KAAK,IAAI,CAAC,yBAAyB,CAAC,KAAK,CAAC,CAAC,CACrE;AAEL,QAAA,IAAI,CAAC,YAAY,GAAG,IAAI,YAAY,EAAE;AAEtC;;;AAGG;QACH,MAAM,qBAAqB,GAAG,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAA2B,KAAI;AAEpF,YAAA,MAAM,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG,CAAW;YAErD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE;AAChC,gBAAA,IAAI,CAAC,aAAa,GAAG,EAAE;;gBAEvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,GAAG,EAAE;;AAEjC,gBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;gBAC5B;;AAGJ,YAAA,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;AACtB,gBAAA,IAAI,CAAC,oBAAoB,GAAG,KAAK;;AAEjC,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAK,IAAY,CAAC,aAAa,KAAK,GAAG,EAAE;AACvD,oBAAA,IAAI,CAAC,WAAW,GAAG,SAAS;AAC5B,oBAAA,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE;AACzD,wBAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;AACjB,oBAAA,IAAI,CAAC,UAAU,GAAG,EAAE;;;;AAI1B,gBAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC;;;YAI/B,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;AAC3C,SAAC,CAAC;QACF,IAAI,CAAC,uBAAuB,CAAC,MAAM,qBAAqB,CAAC,WAAW,EAAE,CAAC;QAEvE,MAAM,mBAAmB,GAAG,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAK;;YAErD,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,MAAM;AAC1C,YAAA,IAAI,CAAC,WAAW,GAAG,SAAS;YAC5B,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,sBAAsB;;AAElE,YAAA,IAAI,SAAS,CAAC,YAAY,CAAC,EAAE;AACzB,gBAAA,IAAI,CAAC,eAAe,CAAC,YAAY,CAAC;;AAE1C,SAAC,CAAC;QACF,IAAI,CAAC,uBAAuB,CAAC,MAAM,mBAAmB,CAAC,WAAW,EAAE,CAAC;;;IAIjE,WAAW,CAAC,MAAM,EAAE,WAAW,EAAA;AACnC,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,UAAU,GAAG,KAAK;AACpC,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QACxB,IAAI,WAAW,EAAE;AACb,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,YAAA,IAAI,CAAC,cAAc,GAAG,KAAK;YAC3B,IAAI,CAAC,YAAY,EAAE;;AAEvB,QAAA,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC;AACvC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;QAE1B,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE;;;;IAKhD,SAAS,GAAA;AACZ,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,YAAY,GAAG,KAAK;;;IAIrB,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC;;AAEb,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;AAChC,QAAA,IAAI,CAAC,OAAO,GAAG,SAAS;AACxB,QAAA,IAAI,CAAC,QAAQ,GAAG,SAAS;AACzB,QAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,aAAa,CAAC;AACxC,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE5B,QAAA,IAAI,CAAC,WAAW,GAAG,KAAK;AACxB,QAAA,IAAI,CAAC,cAAc,GAAG,IAAI;AAC1B,QAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;IAGjB,wBAAwB,GAAA;;QAE5B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;YAC1B,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;AACtC,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC;;QAEhE,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;;AAExC,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;AAEvB,YAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC;;AAGrC,YAAA,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,EAAE;gBAC5B,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC;;;;;QAK7C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACvC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE;;;AAI/C,IAAA,yBAAyB,CAAC,KAAa,EAAA;;;QAG3C,IAAI,IAAI,CAAC,UAAU,KAAK,KAAK,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,cAAc,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE;AACpG,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,OAAO,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC;;AAG/B;;;;;AAKE;AACF,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,SAAS,EAAE;YAChF,IAAI,qBAAqB,GAAG,EAAE;YAC9B,MAAM,cAAc,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;AACjD,YAAA,IAAI,YAAY;AAChB,YAAA,IAAI,IAAI,CAAC,gBAAgB,EAAE;gBACvB,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC,gBAAgB,EAAE,GAAG,CAAC;AACzD,gBAAA,IAAI,qBAAqB,CAAC,MAAM,KAAK,CAAC,EAAE;oBACpC,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE;wBAC1C,MAAM,KAAK,GAAG,WAAW;AACzB,wBAAA,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;;yBACnD;wBACH,YAAY,GAAG,IAAI;;;;AAI/B,YAAA,KAAK,qBAAqB,CAAC,MAAM,GAAG,CAAC,KAAK,YAAY,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC;AAC1F,oBAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC,GAAG;AACnF,gBAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC;;;AAGrB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;QAC5B,OAAO,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;;AAGhC,IAAA,WAAW,CAAC,IAAiB,EAAE,SAAiB,EAAE,aAAuB,EAAE,MAAW,EAAA;AAC5F,QAAA,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,SAAS,CAAC,EAAE;YACvE,KAAK,CAAC,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,CAAC;;;;IAKzD,SAAS,CAAC,KAAqB,EAAE,KAAa,EAAA;AAClD,QAAA,IAAI,IAAI,CAAC,kBAAkB,EAAE;;YAExB,KAAa,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;YAClD,OAAO,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC;;;;AAKtD,IAAA,aAAa,CAAC,CAAC,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,CAAC,EAAE;YACT,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;;aACjC;AACH,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;AACjD,YAAA,IAAI,UAAU,CAAC,MAAM,EAAE;AACnB,gBAAA,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;;iBACvD;AACH,gBAAA,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;;;;;IAMlE,oBAAoB,GAAA;QACvB,OAAO,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,QAAQ,EAAE;;;IAI9C,cAAc,GAAA;AACjB,QAAA,OAAO,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,YAAY;;AAGtC,IAAA,YAAY,CAAC,aAAuB,EAAA;AACxC,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;YAC9B;;;AAGJ,QAAA,IAAI,CAAC,IAAI,GAAG,aAAa,GAAG,IAAI,CAAC,IAAI,GAAG,CAAC,GAAG,IAAI,CAAC,IAAI;AAErD,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;;QAGzB,IAAI,aAAa,EAAE;AACf,YAAA,IAAI,CAAC,UAAU,GAAG,SAAS;;;AAI/B,QAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACnB,YAAA,MAAM,EAAE;gBACJ,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG;AACjC;AACJ,SAAA,CAAC;;;IAIE,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK;;AAE1B,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC;;QAEb,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,OAAO,EAAE;AACnC,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;;AAE5B,QAAA,IAAI,CAAC,OAAO,GAAG,KAAK;;AAEpB,QAAA,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS,IAAK,IAAI,CAAC,SAAiB,CAAC,UAAU,EAAE;YACzE,IAAI,CAAC,SAAiB,CAAC,UAAU,CAAC,SAAS,GAAG,IAAI;;;AAInD,IAAA,aAAa,CAAC,MAAM,EAAA;;AAExB,QAAA,IAAI,CAAC,MAAM,GAAG,EAAE;AAChB,QAAA,IAAI,CAAC,IAAI,GAAG,CAAC;AACb,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE;AAC5C,QAAA,IAAI,CAAC,aAAa,GAAG,SAAS;;AAG9B,QAAA,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,EAAE;AACnB,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;AACpB,YAAA,IAAI,CAAC,aAAa,GAAG,EAAE;AACvB,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC;YACzC,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,IAAI,CAAC;YAEjD,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC;;YAG7C,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,CAAC,EAAE;gBAC9B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;;;aAE/C;;AAEH,YAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE;AAC/B,gBAAA,MAAM,EAAE,MAAM;AACd,gBAAA,MAAM,EAAE,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC,KAAK;gBACxC,MAAM,EAAG,IAAY,CAAC;AACzB,aAAA,CAAC;;QAEN,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;;;AAInC,IAAA,gBAAgB,CAAC,MAAM,EAAA;;QAE3B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,gBAAgB,CAAC,EAAE;AACxC,YAAA,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;;;;AAI3B,IAAA,cAAc,CAAC,MAAa,EAAA;AAChC,QAAA,IAAI,IAAI;;AAER,QAAA,MAAM,YAAY,GAAG,IAAI,CAAC,kBAAkB,EAAE,MAAM,EAAE,KAAK,KAAK,IAAI,CAAC,KAAK;AAE1E,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,IAAI,YAAY,EAAE;YAC3E,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,IAAI;;QAE9C,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;;AAG3C,QAAA,IAAI,CAAC,IAAI,CAAC,kBAAkB,EAAE,EAAE;AAC5B,YAAA,IAAI,CAAC,WAAW,GAAG,IAAI;;AAEvB,YAAA,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC;AACnB,gBAAA,MAAM,EAAE;AACJ,oBAAA,KAAK,EAAE,IAAI,CAAC,KAAK;AACpB;AACJ,aAAA,CAAC;YACF;;;AAGJ,QAAA,IAAI,IAAI,CAAC,kBAAkB,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,YAAY,EAAE;AACnE,YAAA,IAAI,CAAC,kBAAkB,CAAC,iBAAiB,EAAE;;aACxC;AACH,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK;YAC5B,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;;;AAI9C,IAAA,yBAAyB,CAAC,SAAS,EAAA;QACvC,IAAI,CAAC,mBAAmB,CAAC,mBAAmB,EAAE,EAAE,SAAS,EAAE,CAAC;;IAGxD,cAAc,GAAA;AAClB,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;AAChB,YAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;;;AAIzB,QAAA,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAK;AACrB,YAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,IAAK,IAAI,CAAC,SAAiB,CAAC,UAAU,CAAC,QAAQ;YACjG,IAAI,CAAC,kBAA0B,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;YAC5D,IAAI,CAAC,kBAA0B,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;YAC3D,uBAAuB,CAAC,CAAC,CAAC,qBAAqB,CAAC,EAAE,IAAI,CAAC,aAAa,EAAG,IAAI,CAAC,SAAiB,CAAC,UAAU,EAAE,CAAC,CAAC,oCAAoC,CAAC,CAAC;AAEtJ,SAAC,CAAC;AAEF,QAAA,EAAE,EAAE;;AAGJ,QAAA,IAAI,IAAI,CAAC,oBAAoB,EAAE,EAAE;YAC7B,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;gBACxC,IAAI,CAAC,wBAAwB,EAAE;;YAEnC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,qBAAqB,CAAC;AAEjE,YAAA,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;AAC3D,YAAA,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,MAAM,EAAE;AACnE,YAAA,UAAU,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,YAAY,GAAG,IAAI,EAAE,CAAC;AAC7E,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE;AAEnD,YAAA,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAC7E,IAAI,CAAC,aAAa,EAAE;;;;IAKxB,UAAU,GAAA;AACd,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO;QAE/C,IAAI,CAAC,OAAO,EAAE;YACV;;AAEJ,QAAA,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;;QAG7D,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,KAAK,GAAG,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE;;AAExF,YAAA,IAAI,CAAC,iBAAiB,GAAG,KAAK;AAC9B,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;;IAIvB,4BAA4B,GAAA;AAChC,QAAA,IAAI,IAAI,CAAC,iBAAiB,EAAE;AACvB,YAAA,IAAI,CAAC,kBAA0B,CAAC,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC;AAClG,YAAA,IAAI,CAAC,kBAAkB,CAAC,eAAe,EAAE;AACzC,YAAA,IAAI,CAAC,iBAAiB,GAAG,SAAS;;;IAIlC,aAAa,GAAA;AACjB,QAAA,IAAI,IAAI,CAAC,YAAY,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACxE;;AAEJ,QAAA,MAAM,iBAAiB,GAAG,IAAI,CAAC,UAAU;QACzC,MAAM,SAAS,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;;AAGrD,QAAA,IAAI,SAAS,CAAC,MAAM,IAAI,iBAAiB,CAAC,MAAM,KAAK,iBAAiB,CAAC,MAAM,EAAE,GAAG,iBAAiB,CAAC,QAAQ,EAAE,CAAC,GAAG,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,EAAE;AACjK,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;;IAIvB,kBAAkB,GAAA;AACtB,QAAA,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ;;AAG7B,IAAA,oBAAoB,CAAC,IAAI,EAAA;AAC7B,QAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI;AAChC,QAAA,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,KAAI;AAC7C,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;AACjB,gBAAA,IAAI,CAAC,UAAU,GAAG,QAAQ;AAC1B,gBAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE;gBAC7D,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,KAAK;gBAC7C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,GAAG;gBACzC,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;;iBACpC;AACH,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,gBAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;AAEnB,YAAA,IAAI,IAAI,CAAC,SAAS,EAAE;gBAChB,IAAI,GAAG,CAAE,IAAI,CAAC,SAAiB,EAAE,oBAAoB,CAAC,EAAE;AACpD,oBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;;AAGjC,SAAC,CAAC;;AAGE,IAAA,iBAAiB,CAAC,IAAI,EAAA;AAC1B,QAAA,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;AAC1B,QAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC;;AAGzB,IAAA,kBAAkB,CAAC,IAAI,EAAA;;;AAG3B,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;;AAEvH,YAAA,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;gBACzD,IAAI,CAAC,6BAA6B,EAAE;gBACpC;;;AAIJ,YAAA,IAAI,CAAC,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC,aAAa,CAAC,EAAE;AAC3F,gBAAA,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;;;;;IAMnC,6BAA6B,GAAA;AACjC,QAAA,IAAI,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE;YAC5B,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAiB,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU;YAC3G,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,GAAI,IAAI,CAAC,UAAU,CAAC,CAAC,CAAiB,CAAC,GAAG,GAAG,IAAI,CAAC,UAAU;AACvG,YAAA,IAAI,CAAC,sBAAsB,GAAG,SAAS;;;AAIvC,IAAA,eAAe,CAAC,IAAS,EAAA;;;QAG7B,IAAI,IAAI,CAAC,oBAAoB,IAAI,IAAI,CAAC,SAAS,EAAE;YAC7C;;QAEJ,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,IAAI,KAAI;AAClD,YAAA,QAAQ,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE;AACtI,SAAC,CAAC;;QAGF,IAAI,YAAY,EAAE;AACd,YAAA,IAAI,CAAC,UAAU,GAAG,CAAC,YAAY,CAAC;;aAC7B,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE;AACvD,YAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAC;;aAChE;;AAEH,YAAA,IAAK,IAAY,CAAC,aAAa,KAAK,IAAI,EAAE;AACtC,gBAAA,IAAI,CAAC,UAAU,GAAG,SAAS;AAC3B,gBAAA,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,EAAE,EAAE;AACtB,oBAAA,IAAI,CAAC,KAAK,GAAG,EAAE;;gBAEnB;;;QAGR,IAAI,CAAC,6BAA6B,EAAE;;AAGpC,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,EAAE;QAC3H,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;;;AAInC,IAAA,WAAW,CAAC,MAAM,EAAA;AACtB,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,WAAW,EAAE;YAC7E,IAAI,CAAC,SAAiB,CAAC,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC;;;AAGlE,IAAA,eAAe,CAAC,MAAkB,EAAA;QAC1B,IAAI,CAAC,UAAU,GAAG,CAAC;gBACf,GAAG,EAAE,IAAI,CAAC,KAAK;gBACf,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC;AACf,aAAA,CAAC;AACF,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK;AAC/B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK;;IAG5B,gBAAgB,GAAA;AACnB,QAAA,MAAM,QAAQ,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,wCAAwC,CAAC;AACxF,QAAA,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE;AACrB,YAAA,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,wBAAwB,EAAE,EAAC,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAC,CAAC;;;;AAKlF,IAAA,aAAa,CAAC,KAA6B,EAAE,iBAA2B,EAAE,aAAsB,EAAA;;QAEnG,IAAI,iBAAiB,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS,EAAE;AACnD,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,OAAO,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;;;AAI9B,QAAA,MAAM,UAAU,GAAwB;AACpC,YAAA,OAAO,EAAE,IAAI,CAAC,OAAO,GAAG,mBAAmB,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,SAAS;YACrE,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM;AAC5C,YAAA,KAAK,EAAE,KAAK;AACZ,YAAA,aAAa,EAAE,CAAC,IAAI,CAAC,SAAS;AAC9B,YAAA,SAAS,EAAE,iBAAiB,GAAG,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS;;YAE9D,SAAS,EAAE,iBAAiB,GAAG,iBAAiB,GAAG,IAAI,CAAC,SAAS;YACjE,aAAa,EAAE,IAAI,CAAC,aAAa;YACjC,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,mBAAmB,EAAE,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI;SAChE;AAED,QAAA,IAAI,IAAI,CAAC,WAAW,EAAE;AAClB,YAAA,UAAU,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW;AACzC,YAAA,UAAU,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU;;AAG3C,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI;AAEzB,QAAA,OAAO,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU;AACrC,aAAA,IAAI,CAAC,CAAC,QAAa,KAAI;;AAEpB,YAAA,QAAQ,GAAG,QAAQ,CAAC,IAAI,IAAI,QAAQ;;YAEpC,IAAI,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,IAAI,CAAC,YAAY,CAAC,aAAa,EAAE;AACvF,gBAAA,IAAI,CAAC,OAAO,GAAG,QAAQ;;AAG3B,YAAA,IAAI,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE;gBAC/B,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC;;iBAC3D;AACH,gBAAA,IAAI,CAAC,gBAAgB,GAAG,QAAQ;;;AAIpC,YAAA,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;gBAC7D,IAAI,CAAC,SAAS,CAAC,qBAAqB,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM;;;YAInE,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,oBAAoB,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;gBAChI,IAAI,CAAC,aAAa,EAAE;;AAGxB,YAAA,MAAM,eAAe,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,gBAAgB,EAAE,aAAa,CAAC;;YAGjF,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,eAAe,EAAE,OAAO,CAAC;AAC/C,YAAA,OAAO,eAAe;AAC1B,SAAC,EAAE,CAAC,KAAK,KAAI;AACT,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,OAAO,EAAE;AACb,SAAC,CACA,CAAC,IAAI,CAAC,MAAM,IAAG;AACZ,YAAA,IAAI,IAAI,CAAC,UAAU,EAAE;gBACjB,CAAC,QAAQ,CAAC,MAAK;oBACX,IAAI,CAAC,4BAA4B,EAAE;AACvC,iBAAC,EAAE,EAAE,CAAC,GAAG;AACT,gBAAA,IAAI,CAAC,UAAU,GAAG,KAAK;;;AAG3B,YAAA,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;AAChB,gBAAA,IAAI,CAAC,aAAa,GAAG,SAAS;AAC9B,gBAAA,IAAI,CAAC,UAAU,GAAI,KAAgB;;;;AAIvC,YAAA,IAAI,IAAI,CAAC,cAAc,EAAE;gBACrB,MAAM,GAAG,EAAE;;AAEf,YAAA,IAAI,CAAC,aAAa,GAAG,KAAK;AAC1B,YAAA,IAAI,CAAC,WAAW,GAAG,MAAM;AACzB,YAAA,OAAO,MAAM;AACjB,SAAC,CAAC;;;AAIF,IAAA,UAAU,CAAC,OAAO,EAAA;QACtB,IAAI,OAAO,IAAI,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC,EAAE;YACnC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC;;AAE9C,QAAA,OAAO,OAAO;;AAGX,IAAA,kBAAkB,CAAC,IAAS,EAAE,SAAkB,EAAE,QAAkB,EAAA;AACvE,QAAA,IAAI,SAAS,CAAC,SAAS,CAAC,EAAE;AACtB,YAAA,SAAS,EAAE;;AAGf,QAAA,MAAM,eAAe,GAAG,iBAAiB,CACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,EAChC,IAAI,EACJ,IAAI,CAAC,SAAS,EACd;AACI,YAAA,YAAY,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY;YACpD,WAAW,EAAE,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,iBAAiB;YACnD,eAAe,EAAE,QAAQ,GAAG,EAAE,GAAG,IAAI,CAAC,gBAAgB;YACtD,iBAAiB,EAAE,IAAI,CAAC,mBAAmB;YAC3C,aAAa,EAAE,IAAI,CAAC;AACvB,SAAA,EACD,SAAS,EACT,IAAI,CACP;QACD,OAAO,sBAAsB,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;;IAI/H,QAAQ,CAAC,SAAkB,EAAE,GAAU,EAAA;QAC1C,MAAM,WAAW,GAAG,SAAS,CAAC,YAAY,EACtC,YAAY,GAAG,SAAS,CAAC,YAAY;;QAGzC,IAAI,CAAC,IAAI,CAAC,aAAa,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,UAAU,KAAK,SAAS,CAAC,SAAS,GAAG,YAAY,IAAI,WAAW,CAAC,EAAE;AAC7G,YAAA,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;;;IAIxB,QAAQ,GAAA;QACX,KAAK,CAAC,QAAQ,EAAE;QAEhB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;;AAE3B,YAAA,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,EAAE;AAC9B,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;;iBACd;AACH,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC;;;AAIzB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,kBAAkB,EAAE;;;QAI5C,IAAI,CAAC,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;;IAGlG,eAAe,GAAA;QAClB,KAAK,CAAC,eAAe,EAAE;AAEvB,QAAA,MAAM,CAAC,IAAI,CAAC,aAA4B,EAAE,IAAI,CAAC;QAC/C,IAAI,CAAC,eAAe,GAAG,uBAAuB,CAAC,IAAI,CAAC,aAAa,CAAC;QAClE,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,gBAAgB,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;IAGjG,kBAAkB,GAAA;AACrB,QAAA,MAAM,aAAa,GAAG,CAAC,CAAC,mBAAmB,CAAC;QAC5C,IAAI,aAAa,EAAE;AACf,YAAA,aAAa,CAAC,UAAU,CAAC,eAAe,CAAC;;;IAIzC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAA;QAC1B,IAAI,MAAM,EAAE;YACR,MAAM,CAAC,MAAM,CAAC,GAAG;gBACb,IAAI,EAAI,IAAI,CAAC,UAAU;gBACvB,KAAK,EAAG,IAAI,CAAC,KAAK;gBAClB,KAAK,EAAG,IAAI,CAAC,KAAK;gBAClB,KAAK,EAAG,IAAI,CAAC;aAChB;;AAGL,QAAA,OAAO,MAAM;;;IAIV,iBAAiB,CAAC,KAAqB,EAAE,MAAa,EAAA;AACzD,QAAA,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI;AACvB,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI;AACpB,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK;QACvB,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,EAAE,CAAC;AACvC,QAAA,MAAM,GAAG,MAAM,IAAI,IAAI,CAAC,eAAe;;AAGvC,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG;AAC3B,QAAA,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,KAAK;QAE/B,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC;QAErC,IAAI,CAAC,eAAe,EAAE;QACtB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,IAAI,EAAE,CAAC;;QAEjD,IAAI,IAAI,CAAC,SAAS,KAAM,IAAY,CAAC,aAAa,EAAE;AAChD,YAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;;QAE5C,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,CAAC,EAAE;YACvC,IAAI,CAAC,WAAW,EAAE;;AAEtB,QAAA,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QAC7E,IAAI,CAAC,mBAAmB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,CAAC;AAE9C,QAAA,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC,SAAS,CAAC;;AAG5C,IAAA,gBAAgB,CAAC,GAAW,EAAE,EAAO,EAAE,EAAO,EAAA;AAC1C,QAAA,IAAI,GAAG,KAAK,UAAU,EAAE;YACpB;;;;;AAMJ,QAAA,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,YAAY,KAAK,CAAC,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,iBAAiB,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,EAAG;AAC3J,YAAA,IAAI,CAAC,iBAAiB,GAAG,IAAI,CAAC,YAAY;AAC1C,YAAA,IAAI,CAAC,YAAY,GAAG,SAAS;;;AAIjC,QAAA,IAAI,GAAG,KAAK,cAAc,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,gBAAgB,KAAK,IAAI,EAAE;AAC9E,YAAA,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,EAAE,CAAC,IAAI,IAAI,CAAC,aAAa;;;AAIlE,QAAA,IAAI,GAAG,KAAK,UAAU,EAAE;AACpB,YAAA,IAAI,EAAE,KAAK,KAAK,EAAE;AACd,gBAAA,IAAI,CAAC,SAAS,GAAG,KAAK;;iBACnB;AACH,gBAAA,IAAI,CAAC,SAAS,GAAG,IAAI;gBACrB,IAAI,GAAG,CAAE,IAAI,CAAC,SAAiB,EAAE,oBAAoB,CAAC,EAAE;AACpD,oBAAA,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;;;;QAKjC,KAAK,CAAC,gBAAgB,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,CAAC;;AAh1B9B,IAAA,SAAA,IAAA,CAAA,IAAA,GAAA,SAAA,uBAAA,CAAA,iBAAA,EAAA,EAAA,OAAA,KAAA,iBAAA,IAAA,eAAe,EA6ET,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,CAAA,GAAA,CAAA,EAAA,EAAA,CAAA,iBAAA,CAAA,gBAAgB,CAChB,EAAA,EAAA,CAAA,iBAAA,CAAA,cAAc,wBACjB,kBAAkB,EAAA,CAAA,CAAA,CAAA,CAAA,EAAA,CAAA;oEA/ErB,eAAe,EAAA,SAAA,EAAA,CAAA,CAAA,EAAA,EAAA,UAAA,EAAA,EAAA,CAAA,CAAA,EAAA,SAAA,EAAA,SAAA,qBAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;2BAmCb,kBAAkB,EAAA,CAAA,CAAA;;;;;;;;AAzClB,SAAA,EAAA,EAAA,UAAA,EAAA,IAAA,EAAA,QAAA,EAAA,CAAA,EAAA,CAAA,kBAAA,CAAA;AACP,gBAAA,SAAS,CAAC,eAAe,EAAE,iBAAiB,EAAE,IAAI,CAAC;AACnD,gBAAA,SAAS,CAAC,eAAe,EAAE,aAAa,EAAE,IAAI,CAAC;gBAC/C,kBAAkB,CAAC,eAAe;AACrC,aAAA,CAAA,EAAA,EAAA,CAAA,0BAAA,EAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,KAAA,EAAA,GAAA,EAAA,KAAA,EAAA,CAAA,EAAA,IAAA,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,CAAA,oBAAA,EAAA,EAAA,CAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,CAAA,EAAA,CAAA,WAAA,EAAA,EAAA,CAAA,EAAA,CAAA,YAAA,EAAA,EAAA,CAAA,EAAA,CAAA,kBAAA,EAAA,EAAA,EAAA,CAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,qBAAA,CAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,CAAA,EAAA,KAAA,EAAA,OAAA,CAAA,EAAA,CAAA,CAAA,EAAA,OAAA,EAAA,WAAA,CAAA,EAAA,CAAA,KAAA,EAAA,QAAA,EAAA,CAAA,EAAA,KAAA,CAAA,EAAA,CAAA,0BAAA,EAAA,EAAA,CAAA,EAAA,CAAA,YAAA,EAAA,EAAA,EAAA,CAAA,EAAA,YAAA,EAAA,eAAA,CAAA,EAAA,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,CAAA,CAAA,EAAA,QAAA,EAAA,CAAA,EAAA,QAAA,CAAA,EAAA,CAAA,CAAA,EAAA,aAAA,CAAA,EAAA,CAAA,CAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,SAAA,CAAA,EAAA,CAAA,CAAA,EAAA,YAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,CAAA,EAAA,aAAA,CAAA,EAAA,CAAA,CAAA,EAAA,kBAAA,EAAA,yBAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,cAAA,EAAA,EAAA,EAAA,WAAA,EAAA,MAAA,EAAA,cAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,CAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,UAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,kCAAA,EAAA,QAAA,EAAA,UAAA,CAAA,EAAA,CAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,OAAA,EAAA,QAAA,CAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,EAAA,KAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,UAAA,EAAA,CAAA,EAAA,OAAA,CAAA,EAAA,CAAA,CAAA,EAAA,SAAA,CAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,cAAA,EAAA,EAAA,EAAA,cAAA,EAAA,KAAA,EAAA,sBAAA,EAAA,OAAA,EAAA,CAAA,EAAA,aAAA,EAAA,cAAA,EAAA,cAAA,EAAA,kBAAA,EAAA,CAAA,EAAA,eAAA,EAAA,OAAA,EAAA,SAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,mBAAA,EAAA,OAAA,EAAA,aAAA,EAAA,WAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,qBAAA,EAAA,gBAAA,EAAA,qBAAA,EAAA,kBAAA,EAAA,kCAAA,EAAA,UAAA,EAAA,QAAA,CAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,UAAA,EAAA,UAAA,EAAA,IAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,EAAA,cAAA,CAAA,EAAA,CAAA,aAAA,EAAA,MAAA,EAAA,CAAA,EAAA,IAAA,EAAA,mBAAA,EAAA,SAAA,EAAA,uBAAA,CAAA,EAAA,CAAA,MAAA,EAAA,QAAA,EAAA,CAAA,EAAA,KAAA,EAAA,UAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,CAAA,EAAA,OAAA,EAAA,SAAA,CAAA,EAAA,CAAA,CAAA,EAAA,mBAAA,EAAA,CAAA,EAAA,SAAA,CAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,QAAA,EAAA,CAAA,EAAA,mBAAA,EAAA,KAAA,EAAA,UAAA,EAAA,CAAA,EAAA,OAAA,EAAA,UAAA,CAAA,CAAA,EAAA,QAAA,EAAA,SAAA,wBAAA,CAAA,EAAA,EAAA,GAAA,EAAA,EAAA,IAAA,EAAA,GAAA,CAAA,EAAA;ADcH,YAnFF,EAAwG,CAAA,UAAA,CAAA,CAAA,EAAA,sCAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAAA,CAAA,CAAA,EAAA,sCAAA,EAAA,CAAA,EAAA,CAAA,EAAA,aAAA,EAAA,IAAA,EAAA,CAAA,EAAA,EAAA,CAAA,sBAAA,CAkBC,kDA4BrF,CAqCX,CAAA,EAAA,sCAAA,EAAA,EAAA,EAAA,EAAA,CAAA;;YArCT,EAyFG,CAAA,SAAA,CAAA,CAAA,CAAA;YAzFH,EAyFG,CAAA,aAAA,CAAA,GAAA,CAAA,YAAA,GAAA,CAAA,GAAA,CAAA,CAAA;ACzES,SAAA,EAAA,EAAA,YAAA,EAAA,CAAA,YAAY,mCAAE,kBAAkB,EAAA,EAAA,CAAA,qBAAA,EAAA,EAAA,CAAA,4BAAA,EAAA,EAAA,CAAA,yBAAA,EAAA,EAAA,CAAA,oBAAA,EAAE,WAAW,EAAE,EAAA,CAAA,aAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,CAAA,eAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,EAAA,CAAA,OAAA,EAAA,EAAA,CAAA,MAAA,EAAA,mBAAmB,EAAE,eAAe,EAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,aAAA,EAAA,CAAA,EAAA,CAAA,CAAA;;iFASlF,eAAe,EAAA,CAAA;cAX3B,SAAS;AACI,QAAA,IAAA,EAAA,CAAA,EAAA,UAAA,EAAA,IAAI,EACP,OAAA,EAAA,CAAC,YAAY,EAAE,kBAAkB,EAAE,WAAW,EAAE,mBAAmB,EAAE,eAAe,CAAC,EAAA,QAAA,EAClF,YAAY,EAEX,SAAA,EAAA;AACP,oBAAA,SAAS,CAAkB,eAAA,EAAA,iBAAiB,EAAE,IAAI,CAAC;AACnD,oBAAA,SAAS,CAAkB,eAAA,EAAA,aAAa,EAAE,IAAI,CAAC;AAC/C,oBAAA,kBAAkB,CAAiB,eAAA;AACtC,iBAAA,EAAA,QAAA,EAAA,i9MAAA,EAAA;;sBA+EI,SAAS;uBAAC,gBAAgB;;sBAC1B,SAAS;uBAAC,cAAc;;sBACxB,MAAM;uBAAC,kBAAkB;;sBAAG;qBA5CF,SAAS,EAAA,CAAA;kBAAvC,SAAS;mBAAC,kBAAkB;YACL,SAAS,EAAA,CAAA;kBAAhC,SAAS;mBAAC,WAAW;YACM,UAAU,EAAA,CAAA;kBAArC,YAAY;mBAAC,YAAY;;kFArCjB,eAAe,EAAA,EAAA,SAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,UAAA,EAAA,EAAA,EAAA,CAAA,CAAA,EAAA,GAAA;;ACvE5B;;AAEG;;;;"}
1
+ {"version":3,"file":"index.mjs","sources":["../../../../../projects/components/widgets/basic/search/src/scrollable.directive.ts","../../../../../projects/components/widgets/basic/search/src/search.props.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/local-data-provider.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/remote-data-provider.ts","../../../../../projects/components/widgets/basic/search/src/data-provider/data-provider.ts","../../../../../projects/components/widgets/basic/search/src/search.component.html","../../../../../projects/components/widgets/basic/search/src/search.component.ts","../../../../../projects/components/widgets/basic/search/src/index.ts"],"sourcesContent":["import { AfterContentInit, AfterViewInit, Directive, ElementRef, Injector } from '@angular/core';\n\nimport { SearchComponent } from './search.component';\n\ndeclare const $;\n\n@Directive({\n standalone: true,\n selector: '[scrollable]'\n})\nexport class ScrollableDirective implements AfterContentInit, AfterViewInit {\n private elementRef: ElementRef;\n\n constructor(inj: Injector, private searchRef: SearchComponent) {\n this.elementRef = inj.get(ElementRef);\n }\n\n ngAfterContentInit() {\n // add the scroll event listener on the ul element.\n this.elementRef.nativeElement.addEventListener('scroll', this.notifyParent.bind(this));\n this.searchRef.dropdownEl = $(this.elementRef.nativeElement);\n (this.searchRef as any).onDropdownOpen();\n }\n\n ngAfterViewInit() {\n if (!this.searchRef.isMobileAutoComplete()) {\n // assigning width for the dropdown.\n const typeAheadInput = this.searchRef.$element.find('input').first();\n this.searchRef.dropdownEl.width(typeAheadInput.outerWidth());\n }\n }\n\n private notifyParent(evt: Event) {\n this.searchRef.onScroll(this.elementRef.nativeElement, evt);\n }\n}\n","import {FormWidgetType} from '@wm/core';\nimport {PROP_ANY, PROP_BOOLEAN, PROP_NUMBER, PROP_STRING, register, registerFormWidget} from '@wm/components/base';\n\nexport const searchProps = new Map(\n [\n ['casesensitive', { value: false, ...PROP_BOOLEAN }],\n ['class', PROP_STRING],\n ['datacompletemsg', { value: 'No more data to load', ...PROP_STRING }],\n ['datafield', { value: 'All Fields', ...PROP_STRING }],\n ['dataoptions', PROP_ANY],\n ['dataset', PROP_ANY],\n ['datasource', PROP_ANY],\n ['datavalue', PROP_STRING],\n ['datavaluesource', PROP_ANY],\n ['dateformat', PROP_STRING],\n ['disabled', PROP_BOOLEAN],\n ['displayimagesrc', PROP_STRING],\n ['displaylabel', PROP_STRING],\n ['displayexpression', PROP_STRING],\n\n ['dropup', PROP_BOOLEAN],\n ['groupby', PROP_STRING],\n ['hint', PROP_STRING],\n ['arialabel', PROP_STRING],\n ['imagewidth', { value: '16px', ...PROP_STRING }],\n ['limit', PROP_NUMBER],\n ['loadingdatamsg', { value: 'Loading items...', ...PROP_STRING }],\n ['match', PROP_STRING],\n ['matchmode', PROP_STRING],\n ['minchars', PROP_NUMBER],\n ['name', PROP_STRING],\n ['navsearchbar', { value: false, ...PROP_BOOLEAN }],\n ['orderby', PROP_STRING],\n ['placeholder', { value: 'Search', ...PROP_STRING }],\n ['position', PROP_STRING],\n ['query', PROP_STRING],\n ['readonly', PROP_BOOLEAN],\n ['required', PROP_BOOLEAN],\n ['searchkey', PROP_STRING],\n ['searchon', { value: 'typing', ...PROP_STRING }],\n ['shortcutkey', PROP_STRING],\n ['show', { value: true, ...PROP_BOOLEAN }],\n ['showclear', { value: false, ...PROP_BOOLEAN }],\n ['showsearchicon', PROP_BOOLEAN],\n ['tabindex', { value: 0, ...PROP_NUMBER }],\n ['type', { value: 'search', ...PROP_STRING }],\n ['debouncetime', { value: 250, ...PROP_NUMBER }],\n ['width', PROP_STRING],\n ['clearsearchiconclass', {value: 'wi wi-close', ...PROP_STRING}],\n ['backsearchiconclass', {value: 'wi wi-arrow-left', ...PROP_STRING}],\n ['searchiconclass', {value: 'wm-sl-l sl-search', ...PROP_STRING}],\n ]\n);\n\nexport const registerProps = () => {\n register(\n 'wm-search',\n searchProps\n );\n registerFormWidget(\n FormWidgetType.AUTOCOMPLETE,\n new Map(searchProps)\n );\n registerFormWidget(\n FormWidgetType.TYPEAHEAD,\n new Map(searchProps)\n );\n};\n","import { IDataProvider, IDataProviderConfig } from './data-provider';\nimport {\n endsWith,\n filter,\n get,\n includes,\n isArray,\n isEqual,\n isNumber,\n isObject,\n split,\n startsWith,\n toLower,\n toString,\n values\n} from \"lodash-es\";\n\nexport class LocalDataProvider implements IDataProvider {\n private applyFilter(entry, queryText, filtername?) {\n entry = isNumber(entry) ? entry.toString() : entry;\n if (includes(filtername, 'start')) {\n return startsWith(entry, queryText);\n } else if (includes(filtername, 'end')) {\n return endsWith(entry, queryText);\n } else if (includes(filtername, 'exact')) {\n return isEqual(entry, queryText);\n }\n return includes(entry, queryText);\n }\n\n // LocalData filtering is done based on the searchkey.\n public filter(config: IDataProviderConfig): Promise<any> {\n const entries = config.dataset;\n let casesensitive = config.casesensitive;\n const matchMode = config.matchMode;\n // for supporting existing projects\n if (matchMode && !includes(matchMode, 'ignorecase')) {\n casesensitive = true;\n }\n let queryText = config.query,\n filteredData;\n\n return new Promise((resolve, reject) => {\n /**\n * If searchKey is defined, then check for match string against each item in the dataset with item's field name as the searchKey\n * return the filtered data containing the matching string.\n */\n if (config.searchKey) {\n const keys = split(config.searchKey, ',');\n\n filteredData = filter(config.dataset, (item: any) => {\n return keys.some(key => {\n let a = get(item, key),\n b = queryText;\n if (!casesensitive) {\n a = toLower(toString(a));\n b = toLower(toString(b));\n }\n return this.applyFilter(a, b, matchMode);\n });\n });\n } else {\n // local search on data with array of objects.\n // Iterate over each item and return the filtered data containing the matching string.\n if (isArray(entries) && isObject(entries[0])) {\n filteredData = filter(entries, entry => {\n let a = values(entry).join(' ');\n if (!casesensitive) {\n a = toLower(a);\n // @ts-ignore\n queryText = toLower(queryText);\n }\n return this.applyFilter(a, queryText);\n });\n } else {\n filteredData = filter(entries, entry => {\n if (!casesensitive) {\n entry = toLower(entry);\n // @ts-ignore\n queryText = toLower(queryText);\n }\n return this.applyFilter(entry, queryText, matchMode);\n });\n }\n }\n resolve({\n data: filteredData,\n hasMoreData: false,\n isLastPage: true\n });\n });\n }\n}\n","import { AppConstants, DataSource, findValueOf, getClonedObject } from '@wm/core';\n\nimport { convertDataToObject, interpolateBindExpressions } from '@wm/components/base';\nimport { IDataProvider, IDataProviderConfig } from './data-provider';\nimport {assign, get, indexOf, isArray, isEmpty, isObject, set, slice, split} from \"lodash-es\";\n\nexport class RemoteDataProvider implements IDataProvider {\n public filter(config: IDataProviderConfig): Promise<any> {\n return this.filterData(config).then(response => this.onFilterSuccess(config, response), () => this.onFilterFailure());\n }\n\n private filterData(config) {\n if (config.dataoptions) {\n const dataoptions = config.dataoptions;\n\n const requestParams = config.datasource.execute(DataSource.Operation.GET_REQUEST_PARAMS, config);\n\n // If options are specified, make specifics calls to fetch the results\n // Fetch the related field data\n if (dataoptions.relatedField) {\n return new Promise((resolve, reject) => {\n interpolateBindExpressions(config.viewParent, dataoptions.filterExpr, (filterexpressions) => {\n requestParams.filterExpr = dataoptions.filterExpr = filterexpressions;\n dataoptions.filterExpr = filterexpressions;\n\n config.datasource.execute(\n DataSource.Operation.GET_RELATED_TABLE_DATA, assign({relatedField: dataoptions.relatedField}, requestParams)\n ).then(resolve, reject);\n });\n });\n }\n // Fetch the distinct data\n if (dataoptions.distinctField) {\n return config.datasource.execute(\n DataSource.Operation.GET_DISTINCT_DATA_BY_FIELDS,\n {\n pagesize: config.limit || config.pagesize,\n page: config.page,\n fields: dataoptions.distinctField,\n entityName: dataoptions.tableName,\n filterFields: assign(dataoptions.filterFields, requestParams.filterFields),\n filterExpr: getClonedObject(dataoptions.filterExpr || {})\n\n }\n );\n }\n }\n\n // search records using the searchkey\n return config.datasource.execute(\n DataSource.Operation.SEARCH_RECORDS, config\n );\n }\n\n\n // Check if the page retrieved currently is the last page. If last page, don't send any more request\n protected isLast(page: number, dataSize: number, maxResults: number, currentResults?: number): boolean {\n // if last page info is not returned by backend and current results is less than max results, this is the last page\n if (dataSize === AppConstants.INT_MAX_VALUE) {\n return currentResults !== 0 && currentResults < maxResults;\n }\n const pageCount = ((dataSize > maxResults) ? (Math.ceil(dataSize / maxResults)) : (dataSize < 0 ? 0 : 1));\n return page === pageCount;\n }\n\n // this function transform the response data in case it is not an array\n protected getTransformedData(variable: any, data: any): any {\n const operationResult = variable.operation + 'Result'; // when output is only string it is available as oprationNameResult\n const tempResponse = data[operationResult];\n\n // in case data received is value as string then add that string value to object and convert object into array\n if (tempResponse) {\n const tempObj = {};\n set(tempObj, operationResult, tempResponse);\n data = [tempObj]; // convert data into an array having tempObj\n } else {\n // in case data received is already an object then convert it into an array\n data = [data];\n }\n\n return data;\n }\n\n protected onFilterFailure() {\n return [];\n }\n\n private isLastPageForDistinctApi(data, page, totalElements, _isLastPage) {\n return page > 1 && !_isLastPage && isEmpty(data) && totalElements === AppConstants.INT_MAX_VALUE;\n }\n\n\n // this function processes the response depending on pageOptions, isPageable and prepares the formattedDataset.\n protected onFilterSuccess(config: IDataProviderConfig, response): Promise<any> {\n let data: any = response.data;\n let formattedData: any;\n let _isLastPage: boolean;\n let page: number;\n let isPaginatedData: boolean;\n\n const expressionArray = split(config.binddataset, '.');\n const dataExpression = slice(expressionArray, indexOf(expressionArray, 'dataSet') + 1).join('.');\n const $I = '[$i]';\n\n return new Promise((resolve, reject) => {\n const pageOptions = response.pagination;\n\n if (config.datasource.execute(DataSource.Operation.IS_PAGEABLE)) {\n page = pageOptions.number + 1;\n _isLastPage = this.isLast(page, (config.limit > 0 && config.limit) || pageOptions.totalElements, pageOptions.size, pageOptions.numberOfElements);\n isPaginatedData = true;\n\n if (this.isLastPageForDistinctApi(data, page, pageOptions.totalElements, _isLastPage)) {\n _isLastPage = true;\n resolve({\n data: [],\n isLastPage: _isLastPage,\n hasMoreData: page > 1,\n isPaginatedData,\n page\n });\n return;\n }\n }\n // if data expression exists, extract the data from the expression path\n if (dataExpression) {\n if (isArray(data)) {\n const index = dataExpression.lastIndexOf($I);\n if(index > -1){\n const restExpr = dataExpression.substr(index + 5);\n formattedData = data.map(datum => findValueOf(datum, restExpr));\n }\n } else if (isObject(data)) {\n formattedData = get(data, dataExpression);\n }\n data = formattedData || data;\n }\n if (!isArray(data)) {\n data = this.getTransformedData(config.datasource, data);\n }\n // in case of no data received, resolve the promise with empty array\n if (!data.length) {\n resolve({data: [], isLastPage: _isLastPage, hasMoreData: page > 1, isPaginatedData, page});\n } else {\n resolve({data: data, isLastPage: _isLastPage, hasMoreData: page > 1, isPaginatedData, page});\n }\n });\n }\n}\n","import { DataSource } from '@wm/core';\n\nimport { LocalDataProvider } from './local-data-provider';\nimport { RemoteDataProvider } from './remote-data-provider';\n\nexport interface IDataProviderConfig {\n dataoptions?: any;\n viewParent?: any;\n dataset: any;\n datafield: string;\n binddataset?: string;\n datasource?: any;\n hasData: boolean;\n query: Array<string> | string;\n isLocalFilter: boolean;\n searchKey?: string;\n matchMode?: string;\n casesensitive?: boolean;\n isformfield?: boolean;\n orderby?: string;\n limit?: number;\n pagesize?: number;\n page: number;\n noMoredata?: boolean;\n onBeforeservicecall?: Function;\n}\n\nexport interface IDataProvider {\n hasMoreData?: boolean;\n isLastPage?: boolean;\n hasNoMoreData?: boolean;\n isPaginatedData?: boolean;\n page?: number;\n updateDataset?: boolean;\n\n filter(config: IDataProviderConfig): Promise<any>;\n}\n\nexport class DataProvider implements IDataProvider {\n\n public hasMoreData: boolean;\n public isLastPage: boolean;\n public page: number;\n public isPaginatedData: boolean;\n public updateDataset: boolean;\n\n static remoteDataProvider = new RemoteDataProvider();\n static localDataProvider = new LocalDataProvider();\n\n public filter(config: IDataProviderConfig): Promise<any> {\n\n let promise: Promise<any>;\n\n /**\n * Make call to remoteDataProvider when searchkey is available and data is not from local / model variable.\n * Otherwise use localDataProvider\n * If datasource is a serviceVariable with no input params, then perform local search.\n * when there is no dataset on the datasource when first time make a remote call to set the dataset for service variable.\n */\n const hasNoVariableDataset = config.datasource && config.datasource.execute(DataSource.Operation.IS_UPDATE_REQUIRED, config.hasData);\n if (!config.isLocalFilter && (config.dataoptions || ((config.datasource && config.datasource.execute(DataSource.Operation.IS_API_AWARE))\n && config.searchKey\n && hasNoVariableDataset))) {\n promise = DataProvider.remoteDataProvider.filter(config);\n } else {\n promise = DataProvider.localDataProvider.filter(config);\n }\n\n return promise.then(response => {\n this.updateDataset = config.datasource && !config.datasource.execute(DataSource.Operation.SUPPORTS_CRUD) && hasNoVariableDataset;\n this.hasMoreData = response.hasMoreData;\n this.isLastPage = response.isLastPage;\n this.page = response.page;\n this.isPaginatedData = response.isPaginatedData;\n\n return response;\n });\n }\n}\n","<ng-template #customItemTemplate let-model=\"item\" let-index=\"index\" let-query=\"query\" let-match=\"match\">\n <!-- Default item template -->\n @if (!content) {\n <a>\n @if (model.imgSrc) {\n <img [src]=\"model.imgSrc\" alt=\"Search\" [style.width]=\"imagewidth\">\n }\n <span [title]=\"model.label\" [innerHtml]=\"highlight(match, query) || model.label\"></span>\n </a>\n }\n <!-- Custom partial template -->\n @if (content) {\n <a [ngClass]=\"{customTemplate: content}\" partialContainer [wmItemTemplate]=\"content\" [userComponentParams]=\"match.item\">\n <div partial-container-target></div>\n </a>\n }\n</ng-template>\n\n<ng-template #customListTemplate let-matches=\"matches\" let-itemTemplate=\"itemTemplate\" let-query=\"query\">\n <ul #ulElement class=\"app-search dropdown-menu\" scrollable>\n @for (match of matches; track match; let i = $index) {\n <li #liElements [ngClass]=\"{active: typeaheadContainer && typeaheadContainer.isActive(match), 'list-group-header': match && match.isHeader()}\"\n (mouseenter)=\"typeaheadContainer.selectActive(match);\"\n (click)=\"match && !match.isHeader() && typeaheadContainer.selectMatch(match, $event); $typeaheadEvent = $event; notifySubscriber();\">\n <!-- itemTemplate comes from the <input> -->\n @if (match.isHeader()) {\n <h4 class=\"group-title\">{{match.value}}</h4>\n }\n @if (!match.isHeader()) {\n <ng-container [ngTemplateOutlet]=\"itemTemplate\"\n [ngTemplateOutletContext]=\"{item: match.item, index: i, match: match, query: query}\">\n </ng-container>\n }\n </li>\n }\n <div class=\"status\" [hidden]=\"_loadingItems || !(datacompletemsg && dataProvider.isLastPage)\">\n <span [textContent]=\"datacompletemsg\"></span>\n </div>\n <div class=\"status\" [hidden]=\"!_loadingItems\">\n <i class=\"fa fa-circle-o-notch fa-spin\"></i>\n <span [textContent]=\"loadingdatamsg\"></span>\n </div>\n </ul>\n</ng-template>\n\n<!--This template is for search inside mobile navbar.-->\n@if (navsearchbar) {\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n container=\"body\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event)\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event);\"\n (focusout)=\"onFocusOut()\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [dropup]=\"dropup\"\n [tabindex]=\"tabindex\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\"/>\n <i class=\"btn-close wi wi-cancel\" [hidden]=\"!showClosebtn\" (click)=\"clearSearch($event);\"></i>\n} @else {\n <button type=\"button\" class=\"btn btn-icon form-control-feedback back-btn\" aria-hidden=\"true\" (click)=\"closeSearch()\"><i class=\"app-icon {{backsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Back button</span>\n <input [title]=\"query || ''\" type=\"text\" class=\"app-textbox form-control list-of-objs app-search-input\" [placeholder]=\"placeholder || ''\"\n focus-target\n [container]=\"containerTarget || '.wm-app'\"\n [disabled]=\"disabled\"\n [attr.accesskey]=\"shortcutkey\"\n autocomplete=\"off\"\n [(ngModel)]=\"query\"\n [ngModelOptions]=\"{standalone: true}\"\n [readonly]=\"readonly\"\n [typeahead]=\"typeaheadDataSource\"\n [typeaheadWaitMs]=\"debouncetime\"\n [typeaheadItemTemplate]=\"customItemTemplate\"\n [optionsListTemplate]=\"customListTemplate\"\n (input)=\"onInputChange($event)\"\n (keydown)=\"listenQuery = true\"\n (keydown.enter)=\"$typeaheadEvent = $event;handleEnterEvent($event)\"\n (keydown.arrowdown)=\"selectNext($event)\"\n (blur)=\"invokeOnTouched($event); onFocusOut()\"\n (click)=\"handleFocus($event);\"\n (focus)=\"_unsubscribeDv = false; listenQuery = true; handleFocus($event); invokeOnFocus($event)\"\n [typeaheadMinLength]=\"minchars\"\n [typeaheadOptionsLimit]=\"limit\"\n (typeaheadLoading)=\"_loadingItems\"\n (typeaheadOnSelect)=\"typeaheadOnSelect($event)\"\n typeaheadOptionField=\"label\"\n [typeaheadGroupField]=\"groupby ? 'groupby' : null\"\n [typeaheadAsync]=\"true\"\n [typeaheadScrollable]=\"true\"\n [adaptivePosition]=\"true\"\n [typeaheadOptionsInScrollableView]=\"optionslimitinscrollableview\"\n [tabindex]=\"tabindex\"\n [dropup]=\"dropup\"\n [attr.name]=\"name\"\n [attr.aria-label]=\"arialabel || 'Search field'\">\n <input class=\"model-holder\" ng-model=\"proxyModel\" ng-required=\"required\" tabindex=\"-1\" aria-hidden=\"true\">\n @if (_loadingItems) {\n <span aria-hidden=\"true\" class=\"fa fa-circle-o-notch fa-spin form-control-feedback\"></span>\n }\n <button type=\"button\" class=\"btn btn-icon form-control-feedback clear-btn\" [ngClass]=\"{'show-btn': isQueryEntered()}\" (click)=\"clearSearch($event, true)\"><i class=\"app-icon {{clearsearchiconclass}}\"></i></button>\n <span class=\"sr-only\">Clear button</span>\n @if (showsearchicon) {\n <span [ngClass]=\"{'disabled': disabled}\" class=\"input-group-addon\">\n <form>\n <button title=\"Search\" [disabled]=\"disabled\" class=\"app-search-button btn btn-icon\" type=\"submit\"\n (click)=\"onSearchSelect($event)\">\n <i class=\"app-icon {{searchiconclass}}\"></i></button>\n </form>\n </span>\n }\n }\n <!--This template is for both web and fullscreen mode in mobile.-->\n","import { CommonModule } from '@angular/common';\nimport { WmComponentsModule } from \"@wm/components/base\";\nimport { FormsModule } from '@angular/forms';\nimport { ScrollableDirective } from './scrollable.directive';\nimport {\n AfterViewChecked,\n AfterViewInit,\n Attribute,\n Component,\n ElementRef,\n Inject,\n Injector,\n OnInit,\n Optional,\n QueryList,\n ViewChild,\n ViewChildren\n} from '@angular/core';\nimport {NG_VALIDATORS, NG_VALUE_ACCESSOR} from '@angular/forms';\n\nimport {from, Observable, of} from 'rxjs';\nimport {filter, mergeMap} from 'rxjs/operators';\n\nimport {TypeaheadContainerComponent, TypeaheadDirective, TypeaheadMatch, TypeaheadModule} from 'ngx-bootstrap/typeahead';\n\nimport {addClass, adjustContainerPosition, App, DataSource, isDefined, isMobile, toBoolean} from '@wm/core';\nimport {\n ALLFIELDS,\n convertDataToObject,\n DataSetItem,\n extractDataAsArray,\n getContainerTargetClass,\n getUniqObjsByDataField,\n provideAs,\n provideAsWidgetRef,\n styler,\n transformFormData\n} from '@wm/components/base';\nimport {DatasetAwareFormComponent} from '@wm/components/input';\n\nimport {registerProps} from './search.props';\nimport {DataProvider, IDataProvider, IDataProviderConfig} from './data-provider/data-provider';\nimport {\n debounce,\n find,\n get,\n includes,\n isArray,\n isEmpty,\n isEqual,\n isObject,\n isUndefined,\n map,\n split,\n toString,\n trim\n} from \"lodash-es\";\n\nconst WIDGET_CONFIG = { widgetType: 'wm-search', hostClass: 'input-group' };\n\n@Component({\n standalone: true,\n imports: [CommonModule, WmComponentsModule, FormsModule, ScrollableDirective, TypeaheadModule],\n selector: '[wmSearch]',\n templateUrl: './search.component.html',\n providers: [\n provideAs(SearchComponent, NG_VALUE_ACCESSOR, true),\n provideAs(SearchComponent, NG_VALIDATORS, true),\n provideAsWidgetRef(SearchComponent)\n ]\n})\nexport class SearchComponent extends DatasetAwareFormComponent implements OnInit, AfterViewInit, AfterViewChecked {\n static initializeProps = registerProps();\n public casesensitive: boolean;\n public searchkey: string;\n public queryModel: Array<DataSetItem> | string;\n public query = '';\n public limit: any;\n public showsearchicon: boolean;\n public minchars: number;\n public type: string;\n public navsearchbar: any;\n public debouncetime: number;\n public hint: string;\n public arialabel: string;\n\n private app: App;\n private typeaheadDataSource: Observable<any>;\n private pagesize: any;\n private page = 1;\n public _loadingItems: boolean;\n private dataProvider: IDataProvider;\n private result: Array<any>; // contains the search result i.e. matches\n private formattedDataset: any;\n private isformfield: boolean;\n private $typeaheadEvent: Event;\n\n public tabindex: number;\n public startIndex: number;\n public binddisplaylabel: string;\n public typeaheadContainer: TypeaheadContainerComponent;\n public containerTarget: string;\n public clearsearchiconclass: string;\n public backsearchiconclass: string;\n public searchiconclass: string;\n\n @ViewChild(TypeaheadDirective) typeahead: TypeaheadDirective;\n @ViewChild('ulElement') ulElement: ElementRef;\n @ViewChildren('liElements') liElements: QueryList<ElementRef>;\n\n private allowonlyselect: boolean;\n private class: string;\n\n private lastSelectedIndex: number;\n private dataoptions: any;\n public dropdownEl: any;\n private _lastQuery: string;\n private _lastResult: any;\n private _isOpen: boolean; // set to true when dropdown is open\n private showClosebtn: boolean;\n private _unsubscribeDv: boolean;\n private _datasource: any;\n private isScrolled: boolean;\n private parentEl: any;\n private position: string;\n private elIndex: number;\n private listenQuery: boolean;\n private _domUpdated: boolean;\n private searchon: string;\n private showclear: boolean;\n public matchmode: string;\n private clearData: boolean;\n\n\n // getter setter is added to pass the datasource to searchcomponent.\n get datasource() {\n return this._datasource;\n }\n\n set datasource(nv) {\n this._datasource = nv;\n const data = this.datavalue || this.toBeProcessedDatavalue;\n this.updateByDatavalue(data);\n }\n\n constructor(\n inj: Injector,\n app: App,\n @Attribute('datavalue.bind') public binddatavalue,\n @Attribute('dataset.bind') public binddataset,\n @Inject('EXPLICIT_CONTEXT') @Optional() explicitContext: any\n ) {\n super(inj, WIDGET_CONFIG, explicitContext);\n // this flag will not allow the empty datafield values.\n this.allowempty = false;\n this.app = app;\n addClass(this.nativeElement, 'app-search', true);\n\n /**\n * Listens for the change in the ngModel on every search and retrieves the data as observable.\n * This observable data is passed to the typeahead.\n * @type {Observable<any>}\n */\n this.typeaheadDataSource = Observable\n .create((observer: any) => {\n // Runs on every search\n if (this.listenQuery) {\n this._defaultQueryInvoked = false;\n this._loadingItems = true;\n observer.next(this.query);\n }\n // on keydown, while scrolling the dropdown items, when last item is reached next call is triggered\n // unless the call is resolved, we are able to scroll next to first item and soon\n // This shows flickering from first item to next new items appended.\n // By setting container to undefined, key events changes will be stopped while loading items\n if (this.lastSelectedIndex) {\n this.typeahead._container = undefined;\n }\n }).pipe(\n filter(() => {\n this._loadingItems = false;\n return (this.minchars === 0 || (this.query && this.query.length >= this.minchars));\n }),\n mergeMap((token: string) => this.getDataSourceAsObservable(token))\n );\n\n this.dataProvider = new DataProvider();\n\n /**\n * When default datavalue is not found within the dataset, a filter call is made to get the record using fetchDefaultModel.\n * after getting the response, set the queryModel and query.\n */\n const datavalueSubscription = this.datavalue$.subscribe((val: Array<string> | string) => {\n\n const query = (isArray(val) ? val[0] : val) as string;\n\n if (query === null || query === '') {\n this._modelByValue = '';\n // reset the query.\n this.query = this.queryModel = '';\n // on clear or reset filter, empty the lastResults to fetch new records.\n this._lastResult = undefined;\n return;\n }\n\n if (!this._unsubscribeDv) {\n this._defaultQueryInvoked = false;\n // if prev datavalue is not equal to current datavalue then clear the modelByKey and queryModel\n if (!isObject(val) && (this as any).prevDatavalue !== val) {\n this._modelByKey = undefined;\n this.query = this.queryModel = '';\n }\n // if the datafield is ALLFILEDS do not fetch the records\n // update the query model with the values we have\n this.updateByDatavalue(val);\n }\n\n // turn on showCloseBtn when a default value is given\n this.showClosebtn = (this.query !== '');\n });\n this.registerDestroyListener(() => datavalueSubscription.unsubscribe());\n\n const datasetSubscription = this.dataset$.subscribe(() => {\n // set the next item index.\n this.startIndex = this.datasetItems.length;\n this._lastResult = undefined;\n const defaultValue = this.datavalue || this.toBeProcessedDatavalue;\n // invoking updateByDataset only when datavalue is present, as entered value i.e. query is setting back to ''\n if (isDefined(defaultValue)) {\n this.updateByDataset(defaultValue);\n }\n });\n this.registerDestroyListener(() => datasetSubscription.unsubscribe());\n }\n\n // on clear, trigger search with page size 1\n private clearSearch($event, loadOnClear) {\n this.query = '';\n this.onInputChange($event);\n this.dataProvider.isLastPage = false;\n this.listenQuery = false;\n if (loadOnClear) {\n this.listenQuery = true;\n this._unsubscribeDv = false;\n this.loadMoreData();\n }\n this.invokeEventCallback('clearsearch');\n this._loadingItems = false;\n // when search input is cleared, focus on the input field\n if ($event) {\n this.$element.find('.app-search-input').focus();\n }\n }\n\n // function to clear the input value\n public clearText() {\n this.query = '';\n this.showClosebtn = false;\n }\n\n // Close the full screen mode in mobile view of auto complete\n private closeSearch() {\n this._loadingItems = false;\n this.page = 1;\n // after closing the search, insert the element at its previous position (elIndex)\n this.insertAtIndex(this.elIndex);\n this.elIndex = undefined;\n this.parentEl = undefined;\n this.$element.removeClass('full-screen');\n if (this._domUpdated) {\n this._domUpdated = false;\n }\n this.listenQuery = false;\n this._unsubscribeDv = true;\n this.typeahead.hide();\n }\n\n private renderMobileAutoComplete() {\n // Get the parent element of the search element which can be next or prev element, if both are empty then get the parent of element.\n if (!isDefined(this.elIndex)) {\n this.parentEl = this.$element.parent();\n this.elIndex = this.parentEl.children().index(this.$element);\n }\n if (!this.$element.hasClass('full-screen')) {\n // this flag is set to notify that the typeahead-container dom has changed its position\n this._domUpdated = true;\n // Add full screen class on focus of the input element.\n this.$element.addClass('full-screen');\n\n // Add position to set the height to auto\n if (this.position === 'inline') {\n this.$element.addClass(this.position);\n }\n }\n // focus is lost when element is changed to full-screen, keydown to select next items will not work\n // Hence explicitly focusing the input\n if (this.$element.hasClass('full-screen')) {\n this.$element.find('.app-search-input').focus();\n }\n }\n\n private getDataSourceAsObservable(query: string): Observable<any> {\n // show dropdown only when there is change in query. This should not apply when dataoptions with filterFields are updated.\n // when lastResult is not available i.e. still the first call is pending and second query is invoked then do not return.\n if (this._lastQuery === query && !get(this.dataoptions, 'filterFields') && isDefined(this._lastResult)) {\n this._loadingItems = false;\n return of(this._lastResult);\n }\n\n /*\n WMS-19177: On focus of input field for autocomplete type, do not trigger api call when\n a) searchkey and displayexpression are different\n b) binddisplaylabel contains multiple values\n c) binddisplaylabel contains single value which does not match with searchkey\n */\n if (this.type === 'autocomplete' && this.searchkey && this.query && this.datavalue) {\n let bindDisplayLabelArray = [];\n const searchKeyArray = split(this.searchkey, ',');\n let displaylabel;\n if (this.binddisplaylabel) {\n bindDisplayLabelArray = split(this.binddisplaylabel, '+');\n if (bindDisplayLabelArray.length === 1) {\n if (!includes(bindDisplayLabelArray[0], '|')) {\n const regex = /\\[(.*?)\\]/;\n displaylabel = regex.exec(bindDisplayLabelArray[0])[1];\n } else {\n displaylabel = true;\n }\n }\n }\n if ((bindDisplayLabelArray.length > 1 || (displaylabel && !includes(searchKeyArray, displaylabel))\n || (this.displayexpression && !includes(searchKeyArray, this.displayexpression)))) {\n this._loadingItems = false;\n return of([]);\n }\n }\n this._lastQuery = this.query;\n return from(this.getDataSource(query));\n }\n\n protected handleEvent(node: HTMLElement, eventName: string, eventCallback: Function, locals: any) {\n if (!includes(['blur', 'focus', 'select', 'submit', 'change'], eventName)) {\n super.handleEvent(node, eventName, eventCallback, locals);\n }\n }\n\n // highlight the characters in the dropdown matching the query.\n private highlight(match: TypeaheadMatch, query: string) {\n if (this.typeaheadContainer) {\n // highlight of chars will work only when label are strings.\n (match as any).value = match.item.label.toString();\n return this.typeaheadContainer.highlight(match, query);\n }\n }\n\n // inserts the element at the index position\n private insertAtIndex(i) {\n if (i === 0) {\n this.parentEl.prepend(this.$element);\n } else {\n const $elAtIndex = this.parentEl.children().eq(i);\n if ($elAtIndex.length) {\n this.$element.insertBefore(this.parentEl.children().eq(i));\n } else {\n this.$element.insertAfter(this.parentEl.children().eq(i - 1));\n }\n }\n }\n\n // Check if the widget is of type autocomplete in mobile view/ app\n public isMobileAutoComplete() {\n return this.type === 'autocomplete' && isMobile();\n }\n\n // Check if the query is entered in the input and the view is not mobile\n public isQueryEntered() {\n return this.showclear && this.showClosebtn;\n }\n\n private loadMoreData(incrementPage?: boolean) {\n if (this.dataProvider.isLastPage) {\n return;\n }\n // Increase the page number and trigger force query update\n this.page = incrementPage ? this.page + 1 : this.page;\n\n this.isScrolled = true;\n this._loadingItems = true;\n\n // when invoking new set of results, reset the lastQuery.\n if (incrementPage) {\n this._lastQuery = undefined;\n }\n\n // trigger the typeahead change manually to fetch the next set of results.\n this.typeahead.onInput({\n target: {\n value: trim(this.query) || '0' // dummy data to notify the observables\n }\n });\n }\n\n // on focusout, subscribe to the datavalue changes again\n private onFocusOut() {\n this._unsubscribeDv = false;\n this._loadingItems = false;\n // reset the page value on focusout.\n this.page = 1;\n // if domUpdated is true then do not hide the dropdown in the fullscreen\n if (!this._domUpdated && this._isOpen) {\n this.listenQuery = false;\n }\n this._isOpen = false;\n // on outside click, typeahead is hidden. To avoid this, when fullscreen is set, overridding isFocused flag on the typeahead container\n if (this._domUpdated && this.typeahead && (this.typeahead as any)._container) {\n (this.typeahead as any)._container.isFocused = true;\n }\n }\n\n private onInputChange($event) {\n // reset all the previous page details in order to fetch new set of result.\n this.result = [];\n this.page = 1;\n this.listenQuery = this.isUpdateOnKeyPress();\n this._modelByValue = undefined;\n\n // when input is cleared, reset the datavalue\n if (this.query === '') {\n this.queryModel = '';\n this._modelByValue = '';\n this.updatePrevDatavalue(this._lastQuery);\n this.invokeOnChange(this._modelByValue, {}, true);\n\n this.invokeEventCallback('clear', { $event });\n\n // trigger onSubmit only when the search input is cleared off and do not trigger when tab is pressed.\n if ($event && $event.which !== 9) {\n this.invokeEventCallback('submit', { $event });\n }\n } else {\n // invoking change event on every input value change.\n this.invokeEventCallback('change', {\n $event: $event,\n newVal: this._modelByValue || this.query,\n oldVal: (this as any).prevDatavalue\n });\n }\n this.showClosebtn = (this.query !== '');\n }\n\n // Triggered for enter event\n private handleEnterEvent($event) {\n // submit event triggered when there is no search results\n if (!get(this.typeahead, 'matches.length')) {\n this.onSearchSelect($event);\n }\n }\n // Triggerred when typeahead option is selected.\n private onSearchSelect($event: Event) {\n let item;\n // WMS-22533: Before adding active typeahead el, check if the entered query matches with the active el or not\n const isQueryMatch = this.typeaheadContainer?.active?.value === this.query;\n\n if (this.typeaheadContainer && this.typeaheadContainer.active && isQueryMatch) {\n item = this.typeaheadContainer.active.item;\n }\n $event = this.eventData($event, item || {});\n\n // searchOn is set as onBtnClick, then invoke the search api call manually.\n if (!this.isUpdateOnKeyPress()) {\n this.listenQuery = true;\n // trigger the typeahead change manually to fetch the next set of results.\n this.typeahead.onInput({\n target: {\n value: this.query // dummy data to notify the observables\n }\n });\n return;\n }\n // when matches are available.\n if (this.typeaheadContainer && this.liElements.length && isQueryMatch) {\n this.typeaheadContainer.selectActiveMatch();\n } else {\n this.queryModel = this.query;\n this.invokeEventCallback('submit', { $event });\n }\n }\n\n private invokeOnBeforeServiceCall(inputData) {\n this.invokeEventCallback('beforeservicecall', { inputData });\n }\n\n private onDropdownOpen() {\n if (this.clearData) {\n this.typeahead.hide();\n }\n // setting the ulElements, liElement on typeaheadContainer.\n // as we are using customOption template, liElements are not available on typeaheadContainer so append them explicitly.\n const fn = debounce(() => {\n this._isOpen = true;\n this.typeaheadContainer = this.typeahead._container || (this.typeahead as any)._typeahead.instance;\n (this.typeaheadContainer as any).liElements = this.liElements;\n (this.typeaheadContainer as any).ulElement = this.ulElement;\n adjustContainerPosition($('typeahead-container'), this.nativeElement, (this.typeahead as any)._typeahead, $('typeahead-container .dropdown-menu'));\n\n });\n\n fn();\n\n // open full-screen search view\n if (this.isMobileAutoComplete()) {\n if (!this.$element.hasClass('full-screen')) {\n this.renderMobileAutoComplete();\n }\n const dropdownEl = this.dropdownEl.closest('typeahead-container');\n\n dropdownEl.insertAfter(this.$element.find('input').first());\n const screenHeight = this.$element.closest('.app-content').height();\n dropdownEl.css({ position: 'relative', top: 0, height: screenHeight + 'px' });\n this.showClosebtn = this.query && this.query !== '';\n\n if (!isUndefined(this.dataProvider.isLastPage) && !this.dataProvider.isLastPage) {\n this.triggerSearch();\n }\n }\n }\n\n private selectNext() {\n const matches = this.typeaheadContainer.matches;\n\n if (!matches) {\n return;\n }\n const index = matches.indexOf(this.typeaheadContainer.active);\n\n // on keydown, if scroll is at the bottom and next page records are available, fetch next page items.\n if (!this._loadingItems && !this.dataProvider.isLastPage && index + 1 > matches.length - 1) {\n // index is saved in order to select the lastSelected item in the dropdown after fetching next page items.\n this.lastSelectedIndex = index;\n this.loadMoreData(true);\n }\n }\n\n private setLastActiveMatchAsSelected() {\n if (this.lastSelectedIndex) {\n (this.typeaheadContainer as any)._active = this.typeaheadContainer.matches[this.lastSelectedIndex];\n this.typeaheadContainer.nextActiveMatch();\n this.lastSelectedIndex = undefined;\n }\n }\n\n private triggerSearch() {\n if (this.dataProvider.isLastPage || !this.$element.hasClass('full-screen')) {\n return;\n }\n const typeAheadDropDown = this.dropdownEl;\n const $lastItem = typeAheadDropDown.find('li').last();\n\n // Check if last item is not below the full screen\n if ($lastItem.length && typeAheadDropDown.length && (typeAheadDropDown.height() + typeAheadDropDown.position().top > $lastItem.height() + $lastItem.position().top)) {\n this.loadMoreData(true);\n }\n }\n\n private isUpdateOnKeyPress() {\n return this.searchon === 'typing';\n }\n\n private debounceDefaultQuery(data) {\n this._defaultQueryInvoked = true;\n this.getDataSource(data, true).then((response) => {\n if (response.length) {\n this.queryModel = response;\n this._lastQuery = this.query = this.queryModel[0].label || '';\n this._modelByValue = this.queryModel[0].value;\n this._modelByKey = this.queryModel[0].key;\n this.showClosebtn = (this.query !== '');\n } else {\n this._modelByValue = undefined;\n this.queryModel = undefined;\n this.query = '';\n }\n if (this.clearData) {\n if (get((this.typeahead as any), '_typeahead.isShown')) {\n this.typeahead.hide();\n }\n }\n });\n }\n\n private updateByDatavalue(data) {\n this.updateByDataset(data);\n this.updateByDataSource(data);\n }\n\n private updateByDataSource(data) {\n // value is present but the corresponding key is not found then fetch next set\n // modelByKey will be set only when datavalue is available inside the localData otherwise make a N/w call.\n if (isDefined(data) && !isObject(data) && this.datasource && !isDefined(this._modelByKey) && this.datafield !== ALLFIELDS) {\n // Avoid making default query if queryModel already exists.\n if (isDefined(this.queryModel) && !isEmpty(this.queryModel)) {\n this.updateDatavalueFromQueryModel();\n return;\n }\n\n // Make default query call only when datasource supports CRUD (live variable).\n if (!this._defaultQueryInvoked && this.datasource.execute(DataSource.Operation.SUPPORTS_CRUD)) {\n this.debounceDefaultQuery(data);\n }\n }\n }\n\n // updates the model value using queryModel\n private updateDatavalueFromQueryModel() {\n if (isDefined(this.queryModel)) {\n this._modelByValue = isArray(this.queryModel) ? (this.queryModel[0] as DataSetItem).value : this.queryModel;\n this._modelByKey = isArray(this.queryModel) ? (this.queryModel[0] as DataSetItem).key : this.queryModel;\n this.toBeProcessedDatavalue = undefined;\n }\n }\n\n private updateByDataset(data: any) {\n // default query is already invoked then do not make other default query call.\n // For local search i.e. searchkey is undefined, do not return, verify the datavalue against the datasetItems .\n if (this._defaultQueryInvoked && this.searchkey) {\n return;\n }\n const selectedItem = find(this.datasetItems, (item) => {\n return (isObject(item.value) ? isEqual(item.value, data) : (toString(item.value)).toLowerCase() === (toString(data)).toLowerCase());\n });\n\n // set the default only when it is available in dataset.\n if (selectedItem) {\n this.queryModel = [selectedItem];\n } else if (this.datafield === ALLFIELDS && isObject(data)) {\n this.queryModel = this.getTransformedData(extractDataAsArray(data));\n } else {\n // resetting the queryModel only when prevDatavalue is equal to data\n if ((this as any).prevDatavalue !== data) {\n this.queryModel = undefined;\n this.query = '';\n return;\n }\n }\n this.updateDatavalueFromQueryModel();\n\n // Show the label value on input.\n this._lastQuery = this.query = isDefined(this.queryModel) && this.queryModel.length ? get(this.queryModel[0], 'label') : '';\n this.showClosebtn = (this.query !== '');\n }\n\n // If we have last search results then open dropdown on focus\n private handleFocus($event) {\n if (this.type === 'search' && this.query === this._lastQuery && this._lastResult) {\n (this.typeahead as any).keyUpEventEmitter.emit(this.query);\n }\n }\n\n public notifySubscriber() {\n const parentEl = $(this.nativeElement).closest('.app-composite-widget.caption-floating');\n if (parentEl.length > 0) {\n this.app.notify('captionPositionAnimate', {displayVal: true, nativeEl: parentEl});\n }\n }\n\n // This method returns a promise that provides the filtered data from the datasource.\n public getDataSource(query: Array<string> | string, searchOnDataField?: boolean, nextItemIndex?: number): Promise<DataSetItem[]> {\n // For default query, searchOnDataField is set to true, then do not make a n/w call when datafield is ALLFIELDS\n if (searchOnDataField && this.datafield === ALLFIELDS) {\n this._loadingItems = false;\n return Promise.resolve([]);\n }\n\n // For default datavalue, search key as to be on datafield to get the default data from the filter call.\n const dataConfig: IDataProviderConfig = {\n dataset: this.dataset ? convertDataToObject(this.dataset) : undefined,\n binddataset: this.binddataset,\n datasource: this.datasource,\n datafield: this.datafield,\n hasData: this.dataset && this.dataset.length,\n query: query,\n isLocalFilter: !this.searchkey,\n searchKey: searchOnDataField ? this.datafield : this.searchkey,\n // default search call match mode should be startignorecase\n matchMode: searchOnDataField ? 'startignorecase' : this.matchmode,\n casesensitive: this.casesensitive,\n isformfield: this.isformfield,\n orderby: this.orderby,\n limit: this.limit,\n pagesize: this.pagesize,\n page: this.page,\n onBeforeservicecall: this.invokeOnBeforeServiceCall.bind(this)\n };\n\n if (this.dataoptions) {\n dataConfig.dataoptions = this.dataoptions;\n dataConfig.viewParent = this.viewParent;\n }\n\n this._loadingItems = true;\n\n return this.dataProvider.filter(dataConfig)\n .then((response: any) => {\n // response from dataProvider returns always data object.\n response = response.data || response;\n // for service variable, updating the dataset only if it is not defined or empty\n if ((!isDefined(this.dataset) || !this.dataset.length) && this.dataProvider.updateDataset) {\n this.dataset = response;\n }\n\n if (this.dataProvider.hasMoreData) {\n this.formattedDataset = this.formattedDataset.concat(response);\n } else {\n this.formattedDataset = response;\n }\n\n // explicitly setting the optionslimit as the matches more than 20 will be ignored if optionslimit is not specified.\n if (this.formattedDataset.length > 20 && !isDefined(this.limit)) {\n this.typeahead.typeaheadOptionsLimit = this.formattedDataset.length;\n }\n\n // In mobile, trigger the search by default until the results have height upto page height. Other results can be fetched by scrolling\n if (this._isOpen && this.isMobileAutoComplete() && !isUndefined(this.dataProvider.isLastPage) && !this.dataProvider.isLastPage) {\n this.triggerSearch();\n }\n\n const transformedData = this.getTransformedData(this.formattedDataset, nextItemIndex);\n\n // result contains the datafield values.\n this.result = map(transformedData, 'value');\n return transformedData;\n }, (error) => {\n this._loadingItems = false;\n return [];\n }\n ).then(result => {\n if (this.isScrolled) {\n (debounce(() => {\n this.setLastActiveMatchAsSelected();\n }, 30))();\n this.isScrolled = false;\n }\n // When no result is found, set the datavalue to undefined.\n if (!result.length) {\n this._modelByValue = undefined;\n this.queryModel = (query as string);\n }\n // on focusout i.e. on other widget focus, if n/w is pending loading icon is shown, when data is available then dropdown is shown again.\n // on unsubscribing do not show the results.\n if (this._unsubscribeDv) {\n result = [];\n }\n this._loadingItems = false;\n this._lastResult = result;\n return result;\n });\n }\n\n // this method returns the parent context i.e. Page context and not parent component's context.\n private getContext(context) {\n if (context && get(context, 'widget')) {\n return this.getContext(context.viewParent);\n }\n return context;\n }\n\n public getTransformedData(data: any, itemIndex?: number, iscustom?: boolean): DataSetItem[] {\n if (isDefined(itemIndex)) {\n itemIndex++;\n }\n\n const transformedData = transformFormData(\n this.getContext(this.viewParent),\n data,\n this.datafield,\n {\n displayField: this.displaylabel || this.displayfield,\n displayExpr: iscustom ? '' : this.displayexpression,\n bindDisplayExpr: iscustom ? '' : this.binddisplaylabel,\n bindDisplayImgSrc: this.binddisplayimagesrc,\n displayImgSrc: this.displayimagesrc\n },\n itemIndex,\n this\n );\n return getUniqObjsByDataField(transformedData, this.datafield, this.displayfield || this.displaylabel, toBoolean(this.allowempty));\n }\n\n // OptionsListTemplate listens to the scroll event and triggers this function.\n public onScroll($scrollEl: Element, evt: Event) {\n const totalHeight = $scrollEl.scrollHeight,\n clientHeight = $scrollEl.clientHeight;\n\n // If scroll is at the bottom and no request is in progress and next page records are available, fetch next page items.\n if (!this._loadingItems && !this.dataProvider.isLastPage && ($scrollEl.scrollTop + clientHeight >= totalHeight)) {\n this.loadMoreData(true);\n }\n }\n\n public ngOnInit() {\n super.ngOnInit();\n\n if (!isDefined(this.minchars)) {\n // for autocomplete set the minchars to 0\n if (this.type === 'autocomplete') {\n this.minchars = 0;\n } else {\n this.minchars = 1;\n }\n }\n\n this.listenQuery = this.isUpdateOnKeyPress();\n\n // by default for autocomplete do not show the search icon\n // by default show the searchicon for type = search\n this.showsearchicon = isDefined(this.showsearchicon) ? this.showsearchicon : (this.type === 'search');\n }\n\n public ngAfterViewInit() {\n super.ngAfterViewInit();\n\n styler(this.nativeElement as HTMLElement, this);\n this.containerTarget = getContainerTargetClass(this.nativeElement);\n }\n\n public ngAfterViewChecked() {\n const searchInputEl = $('.app-search-input');\n if (searchInputEl) {\n searchInputEl.removeAttr('aria-expanded');\n }\n }\n\n private eventData($event, item) {\n if ($event) {\n $event['data'] = {\n item : item.dataObject,\n model : item.value,\n label : item.label,\n query : this.query\n };\n }\n\n return $event;\n }\n\n // triggered on select on option from the list. Set the queryModel, query and modelByKey from the matched item.\n public typeaheadOnSelect(match: TypeaheadMatch, $event: Event): void {\n const item = match.item;\n this.queryModel = item;\n item.selected = true;\n this.query = item.label;\n this.showClosebtn = (this.query !== '');\n $event = $event || this.$typeaheadEvent;\n\n // As item.key can vary from key in the datasetItems\n this._modelByKey = item.key;\n this._modelByValue = item.value;\n\n $event = this.eventData($event, item);\n\n this.invokeOnTouched();\n this.invokeOnChange(this.datavalue, $event || {});\n // updating the variable bound to default value as invokeOnChange is not updating the variable.\n if (this.datavalue !== (this as any).prevDatavalue) {\n this.updateBoundVariable(this.datavalue);\n }\n if (this.$element.hasClass('full-screen')) {\n this.closeSearch();\n }\n this.invokeEventCallback('select', { $event, selectedValue: this.datavalue });\n this.invokeEventCallback('submit', { $event });\n\n this.updatePrevDatavalue(this.datavalue);\n }\n\n onPropertyChange(key: string, nv: any, ov: any) {\n if (key === 'tabindex') {\n return;\n }\n\n // Backward compatability from 10.3.1 to 10.3.2\n // 10.3.1 we had displaylabel as modal value\n // From 10.3.2 onwords we will be having displayexpresion as modal value\n if (this.type === 'autocomplete' && key === 'displaylabel' && this.displaylabel && (!this.displayexpression || (this.displayexpression && !this.datasource))) {\n this.displayexpression = this.displaylabel;\n this.displaylabel = undefined;\n }\n\n // when dataoptions are provided and there is no displaylabel given then displaylabel is set as the relatedfield\n if (key === 'displaylabel' && this.dataoptions && this.binddisplaylabel === null) {\n this.query = get(this._modelByValue, nv) || this._modelByValue;\n }\n\n // when search is disabled, do not load any more data or just clear the data that is already in process or loaded.\n if (key === 'disabled') {\n if (nv === false) {\n this.clearData = false;\n } else {\n this.clearData = true;\n if (get((this.typeahead as any), '_typeahead.isShown')) {\n this.typeahead.hide();\n }\n }\n }\n\n super.onPropertyChange(key, nv, ov);\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.SearchComponent","filter"],"mappings":"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"}
@@ -92,7 +92,6 @@ export declare class SearchComponent extends DatasetAwareFormComponent implement
92
92
  private updateDatavalueFromQueryModel;
93
93
  private updateByDataset;
94
94
  private handleFocus;
95
- handleInputBlur($event: FocusEvent): void;
96
95
  notifySubscriber(): void;
97
96
  getDataSource(query: Array<string> | string, searchOnDataField?: boolean, nextItemIndex?: number): Promise<DataSetItem[]>;
98
97
  private getContext;
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.11.7-rc.6211",
3
+ "version": "11.12.0-next.28182",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@wavemaker/app-ng-runtime",
9
- "version": "11.11.7-rc.6211",
9
+ "version": "11.12.0-next.28182",
10
10
  "license": "MIT",
11
11
  "engines": {
12
12
  "node": ">=18.16.1",
package/package-lock.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.11.7-rc.6211",
3
+ "version": "11.12.0-next.28182",
4
4
  "lockfileVersion": 3,
5
5
  "requires": true,
6
6
  "packages": {
7
7
  "": {
8
8
  "name": "@wavemaker/app-ng-runtime",
9
- "version": "11.11.7-rc.6211",
9
+ "version": "11.12.0-next.28182",
10
10
  "license": "MIT",
11
11
  "engines": {
12
12
  "node": ">=18.16.1",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wavemaker/app-ng-runtime",
3
- "version": "11.11.7-rc.6211",
3
+ "version": "11.12.0-next.28182",
4
4
  "description": "All modules required for a WaveMaker application.",
5
5
  "main": "index.js",
6
6
  "scripts": {