ngx-edu-sharing-metaqs2 0.9.29 → 0.9.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -75,20 +75,30 @@ This library provides the following widgets:
75
75
 
76
76
  ### Metadatenvollständigkeit von Sammlungen
77
77
  [TreeCollectionDetailsComponent](./src/lib/tree-collection-details/tree-collection-details.component.ts)
78
- selector: `<app-tree-collection-details />`
78
+ - selector: `<metaqs2-tree-collection-details />`
79
+ - inputs:
80
+ - `collectionId` (required) - the id of the collection to display
81
+
79
82
  ### Metadatenvollständigkeit von Quellen
80
83
  [QualityMatrixComponent](./src/lib/components/quality-matrix/quality_matrix.ts)
81
- selector: `<app-quality-matrix-v2 />`
82
- ### Material in Sammlungen
84
+ selector: `<metaqs2--quality-matrix-v2 />`
85
+ ### Sammlungsfüllstand
83
86
  [TreeSearchCountsComponent](./src/lib/tree-search-counts/tree-search-counts.component.ts)
84
- selector: `<app-tree-search-counts />`
87
+ - selector: `<metaqs2-tree-search-counts />`
88
+ - inputs:
89
+ - `collectionId` (required) - the id of the collection to display
85
90
  ### Sammlungsverlauf
86
91
  Übersicht über die Anzahl der Materialien in Sammlungen über die Zeit.
87
92
  [CollectionCountHistoryComponent](./src/lib/collection-count-history/collection-count-history.component.ts)
88
93
 
89
94
  ### Counts with History
90
95
  [CountHistoryComponent](./src/lib/counts-with-history/counts-with-history.component.ts)
91
- selector: `<lib-counts-with-history />`.
96
+ - selector: `<metaqs2-counts-with-history />`.
97
+ - inputs:
98
+ - `apiMethod` (required) - the method to call on the MetaApiService
99
+ - `sourceType` (optional) - the type of the source ( 'replicationSource' | 'collection')
100
+ - `pageTitle` (optional) - translation key for the title
101
+ - `columnTranslationkey` (optional) - translation key for the columns
92
102
 
93
103
  This is a generic component that can be used to display counts with a history.
94
104
  It can be configered by providing the follwing data structure in it's routing configuration
@@ -101,6 +111,7 @@ or by providing it as an input to the component:
101
111
  pageTitle: 'pageTitle.content-type-count', // translation key for the title (if not provided or empty, the page header will not be displayed)
102
112
  apiMethod: 'getMaterialTypeCountsByReplicationSource', // the method to call on the MetaApiService (required)
103
113
  columnTranslationkey: 'issues.', // translation key for the columns (optional)
114
+ sourceType: 'replicationSource' // the type of the source ( 'replicationSource' | 'collection')e
104
115
  },
105
116
  }
106
117
  ```
@@ -110,7 +121,9 @@ Currently the following manifestations are implemented:
110
121
  {
111
122
  path: 'content-type-count',
112
123
  component: CountsWithHistoryComponent,
113
- data: { pageTitle: 'pageTitle.content-type-count', apiMethod: 'getMaterialTypeCountsByReplicationSource' }
124
+ data: { pageTitle: 'pageTitle.content-type-count',
125
+ apiMethod: 'getMaterialTypeCountsByReplicationSource',
126
+ sourceType: 'replicationSource' }
114
127
  }
115
128
  ```
116
129
  #### Lizenzarten nach Quellen
@@ -119,7 +132,9 @@ Currently the following manifestations are implemented:
119
132
  {
120
133
  path: 'license-count-sources',
121
134
  component: CountsWithHistoryComponent,
122
- data: { pageTitle: 'pageTitle.license-count-sources', apiMethod: 'getLicenseCountsByReplicationSource' },
135
+ data: { pageTitle: 'pageTitle.license-count-sources',
136
+ apiMethod: 'getLicenseCountsByReplicationSource',
137
+ sourceType: 'replicationSource' }
123
138
  },
124
139
  ```
125
140
  #### Lizenzarten nach Sammlungen
@@ -127,7 +142,9 @@ Currently the following manifestations are implemented:
127
142
  {
128
143
  path: 'license-count-collections',
129
144
  component: CountsWithHistoryComponent,
130
- data: { pageTitle: 'pageTitle.license-count-collections', apiMethod: 'getMaterialCountMatrixByLicenseGroup' },
145
+ data: { pageTitle: 'pageTitle.license-count-collections',
146
+ apiMethod: 'getMaterialCountMatrixByLicenseGroup',
147
+ sourceType: 'collection' }
131
148
  }
132
149
  ```
133
150
  #### Quellen und ihre Qualitätsprobleme
@@ -137,7 +154,8 @@ Currently the following manifestations are implemented:
137
154
  component: CountsWithHistoryComponent,
138
155
  data: {
139
156
  pageTitle: 'pageTitle.issues-replicationsources',
140
- apiMethod: 'getCompletenessForReplicationSources',
157
+ apiMethod: 'getCompletenessForReplicationSources',
158
+ sourceType: 'replicationSource',
141
159
  columnTranslationkey: 'issues.'},
142
160
  },
143
161
  ```
@@ -149,6 +167,7 @@ Currently the following manifestations are implemented:
149
167
  data: {
150
168
  title: 'pageTitle.issues-collections',
151
169
  apiMethod: 'getCompletenessForDisciplinaryPortals',
170
+ sourceType: 'collection',
152
171
  columnTranslationkey: 'issues.',
153
172
  }
154
173
  },
@@ -110,7 +110,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
110
110
  type: ViewChild,
111
111
  args: [BaseChartDirective]
112
112
  }], pageTitle: [{
113
- type: Input,
114
- args: [{ required: true }]
113
+ type: Input
115
114
  }] } });
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnkvY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnkvY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7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RSxJQUFJLENBQUMsSUFBSTtpQkFDakIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQTVGVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1S0FDL0Isa0JBQWtCLGdEQ25DL0Isb2xCQW9CVywwRERBUCxrQkFBa0IsK01BQ2xCLG9CQUFvQixxR0FDcEIsT0FBTyxvR0FDUCxhQUFhLDREQUNiLFlBQVksNkZBQ1osY0FBYyx3REFDZCxTQUFTLDZDQUNULG1CQUFtQiwrQkFDbkIsT0FBTyxvRkFDUCxJQUFJOzs0RkFLSywrQkFBK0I7a0JBbEIzQyxTQUFTOytCQUNFLGtDQUFrQyxjQUNoQyxJQUFJLFdBQ1A7d0JBQ1Asa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsSUFBSTtxQkFDTDs0R0FLOEIsS0FBSztzQkFBbkMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBd0JuQixTQUFTO3NCQURsQixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRGVzdHJveVJlZiwgSW5wdXQsIE9uSW5pdCwgc2lnbmFsLCBWaWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENoYXJ0Q29uZmlndXJhdGlvbiwgQ2hhcnREYXRhc2V0IH0gZnJvbSAnY2hhcnQuanMnO1xuaW1wb3J0IHsgQmFzZUNoYXJ0RGlyZWN0aXZlIH0gZnJvbSAnbmcyLWNoYXJ0cyc7XG5pbXBvcnQgeyBEYXRlVGltZSwgRGF0ZVRpbWVVbml0IH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgRm9ybUNvbnRyb2wsIEZvcm1Hcm91cCwgUmVhY3RpdmVGb3Jtc01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcblxuaW1wb3J0IHsgTW9udGhwaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL21vbnRocGlja2VyL21vbnRocGlja2VyLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBDb3VudCB9IGZyb20gJy4uL2phdmEtYXBpJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEFzeW5jUGlwZSwgTmdDbGFzcywgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XG5pbXBvcnQgeyB0YWtlVW50aWxEZXN0cm95ZWQgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgZmluYWxpemUsIHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBNYXRlcmlhbENvdW50RmlsdGVyIH0gZnJvbSAnLi4vamF2YS1hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZXRhcXMyLWNvbGxlY3Rpb24tY291bnQtaGlzdG9yeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBCYXNlQ2hhcnREaXJlY3RpdmUsXG4gICAgTW9udGhwaWNrZXJDb21wb25lbnQsXG4gICAgTWF0Q2FyZCxcbiAgICBNYXRDYXJkSGVhZGVyLFxuICAgIE1hdENhcmRUaXRsZSxcbiAgICBNYXRDYXJkQ29udGVudCxcbiAgICBBc3luY1BpcGUsXG4gICAgUmVhY3RpdmVGb3Jtc01vZHVsZSxcbiAgICBOZ0NsYXNzLFxuICAgIE5nSWYsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnkuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybDogJy4vY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ29sbGVjdGlvbkNvdW50SGlzdG9yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIEBWaWV3Q2hpbGQoQmFzZUNoYXJ0RGlyZWN0aXZlKSBjaGFydD86IEJhc2VDaGFydERpcmVjdGl2ZTtcbiAgcHJvdGVjdGVkIGxpbmVDaGFydE9wdGlvbnM6IENoYXJ0Q29uZmlndXJhdGlvblsnb3B0aW9ucyddID0ge1xuICAgIHBhcnNpbmc6IHtcbiAgICAgIHhBeGlzS2V5OiAnZGF0ZScsXG4gICAgICB5QXhpc0tleTogJ2NvdW50JyxcbiAgICB9LFxuICAgIGZvbnQ6IHtcbiAgICAgIGZhbWlseTogJ01vbnRzZXJyYXQnLFxuICAgIH0sXG4gICAgYW5pbWF0aW9uOiBmYWxzZSxcbiAgfTtcbiAgcHJvdGVjdGVkIGRhdGFwb2ludHMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxDaGFydERhdGFzZXQ8J2xpbmUnLCBDb3VudFtdPltdPihbXSk7XG4gIHByb3RlY3RlZCBpc0xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHJlYWRvbmx5IHJhbmdlOiBGb3JtR3JvdXA8e1xuICAgIHN0YXJ0OiBGb3JtQ29udHJvbDxEYXRlVGltZTxib29sZWFuPj47XG4gICAgZW5kOiBGb3JtQ29udHJvbDxEYXRlVGltZTxib29sZWFuPj47XG4gIH0+ID0gbmV3IEZvcm1Hcm91cCh7XG4gICAgc3RhcnQ6IG5ldyBGb3JtQ29udHJvbCgpLFxuICAgIGVuZDogbmV3IEZvcm1Db250cm9sKCksXG4gIH0pO1xuICBwcm90ZWN0ZWQgZ3JhbnVsYXJpdGllczogRGF0ZVRpbWVVbml0W10gPSBbJ3llYXInLCAnbW9udGgnLCAnd2VlaycsICdkYXknXTtcbiAgcHJvdGVjdGVkIGdyYW51bGFyaXR5ID0gbmV3IEZvcm1Db250cm9sPERhdGVUaW1lVW5pdD4oJ21vbnRoJywgeyBub25OdWxsYWJsZTogdHJ1ZSB9KTtcblxuICBASW5wdXQoeyByZXF1aXJlZDogdHJ1ZSB9KVxuICBwcm90ZWN0ZWQgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWV0YUFwaTogTWV0YUFwaVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCk7XG4gIH1cblxuICByZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpIHtcbiAgICB0aGlzLnJhbmdlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAvL3RoZSBNYXRlcmlhbCBEYXRlcGlja2VyIGVtaXRzIHRoZSBpbml0aWFsIHZhbHVlcyA0IHRpbWVzIHdoZW4gaXQgc3RhcnRzLCBzbyB3ZSBuZWVkIHRvIGRpc3RpbmN0IHRoZW1cbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJldi5zdGFydCA9PT0gY3Vyci5zdGFydCAmJiBwcmV2LmVuZCA9PT0gY3Vyci5lbmQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgfSk7XG4gICAgdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0VGltZXJhbmdlRmlsdGVyKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChyYW5nZUZpbHRlcikgPT4ge1xuICAgICAgICBpZiAocmFuZ2VGaWx0ZXIpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHJhbmdlRmlsdGVyLnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSAncmFuZ2VTdGFydCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLnN0YXJ0T2YodGhpcy5ncmFudWxhcml0eS52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21JU08ocmFuZ2VGaWx0ZXIudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09ICdyYW5nZUVuZCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLmVuZE9mKHRoaXMuZ3JhbnVsYXJpdHkudmFsdWUpO1xuICAgICAgICAgIHRoaXMucmFuZ2Uuc2V0Q29udHJvbCgnc3RhcnQnLCBuZXcgRm9ybUNvbnRyb2w8RGF0ZVRpbWU+KHN0YXJ0RGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJhbmdlLnNldENvbnRyb2woJ2VuZCcsIG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZT4oZW5kRGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgY29uc3QgcmVxdWVzdDogTWF0ZXJpYWxDb3VudEZpbHRlciA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5yYW5nZS52YWx1ZS5zdGFydD8udG9JU08oKSEsXG4gICAgICBlbmREYXRlOiB0aGlzLnJhbmdlLnZhbHVlLmVuZD8udG9JU08oKSEsXG4gICAgICBncmFudWxhcml0eTogdGhpcy5ncmFudWxhcml0eS52YWx1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0RWRpdG9yaWFsTWF0ZXJpYWxDb3VudHMocmVxdWVzdClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YXBvaW50cyA9IHJlc3BvbnNlLm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLmNvdW50cy5tYXAoKGNvdW50KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0ZTogRGF0ZVRpbWUuZnJvbUlTTyhjb3VudC5kYXRlKS50b0Zvcm1hdCgnTExMTCB5eXl5JykhLFxuICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudC5jb3VudCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbGFiZWw6IGRhdGEubmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhcG9pbnRzJC5uZXh0KGRhdGFwb2ludHMpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cInBhZ2VUaXRsZVwiPlxuICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgIHt7IHBhZ2VUaXRsZSB9fXt7IGlzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCIgfX1cbiAgICA8L21hdC1jYXJkLXRpdGxlPlxuICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG5cbiAgICA8bWV0YXFzMi1tb250aHBpY2tlclxuICAgICAgW2lucHV0R3JvdXBdPVwicmFuZ2VcIj48L21ldGFxczItbW9udGhwaWNrZXI+XG5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiPlxuICAgICAgPGNhbnZhc1xuICAgICAgICBiYXNlQ2hhcnRcbiAgICAgICAgW2RhdGFzZXRzXT1cIihkYXRhcG9pbnRzJCB8IGFzeW5jKSB8fCBbXVwiXG4gICAgICAgIFtvcHRpb25zXT1cImxpbmVDaGFydE9wdGlvbnNcIlxuICAgICAgICBbdHlwZV09XCInbGluZSdcIlxuICAgICAgPjwvY2FudmFzPlxuICAgIDwvZGl2PlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPiJdfQ==
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnkvY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnkvY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWMsS0FBSyxFQUFVLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFeEYsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxRQUFRLEVBQWdCLE1BQU0sT0FBTyxDQUFDO0FBQy9DLE9BQU8sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUM5RixPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRTdFLE9BQU8sRUFBRSxvQkFBb0IsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBRzNFLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDaEUsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7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RSxJQUFJLENBQUMsSUFBSTtpQkFDakIsQ0FBQztZQUNKLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDcEMsQ0FBQyxDQUFDLENBQUM7SUFDUCxDQUFDOytHQTVGVSwrQkFBK0I7bUdBQS9CLCtCQUErQix1S0FDL0Isa0JBQWtCLGdEQ25DL0Isb2xCQW9CVywwRERBUCxrQkFBa0IsK01BQ2xCLG9CQUFvQixxR0FDcEIsT0FBTyxvR0FDUCxhQUFhLDREQUNiLFlBQVksNkZBQ1osY0FBYyx3REFDZCxTQUFTLDZDQUNULG1CQUFtQiwrQkFDbkIsT0FBTyxvRkFDUCxJQUFJOzs0RkFLSywrQkFBK0I7a0JBbEIzQyxTQUFTOytCQUNFLGtDQUFrQyxjQUNoQyxJQUFJLFdBQ1A7d0JBQ1Asa0JBQWtCO3dCQUNsQixvQkFBb0I7d0JBQ3BCLE9BQU87d0JBQ1AsYUFBYTt3QkFDYixZQUFZO3dCQUNaLGNBQWM7d0JBQ2QsU0FBUzt3QkFDVCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsSUFBSTtxQkFDTDs0R0FLOEIsS0FBSztzQkFBbkMsU0FBUzt1QkFBQyxrQkFBa0I7Z0JBd0I3QixTQUFTO3NCQURSLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIERlc3Ryb3lSZWYsIElucHV0LCBPbkluaXQsIHNpZ25hbCwgVmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDaGFydENvbmZpZ3VyYXRpb24sIENoYXJ0RGF0YXNldCB9IGZyb20gJ2NoYXJ0LmpzJztcbmltcG9ydCB7IEJhc2VDaGFydERpcmVjdGl2ZSB9IGZyb20gJ25nMi1jaGFydHMnO1xuaW1wb3J0IHsgRGF0ZVRpbWUsIERhdGVUaW1lVW5pdCB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IE1hdENhcmQsIE1hdENhcmRDb250ZW50LCBNYXRDYXJkSGVhZGVyLCBNYXRDYXJkVGl0bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9jYXJkJztcbmltcG9ydCB7IEZvcm1Db250cm9sLCBGb3JtR3JvdXAsIFJlYWN0aXZlRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5cbmltcG9ydCB7IE1vbnRocGlja2VyQ29tcG9uZW50IH0gZnJvbSAnLi9tb250aHBpY2tlci9tb250aHBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgQ291bnQgfSBmcm9tICcuLi9qYXZhLWFwaSc7XG5pbXBvcnQgeyBNZXRhQXBpU2VydmljZSB9IGZyb20gJy4uL21ldGEtYXBpLnNlcnZpY2UnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgdGFrZVVudGlsRGVzdHJveWVkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgZGlzdGluY3RVbnRpbENoYW5nZWQsIGZpbmFsaXplLCB0YWtlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgTWF0ZXJpYWxDb3VudEZpbHRlciB9IGZyb20gJy4uL2phdmEtYXBpJztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnbWV0YXFzMi1jb2xsZWN0aW9uLWNvdW50LWhpc3RvcnknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgQmFzZUNoYXJ0RGlyZWN0aXZlLFxuICAgIE1vbnRocGlja2VyQ29tcG9uZW50LFxuICAgIE1hdENhcmQsXG4gICAgTWF0Q2FyZEhlYWRlcixcbiAgICBNYXRDYXJkVGl0bGUsXG4gICAgTWF0Q2FyZENvbnRlbnQsXG4gICAgQXN5bmNQaXBlLFxuICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgTmdDbGFzcyxcbiAgICBOZ0lmLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY29sbGVjdGlvbi1jb3VudC1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvbGxlY3Rpb24tY291bnQtaGlzdG9yeS5jb21wb25lbnQuc2NzcycsXG59KVxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25Db3VudEhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBAVmlld0NoaWxkKEJhc2VDaGFydERpcmVjdGl2ZSkgY2hhcnQ/OiBCYXNlQ2hhcnREaXJlY3RpdmU7XG4gIHByb3RlY3RlZCBsaW5lQ2hhcnRPcHRpb25zOiBDaGFydENvbmZpZ3VyYXRpb25bJ29wdGlvbnMnXSA9IHtcbiAgICBwYXJzaW5nOiB7XG4gICAgICB4QXhpc0tleTogJ2RhdGUnLFxuICAgICAgeUF4aXNLZXk6ICdjb3VudCcsXG4gICAgfSxcbiAgICBmb250OiB7XG4gICAgICBmYW1pbHk6ICdNb250c2VycmF0JyxcbiAgICB9LFxuICAgIGFuaW1hdGlvbjogZmFsc2UsXG4gIH07XG4gIHByb3RlY3RlZCBkYXRhcG9pbnRzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Q2hhcnREYXRhc2V0PCdsaW5lJywgQ291bnRbXT5bXT4oW10pO1xuICBwcm90ZWN0ZWQgaXNMb2FkaW5nID0gc2lnbmFsKHRydWUpO1xuICByZWFkb25seSByYW5nZTogRm9ybUdyb3VwPHtcbiAgICBzdGFydDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICAgIGVuZDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbCgpLFxuICB9KTtcbiAgcHJvdGVjdGVkIGdyYW51bGFyaXRpZXM6IERhdGVUaW1lVW5pdFtdID0gWyd5ZWFyJywgJ21vbnRoJywgJ3dlZWsnLCAnZGF5J107XG4gIHByb3RlY3RlZCBncmFudWxhcml0eSA9IG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZVVuaXQ+KCdtb250aCcsIHsgbm9uTnVsbGFibGU6IHRydWUgfSk7XG5cbiAgQElucHV0KClcbiAgcGFnZVRpdGxlOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWV0YUFwaTogTWV0YUFwaVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgZGVzdHJveVJlZjogRGVzdHJveVJlZikge31cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLnJlZ2lzdGVyRGF0ZVJhbmdlRmlsdGVyKCk7XG4gIH1cblxuICByZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpIHtcbiAgICB0aGlzLnJhbmdlLnZhbHVlQ2hhbmdlc1xuICAgICAgLnBpcGUoXG4gICAgICAgIHRha2VVbnRpbERlc3Ryb3llZCh0aGlzLmRlc3Ryb3lSZWYpLFxuICAgICAgICAvL3RoZSBNYXRlcmlhbCBEYXRlcGlja2VyIGVtaXRzIHRoZSBpbml0aWFsIHZhbHVlcyA0IHRpbWVzIHdoZW4gaXQgc3RhcnRzLCBzbyB3ZSBuZWVkIHRvIGRpc3RpbmN0IHRoZW1cbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKHByZXYsIGN1cnIpID0+IHtcbiAgICAgICAgICByZXR1cm4gcHJldi5zdGFydCA9PT0gY3Vyci5zdGFydCAmJiBwcmV2LmVuZCA9PT0gY3Vyci5lbmQ7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgfSk7XG4gICAgdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0VGltZXJhbmdlRmlsdGVyKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKChyYW5nZUZpbHRlcikgPT4ge1xuICAgICAgICBpZiAocmFuZ2VGaWx0ZXIpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHJhbmdlRmlsdGVyLnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSAncmFuZ2VTdGFydCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLnN0YXJ0T2YodGhpcy5ncmFudWxhcml0eS52YWx1ZSk7XG4gICAgICAgICAgY29uc3QgZW5kRGF0ZSA9IERhdGVUaW1lLmZyb21JU08ocmFuZ2VGaWx0ZXIudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09ICdyYW5nZUVuZCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLmVuZE9mKHRoaXMuZ3JhbnVsYXJpdHkudmFsdWUpO1xuICAgICAgICAgIHRoaXMucmFuZ2Uuc2V0Q29udHJvbCgnc3RhcnQnLCBuZXcgRm9ybUNvbnRyb2w8RGF0ZVRpbWU+KHN0YXJ0RGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSwge1xuICAgICAgICAgICAgZW1pdEV2ZW50OiBmYWxzZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnJhbmdlLnNldENvbnRyb2woJ2VuZCcsIG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZT4oZW5kRGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgbG9hZERhdGEoKTogdm9pZCB7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuXG4gICAgY29uc3QgcmVxdWVzdDogTWF0ZXJpYWxDb3VudEZpbHRlciA9IHtcbiAgICAgIHN0YXJ0RGF0ZTogdGhpcy5yYW5nZS52YWx1ZS5zdGFydD8udG9JU08oKSEsXG4gICAgICBlbmREYXRlOiB0aGlzLnJhbmdlLnZhbHVlLmVuZD8udG9JU08oKSEsXG4gICAgICBncmFudWxhcml0eTogdGhpcy5ncmFudWxhcml0eS52YWx1ZSxcbiAgICB9O1xuXG4gICAgdGhpcy5tZXRhQXBpXG4gICAgICAuZ2V0RWRpdG9yaWFsTWF0ZXJpYWxDb3VudHMocmVxdWVzdClcbiAgICAgIC5waXBlKFxuICAgICAgICB0YWtlKDEpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKVxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgY29uc3QgZGF0YXBvaW50cyA9IHJlc3BvbnNlLm1hcCgoZGF0YSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXRhOiBkYXRhLmNvdW50cy5tYXAoKGNvdW50KSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGF0ZTogRGF0ZVRpbWUuZnJvbUlTTyhjb3VudC5kYXRlKS50b0Zvcm1hdCgnTExMTCB5eXl5JykhLFxuICAgICAgICAgICAgICAgIGNvdW50OiBjb3VudC5jb3VudCxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgbGFiZWw6IGRhdGEubmFtZSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5kYXRhcG9pbnRzJC5uZXh0KGRhdGFwb2ludHMpO1xuICAgICAgfSk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwib3V0bGluZWRcIj5cbiAgPG1hdC1jYXJkLWhlYWRlciAqbmdJZj1cInBhZ2VUaXRsZVwiPlxuICAgIDxtYXQtY2FyZC10aXRsZT5cbiAgICAgIHt7IHBhZ2VUaXRsZSB9fXt7IGlzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCIgfX1cbiAgICA8L21hdC1jYXJkLXRpdGxlPlxuICA8L21hdC1jYXJkLWhlYWRlcj5cbiAgPG1hdC1jYXJkLWNvbnRlbnQ+XG5cbiAgICA8bWV0YXFzMi1tb250aHBpY2tlclxuICAgICAgW2lucHV0R3JvdXBdPVwicmFuZ2VcIj48L21ldGFxczItbW9udGhwaWNrZXI+XG5cbiAgICA8ZGl2IFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiPlxuICAgICAgPGNhbnZhc1xuICAgICAgICBiYXNlQ2hhcnRcbiAgICAgICAgW2RhdGFzZXRzXT1cIihkYXRhcG9pbnRzJCB8IGFzeW5jKSB8fCBbXVwiXG4gICAgICAgIFtvcHRpb25zXT1cImxpbmVDaGFydE9wdGlvbnNcIlxuICAgICAgICBbdHlwZV09XCInbGluZSdcIlxuICAgICAgPjwvY2FudmFzPlxuICAgIDwvZGl2PlxuICA8L21hdC1jYXJkLWNvbnRlbnQ+XG48L21hdC1jYXJkPiJdfQ==
@@ -1,41 +1,89 @@
1
1
  import { Injectable } from '@angular/core';
2
2
  import { inject } from '@angular/core';
3
3
  import { ConfigHelperService } from '../../config-helper.service';
4
+ import { MetaApiService } from '../../meta-api.service';
5
+ import { BehaviorSubject } from 'rxjs';
6
+ import { take } from 'rxjs/operators';
4
7
  import * as i0 from "@angular/core";
8
+ /**
9
+ * This service provides methods to create links to the editorial desk with specific filters.
10
+ */
11
+ /* This map makes it easier for me to keep track which issues are mapped to which filters */
12
+ const FilterNames2Issues = {
13
+ //Lizenzen
14
+ 'virtual:editorial_license': ['oer', 'other_cc', 'copyright', 'without_license'],
15
+ //Materialtypen werden im Constructor gesetzt
16
+ 'virtual:oeh_lrt': [],
17
+ 'virtual:editorial_exclusion': [
18
+ 'outdated',
19
+ 'without_preview',
20
+ 'without_title',
21
+ 'without_description',
22
+ 'without_url',
23
+ 'without_type',
24
+ 'without_taxonomy_id',
25
+ 'without_education_level',
26
+ 'without_target_group',
27
+ 'without_license',
28
+ 'without_publisher',
29
+ ],
30
+ };
31
+ // Here we map back the issues to the filter names in the editorial desk, so we can look up the filter name for a given issue
32
+ const Issues2FilterNames = Object.entries(FilterNames2Issues).reduce((map, [key, value]) => {
33
+ value.forEach((issue) => map.set(issue, key));
34
+ return map;
35
+ }, new Map());
36
+ // maps our values to the values of the filter in the editorial desk
37
+ const MapValuesForFilter = {
38
+ 'virtual:editorial_exclusion': {
39
+ outdated: null,
40
+ without_preview: null,
41
+ without_title: ['missing_title'],
42
+ without_description: ['missing_description'],
43
+ without_url: ['links'],
44
+ without_type: ['missing_oeh_lrt'],
45
+ without_taxonomy_id: ['without_taxonomy_id'],
46
+ without_education_level: ['missing_educationalcontext'],
47
+ without_target_group: ['missing_educationalintendedenduserrole'],
48
+ without_license: ['missing_license'],
49
+ without_publisher: ['missing_replicationsource'],
50
+ },
51
+ 'virtual:editorial_license': {
52
+ oer: ['oer'],
53
+ copyright: ['none_oer'],
54
+ without_license: ['none'],
55
+ },
56
+ 'virtual:oeh_lrt': {},
57
+ };
5
58
  /*
6
59
  This is a map from properties of a document to filter names
7
60
  */
8
61
  const PROPERTIES2FILTERS = new Map([
9
62
  ['metadata.educationalContexts', 'ccm:educationalcontext'],
10
63
  ['metadata.disciplines', 'virtual:taxonid'],
11
- ['collections.nodeRef.id.keyword', 'virtual:collection_id_primary'],
12
64
  //["responsibility", "virtual:collection_id_primary"] // das zeigt auf "sammlungszugehörigkeit" und ist falsch
13
65
  ]);
14
- /*
15
- This map our column "names" to the valid values of the virtual:editorial_exclusion Filter
16
- */
17
- const ISSUETYPE2FILTERS = new Map([
18
- ['without_title', 'missing_title'],
19
- ['without_description', 'missing_description'],
20
- ['without_education_level', 'missing_educationalcontext'],
21
- ['without_target_group', 'missing_educationalintendedenduserrole'],
22
- ['without_taxonomy_id', 'missing_taxonid'],
23
- ['without_category', 'missing_oeh_lrt'],
24
- ['without_license', 'missing_license'],
25
- ]);
26
- /*
27
- interestingly it is not necessary to combine the nodeRef.id
28
- with https://vocabs.openeduhub.de/w3id.org/openeduhub/vocabs/oeh-topics/{nodeRef.id}
29
- */
30
66
  export class EditorialLinkService {
31
67
  constructor() {
32
68
  this.env = inject(ConfigHelperService);
69
+ this.api = inject(MetaApiService);
70
+ this.typesLoaded$ = new BehaviorSubject(false);
71
+ this.api
72
+ .getMaterialTypesMapping()
73
+ .pipe(take(1))
74
+ .subscribe((types) => {
75
+ for (const [key, value] of Object.entries(types)) {
76
+ Issues2FilterNames.set(key, 'virtual:oeh_lrt');
77
+ MapValuesForFilter['virtual:oeh_lrt'][key] = value;
78
+ }
79
+ this.typesLoaded$.next(true);
80
+ });
33
81
  }
34
82
  openByReplicationsourceAndIssueTypeWithFilters(source, issue, selectedFilters) {
35
83
  const filters = {};
36
84
  filters['virtual:audit_filter'] = ['all'];
37
85
  filters['ccm:oeh_publisher_combined'] = [source];
38
- filters['virtual:editorial_exclusion'] = [ISSUETYPE2FILTERS.get(issue)];
86
+ filters['virtual:editorial_exclusion'] = MapValuesForFilter['virtual:editorial_exclusion'][issue];
39
87
  for (const [field, values] of Object.entries(selectedFilters)) {
40
88
  if (values && values.length) {
41
89
  const editorialFiltername = PROPERTIES2FILTERS.get(field);
@@ -51,7 +99,7 @@ export class EditorialLinkService {
51
99
  openByCollectionAndIssueType(collectionId, issueType, pageTitle) {
52
100
  const filters = {};
53
101
  filters['virtual:audit_filter'] = ['all'];
54
- filters['virtual:editorial_exclusion'] = [ISSUETYPE2FILTERS.get(issueType)];
102
+ filters['virtual:editorial_exclusion'] = MapValuesForFilter['virtual:editorial_exclusion'][issueType];
55
103
  filters['virtual:collection_id_primary'] = [collectionId];
56
104
  const theUrl = this.env.eduSharingPath + '/components/editorial-desk';
57
105
  const params = new URLSearchParams();
@@ -67,6 +115,46 @@ export class EditorialLinkService {
67
115
  params.set('mode', 'render');
68
116
  window.open(`${theUrl}?${params}`, 'editor_frontend');
69
117
  }
118
+ /**
119
+ * This method creates a link to the editorial desk with specific filters.
120
+ * It returns the URL to the editorial desk with the filters applied or null if the issueId is not mapped to a filter.
121
+ * With this we can render a link with an href attribute to the editorial desk in the frontend.
122
+ * @see the counts-with-history.component.scss how we style links only if their hrefs are not null
123
+ *
124
+ * @param sourceType The type of the source, e.g. "replicationSource" or "collection"
125
+ * @param sourceId The id of the source. This is the first column in the table.
126
+ * @param issueId The id of the issue. These are the other columns in the table.
127
+ */
128
+ createLinkForCountsWithHistory(sourceType, sourceId, issueId) {
129
+ const filters = {};
130
+ filters['virtual:audit_filter'] = ['all'];
131
+ // determine the "main" filter
132
+ if (sourceType === 'replicationSource') {
133
+ filters['ccm:oeh_publisher_combined'] = [sourceId];
134
+ }
135
+ else if (sourceType === 'collection') {
136
+ filters['virtual:collection_id_primary'] = [sourceId];
137
+ }
138
+ if (!Issues2FilterNames.has(issueId)) {
139
+ return null;
140
+ }
141
+ const filterName = Issues2FilterNames.get(issueId);
142
+ if (!filterName) {
143
+ // console.debug("No filter name found for issue id: " + issueId);
144
+ return null;
145
+ }
146
+ const filterValue = MapValuesForFilter[filterName][issueId];
147
+ if (!filterValue) {
148
+ // console.debug("No filter value found for issue id: " + issueId);
149
+ return null;
150
+ }
151
+ filters[filterName] = filterValue;
152
+ const theUrl = this.env.eduSharingPath + '/components/editorial-desk';
153
+ const params = new URLSearchParams();
154
+ params.set('mode', 'audit');
155
+ params.set('filters', JSON.stringify(filters));
156
+ return `${theUrl}?${params}`;
157
+ }
70
158
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditorialLinkService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
71
159
  static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: EditorialLinkService, providedIn: 'root' }); }
72
160
  }
@@ -76,4 +164,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
76
164
  providedIn: 'root',
77
165
  }]
78
166
  }], ctorParameters: () => [] });
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yaWFsLWxpbmsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRvcmlhbC1saW5rLXNlcnZpY2UvZWRpdG9yaWFsLWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7O0FBRWxFOztHQUVHO0FBQ0gsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLEdBQUcsQ0FBaUI7SUFDakQsQ0FBQyw4QkFBOEIsRUFBRSx3QkFBd0IsQ0FBQztJQUMxRCxDQUFDLHNCQUFzQixFQUFFLGlCQUFpQixDQUFDO0lBQzNDLENBQUMsZ0NBQWdDLEVBQUUsK0JBQStCLENBQUM7SUFDbkUsOEdBQThHO0NBQy9HLENBQUMsQ0FBQztBQUNIOztFQUVFO0FBRUYsTUFBTSxpQkFBaUIsR0FBd0IsSUFBSSxHQUFHLENBQWlCO0lBQ3JFLENBQUMsZUFBZSxFQUFFLGVBQWUsQ0FBQztJQUNsQyxDQUFDLHFCQUFxQixFQUFFLHFCQUFxQixDQUFDO0lBQzlDLENBQUMseUJBQXlCLEVBQUUsNEJBQTRCLENBQUM7SUFDekQsQ0FBQyxzQkFBc0IsRUFBRSx3Q0FBd0MsQ0FBQztJQUNsRSxDQUFDLHFCQUFxQixFQUFFLGlCQUFpQixDQUFDO0lBQzFDLENBQUMsa0JBQWtCLEVBQUUsaUJBQWlCLENBQUM7SUFDdkMsQ0FBQyxpQkFBaUIsRUFBRSxpQkFBaUIsQ0FBQztDQUN2QyxDQUFDLENBQUM7QUFDSDs7O0dBR0c7QUFJSCxNQUFNLE9BQU8sb0JBQW9CO0lBRy9CO1FBRlEsUUFBRyxHQUFHLE1BQU0sQ0FBQyxt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OytHQTlDVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWdIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uZmlnLWhlbHBlci5zZXJ2aWNlJztcblxuLypcblRoaXMgaXMgYSBtYXAgZnJvbSBwcm9wZXJ0aWVzIG9mIGEgZG9jdW1lbnQgdG8gZmlsdGVyIG5hbWVzXG4gKi9cbmNvbnN0IFBST1BFUlRJRVMyRklMVEVSUyA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgWydtZXRhZGF0YS5lZHVjYXRpb25hbENvbnRleHRzJywgJ2NjbTplZHVjYXRpb25hbGNvbnRleHQnXSxcbiAgWydtZXRhZGF0YS5kaXNjaXBsaW5lcycsICd2aXJ0dWFsOnRheG9uaWQnXSxcbiAgWydjb2xsZWN0aW9ucy5ub2RlUmVmLmlkLmtleXdvcmQnLCAndmlydHVhbDpjb2xsZWN0aW9uX2lkX3ByaW1hcnknXSxcbiAgLy9bXCJyZXNwb25zaWJpbGl0eVwiLCBcInZpcnR1YWw6Y29sbGVjdGlvbl9pZF9wcmltYXJ5XCJdIC8vIGRhcyB6ZWlndCBhdWYgXCJzYW1tbHVuZ3N6dWdlaMO2cmlna2VpdFwiIHVuZCBpc3QgZmFsc2NoXG5dKTtcbi8qXG5UaGlzIG1hcCBvdXIgY29sdW1uIFwibmFtZXNcIiB0byB0aGUgdmFsaWQgdmFsdWVzIG9mIHRoZSB2aXJ0dWFsOmVkaXRvcmlhbF9leGNsdXNpb24gRmlsdGVyXG4qL1xuXG5jb25zdCBJU1NVRVRZUEUyRklMVEVSUzogTWFwPHN0cmluZywgc3RyaW5nPiA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KFtcbiAgWyd3aXRob3V0X3RpdGxlJywgJ21pc3NpbmdfdGl0bGUnXSxcbiAgWyd3aXRob3V0X2Rlc2NyaXB0aW9uJywgJ21pc3NpbmdfZGVzY3JpcHRpb24nXSxcbiAgWyd3aXRob3V0X2VkdWNhdGlvbl9sZXZlbCcsICdtaXNzaW5nX2VkdWNhdGlvbmFsY29udGV4dCddLFxuICBbJ3dpdGhvdXRfdGFyZ2V0X2dyb3VwJywgJ21pc3NpbmdfZWR1Y2F0aW9uYWxpbnRlbmRlZGVuZHVzZXJyb2xlJ10sXG4gIFsnd2l0aG91dF90YXhvbm9teV9pZCcsICdtaXNzaW5nX3RheG9uaWQnXSxcbiAgWyd3aXRob3V0X2NhdGVnb3J5JywgJ21pc3Npbmdfb2VoX2xydCddLFxuICBbJ3dpdGhvdXRfbGljZW5zZScsICdtaXNzaW5nX2xpY2Vuc2UnXSxcbl0pO1xuLypcbmludGVyZXN0aW5nbHkgaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21iaW5lIHRoZSBub2RlUmVmLmlkXG53aXRoIGh0dHBzOi8vdm9jYWJzLm9wZW5lZHVodWIuZGUvdzNpZC5vcmcvb3BlbmVkdWh1Yi92b2NhYnMvb2VoLXRvcGljcy97bm9kZVJlZi5pZH1cbiAqL1xuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCcsXG59KVxuZXhwb3J0IGNsYXNzIEVkaXRvcmlhbExpbmtTZXJ2aWNlIHtcbiAgcHJpdmF0ZSBlbnYgPSBpbmplY3QoQ29uZmlnSGVscGVyU2VydmljZSk7XG5cbiAgY29uc3RydWN0b3IoKSB7fVxuXG4gIHB1YmxpYyBvcGVuQnlSZXBsaWNhdGlvbnNvdXJjZUFuZElzc3VlVHlwZVdpdGhGaWx0ZXJzKFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGlzc3VlOiBzdHJpbmcsXG4gICAgc2VsZWN0ZWRGaWx0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyczogYW55ID0ge307XG4gICAgZmlsdGVyc1sndmlydHVhbDphdWRpdF9maWx0ZXInXSA9IFsnYWxsJ107XG4gICAgZmlsdGVyc1snY2NtOm9laF9wdWJsaXNoZXJfY29tYmluZWQnXSA9IFtzb3VyY2VdO1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6ZWRpdG9yaWFsX2V4Y2x1c2lvbiddID0gW0lTU1VFVFlQRTJGSUxURVJTLmdldChpc3N1ZSldO1xuICAgIGZvciAoY29uc3QgW2ZpZWxkLCB2YWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHNlbGVjdGVkRmlsdGVycykpIHtcbiAgICAgIGlmICh2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCkge1xuICAgICAgICBjb25zdCBlZGl0b3JpYWxGaWx0ZXJuYW1lID0gUFJPUEVSVElFUzJGSUxURVJTLmdldChmaWVsZCkgYXMgc3RyaW5nO1xuICAgICAgICBmaWx0ZXJzW2VkaXRvcmlhbEZpbHRlcm5hbWVdID0gdmFsdWVzO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHRoZVVybDogc3RyaW5nID0gdGhpcy5lbnYuZWR1U2hhcmluZ1BhdGggKyAnL2NvbXBvbmVudHMvZWRpdG9yaWFsLWRlc2snO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuc2V0KCdtb2RlJywgJ2F1ZGl0Jyk7XG4gICAgcGFyYW1zLnNldCgnZmlsdGVycycsIEpTT04uc3RyaW5naWZ5KGZpbHRlcnMpKTtcbiAgICB3aW5kb3cub3BlbihgJHt0aGVVcmx9PyR7cGFyYW1zfWAsICdlZGl0b3JfZnJvbnRlbmQnKTtcbiAgfVxuICBwdWJsaWMgb3BlbkJ5Q29sbGVjdGlvbkFuZElzc3VlVHlwZShjb2xsZWN0aW9uSWQ6IHN0cmluZywgaXNzdWVUeXBlOiBzdHJpbmcsIHBhZ2VUaXRsZTogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyczogYW55ID0ge307XG4gICAgZmlsdGVyc1sndmlydHVhbDphdWRpdF9maWx0ZXInXSA9IFsnYWxsJ107XG4gICAgZmlsdGVyc1sndmlydHVhbDplZGl0b3JpYWxfZXhjbHVzaW9uJ10gPSBbSVNTVUVUWVBFMkZJTFRFUlMuZ2V0KGlzc3VlVHlwZSldO1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6Y29sbGVjdGlvbl9pZF9wcmltYXJ5J10gPSBbY29sbGVjdGlvbklkXTtcbiAgICBjb25zdCB0aGVVcmw6IHN0cmluZyA9IHRoaXMuZW52LmVkdVNoYXJpbmdQYXRoICsgJy9jb21wb25lbnRzL2VkaXRvcmlhbC1kZXNrJztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLnNldCgndGl0bGUnLCBwYWdlVGl0bGUpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAnYXVkaXQnKTtcbiAgICBwYXJhbXMuc2V0KCdmaWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgIHdpbmRvdy5vcGVuKGAke3RoZVVybH0/JHtwYXJhbXN9YCwgJ2VkaXRvcl9mcm9udGVuZCcpO1xuICB9XG5cbiAgcHVibGljIG9wZW5CeUNvbGxlY3Rpb25JZChjb2xsZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRoZVVybDogc3RyaW5nID0gdGhpcy5lbnYuZWR1U2hhcmluZ1BhdGggKyAnL2NvbXBvbmVudHMvZWRpdG9yaWFsLWRlc2snO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuc2V0KCdpZHMnLCBjb2xsZWN0aW9uSWQpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAncmVuZGVyJyk7XG4gICAgd2luZG93Lm9wZW4oYCR7dGhlVXJsfT8ke3BhcmFtc31gLCAnZWRpdG9yX2Zyb250ZW5kJyk7XG4gIH1cbn1cbiJdfQ==
167
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdG9yaWFsLWxpbmsuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb21wb25lbnRzL2VkaXRvcmlhbC1saW5rLXNlcnZpY2UvZWRpdG9yaWFsLWxpbmsuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdkMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDdkMsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUV0Qzs7R0FFRztBQUNILDZGQUE2RjtBQUM3RixNQUFNLGtCQUFrQixHQUFnQztJQUN0RCxVQUFVO0lBQ1YsMkJBQTJCLEVBQUUsQ0FBQyxLQUFLLEVBQUUsVUFBVSxFQUFFLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQztJQUNoRiw2Q0FBNkM7SUFDN0MsaUJBQWlCLEVBQUUsRUFBRTtJQUNyQiw2QkFBNkIsRUFBRTtRQUM3QixVQUFVO1FBQ1YsaUJBQWlCO1FBQ2pCLGVBQWU7UUFDZixxQkFBcUI7UUFDckIsYUFBYTtRQUNiLGNBQWM7UUFDZCxxQkFBcUI7UUFDckIseUJBQXlCO1FBQ3pCLHNCQUFzQjtRQUN0QixpQkFBaUI7UUFDakIsbUJBQW1CO0tBQ3BCO0NBQ0YsQ0FBQztBQUNGLDZIQUE2SDtBQUM3SCxNQUFNLGtCQUFrQixHQUF3QixNQUFNLENBQUMsT0FBTyxDQUFDLGtCQUFrQixDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUMsR0FB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QyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNyQyxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLFVBQVUsR0FBRyxrQkFBa0IsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkQsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ2hCLGtFQUFrRTtZQUNsRSxPQUFPLElBQUksQ0FBQztRQUNkLENBQUM7UUFDRCxNQUFNLFdBQVcsR0FBRyxrQkFBa0IsQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUM1RCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDakIsbUVBQW1FO1lBQ25FLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUNELE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxXQUFXLENBQUM7UUFFbEMsTUFBTSxNQUFNLEdBQVcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEdBQUcsNEJBQTRCLENBQUM7UUFDOUUsTUFBTSxNQUFNLEdBQUcsSUFBSSxlQUFlLEVBQUUsQ0FBQztRQUNyQyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUM1QixNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0MsT0FBTyxHQUFHLE1BQU0sSUFBSSxNQUFNLEVBQUUsQ0FBQztJQUMvQixDQUFDOytHQXJHVSxvQkFBb0I7bUhBQXBCLG9CQUFvQixjQUZuQixNQUFNOzs0RkFFUCxvQkFBb0I7a0JBSGhDLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb25maWdIZWxwZXJTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vY29uZmlnLWhlbHBlci5zZXJ2aWNlJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHRha2UgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbi8qKlxuICogVGhpcyBzZXJ2aWNlIHByb3ZpZGVzIG1ldGhvZHMgdG8gY3JlYXRlIGxpbmtzIHRvIHRoZSBlZGl0b3JpYWwgZGVzayB3aXRoIHNwZWNpZmljIGZpbHRlcnMuXG4gKi9cbi8qICBUaGlzIG1hcCBtYWtlcyBpdCBlYXNpZXIgZm9yIG1lIHRvIGtlZXAgdHJhY2sgd2hpY2ggaXNzdWVzIGFyZSBtYXBwZWQgdG8gd2hpY2ggZmlsdGVycyAqL1xuY29uc3QgRmlsdGVyTmFtZXMySXNzdWVzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gPSB7XG4gIC8vTGl6ZW56ZW5cbiAgJ3ZpcnR1YWw6ZWRpdG9yaWFsX2xpY2Vuc2UnOiBbJ29lcicsICdvdGhlcl9jYycsICdjb3B5cmlnaHQnLCAnd2l0aG91dF9saWNlbnNlJ10sXG4gIC8vTWF0ZXJpYWx0eXBlbiB3ZXJkZW4gaW0gQ29uc3RydWN0b3IgZ2VzZXR6dFxuICAndmlydHVhbDpvZWhfbHJ0JzogW10sXG4gICd2aXJ0dWFsOmVkaXRvcmlhbF9leGNsdXNpb24nOiBbXG4gICAgJ291dGRhdGVkJyxcbiAgICAnd2l0aG91dF9wcmV2aWV3JyxcbiAgICAnd2l0aG91dF90aXRsZScsXG4gICAgJ3dpdGhvdXRfZGVzY3JpcHRpb24nLFxuICAgICd3aXRob3V0X3VybCcsXG4gICAgJ3dpdGhvdXRfdHlwZScsXG4gICAgJ3dpdGhvdXRfdGF4b25vbXlfaWQnLFxuICAgICd3aXRob3V0X2VkdWNhdGlvbl9sZXZlbCcsXG4gICAgJ3dpdGhvdXRfdGFyZ2V0X2dyb3VwJyxcbiAgICAnd2l0aG91dF9saWNlbnNlJyxcbiAgICAnd2l0aG91dF9wdWJsaXNoZXInLFxuICBdLFxufTtcbi8vIEhlcmUgd2UgbWFwIGJhY2sgdGhlIGlzc3VlcyB0byB0aGUgZmlsdGVyIG5hbWVzIGluIHRoZSBlZGl0b3JpYWwgZGVzaywgc28gd2UgY2FuIGxvb2sgdXAgdGhlIGZpbHRlciBuYW1lIGZvciBhIGdpdmVuIGlzc3VlXG5jb25zdCBJc3N1ZXMyRmlsdGVyTmFtZXM6IE1hcDxzdHJpbmcsIHN0cmluZz4gPSBPYmplY3QuZW50cmllcyhGaWx0ZXJOYW1lczJJc3N1ZXMpLnJlZHVjZSgobWFwLCBba2V5LCB2YWx1ZV0pID0+IHtcbiAgdmFsdWUuZm9yRWFjaCgoaXNzdWUpID0+IG1hcC5zZXQoaXNzdWUsIGtleSkpO1xuICByZXR1cm4gbWFwO1xufSwgbmV3IE1hcDxzdHJpbmcsIHN0cmluZz4oKSk7XG5cbi8vIG1hcHMgb3VyIHZhbHVlcyB0byB0aGUgdmFsdWVzIG9mIHRoZSBmaWx0ZXIgaW4gdGhlIGVkaXRvcmlhbCBkZXNrXG5jb25zdCBNYXBWYWx1ZXNGb3JGaWx0ZXI6IHsgW2tleTogc3RyaW5nXTogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB8IG51bGwgfSB9ID0ge1xuICAndmlydHVhbDplZGl0b3JpYWxfZXhjbHVzaW9uJzoge1xuICAgIG91dGRhdGVkOiBudWxsLFxuICAgIHdpdGhvdXRfcHJldmlldzogbnVsbCxcbiAgICB3aXRob3V0X3RpdGxlOiBbJ21pc3NpbmdfdGl0bGUnXSxcbiAgICB3aXRob3V0X2Rlc2NyaXB0aW9uOiBbJ21pc3NpbmdfZGVzY3JpcHRpb24nXSxcbiAgICB3aXRob3V0X3VybDogWydsaW5rcyddLFxuICAgIHdpdGhvdXRfdHlwZTogWydtaXNzaW5nX29laF9scnQnXSxcbiAgICB3aXRob3V0X3RheG9ub215X2lkOiBbJ3dpdGhvdXRfdGF4b25vbXlfaWQnXSxcbiAgICB3aXRob3V0X2VkdWNhdGlvbl9sZXZlbDogWydtaXNzaW5nX2VkdWNhdGlvbmFsY29udGV4dCddLFxuICAgIHdpdGhvdXRfdGFyZ2V0X2dyb3VwOiBbJ21pc3NpbmdfZWR1Y2F0aW9uYWxpbnRlbmRlZGVuZHVzZXJyb2xlJ10sXG4gICAgd2l0aG91dF9saWNlbnNlOiBbJ21pc3NpbmdfbGljZW5zZSddLFxuICAgIHdpdGhvdXRfcHVibGlzaGVyOiBbJ21pc3NpbmdfcmVwbGljYXRpb25zb3VyY2UnXSxcbiAgfSxcbiAgJ3ZpcnR1YWw6ZWRpdG9yaWFsX2xpY2Vuc2UnOiB7XG4gICAgb2VyOiBbJ29lciddLFxuICAgIGNvcHlyaWdodDogWydub25lX29lciddLFxuICAgIHdpdGhvdXRfbGljZW5zZTogWydub25lJ10sXG4gIH0sXG4gICd2aXJ0dWFsOm9laF9scnQnOiB7fSxcbn07XG5cbi8qXG5UaGlzIGlzIGEgbWFwIGZyb20gcHJvcGVydGllcyBvZiBhIGRvY3VtZW50IHRvIGZpbHRlciBuYW1lc1xuICovXG5jb25zdCBQUk9QRVJUSUVTMkZJTFRFUlMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPihbXG4gIFsnbWV0YWRhdGEuZWR1Y2F0aW9uYWxDb250ZXh0cycsICdjY206ZWR1Y2F0aW9uYWxjb250ZXh0J10sXG4gIFsnbWV0YWRhdGEuZGlzY2lwbGluZXMnLCAndmlydHVhbDp0YXhvbmlkJ10sXG4gIC8vW1wicmVzcG9uc2liaWxpdHlcIiwgXCJ2aXJ0dWFsOmNvbGxlY3Rpb25faWRfcHJpbWFyeVwiXSAvLyBkYXMgemVpZ3QgYXVmIFwic2FtbWx1bmdzenVnZWjDtnJpZ2tlaXRcIiB1bmQgaXN0IGZhbHNjaFxuXSk7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0b3JpYWxMaW5rU2VydmljZSB7XG4gIHByaXZhdGUgZW52ID0gaW5qZWN0KENvbmZpZ0hlbHBlclNlcnZpY2UpO1xuICBwcml2YXRlIGFwaSA9IGluamVjdChNZXRhQXBpU2VydmljZSk7XG4gIHB1YmxpYyB0eXBlc0xvYWRlZCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICB0aGlzLmFwaVxuICAgICAgLmdldE1hdGVyaWFsVHlwZXNNYXBwaW5nKClcbiAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh0eXBlcykgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh0eXBlcykpIHtcbiAgICAgICAgICBJc3N1ZXMyRmlsdGVyTmFtZXMuc2V0KGtleSwgJ3ZpcnR1YWw6b2VoX2xydCcpO1xuICAgICAgICAgIE1hcFZhbHVlc0ZvckZpbHRlclsndmlydHVhbDpvZWhfbHJ0J11ba2V5XSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudHlwZXNMb2FkZWQkLm5leHQodHJ1ZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBvcGVuQnlSZXBsaWNhdGlvbnNvdXJjZUFuZElzc3VlVHlwZVdpdGhGaWx0ZXJzKFxuICAgIHNvdXJjZTogc3RyaW5nLFxuICAgIGlzc3VlOiBzdHJpbmcsXG4gICAgc2VsZWN0ZWRGaWx0ZXJzOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIHwgdW5kZWZpbmVkIH1cbiAgKTogdm9pZCB7XG4gICAgY29uc3QgZmlsdGVyczogYW55ID0ge307XG4gICAgZmlsdGVyc1sndmlydHVhbDphdWRpdF9maWx0ZXInXSA9IFsnYWxsJ107XG4gICAgZmlsdGVyc1snY2NtOm9laF9wdWJsaXNoZXJfY29tYmluZWQnXSA9IFtzb3VyY2VdO1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6ZWRpdG9yaWFsX2V4Y2x1c2lvbiddID0gTWFwVmFsdWVzRm9yRmlsdGVyWyd2aXJ0dWFsOmVkaXRvcmlhbF9leGNsdXNpb24nXVtpc3N1ZV07XG4gICAgZm9yIChjb25zdCBbZmllbGQsIHZhbHVlc10gb2YgT2JqZWN0LmVudHJpZXMoc2VsZWN0ZWRGaWx0ZXJzKSkge1xuICAgICAgaWYgKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgIGNvbnN0IGVkaXRvcmlhbEZpbHRlcm5hbWUgPSBQUk9QRVJUSUVTMkZJTFRFUlMuZ2V0KGZpZWxkKSBhcyBzdHJpbmc7XG4gICAgICAgIGZpbHRlcnNbZWRpdG9yaWFsRmlsdGVybmFtZV0gPSB2YWx1ZXM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgdGhlVXJsOiBzdHJpbmcgPSB0aGlzLmVudi5lZHVTaGFyaW5nUGF0aCArICcvY29tcG9uZW50cy9lZGl0b3JpYWwtZGVzayc7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAnYXVkaXQnKTtcbiAgICBwYXJhbXMuc2V0KCdmaWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgIHdpbmRvdy5vcGVuKGAke3RoZVVybH0/JHtwYXJhbXN9YCwgJ2VkaXRvcl9mcm9udGVuZCcpO1xuICB9XG5cbiAgcHVibGljIG9wZW5CeUNvbGxlY3Rpb25BbmRJc3N1ZVR5cGUoY29sbGVjdGlvbklkOiBzdHJpbmcsIGlzc3VlVHlwZTogc3RyaW5nLCBwYWdlVGl0bGU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGZpbHRlcnM6IGFueSA9IHt9O1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6YXVkaXRfZmlsdGVyJ10gPSBbJ2FsbCddO1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6ZWRpdG9yaWFsX2V4Y2x1c2lvbiddID0gTWFwVmFsdWVzRm9yRmlsdGVyWyd2aXJ0dWFsOmVkaXRvcmlhbF9leGNsdXNpb24nXVtpc3N1ZVR5cGVdO1xuICAgIGZpbHRlcnNbJ3ZpcnR1YWw6Y29sbGVjdGlvbl9pZF9wcmltYXJ5J10gPSBbY29sbGVjdGlvbklkXTtcbiAgICBjb25zdCB0aGVVcmw6IHN0cmluZyA9IHRoaXMuZW52LmVkdVNoYXJpbmdQYXRoICsgJy9jb21wb25lbnRzL2VkaXRvcmlhbC1kZXNrJztcbiAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgcGFyYW1zLnNldCgndGl0bGUnLCBwYWdlVGl0bGUpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAnYXVkaXQnKTtcbiAgICBwYXJhbXMuc2V0KCdmaWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgIHdpbmRvdy5vcGVuKGAke3RoZVVybH0/JHtwYXJhbXN9YCwgJ2VkaXRvcl9mcm9udGVuZCcpO1xuICB9XG5cbiAgcHVibGljIG9wZW5CeUNvbGxlY3Rpb25JZChjb2xsZWN0aW9uSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHRoZVVybDogc3RyaW5nID0gdGhpcy5lbnYuZWR1U2hhcmluZ1BhdGggKyAnL2NvbXBvbmVudHMvZWRpdG9yaWFsLWRlc2snO1xuICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTtcbiAgICBwYXJhbXMuc2V0KCdpZHMnLCBjb2xsZWN0aW9uSWQpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAncmVuZGVyJyk7XG4gICAgd2luZG93Lm9wZW4oYCR7dGhlVXJsfT8ke3BhcmFtc31gLCAnZWRpdG9yX2Zyb250ZW5kJyk7XG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgY3JlYXRlcyBhIGxpbmsgdG8gdGhlIGVkaXRvcmlhbCBkZXNrIHdpdGggc3BlY2lmaWMgZmlsdGVycy5cbiAgICogSXQgcmV0dXJucyB0aGUgVVJMIHRvIHRoZSBlZGl0b3JpYWwgZGVzayB3aXRoIHRoZSBmaWx0ZXJzIGFwcGxpZWQgb3IgbnVsbCBpZiB0aGUgaXNzdWVJZCBpcyBub3QgbWFwcGVkIHRvIGEgZmlsdGVyLlxuICAgKiBXaXRoIHRoaXMgd2UgY2FuIHJlbmRlciBhIGxpbmsgd2l0aCBhbiBocmVmIGF0dHJpYnV0ZSB0byB0aGUgZWRpdG9yaWFsIGRlc2sgaW4gdGhlIGZyb250ZW5kLlxuICAgKiBAc2VlIHRoZSBjb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5zY3NzIGhvdyB3ZSBzdHlsZSBsaW5rcyBvbmx5IGlmIHRoZWlyIGhyZWZzIGFyZSBub3QgbnVsbFxuICAgKlxuICAgKiBAcGFyYW0gc291cmNlVHlwZSBUaGUgdHlwZSBvZiB0aGUgc291cmNlLCBlLmcuIFwicmVwbGljYXRpb25Tb3VyY2VcIiBvciBcImNvbGxlY3Rpb25cIlxuICAgKiBAcGFyYW0gc291cmNlSWQgVGhlIGlkIG9mIHRoZSBzb3VyY2UuIFRoaXMgaXMgdGhlIGZpcnN0IGNvbHVtbiBpbiB0aGUgdGFibGUuXG4gICAqIEBwYXJhbSBpc3N1ZUlkIFRoZSBpZCBvZiB0aGUgaXNzdWUuIFRoZXNlIGFyZSB0aGUgb3RoZXIgY29sdW1ucyBpbiB0aGUgdGFibGUuXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTGlua0ZvckNvdW50c1dpdGhIaXN0b3J5KHNvdXJjZVR5cGU6IHN0cmluZywgc291cmNlSWQ6IHN0cmluZywgaXNzdWVJZDogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgY29uc3QgZmlsdGVyczogeyBba2V5OiBzdHJpbmddOiBzdHJpbmdbXSB9ID0ge307XG4gICAgZmlsdGVyc1sndmlydHVhbDphdWRpdF9maWx0ZXInXSA9IFsnYWxsJ107XG4gICAgLy8gZGV0ZXJtaW5lIHRoZSBcIm1haW5cIiBmaWx0ZXJcbiAgICBpZiAoc291cmNlVHlwZSA9PT0gJ3JlcGxpY2F0aW9uU291cmNlJykge1xuICAgICAgZmlsdGVyc1snY2NtOm9laF9wdWJsaXNoZXJfY29tYmluZWQnXSA9IFtzb3VyY2VJZF07XG4gICAgfSBlbHNlIGlmIChzb3VyY2VUeXBlID09PSAnY29sbGVjdGlvbicpIHtcbiAgICAgIGZpbHRlcnNbJ3ZpcnR1YWw6Y29sbGVjdGlvbl9pZF9wcmltYXJ5J10gPSBbc291cmNlSWRdO1xuICAgIH1cbiAgICBpZiAoIUlzc3VlczJGaWx0ZXJOYW1lcy5oYXMoaXNzdWVJZCkpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCBmaWx0ZXJOYW1lID0gSXNzdWVzMkZpbHRlck5hbWVzLmdldChpc3N1ZUlkKTtcbiAgICBpZiAoIWZpbHRlck5hbWUpIHtcbiAgICAgIC8vIGNvbnNvbGUuZGVidWcoXCJObyBmaWx0ZXIgbmFtZSBmb3VuZCBmb3IgaXNzdWUgaWQ6IFwiICsgaXNzdWVJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyVmFsdWUgPSBNYXBWYWx1ZXNGb3JGaWx0ZXJbZmlsdGVyTmFtZV1baXNzdWVJZF07XG4gICAgaWYgKCFmaWx0ZXJWYWx1ZSkge1xuICAgICAgLy8gY29uc29sZS5kZWJ1ZyhcIk5vIGZpbHRlciB2YWx1ZSBmb3VuZCBmb3IgaXNzdWUgaWQ6IFwiICsgaXNzdWVJZCk7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgZmlsdGVyc1tmaWx0ZXJOYW1lXSA9IGZpbHRlclZhbHVlO1xuXG4gICAgY29uc3QgdGhlVXJsOiBzdHJpbmcgPSB0aGlzLmVudi5lZHVTaGFyaW5nUGF0aCArICcvY29tcG9uZW50cy9lZGl0b3JpYWwtZGVzayc7XG4gICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIHBhcmFtcy5zZXQoJ21vZGUnLCAnYXVkaXQnKTtcbiAgICBwYXJhbXMuc2V0KCdmaWx0ZXJzJywgSlNPTi5zdHJpbmdpZnkoZmlsdGVycykpO1xuICAgIHJldHVybiBgJHt0aGVVcmx9PyR7cGFyYW1zfWA7XG4gIH1cbn1cbiJdfQ==
@@ -6,18 +6,20 @@ import { BehaviorSubject, Subject } from 'rxjs';
6
6
  import { TranslateModule } from '@ngx-translate/core';
7
7
  import { AsyncPipe, NgClass, NgForOf, NgIf } from '@angular/common';
8
8
  import { DateTime } from 'luxon';
9
- import { finalize, map, takeUntil, tap } from 'rxjs/operators';
9
+ import { finalize, map, skipWhile, take, takeUntil, tap } from 'rxjs/operators';
10
10
  import { FormControl, FormGroup } from '@angular/forms';
11
11
  import { DatepickerComponent } from '../components/filter/datepicker/datepicker.component';
12
12
  import { MatIcon } from '@angular/material/icon';
13
13
  import * as i0 from "@angular/core";
14
14
  import * as i1 from "../meta-api.service";
15
- import * as i2 from "@angular/material/card";
16
- import * as i3 from "@angular/material/table";
17
- import * as i4 from "@ngx-translate/core";
15
+ import * as i2 from "../components/editorial-link-service/editorial-link.service";
16
+ import * as i3 from "@angular/material/card";
17
+ import * as i4 from "@angular/material/table";
18
+ import * as i5 from "@ngx-translate/core";
18
19
  export class CountsWithHistoryComponent {
19
- constructor(metaApi) {
20
+ constructor(metaApi, linkService) {
20
21
  this.metaApi = metaApi;
22
+ this.linkService = linkService;
21
23
  this.isLoading = signal(true);
22
24
  this.timeFilterLoaded = signal(false);
23
25
  this.destroyed$ = new Subject();
@@ -115,6 +117,15 @@ export class CountsWithHistoryComponent {
115
117
  const trend = delta === 0 ? 'trending_flat' : delta < 0 ? 'trending_down' : 'trending_up';
116
118
  return { delta, trend, value: pastValue };
117
119
  }
120
+ openInEditor(sourceId, issueId) {
121
+ if (this.sourceType === 'replicationSource') {
122
+ // find the long name for the source
123
+ sourceId = this.recentTypeCount$.value.rows.find((r) => r.meta.id === sourceId)?.meta.label || sourceId;
124
+ }
125
+ return this.linkService.typesLoaded$.pipe(skipWhile((loaded) => !loaded), take(1), map(() => {
126
+ return this.linkService.createLinkForCountsWithHistory(this.sourceType, sourceId, issueId);
127
+ }));
128
+ }
118
129
  ngOnInit() {
119
130
  this.getTimeRangeFilter();
120
131
  this.getCountByDate(this.range.controls.end.value)
@@ -129,8 +140,8 @@ export class CountsWithHistoryComponent {
129
140
  this.destroyed$.next();
130
141
  this.destroyed$.complete();
131
142
  }
132
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: [{ token: i1.MetaApiService }], target: i0.ɵɵFactoryTarget.Component }); }
133
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle" }, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">{{ row.counts[col.id] ?? 'n/a' }}</td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a,.mat-mdc-cell a{cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a:hover,.mat-mdc-cell a:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i2.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i2.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i2.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i2.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i3.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i3.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i3.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i3.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i3.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i3.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i3.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i3.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i3.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i3.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i4.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
143
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, deps: [{ token: i1.MetaApiService }, { token: i2.EditorialLinkService }], target: i0.ɵɵFactoryTarget.Component }); }
144
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: CountsWithHistoryComponent, isStandalone: true, selector: "metaqs2-counts-with-history", inputs: { apiMethod: "apiMethod", columnTranslationkey: "columnTranslationkey", pageTitle: "pageTitle", sourceType: "sourceType" }, ngImport: i0, template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? 'n/a' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}\n"], dependencies: [{ kind: "ngmodule", type: MatCardModule }, { kind: "component", type: i3.MatCard, selector: "mat-card", inputs: ["appearance"], exportAs: ["matCard"] }, { kind: "directive", type: i3.MatCardContent, selector: "mat-card-content" }, { kind: "component", type: i3.MatCardHeader, selector: "mat-card-header" }, { kind: "directive", type: i3.MatCardTitle, selector: "mat-card-title, [mat-card-title], [matCardTitle]" }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "ngmodule", type: MatTableModule }, { kind: "component", type: i4.MatTable, selector: "mat-table, table[mat-table]", exportAs: ["matTable"] }, { kind: "directive", type: i4.MatHeaderCellDef, selector: "[matHeaderCellDef]" }, { kind: "directive", type: i4.MatHeaderRowDef, selector: "[matHeaderRowDef]", inputs: ["matHeaderRowDef", "matHeaderRowDefSticky"] }, { kind: "directive", type: i4.MatColumnDef, selector: "[matColumnDef]", inputs: ["matColumnDef"] }, { kind: "directive", type: i4.MatCellDef, selector: "[matCellDef]" }, { kind: "directive", type: i4.MatRowDef, selector: "[matRowDef]", inputs: ["matRowDefColumns", "matRowDefWhen"] }, { kind: "directive", type: i4.MatHeaderCell, selector: "mat-header-cell, th[mat-header-cell]" }, { kind: "directive", type: i4.MatCell, selector: "mat-cell, td[mat-cell]" }, { kind: "component", type: i4.MatHeaderRow, selector: "mat-header-row, tr[mat-header-row]", exportAs: ["matHeaderRow"] }, { kind: "component", type: i4.MatRow, selector: "mat-row, tr[mat-row]", exportAs: ["matRow"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i5.TranslatePipe, name: "translate" }, { kind: "directive", type: NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: DatepickerComponent, selector: "metaqs2-datepicker", inputs: ["disabled", "inputGroup"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "pipe", type: AsyncPipe, name: "async" }] }); }
134
145
  }
135
146
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: CountsWithHistoryComponent, decorators: [{
136
147
  type: Component,
@@ -154,13 +165,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
154
165
  MatIcon,
155
166
  NgIf,
156
167
  AsyncPipe,
157
- ], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">{{ row.counts[col.id] ?? 'n/a' }}</td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a,.mat-mdc-cell a{cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a:hover,.mat-mdc-cell a:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}\n"] }]
158
- }], ctorParameters: () => [{ type: i1.MetaApiService }], propDecorators: { apiMethod: [{
168
+ ], template: "<mat-card appearance=\"raised\">\n <mat-card-header *ngIf=\"pageTitle\">\n <mat-card-title data-test-id=\"page-title\">\n Qualit\u00E4tsmetrik: {{ pageTitle | translate}}{{isLoading() ? \": Lade neue Daten.\" : \"\"}}\n </mat-card-title>\n </mat-card-header>\n <!-- consider to put the filter in the table header to avoid that it is scrolled out of view-->\n <!-- show the filter after the values are loaded to avoid loading current data twice -->\n <mat-card-content *ngIf=\"timeFilterLoaded()\">\n <metaqs2-datepicker [disabled]=\"isLoading()\" [inputGroup]=\"range\" ></metaqs2-datepicker>\n </mat-card-content>\n</mat-card>\n<mat-card>\n <table [ngClass]=\"{'while-loading': isLoading()}\" mat-table [dataSource]=\"recentTypeCount$.value.rows\" class=\"quality-matrix\">\n <!-- Define columns of table -->\n <!-- Row Header Column -->\n <ng-container matColumnDef=\"label-col\" sticky>\n <th rowspan=\"2\" mat-header-cell *matHeaderCellDef>Quelle</th>\n <td\n mat-cell\n *matCellDef=\"let row\"\n matTooltip=\"{{row.meta.alt_label}}\"\n class=\"label-col\"\n >\n {{row.meta.label}}\n </td>\n </ng-container>\n <!-- one column for each type -->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_type'\">\n <th colspan=\"2\" mat-header-cell *matHeaderCellDef matTooltip=\"{{col.label}}\" >\n {{columnTranslationkey ? (columnTranslationkey + col.label | translate ) : col.label }}\n </th>\n </ng-container>\n <!-- one column for each type for the most current date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_recent'\">\n <th class=\"recent-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >{{ range.controls.end.value.toLocaleString(DateTime.DATE_SHORT) }}</th>\n <td class=\"recent-data-cell\" mat-cell *matCellDef=\"let row\">\n <a [attr.href]=\"openInEditor(row.meta.id, col.id) | async\" target=\"editor_frontend\">{{ row.counts[col.id] ?? 'n/a' }}</a>\n </td>\n </ng-container>\n <!-- one column for each type for the older date-->\n <ng-container *ngFor=\"let col of recentTypeCount$.value.columns; trackBy:columnIdent\" [matColumnDef]=\"col.id + '_past'\">\n <th class=\"past-data-cell\" mat-header-cell *matHeaderCellDef matTooltip=\"no tooltip\" >\n {{ pastTypeCount$.value.rows.length ? range.controls.start.value.toLocaleString(DateTime.DATE_SHORT) : 'no past data' }}\n </th>\n <td class=\"past-data-cell\" mat-cell *matCellDef=\"let row;\">\n <ng-container *ngIf=\"pastTypeCount$.value.rows.length && pastTypeCount(row, col.id) as trend\">\n <span [ngClass]=\"trend.trend\"> {{ trend.value ?? 'n/a' }}<mat-icon aria-hidden=\"false\" [attr.aria-label]=\"trend.trend\" [fontIcon]=\"trend.trend!\" /></span>\n <span class=\"cdk-visually-hidden\">{{trend.trend}}</span>\n </ng-container>\n </td>\n </ng-container>\n <!-- generate actual table -->\n <tr mat-header-row *matHeaderRowDef=\"['label-col'].concat(typeColumns); sticky:true;\"></tr>\n <tr mat-header-row *matHeaderRowDef=\"allColumns; sticky: true;\"></tr>\n <tr mat-row *matRowDef=\"let row; columns: ['label-col'].concat(allColumns)\"></tr>\n\n </table>\n</mat-card>", styles: ["tr:nth-child(2n){background-color:#e4e4e4}tr:nth-child(2n)>td.label-col,tr:nth-child(2n) td.recent-data-cell{border-right:1px solid white}tr:nth-child(odd){background-color:#fff}tr:nth-child(odd)>td.label-col,tr:nth-child(odd) td.recent-data-cell{border-right:1px solid #e4e4e4}td.label-col{text-align:left}.mat-mdc-header-cell,.mat-mdc-cell{text-align:center}.mat-mdc-header-cell a[href],.mat-mdc-cell a[href]{color:var(--mat-table-row-item-label-text-color);cursor:pointer;text-decoration:underline}.mat-mdc-header-cell a[href]:hover,.mat-mdc-cell a[href]:hover{text-decoration:underline}.mat-mdc-header-cell mat-icon,.mat-mdc-cell mat-icon{margin-left:5px;vertical-align:middle}.trending_down{color:#4abeff}.trending_up{color:#c20808}\n"] }]
169
+ }], ctorParameters: () => [{ type: i1.MetaApiService }, { type: i2.EditorialLinkService }], propDecorators: { apiMethod: [{
159
170
  type: Input,
160
171
  args: [{ required: true }]
161
172
  }], columnTranslationkey: [{
162
173
  type: Input
163
174
  }], pageTitle: [{
164
175
  type: Input
176
+ }], sourceType: [{
177
+ type: Input,
178
+ args: [{ required: true }]
165
179
  }] } });
166
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3BFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQy9ELE9BQU8sRUFBRSxX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bkRlc3Ryb3ksIE9uSW5pdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBNYXRDYXJkLCBNYXRDYXJkQ29udGVudCwgTWF0Q2FyZEhlYWRlciwgTWF0Q2FyZE1vZHVsZSwgTWF0Q2FyZFRpdGxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvY2FyZCc7XG5pbXBvcnQgeyBNYXRUb29sdGlwIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvdG9vbHRpcCc7XG5pbXBvcnQgeyBNYXRIZWFkZXJSb3csIE1hdEhlYWRlclJvd0RlZiwgTWF0Um93LCBNYXRSb3dEZWYsIE1hdFRhYmxlLCBNYXRUYWJsZU1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3RhYmxlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgVHJhbnNsYXRlTW9kdWxlIH0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nQ2xhc3MsIE5nRm9yT2YsIE5nSWYgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgTWV0YUFwaVNlcnZpY2UgfSBmcm9tICcuLi9tZXRhLWFwaS5zZXJ2aWNlJztcbmltcG9ydCB7IEZpbHRlciwgTWF0cml4Um93V2l0aENvdW50cywgTWF0cml4V2l0aENvdW50cywgUXVhbGl0eU1hdHJpeEhlYWRlciB9IGZyb20gJy4uL2phdmEtYXBpJztcbmltcG9ydCB7IERhdGVUaW1lIH0gZnJvbSAnbHV4b24nO1xuaW1wb3J0IHsgZmluYWxpemUsIG1hcCwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdtZXRhcXMyLWNvdW50cy13aXRoLWhpc3RvcnknLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBpbXBvcnRzOiBbXG4gICAgTWF0Q2FyZE1vZHVsZSxcbiAgICBNYXRDYXJkLFxuICAgIE1hdENhcmRIZWFkZXIsXG4gICAgTWF0Q2FyZFRpdGxlLFxuICAgIE1hdENhcmRDb250ZW50LFxuICAgIE1hdFRvb2x0aXAsXG4gICAgTWF0VGFibGVNb2R1bGUsXG4gICAgTWF0VGFibGUsXG4gICAgVHJhbnNsYXRlTW9kdWxlLFxuICAgIE1hdEhlYWRlclJvdyxcbiAgICBNYXRIZWFkZXJSb3dEZWYsXG4gICAgTWF0Um93LFxuICAgIE1hdFJvd0RlZixcbiAgICBOZ0Zvck9mLFxuICAgIERhdGVwaWNrZXJDb21wb25lbnQsXG4gICAgTmdDbGFzcyxcbiAgICBNYXRJY29uLFxuICAgIE5nSWYsXG4gICAgQXN5bmNQaXBlLFxuICBdLFxuICB0ZW1wbGF0ZVVybDogJy4vY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuaHRtbCcsXG4gIHN0eWxlVXJsOiAnLi9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5zY3NzJyxcbn0pXG5leHBvcnQgY2xhc3MgQ291bnRzV2l0aEhpc3RvcnlDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XG4gIHByb3RlY3RlZCByZWFkb25seSBpc0xvYWRpbmcgPSBzaWduYWwodHJ1ZSk7XG4gIHByb3RlY3RlZCByZWFkb25seSB0aW1lRmlsdGVyTG9hZGVkID0gc2lnbmFsKGZhbHNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHJlY2VudFR5cGVDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hdHJpeFdpdGhDb3VudHM+KHsgY29sdW1uczogW10sIHJvd3M6IFtdIH0pO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcGFzdFR5cGVDb3VudCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PE1hdHJpeFdpdGhDb3VudHM+KHsgY29sdW1uczogW10sIHJvd3M6IFtdIH0pO1xuICBwcml2YXRlIGNvbHVtbnM6IFF1YWxpdHlNYXRyaXhIZWFkZXJbXSA9IFtdO1xuXG4gIEBJbnB1dCh7IHJlcXVpcmVkOiB0cnVlIH0pXG4gIHByaXZhdGUgYXBpTWV0aG9kOiBrZXlvZiBNZXRhQXBpU2VydmljZSA9ICdnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlJztcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIGNvbHVtblRyYW5zbGF0aW9ua2V5OiBzdHJpbmcgfCBudWxsID0gbnVsbDtcbiAgQElucHV0KClcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBhZ2VUaXRsZTogc3RyaW5nO1xuXG4gIC8qIEluIHRoaXMgd2lkZ2V0J3MgYmFja2VuZCB3ZSBkbyBoYXZlIGRhdGEgZm9yIHRvZGF5XG4gICAqIHRoZXJlZm9yZSB3ZSBzZXQgdGhlIGVuZCBkYXRlIHRvIHRvZGF5IGFuZCB1c2UgdGhlIHRpbWVyYW5nZSgpIGVuZHBvaW50IHRvIG9ubHkgc2V0IHRoZSBzdGFydCBkYXRlXG4gICAqL1xuICByZWFkb25seSByYW5nZTogRm9ybUdyb3VwPHtcbiAgICBzdGFydDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICAgIGVuZDogRm9ybUNvbnRyb2w8RGF0ZVRpbWU8Ym9vbGVhbj4+O1xuICB9PiA9IG5ldyBGb3JtR3JvdXAoe1xuICAgIHN0YXJ0OiBuZXcgRm9ybUNvbnRyb2woKSxcbiAgICBlbmQ6IG5ldyBGb3JtQ29udHJvbChEYXRlVGltZS51dGMoKS5zdGFydE9mKCdkYXknKSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSxcbiAgfSk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSBtZXRhQXBpOiBNZXRhQXBpU2VydmljZSkge31cbiAgY29sdW1uSWRlbnQoX2luZGV4OiBudW1iZXIsIGNvbDogUXVhbGl0eU1hdHJpeEhlYWRlcikge1xuICAgIHJldHVybiBjb2wuaWQ7XG4gIH1cblxuICBnZXQgdHlwZUNvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ190eXBlJyk7XG4gIH1cblxuICBnZXQgcmVjZW50Q29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3JlY2VudCcpO1xuICB9XG5cbiAgZ2V0IHBhc3RDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfcGFzdCcpO1xuICB9XG5cbiAgZ2V0IGFsbENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLnBhc3RDb2x1bW5zLmZsYXRNYXAoKGUsIGkpID0+IFtlLCB0aGlzLnJlY2VudENvbHVtbnNbaV1dKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVnaXN0ZXJEYXRlUmFuZ2VGaWx0ZXIoKSB7XG4gICAgLyogd2UgY2Fubm90IHVzZSB0aGUgdGFrZVVudGlsRGVzdHJveWVkKCkgaGVscGVyIGhlcmUsXG4gICAgICogYmVjYXVzZSB0aGlzIG1ldGhvZCBpcyBpbmRpcmVjdGx5IGNhbGxlZCBpbiB0aGUgZmluYWxpemF0aW9uIG9mIHRoZSBnZXRUaW1lcmFuZ2VGaWx0ZXIoKSBjYWxsXG4gICAgICovXG4gICAgdGhpcy5yYW5nZS5jb250cm9scy5lbmQudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoZGF0ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRDb3VudEJ5RGF0ZShkYXRlKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucmVjZW50VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQudmFsdWVDaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpLnN1YnNjcmliZSgoZGF0ZSkgPT4ge1xuICAgICAgdGhpcy5nZXRDb3VudEJ5RGF0ZShkYXRlKS5zdWJzY3JpYmUoKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgIHRoaXMucGFzdFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VGltZVJhbmdlRmlsdGVyKCkge1xuICAgIHJldHVybiB0aGlzLm1ldGFBcGlcbiAgICAgIC5nZXRUaW1lcmFuZ2VGaWx0ZXIoKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcbiAgICAgICAgICB0aGlzLnRpbWVGaWx0ZXJMb2FkZWQuc2V0KHRydWUpO1xuICAgICAgICAgIHRoaXMucmVnaXN0ZXJEYXRlUmFuZ2VGaWx0ZXIoKTtcbiAgICAgICAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLnN0YXJ0LnJlc2V0KCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyYW5nZUZpbHRlcikgPT4ge1xuICAgICAgICBpZiAocmFuZ2VGaWx0ZXIpIHtcbiAgICAgICAgICBjb25zdCBzdGFydERhdGUgPSBEYXRlVGltZS5mcm9tSVNPKHJhbmdlRmlsdGVyLnZhbHVlcy5maW5kKCh2KSA9PiB2LmlkID09PSAncmFuZ2VTdGFydCcpPy5sYWJlbCEsIHtcbiAgICAgICAgICAgIHpvbmU6ICd1dGMnLFxuICAgICAgICAgIH0pLnN0YXJ0T2YoJ2RheScpO1xuICAgICAgICAgIC8vdGhpcyBpcyB0byBoYXZlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHN0YXJ0IGRhdGUgPT4gdGhlIG1pbiBkYXRlIG9mIHRoZSByYW5nZVxuICAgICAgICAgIHRoaXMucmFuZ2Uuc2V0Q29udHJvbCgnc3RhcnQnLCBuZXcgRm9ybUNvbnRyb2w8RGF0ZVRpbWU+KHN0YXJ0RGF0ZSwgeyBub25OdWxsYWJsZTogdHJ1ZSB9KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRDb3VudEJ5RGF0ZShkYXRlOiBEYXRlVGltZSk6IE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz4ge1xuICAgIHRoaXMuaXNMb2FkaW5nLnNldCh0cnVlKTtcbiAgICBjb25zdCBmaWx0ZXI6IEZpbHRlciA9IHtcbiAgICAgIGZpZWxkOiAnYXNPZicsXG4gICAgICB2YWx1ZXM6IFt7IGlkOiBkYXRlLnRvSVNPKHsgaW5jbHVkZU9mZnNldDogZmFsc2UgfSkhLCBsYWJlbDogJycgfV0sXG4gICAgfTtcbiAgICAvLyB0eXBlIG9mIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pIGlzIE9ic2VydmFibGU8TWF0cml4V2l0aENvdW50cz5cbiAgICAvLyBidXQgdHlwZXNjcmlwdCBkb2VzIG5vdCBrbm93IHRoYXRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVt0aGlzLmFwaU1ldGhvZF0oW2ZpbHRlcl0pLnBpcGUoXG4gICAgICAvLyB0eXBlc3JpcHQgZ2V0cyBjb25mdXNlZCBoZXJlXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmaW5hbGl6ZSgoKSA9PiB0aGlzLmlzTG9hZGluZy5zZXQoZmFsc2UpKSxcbiAgICAgIG1hcCgocmVzcG9uc2U6IE1hdHJpeFdpdGhDb3VudHMpID0+IHtcbiAgICAgICAgcmVzcG9uc2Uucm93cy5zb3J0KChhLCBiKSA9PiBhLm1ldGEubGFiZWwubG9jYWxlQ29tcGFyZShiLm1ldGEubGFiZWwpKTtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgcHJvdGVjdGVkIHBhc3RUeXBlQ291bnQocm93OiBNYXRyaXhSb3dXaXRoQ291bnRzLCBjb2x1bW5pZDogc3RyaW5nKSB7XG4gICAgaWYgKCF0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIGNvbnN0IHBhc3Rfcm93ID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmZpbmQoKHByKSA9PiBwci5tZXRhLmlkID09IHJvdy5tZXRhLmlkKTtcbiAgICBjb25zdCBwYXN0X2NvbHVtbiA9IHRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUuY29sdW1ucy5maW5kKChjKSA9PiBjLmlkID09IGNvbHVtbmlkKTtcbiAgICBpZiAoIXBhc3Rfcm93IHx8ICFwYXN0X2NvbHVtbikge1xuICAgICAgcmV0dXJuIHt9O1xuICAgIH1cblxuICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IHJvdy5jb3VudHNbY29sdW1uaWRdO1xuICAgIGNvbnN0IHBhc3RWYWx1ZSA9IHBhc3Rfcm93LmNvdW50c1tjb2x1bW5pZF07XG5cbiAgICBjb25zdCBkZWx0YSA9IChjdXJyZW50VmFsdWUgfHwgMCkgLSAocGFzdFZhbHVlIHx8IDApO1xuICAgIGNvbnN0IHRyZW5kID0gZGVsdGEgPT09IDAgPyAndHJlbmRpbmdfZmxhdCcgOiBkZWx0YSA8IDAgPyAndHJlbmRpbmdfZG93bicgOiAndHJlbmRpbmdfdXAnO1xuICAgIHJldHVybiB7IGRlbHRhLCB0cmVuZCwgdmFsdWU6IHBhc3RWYWx1ZSB9O1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRUaW1lUmFuZ2VGaWx0ZXIoKTtcbiAgICB0aGlzLmdldENvdW50QnlEYXRlKHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSByZXNwb25zZS5jb2x1bW5zLnNsaWNlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBEYXRlVGltZSA9IERhdGVUaW1lO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwicmFpc2VkXCI+XG4gIDxtYXQtY2FyZC1oZWFkZXIgKm5nSWY9XCJwYWdlVGl0bGVcIj5cbiAgICA8bWF0LWNhcmQtdGl0bGUgZGF0YS10ZXN0LWlkPVwicGFnZS10aXRsZVwiPlxuICAgICAgUXVhbGl0w6R0c21ldHJpazoge3sgcGFnZVRpdGxlIHwgdHJhbnNsYXRlfX17e2lzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCJ9fVxuICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gIDwvbWF0LWNhcmQtaGVhZGVyPlxuICA8IS0tIGNvbnNpZGVyIHRvIHB1dCB0aGUgZmlsdGVyIGluIHRoZSB0YWJsZSBoZWFkZXIgdG8gYXZvaWQgdGhhdCBpdCBpcyBzY3JvbGxlZCBvdXQgb2Ygdmlldy0tPlxuICA8IS0tIHNob3cgdGhlIGZpbHRlciBhZnRlciB0aGUgdmFsdWVzIGFyZSBsb2FkZWQgdG8gYXZvaWQgbG9hZGluZyBjdXJyZW50IGRhdGEgdHdpY2UgLS0+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpXCI+XG4gICAgPG1ldGFxczItZGF0ZXBpY2tlciBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKClcIiBbaW5wdXRHcm91cF09XCJyYW5nZVwiID48L21ldGFxczItZGF0ZXBpY2tlcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbjxtYXQtY2FyZD5cbiAgPHRhYmxlIFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3NcIiBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIHJvd3NwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlF1ZWxsZTwvdGg+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgbWF0VG9vbHRpcD1cInt7cm93Lm1ldGEuYWx0X2xhYmVsfX1cIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbFwiXG4gICAgICA+XG4gICAgICAgIHt7cm93Lm1ldGEubGFiZWx9fVxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3R5cGUnXCI+XG4gICAgICA8dGggY29sc3Bhbj1cIjJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cInt7Y29sLmxhYmVsfX1cIiA+XG4gICAgICAgIHt7Y29sdW1uVHJhbnNsYXRpb25rZXkgPyAoY29sdW1uVHJhbnNsYXRpb25rZXkgKyBjb2wubGFiZWwgfCB0cmFuc2xhdGUgKSA6IGNvbC5sYWJlbCB9fVxuICAgICAgPC90aD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG1vc3QgY3VycmVudCBkYXRlLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ19yZWNlbnQnXCI+XG4gICAgICA8dGggY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCIgPnt7IHJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSB9fTwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+e3sgcm93LmNvdW50c1tjb2wuaWRdID8/ICduL2EnIH19PC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG9sZGVyIGRhdGUtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3Bhc3QnXCI+XG4gICAgICA8dGggY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1oZWFkZXItY2VsbCAqbWF0SGVhZGVyQ2VsbERlZiBtYXRUb29sdGlwPVwibm8gdG9vbHRpcFwiID5cbiAgICAgICAge3sgcGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGggPyByYW5nZS5jb250cm9scy5zdGFydC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSA6ICdubyBwYXN0IGRhdGEnIH19XG4gICAgICA8L3RoPlxuICAgICAgPHRkIGNsYXNzPVwicGFzdC1kYXRhLWNlbGxcIiBtYXQtY2VsbCAqbWF0Q2VsbERlZj1cImxldCByb3c7XCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJwYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmxlbmd0aCAmJiBwYXN0VHlwZUNvdW50KHJvdywgY29sLmlkKSBhcyB0cmVuZFwiPlxuICAgICAgICAgIDxzcGFuIFtuZ0NsYXNzXT1cInRyZW5kLnRyZW5kXCI+IHt7IHRyZW5kLnZhbHVlID8/ICduL2EnIH19PG1hdC1pY29uIGFyaWEtaGlkZGVuPVwiZmFsc2VcIiBbYXR0ci5hcmlhLWxhYmVsXT1cInRyZW5kLnRyZW5kXCIgW2ZvbnRJY29uXT1cInRyZW5kLnRyZW5kIVwiIC8+PC9zcGFuPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2RrLXZpc3VhbGx5LWhpZGRlblwiPnt7dHJlbmQudHJlbmR9fTwvc3Bhbj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gZ2VuZXJhdGUgYWN0dWFsIHRhYmxlIC0tPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiWydsYWJlbC1jb2wnXS5jb25jYXQodHlwZUNvbHVtbnMpOyBzdGlja3k6dHJ1ZTtcIj48L3RyPlxuICAgIDx0ciBtYXQtaGVhZGVyLXJvdyAqbWF0SGVhZGVyUm93RGVmPVwiYWxsQ29sdW1uczsgc3RpY2t5OiB0cnVlO1wiPjwvdHI+XG4gICAgPHRyIG1hdC1yb3cgKm1hdFJvd0RlZj1cImxldCByb3c7IGNvbHVtbnM6IFsnbGFiZWwtY29sJ10uY29uY2F0KGFsbENvbHVtbnMpXCI+PC90cj5cblxuICA8L3RhYmxlPlxuPC9tYXQtY2FyZD4iXX0=
180
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY291bnRzLXdpdGgtaGlzdG9yeS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9uZy1tZXRhLXdpZGdldHMtbGliL3NyYy9saWIvY291bnRzLXdpdGgtaGlzdG9yeS9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL25nLW1ldGEtd2lkZ2V0cy1saWIvc3JjL2xpYi9jb3VudHMtd2l0aC1oaXN0b3J5L2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM1RSxPQUFPLEVBQUUsT0FBTyxFQUFFLGNBQWMsRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLFlBQVksRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQzdHLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUN2RCxPQUFPLEVBQUUsWUFBWSxFQUFFLGVBQWUsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUNySCxPQUFPLEVBQUUsZUFBZSxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUM1RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdEQsT0FBTyxFQUFFLFNBQVMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBR3BFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFDakMsT0FBTyxFQUFFLFFBQVEsRUFBRSxHQUFHLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENB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QVUsQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUM3QixDQUFDOytHQTVKVSwwQkFBMEI7bUdBQTFCLDBCQUEwQiwyTkMzQ3ZDLDIyR0EwRFcsNHhCRHRDUCxhQUFhLG1aQUtiLFVBQVUsZ1JBQ1YsY0FBYyxzZ0NBRWQsZUFBZSw0RkFLZixPQUFPLG1IQUNQLG1CQUFtQixtR0FDbkIsT0FBTyxvRkFDUCxPQUFPLDJJQUNQLElBQUksd0ZBQ0osU0FBUzs7NEZBS0EsMEJBQTBCO2tCQTNCdEMsU0FBUzsrQkFDRSw2QkFBNkIsY0FDM0IsSUFBSSxXQUNQO3dCQUNQLGFBQWE7d0JBQ2IsT0FBTzt3QkFDUCxhQUFhO3dCQUNiLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxVQUFVO3dCQUNWLGNBQWM7d0JBQ2QsUUFBUTt3QkFDUixlQUFlO3dCQUNmLFlBQVk7d0JBQ1osZUFBZTt3QkFDZixNQUFNO3dCQUNOLFNBQVM7d0JBQ1QsT0FBTzt3QkFDUCxtQkFBbUI7d0JBQ25CLE9BQU87d0JBQ1AsT0FBTzt3QkFDUCxJQUFJO3dCQUNKLFNBQVM7cUJBQ1Y7c0hBYUQsU0FBUztzQkFEUixLQUFLO3VCQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksRUFBRTtnQkFHekIsb0JBQW9CO3NCQURuQixLQUFLO2dCQUdOLFNBQVM7c0JBRFIsS0FBSztnQkFHTixVQUFVO3NCQURULEtBQUs7dUJBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBJbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIHNpZ25hbCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0Q2FyZCwgTWF0Q2FyZENvbnRlbnQsIE1hdENhcmRIZWFkZXIsIE1hdENhcmRNb2R1bGUsIE1hdENhcmRUaXRsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2NhcmQnO1xuaW1wb3J0IHsgTWF0VG9vbHRpcCB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL3Rvb2x0aXAnO1xuaW1wb3J0IHsgTWF0SGVhZGVyUm93LCBNYXRIZWFkZXJSb3dEZWYsIE1hdFJvdywgTWF0Um93RGVmLCBNYXRUYWJsZSwgTWF0VGFibGVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC90YWJsZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IFRyYW5zbGF0ZU1vZHVsZSB9IGZyb20gJ0BuZ3gtdHJhbnNsYXRlL2NvcmUnO1xuaW1wb3J0IHsgQXN5bmNQaXBlLCBOZ0NsYXNzLCBOZ0Zvck9mLCBOZ0lmIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IE1ldGFBcGlTZXJ2aWNlIH0gZnJvbSAnLi4vbWV0YS1hcGkuc2VydmljZSc7XG5pbXBvcnQgeyBGaWx0ZXIsIE1hdHJpeFJvd1dpdGhDb3VudHMsIE1hdHJpeFdpdGhDb3VudHMsIFF1YWxpdHlNYXRyaXhIZWFkZXIgfSBmcm9tICcuLi9qYXZhLWFwaSc7XG5pbXBvcnQgeyBEYXRlVGltZSB9IGZyb20gJ2x1eG9uJztcbmltcG9ydCB7IGZpbmFsaXplLCBtYXAsIHNraXBXaGlsZSwgdGFrZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBGb3JtQ29udHJvbCwgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgRGF0ZXBpY2tlckNvbXBvbmVudCB9IGZyb20gJy4uL2NvbXBvbmVudHMvZmlsdGVyL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQnO1xuaW1wb3J0IHsgTWF0SWNvbiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2ljb24nO1xuaW1wb3J0IHsgRWRpdG9yaWFsTGlua1NlcnZpY2UgfSBmcm9tICcuLi9jb21wb25lbnRzL2VkaXRvcmlhbC1saW5rLXNlcnZpY2UvZWRpdG9yaWFsLWxpbmsuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ21ldGFxczItY291bnRzLXdpdGgtaGlzdG9yeScsXG4gIHN0YW5kYWxvbmU6IHRydWUsXG4gIGltcG9ydHM6IFtcbiAgICBNYXRDYXJkTW9kdWxlLFxuICAgIE1hdENhcmQsXG4gICAgTWF0Q2FyZEhlYWRlcixcbiAgICBNYXRDYXJkVGl0bGUsXG4gICAgTWF0Q2FyZENvbnRlbnQsXG4gICAgTWF0VG9vbHRpcCxcbiAgICBNYXRUYWJsZU1vZHVsZSxcbiAgICBNYXRUYWJsZSxcbiAgICBUcmFuc2xhdGVNb2R1bGUsXG4gICAgTWF0SGVhZGVyUm93LFxuICAgIE1hdEhlYWRlclJvd0RlZixcbiAgICBNYXRSb3csXG4gICAgTWF0Um93RGVmLFxuICAgIE5nRm9yT2YsXG4gICAgRGF0ZXBpY2tlckNvbXBvbmVudCxcbiAgICBOZ0NsYXNzLFxuICAgIE1hdEljb24sXG4gICAgTmdJZixcbiAgICBBc3luY1BpcGUsXG4gIF0sXG4gIHRlbXBsYXRlVXJsOiAnLi9jb3VudHMtd2l0aC1oaXN0b3J5LmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmw6ICcuL2NvdW50cy13aXRoLWhpc3RvcnkuY29tcG9uZW50LnNjc3MnLFxufSlcbmV4cG9ydCBjbGFzcyBDb3VudHNXaXRoSGlzdG9yeUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzTG9hZGluZyA9IHNpZ25hbCh0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHRpbWVGaWx0ZXJMb2FkZWQgPSBzaWduYWwoZmFsc2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3llZCQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgcmVjZW50VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByb3RlY3RlZCByZWFkb25seSBwYXN0VHlwZUNvdW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8TWF0cml4V2l0aENvdW50cz4oeyBjb2x1bW5zOiBbXSwgcm93czogW10gfSk7XG4gIHByaXZhdGUgY29sdW1uczogUXVhbGl0eU1hdHJpeEhlYWRlcltdID0gW107XG5cbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgYXBpTWV0aG9kOiBrZXlvZiBNZXRhQXBpU2VydmljZSA9ICdnZXRNYXRlcmlhbFR5cGVDb3VudHNCeVJlcGxpY2F0aW9uU291cmNlJztcbiAgQElucHV0KClcbiAgY29sdW1uVHJhbnNsYXRpb25rZXk6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBASW5wdXQoKVxuICBwYWdlVGl0bGU6IHN0cmluZztcbiAgQElucHV0KHsgcmVxdWlyZWQ6IHRydWUgfSlcbiAgc291cmNlVHlwZTogJ3JlcGxpY2F0aW9uU291cmNlJyB8ICdjb2xsZWN0aW9uJztcblxuICAvKiBJbiB0aGlzIHdpZGdldCdzIGJhY2tlbmQgd2UgZG8gaGF2ZSBkYXRhIGZvciB0b2RheVxuICAgKiB0aGVyZWZvcmUgd2Ugc2V0IHRoZSBlbmQgZGF0ZSB0byB0b2RheSBhbmQgdXNlIHRoZSB0aW1lcmFuZ2UoKSBlbmRwb2ludCB0byBvbmx5IHNldCB0aGUgc3RhcnQgZGF0ZVxuICAgKi9cbiAgcmVhZG9ubHkgcmFuZ2U6IEZvcm1Hcm91cDx7XG4gICAgc3RhcnQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgICBlbmQ6IEZvcm1Db250cm9sPERhdGVUaW1lPGJvb2xlYW4+PjtcbiAgfT4gPSBuZXcgRm9ybUdyb3VwKHtcbiAgICBzdGFydDogbmV3IEZvcm1Db250cm9sKCksXG4gICAgZW5kOiBuZXcgRm9ybUNvbnRyb2woRGF0ZVRpbWUudXRjKCkuc3RhcnRPZignZGF5JyksIHsgbm9uTnVsbGFibGU6IHRydWUgfSksXG4gIH0pO1xuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgbWV0YUFwaTogTWV0YUFwaVNlcnZpY2UsIHByaXZhdGUgcmVhZG9ubHkgbGlua1NlcnZpY2U6IEVkaXRvcmlhbExpbmtTZXJ2aWNlKSB7fVxuICBjb2x1bW5JZGVudChfaW5kZXg6IG51bWJlciwgY29sOiBRdWFsaXR5TWF0cml4SGVhZGVyKSB7XG4gICAgcmV0dXJuIGNvbC5pZDtcbiAgfVxuXG4gIGdldCB0eXBlQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMuY29sdW1ucy5tYXAoKGMpID0+IGMuaWQgKyAnX3R5cGUnKTtcbiAgfVxuXG4gIGdldCByZWNlbnRDb2x1bW5zKCk6IHN0cmluZ1tdIHtcbiAgICByZXR1cm4gdGhpcy5jb2x1bW5zLm1hcCgoYykgPT4gYy5pZCArICdfcmVjZW50Jyk7XG4gIH1cblxuICBnZXQgcGFzdENvbHVtbnMoKTogc3RyaW5nW10ge1xuICAgIHJldHVybiB0aGlzLmNvbHVtbnMubWFwKChjKSA9PiBjLmlkICsgJ19wYXN0Jyk7XG4gIH1cblxuICBnZXQgYWxsQ29sdW1ucygpOiBzdHJpbmdbXSB7XG4gICAgcmV0dXJuIHRoaXMucGFzdENvbHVtbnMuZmxhdE1hcCgoZSwgaSkgPT4gW2UsIHRoaXMucmVjZW50Q29sdW1uc1tpXV0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpIHtcbiAgICAvKiB3ZSBjYW5ub3QgdXNlIHRoZSB0YWtlVW50aWxEZXN0cm95ZWQoKSBoZWxwZXIgaGVyZSxcbiAgICAgKiBiZWNhdXNlIHRoaXMgbWV0aG9kIGlzIGluZGlyZWN0bHkgY2FsbGVkIGluIHRoZSBmaW5hbGl6YXRpb24gb2YgdGhlIGdldFRpbWVyYW5nZUZpbHRlcigpIGNhbGxcbiAgICAgKi9cbiAgICB0aGlzLnJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XG4gICAgICB0aGlzLmdldENvdW50QnlEYXRlKGRhdGUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5yZWNlbnRUeXBlQ291bnQkLm5leHQocmVzcG9uc2UpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgdGhpcy5yYW5nZS5jb250cm9scy5zdGFydC52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95ZWQkKSkuc3Vic2NyaWJlKChkYXRlKSA9PiB7XG4gICAgICB0aGlzLmdldENvdW50QnlEYXRlKGRhdGUpLnN1YnNjcmliZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgdGhpcy5wYXN0VHlwZUNvdW50JC5uZXh0KHJlc3BvbnNlKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBnZXRUaW1lUmFuZ2VGaWx0ZXIoKSB7XG4gICAgcmV0dXJuIHRoaXMubWV0YUFwaVxuICAgICAgLmdldFRpbWVyYW5nZUZpbHRlcigpXG4gICAgICAucGlwZShcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xuICAgICAgICAgIHRoaXMudGltZUZpbHRlckxvYWRlZC5zZXQodHJ1ZSk7XG4gICAgICAgICAgdGhpcy5yZWdpc3RlckRhdGVSYW5nZUZpbHRlcigpO1xuICAgICAgICAgIHRoaXMucmFuZ2UuY29udHJvbHMuc3RhcnQucmVzZXQoKTtcbiAgICAgICAgfSlcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKHJhbmdlRmlsdGVyKSA9PiB7XG4gICAgICAgIGlmIChyYW5nZUZpbHRlcikge1xuICAgICAgICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IERhdGVUaW1lLmZyb21JU08ocmFuZ2VGaWx0ZXIudmFsdWVzLmZpbmQoKHYpID0+IHYuaWQgPT09ICdyYW5nZVN0YXJ0Jyk/LmxhYmVsISwge1xuICAgICAgICAgICAgem9uZTogJ3V0YycsXG4gICAgICAgICAgfSkuc3RhcnRPZignZGF5Jyk7XG4gICAgICAgICAgLy90aGlzIGlzIHRvIGhhdmUgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgc3RhcnQgZGF0ZSA9PiB0aGUgbWluIGRhdGUgb2YgdGhlIHJhbmdlXG4gICAgICAgICAgdGhpcy5yYW5nZS5zZXRDb250cm9sKCdzdGFydCcsIG5ldyBGb3JtQ29udHJvbDxEYXRlVGltZT4oc3RhcnREYXRlLCB7IG5vbk51bGxhYmxlOiB0cnVlIH0pKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGdldENvdW50QnlEYXRlKGRhdGU6IERhdGVUaW1lKTogT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPiB7XG4gICAgdGhpcy5pc0xvYWRpbmcuc2V0KHRydWUpO1xuICAgIGNvbnN0IGZpbHRlcjogRmlsdGVyID0ge1xuICAgICAgZmllbGQ6ICdhc09mJyxcbiAgICAgIHZhbHVlczogW3sgaWQ6IGRhdGUudG9JU08oeyBpbmNsdWRlT2Zmc2V0OiBmYWxzZSB9KSEsIGxhYmVsOiAnJyB9XSxcbiAgICB9O1xuICAgIC8vIHR5cGUgb2YgdGhpcy5tZXRhQXBpW3RoaXMuYXBpTWV0aG9kXShbZmlsdGVyXSkgaXMgT2JzZXJ2YWJsZTxNYXRyaXhXaXRoQ291bnRzPlxuICAgIC8vIGJ1dCB0eXBlc2NyaXB0IGRvZXMgbm90IGtub3cgdGhhdFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICByZXR1cm4gdGhpcy5tZXRhQXBpW3RoaXMuYXBpTWV0aG9kXShbZmlsdGVyXSkucGlwZShcbiAgICAgIC8vIHR5cGVzcmlwdCBnZXRzIGNvbmZ1c2VkIGhlcmVcbiAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgIGZpbmFsaXplKCgpID0+IHRoaXMuaXNMb2FkaW5nLnNldChmYWxzZSkpLFxuICAgICAgbWFwKChyZXNwb25zZTogTWF0cml4V2l0aENvdW50cykgPT4ge1xuICAgICAgICByZXNwb25zZS5yb3dzLnNvcnQoKGEsIGIpID0+IGEubWV0YS5sYWJlbC5sb2NhbGVDb21wYXJlKGIubWV0YS5sYWJlbCkpO1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9KVxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcGFzdFR5cGVDb3VudChyb3c6IE1hdHJpeFJvd1dpdGhDb3VudHMsIGNvbHVtbmlkOiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMucGFzdFR5cGVDb3VudCQudmFsdWUucm93cy5sZW5ndGgpIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gICAgY29uc3QgcGFzdF9yb3cgPSB0aGlzLnBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MuZmluZCgocHIpID0+IHByLm1ldGEuaWQgPT0gcm93Lm1ldGEuaWQpO1xuICAgIGNvbnN0IHBhc3RfY29sdW1uID0gdGhpcy5wYXN0VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zLmZpbmQoKGMpID0+IGMuaWQgPT0gY29sdW1uaWQpO1xuICAgIGlmICghcGFzdF9yb3cgfHwgIXBhc3RfY29sdW1uKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgY29uc3QgY3VycmVudFZhbHVlID0gcm93LmNvdW50c1tjb2x1bW5pZF07XG4gICAgY29uc3QgcGFzdFZhbHVlID0gcGFzdF9yb3cuY291bnRzW2NvbHVtbmlkXTtcblxuICAgIGNvbnN0IGRlbHRhID0gKGN1cnJlbnRWYWx1ZSB8fCAwKSAtIChwYXN0VmFsdWUgfHwgMCk7XG4gICAgY29uc3QgdHJlbmQgPSBkZWx0YSA9PT0gMCA/ICd0cmVuZGluZ19mbGF0JyA6IGRlbHRhIDwgMCA/ICd0cmVuZGluZ19kb3duJyA6ICd0cmVuZGluZ191cCc7XG4gICAgcmV0dXJuIHsgZGVsdGEsIHRyZW5kLCB2YWx1ZTogcGFzdFZhbHVlIH07XG4gIH1cblxuICBwcm90ZWN0ZWQgb3BlbkluRWRpdG9yKHNvdXJjZUlkOiBzdHJpbmcsIGlzc3VlSWQ6IHN0cmluZykge1xuICAgIGlmICh0aGlzLnNvdXJjZVR5cGUgPT09ICdyZXBsaWNhdGlvblNvdXJjZScpIHtcbiAgICAgIC8vIGZpbmQgdGhlIGxvbmcgbmFtZSBmb3IgdGhlIHNvdXJjZVxuICAgICAgc291cmNlSWQgPSB0aGlzLnJlY2VudFR5cGVDb3VudCQudmFsdWUucm93cy5maW5kKChyKSA9PiByLm1ldGEuaWQgPT09IHNvdXJjZUlkKT8ubWV0YS5sYWJlbCB8fCBzb3VyY2VJZDtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMubGlua1NlcnZpY2UudHlwZXNMb2FkZWQkLnBpcGUoXG4gICAgICBza2lwV2hpbGUoKGxvYWRlZCkgPT4gIWxvYWRlZCksXG4gICAgICB0YWtlKDEpLFxuICAgICAgbWFwKCgpID0+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMubGlua1NlcnZpY2UuY3JlYXRlTGlua0ZvckNvdW50c1dpdGhIaXN0b3J5KHRoaXMuc291cmNlVHlwZSwgc291cmNlSWQsIGlzc3VlSWQpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZXRUaW1lUmFuZ2VGaWx0ZXIoKTtcbiAgICB0aGlzLmdldENvdW50QnlEYXRlKHRoaXMucmFuZ2UuY29udHJvbHMuZW5kLnZhbHVlKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHRhcCgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICB0aGlzLmNvbHVtbnMgPSByZXNwb25zZS5jb2x1bW5zLnNsaWNlKCk7XG4gICAgICAgIH0pXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKChyZXNwb25zZSkgPT4ge1xuICAgICAgICB0aGlzLnJlY2VudFR5cGVDb3VudCQubmV4dChyZXNwb25zZSk7XG4gICAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWFkb25seSBEYXRlVGltZSA9IERhdGVUaW1lO1xuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMuZGVzdHJveWVkJC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95ZWQkLmNvbXBsZXRlKCk7XG4gIH1cbn1cbiIsIjxtYXQtY2FyZCBhcHBlYXJhbmNlPVwicmFpc2VkXCI+XG4gIDxtYXQtY2FyZC1oZWFkZXIgKm5nSWY9XCJwYWdlVGl0bGVcIj5cbiAgICA8bWF0LWNhcmQtdGl0bGUgZGF0YS10ZXN0LWlkPVwicGFnZS10aXRsZVwiPlxuICAgICAgUXVhbGl0w6R0c21ldHJpazoge3sgcGFnZVRpdGxlIHwgdHJhbnNsYXRlfX17e2lzTG9hZGluZygpID8gXCI6IExhZGUgbmV1ZSBEYXRlbi5cIiA6IFwiXCJ9fVxuICAgIDwvbWF0LWNhcmQtdGl0bGU+XG4gIDwvbWF0LWNhcmQtaGVhZGVyPlxuICA8IS0tIGNvbnNpZGVyIHRvIHB1dCB0aGUgZmlsdGVyIGluIHRoZSB0YWJsZSBoZWFkZXIgdG8gYXZvaWQgdGhhdCBpdCBpcyBzY3JvbGxlZCBvdXQgb2Ygdmlldy0tPlxuICA8IS0tIHNob3cgdGhlIGZpbHRlciBhZnRlciB0aGUgdmFsdWVzIGFyZSBsb2FkZWQgdG8gYXZvaWQgbG9hZGluZyBjdXJyZW50IGRhdGEgdHdpY2UgLS0+XG4gIDxtYXQtY2FyZC1jb250ZW50ICpuZ0lmPVwidGltZUZpbHRlckxvYWRlZCgpXCI+XG4gICAgPG1ldGFxczItZGF0ZXBpY2tlciBbZGlzYWJsZWRdPVwiaXNMb2FkaW5nKClcIiBbaW5wdXRHcm91cF09XCJyYW5nZVwiID48L21ldGFxczItZGF0ZXBpY2tlcj5cbiAgPC9tYXQtY2FyZC1jb250ZW50PlxuPC9tYXQtY2FyZD5cbjxtYXQtY2FyZD5cbiAgPHRhYmxlIFtuZ0NsYXNzXT1cInsnd2hpbGUtbG9hZGluZyc6IGlzTG9hZGluZygpfVwiIG1hdC10YWJsZSBbZGF0YVNvdXJjZV09XCJyZWNlbnRUeXBlQ291bnQkLnZhbHVlLnJvd3NcIiBjbGFzcz1cInF1YWxpdHktbWF0cml4XCI+XG4gICAgPCEtLSBEZWZpbmUgY29sdW1ucyBvZiB0YWJsZSAtLT5cbiAgICA8IS0tIFJvdyBIZWFkZXIgQ29sdW1uIC0tPlxuICAgIDxuZy1jb250YWluZXIgbWF0Q29sdW1uRGVmPVwibGFiZWwtY29sXCIgc3RpY2t5PlxuICAgICAgPHRoIHJvd3NwYW49XCIyXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmPlF1ZWxsZTwvdGg+XG4gICAgICA8dGRcbiAgICAgICAgbWF0LWNlbGxcbiAgICAgICAgKm1hdENlbGxEZWY9XCJsZXQgcm93XCJcbiAgICAgICAgbWF0VG9vbHRpcD1cInt7cm93Lm1ldGEuYWx0X2xhYmVsfX1cIlxuICAgICAgICBjbGFzcz1cImxhYmVsLWNvbFwiXG4gICAgICA+XG4gICAgICAgIHt7cm93Lm1ldGEubGFiZWx9fVxuICAgICAgPC90ZD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSAtLT5cbiAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBjb2wgb2YgcmVjZW50VHlwZUNvdW50JC52YWx1ZS5jb2x1bW5zOyB0cmFja0J5OmNvbHVtbklkZW50XCIgW21hdENvbHVtbkRlZl09XCJjb2wuaWQgKyAnX3R5cGUnXCI+XG4gICAgICA8dGggY29sc3Bhbj1cIjJcIiBtYXQtaGVhZGVyLWNlbGwgKm1hdEhlYWRlckNlbGxEZWYgbWF0VG9vbHRpcD1cInt7Y29sLmxhYmVsfX1cIiA+XG4gICAgICAgIHt7Y29sdW1uVHJhbnNsYXRpb25rZXkgPyAoY29sdW1uVHJhbnNsYXRpb25rZXkgKyBjb2wubGFiZWwgfCB0cmFuc2xhdGUgKSA6IGNvbC5sYWJlbCB9fVxuICAgICAgPC90aD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbiAgICA8IS0tIG9uZSBjb2x1bW4gZm9yIGVhY2ggdHlwZSBmb3IgdGhlIG1vc3QgY3VycmVudCBkYXRlLS0+XG4gICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgY29sIG9mIHJlY2VudFR5cGVDb3VudCQudmFsdWUuY29sdW1uczsgdHJhY2tCeTpjb2x1bW5JZGVudFwiIFttYXRDb2x1bW5EZWZdPVwiY29sLmlkICsgJ19yZWNlbnQnXCI+XG4gICAgICA8dGggY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCIgPnt7IHJhbmdlLmNvbnRyb2xzLmVuZC52YWx1ZS50b0xvY2FsZVN0cmluZyhEYXRlVGltZS5EQVRFX1NIT1JUKSB9fTwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJyZWNlbnQtZGF0YS1jZWxsXCIgbWF0LWNlbGwgKm1hdENlbGxEZWY9XCJsZXQgcm93XCI+XG4gICAgICAgIDxhIFthdHRyLmhyZWZdPVwib3BlbkluRWRpdG9yKHJvdy5tZXRhLmlkLCBjb2wuaWQpIHwgYXN5bmNcIiB0YXJnZXQ9XCJlZGl0b3JfZnJvbnRlbmRcIj57eyByb3cuY291bnRzW2NvbC5pZF0gPz8gJ24vYScgfX08L2E+XG4gICAgICA8L3RkPlxuICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwhLS0gb25lIGNvbHVtbiBmb3IgZWFjaCB0eXBlIGZvciB0aGUgb2xkZXIgZGF0ZS0tPlxuICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGNvbCBvZiByZWNlbnRUeXBlQ291bnQkLnZhbHVlLmNvbHVtbnM7IHRyYWNrQnk6Y29sdW1uSWRlbnRcIiBbbWF0Q29sdW1uRGVmXT1cImNvbC5pZCArICdfcGFzdCdcIj5cbiAgICAgIDx0aCBjbGFzcz1cInBhc3QtZGF0YS1jZWxsXCIgbWF0LWhlYWRlci1jZWxsICptYXRIZWFkZXJDZWxsRGVmIG1hdFRvb2x0aXA9XCJubyB0b29sdGlwXCIgPlxuICAgICAgICB7eyBwYXN0VHlwZUNvdW50JC52YWx1ZS5yb3dzLmxlbmd0aCA/IHJhbmdlLmNvbnRyb2xzLnN0YXJ0LnZhbHVlLnRvTG9jYWxlU3RyaW5nKERhdGVUaW1lLkRBVEVfU0hPUlQpIDogJ25vIHBhc3QgZGF0YScgfX1cbiAgICAgIDwvdGg+XG4gICAgICA8dGQgY2xhc3M9XCJwYXN0LWRhdGEtY2VsbFwiIG1hdC1jZWxsICptYXRDZWxsRGVmPVwibGV0IHJvdztcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cInBhc3RUeXBlQ291bnQkLnZhbHVlLnJvd3MubGVuZ3RoICYmIHBhc3RUeXBlQ291bnQocm93LCBjb2wuaWQpIGFzIHRyZW5kXCI+XG4gICAgICAgICAgPHNwYW4gW25nQ2xhc3NdPVwidHJlbmQudHJlbmRcIj4ge3sgdHJlbmQudmFsdWUgPz8gJ24vYScgfX08bWF0LWljb24gYXJpYS1oaWRkZW49XCJmYWxzZVwiIFthdHRyLmFyaWEtbGFiZWxdPVwidHJlbmQudHJlbmRcIiBbZm9udEljb25dPVwidHJlbmQudHJlbmQhXCIgLz48L3NwYW4+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJjZGstdmlzdWFsbHktaGlkZGVuXCI+e3t0cmVuZC50cmVuZH19PC9zcGFuPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvdGQ+XG4gICAgPC9uZy1jb250YWluZXI+XG4gICAgPCEtLSBnZW5lcmF0ZSBhY3R1YWwgdGFibGUgLS0+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJbJ2xhYmVsLWNvbCddLmNvbmNhdCh0eXBlQ29sdW1ucyk7IHN0aWNreTp0cnVlO1wiPjwvdHI+XG4gICAgPHRyIG1hdC1oZWFkZXItcm93ICptYXRIZWFkZXJSb3dEZWY9XCJhbGxDb2x1bW5zOyBzdGlja3k6IHRydWU7XCI+PC90cj5cbiAgICA8dHIgbWF0LXJvdyAqbWF0Um93RGVmPVwibGV0IHJvdzsgY29sdW1uczogWydsYWJlbC1jb2wnXS5jb25jYXQoYWxsQ29sdW1ucylcIj48L3RyPlxuXG4gIDwvdGFibGU+XG48L21hdC1jYXJkPiJdfQ==