@reveldigital/player-client 2.2.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,6 +3,7 @@ import { Subject } from 'rxjs';
3
3
  * Angular-friendly wrapper around the global `gadgets.reveldigital.datatable` library.
4
4
  *
5
5
  * Provides typed Promise-based methods and RxJS Observables for real-time events.
6
+ * All event emissions run inside Angular's zone to ensure change detection triggers.
6
7
  *
7
8
  * ```typescript
8
9
  * const dt = this.client.createDataTable('tbl_menu_items');
@@ -22,16 +23,18 @@ export class DataTableRef {
22
23
  * Creates a new DataTableRef.
23
24
  *
24
25
  * @param tableId - The data table ID (e.g. 'tbl_menu_items')
26
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
25
27
  * @param options - Optional configuration overrides
26
28
  * @throws Error if the global datatable library is not loaded
27
29
  */
28
- constructor(tableId, options) {
30
+ constructor(tableId, zone, options) {
29
31
  /** Emits when an existing row is modified. */
30
32
  this.rowUpdated$ = new Subject();
31
33
  /** Emits when a new row is added. */
32
34
  this.rowCreated$ = new Subject();
33
35
  /** Emits when a row is removed. */
34
36
  this.rowDeleted$ = new Subject();
37
+ this._zone = zone;
35
38
  const lib = window.gadgets?.['reveldigital.datatable'];
36
39
  if (!lib || typeof lib.create !== 'function') {
37
40
  throw new Error('RevelDigital DataTable library is not available. ' +
@@ -112,20 +115,27 @@ export class DataTableRef {
112
115
  this.rowDeleted$.complete();
113
116
  }
114
117
  /** @ignore */
115
- static _fromInstance(instance) {
118
+ static _fromInstance(instance, zone) {
116
119
  const ref = Object.create(DataTableRef.prototype);
117
120
  ref.rowUpdated$ = new Subject();
118
121
  ref.rowCreated$ = new Subject();
119
122
  ref.rowDeleted$ = new Subject();
120
123
  ref._instance = instance;
124
+ ref._zone = zone;
121
125
  ref._wireEvents();
122
126
  return ref;
123
127
  }
124
128
  /** @ignore */
125
129
  _wireEvents() {
126
- this._onRowUpdated = (change) => this.rowUpdated$.next(change);
127
- this._onRowCreated = (change) => this.rowCreated$.next(change);
128
- this._onRowDeleted = (change) => this.rowDeleted$.next(change);
130
+ this._onRowUpdated = (change) => {
131
+ this._zone.run(() => this.rowUpdated$.next(change));
132
+ };
133
+ this._onRowCreated = (change) => {
134
+ this._zone.run(() => this.rowCreated$.next(change));
135
+ };
136
+ this._onRowDeleted = (change) => {
137
+ this._zone.run(() => this.rowDeleted$.next(change));
138
+ };
129
139
  this._instance.on('rowUpdated', this._onRowUpdated);
130
140
  this._instance.on('rowCreated', this._onRowCreated);
131
141
  this._instance.on('rowDeleted', this._onRowDeleted);
@@ -155,10 +165,11 @@ export class DataTablePrefRef {
155
165
  * Creates a new DataTablePrefRef from a gadget preference JSON string.
156
166
  *
157
167
  * @param prefValue - The raw gadget preference string (JSON)
168
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
158
169
  * @param options - Optional configuration overrides
159
170
  * @throws Error if the global datatable library is not loaded
160
171
  */
161
- constructor(prefValue, options) {
172
+ constructor(prefValue, zone, options) {
162
173
  const lib = window.gadgets?.['reveldigital.datatable'];
163
174
  if (!lib || typeof lib.createFromPref !== 'function') {
164
175
  throw new Error('RevelDigital DataTable library is not available. ' +
@@ -166,7 +177,7 @@ export class DataTablePrefRef {
166
177
  }
167
178
  this._config = lib.createFromPref(prefValue, options);
168
179
  this.pref = this._config.pref;
169
- this.dataTable = DataTableRef._fromInstance(this._config.dt);
180
+ this.dataTable = DataTableRef._fromInstance(this._config.dt, zone);
170
181
  }
171
182
  /**
172
183
  * Fetches rows with the filter and sort settings from the preference automatically applied.
@@ -193,4 +204,4 @@ export class DataTablePrefRef {
193
204
  this.dataTable.dispose();
194
205
  }
195
206
  }
196
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvZGF0YXRhYmxlLXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBVy9COzs7Ozs7Ozs7Ozs7Ozs7OztHQWlCRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBcUJ2Qjs7Ozs7O09BTUc7SUFDSCxZQUFZLE9BQWUsRUFBRSxPQUEyQjtRQTFCeEQsOENBQThDO1FBQ3ZDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFMUQscUNBQXFDO1FBQzlCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFMUQsbUNBQW1DO1FBQzVCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFxQnhELE1BQU0sR0FBRyxHQUFJLE1BQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsbURBQW1EO2dCQUNuRCwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSSxPQUFPLENBQUMsTUFBOEI7UUFDM0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN4QyxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFNBQVM7UUFD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eEQsTUFBTSxHQUFHLEdBQUksTUFBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFFaEUsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDYixtREFBbUQ7Z0JBQ25ELDBEQUEwRCxDQUMzRCxDQUFDO1FBQ0osQ0FBQztRQUVELElBQUksQ0FBQyxPQUFPLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLEVBQUUsT0FBTyxDQUFDLENBQUM7UUFDdEQsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztRQUM5QixJQUFJLENBQUMsU0FBUyxHQUFHLFlBQVksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUMvRCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSSxlQUFlLENBQUMsTUFBOEI7UUFDbkQsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQsXG4gIElEYXRhVGFibGVDb2x1bW4sXG4gIElEYXRhVGFibGVPcHRpb25zLFxuICBJRGF0YVRhYmxlUHJlZixcbiAgSURhdGFUYWJsZVF1ZXJ5UGFyYW1zLFxuICBJRGF0YVRhYmxlUmVzdWx0LFxuICBJRGF0YVRhYmxlU2NoZW1hXG59IGZyb20gJy4vaW50ZXJmYWNlcy9kYXRhdGFibGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBBbmd1bGFyLWZyaWVuZGx5IHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgYGdhZGdldHMucmV2ZWxkaWdpdGFsLmRhdGF0YWJsZWAgbGlicmFyeS5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBQcm9taXNlLWJhc2VkIG1ldGhvZHMgYW5kIFJ4SlMgT2JzZXJ2YWJsZXMgZm9yIHJlYWwtdGltZSBldmVudHMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZHQgPSB0aGlzLmNsaWVudC5jcmVhdGVEYXRhVGFibGUoJ3RibF9tZW51X2l0ZW1zJyk7XG4gKlxuICogLy8gRmV0Y2ggcm93c1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZHQuZ2V0Um93cyh7IHNvcnQ6ICdwcmljZScsIHNvcnREaXI6ICdhc2MnIH0pO1xuICpcbiAqIC8vIFJlYWwtdGltZSB1cGRhdGVzXG4gKiBkdC5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKCdVcGRhdGVkOicsIGNoYW5nZSkpO1xuICpcbiAqIC8vIENsZWFudXBcbiAqIGR0LmRpc3Bvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVmIHtcblxuICAvKiogRW1pdHMgd2hlbiBhbiBleGlzdGluZyByb3cgaXMgbW9kaWZpZWQuICovXG4gIHB1YmxpYyByb3dVcGRhdGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhIG5ldyByb3cgaXMgYWRkZWQuICovXG4gIHB1YmxpYyByb3dDcmVhdGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhIHJvdyBpcyByZW1vdmVkLiAqL1xuICBwdWJsaWMgcm93RGVsZXRlZCQgPSBuZXcgU3ViamVjdDxJRGF0YVRhYmxlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfaW5zdGFuY2U6IGFueTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9vblJvd1VwZGF0ZWQhOiAoY2hhbmdlOiBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQpID0+IHZvaWQ7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX29uUm93Q3JlYXRlZCE6IChjaGFuZ2U6IElEYXRhVGFibGVDaGFuZ2VFdmVudCkgPT4gdm9pZDtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfb25Sb3dEZWxldGVkITogKGNoYW5nZTogSURhdGFUYWJsZUNoYW5nZUV2ZW50KSA9PiB2b2lkO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IERhdGFUYWJsZVJlZi5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlSWQgLSBUaGUgZGF0YSB0YWJsZSBJRCAoZS5nLiAndGJsX21lbnVfaXRlbXMnKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqL1xuICBjb25zdHJ1Y3Rvcih0YWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBJRGF0YVRhYmxlT3B0aW9ucykge1xuXG4gICAgY29uc3QgbGliID0gKHdpbmRvdyBhcyBhbnkpLmdhZGdldHM/LlsncmV2ZWxkaWdpdGFsLmRhdGF0YWJsZSddO1xuXG4gICAgaWYgKCFsaWIgfHwgdHlwZW9mIGxpYi5jcmVhdGUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JldmVsRGlnaXRhbCBEYXRhVGFibGUgbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0Vuc3VyZSB0aGUgZGF0YXRhYmxlIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgdGhpcyBnYWRnZXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9pbnN0YW5jZSA9IGxpYi5jcmVhdGUodGFibGVJZCwgb3B0aW9ucyk7XG4gICAgdGhpcy5fd2lyZUV2ZW50cygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgcm93cyBmcm9tIHRoZSBkYXRhIHRhYmxlLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyAoZmlsdGVyLCBzb3J0LCBwYWdpbmF0aW9uKVxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0IHNldFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGR0LmdldFJvd3Moe1xuICAgKiAgIGZpbHRlcjogeyBjYXRlZ29yeTogJ0VudHJlZScsIHByaWNlOiB7IG9wOiAnbHRlJywgdmFsdWU6IDI1IH0gfSxcbiAgICogICBzb3J0OiAnaXRlbU5hbWUnLFxuICAgKiAgIHNvcnREaXI6ICdhc2MnLFxuICAgKiAgIHBhZ2VTaXplOiAyMFxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgZ2V0Um93cyhwYXJhbXM/OiBJRGF0YVRhYmxlUXVlcnlQYXJhbXMpOiBQcm9taXNlPElEYXRhVGFibGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UuZ2V0Um93cyhwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgdGhlIHRhYmxlIHNjaGVtYSAoY29sdW1uIGRlZmluaXRpb25zIGFuZCBtZXRhZGF0YSkuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0YWJsZSBzY2hlbWFcbiAgICovXG4gIHB1YmxpYyBnZXRTY2hlbWEoKTogUHJvbWlzZTxJRGF0YVRhYmxlU2NoZW1hPiB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLmdldFNjaGVtYSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdmlzaWJsZSAobm9uLWhpZGRlbikgY29sdW1ucyBmcm9tIHRoZSB0YWJsZSBzY2hlbWEuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIGFycmF5IG9mIHZpc2libGUgY29sdW1uIGRlZmluaXRpb25zXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlzaWJsZUNvbHVtbnMoKTogUHJvbWlzZTxJRGF0YVRhYmxlQ29sdW1uW10+IHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UuZ2V0VmlzaWJsZUNvbHVtbnMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHJvd3Mgd2l0aCBoaWRkZW4gY29sdW1uIGRhdGEgc3RyaXBwZWQuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIChzYW1lIGFzIGdldFJvd3MpXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXN1bHQgc2V0IHdpdGggaGlkZGVuIGZpZWxkcyByZW1vdmVkXG4gICAqL1xuICBwdWJsaWMgZ2V0VmlzaWJsZVJvd3MocGFyYW1zPzogSURhdGFUYWJsZVF1ZXJ5UGFyYW1zKTogUHJvbWlzZTxJRGF0YVRhYmxlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2luc3RhbmNlLmdldFZpc2libGVSb3dzKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RhcnRzIHBvbGxpbmcgZm9yIGNoYW5nZXMgYXQgdGhlIGdpdmVuIGludGVydmFsLlxuICAgKiBFbWl0cyBvbiBgcm93VXBkYXRlZCRgIHdoZW4gbmV3IGRhdGEgaXMgZGV0ZWN0ZWQuXG4gICAqXG4gICAqIEBwYXJhbSBpbnRlcnZhbE1zIC0gUG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQgMzAwMDApXG4gICAqL1xuICBwdWJsaWMgc3RhcnRQb2xsaW5nKGludGVydmFsTXM/OiBudW1iZXIpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0YW5jZS5zdGFydFBvbGxpbmcoaW50ZXJ2YWxNcyk7XG4gIH1cblxuICAvKipcbiAgICogU3RvcHMgcG9sbGluZyBmb3IgY2hhbmdlcy5cbiAgICovXG4gIHB1YmxpYyBzdG9wUG9sbGluZygpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0YW5jZS5zdG9wUG9sbGluZygpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXM6IHN0b3BzIHBvbGxpbmcsIGNsb3NlcyB0aGUgcmVhbC10aW1lIGNvbm5lY3Rpb24sXG4gICAqIHJlbW92ZXMgZXZlbnQgbGlzdGVuZXJzLCBhbmQgY29tcGxldGVzIGFsbCBSeEpTIG9ic2VydmFibGVzLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2Uub2ZmKCdyb3dVcGRhdGVkJywgdGhpcy5fb25Sb3dVcGRhdGVkKTtcbiAgICB0aGlzLl9pbnN0YW5jZS5vZmYoJ3Jvd0NyZWF0ZWQnLCB0aGlzLl9vblJvd0NyZWF0ZWQpO1xuICAgIHRoaXMuX2luc3RhbmNlLm9mZigncm93RGVsZXRlZCcsIHRoaXMuX29uUm93RGVsZXRlZCk7XG5cbiAgICB0aGlzLl9pbnN0YW5jZS5kaXNwb3NlKCk7XG5cbiAgICB0aGlzLnJvd1VwZGF0ZWQkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5yb3dDcmVhdGVkJC5jb21wbGV0ZSgpO1xuICAgIHRoaXMucm93RGVsZXRlZCQuY29tcGxldGUoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHN0YXRpYyBfZnJvbUluc3RhbmNlKGluc3RhbmNlOiBhbnkpOiBEYXRhVGFibGVSZWYge1xuICAgIGNvbnN0IHJlZiA9IE9iamVjdC5jcmVhdGUoRGF0YVRhYmxlUmVmLnByb3RvdHlwZSkgYXMgRGF0YVRhYmxlUmVmO1xuICAgIHJlZi5yb3dVcGRhdGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcbiAgICByZWYucm93Q3JlYXRlZCQgPSBuZXcgU3ViamVjdDxJRGF0YVRhYmxlQ2hhbmdlRXZlbnQ+KCk7XG4gICAgcmVmLnJvd0RlbGV0ZWQkID0gbmV3IFN1YmplY3Q8SURhdGFUYWJsZUNoYW5nZUV2ZW50PigpO1xuICAgIHJlZi5faW5zdGFuY2UgPSBpbnN0YW5jZTtcbiAgICByZWYuX3dpcmVFdmVudHMoKTtcbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfd2lyZUV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vblJvd1VwZGF0ZWQgPSAoY2hhbmdlOiBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQpID0+IHRoaXMucm93VXBkYXRlZCQubmV4dChjaGFuZ2UpO1xuICAgIHRoaXMuX29uUm93Q3JlYXRlZCA9IChjaGFuZ2U6IElEYXRhVGFibGVDaGFuZ2VFdmVudCkgPT4gdGhpcy5yb3dDcmVhdGVkJC5uZXh0KGNoYW5nZSk7XG4gICAgdGhpcy5fb25Sb3dEZWxldGVkID0gKGNoYW5nZTogSURhdGFUYWJsZUNoYW5nZUV2ZW50KSA9PiB0aGlzLnJvd0RlbGV0ZWQkLm5leHQoY2hhbmdlKTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uKCdyb3dVcGRhdGVkJywgdGhpcy5fb25Sb3dVcGRhdGVkKTtcbiAgICB0aGlzLl9pbnN0YW5jZS5vbigncm93Q3JlYXRlZCcsIHRoaXMuX29uUm93Q3JlYXRlZCk7XG4gICAgdGhpcy5faW5zdGFuY2Uub24oJ3Jvd0RlbGV0ZWQnLCB0aGlzLl9vblJvd0RlbGV0ZWQpO1xuICB9XG59XG5cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBhIGRhdGEgdGFibGUgY3JlYXRlZCBmcm9tIGEgZ2FkZ2V0IHByZWZlcmVuY2UgdmFsdWUuXG4gKlxuICogQXV0b21hdGljYWxseSBjb25maWd1cmVzIGZpbHRlciBhbmQgc29ydCBzZXR0aW5ncyBmcm9tIHRoZSBwcmVmZXJlbmNlLFxuICogYW5kIHByb3ZpZGVzIGEgYGdldEZpbHRlcmVkUm93cygpYCBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhcHBsaWVzIHRoZW0uXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2ZnID0gdGhpcy5jbGllbnQuY3JlYXRlRGF0YVRhYmxlRnJvbVByZWYocHJlZnMuZ2V0U3RyaW5nKCdyZERhdGFUYWJsZScpKTtcbiAqXG4gKiAvLyBGZXRjaCByb3dzIHdpdGggYXV0by13aXJlZCBmaWx0ZXIgKyBzb3J0IGZyb20gdGhlIHByZWZlcmVuY2VcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNmZy5nZXRGaWx0ZXJlZFJvd3MoKTtcbiAqXG4gKiAvLyBBY2Nlc3MgdGhlIHVuZGVybHlpbmcgRGF0YVRhYmxlUmVmIGZvciBzY2hlbWEsIGV2ZW50cywgZXRjLlxuICogY2ZnLmRhdGFUYWJsZS5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKGNoYW5nZSkpO1xuICpcbiAqIC8vIENsZWFudXBcbiAqIGNmZy5kaXNwb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFUYWJsZVByZWZSZWYge1xuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBEYXRhVGFibGVSZWYgd2l0aCBmdWxsIGFjY2VzcyB0byBzY2hlbWEsIGV2ZW50cywgcG9sbGluZywgZXRjLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVRhYmxlOiBEYXRhVGFibGVSZWY7XG5cbiAgLyoqIFRoZSBwYXJzZWQgcHJlZmVyZW5jZSBvYmplY3QuICovXG4gIHB1YmxpYyByZWFkb25seSBwcmVmOiBJRGF0YVRhYmxlUHJlZjtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9jb25maWc6IGFueTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEYXRhVGFibGVQcmVmUmVmIGZyb20gYSBnYWRnZXQgcHJlZmVyZW5jZSBKU09OIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHByZWZWYWx1ZSAtIFRoZSByYXcgZ2FkZ2V0IHByZWZlcmVuY2Ugc3RyaW5nIChKU09OKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwcmVmVmFsdWU6IHN0cmluZywgb3B0aW9ucz86IElEYXRhVGFibGVPcHRpb25zKSB7XG5cbiAgICBjb25zdCBsaWIgPSAod2luZG93IGFzIGFueSkuZ2FkZ2V0cz8uWydyZXZlbGRpZ2l0YWwuZGF0YXRhYmxlJ107XG5cbiAgICBpZiAoIWxpYiB8fCB0eXBlb2YgbGliLmNyZWF0ZUZyb21QcmVmICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdSZXZlbERpZ2l0YWwgRGF0YVRhYmxlIGxpYnJhcnkgaXMgbm90IGF2YWlsYWJsZS4gJyArXG4gICAgICAgICdFbnN1cmUgdGhlIGRhdGF0YWJsZSBmZWF0dXJlIGlzIGVuYWJsZWQgZm9yIHRoaXMgZ2FkZ2V0LidcbiAgICAgICk7XG4gICAgfVxuXG4gICAgdGhpcy5fY29uZmlnID0gbGliLmNyZWF0ZUZyb21QcmVmKHByZWZWYWx1ZSwgb3B0aW9ucyk7XG4gICAgdGhpcy5wcmVmID0gdGhpcy5fY29uZmlnLnByZWY7XG4gICAgdGhpcy5kYXRhVGFibGUgPSBEYXRhVGFibGVSZWYuX2Zyb21JbnN0YW5jZSh0aGlzLl9jb25maWcuZHQpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgcm93cyB3aXRoIHRoZSBmaWx0ZXIgYW5kIHNvcnQgc2V0dGluZ3MgZnJvbSB0aGUgcHJlZmVyZW5jZSBhdXRvbWF0aWNhbGx5IGFwcGxpZWQuXG4gICAqIEFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVycyBjYW4gb3ZlcnJpZGUgb3Igc3VwcGxlbWVudCB0aGUgcHJlZmVyZW5jZSBzZXR0aW5ncy5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wdGlvbmFsIGFkZGl0aW9uYWwgcXVlcnkgcGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgcmVzdWx0IHNldFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFVzZSBwcmVmZXJlbmNlIGRlZmF1bHRzXG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNmZy5nZXRGaWx0ZXJlZFJvd3MoKTtcbiAgICpcbiAgICogLy8gT3ZlcnJpZGUgcGFnZSBzaXplXG4gICAqIGNvbnN0IHBhZ2UgPSBhd2FpdCBjZmcuZ2V0RmlsdGVyZWRSb3dzKHsgcGFnZVNpemU6IDEwIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZXRGaWx0ZXJlZFJvd3MocGFyYW1zPzogSURhdGFUYWJsZVF1ZXJ5UGFyYW1zKTogUHJvbWlzZTxJRGF0YVRhYmxlUmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5nZXRGaWx0ZXJlZFJvd3MocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWxlYXNlcyBhbGwgcmVzb3VyY2VzIGhlbGQgYnkgdGhlIHVuZGVybHlpbmcgRGF0YVRhYmxlUmVmLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5kYXRhVGFibGUuZGlzcG9zZSgpO1xuICB9XG59XG4iXX0=
207
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YXRhYmxlLXJlZi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvZGF0YXRhYmxlLXJlZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBVy9COzs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FrQkc7QUFDSCxNQUFNLE9BQU8sWUFBWTtJQXdCdkI7Ozs7Ozs7T0FPRztJQUNILFlBQVksT0FBZSxFQUFFLElBQVksRUFBRSxPQUEyQjtRQTlCdEUsOENBQThDO1FBQ3ZDLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFMUQscUNBQXFDO1FBQzlCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUFFMUQsbUNBQW1DO1FBQzVCLGdCQUFXLEdBQUcsSUFBSSxPQUFPLEVBQXlCLENBQUM7UUF5QnhELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFJLE1BQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBRWhFLElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsbURBQW1EO2dCQUNuRCwwREFBMEQsQ0FDM0QsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7O09BY0c7SUFDSSxPQUFPLENBQUMsTUFBOEI7UUFDM0MsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFN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M0IsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQge1xuICBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQsXG4gIElEYXRhVGFibGVDb2x1bW4sXG4gIElEYXRhVGFibGVPcHRpb25zLFxuICBJRGF0YVRhYmxlUHJlZixcbiAgSURhdGFUYWJsZVF1ZXJ5UGFyYW1zLFxuICBJRGF0YVRhYmxlUmVzdWx0LFxuICBJRGF0YVRhYmxlU2NoZW1hXG59IGZyb20gJy4vaW50ZXJmYWNlcy9kYXRhdGFibGUuaW50ZXJmYWNlJztcblxuLyoqXG4gKiBBbmd1bGFyLWZyaWVuZGx5IHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgYGdhZGdldHMucmV2ZWxkaWdpdGFsLmRhdGF0YWJsZWAgbGlicmFyeS5cbiAqXG4gKiBQcm92aWRlcyB0eXBlZCBQcm9taXNlLWJhc2VkIG1ldGhvZHMgYW5kIFJ4SlMgT2JzZXJ2YWJsZXMgZm9yIHJlYWwtdGltZSBldmVudHMuXG4gKiBBbGwgZXZlbnQgZW1pc3Npb25zIHJ1biBpbnNpZGUgQW5ndWxhcidzIHpvbmUgdG8gZW5zdXJlIGNoYW5nZSBkZXRlY3Rpb24gdHJpZ2dlcnMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgZHQgPSB0aGlzLmNsaWVudC5jcmVhdGVEYXRhVGFibGUoJ3RibF9tZW51X2l0ZW1zJyk7XG4gKlxuICogLy8gRmV0Y2ggcm93c1xuICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZHQuZ2V0Um93cyh7IHNvcnQ6ICdwcmljZScsIHNvcnREaXI6ICdhc2MnIH0pO1xuICpcbiAqIC8vIFJlYWwtdGltZSB1cGRhdGVzXG4gKiBkdC5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKCdVcGRhdGVkOicsIGNoYW5nZSkpO1xuICpcbiAqIC8vIENsZWFudXBcbiAqIGR0LmRpc3Bvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgRGF0YVRhYmxlUmVmIHtcblxuICAvKiogRW1pdHMgd2hlbiBhbiBleGlzdGluZyByb3cgaXMgbW9kaWZpZWQuICovXG4gIHB1YmxpYyByb3dVcGRhdGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhIG5ldyByb3cgaXMgYWRkZWQuICovXG4gIHB1YmxpYyByb3dDcmVhdGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcblxuICAvKiogRW1pdHMgd2hlbiBhIHJvdyBpcyByZW1vdmVkLiAqL1xuICBwdWJsaWMgcm93RGVsZXRlZCQgPSBuZXcgU3ViamVjdDxJRGF0YVRhYmxlQ2hhbmdlRXZlbnQ+KCk7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfaW5zdGFuY2U6IGFueTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF96b25lOiBOZ1pvbmU7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfb25Sb3dVcGRhdGVkITogKGNoYW5nZTogSURhdGFUYWJsZUNoYW5nZUV2ZW50KSA9PiB2b2lkO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9vblJvd0NyZWF0ZWQhOiAoY2hhbmdlOiBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQpID0+IHZvaWQ7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX29uUm93RGVsZXRlZCE6IChjaGFuZ2U6IElEYXRhVGFibGVDaGFuZ2VFdmVudCkgPT4gdm9pZDtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEYXRhVGFibGVSZWYuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZUlkIC0gVGhlIGRhdGEgdGFibGUgSUQgKGUuZy4gJ3RibF9tZW51X2l0ZW1zJylcbiAgICogQHBhcmFtIHpvbmUgLSBBbmd1bGFyIE5nWm9uZSBmb3IgZW5zdXJpbmcgY2hhbmdlIGRldGVjdGlvbiBvbiBjYWxsYmFja3NcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBnbG9iYWwgZGF0YXRhYmxlIGxpYnJhcnkgaXMgbm90IGxvYWRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IodGFibGVJZDogc3RyaW5nLCB6b25lOiBOZ1pvbmUsIG9wdGlvbnM/OiBJRGF0YVRhYmxlT3B0aW9ucykge1xuXG4gICAgdGhpcy5fem9uZSA9IHpvbmU7XG5cbiAgICBjb25zdCBsaWIgPSAod2luZG93IGFzIGFueSkuZ2FkZ2V0cz8uWydyZXZlbGRpZ2l0YWwuZGF0YXRhYmxlJ107XG5cbiAgICBpZiAoIWxpYiB8fCB0eXBlb2YgbGliLmNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmV2ZWxEaWdpdGFsIERhdGFUYWJsZSBsaWJyYXJ5IGlzIG5vdCBhdmFpbGFibGUuICcgK1xuICAgICAgICAnRW5zdXJlIHRoZSBkYXRhdGFibGUgZmVhdHVyZSBpcyBlbmFibGVkIGZvciB0aGlzIGdhZGdldC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2luc3RhbmNlID0gbGliLmNyZWF0ZSh0YWJsZUlkLCBvcHRpb25zKTtcbiAgICB0aGlzLl93aXJlRXZlbnRzKCk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyByb3dzIGZyb20gdGhlIGRhdGEgdGFibGUuXG4gICAqXG4gICAqIEBwYXJhbSBwYXJhbXMgLSBPcHRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIChmaWx0ZXIsIHNvcnQsIHBhZ2luYXRpb24pXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXN1bHQgc2V0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZHQuZ2V0Um93cyh7XG4gICAqICAgZmlsdGVyOiB7IGNhdGVnb3J5OiAnRW50cmVlJywgcHJpY2U6IHsgb3A6ICdsdGUnLCB2YWx1ZTogMjUgfSB9LFxuICAgKiAgIHNvcnQ6ICdpdGVtTmFtZScsXG4gICAqICAgc29ydERpcjogJ2FzYycsXG4gICAqICAgcGFnZVNpemU6IDIwXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBnZXRSb3dzKHBhcmFtcz86IElEYXRhVGFibGVRdWVyeVBhcmFtcyk6IFByb21pc2U8SURhdGFUYWJsZVJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZS5nZXRSb3dzKHBhcmFtcyk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgdGFibGUgc2NoZW1hIChjb2x1bW4gZGVmaW5pdGlvbnMgYW5kIG1ldGFkYXRhKS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRhYmxlIHNjaGVtYVxuICAgKi9cbiAgcHVibGljIGdldFNjaGVtYSgpOiBQcm9taXNlPElEYXRhVGFibGVTY2hlbWE+IHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UuZ2V0U2NoZW1hKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB2aXNpYmxlIChub24taGlkZGVuKSBjb2x1bW5zIGZyb20gdGhlIHRhYmxlIHNjaGVtYS5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gYXJyYXkgb2YgdmlzaWJsZSBjb2x1bW4gZGVmaW5pdGlvbnNcbiAgICovXG4gIHB1YmxpYyBnZXRWaXNpYmxlQ29sdW1ucygpOiBQcm9taXNlPElEYXRhVGFibGVDb2x1bW5bXT4ge1xuICAgIHJldHVybiB0aGlzLl9pbnN0YW5jZS5nZXRWaXNpYmxlQ29sdW1ucygpO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgcm93cyB3aXRoIGhpZGRlbiBjb2x1bW4gZGF0YSBzdHJpcHBlZC5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIE9wdGlvbmFsIHF1ZXJ5IHBhcmFtZXRlcnMgKHNhbWUgYXMgZ2V0Um93cylcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHJlc3VsdCBzZXQgd2l0aCBoaWRkZW4gZmllbGRzIHJlbW92ZWRcbiAgICovXG4gIHB1YmxpYyBnZXRWaXNpYmxlUm93cyhwYXJhbXM/OiBJRGF0YVRhYmxlUXVlcnlQYXJhbXMpOiBQcm9taXNlPElEYXRhVGFibGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5faW5zdGFuY2UuZ2V0VmlzaWJsZVJvd3MocGFyYW1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdGFydHMgcG9sbGluZyBmb3IgY2hhbmdlcyBhdCB0aGUgZ2l2ZW4gaW50ZXJ2YWwuXG4gICAqIEVtaXRzIG9uIGByb3dVcGRhdGVkJGAgd2hlbiBuZXcgZGF0YSBpcyBkZXRlY3RlZC5cbiAgICpcbiAgICogQHBhcmFtIGludGVydmFsTXMgLSBQb2xsaW5nIGludGVydmFsIGluIG1pbGxpc2Vjb25kcyAoZGVmYXVsdCAzMDAwMClcbiAgICovXG4gIHB1YmxpYyBzdGFydFBvbGxpbmcoaW50ZXJ2YWxNcz86IG51bWJlcik6IHZvaWQge1xuICAgIHRoaXMuX2luc3RhbmNlLnN0YXJ0UG9sbGluZyhpbnRlcnZhbE1zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTdG9wcyBwb2xsaW5nIGZvciBjaGFuZ2VzLlxuICAgKi9cbiAgcHVibGljIHN0b3BQb2xsaW5nKCk6IHZvaWQge1xuICAgIHRoaXMuX2luc3RhbmNlLnN0b3BQb2xsaW5nKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVsZWFzZXMgYWxsIHJlc291cmNlczogc3RvcHMgcG9sbGluZywgY2xvc2VzIHRoZSByZWFsLXRpbWUgY29ubmVjdGlvbixcbiAgICogcmVtb3ZlcyBldmVudCBsaXN0ZW5lcnMsIGFuZCBjb21wbGV0ZXMgYWxsIFJ4SlMgb2JzZXJ2YWJsZXMuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLl9pbnN0YW5jZS5vZmYoJ3Jvd1VwZGF0ZWQnLCB0aGlzLl9vblJvd1VwZGF0ZWQpO1xuICAgIHRoaXMuX2luc3RhbmNlLm9mZigncm93Q3JlYXRlZCcsIHRoaXMuX29uUm93Q3JlYXRlZCk7XG4gICAgdGhpcy5faW5zdGFuY2Uub2ZmKCdyb3dEZWxldGVkJywgdGhpcy5fb25Sb3dEZWxldGVkKTtcblxuICAgIHRoaXMuX2luc3RhbmNlLmRpc3Bvc2UoKTtcblxuICAgIHRoaXMucm93VXBkYXRlZCQuY29tcGxldGUoKTtcbiAgICB0aGlzLnJvd0NyZWF0ZWQkLmNvbXBsZXRlKCk7XG4gICAgdGhpcy5yb3dEZWxldGVkJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgc3RhdGljIF9mcm9tSW5zdGFuY2UoaW5zdGFuY2U6IGFueSwgem9uZTogTmdab25lKTogRGF0YVRhYmxlUmVmIHtcbiAgICBjb25zdCByZWYgPSBPYmplY3QuY3JlYXRlKERhdGFUYWJsZVJlZi5wcm90b3R5cGUpIGFzIERhdGFUYWJsZVJlZjtcbiAgICByZWYucm93VXBkYXRlZCQgPSBuZXcgU3ViamVjdDxJRGF0YVRhYmxlQ2hhbmdlRXZlbnQ+KCk7XG4gICAgcmVmLnJvd0NyZWF0ZWQkID0gbmV3IFN1YmplY3Q8SURhdGFUYWJsZUNoYW5nZUV2ZW50PigpO1xuICAgIHJlZi5yb3dEZWxldGVkJCA9IG5ldyBTdWJqZWN0PElEYXRhVGFibGVDaGFuZ2VFdmVudD4oKTtcbiAgICByZWYuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgcmVmLl96b25lID0gem9uZTtcbiAgICByZWYuX3dpcmVFdmVudHMoKTtcbiAgICByZXR1cm4gcmVmO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfd2lyZUV2ZW50cygpOiB2b2lkIHtcbiAgICB0aGlzLl9vblJvd1VwZGF0ZWQgPSAoY2hhbmdlOiBJRGF0YVRhYmxlQ2hhbmdlRXZlbnQpID0+IHtcbiAgICAgIHRoaXMuX3pvbmUucnVuKCgpID0+IHRoaXMucm93VXBkYXRlZCQubmV4dChjaGFuZ2UpKTtcbiAgICB9O1xuICAgIHRoaXMuX29uUm93Q3JlYXRlZCA9IChjaGFuZ2U6IElEYXRhVGFibGVDaGFuZ2VFdmVudCkgPT4ge1xuICAgICAgdGhpcy5fem9uZS5ydW4oKCkgPT4gdGhpcy5yb3dDcmVhdGVkJC5uZXh0KGNoYW5nZSkpO1xuICAgIH07XG4gICAgdGhpcy5fb25Sb3dEZWxldGVkID0gKGNoYW5nZTogSURhdGFUYWJsZUNoYW5nZUV2ZW50KSA9PiB7XG4gICAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLnJvd0RlbGV0ZWQkLm5leHQoY2hhbmdlKSk7XG4gICAgfTtcblxuICAgIHRoaXMuX2luc3RhbmNlLm9uKCdyb3dVcGRhdGVkJywgdGhpcy5fb25Sb3dVcGRhdGVkKTtcbiAgICB0aGlzLl9pbnN0YW5jZS5vbigncm93Q3JlYXRlZCcsIHRoaXMuX29uUm93Q3JlYXRlZCk7XG4gICAgdGhpcy5faW5zdGFuY2Uub24oJ3Jvd0RlbGV0ZWQnLCB0aGlzLl9vblJvd0RlbGV0ZWQpO1xuICB9XG59XG5cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBhIGRhdGEgdGFibGUgY3JlYXRlZCBmcm9tIGEgZ2FkZ2V0IHByZWZlcmVuY2UgdmFsdWUuXG4gKlxuICogQXV0b21hdGljYWxseSBjb25maWd1cmVzIGZpbHRlciBhbmQgc29ydCBzZXR0aW5ncyBmcm9tIHRoZSBwcmVmZXJlbmNlLFxuICogYW5kIHByb3ZpZGVzIGEgYGdldEZpbHRlcmVkUm93cygpYCBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBhcHBsaWVzIHRoZW0uXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgY2ZnID0gdGhpcy5jbGllbnQuY3JlYXRlRGF0YVRhYmxlRnJvbVByZWYocHJlZnMuZ2V0U3RyaW5nKCdyZERhdGFUYWJsZScpKTtcbiAqXG4gKiAvLyBGZXRjaCByb3dzIHdpdGggYXV0by13aXJlZCBmaWx0ZXIgKyBzb3J0IGZyb20gdGhlIHByZWZlcmVuY2VcbiAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNmZy5nZXRGaWx0ZXJlZFJvd3MoKTtcbiAqXG4gKiAvLyBBY2Nlc3MgdGhlIHVuZGVybHlpbmcgRGF0YVRhYmxlUmVmIGZvciBzY2hlbWEsIGV2ZW50cywgZXRjLlxuICogY2ZnLmRhdGFUYWJsZS5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKGNoYW5nZSkpO1xuICpcbiAqIC8vIENsZWFudXBcbiAqIGNmZy5kaXNwb3NlKCk7XG4gKiBgYGBcbiAqL1xuZXhwb3J0IGNsYXNzIERhdGFUYWJsZVByZWZSZWYge1xuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBEYXRhVGFibGVSZWYgd2l0aCBmdWxsIGFjY2VzcyB0byBzY2hlbWEsIGV2ZW50cywgcG9sbGluZywgZXRjLiAqL1xuICBwdWJsaWMgcmVhZG9ubHkgZGF0YVRhYmxlOiBEYXRhVGFibGVSZWY7XG5cbiAgLyoqIFRoZSBwYXJzZWQgcHJlZmVyZW5jZSBvYmplY3QuICovXG4gIHB1YmxpYyByZWFkb25seSBwcmVmOiBJRGF0YVRhYmxlUHJlZjtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF9jb25maWc6IGFueTtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBEYXRhVGFibGVQcmVmUmVmIGZyb20gYSBnYWRnZXQgcHJlZmVyZW5jZSBKU09OIHN0cmluZy5cbiAgICpcbiAgICogQHBhcmFtIHByZWZWYWx1ZSAtIFRoZSByYXcgZ2FkZ2V0IHByZWZlcmVuY2Ugc3RyaW5nIChKU09OKVxuICAgKiBAcGFyYW0gem9uZSAtIEFuZ3VsYXIgTmdab25lIGZvciBlbnN1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uIG9uIGNhbGxiYWNrc1xuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqL1xuICBjb25zdHJ1Y3RvcihwcmVmVmFsdWU6IHN0cmluZywgem9uZTogTmdab25lLCBvcHRpb25zPzogSURhdGFUYWJsZU9wdGlvbnMpIHtcblxuICAgIGNvbnN0IGxpYiA9ICh3aW5kb3cgYXMgYW55KS5nYWRnZXRzPy5bJ3JldmVsZGlnaXRhbC5kYXRhdGFibGUnXTtcblxuICAgIGlmICghbGliIHx8IHR5cGVvZiBsaWIuY3JlYXRlRnJvbVByZWYgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ1JldmVsRGlnaXRhbCBEYXRhVGFibGUgbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0Vuc3VyZSB0aGUgZGF0YXRhYmxlIGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgdGhpcyBnYWRnZXQuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jb25maWcgPSBsaWIuY3JlYXRlRnJvbVByZWYocHJlZlZhbHVlLCBvcHRpb25zKTtcbiAgICB0aGlzLnByZWYgPSB0aGlzLl9jb25maWcucHJlZjtcbiAgICB0aGlzLmRhdGFUYWJsZSA9IERhdGFUYWJsZVJlZi5fZnJvbUluc3RhbmNlKHRoaXMuX2NvbmZpZy5kdCwgem9uZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyByb3dzIHdpdGggdGhlIGZpbHRlciBhbmQgc29ydCBzZXR0aW5ncyBmcm9tIHRoZSBwcmVmZXJlbmNlIGF1dG9tYXRpY2FsbHkgYXBwbGllZC5cbiAgICogQWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzIGNhbiBvdmVycmlkZSBvciBzdXBwbGVtZW50IHRoZSBwcmVmZXJlbmNlIHNldHRpbmdzLlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gT3B0aW9uYWwgYWRkaXRpb25hbCBxdWVyeSBwYXJhbWV0ZXJzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSByZXN1bHQgc2V0XG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gVXNlIHByZWZlcmVuY2UgZGVmYXVsdHNcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2ZnLmdldEZpbHRlcmVkUm93cygpO1xuICAgKlxuICAgKiAvLyBPdmVycmlkZSBwYWdlIHNpemVcbiAgICogY29uc3QgcGFnZSA9IGF3YWl0IGNmZy5nZXRGaWx0ZXJlZFJvd3MoeyBwYWdlU2l6ZTogMTAgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGdldEZpbHRlcmVkUm93cyhwYXJhbXM/OiBJRGF0YVRhYmxlUXVlcnlQYXJhbXMpOiBQcm9taXNlPElEYXRhVGFibGVSZXN1bHQ+IHtcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnLmdldEZpbHRlcmVkUm93cyhwYXJhbXMpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVSZWYuXG4gICAqL1xuICBwdWJsaWMgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGFUYWJsZS5kaXNwb3NlKCk7XG4gIH1cbn1cbiJdfQ==
@@ -135,6 +135,7 @@ export class PlayerClientService {
135
135
  this.onConfig$.next(null);
136
136
  }
137
137
  }), tap(e => this.onPostMessage$.next(e)));
138
+ this.zone = zone;
138
139
  window.RevelDigital = {
139
140
  Controller: {
140
141
  onCommand: (name, arg) => {
@@ -822,7 +823,7 @@ export class PlayerClientService {
822
823
  * ```
823
824
  */
824
825
  createDataTable(tableId, options) {
825
- return new DataTableRef(tableId, options);
826
+ return new DataTableRef(tableId, this.zone, options);
826
827
  }
827
828
  /**
828
829
  * Creates a typed data table wrapper from a gadget preference value.
@@ -851,7 +852,7 @@ export class PlayerClientService {
851
852
  * ```
852
853
  */
853
854
  createDataTableFromPref(prefValue, options) {
854
- return new DataTablePrefRef(prefValue, options);
855
+ return new DataTablePrefRef(prefValue, this.zone, options);
855
856
  }
856
857
  // ---
857
858
  // PRIVATE METHODS.
@@ -988,4 +989,4 @@ class NoopClient {
988
989
  }
989
990
  }
990
991
  }
991
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPekQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBY3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQW1LOUIsY0FBYztJQUNkLFlBQVksSUFBWTtRQS9KeEI7Ozs7Ozs7Ozs7O1dBV0c7UUFDSSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztRQUU1Qzs7Ozs7Ozs7Ozs7O1dBWUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0M7Ozs7Ozs7Ozs7V0FVRztRQUNJLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhDOzs7Ozs7Ozs7OztXQVdHO1FBQ0ksWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0I7Ozs7Ozs7OztXQVNHO1FBQ0ksY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFakM7Ozs7Ozs7Ozs7V0FVRztRQUNJLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVV0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LElBQUksRUFBRSxDQUFDO1FBRXBGLElBQUksTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ2xCLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixHQUFHLENBQ0osQ0FBQztRQUNKLENBQUM7YUFBTSxDQUFDO1lBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQ25CLEdBQUcsQ0FDSixDQUFDO1FBQ0osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIE5nWm9uZSwgT25EZXN0cm95IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnYWRnZXRzIH0gZnJvbSAnQHJldmVsZGlnaXRhbC9nYWRnZXQtdHlwZXMnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBmcm9tRXZlbnQsIFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHNoYXJlLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBJQ2xpZW50IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NsaWVudC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUNvbW1hbmQgfSBmcm9tICcuL2ludGVyZmFjZXMvY29tbWFuZC5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURpY3Rpb25hcnkgfSBmcm9tICcuL2ludGVyZmFjZXMvY29uZmlnLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGF0YVRhYmxlT3B0aW9ucyB9IGZyb20gJy4vaW50ZXJmYWNlcy9kYXRhdGFibGUuaW50ZXJmYWNlJztcbmltcG9ydCB7IElEZXZpY2UgfSBmcm9tICcuL2ludGVyZmFjZXMvZGV2aWNlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRXZlbnRQcm9wZXJ0aWVzIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2V2ZW50LXByb3BlcnRpZXMuaW50ZXJmYWNlJztcbmltcG9ydCB7IERhdGFUYWJsZVJlZiwgRGF0YVRhYmxlUHJlZlJlZiB9IGZyb20gJy4vZGF0YXRhYmxlLXJlZic7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuLy9pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcblxuLy8gU28gdGhhdCBUeXBlU2NyaXB0IGRvZXNuJ3QgY29tcGxhaW4sIHdlJ3JlIGdvaW5nIHRvIGF1Z21lbnQgdGhlIEdMT0JBTCAvIFdJTkRPVyBcbi8vIG5hbWUtc3BhY2UgZGVmaW5pdGlvbiB0byBpbmNsdWRlIHRoZSBUcmFja2VyIEFQSS4gVGhpcyBhbHNvIHByb3ZpZGVzIHVzIHdpdGggYSBwbGFjZVxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3Ncbi8vIGF2YWlsYWJsZSBvbiB0aGUgbGlicmFyeS5cblxuLyoqIEBpZ25vcmUgKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbGV0IENsaWVudDogSUNsaWVudDtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllciBjbGllbnQuXG4gKiBcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlIGZvciBnYWRnZXRzIGFuZCB3ZWIgYXBwbGljYXRpb25zXG4gKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllciBlbnZpcm9ubWVudC4gSXQgaGFuZGxlcyBkZXZpY2VcbiAqIGluZm9ybWF0aW9uLCBjb21tYW5kcywgZXZlbnRzLCBhbmFseXRpY3MgdHJhY2tpbmcsIGFuZCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQuXG4gKiBcbiAqIFRoZSBzZXJ2aWNlIHN1cHBvcnRzIGJvdGggZGlyZWN0IEFQSSBjYWxscyBhbmQgZXZlbnQtYmFzZWQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyxcbiAqIGFsbG93aW5nIGdhZGdldHMgdG8gcmVzcG9uZCB0byBwbGF5ZXIgbGlmZWN5Y2xlIGV2ZW50cyAoc3RhcnQsIHN0b3AsIGNvbW1hbmRzKSBhbmRcbiAqIHNlbmQgZGF0YSBiYWNrIHRvIHRoZSBwbGF5ZXIgb3IgcmVtb3RlIGRldmljZXMuXG4gKiBcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQbGF5ZXJDbGllbnRTZXJ2aWNlKSB7XG4gKiAgIC8vIFN1YnNjcmliZSB0byBwbGF5ZXIgZXZlbnRzXG4gKiAgIHRoaXMuY2xpZW50Lm9uU3RhcnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ0dhZGdldCBzdGFydGVkJyk7XG4gKiAgIH0pO1xuICogICBcbiAqICAgdGhpcy5jbGllbnQub25Db21tYW5kJC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGNvbW1hbmQ6JywgY29tbWFuZCk7XG4gKiAgIH0pO1xuICogfVxuICogXG4gKiBhc3luYyBuZ09uSW5pdCgpIHtcbiAqICAgLy8gR2V0IGRldmljZSBpbmZvcm1hdGlvblxuICogICBjb25zdCBkZXZpY2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2UoKTtcbiAqICAgY29uc3QgZGV2aWNlVGltZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWUoKTtcbiAqICAgXG4gKiAgIC8vIFRyYWNrIGFuYWx5dGljc1xuICogICB0aGlzLmNsaWVudC50cmFjaygnZ2FkZ2V0X2xvYWRlZCcsIHsgdmVyc2lvbjogJzEuMCcgfSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHNpbmNlIDEuMC4wXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgY2xpZW50UHJvbWlzZTogUHJvbWlzZTxJQ2xpZW50PiB8IG51bGw7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgc3RyZWFtIG9mIGNvbW1hbmRzIHNlbnQgdG8gdGhpcyBwbGF5ZXIgZnJvbSB0aGUgUmV2ZWwgRGlnaXRhbCBwbGF0Zm9ybS5cbiAgICogU3Vic2NyaWJlIHRvIHRoaXMgdG8gaGFuZGxlIGN1c3RvbSBjb21tYW5kcyBzZW50IGZyb20gdGVtcGxhdGVzLCBwbGF5bGlzdHMsIG9yIHJlbW90ZSBkZXZpY2VzLlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vbkNvbW1hbmQkLnN1YnNjcmliZShjb21tYW5kID0+IHtcbiAgICogICBpZiAoY29tbWFuZC5uYW1lID09PSAnY3VzdG9tQWN0aW9uJykge1xuICAgKiAgICAgdGhpcy5oYW5kbGVDdXN0b21BY3Rpb24oY29tbWFuZC5hcmcpO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uQ29tbWFuZCQgPSBuZXcgU3ViamVjdDxJQ29tbWFuZD4oKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IHNpZ25hbHMgd2hlbiB0aGUgZ2FkZ2V0IGhhcyBiZWVuIGxvYWRlZCBhbmQgaXMgcmVhZHkgdG8gc3RhcnQuXG4gICAqIEVtaXRzIGB0cnVlYCB3aGVuIHJlYWR5LCBgZmFsc2VgIHdoZW4gZGVzdHJveWVkLlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vblJlYWR5JC5zdWJzY3JpYmUoaXNSZWFkeSA9PiB7XG4gICAqICAgaWYgKGlzUmVhZHkpIHtcbiAgICogICAgIGNvbnNvbGUubG9nKCdDbGllbnQgaXMgcmVhZHknKTtcbiAgICogICAgIHRoaXMuaW5pdGlhbGl6ZUdhZGdldCgpO1xuICAgKiAgIH1cbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uUmVhZHkkID0gbmV3IEJlaGF2aW9yU3ViamVjdChmYWxzZSk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIHdoZW4gdGhlIGdhZGdldCBoYXMgYmVlbiBzdGFydGVkIGJ5IHRoZSBwbGF5ZXIuXG4gICAqIFRoaXMgZXZlbnQgb2NjdXJzIHdoZW4gdGhlIHBsYXllciBiZWdpbnMgZXhlY3V0aW9uIG9mIHRoZSBnYWRnZXQgY29udGVudC5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25TdGFydCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnR2FkZ2V0IHN0YXJ0ZWQnKTtcbiAgICogICB0aGlzLnN0YXJ0QW5pbWF0aW9uKCk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvblN0YXJ0JCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIHdoZW4gdGhlIGdhZGdldCBoYXMgYmVlbiBzdG9wcGVkIGJ5IHRoZSBwbGF5ZXIuXG4gICAqIFRoaXMgZXZlbnQgb2NjdXJzIHdoZW4gdGhlIHBsYXllciBzdG9wcyBleGVjdXRpb24sIHR5cGljYWxseSB3aGVuIG1vdmluZ1xuICAgKiB0byB0aGUgbmV4dCBpdGVtIGluIGEgcGxheWxpc3Qgb3Igd2hlbiB0aGUgY29udGVudCBkdXJhdGlvbiBleHBpcmVzLlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vblN0b3AkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ0dhZGdldCBzdG9wcGVkJyk7XG4gICAqICAgdGhpcy5jbGVhbnVwKCk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvblN0b3AkID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IHNpZ25hbHMgd2hlbiB0aGUgZ2FkZ2V0IHNob3VsZCBvcGVuIHRoZSBjb25maWd1cmF0aW9uIHdpbmRvdy5cbiAgICogVGhpcyBhbGxvd3MgZ2FkZ2V0cyB0byByZXNwb25kIHRvIGNvbmZpZ3VyYXRpb24gcmVxdWVzdHMgZnJvbSB0aGUgcGxheWVyLlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vbkNvbmZpZyQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICogICB0aGlzLm9wZW5Db25maWd1cmF0aW9uRGlhbG9nKCk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvbkNvbmZpZyQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBnYWRnZXQgaGFzIHJlY2VpdmVkIGEgcG9zdE1lc3NhZ2UgZXZlbnQgZnJvbSB0aGUgcGxheWVyLlxuICAgKiBUaGlzIGhhbmRsZXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIHRoZSBnYWRnZXQgYW5kIHBsYXllciB2aWEgdGhlIHBvc3RNZXNzYWdlIEFQSS5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25Qb3N0TWVzc2FnZSQuc3Vic2NyaWJlKG1lc3NhZ2UgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdSZWNlaXZlZCBtZXNzYWdlOicsIG1lc3NhZ2UpO1xuICAgKiAgIHRoaXMuaGFuZGxlUGxheWVyTWVzc2FnZShtZXNzYWdlKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uUG9zdE1lc3NhZ2UkID0gbmV3IFN1YmplY3QoKTtcblxuICAvL1xuICAvLyBUd28gbWV0aG9kcyBhdmFpbGFibGUgZm9yIGNhbGxpbmcgaW50byB0aGUgbGlicmFyeTpcbiAgLy9cbiAgLy8gMSkgVXNpbmcgZGlzcGF0Y2hFdmVudCgpIHdpdGggdGhlIGZvbGxvd2luZyBjdXN0b20gZXZlbnRzXG4gIC8vIDIpIFVzaW5nIHRoZSB3aW5kb3cgc2NvcGVkIFJldmVsRGlnaXRhbCBvYmplY3QgYXMgZGVmaW5lZCBpbiB0aGUgY29uc3RydWN0b3JcbiAgLy9cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvblN0YXJ0U3ViOiBTdWJzY3JpcHRpb247XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25TdGFydEV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnUmV2ZWxEaWdpdGFsLlN0YXJ0JykucGlwZShcbiAgICBzaGFyZSgpLFxuICAgIHRhcCh0aGlzLm9uU3RhcnQkKVxuICApO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uU3RvcFN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uU3RvcEV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnUmV2ZWxEaWdpdGFsLlN0b3AnKS5waXBlKFxuICAgIHNoYXJlKCksXG4gICAgdGFwKHRoaXMub25TdG9wJClcbiAgKTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvbkNvbW1hbmRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvbkNvbW1hbmRFdnQkID0gZnJvbUV2ZW50PElDb21tYW5kPih3aW5kb3csICdSZXZlbERpZ2l0YWwuQ29tbWFuZCcpLnBpcGUoXG4gICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIHsgbmFtZTogZS5kZXRhaWwubmFtZSwgYXJnOiBlLmRldGFpbC5hcmcgfSBhcyBJQ29tbWFuZCB9KSxcbiAgICBzaGFyZSgpLFxuICAgIHRhcCh0aGlzLm9uQ29tbWFuZCQpXG4gICk7XG4gIC8qKiBAaWdub3JlICovXG4gIC8vIHByaXZhdGUgb25Db25maWdTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLy8gLyoqIEBpZ25vcmUgKi9cbiAgLy8gcHJpdmF0ZSBvbkNvbmZpZ0V2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnUmV2ZWxEaWdpdGFsLkNvbmZpZycpLnBpcGUoXG4gIC8vICAgc2hhcmUoKSxcbiAgLy8gICB0YXAoKGU6IEN1c3RvbUV2ZW50KSA9PiB7XG4gIC8vICAgICBjb25zb2xlLmxvZyhlKTtcblxuICAvLyAgICAgaWYgKGUuZGV0YWlsLnR5cGUgPT09ICdhcHBseUNvbmZpZycgJiYgZS5kZXRhaWwuaXNPcGVuZXIpIHtcbiAgLy8gICAgICAgdGhpcy5hcHBseUNvbmZpZyhlLmRldGFpbC5jb25maWcpOyAvLyBwcm9wYWdhdGUgY29uZmlnIHRvIGlmcmFtZSBwYXJlbnQgZnJvbSB0aGUgcG9wdXAgd2luZG93XG4gIC8vICAgICB9IGVsc2Uge1xuICAvLyAgICAgICB0aGlzLm9uQ29uZmlnJC5uZXh0KGUuZGV0YWlsKTtcbiAgLy8gICAgIH1cbiAgLy8gICB9KVxuICAvLyApO1xuICAvLyBwcml2YXRlIG9uUG9zdE1lc3NhZ2VTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLy8gcHJpdmF0ZSBvblBvc3RNZXNzYWdlRXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdtZXNzYWdlJykucGlwZShcbiAgLy8gICBmaWx0ZXIoKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxuICAvLyAgICAgbWVzc2FnZUV2ZW50LnNvdXJjZSAhPT0gd2luZG93LnBhcmVudCAmJlxuICAvLyAgICAgdHlwZW9mIG1lc3NhZ2VFdmVudC5kYXRhID09PSAnc3RyaW5nJyAmJlxuICAvLyAgICAgbWVzc2FnZUV2ZW50LmRhdGEuc3RhcnRzV2l0aCgncmV2ZWxkaWdpdGFsOicpKSxcbiAgLy8gICBtYXAoKGU6IGFueSkgPT4geyByZXR1cm4gSlNPTi5wYXJzZShlLnN1YnN0cmluZygxMykpIGFzIENvbW1hbmQgfSksXG4gIC8vICAgc2hhcmUoKSxcbiAgLy8gICB0YXAodGhpcy5vbkNvbW1hbmQkKVxuICAvLyApO1xuXG4gIHByaXZhdGUgb25Qb3N0TWVzc2FnZVN1YjogU3Vic2NyaXB0aW9uO1xuICBwcml2YXRlIG9uUG9zdE1lc3NhZ2VFdnQkID0gZnJvbUV2ZW50KHdpbmRvdywgJ21lc3NhZ2UnKS5waXBlKFxuICAgIGZpbHRlcigobWVzc2FnZUV2ZW50OiBNZXNzYWdlRXZlbnQpID0+XG4gICAgICAvL21lc3NhZ2VFdmVudC5zb3VyY2UgIT09IHdpbmRvdy5wYXJlbnQgJiZcbiAgICAgIHR5cGVvZiBtZXNzYWdlRXZlbnQuZGF0YSA9PT0gJ3N0cmluZycpLFxuICAgIG1hcCgoZTogYW55KSA9PiBKU09OLnBhcnNlKGUuZGF0YSkpLFxuICAgIHNoYXJlKCksXG4gICAgdGFwKChlOiBhbnkpID0+IHtcbiAgICAgIGlmIChlLnR5cGUgPT09ICdhcHBseUNvbmZpZycgJiYgZS5pc09wZW5lcikge1xuICAgICAgICBlLmlzT3BlbmVyID0gZmFsc2U7XG4gICAgICAgIC8vIHByb3BhZ2F0ZSBjb25maWcgdG8gaWZyYW1lIHBhcmVudCBmcm9tIHRoZSBwb3B1cCB3aW5kb3dcbiAgICAgICAgd2luZG93LnBhcmVudC5wb3N0TWVzc2FnZShcbiAgICAgICAgICBKU09OLnN0cmluZ2lmeShlKSxcbiAgICAgICAgICAnKidcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSBpZiAoZS50eXBlID09PSAnb3BlbkNvbmZpZycpIHtcbiAgICAgICAgdGhpcy5vbkNvbmZpZyQubmV4dChudWxsKTtcbiAgICAgIH1cbiAgICB9KSxcbiAgICB0YXAoZSA9PiB0aGlzLm9uUG9zdE1lc3NhZ2UkLm5leHQoZSkpXG4gICk7XG5cblxuICAvKiogQGlnbm9yZSAqL1xuICBjb25zdHJ1Y3Rvcih6b25lOiBOZ1pvbmUpIHtcblxuICAgICh3aW5kb3cgYXMgYW55KS5SZXZlbERpZ2l0YWwgPSB7XG4gICAgICBDb250cm9sbGVyOiB7XG4gICAgICAgIG9uQ29tbWFuZDogKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29tbWFuZCQubmV4dCh7IG5hbWU6IG5hbWUsIGFyZzogYXJnIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblN0YXJ0JC5uZXh0KG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblN0b3A6ICgpID0+IHtcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU3RvcCQubmV4dChudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25TdGFydFN1YiA9IHRoaXMub25TdGFydEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vblN0b3BTdWIgPSB0aGlzLm9uU3RvcEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vbkNvbW1hbmRTdWIgPSB0aGlzLm9uQ29tbWFuZEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgLy90aGlzLm9uQ29uZmlnU3ViID0gdGhpcy5vbkNvbmZpZ0V2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vblBvc3RNZXNzYWdlU3ViID0gdGhpcy5vblBvc3RNZXNzYWdlRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcblxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XG5cbiAgICB0aGlzLm9uUmVhZHkkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMub25TdGFydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uU3RvcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQ29tbWFuZFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAvL3RoaXMub25Db25maWdTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblBvc3RNZXNzYWdlU3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBzdGF0aWMgaW5pdChkYXRhOiBhbnkpIHtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJyVj4pqZ77iPIEluaXRpYWxpemluZyBSZXZlbCBEaWdpdGFsIGNsaWVudCBsaWJyYXJ5JyxcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNhbGxiYWNrIHRvIHBsYXllciBzY3JpcHRpbmcgd2l0aCB2YXJpYWJsZSBhcmd1bWVudHMuXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGdhZGdldCB0byBjb21tdW5pY2F0ZSB3aXRoIHBsYXllciBzY3JpcHRpbmcuXG4gICAqIElmIHRoZSBhcHByb3ByaWF0ZSBzY3JpcHRpbmcgaXMgaW4gcGxhY2UgaW4gdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlbXBsYXRlLCBcbiAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGluaXRpYXRlIGEgY2FsbGJhY2sgd2hpY2ggY2FuIGJlIGFjdGVkIHVwb24gaW4gcGxheWVyIHNjcmlwdC5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayAobWF4IDUgYXJndW1lbnRzKVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTZW5kIGEgc2ltcGxlIGNhbGxiYWNrXG4gICAqIHRoaXMuY2xpZW50LmNhbGxiYWNrKCd0ZXN0JywgJ2RhdGEnKTtcbiAgICogXG4gICAqIC8vIFNlbmQgbXVsdGlwbGUgcGFyYW1ldGVyc1xuICAgKiB0aGlzLmNsaWVudC5jYWxsYmFjaygnYWN0aW9uJywgJ3ZhbHVlMScsICd2YWx1ZTInLCB7IGRhdGE6ICdvYmplY3QnIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcblxuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1sxXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1syXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1szXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1s0XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIHByZWZlcmVuY2VzIGludGVyZmFjZSBleHBvc2VkIGJ5IHRoZSBHb29nbGUgR2FkZ2V0cyBBUEkuXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gZ2FkZ2V0IHByZWZlcmVuY2VzIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkXG4gICAqIGluIHRoZSBSZXZlbCBEaWdpdGFsIENNUy4gVXNlIHRoaXMgdG8gcmV0cmlldmUgdXNlci1jb25maWd1cmFibGUgc2V0dGluZ3NcbiAgICogZm9yIHlvdXIgZ2FkZ2V0LlxuICAgKiBcbiAgICogQHJldHVybnMgVGhlIEdhZGdldHMgQVBJIFByZWZzIG9iamVjdCBmb3IgYWNjZXNzaW5nIHByZWZlcmVuY2UgdmFsdWVzXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IFBsYXllckNsaWVudFNlcnZpY2UpIHtcbiAgICogICBjb25zdCBwcmVmcyA9IGNsaWVudC5nZXRQcmVmcygpO1xuICAgKiAgIGNvbnN0IG15U3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCdteVN0cmluZ1ByZWYnKTtcbiAgICogICBjb25zdCBteU51bWJlciA9IHByZWZzLmdldEludCgnbXlOdW1iZXJQcmVmJyk7XG4gICAqICAgY29uc3QgbXlCb29sID0gcHJlZnMuZ2V0Qm9vbCgnbXlCb29sUHJlZicpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKiBcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FkZ2V0cy9kb2NzL2Jhc2ljfSBHb29nbGUgR2FkZ2V0cyBBUEkgZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFByZWZzKCk6IGdhZGdldHMuUHJlZnMge1xuXG4gICAgcmV0dXJuIG5ldyB3aW5kb3dbJ2dhZGdldHMnXVsnUHJlZnMnXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWUgaW4gSVNPODYwMSBmb3JtYXQuXG4gICAqIFxuICAgKiBDdXJyZW50IGRldmljZSB0aW1lIGlzIGRldGVybWluZWQgYnkgdGhlIGRldmljZSB0aW1lem9uZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlIGluIHRoZSBDTVMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBkaXNwbGF5aW5nIHRpbWUtc2Vuc2l0aXZlIGNvbnRlbnQgb3Igc2NoZWR1bGluZyBvcGVyYXRpb25zIGJhc2VkIG9uXG4gICAqIHRoZSBkZXZpY2UncyBsb2NhbCB0aW1lIHJhdGhlciB0aGFuIGJyb3dzZXIgdGltZS5cbiAgICogXG4gICAqIEBwYXJhbSBkYXRlIC0gT3B0aW9uYWwuIElmIHN1cHBsaWVkLCB3aWxsIHRyYW5zbGF0ZSB0aGUgc3VwcGxpZWQgZGF0ZS90aW1lIHRvIGRldmljZSB0aW1lIGJhc2VkIG9uIHJlc3BlY3RpdmUgdGltZXpvbmVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRhdGUvdGltZSBpbiBJU084NjAxIGZvcm1hdFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBHZXQgY3VycmVudCBkZXZpY2UgdGltZVxuICAgKiBjb25zdCBjdXJyZW50VGltZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWUoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lOicsIGN1cnJlbnRUaW1lKTtcbiAgICogXG4gICAqIC8vIENvbnZlcnQgYSBzcGVjaWZpYyBkYXRlIHRvIGRldmljZSB0aW1lXG4gICAqIGNvbnN0IHNwZWNpZmljRGF0ZSA9IG5ldyBEYXRlKCcyMDIzLTAxLTAxVDEyOjAwOjAwWicpO1xuICAgKiBjb25zdCBkZXZpY2VUaW1lID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZShzcGVjaWZpY0RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWUoZGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRpbWV6b25lIG5hbWUgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdGltZXpvbmUgbmFtZSAoZS5nLiwgXCJBbWVyaWNhL05ld19Zb3JrXCIpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRpbWV6b25lTmFtZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWVab25lTmFtZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRpbWV6b25lOicsIHRpbWV6b25lTmFtZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZXpvbmUgSUQgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdGltZXpvbmUgSURcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGltZXpvbmVJZCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWVab25lSUQoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lem9uZSBJRDonLCB0aW1lem9uZUlkKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVJRCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWVyaWNhbCBvZmZzZXQgZnJvbSBHTVQgb2YgdGhlIHRpbWV6b25lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBob3VycyAoZS5nLiwgLTUgZm9yIEVTVClcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lem9uZSBvZmZzZXQ6Jywgb2Zmc2V0LCAnaG91cnMgZnJvbSBHTVQnKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lT2Zmc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFuZ3VhZ2UgY29kZSBvZiB0aGUgbGFuZ3VhZ2UgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbGFuZ3VhZ2UgY29kZSAoZS5nLiwgXCJlbi1VU1wiLCBcImZyLUZSXCIpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxhbmd1YWdlQ29kZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldExhbmd1YWdlQ29kZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIGxhbmd1YWdlOicsIGxhbmd1YWdlQ29kZSk7XG4gICAqIC8vIFVzZSBmb3IgbG9jYWxpemF0aW9uXG4gICAqIHRoaXMubG9hZExhbmd1YWdlUmVzb3VyY2VzKGxhbmd1YWdlQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0TGFuZ3VhZ2VDb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5pcXVlIFJldmVsIERpZ2l0YWwgZGV2aWNlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS5cbiAgICogXG4gICAqIFRoZSBkZXZpY2Uga2V5IGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc3BlY2lmaWMgcGxheWVyIGRldmljZVxuICAgKiBhbmQgY2FuIGJlIHVzZWQgZm9yIGRldmljZS1zcGVjaWZpYyBvcGVyYXRpb25zIG9yIHJlbW90ZSBjb21tYW5kcy5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZXZpY2Uga2V5IHN0cmluZ1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VLZXkgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VLZXkoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSBrZXk6JywgZGV2aWNlS2V5KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VLZXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgdG8gdGhlIGxvY2FsIHBsYXllciBkZXZpY2UuXG4gICAqIFxuICAgKiBDb21tYW5kcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGxheWVyIG9yIHRyaWdnZXJcbiAgICogc3BlY2lmaWMgYmVoYXZpb3JzLiBUaGUgY29tbWFuZCBpcyBwcm9jZXNzZWQgYnkgdGhlIGxvY2FsIHBsYXllciBvbmx5LlxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgY29tbWFuZCBuYW1lL2lkZW50aWZpZXJcbiAgICogQHBhcmFtIGFyZyAtIFRoZSBjb21tYW5kIGFyZ3VtZW50L3BheWxvYWRcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2VuZCBhIHNpbXBsZSBjb21tYW5kXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdyZWZyZXNoJywgJycpO1xuICAgKiBcbiAgICogLy8gU2VuZCBhIGNvbW1hbmQgd2l0aCBkYXRhXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdzZXRWb2x1bWUnLCAnNTAnKTtcbiAgICogXG4gICAqIC8vIFNlbmQgYSBjb21tYW5kIHdpdGggSlNPTiBkYXRhXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdjb25maWd1cmUnLCBKU09OLnN0cmluZ2lmeSh7IHNldHRpbmc6ICd2YWx1ZScgfSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuICAgICAgY2xpZW50LnNlbmRDb21tYW5kKG5hbWUsIGFyZyk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgdG8gcmVtb3RlIHBsYXllciBkZXZpY2VzIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2Uga2V5cy5cbiAgICogXG4gICAqIFJlbW90ZSBjb21tYW5kcyBhbGxvdyBjcm9zcy1kZXZpY2UgY29tbXVuaWNhdGlvbiB3aXRoaW4gdGhlIHNhbWUgUmV2ZWwgRGlnaXRhbCBhY2NvdW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3luY2hyb25pemVkIGRpc3BsYXlzLCBkZXZpY2UgY29vcmRpbmF0aW9uLCBvciByZW1vdGUgY29udHJvbCBzY2VuYXJpb3MuXG4gICAqIFxuICAgKiBOb3RlOiBSZW1vdGUgY29tbWFuZHMgY2FuIG9ubHkgYmUgZGVsaXZlcmVkIHRvIGRldmljZXMgd2l0aGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHNlbmRlciBkZXZpY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gZGV2aWNlS2V5cyAtIEFycmF5IG9mIHRhcmdldCBkZXZpY2Uga2V5cyB0byBzZW5kIHRoZSBjb21tYW5kIHRvXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGNvbW1hbmQgbmFtZS9pZGVudGlmaWVyXG4gICAqIEBwYXJhbSBhcmcgLSBUaGUgY29tbWFuZCBhcmd1bWVudC9wYXlsb2FkXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNlbmQgY29tbWFuZCB0byBzcGVjaWZpYyBkZXZpY2VzXG4gICAqIGNvbnN0IHRhcmdldERldmljZXMgPSBbJ2RldmljZS1rZXktMScsICdkZXZpY2Uta2V5LTInXTtcbiAgICogdGhpcy5jbGllbnQuc2VuZFJlbW90ZUNvbW1hbmQodGFyZ2V0RGV2aWNlcywgJ3N5bmNBY3Rpb24nLCAnc3RhcnQnKTtcbiAgICogXG4gICAqIC8vIEJyb2FkY2FzdCB0byBtdWx0aXBsZSBkZXZpY2VzXG4gICAqIHRoaXMuY2xpZW50LnNlbmRSZW1vdGVDb21tYW5kKFxuICAgKiAgIFsnbG9iYnktZGlzcGxheScsICdraW9zay0xJywgJ2tpb3NrLTInXSwgXG4gICAqICAgJ3VwZGF0ZUNvbnRlbnQnLCBcbiAgICogICBKU09OLnN0cmluZ2lmeSh7IGNvbnRlbnRJZDogJzEyMzQ1JyB9KVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYW4gYW5hbHl0aWNzIGV2ZW50IGZvciB1c2Ugd2l0aCBBZEhhd2sgYW5hbHl0aWNzIGFuZCByZXBvcnRpbmcuXG4gICAqIFxuICAgKiBFdmVudHMgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHZhcmlvdXMgbWV0cmljcyBpbmNsdWRpbmcgdXNhZ2Ugc3RhdGlzdGljcywgXG4gICAqIHBsYXllciBjb25kaXRpb24sIHN0YXRlIGNoYW5nZXMsIHVzZXIgaW50ZXJhY3Rpb25zLCBhbmQgY3VzdG9tIGJ1c2luZXNzIG1ldHJpY3MuXG4gICAqIFRoZXNlIGV2ZW50cyBjYW4gYmUgdmlld2VkIGluIHRoZSBSZXZlbCBEaWdpdGFsIGFuYWx5dGljcyBkYXNoYm9hcmQuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVW5pcXVlIG5hbWUgZm9yIHRoaXMgZXZlbnQgKHNob3VsZCBiZSBkZXNjcmlwdGl2ZSBhbmQgY29uc2lzdGVudClcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBPcHRpb25hbCBtYXAgb2YgdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBldmVudFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW1wbGUgZXZlbnQgdHJhY2tpbmdcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnKTtcbiAgICogXG4gICAqIC8vIEV2ZW50IHdpdGggcHJvcGVydGllc1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygndXNlcl9pbnRlcmFjdGlvbicsIHtcbiAgICogICBhY3Rpb246ICdidXR0b25fY2xpY2snLFxuICAgKiAgIGJ1dHRvbl9pZDogJ3N0YXJ0X2J1dHRvbicsXG4gICAqICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICogfSk7XG4gICAqIFxuICAgKiAvLyBQZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnY29udGVudF9kaXNwbGF5ZWQnLCB7XG4gICAqICAgY29udGVudF90eXBlOiAndmlkZW8nLFxuICAgKiAgIGR1cmF0aW9uOiAzMCxcbiAgICogICBxdWFsaXR5OiAnSEQnXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IElFdmVudFByb3BlcnRpZXMpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQudHJhY2soZXZlbnROYW1lLCBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSB0aW1lZCBldmVudCBmb3IgZHVyYXRpb24gdHJhY2tpbmcuXG4gICAqIFxuICAgKiBUaW1lZCBldmVudHMgYXJlIHVzZWZ1bCBmb3IgdHJhY2tpbmcgdGhlIGR1cmF0aW9uIG9mIG9wZXJhdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHRyYWNrKCkgd2l0aCB0aGUgc2FtZSBldmVudCBuYW1lIHRvIGNvbXBsZXRlXG4gICAqIHRoZSB0aW1pbmcgbWVhc3VyZW1lbnQuIFRoZSBkdXJhdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgaW5jbHVkZWRcbiAgICogaW4gdGhlIGV2ZW50IHByb3BlcnRpZXMuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVW5pcXVlIG5hbWUgZm9yIHRoaXMgdGltZWQgZXZlbnQgKG11c3QgbWF0Y2ggdGhlIHN1YnNlcXVlbnQgdHJhY2soKSBjYWxsKVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTdGFydCB0aW1pbmcgYW4gZXZlbnRcbiAgICogdGhpcy5jbGllbnQudGltZUV2ZW50KCd2aWRlb19wbGF5YmFjaycpO1xuICAgKiBcbiAgICogLy8gLi4uIHZpZGVvIHBsYXlzIGZvciBzb21lIGR1cmF0aW9uIC4uLlxuICAgKiBcbiAgICogLy8gRW5kIHRpbWluZyBhbmQgbG9nIHRoZSBldmVudCB3aXRoIGR1cmF0aW9uXG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCd2aWRlb19wbGF5YmFjaycsIHtcbiAgICogICB2aWRlb19pZDogJ2FiYzEyMycsXG4gICAqICAgcXVhbGl0eTogJ0hEJ1xuICAgKiB9KTsgLy8gRHVyYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkXG4gICAqIFxuICAgKiAvLyBFeGFtcGxlIGZvciB1c2VyIGludGVyYWN0aW9uIHRpbWluZ1xuICAgKiB0aGlzLmNsaWVudC50aW1lRXZlbnQoJ2Zvcm1fY29tcGxldGlvbicpO1xuICAgKiAvLyAuLi4gdXNlciBmaWxscyBvdXQgZm9ybSAuLi5cbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2Zvcm1fY29tcGxldGlvbicsIHsgZm9ybV90eXBlOiAnY29udGFjdCcgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC50aW1lRXZlbnQoZXZlbnROYW1lKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYW5hbHl0aWNzIGV2ZW50IHNlc3Npb24gZm9yIGdyb3VwaW5nIHJlbGF0ZWQgZXZlbnRzLlxuICAgKiBcbiAgICogQSBzZXNzaW9uIGlzIGEgd2F5IG9mIGdyb3VwaW5nIGV2ZW50cyB0b2dldGhlciBmb3IgYW5hbHlzaXMuIEVhY2ggZXZlbnQgdHJhY2tlZFxuICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzZXNzaW9uIElEIHVudGlsIGEgbmV3IHNlc3Npb24gaXMgY3JlYXRlZC5cbiAgICogU2Vzc2lvbiBJRHMgYXJlIHJhbmRvbWx5IGdlbmVyYXRlZCB1bmxlc3MgZXhwbGljaXRseSBwcm92aWRlZC5cbiAgICogXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciB0cmFja2luZyB1c2VyIGpvdXJuZXlzLCB3b3JrZmxvdyBjb21wbGV0aW9uLCBvciBncm91cGluZ1xuICAgKiByZWxhdGVkIGludGVyYWN0aW9ucyB3aXRoaW4gYSBzcGVjaWZpYyB0aW1lIHBlcmlvZC5cbiAgICogXG4gICAqIEBwYXJhbSBpZCAtIE9wdGlvbmFsIHVzZXItc3VwcGxpZWQgc2Vzc2lvbiBJRC4gSWYgbm90IHByb3ZpZGVkLCBhIHJhbmRvbSBzZXNzaW9uIElEIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFN0YXJ0IGEgbmV3IHNlc3Npb24gd2l0aCBhdXRvLWdlbmVyYXRlZCBJRFxuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3Nlc3Npb25fc3RhcnQnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3VzZXJfYWN0aW9uXzEnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3VzZXJfYWN0aW9uXzInKTtcbiAgICogXG4gICAqIC8vIFN0YXJ0IGEgc2Vzc2lvbiB3aXRoIGN1c3RvbSBJRFxuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oJ3VzZXItd29ya2Zsb3ctMTIzNDUnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3dvcmtmbG93X3N0YXJ0Jyk7XG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCdzdGVwX2NvbXBsZXRlZCcsIHsgc3RlcDogMSB9KTtcbiAgICogXG4gICAqIC8vIFN0YXJ0IGEgbmV3IHNlc3Npb24gZm9yIGRpZmZlcmVudCB3b3JrZmxvd1xuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2RpZmZlcmVudF93b3JrZmxvd19zdGFydCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKGlkKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJvb3QgZm9sZGVyIHBhdGggdXRpbGl6ZWQgYnkgdGhpcyBwbGF5ZXIgZGV2aWNlLlxuICAgKiBcbiAgICogVGhpcyByZXR1cm5zIHRoZSBiYXNlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllclxuICAgKiBzdG9yZXMgaXRzIGZpbGVzIGFuZCByZXNvdXJjZXMgb24gdGhlIGxvY2FsIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb290UGF0aCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFJldmVsUm9vdCgpO1xuICAgKiBjb25zb2xlLmxvZygnUGxheWVyIHJvb3QgZGlyZWN0b3J5OicsIHJvb3RQYXRoKTtcbiAgICogLy8gVXNlIGZvciBjb25zdHJ1Y3RpbmcgZmlsZSBwYXRocyBvciB1bmRlcnN0YW5kaW5nIHN0b3JhZ2Ugc3RydWN0dXJlXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0UmV2ZWxSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG1hcCBvZiBjb21tYW5kcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIGRldmljZS5cbiAgICogXG4gICAqIFRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBjb21tYW5kIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIGhvdyB0aGUgZGV2aWNlXG4gICAqIHJlc3BvbmRzIHRvIHZhcmlvdXMgY29tbWFuZCB0cmlnZ2VycyBhbmQgcmVtb3RlIGNvbW1hbmRzLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYSBtYXAgb2YgY3VycmVudGx5IGFjdGl2ZSBjb21tYW5kc1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb21tYW5kTWFwID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0Q29tbWFuZE1hcCgpO1xuICAgKiBjb25zb2xlLmxvZygnQWN0aXZlIGNvbW1hbmRzOicsIGNvbW1hbmRNYXApO1xuICAgKiBcbiAgICogLy8gQ2hlY2sgaWYgc3BlY2lmaWMgY29tbWFuZCBpcyBhdmFpbGFibGVcbiAgICogaWYgKGNvbW1hbmRNYXBbJ2N1c3RvbUNvbW1hbmQnXSkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdDdXN0b20gY29tbWFuZCBpcyBhdmFpbGFibGUnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8YW55PiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgY2xpZW50LmdldENvbW1hbmRNYXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbmFscyB0byB0aGUgcGxheWVyIHRoYXQgdGhpcyBnYWRnZXQgaGFzIGNvbXBsZXRlZCBpdHMgdmlzdWFsaXphdGlvbi5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIHRoZSBwbGF5ZXIgdGhhdCB0aGUgY3VycmVudCBnYWRnZXQgaGFzIGZpbmlzaGVkIGl0c1xuICAgKiBjb250ZW50IGRpc3BsYXkgb3IgaW50ZXJhY3Rpb24gY3ljbGUuIFRoZSBwbGF5ZXIgY2FuIHRoZW4gcHJvY2VlZCB3aXRoXG4gICAqIHRoZSBuZXh0IGl0ZW0gaW4gYSBwbGF5bGlzdCBpZiBhcHBsaWNhYmxlLCBvciBoYW5kbGUgdGhlIGNvbXBsZXRpb25cbiAgICogYWNjb3JkaW5nIHRvIGl0cyBjb25maWd1cmF0aW9uLlxuICAgKiBcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdXIgZ2FkZ2V0IGhhcyBjb21wbGV0ZWQgaXRzIGludGVuZGVkIGZ1bmN0aW9uLFxuICAgKiBzdWNoIGFzIGZpbmlzaGluZyBhbiBhbmltYXRpb24sIGNvbXBsZXRpbmcgYSBmb3JtLCBvciByZWFjaGluZyBhIG5hdHVyYWxcbiAgICogc3RvcHBpbmcgcG9pbnQuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFmdGVyIGNvbXBsZXRpbmcgYW4gYW5pbWF0aW9uXG4gICAqIHByaXZhdGUgb25BbmltYXRpb25Db21wbGV0ZSgpOiB2b2lkIHtcbiAgICogICB0aGlzLmNsaWVudC5maW5pc2goKTtcbiAgICogfVxuICAgKiBcbiAgICogLy8gQWZ0ZXIgdXNlciBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBwcml2YXRlIG9uRm9ybVN1Ym1pdHRlZCgpOiB2b2lkIHtcbiAgICogICB0aGlzLnNhdmVGb3JtRGF0YSgpO1xuICAgKiAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiB9XG4gICAqIFxuICAgKiAvLyBBZnRlciBhIHRpbWVkIGRpc3BsYXkgcGVyaW9kXG4gICAqIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgKiAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiB9LCAzMDAwMCk7IC8vIDMwIHNlY29uZHNcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcblxuICAgICAgY2xpZW50LmZpbmlzaCgpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnYWRnZXQgaXMgcnVubmluZyBpbiBwcmV2aWV3IG1vZGUuXG4gICAqIFxuICAgKiBQcmV2aWV3IG1vZGUgaXMgZW5hYmxlZCB3aGVuIHRoZSBnYWRnZXQgaXMgYmVpbmcgZWRpdGVkIGluIHRoZSBSZXZlbCBEaWdpdGFsIENNUyxcbiAgICogdGVzdGVkIGluIHRoZSBnYWRnZXQgZWRpdG9yLCBvciBvdGhlcndpc2Ugbm90IHJ1bm5pbmcgaW4gYSBub3JtYWwgcGxheWVyIGVudmlyb25tZW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvdmlkaW5nIGRpZmZlcmVudCBiZWhhdmlvciBkdXJpbmcgZGV2ZWxvcG1lbnQvdGVzdGluZyB2ZXJzdXNcbiAgICogcHJvZHVjdGlvbiBkZXBsb3ltZW50LlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSBpZiBydW5uaW5nIGluIHByZXZpZXcgbW9kZSwgZmFsc2UgaWYgcnVubmluZyBvbiBhY3R1YWwgcGxheWVyXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGlzUHJldmlldyA9IGF3YWl0IHRoaXMuY2xpZW50LmlzUHJldmlld01vZGUoKTtcbiAgICogXG4gICAqIGlmIChpc1ByZXZpZXcpIHtcbiAgICogICBjb25zb2xlLmxvZygnUnVubmluZyBpbiBwcmV2aWV3IG1vZGUgLSB1c2luZyBtb2NrIGRhdGEnKTtcbiAgICogICB0aGlzLmxvYWRNb2NrRGF0YSgpO1xuICAgKiB9IGVsc2Uge1xuICAgKiAgIGNvbnNvbGUubG9nKCdSdW5uaW5nIG9uIHBsYXllciBkZXZpY2UgLSB1c2luZyBsaXZlIGRhdGEnKTtcbiAgICogICB0aGlzLmxvYWRMaXZlRGF0YSgpO1xuICAgKiB9XG4gICAqIFxuICAgKiAvLyBTaG93IGRpZmZlcmVudCBVSSBpbiBwcmV2aWV3XG4gICAqIHRoaXMuc2hvd1ByZXZpZXdJbmRpY2F0b3IgPSBpc1ByZXZpZXc7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlzUHJldmlld01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIE5vb3BDbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHJ1bm5pbmcgdGhlIHBsYXllci5cbiAgICogXG4gICAqIFJldHVybnMgY29tcHJlaGVuc2l2ZSBkZXZpY2UgZGV0YWlscyBpbmNsdWRpbmcgbmFtZSwgcmVnaXN0cmF0aW9uIGtleSwgdHlwZSxcbiAgICogc2VydmljZSBkYXRlLCBsYW5ndWFnZSwgdGltZXpvbmUsIHRhZ3MsIGFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhXG4gICAqIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIFJldmVsIERpZ2l0YWwgQ01TIGZvciBlYWNoIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldmljZSBkZXRhaWxzIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZSgpO1xuICAgKiBcbiAgICogaWYgKGRldmljZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdEZXZpY2UgbmFtZTonLCBkZXZpY2UubmFtZSk7XG4gICAqICAgY29uc29sZS5sb2coJ0RldmljZSB0eXBlOicsIGRldmljZS5kZXZpY2VUeXBlKTtcbiAgICogICBjb25zb2xlLmxvZygnTG9jYXRpb246JywgZGV2aWNlLmxvY2F0aW9uLmNpdHksIGRldmljZS5sb2NhdGlvbi5zdGF0ZSk7XG4gICAqICAgY29uc29sZS5sb2coJ1RhZ3M6JywgZGV2aWNlLnRhZ3MpO1xuICAgKiAgIFxuICAgKiAgIC8vIFVzZSBkZXZpY2UgaW5mbyBmb3IgY3VzdG9taXphdGlvblxuICAgKiAgIGlmIChkZXZpY2UubG9jYXRpb24uY291bnRyeSA9PT0gJ1VTJykge1xuICAgKiAgICAgdGhpcy5sb2FkVVNDb250ZW50KCk7XG4gICAqICAgfVxuICAgKiAgIFxuICAgKiAgIC8vIENoZWNrIGRldmljZSBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdHlwZVxuICAgKiAgIGlmIChkZXZpY2UuZGV2aWNlVHlwZSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAqICAgICB0aGlzLmVuYWJsZVRvdWNoRmVhdHVyZXMoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8SURldmljZSB8IG51bGw+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICBjb25zdCBvYmo6IGFueSA9IEpTT04ucGFyc2UoPHN0cmluZz5hd2FpdCBjbGllbnQuZ2V0RGV2aWNlKCkpO1xuXG4gICAgY29uc3QgZGV2aWNlOiBJRGV2aWNlW10gPSBbb2JqXS5tYXAoKGRldmljZTogYW55KSA9PiB7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRldmljZS5uYW1lLFxuICAgICAgICByZWdpc3RyYXRpb25LZXk6IGRldmljZS5rZXksXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS5kZXZpY2V0eXBlLFxuICAgICAgICBlbnRlcmVkU2VydmljZTogbmV3IERhdGUoZGV2aWNlLmVudGVyZWRzZXJ2aWNlKSxcbiAgICAgICAgbGFuZ0NvZGU6IGRldmljZS5sYW5nY29kZSxcbiAgICAgICAgdGltZVpvbmU6IGRldmljZS50aW1lem9uZSxcbiAgICAgICAgdGFnczogZGV2aWNlLmRlc2NyaXB0aW9uPy5zcGxpdCgnXFxuJyksXG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgY2l0eTogZGV2aWNlLmxvY2F0aW9uPy5jaXR5LFxuICAgICAgICAgIHN0YXRlOiBkZXZpY2UubG9jYXRpb24/LnN0YXRlLFxuICAgICAgICAgIGNvdW50cnk6IGRldmljZS5sb2NhdGlvbj8uY291bnRyeSxcbiAgICAgICAgICBwb3N0YWxDb2RlOiBkZXZpY2UubG9jYXRpb24/LnBvc3RhbGNvZGUsXG4gICAgICAgICAgYWRkcmVzczogZGV2aWNlLmxvY2F0aW9uPy5hZGRyZXNzLFxuICAgICAgICAgIGxhdGl0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxhdGl0dWRlLFxuICAgICAgICAgIGxvbmdpdHVkZTogZGV2aWNlLmxvY2F0aW9uPy5sb25naXR1ZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZXZpY2VbMF07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIHZpc3VhbGl6YXRpb24gYXJlYSBpbiBwaXhlbHMuXG4gICAqIFxuICAgKiBUaGlzIHJldHVybnMgdGhlIGF2YWlsYWJsZSB3aWR0aCBmb3IgY29udGVudCBkaXNwbGF5LCB3aGljaCBtYXkgYmVcbiAgICogZGlmZmVyZW50IGZyb20gdGhlIGZ1bGwgc2NyZWVuIHdpZHRoIGRlcGVuZGluZyBvbiBwbGF5ZXIgY29uZmlndXJhdGlvblxuICAgKiBhbmQgdGVtcGxhdGUgbGF5b3V0LlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gd2lkdGggaW4gcGl4ZWxzLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgd2lkdGggPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRXaWR0aCgpO1xuICAgKiBcbiAgICogaWYgKHdpZHRoKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSB3aWR0aDonLCB3aWR0aCwgJ3BpeGVscycpO1xuICAgKiAgIFxuICAgKiAgIC8vIEFkYXB0IGNvbnRlbnQgbGF5b3V0IGJhc2VkIG9uIHdpZHRoXG4gICAqICAgaWYgKHdpZHRoIDwgODAwKSB7XG4gICAqICAgICB0aGlzLmVuYWJsZU1vYmlsZUxheW91dCgpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICB0aGlzLmVuYWJsZURlc2t0b3BMYXlvdXQoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0V2lkdGgoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRXaWR0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgdmlzdWFsaXphdGlvbiBhcmVhIGluIHBpeGVscy5cbiAgICogXG4gICAqIFRoaXMgcmV0dXJucyB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgY29udGVudCBkaXNwbGF5LCB3aGljaCBtYXkgYmVcbiAgICogZGlmZmVyZW50IGZyb20gdGhlIGZ1bGwgc2NyZWVuIGhlaWdodCBkZXBlbmRpbmcgb24gcGxheWVyIGNvbmZpZ3VyYXRpb25cbiAgICogYW5kIHRlbXBsYXRlIGxheW91dC5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlaWdodCBpbiBwaXhlbHMsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoZWlnaHQgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRIZWlnaHQoKTtcbiAgICogXG4gICAqIGlmIChoZWlnaHQpIHtcbiAgICogICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIGhlaWdodDonLCBoZWlnaHQsICdwaXhlbHMnKTtcbiAgICogICBcbiAgICogICAvLyBDYWxjdWxhdGUgYXNwZWN0IHJhdGlvIGZvciByZXNwb25zaXZlIGRlc2lnblxuICAgKiAgIGNvbnN0IHdpZHRoID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0V2lkdGgoKTtcbiAgICogICBjb25zdCBhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgKiAgIHRoaXMuYWRqdXN0Q29udGVudEZvckFzcGVjdFJhdGlvKGFzcGVjdFJhdGlvKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRIZWlnaHQoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRIZWlnaHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudCBpdGVtLlxuICAgKiBcbiAgICogVGhpcyBtZXRob2QgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGdhZGdldCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwbGF5bGlzdFxuICAgKiBhbmQgcmV0dXJucyB0aGUgZHVyYXRpb24gYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgcGxheWxpc3QgaXRlbS4gVGhlIGR1cmF0aW9uXG4gICAqIGRldGVybWluZXMgaG93IGxvbmcgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIGRpc3BsYXllZCBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IGl0ZW0uXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIG51bGwgaWYgbm90IGFwcGxpY2FibGUvYXZhaWxhYmxlXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RHVyYXRpb24oKTtcbiAgICogXG4gICAqIGlmIChkdXJhdGlvbikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdDb250ZW50IGR1cmF0aW9uOicsIGR1cmF0aW9uLCAnbWlsbGlzZWNvbmRzJyk7XG4gICAqICAgXG4gICAqICAgLy8gU2V0IHVwIGF1dG8tZmluaXNoIHRpbWVyXG4gICAqICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAqICAgICB0aGlzLmNsaWVudC5maW5pc2goKTtcbiAgICogICB9LCBkdXJhdGlvbik7XG4gICAqICAgXG4gICAqICAgLy8gU2hvdyBwcm9ncmVzcyBpbmRpY2F0b3JcbiAgICogICB0aGlzLnN0YXJ0UHJvZ3Jlc3NJbmRpY2F0b3IoZHVyYXRpb24pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RHVyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJldmVsIERpZ2l0YWwgU0RLLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIFNESyB2ZXJzaW9uIHN0cmluZ1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U2RrVmVyc2lvbigpO1xuICAgKiBjb25zb2xlLmxvZygnU0RLIFZlcnNpb246JywgdmVyc2lvbik7XG4gICAqIFxuICAgKiAvLyBVc2UgZm9yIGNvbXBhdGliaWxpdHkgY2hlY2tzIG9yIGxvZ2dpbmdcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnLCB7IHNka1ZlcnNpb246IHZlcnNpb24gfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNka1ZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBjb25maWd1cmF0aW9uIHByZWZlcmVuY2VzIHRvIHRoZSBnYWRnZXQgKHByZXZpZXcgbW9kZSBvbmx5KS5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gcnVubmluZyBpbiBwcmV2aWV3IG1vZGUgKHR5cGljYWxseSBkdXJpbmdcbiAgICogZ2FkZ2V0IGRldmVsb3BtZW50IG9yIHRlc3RpbmcgaW4gdGhlIENNUykuIEl0IGFsbG93cyBhcHBseWluZyBjb25maWd1cmF0aW9uXG4gICAqIGNoYW5nZXMgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20gdGhlIGdhZGdldCdzIHByZWZlcmVuY2Ugc2V0dGluZ3MuXG4gICAqIFxuICAgKiBAcGFyYW0gcHJlZnMgLSBEaWN0aW9uYXJ5IG9mIHByZWZlcmVuY2Uga2V5LXZhbHVlIHBhaXJzIHRvIGFwcGx5XG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChhd2FpdCB0aGlzLmNsaWVudC5pc1ByZXZpZXdNb2RlKCkpIHtcbiAgICogICAvLyBBcHBseSB0ZXN0IGNvbmZpZ3VyYXRpb24gaW4gcHJldmlld1xuICAgKiAgIGF3YWl0IHRoaXMuY2xpZW50LmFwcGx5Q29uZmlnKHtcbiAgICogICAgICd0aXRsZSc6ICdUZXN0IFRpdGxlJyxcbiAgICogICAgICdiYWNrZ3JvdW5kQ29sb3InOiAnI2ZmMDAwMCcsXG4gICAqICAgICAnc2hvd0JvcmRlcic6IHRydWUsXG4gICAqICAgICAncmVmcmVzaEludGVydmFsJzogMzBcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhcHBseUNvbmZpZyhwcmVmczogSURpY3Rpb25hcnk8YW55Pikge1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNQcmV2aWV3TW9kZSgpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuICAgICAgY2xpZW50LmFwcGx5Q29uZmlnKHByZWZzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICclY2FwcGx5Q29uZmlnKCkgaXMgb25seSBhdmFpbGFibGUgaW4gcHJldmlldyBtb2RlLicsXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHlwZWQgd3JhcHBlciBmb3IgYSBSZXZlbCBEaWdpdGFsIGRhdGEgdGFibGUuXG4gICAqXG4gICAqIFRoZSBkYXRhIHRhYmxlIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGZvciB0aGUgZ2FkZ2V0LiBUaGUgcmV0dXJuZWRcbiAgICoge0BsaW5rIERhdGFUYWJsZVJlZn0gcHJvdmlkZXMgdHlwZWQgUHJvbWlzZS1iYXNlZCBtZXRob2RzIGFuZCBSeEpTXG4gICAqIE9ic2VydmFibGVzIGZvciByZWFsLXRpbWUgcm93IGNoYW5nZSBldmVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZUlkIC0gVGhlIGRhdGEgdGFibGUgSUQgKGUuZy4gJ3RibF9tZW51X2l0ZW1zJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJucyBBIHtAbGluayBEYXRhVGFibGVSZWZ9IGluc3RhbmNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZHQgPSB0aGlzLmNsaWVudC5jcmVhdGVEYXRhVGFibGUoJ3RibF9tZW51X2l0ZW1zJyk7XG4gICAqXG4gICAqIC8vIEZldGNoIHJvd3Mgd2l0aCBmaWx0ZXJpbmcgYW5kIHNvcnRpbmdcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZHQuZ2V0Um93cyh7XG4gICAqICAgZmlsdGVyOiB7IGNhdGVnb3J5OiAnRW50cmVlJywgcHJpY2U6IHsgb3A6ICdsdGUnLCB2YWx1ZTogMjUgfSB9LFxuICAgKiAgIHNvcnQ6ICdwcmljZScsXG4gICAqICAgc29ydERpcjogJ2FzYydcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFN1YnNjcmliZSB0byByZWFsLXRpbWUgdXBkYXRlc1xuICAgKiBkdC5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKCdSb3cgdXBkYXRlZDonLCBjaGFuZ2UpKTtcbiAgICogZHQucm93Q3JlYXRlZCQuc3Vic2NyaWJlKGNoYW5nZSA9PiBjb25zb2xlLmxvZygnUm93IGNyZWF0ZWQ6JywgY2hhbmdlKSk7XG4gICAqIGR0LnJvd0RlbGV0ZWQkLnN1YnNjcmliZShjaGFuZ2UgPT4gY29uc29sZS5sb2coJ1JvdyBkZWxldGVkOicsIGNoYW5nZSkpO1xuICAgKlxuICAgKiAvLyBDbGVhbnVwIHdoZW4gZG9uZVxuICAgKiBkdC5kaXNwb3NlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZURhdGFUYWJsZSh0YWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBJRGF0YVRhYmxlT3B0aW9ucyk6IERhdGFUYWJsZVJlZiB7XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWYodGFibGVJZCwgb3B0aW9ucyk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHR5cGVkIGRhdGEgdGFibGUgd3JhcHBlciBmcm9tIGEgZ2FkZ2V0IHByZWZlcmVuY2UgdmFsdWUuXG4gICAqXG4gICAqIFRoZSBwcmVmZXJlbmNlIEpTT04gc3RyaW5nIChhcyBzZXJpYWxpemVkIGJ5IHRoZSB0ZW1wbGF0ZSBlZGl0b3IncyBkYXRhdGFibGVcbiAgICogb3B0aW9uKSBpcyBwYXJzZWQgYW5kIHVzZWQgdG8gYXV0by1jb25maWd1cmUgZmlsdGVyLCBzb3J0LCBhbmQgbG9naWMgc2V0dGluZ3MuXG4gICAqIFRoZSByZXR1cm5lZCB7QGxpbmsgRGF0YVRhYmxlUHJlZlJlZn0gcHJvdmlkZXMgYSBgZ2V0RmlsdGVyZWRSb3dzKClgIGNvbnZlbmllbmNlXG4gICAqIG1ldGhvZCB0aGF0IGFwcGxpZXMgdGhlc2Ugc2V0dGluZ3MgYXV0b21hdGljYWxseS5cbiAgICpcbiAgICogQHBhcmFtIHByZWZWYWx1ZSAtIFRoZSByYXcgZ2FkZ2V0IHByZWZlcmVuY2Ugc3RyaW5nIChKU09OKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERhdGFUYWJsZVByZWZSZWZ9IGluc3RhbmNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgY2ZnID0gdGhpcy5jbGllbnQuY3JlYXRlRGF0YVRhYmxlRnJvbVByZWYocHJlZnMuZ2V0U3RyaW5nKCdyZERhdGFUYWJsZScpKTtcbiAgICpcbiAgICogLy8gRmV0Y2ggcm93cyB3aXRoIGF1dG8td2lyZWQgZmlsdGVyICsgc29ydFxuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBjZmcuZ2V0RmlsdGVyZWRSb3dzKCk7XG4gICAqXG4gICAqIC8vIEFjY2VzcyB0aGUgdW5kZXJseWluZyBEYXRhVGFibGVSZWYgZm9yIGV2ZW50cywgc2NoZW1hLCBldGMuXG4gICAqIGNmZy5kYXRhVGFibGUucm93VXBkYXRlZCQuc3Vic2NyaWJlKGNoYW5nZSA9PiBjb25zb2xlLmxvZyhjaGFuZ2UpKTtcbiAgICpcbiAgICogLy8gQ2xlYW51cCB3aGVuIGRvbmVcbiAgICogY2ZnLmRpc3Bvc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGF0YVRhYmxlRnJvbVByZWYocHJlZlZhbHVlOiBzdHJpbmcsIG9wdGlvbnM/OiBJRGF0YVRhYmxlT3B0aW9ucyk6IERhdGFUYWJsZVByZWZSZWYge1xuICAgIHJldHVybiBuZXcgRGF0YVRhYmxlUHJlZlJlZihwcmVmVmFsdWUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gLS0tXG4gIC8vIFBSSVZBVEUgTUVUSE9EUy5cbiAgLy8gLS0tXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFByb21pc2U8SUNsaWVudD4ge1xuXG4gICAgaWYgKHRoaXMuY2xpZW50UHJvbWlzZSkge1xuXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XG4gICAgfVxuXG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5DbGllbnQpIHtcblxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKHdpbmRvdyBhcyBhbnkpLkNsaWVudCkpO1xuICAgIH1cblxuICAgIC8vIEEgXCJjb21wbGV0ZVwiIHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCB0aGUgXCJsb2FkXCIgZXZlbnQgaGFzIGJlZW4gZmlyZWQgb24gdGhlXG4gICAgLy8gd2luZG93OyBhbmQsIHRoYXQgYWxsIHN1Yi1yZXNvdXJjZXMgc3VjaCBhcyBTY3JpcHRzLCBJbWFnZXMsIGFuZCBGcmFtZXMgaGF2ZVxuICAgIC8vIGJlZW4gbG9hZGVkLlxuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB7XG5cbiAgICAgIC8vIElmIHRoaXMgZXZlbnQgaGFzIGZpcmVkIEFORCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBpc24ndCBhdmFpbGFibGUgKHNlZSBJRi1cbiAgICAgIC8vIGNvbmRpdGlvbiBCRUZPUkUgdGhpcyBvbmUpLCBpdCBtZWFucyB0aGF0IHRoZSAzcmQtcGFydHkgc2NyaXB0IGVpdGhlclxuICAgICAgLy8gZmFpbGVkIG9uIHRoZSBuZXR3b3JrIG9yIHdhcyBCTE9DS0VEIGJ5IGFuIGFkLWJsb2NrZXIuIEFzIHN1Y2gsIHdlIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwtYmFjayB0byB1c2luZyBhIG1vY2sgQVBJLlxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobmV3IE5vb3BDbGllbnQoKSkpO1xuICAgIH1cblxuICAgIC8vIEFTU0VSVDogSWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgdGhlIGRvY3VtZW50IGhhcyBub3QgY29tcGxldGVkIGxvYWRpbmcgKGJ1dCBpdFxuICAgIC8vIG1heSBiZSBpbiBhbiBcImludGVyYWN0aXZlXCIgc3RhdGUgd2hpY2ggaXMgd2hlbiBJIGJlbGlldmUgdGhhdCB0aGUgQW5ndWxhciBhcHBcbiAgICAvLyBnZXRzIGJvb3RzdHJhcHBlZCkuIEFzIHN1Y2gsIHdlIG5lZWQgYmluZCB0byB0aGUgTE9BRCBldmVudCB0byB3YWl0IGZvciBvdXJcbiAgICAvLyB0aGlyZC1wYXJ0eSBzY3JpcHRzIHRvIGxvYWQgKG9yIGZhaWwgdG8gbG9hZCwgb3IgYmUgYmxvY2tlZCkuXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbmV3IFByb21pc2U8SUNsaWVudD4oXG4gICAgICAocmVzb2x2ZSkgPT4ge1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibG9hZFwiLFxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0xvYWQoKSB7XG5cbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSAzcmQtcGFydHkgbGlicmFyeSBpcyBlaXRoZXIgYXZhaWxhYmxlIG9yXG4gICAgICAgICAgICAvLyBpdCdzIG5vdCAtIHRoZXJlJ3Mgbm8gZnVydGhlciBsb2FkaW5nIHRvIGRvLiBJZiBpdCdzIG5vdFxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiB0aGUgZ2xvYmFsIHNjb3BlLCB3ZSdyZSBnb2luZyB0byBmYWxsLWJhY2sgdG8gdXNpbmdcbiAgICAgICAgICAgIC8vIGEgbW9jayBBUEkuXG4gICAgICAgICAgICByZXNvbHZlKCh3aW5kb3cgYXMgYW55KS5DbGllbnQgfHwgbmV3IE5vb3BDbGllbnQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcbiAgfVxufVxuXG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNsaWVudCBpbnRlcmZhY2UuXG4gKiBcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBuby1vcGVyYXRpb24gKE5PT1ApIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgQVBJXG4gKiB0aGF0IGFsbG93cyBjb25zdW1pbmcgY29kZSB0byBmdW5jdGlvbiBub3JtYWxseSBldmVuIHdoZW4gdGhlIGFjdHVhbCBwbGF5ZXJcbiAqIEFQSSBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIHR5cGljYWxseSBvY2N1cnMgZHVyaW5nIGRldmVsb3BtZW50LCB0ZXN0aW5nLFxuICogb3Igd2hlbiB0aGUgcGxheWVyIHNjcmlwdCBpcyBibG9ja2VkIGJ5IGFkLWJsb2NrZXJzLlxuICogXG4gKiBBbGwgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGVpdGhlciByZXR1cm4gbnVsbC9lbXB0eSB2YWx1ZXMgb3IgcGVyZm9ybSBub1xuICogb3BlcmF0aW9ucywgYWxsb3dpbmcgZ2FkZ2V0cyB0byBmdW5jdGlvbiB3aXRob3V0IGVycm9ycyB3aGlsZSBwcm92aWRpbmdcbiAqIGFwcHJvcHJpYXRlIGZhbGxiYWNrIGJlaGF2aW9yLlxuICogXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBOb29wQ2xpZW50IGltcGxlbWVudHMgSUNsaWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICclY0NsaWVudCBBUEkgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIG1vY2sgQVBJJyxcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lSUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxuICB9XG5cbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgne30nKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2UoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFdpZHRoKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRIZWlnaHQoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTZGtWZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZlcnNpb24pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5Q29uZmlnKHByZWZzOiBJRGljdGlvbmFyeTxhbnk+KTogdm9pZCB7XG5cbiAgICBjb25zdCBldnQgPSB7IHR5cGU6ICdhcHBseUNvbmZpZycsIHByZWZzOiBwcmVmcywgaXNPcGVuZXI6IHdpbmRvdy5vcGVuZXIgIT09IG51bGwgfTtcblxuICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XG4gICAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShldnQpLFxuICAgICAgICAnKidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGV2dCksXG4gICAgICAgICcqJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
992
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPekQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBY3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQXFLOUIsY0FBYztJQUNkLFlBQVksSUFBWTtRQS9KeEI7Ozs7Ozs7Ozs7O1dBV0c7UUFDSSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztRQUU1Qzs7Ozs7Ozs7Ozs7O1dBWUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0M7Ozs7Ozs7Ozs7V0FVRztRQUNJLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhDOzs7Ozs7Ozs7OztXQVdHO1FBQ0ksWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0I7Ozs7Ozs7OztXQVNHO1FBQ0ksY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFakM7Ozs7Ozs7Ozs7V0FVRztRQUNJLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVV0QyxjQUFjO1FBQ04sZ0JBQVcsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUMsSUFBSSxDQUNoRSxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUNuQixDQUFDO1FBR0YsY0FBYztRQUNOLGVBQVUsR0FBRyxTQUFTLENBQUMsTUFBTSxFQUFFLG1CQUFtQixDQUFDLENBQUMsSUFBSSxDQUM5RCxLQUFLLEVBQUUsRUFDUCxHQUFHLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUNsQixDQUFDO1FBR0YsY0FBYztRQUNOLGtCQUFhLEdBQUcsU0FBUyxDQUFXLE1BQU0sRUFBRSxzQkFBc0IsQ0FBQyxDQUFDLElBQUksQ0FDOUUsR0FBRyxDQUFDLENBQUMsQ0FBTSxFQUFFLEVBQUUsR0FBRyxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBYyxDQUFBLENBQUMsQ0FBQyxDQUFDLEVBQ2xGLEtBQUssRUFBRSxFQUNQLEdBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQ3JCLENBQUM7UUE0Qk0sc0JBQWlCLEdBQUcsU0FBUyxDQUFDLE1BQU0sRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQzNELE1BQU0sQ0FBQyxDQUFDLFlBQTBCLEVBQUUsRUFBRTtRQUNwQywwQ0FBMEM7UUFDMUMsT0FBTyxZQUFZLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxFQUN4QyxHQUFHLENBQUMsQ0FBQyxDQUFNLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ25DLEtBQUssRUFBRSxFQUNQLEdBQUcsQ0FBQyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQ2IsSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLGFBQWEsSUFBSSxDQUFDLENBQUMsUUFBUSxFQUFFLENBQUM7Z0JBQzNDLENBQUMsQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO2dCQUNuQiwwREFBMEQ7Z0JBQzFELE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUNqQixHQUFHLENBQ0osQ0FBQztZQUNKLENBQUM7aUJBQU0sSUFBSSxDQUFDLENBQUMsSUFBSSxLQUFLLFlBQVksRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDdEMsQ0FBQztRQU1BLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBRWhCLE1BQWMsQ0FBQyxZQUFZLEdBQUc7WUFDN0IsVUFBVSxFQUFFO2dCQUNWLFNBQVMsRUFBRSxDQUFDLElBQVksRUFBRSxHQUFXLEVBQUUsRUFBRTtvQkFDdkMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO29CQUNqRCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELE9BQU8sRUFBRSxHQUFHLEVBQUU7b0JBQ1osSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUU7d0JBQ1osSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQzNCLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsTUFBTSxFQUFFLEdBQUcsRUFBRTtvQkFDWCxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRTt3QkFDWixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDMUIsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQzthQUNGO1NBQ0YsQ0FBQTtRQUVELElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUN0RCxJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQzVELDREQUE0RDtRQUM1RCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVwRSxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksQ0FBQztRQUUxQixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYztJQUNkLFdBQVc7UUFFVCxJQUFJLENBQUMsVUFBVSxFQUFFLFdBQVcsRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxTQUFTLEVBQUUsV0FBVyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFlBQVksRUFBRSxXQUFXLEVBQUUsQ0FBQztRQUNqQyxrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLFdBQVcsRUFBRSxDQUFDO1FBRXJDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFRCxjQUFjO0lBQ1AsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFTO1FBRTFCLE9BQU8sQ0FBQyxHQUFHLENBQ1QsZ0RBQWdELEVBQ2hELHNDQUFzQyxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7O09BZ0JHO0lBQ0ksUUFBUSxDQUFDLEdBQUcsSUFBVztRQUU1QixJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFFL0IsUUFBUSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQ3BCLEtBQUssQ0FBQztvQkFDSixNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ2xCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU07Z0JBQ1IsS0FBSyxDQUFDO29CQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7b0JBQ3pCLE1BQU07WUFDVixDQUFDO1FBQ0gsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSSxRQUFRO1FBRWIsT0FBTyxJQUFJLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQW1CRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBVztRQUVwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxJQUFJLElBQUksS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUN2QixPQUFPLE1BQU0sQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDcEMsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ2hDLENBQUM7SUFFRDs7Ozs7Ozs7O09BU0c7SUFDSSxLQUFLLENBQUMscUJBQXFCO1FBRWhDLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRDLE9BQU8sTUFBTSxDQUFDLHFCQUFxQixFQUFFLENBQUM7SUFDeEMsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNJLEtBQUssQ0FBQyxtQkFBbUI7UUFFOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0ksS0FBSyxDQUFDLHVCQUF1QjtRQUVsQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQyx1QkFBdUIsRUFBRSxDQUFDO0lBQzFDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7T0FXRztJQUNJLEtBQUssQ0FBQyxlQUFlO1FBRTFCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRDLE9BQU8sTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7O09BWUc7SUFDSSxLQUFLLENBQUMsWUFBWTtRQUV2QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztJQUMvQixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FtQkc7SUFDSSxXQUFXLENBQUMsSUFBWSxFQUFFLEdBQVc7UUFFMUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQy9CLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ2hDLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3Qkc7SUFDSSxpQkFBaUIsQ0FBQyxVQUFvQixFQUFFLElBQVksRUFBRSxHQUFXO1FBRXRFLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvQixNQUFNLENBQUMsaUJBQWlCLENBQUMsVUFBVSxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsQ0FBQztRQUNsRCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNJLEtBQUssQ0FBQyxTQUFpQixFQUFFLFVBQTZCO1FBRTNELElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvQixNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7UUFDdEQsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTJCRztJQUNJLFNBQVMsQ0FBQyxTQUFpQjtRQUVoQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDL0IsTUFBTSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUM5QixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQTRCRztJQUNJLGVBQWUsQ0FBQyxFQUFXO1FBRWhDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUUsRUFBRTtZQUMvQixJQUFJLEVBQUUsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDckIsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQzNCLENBQUM7aUJBQU0sQ0FBQztnQkFDTixNQUFNLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdCLENBQUM7UUFDSCxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7OztPQWFHO0lBQ0ksS0FBSyxDQUFDLFlBQVk7UUFFdkIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDL0IsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7OztPQWlCRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBRXhCLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQyxDQUFDO0lBQ2xELENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2Qkc7SUFDSSxNQUFNO1FBRVgsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBRS9CLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNsQixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09Bd0JHO0lBQ0ksS0FBSyxDQUFDLGFBQWE7UUFFeEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLFlBQVksVUFBVSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E2Qkc7SUFDSSxLQUFLLENBQUMsU0FBUztRQUVwQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxNQUFNLEdBQUcsR0FBUSxJQUFJLENBQUMsS0FBSyxDQUFTLE1BQU0sTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUM7UUFFOUQsTUFBTSxNQUFNLEdBQWMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFXLEVBQUUsRUFBRTtZQUVsRCxPQUFPO2dCQUNMLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxHQUFHO2dCQUMzQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVU7Z0JBQzdCLGNBQWMsRUFBRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxDQUFDO2dCQUMvQyxRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLElBQUksQ0FBQztnQkFDckMsUUFBUSxFQUFFO29CQUNSLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUk7b0JBQzNCLEtBQUssRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLEtBQUs7b0JBQzdCLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU87b0JBQ2pDLFVBQVUsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFVBQVU7b0JBQ3ZDLE9BQU8sRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLE9BQU87b0JBQ2pDLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFFBQVE7b0JBQ25DLFNBQVMsRUFBRSxNQUFNLENBQUMsUUFBUSxFQUFFLFNBQVM7aUJBQ3RDO2FBQ0YsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFDO1FBQ0gsT0FBTyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDbkIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQXVCRztJQUNJLEtBQUssQ0FBQyxRQUFRO1FBRW5CLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1FBRXRDLE9BQU8sTUFBTSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BcUJHO0lBQ0ksS0FBSyxDQUFDLFNBQVM7UUFFcEIsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7UUFFdEMsT0FBTyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0F3Qkc7SUFDSSxLQUFLLENBQUMsV0FBVztRQUV0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUV0QyxPQUFPLE1BQU0sQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksS0FBSyxDQUFDLGFBQWE7UUFFeEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0FvQkc7SUFDSSxLQUFLLENBQUMsV0FBVyxDQUFDLEtBQXVCO1FBRTlDLElBQUksTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQztZQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztZQUN0QyxNQUFNLENBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzVCLENBQUM7YUFBTSxDQUFDO1lBQ04sT0FBTyxDQUFDLEdBQUcsQ0FDVCxvREFBb0QsRUFDcEQsc0NBQXNDLENBQ3ZDLENBQUM7UUFDSixDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7T0E4Qkc7SUFDSSxlQUFlLENBQUMsT0FBZSxFQUFFLE9BQTJCO1FBQ2pFLE9BQU8sSUFBSSxZQUFZLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O09BeUJHO0lBQ0ksdUJBQXVCLENBQUMsU0FBaUIsRUFBRSxPQUEyQjtRQUMzRSxPQUFPLElBQUksZ0JBQWdCLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVELE1BQU07SUFDTixtQkFBbUI7SUFDbkIsTUFBTTtJQUNOLGNBQWM7SUFDTixTQUFTO1FBRWYsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFFdkIsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUM5QixDQUFDO1FBRUQsSUFBSyxNQUFjLENBQUMsTUFBTSxFQUFFLENBQUM7WUFFM0IsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBRSxNQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN4RSxDQUFDO1FBRUQsNEVBQTRFO1FBQzVFLCtFQUErRTtRQUMvRSxlQUFlO1FBQ2YsSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLEVBQUUsQ0FBQztZQUU5Qyw0RUFBNEU7WUFDNUUsd0VBQXdFO1lBQ3hFLDZFQUE2RTtZQUM3RSxpQ0FBaUM7WUFDakMsT0FBTyxDQUFDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUNsRSxDQUFDO1FBRUQsaUZBQWlGO1FBQ2pGLGdGQUFnRjtRQUNoRiw4RUFBOEU7UUFDOUUsZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxPQUFPLENBQzlCLENBQUMsT0FBTyxFQUFFLEVBQUU7WUFFVixNQUFNLENBQUMsZ0JBQWdCLENBQ3JCLE1BQU0sRUFDTixTQUFTLGdCQUFnQjtnQkFFdkIsOERBQThEO2dCQUM5RCwyREFBMkQ7Z0JBQzNELGlFQUFpRTtnQkFDakUsY0FBYztnQkFDZCxPQUFPLENBQUUsTUFBYyxDQUFDLE1BQU0sSUFBSSxJQUFJLFVBQVUsRUFBRSxDQUFDLENBQUM7WUFDdEQsQ0FBQyxDQUNGLENBQUM7UUFFSixDQUFDLENBQ0YsQ0FBQztRQUVGLE9BQU8sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7SUFDOUIsQ0FBQzsrR0F6L0JVLG1CQUFtQjttSEFBbkIsbUJBQW1CLGNBRmxCLE1BQU07OzRGQUVQLG1CQUFtQjtrQkFIL0IsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkI7O0FBKy9CRCx5RkFBeUY7QUFDekYseUZBQXlGO0FBRXpGOzs7Ozs7Ozs7Ozs7O0dBYUc7QUFDSCxNQUFNLFVBQVU7SUFFZDtRQUVFLE9BQU8sQ0FBQyxHQUFHLENBQ1Qsc0RBQXNELEVBQ3RELHNDQUFzQyxDQUN2QyxDQUFDO0lBQ0osQ0FBQztJQUVNLFFBQVEsQ0FBQyxHQUFHLElBQVc7UUFFNUIsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxhQUFhLENBQUMsSUFBVztRQUU5QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO0lBQ25ELENBQUM7SUFFTSxLQUFLLENBQUMscUJBQXFCO1FBRWhDLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLG1CQUFtQjtRQUU5QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyx1QkFBdUI7UUFFbEMsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsZUFBZTtRQUUxQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxZQUFZO1FBRXZCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sV0FBVyxDQUFDLElBQVksRUFBRSxHQUFXO1FBRTFDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0saUJBQWlCLENBQUMsVUFBb0IsRUFBRSxJQUFZLEVBQUUsR0FBVztRQUV0RSxvQ0FBb0M7SUFDdEMsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFpQixFQUFFLFVBQW1CO1FBRWpELG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sU0FBUyxDQUFDLFNBQWlCO1FBRWhDLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sZUFBZSxDQUFDLEVBQVc7UUFFaEMsb0NBQW9DO0lBQ3RDLENBQUM7SUFFTSxLQUFLLENBQUMsWUFBWTtRQUV2QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxhQUFhO1FBRXhCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sTUFBTTtRQUVYLG9DQUFvQztJQUN0QyxDQUFDO0lBRU0sS0FBSyxDQUFDLFNBQVM7UUFFcEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUVuQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBRXBCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFFdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUF1QjtRQUV4QyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVwRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFDbkIsR0FBRyxDQUNKLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixHQUFHLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2FkZ2V0cyB9IGZyb20gJ0ByZXZlbGRpZ2l0YWwvZ2FkZ2V0LXR5cGVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSUNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDb21tYW5kIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbW1hbmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURhdGFUYWJsZU9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvZGF0YXRhYmxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGV2aWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RldmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUV2ZW50UHJvcGVydGllcyB9IGZyb20gJy4vaW50ZXJmYWNlcy9ldmVudC1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWYsIERhdGFUYWJsZVByZWZSZWYgfSBmcm9tICcuL2RhdGF0YWJsZS1yZWYnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbi8vaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcyc7XG5cbi8vIFNvIHRoYXQgVHlwZVNjcmlwdCBkb2Vzbid0IGNvbXBsYWluLCB3ZSdyZSBnb2luZyB0byBhdWdtZW50IHRoZSBHTE9CQUwgLyBXSU5ET1cgXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2Vcbi8vIHRvIGFjdHVhbGx5IERPQ1VNRU5UIHRoZSBBUEkgc28gdGhhdCBvdXIgZGV2ZWxvcGVycyBhcmVuJ3QgZ3Vlc3NpbmcgYWJvdXQgd2hhdCdzXG4vLyBhdmFpbGFibGUgb24gdGhlIGxpYnJhcnkuXG5cbi8qKiBAaWdub3JlICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGxldCBDbGllbnQ6IElDbGllbnQ7XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgUmV2ZWwgRGlnaXRhbCBwbGF5ZXIgY2xpZW50LlxuICogXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGludGVyZmFjZSBmb3IgZ2FkZ2V0cyBhbmQgd2ViIGFwcGxpY2F0aW9uc1xuICogdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUmV2ZWwgRGlnaXRhbCBwbGF5ZXIgZW52aXJvbm1lbnQuIEl0IGhhbmRsZXMgZGV2aWNlXG4gKiBpbmZvcm1hdGlvbiwgY29tbWFuZHMsIGV2ZW50cywgYW5hbHl0aWNzIHRyYWNraW5nLCBhbmQgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50LlxuICogXG4gKiBUaGUgc2VydmljZSBzdXBwb3J0cyBib3RoIGRpcmVjdCBBUEkgY2FsbHMgYW5kIGV2ZW50LWJhc2VkIGNvbW11bmljYXRpb24gcGF0dGVybnMsXG4gKiBhbGxvd2luZyBnYWRnZXRzIHRvIHJlc3BvbmQgdG8gcGxheWVyIGxpZmVjeWNsZSBldmVudHMgKHN0YXJ0LCBzdG9wLCBjb21tYW5kcykgYW5kXG4gKiBzZW5kIGRhdGEgYmFjayB0byB0aGUgcGxheWVyIG9yIHJlbW90ZSBkZXZpY2VzLlxuICogXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUGxheWVyQ2xpZW50U2VydmljZSkge1xuICogICAvLyBTdWJzY3JpYmUgdG8gcGxheWVyIGV2ZW50c1xuICogICB0aGlzLmNsaWVudC5vblN0YXJ0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdHYWRnZXQgc3RhcnRlZCcpO1xuICogICB9KTtcbiAqICAgXG4gKiAgIHRoaXMuY2xpZW50Lm9uQ29tbWFuZCQuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdSZWNlaXZlZCBjb21tYW5kOicsIGNvbW1hbmQpO1xuICogICB9KTtcbiAqIH1cbiAqIFxuICogYXN5bmMgbmdPbkluaXQoKSB7XG4gKiAgIC8vIEdldCBkZXZpY2UgaW5mb3JtYXRpb25cbiAqICAgY29uc3QgZGV2aWNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlKCk7XG4gKiAgIGNvbnN0IGRldmljZVRpbWUgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VUaW1lKCk7XG4gKiAgIFxuICogICAvLyBUcmFjayBhbmFseXRpY3NcbiAqICAgdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnLCB7IHZlcnNpb246ICcxLjAnIH0pO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGF5ZXJDbGllbnRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHpvbmU6IE5nWm9uZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjbGllbnRQcm9taXNlOiBQcm9taXNlPElDbGllbnQ+IHwgbnVsbDtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSBzdHJlYW0gb2YgY29tbWFuZHMgc2VudCB0byB0aGlzIHBsYXllciBmcm9tIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXRmb3JtLlxuICAgKiBTdWJzY3JpYmUgdG8gdGhpcyB0byBoYW5kbGUgY3VzdG9tIGNvbW1hbmRzIHNlbnQgZnJvbSB0ZW1wbGF0ZXMsIHBsYXlsaXN0cywgb3IgcmVtb3RlIGRldmljZXMuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uQ29tbWFuZCQuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xuICAgKiAgIGlmIChjb21tYW5kLm5hbWUgPT09ICdjdXN0b21BY3Rpb24nKSB7XG4gICAqICAgICB0aGlzLmhhbmRsZUN1c3RvbUFjdGlvbihjb21tYW5kLmFyZyk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25Db21tYW5kJCA9IG5ldyBTdWJqZWN0PElDb21tYW5kPigpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBnYWRnZXQgaGFzIGJlZW4gbG9hZGVkIGFuZCBpcyByZWFkeSB0byBzdGFydC5cbiAgICogRW1pdHMgYHRydWVgIHdoZW4gcmVhZHksIGBmYWxzZWAgd2hlbiBkZXN0cm95ZWQuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uUmVhZHkkLnN1YnNjcmliZShpc1JlYWR5ID0+IHtcbiAgICogICBpZiAoaXNSZWFkeSkge1xuICAgKiAgICAgY29uc29sZS5sb2coJ0NsaWVudCBpcyByZWFkeScpO1xuICAgKiAgICAgdGhpcy5pbml0aWFsaXplR2FkZ2V0KCk7XG4gICAqICAgfVxuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25SZWFkeSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IHNpZ25hbHMgd2hlbiB0aGUgZ2FkZ2V0IGhhcyBiZWVuIHN0YXJ0ZWQgYnkgdGhlIHBsYXllci5cbiAgICogVGhpcyBldmVudCBvY2N1cnMgd2hlbiB0aGUgcGxheWVyIGJlZ2lucyBleGVjdXRpb24gb2YgdGhlIGdhZGdldCBjb250ZW50LlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vblN0YXJ0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdHYWRnZXQgc3RhcnRlZCcpO1xuICAgKiAgIHRoaXMuc3RhcnRBbmltYXRpb24oKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uU3RhcnQkID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IHNpZ25hbHMgd2hlbiB0aGUgZ2FkZ2V0IGhhcyBiZWVuIHN0b3BwZWQgYnkgdGhlIHBsYXllci5cbiAgICogVGhpcyBldmVudCBvY2N1cnMgd2hlbiB0aGUgcGxheWVyIHN0b3BzIGV4ZWN1dGlvbiwgdHlwaWNhbGx5IHdoZW4gbW92aW5nXG4gICAqIHRvIHRoZSBuZXh0IGl0ZW0gaW4gYSBwbGF5bGlzdCBvciB3aGVuIHRoZSBjb250ZW50IGR1cmF0aW9uIGV4cGlyZXMuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uU3RvcCQuc3Vic2NyaWJlKCgpID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnR2FkZ2V0IHN0b3BwZWQnKTtcbiAgICogICB0aGlzLmNsZWFudXAoKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uU3RvcCQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBnYWRnZXQgc2hvdWxkIG9wZW4gdGhlIGNvbmZpZ3VyYXRpb24gd2luZG93LlxuICAgKiBUaGlzIGFsbG93cyBnYWRnZXRzIHRvIHJlc3BvbmQgdG8gY29uZmlndXJhdGlvbiByZXF1ZXN0cyBmcm9tIHRoZSBwbGF5ZXIuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uQ29uZmlnJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgKiAgIHRoaXMub3BlbkNvbmZpZ3VyYXRpb25EaWFsb2coKTtcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG9uQ29uZmlnJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIHdoZW4gdGhlIGdhZGdldCBoYXMgcmVjZWl2ZWQgYSBwb3N0TWVzc2FnZSBldmVudCBmcm9tIHRoZSBwbGF5ZXIuXG4gICAqIFRoaXMgaGFuZGxlcyBjb21tdW5pY2F0aW9uIGJldHdlZW4gdGhlIGdhZGdldCBhbmQgcGxheWVyIHZpYSB0aGUgcG9zdE1lc3NhZ2UgQVBJLlxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiB0aGlzLmNsaWVudC5vblBvc3RNZXNzYWdlJC5zdWJzY3JpYmUobWVzc2FnZSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIG1lc3NhZ2U6JywgbWVzc2FnZSk7XG4gICAqICAgdGhpcy5oYW5kbGVQbGF5ZXJNZXNzYWdlKG1lc3NhZ2UpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25Qb3N0TWVzc2FnZSQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8vXG4gIC8vIFR3byBtZXRob2RzIGF2YWlsYWJsZSBmb3IgY2FsbGluZyBpbnRvIHRoZSBsaWJyYXJ5OlxuICAvL1xuICAvLyAxKSBVc2luZyBkaXNwYXRjaEV2ZW50KCkgd2l0aCB0aGUgZm9sbG93aW5nIGN1c3RvbSBldmVudHNcbiAgLy8gMikgVXNpbmcgdGhlIHdpbmRvdyBzY29wZWQgUmV2ZWxEaWdpdGFsIG9iamVjdCBhcyBkZWZpbmVkIGluIHRoZSBjb25zdHJ1Y3RvclxuICAvL1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uU3RhcnRTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvblN0YXJ0RXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdSZXZlbERpZ2l0YWwuU3RhcnQnKS5waXBlKFxuICAgIHNoYXJlKCksXG4gICAgdGFwKHRoaXMub25TdGFydCQpXG4gICk7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25TdG9wU3ViOiBTdWJzY3JpcHRpb247XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25TdG9wRXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdSZXZlbERpZ2l0YWwuU3RvcCcpLnBpcGUoXG4gICAgc2hhcmUoKSxcbiAgICB0YXAodGhpcy5vblN0b3AkKVxuICApO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uQ29tbWFuZFN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uQ29tbWFuZEV2dCQgPSBmcm9tRXZlbnQ8SUNvbW1hbmQ+KHdpbmRvdywgJ1JldmVsRGlnaXRhbC5Db21tYW5kJykucGlwZShcbiAgICBtYXAoKGU6IGFueSkgPT4geyByZXR1cm4geyBuYW1lOiBlLmRldGFpbC5uYW1lLCBhcmc6IGUuZGV0YWlsLmFyZyB9IGFzIElDb21tYW5kIH0pLFxuICAgIHNoYXJlKCksXG4gICAgdGFwKHRoaXMub25Db21tYW5kJClcbiAgKTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgLy8gcHJpdmF0ZSBvbkNvbmZpZ1N1YjogU3Vic2NyaXB0aW9uO1xuICAvLyAvKiogQGlnbm9yZSAqL1xuICAvLyBwcml2YXRlIG9uQ29uZmlnRXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdSZXZlbERpZ2l0YWwuQ29uZmlnJykucGlwZShcbiAgLy8gICBzaGFyZSgpLFxuICAvLyAgIHRhcCgoZTogQ3VzdG9tRXZlbnQpID0+IHtcbiAgLy8gICAgIGNvbnNvbGUubG9nKGUpO1xuXG4gIC8vICAgICBpZiAoZS5kZXRhaWwudHlwZSA9PT0gJ2FwcGx5Q29uZmlnJyAmJiBlLmRldGFpbC5pc09wZW5lcikge1xuICAvLyAgICAgICB0aGlzLmFwcGx5Q29uZmlnKGUuZGV0YWlsLmNvbmZpZyk7IC8vIHByb3BhZ2F0ZSBjb25maWcgdG8gaWZyYW1lIHBhcmVudCBmcm9tIHRoZSBwb3B1cCB3aW5kb3dcbiAgLy8gICAgIH0gZWxzZSB7XG4gIC8vICAgICAgIHRoaXMub25Db25maWckLm5leHQoZS5kZXRhaWwpO1xuICAvLyAgICAgfVxuICAvLyAgIH0pXG4gIC8vICk7XG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZVN1YjogU3Vic2NyaXB0aW9uO1xuICAvLyBwcml2YXRlIG9uUG9zdE1lc3NhZ2VFdnQkID0gZnJvbUV2ZW50KHdpbmRvdywgJ21lc3NhZ2UnKS5waXBlKFxuICAvLyAgIGZpbHRlcigobWVzc2FnZUV2ZW50OiBNZXNzYWdlRXZlbnQpID0+XG4gIC8vICAgICBtZXNzYWdlRXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50ICYmXG4gIC8vICAgICB0eXBlb2YgbWVzc2FnZUV2ZW50LmRhdGEgPT09ICdzdHJpbmcnICYmXG4gIC8vICAgICBtZXNzYWdlRXZlbnQuZGF0YS5zdGFydHNXaXRoKCdyZXZlbGRpZ2l0YWw6JykpLFxuICAvLyAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiBKU09OLnBhcnNlKGUuc3Vic3RyaW5nKDEzKSkgYXMgQ29tbWFuZCB9KSxcbiAgLy8gICBzaGFyZSgpLFxuICAvLyAgIHRhcCh0aGlzLm9uQ29tbWFuZCQpXG4gIC8vICk7XG5cbiAgcHJpdmF0ZSBvblBvc3RNZXNzYWdlU3ViOiBTdWJzY3JpcHRpb247XG4gIHByaXZhdGUgb25Qb3N0TWVzc2FnZUV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnbWVzc2FnZScpLnBpcGUoXG4gICAgZmlsdGVyKChtZXNzYWdlRXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT5cbiAgICAgIC8vbWVzc2FnZUV2ZW50LnNvdXJjZSAhPT0gd2luZG93LnBhcmVudCAmJlxuICAgICAgdHlwZW9mIG1lc3NhZ2VFdmVudC5kYXRhID09PSAnc3RyaW5nJyksXG4gICAgbWFwKChlOiBhbnkpID0+IEpTT04ucGFyc2UoZS5kYXRhKSksXG4gICAgc2hhcmUoKSxcbiAgICB0YXAoKGU6IGFueSkgPT4ge1xuICAgICAgaWYgKGUudHlwZSA9PT0gJ2FwcGx5Q29uZmlnJyAmJiBlLmlzT3BlbmVyKSB7XG4gICAgICAgIGUuaXNPcGVuZXIgPSBmYWxzZTtcbiAgICAgICAgLy8gcHJvcGFnYXRlIGNvbmZpZyB0byBpZnJhbWUgcGFyZW50IGZyb20gdGhlIHBvcHVwIHdpbmRvd1xuICAgICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFxuICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGUpLFxuICAgICAgICAgICcqJ1xuICAgICAgICApO1xuICAgICAgfSBlbHNlIGlmIChlLnR5cGUgPT09ICdvcGVuQ29uZmlnJykge1xuICAgICAgICB0aGlzLm9uQ29uZmlnJC5uZXh0KG51bGwpO1xuICAgICAgfVxuICAgIH0pLFxuICAgIHRhcChlID0+IHRoaXMub25Qb3N0TWVzc2FnZSQubmV4dChlKSlcbiAgKTtcblxuXG4gIC8qKiBAaWdub3JlICovXG4gIGNvbnN0cnVjdG9yKHpvbmU6IE5nWm9uZSkge1xuXG4gICAgdGhpcy56b25lID0gem9uZTtcblxuICAgICh3aW5kb3cgYXMgYW55KS5SZXZlbERpZ2l0YWwgPSB7XG4gICAgICBDb250cm9sbGVyOiB7XG4gICAgICAgIG9uQ29tbWFuZDogKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpID0+IHtcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uQ29tbWFuZCQubmV4dCh7IG5hbWU6IG5hbWUsIGFyZzogYXJnIH0pO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblN0YXJ0OiAoKSA9PiB7XG4gICAgICAgICAgem9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vblN0YXJ0JC5uZXh0KG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBvblN0b3A6ICgpID0+IHtcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU3RvcCQubmV4dChudWxsKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMub25TdGFydFN1YiA9IHRoaXMub25TdGFydEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vblN0b3BTdWIgPSB0aGlzLm9uU3RvcEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vbkNvbW1hbmRTdWIgPSB0aGlzLm9uQ29tbWFuZEV2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgLy90aGlzLm9uQ29uZmlnU3ViID0gdGhpcy5vbkNvbmZpZ0V2dCQuc3Vic2NyaWJlKCgpID0+IHsgfSk7XG4gICAgdGhpcy5vblBvc3RNZXNzYWdlU3ViID0gdGhpcy5vblBvc3RNZXNzYWdlRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcblxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG51bGw7XG5cbiAgICB0aGlzLm9uUmVhZHkkLm5leHQodHJ1ZSk7XG4gIH1cblxuICAvKiogQGlnbm9yZSAqL1xuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcblxuICAgIHRoaXMub25TdGFydFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uU3RvcFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uQ29tbWFuZFN1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICAvL3RoaXMub25Db25maWdTdWI/LnVuc3Vic2NyaWJlKCk7XG4gICAgdGhpcy5vblBvc3RNZXNzYWdlU3ViPy51bnN1YnNjcmliZSgpO1xuXG4gICAgdGhpcy5vblJlYWR5JC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHB1YmxpYyBzdGF0aWMgaW5pdChkYXRhOiBhbnkpIHtcblxuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJyVj4pqZ77iPIEluaXRpYWxpemluZyBSZXZlbCBEaWdpdGFsIGNsaWVudCBsaWJyYXJ5JyxcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNhbGxiYWNrIHRvIHBsYXllciBzY3JpcHRpbmcgd2l0aCB2YXJpYWJsZSBhcmd1bWVudHMuXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBhbGxvd3MgdGhlIGdhZGdldCB0byBjb21tdW5pY2F0ZSB3aXRoIHBsYXllciBzY3JpcHRpbmcuXG4gICAqIElmIHRoZSBhcHByb3ByaWF0ZSBzY3JpcHRpbmcgaXMgaW4gcGxhY2UgaW4gdGhlIGN1cnJlbnRseSBydW5uaW5nIHRlbXBsYXRlLCBcbiAgICogY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIGluaXRpYXRlIGEgY2FsbGJhY2sgd2hpY2ggY2FuIGJlIGFjdGVkIHVwb24gaW4gcGxheWVyIHNjcmlwdC5cbiAgICogXG4gICAqIEBwYXJhbSBhcmdzIC0gVmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cyB0byBwYXNzIHRvIHRoZSBjYWxsYmFjayAobWF4IDUgYXJndW1lbnRzKVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTZW5kIGEgc2ltcGxlIGNhbGxiYWNrXG4gICAqIHRoaXMuY2xpZW50LmNhbGxiYWNrKCd0ZXN0JywgJ2RhdGEnKTtcbiAgICogXG4gICAqIC8vIFNlbmQgbXVsdGlwbGUgcGFyYW1ldGVyc1xuICAgKiB0aGlzLmNsaWVudC5jYWxsYmFjaygnYWN0aW9uJywgJ3ZhbHVlMScsICd2YWx1ZTInLCB7IGRhdGE6ICdvYmplY3QnIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcblxuICAgICAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgY2xpZW50LmNhbGxiYWNrKCk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMTpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1swXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMjpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1sxXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgMzpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1syXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNDpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1szXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgNTpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soYXJnc1s0XSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1c2VyIHByZWZlcmVuY2VzIGludGVyZmFjZSBleHBvc2VkIGJ5IHRoZSBHb29nbGUgR2FkZ2V0cyBBUEkuXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBwcm92aWRlcyBhY2Nlc3MgdG8gZ2FkZ2V0IHByZWZlcmVuY2VzIHdoaWNoIGNhbiBiZSBjb25maWd1cmVkXG4gICAqIGluIHRoZSBSZXZlbCBEaWdpdGFsIENNUy4gVXNlIHRoaXMgdG8gcmV0cmlldmUgdXNlci1jb25maWd1cmFibGUgc2V0dGluZ3NcbiAgICogZm9yIHlvdXIgZ2FkZ2V0LlxuICAgKiBcbiAgICogQHJldHVybnMgVGhlIEdhZGdldHMgQVBJIFByZWZzIG9iamVjdCBmb3IgYWNjZXNzaW5nIHByZWZlcmVuY2UgdmFsdWVzXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0cnVjdG9yKHB1YmxpYyBjbGllbnQ6IFBsYXllckNsaWVudFNlcnZpY2UpIHtcbiAgICogICBjb25zdCBwcmVmcyA9IGNsaWVudC5nZXRQcmVmcygpO1xuICAgKiAgIGNvbnN0IG15U3RyaW5nID0gcHJlZnMuZ2V0U3RyaW5nKCdteVN0cmluZ1ByZWYnKTtcbiAgICogICBjb25zdCBteU51bWJlciA9IHByZWZzLmdldEludCgnbXlOdW1iZXJQcmVmJyk7XG4gICAqICAgY29uc3QgbXlCb29sID0gcHJlZnMuZ2V0Qm9vbCgnbXlCb29sUHJlZicpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKiBcbiAgICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vZ2FkZ2V0cy9kb2NzL2Jhc2ljfSBHb29nbGUgR2FkZ2V0cyBBUEkgZG9jdW1lbnRhdGlvblxuICAgKi9cbiAgcHVibGljIGdldFByZWZzKCk6IGdhZGdldHMuUHJlZnMge1xuXG4gICAgcmV0dXJuIG5ldyB3aW5kb3dbJ2dhZGdldHMnXVsnUHJlZnMnXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgZGV2aWNlIHRpbWUgaW4gSVNPODYwMSBmb3JtYXQuXG4gICAqIFxuICAgKiBDdXJyZW50IGRldmljZSB0aW1lIGlzIGRldGVybWluZWQgYnkgdGhlIGRldmljZSB0aW1lem9uZSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlIGluIHRoZSBDTVMuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBkaXNwbGF5aW5nIHRpbWUtc2Vuc2l0aXZlIGNvbnRlbnQgb3Igc2NoZWR1bGluZyBvcGVyYXRpb25zIGJhc2VkIG9uXG4gICAqIHRoZSBkZXZpY2UncyBsb2NhbCB0aW1lIHJhdGhlciB0aGFuIGJyb3dzZXIgdGltZS5cbiAgICogXG4gICAqIEBwYXJhbSBkYXRlIC0gT3B0aW9uYWwuIElmIHN1cHBsaWVkLCB3aWxsIHRyYW5zbGF0ZSB0aGUgc3VwcGxpZWQgZGF0ZS90aW1lIHRvIGRldmljZSB0aW1lIGJhc2VkIG9uIHJlc3BlY3RpdmUgdGltZXpvbmVzXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRhdGUvdGltZSBpbiBJU084NjAxIGZvcm1hdFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBHZXQgY3VycmVudCBkZXZpY2UgdGltZVxuICAgKiBjb25zdCBjdXJyZW50VGltZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWUoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lOicsIGN1cnJlbnRUaW1lKTtcbiAgICogXG4gICAqIC8vIENvbnZlcnQgYSBzcGVjaWZpYyBkYXRlIHRvIGRldmljZSB0aW1lXG4gICAqIGNvbnN0IHNwZWNpZmljRGF0ZSA9IG5ldyBEYXRlKCcyMDIzLTAxLTAxVDEyOjAwOjAwWicpO1xuICAgKiBjb25zdCBkZXZpY2VUaW1lID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZShzcGVjaWZpY0RhdGUpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lKGRhdGU/OiBEYXRlKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICBpZiAoZGF0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWUoZGF0ZSk7XG4gICAgfVxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHRpbWV6b25lIG5hbWUgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdGltZXpvbmUgbmFtZSAoZS5nLiwgXCJBbWVyaWNhL05ld19Zb3JrXCIpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHRpbWV6b25lTmFtZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWVab25lTmFtZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRpbWV6b25lOicsIHRpbWV6b25lTmFtZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZXpvbmUgSUQgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdGltZXpvbmUgSURcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGltZXpvbmVJZCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWVab25lSUQoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lem9uZSBJRDonLCB0aW1lem9uZUlkKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVJRCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVJRCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIG51bWVyaWNhbCBvZmZzZXQgZnJvbSBHTVQgb2YgdGhlIHRpbWV6b25lIGN1cnJlbnRseSBhc3NpZ25lZCB0byB0aGUgZGV2aWNlLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHRpbWV6b25lIG9mZnNldCBpbiBob3VycyAoZS5nLiwgLTUgZm9yIEVTVClcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgb2Zmc2V0ID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSB0aW1lem9uZSBvZmZzZXQ6Jywgb2Zmc2V0LCAnaG91cnMgZnJvbSBHTVQnKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZVRpbWVab25lT2Zmc2V0KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbGFuZ3VhZ2UgY29kZSBvZiB0aGUgbGFuZ3VhZ2UgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgbGFuZ3VhZ2UgY29kZSAoZS5nLiwgXCJlbi1VU1wiLCBcImZyLUZSXCIpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGxhbmd1YWdlQ29kZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldExhbmd1YWdlQ29kZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIGxhbmd1YWdlOicsIGxhbmd1YWdlQ29kZSk7XG4gICAqIC8vIFVzZSBmb3IgbG9jYWxpemF0aW9uXG4gICAqIHRoaXMubG9hZExhbmd1YWdlUmVzb3VyY2VzKGxhbmd1YWdlQ29kZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0TGFuZ3VhZ2VDb2RlKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdW5pcXVlIFJldmVsIERpZ2l0YWwgZGV2aWNlIGtleSBhc3NvY2lhdGVkIHdpdGggdGhlIGRldmljZS5cbiAgICogXG4gICAqIFRoZSBkZXZpY2Uga2V5IGlzIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgc3BlY2lmaWMgcGxheWVyIGRldmljZVxuICAgKiBhbmQgY2FuIGJlIHVzZWQgZm9yIGRldmljZS1zcGVjaWZpYyBvcGVyYXRpb25zIG9yIHJlbW90ZSBjb21tYW5kcy5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBkZXZpY2Uga2V5IHN0cmluZ1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkZXZpY2VLZXkgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VLZXkoKTtcbiAgICogY29uc29sZS5sb2coJ0RldmljZSBrZXk6JywgZGV2aWNlS2V5KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlS2V5KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VLZXkoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgdG8gdGhlIGxvY2FsIHBsYXllciBkZXZpY2UuXG4gICAqIFxuICAgKiBDb21tYW5kcyBjYW4gYmUgdXNlZCB0byBjb250cm9sIHZhcmlvdXMgYXNwZWN0cyBvZiB0aGUgcGxheWVyIG9yIHRyaWdnZXJcbiAgICogc3BlY2lmaWMgYmVoYXZpb3JzLiBUaGUgY29tbWFuZCBpcyBwcm9jZXNzZWQgYnkgdGhlIGxvY2FsIHBsYXllciBvbmx5LlxuICAgKiBcbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgY29tbWFuZCBuYW1lL2lkZW50aWZpZXJcbiAgICogQHBhcmFtIGFyZyAtIFRoZSBjb21tYW5kIGFyZ3VtZW50L3BheWxvYWRcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2VuZCBhIHNpbXBsZSBjb21tYW5kXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdyZWZyZXNoJywgJycpO1xuICAgKiBcbiAgICogLy8gU2VuZCBhIGNvbW1hbmQgd2l0aCBkYXRhXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdzZXRWb2x1bWUnLCAnNTAnKTtcbiAgICogXG4gICAqIC8vIFNlbmQgYSBjb21tYW5kIHdpdGggSlNPTiBkYXRhXG4gICAqIHRoaXMuY2xpZW50LnNlbmRDb21tYW5kKCdjb25maWd1cmUnLCBKU09OLnN0cmluZ2lmeSh7IHNldHRpbmc6ICd2YWx1ZScgfSkpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuICAgICAgY2xpZW50LnNlbmRDb21tYW5kKG5hbWUsIGFyZyk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kcyBhIGNvbW1hbmQgdG8gcmVtb3RlIHBsYXllciBkZXZpY2VzIHdpdGggdGhlIHNwZWNpZmllZCBkZXZpY2Uga2V5cy5cbiAgICogXG4gICAqIFJlbW90ZSBjb21tYW5kcyBhbGxvdyBjcm9zcy1kZXZpY2UgY29tbXVuaWNhdGlvbiB3aXRoaW4gdGhlIHNhbWUgUmV2ZWwgRGlnaXRhbCBhY2NvdW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3Igc3luY2hyb25pemVkIGRpc3BsYXlzLCBkZXZpY2UgY29vcmRpbmF0aW9uLCBvciByZW1vdGUgY29udHJvbCBzY2VuYXJpb3MuXG4gICAqIFxuICAgKiBOb3RlOiBSZW1vdGUgY29tbWFuZHMgY2FuIG9ubHkgYmUgZGVsaXZlcmVkIHRvIGRldmljZXMgd2l0aGluIHRoZSBzYW1lIGFjY291bnQgYXMgdGhlIHNlbmRlciBkZXZpY2UuXG4gICAqIFxuICAgKiBAcGFyYW0gZGV2aWNlS2V5cyAtIEFycmF5IG9mIHRhcmdldCBkZXZpY2Uga2V5cyB0byBzZW5kIHRoZSBjb21tYW5kIHRvXG4gICAqIEBwYXJhbSBuYW1lIC0gVGhlIGNvbW1hbmQgbmFtZS9pZGVudGlmaWVyXG4gICAqIEBwYXJhbSBhcmcgLSBUaGUgY29tbWFuZCBhcmd1bWVudC9wYXlsb2FkXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNlbmQgY29tbWFuZCB0byBzcGVjaWZpYyBkZXZpY2VzXG4gICAqIGNvbnN0IHRhcmdldERldmljZXMgPSBbJ2RldmljZS1rZXktMScsICdkZXZpY2Uta2V5LTInXTtcbiAgICogdGhpcy5jbGllbnQuc2VuZFJlbW90ZUNvbW1hbmQodGFyZ2V0RGV2aWNlcywgJ3N5bmNBY3Rpb24nLCAnc3RhcnQnKTtcbiAgICogXG4gICAqIC8vIEJyb2FkY2FzdCB0byBtdWx0aXBsZSBkZXZpY2VzXG4gICAqIHRoaXMuY2xpZW50LnNlbmRSZW1vdGVDb21tYW5kKFxuICAgKiAgIFsnbG9iYnktZGlzcGxheScsICdraW9zay0xJywgJ2tpb3NrLTInXSwgXG4gICAqICAgJ3VwZGF0ZUNvbnRlbnQnLCBcbiAgICogICBKU09OLnN0cmluZ2lmeSh7IGNvbnRlbnRJZDogJzEyMzQ1JyB9KVxuICAgKiApO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzLCBuYW1lLCBhcmcpO1xuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIExvZ3MgYW4gYW5hbHl0aWNzIGV2ZW50IGZvciB1c2Ugd2l0aCBBZEhhd2sgYW5hbHl0aWNzIGFuZCByZXBvcnRpbmcuXG4gICAqIFxuICAgKiBFdmVudHMgYXJlIHVzZWQgZm9yIHRyYWNraW5nIHZhcmlvdXMgbWV0cmljcyBpbmNsdWRpbmcgdXNhZ2Ugc3RhdGlzdGljcywgXG4gICAqIHBsYXllciBjb25kaXRpb24sIHN0YXRlIGNoYW5nZXMsIHVzZXIgaW50ZXJhY3Rpb25zLCBhbmQgY3VzdG9tIGJ1c2luZXNzIG1ldHJpY3MuXG4gICAqIFRoZXNlIGV2ZW50cyBjYW4gYmUgdmlld2VkIGluIHRoZSBSZXZlbCBEaWdpdGFsIGFuYWx5dGljcyBkYXNoYm9hcmQuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVW5pcXVlIG5hbWUgZm9yIHRoaXMgZXZlbnQgKHNob3VsZCBiZSBkZXNjcmlwdGl2ZSBhbmQgY29uc2lzdGVudClcbiAgICogQHBhcmFtIHByb3BlcnRpZXMgLSBPcHRpb25hbCBtYXAgb2YgdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgdG8gYXNzb2NpYXRlIHdpdGggdGhpcyBldmVudFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTaW1wbGUgZXZlbnQgdHJhY2tpbmdcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnKTtcbiAgICogXG4gICAqIC8vIEV2ZW50IHdpdGggcHJvcGVydGllc1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygndXNlcl9pbnRlcmFjdGlvbicsIHtcbiAgICogICBhY3Rpb246ICdidXR0b25fY2xpY2snLFxuICAgKiAgIGJ1dHRvbl9pZDogJ3N0YXJ0X2J1dHRvbicsXG4gICAqICAgdGltZXN0YW1wOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKClcbiAgICogfSk7XG4gICAqIFxuICAgKiAvLyBQZXJmb3JtYW5jZSB0cmFja2luZ1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnY29udGVudF9kaXNwbGF5ZWQnLCB7XG4gICAqICAgY29udGVudF90eXBlOiAndmlkZW8nLFxuICAgKiAgIGR1cmF0aW9uOiAzMCxcbiAgICogICBxdWFsaXR5OiAnSEQnXG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyB0cmFjayhldmVudE5hbWU6IHN0cmluZywgcHJvcGVydGllcz86IElFdmVudFByb3BlcnRpZXMpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQudHJhY2soZXZlbnROYW1lLCBKU09OLnN0cmluZ2lmeShwcm9wZXJ0aWVzKSk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBJbml0aWF0ZXMgYSB0aW1lZCBldmVudCBmb3IgZHVyYXRpb24gdHJhY2tpbmcuXG4gICAqIFxuICAgKiBUaW1lZCBldmVudHMgYXJlIHVzZWZ1bCBmb3IgdHJhY2tpbmcgdGhlIGR1cmF0aW9uIG9mIG9wZXJhdGlvbnMgb3IgdXNlciBpbnRlcmFjdGlvbnMuXG4gICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjYWxsIHRvIHRyYWNrKCkgd2l0aCB0aGUgc2FtZSBldmVudCBuYW1lIHRvIGNvbXBsZXRlXG4gICAqIHRoZSB0aW1pbmcgbWVhc3VyZW1lbnQuIFRoZSBkdXJhdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgY2FsY3VsYXRlZCBhbmQgaW5jbHVkZWRcbiAgICogaW4gdGhlIGV2ZW50IHByb3BlcnRpZXMuXG4gICAqIFxuICAgKiBAcGFyYW0gZXZlbnROYW1lIC0gVW5pcXVlIG5hbWUgZm9yIHRoaXMgdGltZWQgZXZlbnQgKG11c3QgbWF0Y2ggdGhlIHN1YnNlcXVlbnQgdHJhY2soKSBjYWxsKVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTdGFydCB0aW1pbmcgYW4gZXZlbnRcbiAgICogdGhpcy5jbGllbnQudGltZUV2ZW50KCd2aWRlb19wbGF5YmFjaycpO1xuICAgKiBcbiAgICogLy8gLi4uIHZpZGVvIHBsYXlzIGZvciBzb21lIGR1cmF0aW9uIC4uLlxuICAgKiBcbiAgICogLy8gRW5kIHRpbWluZyBhbmQgbG9nIHRoZSBldmVudCB3aXRoIGR1cmF0aW9uXG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCd2aWRlb19wbGF5YmFjaycsIHtcbiAgICogICB2aWRlb19pZDogJ2FiYzEyMycsXG4gICAqICAgcXVhbGl0eTogJ0hEJ1xuICAgKiB9KTsgLy8gRHVyYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkXG4gICAqIFxuICAgKiAvLyBFeGFtcGxlIGZvciB1c2VyIGludGVyYWN0aW9uIHRpbWluZ1xuICAgKiB0aGlzLmNsaWVudC50aW1lRXZlbnQoJ2Zvcm1fY29tcGxldGlvbicpO1xuICAgKiAvLyAuLi4gdXNlciBmaWxscyBvdXQgZm9ybSAuLi5cbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2Zvcm1fY29tcGxldGlvbicsIHsgZm9ybV90eXBlOiAnY29udGFjdCcgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC50aW1lRXZlbnQoZXZlbnROYW1lKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgYW5hbHl0aWNzIGV2ZW50IHNlc3Npb24gZm9yIGdyb3VwaW5nIHJlbGF0ZWQgZXZlbnRzLlxuICAgKiBcbiAgICogQSBzZXNzaW9uIGlzIGEgd2F5IG9mIGdyb3VwaW5nIGV2ZW50cyB0b2dldGhlciBmb3IgYW5hbHlzaXMuIEVhY2ggZXZlbnQgdHJhY2tlZFxuICAgKiBhZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaGF2ZSB0aGUgc2FtZSBzZXNzaW9uIElEIHVudGlsIGEgbmV3IHNlc3Npb24gaXMgY3JlYXRlZC5cbiAgICogU2Vzc2lvbiBJRHMgYXJlIHJhbmRvbWx5IGdlbmVyYXRlZCB1bmxlc3MgZXhwbGljaXRseSBwcm92aWRlZC5cbiAgICogXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciB0cmFja2luZyB1c2VyIGpvdXJuZXlzLCB3b3JrZmxvdyBjb21wbGV0aW9uLCBvciBncm91cGluZ1xuICAgKiByZWxhdGVkIGludGVyYWN0aW9ucyB3aXRoaW4gYSBzcGVjaWZpYyB0aW1lIHBlcmlvZC5cbiAgICogXG4gICAqIEBwYXJhbSBpZCAtIE9wdGlvbmFsIHVzZXItc3VwcGxpZWQgc2Vzc2lvbiBJRC4gSWYgbm90IHByb3ZpZGVkLCBhIHJhbmRvbSBzZXNzaW9uIElEIHdpbGwgYmUgZ2VuZXJhdGVkXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFN0YXJ0IGEgbmV3IHNlc3Npb24gd2l0aCBhdXRvLWdlbmVyYXRlZCBJRFxuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3Nlc3Npb25fc3RhcnQnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3VzZXJfYWN0aW9uXzEnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3VzZXJfYWN0aW9uXzInKTtcbiAgICogXG4gICAqIC8vIFN0YXJ0IGEgc2Vzc2lvbiB3aXRoIGN1c3RvbSBJRFxuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oJ3VzZXItd29ya2Zsb3ctMTIzNDUnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3dvcmtmbG93X3N0YXJ0Jyk7XG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCdzdGVwX2NvbXBsZXRlZCcsIHsgc3RlcDogMSB9KTtcbiAgICogXG4gICAqIC8vIFN0YXJ0IGEgbmV3IHNlc3Npb24gZm9yIGRpZmZlcmVudCB3b3JrZmxvd1xuICAgKiB0aGlzLmNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2RpZmZlcmVudF93b3JrZmxvd19zdGFydCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBuZXdFdmVudFNlc3Npb24oaWQ/OiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XG4gICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjbGllbnQubmV3RXZlbnRTZXNzaW9uKGlkKTtcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHJvb3QgZm9sZGVyIHBhdGggdXRpbGl6ZWQgYnkgdGhpcyBwbGF5ZXIgZGV2aWNlLlxuICAgKiBcbiAgICogVGhpcyByZXR1cm5zIHRoZSBiYXNlIGRpcmVjdG9yeSBwYXRoIHdoZXJlIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllclxuICAgKiBzdG9yZXMgaXRzIGZpbGVzIGFuZCByZXNvdXJjZXMgb24gdGhlIGxvY2FsIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBwYXRoIG9mIHRoZSByb290IGZvbGRlclxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCByb290UGF0aCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFJldmVsUm9vdCgpO1xuICAgKiBjb25zb2xlLmxvZygnUGxheWVyIHJvb3QgZGlyZWN0b3J5OicsIHJvb3RQYXRoKTtcbiAgICogLy8gVXNlIGZvciBjb25zdHJ1Y3RpbmcgZmlsZSBwYXRocyBvciB1bmRlcnN0YW5kaW5nIHN0b3JhZ2Ugc3RydWN0dXJlXG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFJldmVsUm9vdCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0UmV2ZWxSb290KCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBhIG1hcCBvZiBjb21tYW5kcyBjdXJyZW50bHkgYWN0aXZlIGZvciB0aGlzIGRldmljZS5cbiAgICogXG4gICAqIFRoaXMgcmV0dXJucyB0aGUgY3VycmVudCBjb21tYW5kIGNvbmZpZ3VyYXRpb24gdGhhdCBkZWZpbmVzIGhvdyB0aGUgZGV2aWNlXG4gICAqIHJlc3BvbmRzIHRvIHZhcmlvdXMgY29tbWFuZCB0cmlnZ2VycyBhbmQgcmVtb3RlIGNvbW1hbmRzLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gYSBtYXAgb2YgY3VycmVudGx5IGFjdGl2ZSBjb21tYW5kc1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjb21tYW5kTWFwID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0Q29tbWFuZE1hcCgpO1xuICAgKiBjb25zb2xlLmxvZygnQWN0aXZlIGNvbW1hbmRzOicsIGNvbW1hbmRNYXApO1xuICAgKiBcbiAgICogLy8gQ2hlY2sgaWYgc3BlY2lmaWMgY29tbWFuZCBpcyBhdmFpbGFibGVcbiAgICogaWYgKGNvbW1hbmRNYXBbJ2N1c3RvbUNvbW1hbmQnXSkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdDdXN0b20gY29tbWFuZCBpcyBhdmFpbGFibGUnKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRDb21tYW5kTWFwKCk6IFByb21pc2U8YW55PiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIEpTT04ucGFyc2UoYXdhaXQgY2xpZW50LmdldENvbW1hbmRNYXAoKSk7XG4gIH1cblxuICAvKipcbiAgICogU2lnbmFscyB0byB0aGUgcGxheWVyIHRoYXQgdGhpcyBnYWRnZXQgaGFzIGNvbXBsZXRlZCBpdHMgdmlzdWFsaXphdGlvbi5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIHRoZSBwbGF5ZXIgdGhhdCB0aGUgY3VycmVudCBnYWRnZXQgaGFzIGZpbmlzaGVkIGl0c1xuICAgKiBjb250ZW50IGRpc3BsYXkgb3IgaW50ZXJhY3Rpb24gY3ljbGUuIFRoZSBwbGF5ZXIgY2FuIHRoZW4gcHJvY2VlZCB3aXRoXG4gICAqIHRoZSBuZXh0IGl0ZW0gaW4gYSBwbGF5bGlzdCBpZiBhcHBsaWNhYmxlLCBvciBoYW5kbGUgdGhlIGNvbXBsZXRpb25cbiAgICogYWNjb3JkaW5nIHRvIGl0cyBjb25maWd1cmF0aW9uLlxuICAgKiBcbiAgICogQ2FsbCB0aGlzIG1ldGhvZCB3aGVuIHlvdXIgZ2FkZ2V0IGhhcyBjb21wbGV0ZWQgaXRzIGludGVuZGVkIGZ1bmN0aW9uLFxuICAgKiBzdWNoIGFzIGZpbmlzaGluZyBhbiBhbmltYXRpb24sIGNvbXBsZXRpbmcgYSBmb3JtLCBvciByZWFjaGluZyBhIG5hdHVyYWxcbiAgICogc3RvcHBpbmcgcG9pbnQuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEFmdGVyIGNvbXBsZXRpbmcgYW4gYW5pbWF0aW9uXG4gICAqIHByaXZhdGUgb25BbmltYXRpb25Db21wbGV0ZSgpOiB2b2lkIHtcbiAgICogICB0aGlzLmNsaWVudC5maW5pc2goKTtcbiAgICogfVxuICAgKiBcbiAgICogLy8gQWZ0ZXIgdXNlciBpbnRlcmFjdGlvbiBpcyBjb21wbGV0ZVxuICAgKiBwcml2YXRlIG9uRm9ybVN1Ym1pdHRlZCgpOiB2b2lkIHtcbiAgICogICB0aGlzLnNhdmVGb3JtRGF0YSgpO1xuICAgKiAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiB9XG4gICAqIFxuICAgKiAvLyBBZnRlciBhIHRpbWVkIGRpc3BsYXkgcGVyaW9kXG4gICAqIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgKiAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiB9LCAzMDAwMCk7IC8vIDMwIHNlY29uZHNcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcblxuICAgICAgY2xpZW50LmZpbmlzaCgpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIGlmIHRoZSBnYWRnZXQgaXMgcnVubmluZyBpbiBwcmV2aWV3IG1vZGUuXG4gICAqIFxuICAgKiBQcmV2aWV3IG1vZGUgaXMgZW5hYmxlZCB3aGVuIHRoZSBnYWRnZXQgaXMgYmVpbmcgZWRpdGVkIGluIHRoZSBSZXZlbCBEaWdpdGFsIENNUyxcbiAgICogdGVzdGVkIGluIHRoZSBnYWRnZXQgZWRpdG9yLCBvciBvdGhlcndpc2Ugbm90IHJ1bm5pbmcgaW4gYSBub3JtYWwgcGxheWVyIGVudmlyb25tZW50LlxuICAgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgcHJvdmlkaW5nIGRpZmZlcmVudCBiZWhhdmlvciBkdXJpbmcgZGV2ZWxvcG1lbnQvdGVzdGluZyB2ZXJzdXNcbiAgICogcHJvZHVjdGlvbiBkZXBsb3ltZW50LlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdHJ1ZSBpZiBydW5uaW5nIGluIHByZXZpZXcgbW9kZSwgZmFsc2UgaWYgcnVubmluZyBvbiBhY3R1YWwgcGxheWVyXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGlzUHJldmlldyA9IGF3YWl0IHRoaXMuY2xpZW50LmlzUHJldmlld01vZGUoKTtcbiAgICogXG4gICAqIGlmIChpc1ByZXZpZXcpIHtcbiAgICogICBjb25zb2xlLmxvZygnUnVubmluZyBpbiBwcmV2aWV3IG1vZGUgLSB1c2luZyBtb2NrIGRhdGEnKTtcbiAgICogICB0aGlzLmxvYWRNb2NrRGF0YSgpO1xuICAgKiB9IGVsc2Uge1xuICAgKiAgIGNvbnNvbGUubG9nKCdSdW5uaW5nIG9uIHBsYXllciBkZXZpY2UgLSB1c2luZyBsaXZlIGRhdGEnKTtcbiAgICogICB0aGlzLmxvYWRMaXZlRGF0YSgpO1xuICAgKiB9XG4gICAqIFxuICAgKiAvLyBTaG93IGRpZmZlcmVudCBVSSBpbiBwcmV2aWV3XG4gICAqIHRoaXMuc2hvd1ByZXZpZXdJbmRpY2F0b3IgPSBpc1ByZXZpZXc7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGlzUHJldmlld01vZGUoKTogUHJvbWlzZTxib29sZWFuPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudCBpbnN0YW5jZW9mIE5vb3BDbGllbnQ7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZGV2aWNlIHJ1bm5pbmcgdGhlIHBsYXllci5cbiAgICogXG4gICAqIFJldHVybnMgY29tcHJlaGVuc2l2ZSBkZXZpY2UgZGV0YWlscyBpbmNsdWRpbmcgbmFtZSwgcmVnaXN0cmF0aW9uIGtleSwgdHlwZSxcbiAgICogc2VydmljZSBkYXRlLCBsYW5ndWFnZSwgdGltZXpvbmUsIHRhZ3MsIGFuZCBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gVGhpcyBkYXRhXG4gICAqIGlzIGNvbmZpZ3VyZWQgaW4gdGhlIFJldmVsIERpZ2l0YWwgQ01TIGZvciBlYWNoIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGRldmljZSBkZXRhaWxzIG9iamVjdCwgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZSgpO1xuICAgKiBcbiAgICogaWYgKGRldmljZSkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdEZXZpY2UgbmFtZTonLCBkZXZpY2UubmFtZSk7XG4gICAqICAgY29uc29sZS5sb2coJ0RldmljZSB0eXBlOicsIGRldmljZS5kZXZpY2VUeXBlKTtcbiAgICogICBjb25zb2xlLmxvZygnTG9jYXRpb246JywgZGV2aWNlLmxvY2F0aW9uLmNpdHksIGRldmljZS5sb2NhdGlvbi5zdGF0ZSk7XG4gICAqICAgY29uc29sZS5sb2coJ1RhZ3M6JywgZGV2aWNlLnRhZ3MpO1xuICAgKiAgIFxuICAgKiAgIC8vIFVzZSBkZXZpY2UgaW5mbyBmb3IgY3VzdG9taXphdGlvblxuICAgKiAgIGlmIChkZXZpY2UubG9jYXRpb24uY291bnRyeSA9PT0gJ1VTJykge1xuICAgKiAgICAgdGhpcy5sb2FkVVNDb250ZW50KCk7XG4gICAqICAgfVxuICAgKiAgIFxuICAgKiAgIC8vIENoZWNrIGRldmljZSBjYXBhYmlsaXRpZXMgYmFzZWQgb24gdHlwZVxuICAgKiAgIGlmIChkZXZpY2UuZGV2aWNlVHlwZSA9PT0gJ2FuZHJvaWQnKSB7XG4gICAqICAgICB0aGlzLmVuYWJsZVRvdWNoRmVhdHVyZXMoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8SURldmljZSB8IG51bGw+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICBjb25zdCBvYmo6IGFueSA9IEpTT04ucGFyc2UoPHN0cmluZz5hd2FpdCBjbGllbnQuZ2V0RGV2aWNlKCkpO1xuXG4gICAgY29uc3QgZGV2aWNlOiBJRGV2aWNlW10gPSBbb2JqXS5tYXAoKGRldmljZTogYW55KSA9PiB7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIG5hbWU6IGRldmljZS5uYW1lLFxuICAgICAgICByZWdpc3RyYXRpb25LZXk6IGRldmljZS5rZXksXG4gICAgICAgIGRldmljZVR5cGU6IGRldmljZS5kZXZpY2V0eXBlLFxuICAgICAgICBlbnRlcmVkU2VydmljZTogbmV3IERhdGUoZGV2aWNlLmVudGVyZWRzZXJ2aWNlKSxcbiAgICAgICAgbGFuZ0NvZGU6IGRldmljZS5sYW5nY29kZSxcbiAgICAgICAgdGltZVpvbmU6IGRldmljZS50aW1lem9uZSxcbiAgICAgICAgdGFnczogZGV2aWNlLmRlc2NyaXB0aW9uPy5zcGxpdCgnXFxuJyksXG4gICAgICAgIGxvY2F0aW9uOiB7XG4gICAgICAgICAgY2l0eTogZGV2aWNlLmxvY2F0aW9uPy5jaXR5LFxuICAgICAgICAgIHN0YXRlOiBkZXZpY2UubG9jYXRpb24/LnN0YXRlLFxuICAgICAgICAgIGNvdW50cnk6IGRldmljZS5sb2NhdGlvbj8uY291bnRyeSxcbiAgICAgICAgICBwb3N0YWxDb2RlOiBkZXZpY2UubG9jYXRpb24/LnBvc3RhbGNvZGUsXG4gICAgICAgICAgYWRkcmVzczogZGV2aWNlLmxvY2F0aW9uPy5hZGRyZXNzLFxuICAgICAgICAgIGxhdGl0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxhdGl0dWRlLFxuICAgICAgICAgIGxvbmdpdHVkZTogZGV2aWNlLmxvY2F0aW9uPy5sb25naXR1ZGVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICAgIHJldHVybiBkZXZpY2VbMF07XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIHZpc3VhbGl6YXRpb24gYXJlYSBpbiBwaXhlbHMuXG4gICAqIFxuICAgKiBUaGlzIHJldHVybnMgdGhlIGF2YWlsYWJsZSB3aWR0aCBmb3IgY29udGVudCBkaXNwbGF5LCB3aGljaCBtYXkgYmVcbiAgICogZGlmZmVyZW50IGZyb20gdGhlIGZ1bGwgc2NyZWVuIHdpZHRoIGRlcGVuZGluZyBvbiBwbGF5ZXIgY29uZmlndXJhdGlvblxuICAgKiBhbmQgdGVtcGxhdGUgbGF5b3V0LlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gd2lkdGggaW4gcGl4ZWxzLCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3Qgd2lkdGggPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRXaWR0aCgpO1xuICAgKiBcbiAgICogaWYgKHdpZHRoKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0F2YWlsYWJsZSB3aWR0aDonLCB3aWR0aCwgJ3BpeGVscycpO1xuICAgKiAgIFxuICAgKiAgIC8vIEFkYXB0IGNvbnRlbnQgbGF5b3V0IGJhc2VkIG9uIHdpZHRoXG4gICAqICAgaWYgKHdpZHRoIDwgODAwKSB7XG4gICAqICAgICB0aGlzLmVuYWJsZU1vYmlsZUxheW91dCgpO1xuICAgKiAgIH0gZWxzZSB7XG4gICAqICAgICB0aGlzLmVuYWJsZURlc2t0b3BMYXlvdXQoKTtcbiAgICogICB9XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0V2lkdGgoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRXaWR0aCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgdmlzdWFsaXphdGlvbiBhcmVhIGluIHBpeGVscy5cbiAgICogXG4gICAqIFRoaXMgcmV0dXJucyB0aGUgYXZhaWxhYmxlIGhlaWdodCBmb3IgY29udGVudCBkaXNwbGF5LCB3aGljaCBtYXkgYmVcbiAgICogZGlmZmVyZW50IGZyb20gdGhlIGZ1bGwgc2NyZWVuIGhlaWdodCBkZXBlbmRpbmcgb24gcGxheWVyIGNvbmZpZ3VyYXRpb25cbiAgICogYW5kIHRlbXBsYXRlIGxheW91dC5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGhlaWdodCBpbiBwaXhlbHMsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBoZWlnaHQgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRIZWlnaHQoKTtcbiAgICogXG4gICAqIGlmIChoZWlnaHQpIHtcbiAgICogICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIGhlaWdodDonLCBoZWlnaHQsICdwaXhlbHMnKTtcbiAgICogICBcbiAgICogICAvLyBDYWxjdWxhdGUgYXNwZWN0IHJhdGlvIGZvciByZXNwb25zaXZlIGRlc2lnblxuICAgKiAgIGNvbnN0IHdpZHRoID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0V2lkdGgoKTtcbiAgICogICBjb25zdCBhc3BlY3RSYXRpbyA9IHdpZHRoIC8gaGVpZ2h0O1xuICAgKiAgIHRoaXMuYWRqdXN0Q29udGVudEZvckFzcGVjdFJhdGlvKGFzcGVjdFJhdGlvKTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRIZWlnaHQoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRIZWlnaHQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudCBpdGVtLlxuICAgKiBcbiAgICogVGhpcyBtZXRob2QgaXMgb25seSBhcHBsaWNhYmxlIHdoZW4gdGhlIGdhZGdldCBpcyBhc3NvY2lhdGVkIHdpdGggYSBwbGF5bGlzdFxuICAgKiBhbmQgcmV0dXJucyB0aGUgZHVyYXRpb24gYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgcGxheWxpc3QgaXRlbS4gVGhlIGR1cmF0aW9uXG4gICAqIGRldGVybWluZXMgaG93IGxvbmcgdGhlIGNvbnRlbnQgc2hvdWxkIGJlIGRpc3BsYXllZCBiZWZvcmUgbW92aW5nIHRvIHRoZSBuZXh0IGl0ZW0uXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIG51bGwgaWYgbm90IGFwcGxpY2FibGUvYXZhaWxhYmxlXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGR1cmF0aW9uID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RHVyYXRpb24oKTtcbiAgICogXG4gICAqIGlmIChkdXJhdGlvbikge1xuICAgKiAgIGNvbnNvbGUubG9nKCdDb250ZW50IGR1cmF0aW9uOicsIGR1cmF0aW9uLCAnbWlsbGlzZWNvbmRzJyk7XG4gICAqICAgXG4gICAqICAgLy8gU2V0IHVwIGF1dG8tZmluaXNoIHRpbWVyXG4gICAqICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAqICAgICB0aGlzLmNsaWVudC5maW5pc2goKTtcbiAgICogICB9LCBkdXJhdGlvbik7XG4gICAqICAgXG4gICAqICAgLy8gU2hvdyBwcm9ncmVzcyBpbmRpY2F0b3JcbiAgICogICB0aGlzLnN0YXJ0UHJvZ3Jlc3NJbmRpY2F0b3IoZHVyYXRpb24pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RHVyYXRpb24oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlIFJldmVsIERpZ2l0YWwgU0RLLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIFNESyB2ZXJzaW9uIHN0cmluZ1xuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0U2RrVmVyc2lvbigpO1xuICAgKiBjb25zb2xlLmxvZygnU0RLIFZlcnNpb246JywgdmVyc2lvbik7XG4gICAqIFxuICAgKiAvLyBVc2UgZm9yIGNvbXBhdGliaWxpdHkgY2hlY2tzIG9yIGxvZ2dpbmdcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnLCB7IHNka1ZlcnNpb246IHZlcnNpb24gfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldFNka1ZlcnNpb24oKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodmVyc2lvbik7XG4gIH1cblxuICAvKipcbiAgICogQXBwbGllcyBjb25maWd1cmF0aW9uIHByZWZlcmVuY2VzIHRvIHRoZSBnYWRnZXQgKHByZXZpZXcgbW9kZSBvbmx5KS5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIGlzIG9ubHkgYXZhaWxhYmxlIHdoZW4gcnVubmluZyBpbiBwcmV2aWV3IG1vZGUgKHR5cGljYWxseSBkdXJpbmdcbiAgICogZ2FkZ2V0IGRldmVsb3BtZW50IG9yIHRlc3RpbmcgaW4gdGhlIENNUykuIEl0IGFsbG93cyBhcHBseWluZyBjb25maWd1cmF0aW9uXG4gICAqIGNoYW5nZXMgdGhhdCB3b3VsZCBub3JtYWxseSBjb21lIGZyb20gdGhlIGdhZGdldCdzIHByZWZlcmVuY2Ugc2V0dGluZ3MuXG4gICAqIFxuICAgKiBAcGFyYW0gcHJlZnMgLSBEaWN0aW9uYXJ5IG9mIHByZWZlcmVuY2Uga2V5LXZhbHVlIHBhaXJzIHRvIGFwcGx5XG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGlmIChhd2FpdCB0aGlzLmNsaWVudC5pc1ByZXZpZXdNb2RlKCkpIHtcbiAgICogICAvLyBBcHBseSB0ZXN0IGNvbmZpZ3VyYXRpb24gaW4gcHJldmlld1xuICAgKiAgIGF3YWl0IHRoaXMuY2xpZW50LmFwcGx5Q29uZmlnKHtcbiAgICogICAgICd0aXRsZSc6ICdUZXN0IFRpdGxlJyxcbiAgICogICAgICdiYWNrZ3JvdW5kQ29sb3InOiAnI2ZmMDAwMCcsXG4gICAqICAgICAnc2hvd0JvcmRlcic6IHRydWUsXG4gICAqICAgICAncmVmcmVzaEludGVydmFsJzogMzBcbiAgICogICB9KTtcbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBhcHBseUNvbmZpZyhwcmVmczogSURpY3Rpb25hcnk8YW55Pikge1xuXG4gICAgaWYgKGF3YWl0IHRoaXMuaXNQcmV2aWV3TW9kZSgpKSB7XG4gICAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuICAgICAgY2xpZW50LmFwcGx5Q29uZmlnKHByZWZzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICclY2FwcGx5Q29uZmlnKCkgaXMgb25seSBhdmFpbGFibGUgaW4gcHJldmlldyBtb2RlLicsXG4gICAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHlwZWQgd3JhcHBlciBmb3IgYSBSZXZlbCBEaWdpdGFsIGRhdGEgdGFibGUuXG4gICAqXG4gICAqIFRoZSBkYXRhIHRhYmxlIGZlYXR1cmUgbXVzdCBiZSBlbmFibGVkIGZvciB0aGUgZ2FkZ2V0LiBUaGUgcmV0dXJuZWRcbiAgICoge0BsaW5rIERhdGFUYWJsZVJlZn0gcHJvdmlkZXMgdHlwZWQgUHJvbWlzZS1iYXNlZCBtZXRob2RzIGFuZCBSeEpTXG4gICAqIE9ic2VydmFibGVzIGZvciByZWFsLXRpbWUgcm93IGNoYW5nZSBldmVudHMuXG4gICAqXG4gICAqIEBwYXJhbSB0YWJsZUlkIC0gVGhlIGRhdGEgdGFibGUgSUQgKGUuZy4gJ3RibF9tZW51X2l0ZW1zJylcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJucyBBIHtAbGluayBEYXRhVGFibGVSZWZ9IGluc3RhbmNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBkYXRhdGFibGUgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZHQgPSB0aGlzLmNsaWVudC5jcmVhdGVEYXRhVGFibGUoJ3RibF9tZW51X2l0ZW1zJyk7XG4gICAqXG4gICAqIC8vIEZldGNoIHJvd3Mgd2l0aCBmaWx0ZXJpbmcgYW5kIHNvcnRpbmdcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgZHQuZ2V0Um93cyh7XG4gICAqICAgZmlsdGVyOiB7IGNhdGVnb3J5OiAnRW50cmVlJywgcHJpY2U6IHsgb3A6ICdsdGUnLCB2YWx1ZTogMjUgfSB9LFxuICAgKiAgIHNvcnQ6ICdwcmljZScsXG4gICAqICAgc29ydERpcjogJ2FzYydcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIFN1YnNjcmliZSB0byByZWFsLXRpbWUgdXBkYXRlc1xuICAgKiBkdC5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKCdSb3cgdXBkYXRlZDonLCBjaGFuZ2UpKTtcbiAgICogZHQucm93Q3JlYXRlZCQuc3Vic2NyaWJlKGNoYW5nZSA9PiBjb25zb2xlLmxvZygnUm93IGNyZWF0ZWQ6JywgY2hhbmdlKSk7XG4gICAqIGR0LnJvd0RlbGV0ZWQkLnN1YnNjcmliZShjaGFuZ2UgPT4gY29uc29sZS5sb2coJ1JvdyBkZWxldGVkOicsIGNoYW5nZSkpO1xuICAgKlxuICAgKiAvLyBDbGVhbnVwIHdoZW4gZG9uZVxuICAgKiBkdC5kaXNwb3NlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZURhdGFUYWJsZSh0YWJsZUlkOiBzdHJpbmcsIG9wdGlvbnM/OiBJRGF0YVRhYmxlT3B0aW9ucyk6IERhdGFUYWJsZVJlZiB7XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGVSZWYodGFibGVJZCwgdGhpcy56b25lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgdHlwZWQgZGF0YSB0YWJsZSB3cmFwcGVyIGZyb20gYSBnYWRnZXQgcHJlZmVyZW5jZSB2YWx1ZS5cbiAgICpcbiAgICogVGhlIHByZWZlcmVuY2UgSlNPTiBzdHJpbmcgKGFzIHNlcmlhbGl6ZWQgYnkgdGhlIHRlbXBsYXRlIGVkaXRvcidzIGRhdGF0YWJsZVxuICAgKiBvcHRpb24pIGlzIHBhcnNlZCBhbmQgdXNlZCB0byBhdXRvLWNvbmZpZ3VyZSBmaWx0ZXIsIHNvcnQsIGFuZCBsb2dpYyBzZXR0aW5ncy5cbiAgICogVGhlIHJldHVybmVkIHtAbGluayBEYXRhVGFibGVQcmVmUmVmfSBwcm92aWRlcyBhIGBnZXRGaWx0ZXJlZFJvd3MoKWAgY29udmVuaWVuY2VcbiAgICogbWV0aG9kIHRoYXQgYXBwbGllcyB0aGVzZSBzZXR0aW5ncyBhdXRvbWF0aWNhbGx5LlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZlZhbHVlIC0gVGhlIHJhdyBnYWRnZXQgcHJlZmVyZW5jZSBzdHJpbmcgKEpTT04pXG4gICAqIEBwYXJhbSBvcHRpb25zIC0gT3B0aW9uYWwgY29uZmlndXJhdGlvbiBvdmVycmlkZXNcbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGF0YVRhYmxlUHJlZlJlZn0gaW5zdGFuY2VcbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZ2xvYmFsIGRhdGF0YWJsZSBsaWJyYXJ5IGlzIG5vdCBsb2FkZWRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBjZmcgPSB0aGlzLmNsaWVudC5jcmVhdGVEYXRhVGFibGVGcm9tUHJlZihwcmVmcy5nZXRTdHJpbmcoJ3JkRGF0YVRhYmxlJykpO1xuICAgKlxuICAgKiAvLyBGZXRjaCByb3dzIHdpdGggYXV0by13aXJlZCBmaWx0ZXIgKyBzb3J0XG4gICAqIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNmZy5nZXRGaWx0ZXJlZFJvd3MoKTtcbiAgICpcbiAgICogLy8gQWNjZXNzIHRoZSB1bmRlcmx5aW5nIERhdGFUYWJsZVJlZiBmb3IgZXZlbnRzLCBzY2hlbWEsIGV0Yy5cbiAgICogY2ZnLmRhdGFUYWJsZS5yb3dVcGRhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKGNoYW5nZSkpO1xuICAgKlxuICAgKiAvLyBDbGVhbnVwIHdoZW4gZG9uZVxuICAgKiBjZmcuZGlzcG9zZSgpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEYXRhVGFibGVGcm9tUHJlZihwcmVmVmFsdWU6IHN0cmluZywgb3B0aW9ucz86IElEYXRhVGFibGVPcHRpb25zKTogRGF0YVRhYmxlUHJlZlJlZiB7XG4gICAgcmV0dXJuIG5ldyBEYXRhVGFibGVQcmVmUmVmKHByZWZWYWx1ZSwgdGhpcy56b25lLCBvcHRpb25zKTtcbiAgfVxuXG4gIC8vIC0tLVxuICAvLyBQUklWQVRFIE1FVEhPRFMuXG4gIC8vIC0tLVxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGdldENsaWVudCgpOiBQcm9taXNlPElDbGllbnQ+IHtcblxuICAgIGlmICh0aGlzLmNsaWVudFByb21pc2UpIHtcblxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UpO1xuICAgIH1cblxuICAgIGlmICgod2luZG93IGFzIGFueSkuQ2xpZW50KSB7XG5cbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCh3aW5kb3cgYXMgYW55KS5DbGllbnQpKTtcbiAgICB9XG5cbiAgICAvLyBBIFwiY29tcGxldGVcIiBzdGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIFwibG9hZFwiIGV2ZW50IGhhcyBiZWVuIGZpcmVkIG9uIHRoZVxuICAgIC8vIHdpbmRvdzsgYW5kLCB0aGF0IGFsbCBzdWItcmVzb3VyY2VzIHN1Y2ggYXMgU2NyaXB0cywgSW1hZ2VzLCBhbmQgRnJhbWVzIGhhdmVcbiAgICAvLyBiZWVuIGxvYWRlZC5cbiAgICBpZiAod2luZG93LmRvY3VtZW50LnJlYWR5U3RhdGUgPT09IFwiY29tcGxldGVcIikge1xuXG4gICAgICAvLyBJZiB0aGlzIGV2ZW50IGhhcyBmaXJlZCBBTkQgdGhlIDNyZC1wYXJ0eSBzY3JpcHQgaXNuJ3QgYXZhaWxhYmxlIChzZWUgSUYtXG4gICAgICAvLyBjb25kaXRpb24gQkVGT1JFIHRoaXMgb25lKSwgaXQgbWVhbnMgdGhhdCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBlaXRoZXJcbiAgICAgIC8vIGZhaWxlZCBvbiB0aGUgbmV0d29yayBvciB3YXMgQkxPQ0tFRCBieSBhbiBhZC1ibG9ja2VyLiBBcyBzdWNoLCB3ZSBoYXZlIHRvXG4gICAgICAvLyBmYWxsLWJhY2sgdG8gdXNpbmcgYSBtb2NrIEFQSS5cbiAgICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKG5ldyBOb29wQ2xpZW50KCkpKTtcbiAgICB9XG5cbiAgICAvLyBBU1NFUlQ6IElmIHdlIG1hZGUgaXQgdGhpcyBmYXIsIHRoZSBkb2N1bWVudCBoYXMgbm90IGNvbXBsZXRlZCBsb2FkaW5nIChidXQgaXRcbiAgICAvLyBtYXkgYmUgaW4gYW4gXCJpbnRlcmFjdGl2ZVwiIHN0YXRlIHdoaWNoIGlzIHdoZW4gSSBiZWxpZXZlIHRoYXQgdGhlIEFuZ3VsYXIgYXBwXG4gICAgLy8gZ2V0cyBib290c3RyYXBwZWQpLiBBcyBzdWNoLCB3ZSBuZWVkIGJpbmQgdG8gdGhlIExPQUQgZXZlbnQgdG8gd2FpdCBmb3Igb3VyXG4gICAgLy8gdGhpcmQtcGFydHkgc2NyaXB0cyB0byBsb2FkIChvciBmYWlsIHRvIGxvYWQsIG9yIGJlIGJsb2NrZWQpLlxuICAgIHRoaXMuY2xpZW50UHJvbWlzZSA9IG5ldyBQcm9taXNlPElDbGllbnQ+KFxuICAgICAgKHJlc29sdmUpID0+IHtcblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcbiAgICAgICAgICBcImxvYWRcIixcbiAgICAgICAgICBmdW5jdGlvbiBoYW5kbGVXaW5kb3dMb2FkKCkge1xuXG4gICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgM3JkLXBhcnR5IGxpYnJhcnkgaXMgZWl0aGVyIGF2YWlsYWJsZSBvclxuICAgICAgICAgICAgLy8gaXQncyBub3QgLSB0aGVyZSdzIG5vIGZ1cnRoZXIgbG9hZGluZyB0byBkby4gSWYgaXQncyBub3RcbiAgICAgICAgICAgIC8vIHByZXNlbnQgb24gdGhlIGdsb2JhbCBzY29wZSwgd2UncmUgZ29pbmcgdG8gZmFsbC1iYWNrIHRvIHVzaW5nXG4gICAgICAgICAgICAvLyBhIG1vY2sgQVBJLlxuICAgICAgICAgICAgcmVzb2x2ZSgod2luZG93IGFzIGFueSkuQ2xpZW50IHx8IG5ldyBOb29wQ2xpZW50KCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgfVxuICAgICk7XG5cbiAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XG4gIH1cbn1cblxuXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vKipcbiAqIE1vY2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIElDbGllbnQgaW50ZXJmYWNlLlxuICogXG4gKiBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbm8tb3BlcmF0aW9uIChOT09QKSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgY2xpZW50IEFQSVxuICogdGhhdCBhbGxvd3MgY29uc3VtaW5nIGNvZGUgdG8gZnVuY3Rpb24gbm9ybWFsbHkgZXZlbiB3aGVuIHRoZSBhY3R1YWwgcGxheWVyXG4gKiBBUEkgaXMgbm90IGF2YWlsYWJsZS4gVGhpcyB0eXBpY2FsbHkgb2NjdXJzIGR1cmluZyBkZXZlbG9wbWVudCwgdGVzdGluZyxcbiAqIG9yIHdoZW4gdGhlIHBsYXllciBzY3JpcHQgaXMgYmxvY2tlZCBieSBhZC1ibG9ja2Vycy5cbiAqIFxuICogQWxsIG1ldGhvZHMgaW4gdGhpcyBjbGFzcyBlaXRoZXIgcmV0dXJuIG51bGwvZW1wdHkgdmFsdWVzIG9yIHBlcmZvcm0gbm9cbiAqIG9wZXJhdGlvbnMsIGFsbG93aW5nIGdhZGdldHMgdG8gZnVuY3Rpb24gd2l0aG91dCBlcnJvcnMgd2hpbGUgcHJvdmlkaW5nXG4gKiBhcHByb3ByaWF0ZSBmYWxsYmFjayBiZWhhdmlvci5cbiAqIFxuICogQHByaXZhdGVcbiAqL1xuY2xhc3MgTm9vcENsaWVudCBpbXBsZW1lbnRzIElDbGllbnQge1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnJWNDbGllbnQgQVBJIG5vdCBhdmFpbGFibGUsIGZhbGxpbmcgYmFjayB0byBtb2NrIEFQSScsXG4gICAgICAnYmFja2dyb3VuZC1jb2xvcjpibHVlOyBjb2xvcjp5ZWxsb3c7J1xuICAgICk7XG4gIH1cblxuICBwdWJsaWMgY2FsbGJhY2soLi4uYXJnczogYW55W10pOiB2b2lkIHtcblxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxuICB9XG5cbiAgcHVibGljIGdldERldmljZVRpbWUoZGF0ZT86IERhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCkpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lTmFtZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lT2Zmc2V0KCk6IFByb21pc2U8bnVtYmVyPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldExhbmd1YWdlQ29kZSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VLZXkoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgc2VuZENvbW1hbmQobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgc2VuZFJlbW90ZUNvbW1hbmQoZGV2aWNlS2V5czogc3RyaW5nW10sIG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpIHtcblxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxuICB9XG5cbiAgcHVibGljIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyB0aW1lRXZlbnQoZXZlbnROYW1lOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxuICB9XG5cbiAgcHVibGljIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoJ3t9Jyk7XG4gIH1cblxuICBwdWJsaWMgZmluaXNoKCk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRXaWR0aCgpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0SGVpZ2h0KCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREdXJhdGlvbigpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0U2RrVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZXJzaW9uKTtcbiAgfVxuXG4gIHB1YmxpYyBhcHBseUNvbmZpZyhwcmVmczogSURpY3Rpb25hcnk8YW55Pik6IHZvaWQge1xuXG4gICAgY29uc3QgZXZ0ID0geyB0eXBlOiAnYXBwbHlDb25maWcnLCBwcmVmczogcHJlZnMsIGlzT3BlbmVyOiB3aW5kb3cub3BlbmVyICE9PSBudWxsIH07XG5cbiAgICBpZiAod2luZG93Lm9wZW5lcikge1xuICAgICAgd2luZG93Lm9wZW5lci5wb3N0TWVzc2FnZShcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZXZ0KSxcbiAgICAgICAgJyonXG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB3aW5kb3cucGFyZW50LnBvc3RNZXNzYWdlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShldnQpLFxuICAgICAgICAnKidcbiAgICAgICk7XG4gICAgfVxuICB9XG59XG4iXX0=
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '2.2.0';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBnZW52ZXJzaW9uLlxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMi4yLjAnXG4iXX0=
2
+ export const version = '2.3.0';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBnZW52ZXJzaW9uLlxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMi4zLjAnXG4iXX0=
@@ -15,6 +15,7 @@ import * as i1$1 from '@angular/platform-browser';
15
15
  * Angular-friendly wrapper around the global `gadgets.reveldigital.datatable` library.
16
16
  *
17
17
  * Provides typed Promise-based methods and RxJS Observables for real-time events.
18
+ * All event emissions run inside Angular's zone to ensure change detection triggers.
18
19
  *
19
20
  * ```typescript
20
21
  * const dt = this.client.createDataTable('tbl_menu_items');
@@ -34,16 +35,18 @@ class DataTableRef {
34
35
  * Creates a new DataTableRef.
35
36
  *
36
37
  * @param tableId - The data table ID (e.g. 'tbl_menu_items')
38
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
37
39
  * @param options - Optional configuration overrides
38
40
  * @throws Error if the global datatable library is not loaded
39
41
  */
40
- constructor(tableId, options) {
42
+ constructor(tableId, zone, options) {
41
43
  /** Emits when an existing row is modified. */
42
44
  this.rowUpdated$ = new Subject();
43
45
  /** Emits when a new row is added. */
44
46
  this.rowCreated$ = new Subject();
45
47
  /** Emits when a row is removed. */
46
48
  this.rowDeleted$ = new Subject();
49
+ this._zone = zone;
47
50
  const lib = window.gadgets?.['reveldigital.datatable'];
48
51
  if (!lib || typeof lib.create !== 'function') {
49
52
  throw new Error('RevelDigital DataTable library is not available. ' +
@@ -124,20 +127,27 @@ class DataTableRef {
124
127
  this.rowDeleted$.complete();
125
128
  }
126
129
  /** @ignore */
127
- static _fromInstance(instance) {
130
+ static _fromInstance(instance, zone) {
128
131
  const ref = Object.create(DataTableRef.prototype);
129
132
  ref.rowUpdated$ = new Subject();
130
133
  ref.rowCreated$ = new Subject();
131
134
  ref.rowDeleted$ = new Subject();
132
135
  ref._instance = instance;
136
+ ref._zone = zone;
133
137
  ref._wireEvents();
134
138
  return ref;
135
139
  }
136
140
  /** @ignore */
137
141
  _wireEvents() {
138
- this._onRowUpdated = (change) => this.rowUpdated$.next(change);
139
- this._onRowCreated = (change) => this.rowCreated$.next(change);
140
- this._onRowDeleted = (change) => this.rowDeleted$.next(change);
142
+ this._onRowUpdated = (change) => {
143
+ this._zone.run(() => this.rowUpdated$.next(change));
144
+ };
145
+ this._onRowCreated = (change) => {
146
+ this._zone.run(() => this.rowCreated$.next(change));
147
+ };
148
+ this._onRowDeleted = (change) => {
149
+ this._zone.run(() => this.rowDeleted$.next(change));
150
+ };
141
151
  this._instance.on('rowUpdated', this._onRowUpdated);
142
152
  this._instance.on('rowCreated', this._onRowCreated);
143
153
  this._instance.on('rowDeleted', this._onRowDeleted);
@@ -167,10 +177,11 @@ class DataTablePrefRef {
167
177
  * Creates a new DataTablePrefRef from a gadget preference JSON string.
168
178
  *
169
179
  * @param prefValue - The raw gadget preference string (JSON)
180
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
170
181
  * @param options - Optional configuration overrides
171
182
  * @throws Error if the global datatable library is not loaded
172
183
  */
173
- constructor(prefValue, options) {
184
+ constructor(prefValue, zone, options) {
174
185
  const lib = window.gadgets?.['reveldigital.datatable'];
175
186
  if (!lib || typeof lib.createFromPref !== 'function') {
176
187
  throw new Error('RevelDigital DataTable library is not available. ' +
@@ -178,7 +189,7 @@ class DataTablePrefRef {
178
189
  }
179
190
  this._config = lib.createFromPref(prefValue, options);
180
191
  this.pref = this._config.pref;
181
- this.dataTable = DataTableRef._fromInstance(this._config.dt);
192
+ this.dataTable = DataTableRef._fromInstance(this._config.dt, zone);
182
193
  }
183
194
  /**
184
195
  * Fetches rows with the filter and sort settings from the preference automatically applied.
@@ -207,7 +218,7 @@ class DataTablePrefRef {
207
218
  }
208
219
 
209
220
  // Generated by genversion.
210
- const version = '2.2.0';
221
+ const version = '2.3.0';
211
222
 
212
223
  /**
213
224
  * Service for interacting with the Revel Digital player client.
@@ -340,6 +351,7 @@ class PlayerClientService {
340
351
  this.onConfig$.next(null);
341
352
  }
342
353
  }), tap(e => this.onPostMessage$.next(e)));
354
+ this.zone = zone;
343
355
  window.RevelDigital = {
344
356
  Controller: {
345
357
  onCommand: (name, arg) => {
@@ -1027,7 +1039,7 @@ class PlayerClientService {
1027
1039
  * ```
1028
1040
  */
1029
1041
  createDataTable(tableId, options) {
1030
- return new DataTableRef(tableId, options);
1042
+ return new DataTableRef(tableId, this.zone, options);
1031
1043
  }
1032
1044
  /**
1033
1045
  * Creates a typed data table wrapper from a gadget preference value.
@@ -1056,7 +1068,7 @@ class PlayerClientService {
1056
1068
  * ```
1057
1069
  */
1058
1070
  createDataTableFromPref(prefValue, options) {
1059
- return new DataTablePrefRef(prefValue, options);
1071
+ return new DataTablePrefRef(prefValue, this.zone, options);
1060
1072
  }
1061
1073
  // ---
1062
1074
  // PRIVATE METHODS.
@@ -1 +1 @@
1
- {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/datatable-ref.ts","../../../../projects/reveldigital/player-client/src/lib/version.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { Subject } from 'rxjs';\nimport {\n IDataTableChangeEvent,\n IDataTableColumn,\n IDataTableOptions,\n IDataTablePref,\n IDataTableQueryParams,\n IDataTableResult,\n IDataTableSchema\n} from './interfaces/datatable.interface';\n\n/**\n * Angular-friendly wrapper around the global `gadgets.reveldigital.datatable` library.\n *\n * Provides typed Promise-based methods and RxJS Observables for real-time events.\n *\n * ```typescript\n * const dt = this.client.createDataTable('tbl_menu_items');\n *\n * // Fetch rows\n * const result = await dt.getRows({ sort: 'price', sortDir: 'asc' });\n *\n * // Real-time updates\n * dt.rowUpdated$.subscribe(change => console.log('Updated:', change));\n *\n * // Cleanup\n * dt.dispose();\n * ```\n */\nexport class DataTableRef {\n\n /** Emits when an existing row is modified. */\n public rowUpdated$ = new Subject<IDataTableChangeEvent>();\n\n /** Emits when a new row is added. */\n public rowCreated$ = new Subject<IDataTableChangeEvent>();\n\n /** Emits when a row is removed. */\n public rowDeleted$ = new Subject<IDataTableChangeEvent>();\n\n /** @ignore */\n private _instance: any;\n\n /** @ignore */\n private _onRowUpdated!: (change: IDataTableChangeEvent) => void;\n /** @ignore */\n private _onRowCreated!: (change: IDataTableChangeEvent) => void;\n /** @ignore */\n private _onRowDeleted!: (change: IDataTableChangeEvent) => void;\n\n /**\n * Creates a new DataTableRef.\n *\n * @param tableId - The data table ID (e.g. 'tbl_menu_items')\n * @param options - Optional configuration overrides\n * @throws Error if the global datatable library is not loaded\n */\n constructor(tableId: string, options?: IDataTableOptions) {\n\n const lib = (window as any).gadgets?.['reveldigital.datatable'];\n\n if (!lib || typeof lib.create !== 'function') {\n throw new Error(\n 'RevelDigital DataTable library is not available. ' +\n 'Ensure the datatable feature is enabled for this gadget.'\n );\n }\n\n this._instance = lib.create(tableId, options);\n this._wireEvents();\n }\n\n /**\n * Fetches rows from the data table.\n *\n * @param params - Optional query parameters (filter, sort, pagination)\n * @returns Promise resolving to the result set\n *\n * ```typescript\n * const result = await dt.getRows({\n * filter: { category: 'Entree', price: { op: 'lte', value: 25 } },\n * sort: 'itemName',\n * sortDir: 'asc',\n * pageSize: 20\n * });\n * ```\n */\n public getRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._instance.getRows(params);\n }\n\n /**\n * Fetches the table schema (column definitions and metadata).\n *\n * @returns Promise resolving to the table schema\n */\n public getSchema(): Promise<IDataTableSchema> {\n return this._instance.getSchema();\n }\n\n /**\n * Gets visible (non-hidden) columns from the table schema.\n *\n * @returns Promise resolving to an array of visible column definitions\n */\n public getVisibleColumns(): Promise<IDataTableColumn[]> {\n return this._instance.getVisibleColumns();\n }\n\n /**\n * Fetches rows with hidden column data stripped.\n *\n * @param params - Optional query parameters (same as getRows)\n * @returns Promise resolving to the result set with hidden fields removed\n */\n public getVisibleRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._instance.getVisibleRows(params);\n }\n\n /**\n * Starts polling for changes at the given interval.\n * Emits on `rowUpdated$` when new data is detected.\n *\n * @param intervalMs - Polling interval in milliseconds (default 30000)\n */\n public startPolling(intervalMs?: number): void {\n this._instance.startPolling(intervalMs);\n }\n\n /**\n * Stops polling for changes.\n */\n public stopPolling(): void {\n this._instance.stopPolling();\n }\n\n /**\n * Releases all resources: stops polling, closes the real-time connection,\n * removes event listeners, and completes all RxJS observables.\n */\n public dispose(): void {\n this._instance.off('rowUpdated', this._onRowUpdated);\n this._instance.off('rowCreated', this._onRowCreated);\n this._instance.off('rowDeleted', this._onRowDeleted);\n\n this._instance.dispose();\n\n this.rowUpdated$.complete();\n this.rowCreated$.complete();\n this.rowDeleted$.complete();\n }\n\n /** @ignore */\n static _fromInstance(instance: any): DataTableRef {\n const ref = Object.create(DataTableRef.prototype) as DataTableRef;\n ref.rowUpdated$ = new Subject<IDataTableChangeEvent>();\n ref.rowCreated$ = new Subject<IDataTableChangeEvent>();\n ref.rowDeleted$ = new Subject<IDataTableChangeEvent>();\n ref._instance = instance;\n ref._wireEvents();\n return ref;\n }\n\n /** @ignore */\n private _wireEvents(): void {\n this._onRowUpdated = (change: IDataTableChangeEvent) => this.rowUpdated$.next(change);\n this._onRowCreated = (change: IDataTableChangeEvent) => this.rowCreated$.next(change);\n this._onRowDeleted = (change: IDataTableChangeEvent) => this.rowDeleted$.next(change);\n\n this._instance.on('rowUpdated', this._onRowUpdated);\n this._instance.on('rowCreated', this._onRowCreated);\n this._instance.on('rowDeleted', this._onRowDeleted);\n }\n}\n\n\n/**\n * Wrapper around a data table created from a gadget preference value.\n *\n * Automatically configures filter and sort settings from the preference,\n * and provides a `getFilteredRows()` convenience method that applies them.\n *\n * ```typescript\n * const cfg = this.client.createDataTableFromPref(prefs.getString('rdDataTable'));\n *\n * // Fetch rows with auto-wired filter + sort from the preference\n * const result = await cfg.getFilteredRows();\n *\n * // Access the underlying DataTableRef for schema, events, etc.\n * cfg.dataTable.rowUpdated$.subscribe(change => console.log(change));\n *\n * // Cleanup\n * cfg.dispose();\n * ```\n */\nexport class DataTablePrefRef {\n\n /** The underlying DataTableRef with full access to schema, events, polling, etc. */\n public readonly dataTable: DataTableRef;\n\n /** The parsed preference object. */\n public readonly pref: IDataTablePref;\n\n /** @ignore */\n private _config: any;\n\n /**\n * Creates a new DataTablePrefRef from a gadget preference JSON string.\n *\n * @param prefValue - The raw gadget preference string (JSON)\n * @param options - Optional configuration overrides\n * @throws Error if the global datatable library is not loaded\n */\n constructor(prefValue: string, options?: IDataTableOptions) {\n\n const lib = (window as any).gadgets?.['reveldigital.datatable'];\n\n if (!lib || typeof lib.createFromPref !== 'function') {\n throw new Error(\n 'RevelDigital DataTable library is not available. ' +\n 'Ensure the datatable feature is enabled for this gadget.'\n );\n }\n\n this._config = lib.createFromPref(prefValue, options);\n this.pref = this._config.pref;\n this.dataTable = DataTableRef._fromInstance(this._config.dt);\n }\n\n /**\n * Fetches rows with the filter and sort settings from the preference automatically applied.\n * Additional query parameters can override or supplement the preference settings.\n *\n * @param params - Optional additional query parameters\n * @returns Promise resolving to the result set\n *\n * ```typescript\n * // Use preference defaults\n * const result = await cfg.getFilteredRows();\n *\n * // Override page size\n * const page = await cfg.getFilteredRows({ pageSize: 10 });\n * ```\n */\n public getFilteredRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._config.getFilteredRows(params);\n }\n\n /**\n * Releases all resources held by the underlying DataTableRef.\n */\n public dispose(): void {\n this.dataTable.dispose();\n }\n}\n","// Generated by genversion.\nexport const version = '2.2.0'\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { gadgets } from '@reveldigital/gadget-types';\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter, map, share, tap } from 'rxjs/operators';\nimport { IClient } from './interfaces/client.interface';\nimport { ICommand } from './interfaces/command.interface';\nimport { IDictionary } from './interfaces/config.interface';\nimport { IDataTableOptions } from './interfaces/datatable.interface';\nimport { IDevice } from './interfaces/device.interface';\nimport { IEventProperties } from './interfaces/event-properties.interface';\nimport { DataTableRef, DataTablePrefRef } from './datatable-ref';\nimport { version } from './version';\n\n//import { version } from './version.js';\n\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \n// name-space definition to include the Tracker API. This also provides us with a place\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\n// available on the library.\n\n/** @ignore */\ndeclare global {\n let Client: IClient;\n}\n\n/**\n * Service for interacting with the Revel Digital player client.\n * \n * This service provides a comprehensive interface for gadgets and web applications\n * to communicate with the Revel Digital player environment. It handles device\n * information, commands, events, analytics tracking, and configuration management.\n * \n * The service supports both direct API calls and event-based communication patterns,\n * allowing gadgets to respond to player lifecycle events (start, stop, commands) and\n * send data back to the player or remote devices.\n * \n * ```typescript\n * constructor(private client: PlayerClientService) {\n * // Subscribe to player events\n * this.client.onStart$.subscribe(() => {\n * console.log('Gadget started');\n * });\n * \n * this.client.onCommand$.subscribe(command => {\n * console.log('Received command:', command);\n * });\n * }\n * \n * async ngOnInit() {\n * // Get device information\n * const device = await this.client.getDevice();\n * const deviceTime = await this.client.getDeviceTime();\n * \n * // Track analytics\n * this.client.track('gadget_loaded', { version: '1.0' });\n * }\n * ```\n * \n * @since 1.0.0\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PlayerClientService implements OnDestroy {\n\n /** @ignore */\n private clientPromise: Promise<IClient> | null;\n\n /**\n * Observable stream of commands sent to this player from the Revel Digital platform.\n * Subscribe to this to handle custom commands sent from templates, playlists, or remote devices.\n * \n * ```typescript\n * this.client.onCommand$.subscribe(command => {\n * if (command.name === 'customAction') {\n * this.handleCustomAction(command.arg);\n * }\n * });\n * ```\n */\n public onCommand$ = new Subject<ICommand>();\n\n /**\n * Observable that signals when the gadget has been loaded and is ready to start.\n * Emits `true` when ready, `false` when destroyed.\n * \n * ```typescript\n * this.client.onReady$.subscribe(isReady => {\n * if (isReady) {\n * console.log('Client is ready');\n * this.initializeGadget();\n * }\n * });\n * ```\n */\n public onReady$ = new BehaviorSubject(false);\n\n /**\n * Observable that signals when the gadget has been started by the player.\n * This event occurs when the player begins execution of the gadget content.\n * \n * ```typescript\n * this.client.onStart$.subscribe(() => {\n * console.log('Gadget started');\n * this.startAnimation();\n * });\n * ```\n */\n public onStart$ = new Subject();\n\n /**\n * Observable that signals when the gadget has been stopped by the player.\n * This event occurs when the player stops execution, typically when moving\n * to the next item in a playlist or when the content duration expires.\n * \n * ```typescript\n * this.client.onStop$.subscribe(() => {\n * console.log('Gadget stopped');\n * this.cleanup();\n * });\n * ```\n */\n public onStop$ = new Subject();\n\n /**\n * Observable that signals when the gadget should open the configuration window.\n * This allows gadgets to respond to configuration requests from the player.\n * \n * ```typescript\n * this.client.onConfig$.subscribe(() => {\n * this.openConfigurationDialog();\n * });\n * ```\n */\n public onConfig$ = new Subject();\n\n /**\n * Observable that signals when the gadget has received a postMessage event from the player.\n * This handles communication between the gadget and player via the postMessage API.\n * \n * ```typescript\n * this.client.onPostMessage$.subscribe(message => {\n * console.log('Received message:', message);\n * this.handlePlayerMessage(message);\n * });\n * ```\n */\n public onPostMessage$ = new Subject();\n\n //\n // Two methods available for calling into the library:\n //\n // 1) Using dispatchEvent() with the following custom events\n // 2) Using the window scoped RevelDigital object as defined in the constructor\n //\n /** @ignore */\n private onStartSub: Subscription;\n /** @ignore */\n private onStartEvt$ = fromEvent(window, 'RevelDigital.Start').pipe(\n share(),\n tap(this.onStart$)\n );\n /** @ignore */\n private onStopSub: Subscription;\n /** @ignore */\n private onStopEvt$ = fromEvent(window, 'RevelDigital.Stop').pipe(\n share(),\n tap(this.onStop$)\n );\n /** @ignore */\n private onCommandSub: Subscription;\n /** @ignore */\n private onCommandEvt$ = fromEvent<ICommand>(window, 'RevelDigital.Command').pipe(\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\n share(),\n tap(this.onCommand$)\n );\n /** @ignore */\n // private onConfigSub: Subscription;\n // /** @ignore */\n // private onConfigEvt$ = fromEvent(window, 'RevelDigital.Config').pipe(\n // share(),\n // tap((e: CustomEvent) => {\n // console.log(e);\n\n // if (e.detail.type === 'applyConfig' && e.detail.isOpener) {\n // this.applyConfig(e.detail.config); // propagate config to iframe parent from the popup window\n // } else {\n // this.onConfig$.next(e.detail);\n // }\n // })\n // );\n // private onPostMessageSub: Subscription;\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\n // filter((messageEvent: MessageEvent) =>\n // messageEvent.source !== window.parent &&\n // typeof messageEvent.data === 'string' &&\n // messageEvent.data.startsWith('reveldigital:')),\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\n // share(),\n // tap(this.onCommand$)\n // );\n\n private onPostMessageSub: Subscription;\n private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\n filter((messageEvent: MessageEvent) =>\n //messageEvent.source !== window.parent &&\n typeof messageEvent.data === 'string'),\n map((e: any) => JSON.parse(e.data)),\n share(),\n tap((e: any) => {\n if (e.type === 'applyConfig' && e.isOpener) {\n e.isOpener = false;\n // propagate config to iframe parent from the popup window\n window.parent.postMessage(\n JSON.stringify(e),\n '*'\n );\n } else if (e.type === 'openConfig') {\n this.onConfig$.next(null);\n }\n }),\n tap(e => this.onPostMessage$.next(e))\n );\n\n\n /** @ignore */\n constructor(zone: NgZone) {\n\n (window as any).RevelDigital = {\n Controller: {\n onCommand: (name: string, arg: string) => {\n zone.run(() => {\n this.onCommand$.next({ name: name, arg: arg });\n });\n },\n onStart: () => {\n zone.run(() => {\n this.onStart$.next(null);\n });\n },\n onStop: () => {\n zone.run(() => {\n this.onStop$.next(null);\n });\n }\n }\n }\n\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\n //this.onConfigSub = this.onConfigEvt$.subscribe(() => { });\n this.onPostMessageSub = this.onPostMessageEvt$.subscribe(() => { });\n\n this.clientPromise = null;\n\n this.onReady$.next(true);\n }\n\n /** @ignore */\n ngOnDestroy(): void {\n\n this.onStartSub?.unsubscribe();\n this.onStopSub?.unsubscribe();\n this.onCommandSub?.unsubscribe();\n //this.onConfigSub?.unsubscribe();\n this.onPostMessageSub?.unsubscribe();\n\n this.onReady$.next(false);\n }\n\n /** @ignore */\n public static init(data: any) {\n\n console.log(\n '%c⚙️ Initializing Revel Digital client library',\n 'background-color:blue; color:yellow;'\n );\n }\n\n /**\n * Sends a callback to player scripting with variable arguments.\n * \n * This method allows the gadget to communicate with player scripting.\n * If the appropriate scripting is in place in the currently running template, \n * calling this method will initiate a callback which can be acted upon in player script.\n * \n * @param args - Variable number of arguments to pass to the callback (max 5 arguments)\n * \n * ```typescript\n * // Send a simple callback\n * this.client.callback('test', 'data');\n * \n * // Send multiple parameters\n * this.client.callback('action', 'value1', 'value2', { data: 'object' });\n * ```\n */\n public callback(...args: any[]): void {\n\n this.getClient().then((client) => {\n\n switch (args.length) {\n case 0:\n client.callback();\n break;\n case 1:\n client.callback(args[0]);\n break;\n case 2:\n client.callback(args[1]);\n break;\n case 3:\n client.callback(args[2]);\n break;\n case 4:\n client.callback(args[3]);\n break;\n case 5:\n client.callback(args[4]);\n break;\n }\n })\n }\n\n /**\n * Gets the user preferences interface exposed by the Google Gadgets API.\n * \n * This method provides access to gadget preferences which can be configured\n * in the Revel Digital CMS. Use this to retrieve user-configurable settings\n * for your gadget.\n * \n * @returns The Gadgets API Prefs object for accessing preference values\n * \n * ```typescript\n * constructor(public client: PlayerClientService) {\n * const prefs = client.getPrefs();\n * const myString = prefs.getString('myStringPref');\n * const myNumber = prefs.getInt('myNumberPref');\n * const myBool = prefs.getBool('myBoolPref');\n * }\n * ```\n * \n * @see {@link https://developers.google.com/gadgets/docs/basic} Google Gadgets API documentation\n */\n public getPrefs(): gadgets.Prefs {\n\n return new window['gadgets']['Prefs']();\n }\n\n /**\n * Gets the current device time in ISO8601 format.\n * \n * Current device time is determined by the device timezone assigned to the device in the CMS.\n * This is useful for displaying time-sensitive content or scheduling operations based on\n * the device's local time rather than browser time.\n * \n * @param date - Optional. If supplied, will translate the supplied date/time to device time based on respective timezones\n * @returns Promise resolving to date/time in ISO8601 format\n * \n * ```typescript\n * // Get current device time\n * const currentTime = await this.client.getDeviceTime();\n * console.log('Device time:', currentTime);\n * \n * // Convert a specific date to device time\n * const specificDate = new Date('2023-01-01T12:00:00Z');\n * const deviceTime = await this.client.getDeviceTime(specificDate);\n * ```\n */\n public async getDeviceTime(date?: Date): Promise<string> {\n\n const client = await this.getClient();\n\n if (date !== undefined) {\n return client.getDeviceTime(date);\n }\n return client.getDeviceTime();\n }\n\n /**\n * Gets the timezone name currently assigned to the device.\n * \n * @returns Promise resolving to the timezone name (e.g., \"America/New_York\")\n * \n * ```typescript\n * const timezoneName = await this.client.getDeviceTimeZoneName();\n * console.log('Device timezone:', timezoneName);\n * ```\n */\n public async getDeviceTimeZoneName(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneName();\n }\n\n /**\n * Gets the timezone ID currently assigned to the device.\n * \n * @returns Promise resolving to the timezone ID\n * \n * ```typescript\n * const timezoneId = await this.client.getDeviceTimeZoneID();\n * console.log('Device timezone ID:', timezoneId);\n * ```\n */\n public async getDeviceTimeZoneID(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneID();\n }\n\n /**\n * Gets the numerical offset from GMT of the timezone currently assigned to the device.\n * \n * @returns Promise resolving to the timezone offset in hours (e.g., -5 for EST)\n * \n * ```typescript\n * const offset = await this.client.getDeviceTimeZoneOffset();\n * console.log('Device timezone offset:', offset, 'hours from GMT');\n * ```\n */\n public async getDeviceTimeZoneOffset(): Promise<number> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneOffset();\n }\n\n /**\n * Gets the language code of the language currently assigned to the device.\n * \n * @returns Promise resolving to the language code (e.g., \"en-US\", \"fr-FR\")\n * \n * ```typescript\n * const languageCode = await this.client.getLanguageCode();\n * console.log('Device language:', languageCode);\n * // Use for localization\n * this.loadLanguageResources(languageCode);\n * ```\n */\n public async getLanguageCode(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getLanguageCode();\n }\n\n /**\n * Gets the unique Revel Digital device key associated with the device.\n * \n * The device key is a unique identifier for this specific player device\n * and can be used for device-specific operations or remote commands.\n * \n * @returns Promise resolving to the device key string\n * \n * ```typescript\n * const deviceKey = await this.client.getDeviceKey();\n * console.log('Device key:', deviceKey);\n * ```\n */\n public async getDeviceKey(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceKey();\n }\n\n /**\n * Sends a command to the local player device.\n * \n * Commands can be used to control various aspects of the player or trigger\n * specific behaviors. The command is processed by the local player only.\n * \n * @param name - The command name/identifier\n * @param arg - The command argument/payload\n * \n * ```typescript\n * // Send a simple command\n * this.client.sendCommand('refresh', '');\n * \n * // Send a command with data\n * this.client.sendCommand('setVolume', '50');\n * \n * // Send a command with JSON data\n * this.client.sendCommand('configure', JSON.stringify({ setting: 'value' }));\n * ```\n */\n public sendCommand(name: string, arg: string): void {\n\n this.getClient().then((client) => {\n client.sendCommand(name, arg);\n })\n }\n\n /**\n * Sends a command to remote player devices with the specified device keys.\n * \n * Remote commands allow cross-device communication within the same Revel Digital account.\n * This is useful for synchronized displays, device coordination, or remote control scenarios.\n * \n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\n * \n * @param deviceKeys - Array of target device keys to send the command to\n * @param name - The command name/identifier\n * @param arg - The command argument/payload\n * \n * ```typescript\n * // Send command to specific devices\n * const targetDevices = ['device-key-1', 'device-key-2'];\n * this.client.sendRemoteCommand(targetDevices, 'syncAction', 'start');\n * \n * // Broadcast to multiple devices\n * this.client.sendRemoteCommand(\n * ['lobby-display', 'kiosk-1', 'kiosk-2'], \n * 'updateContent', \n * JSON.stringify({ contentId: '12345' })\n * );\n * ```\n */\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\n\n this.getClient().then((client) => {\n client.sendRemoteCommand(deviceKeys, name, arg);\n });\n }\n\n /**\n * Logs an analytics event for use with AdHawk analytics and reporting.\n * \n * Events are used for tracking various metrics including usage statistics, \n * player condition, state changes, user interactions, and custom business metrics.\n * These events can be viewed in the Revel Digital analytics dashboard.\n * \n * @param eventName - Unique name for this event (should be descriptive and consistent)\n * @param properties - Optional map of user-defined properties to associate with this event\n * \n * ```typescript\n * // Simple event tracking\n * this.client.track('gadget_loaded');\n * \n * // Event with properties\n * this.client.track('user_interaction', {\n * action: 'button_click',\n * button_id: 'start_button',\n * timestamp: new Date().toISOString()\n * });\n * \n * // Performance tracking\n * this.client.track('content_displayed', {\n * content_type: 'video',\n * duration: 30,\n * quality: 'HD'\n * });\n * ```\n */\n public track(eventName: string, properties?: IEventProperties): void {\n\n this.getClient().then((client) => {\n client.track(eventName, JSON.stringify(properties));\n })\n }\n\n /**\n * Initiates a timed event for duration tracking.\n * \n * Timed events are useful for tracking the duration of operations or user interactions.\n * This method must be followed by a call to track() with the same event name to complete\n * the timing measurement. The duration will be automatically calculated and included\n * in the event properties.\n * \n * @param eventName - Unique name for this timed event (must match the subsequent track() call)\n * \n * ```typescript\n * // Start timing an event\n * this.client.timeEvent('video_playback');\n * \n * // ... video plays for some duration ...\n * \n * // End timing and log the event with duration\n * this.client.track('video_playback', {\n * video_id: 'abc123',\n * quality: 'HD'\n * }); // Duration will be automatically added\n * \n * // Example for user interaction timing\n * this.client.timeEvent('form_completion');\n * // ... user fills out form ...\n * this.client.track('form_completion', { form_type: 'contact' });\n * ```\n */\n public timeEvent(eventName: string): void {\n\n this.getClient().then((client) => {\n client.timeEvent(eventName);\n })\n }\n\n /**\n * Creates a new analytics event session for grouping related events.\n * \n * A session is a way of grouping events together for analysis. Each event tracked\n * after calling this method will have the same session ID until a new session is created.\n * Session IDs are randomly generated unless explicitly provided.\n * \n * This is useful for tracking user journeys, workflow completion, or grouping\n * related interactions within a specific time period.\n * \n * @param id - Optional user-supplied session ID. If not provided, a random session ID will be generated\n * \n * ```typescript\n * // Start a new session with auto-generated ID\n * this.client.newEventSession();\n * this.client.track('session_start');\n * this.client.track('user_action_1');\n * this.client.track('user_action_2');\n * \n * // Start a session with custom ID\n * this.client.newEventSession('user-workflow-12345');\n * this.client.track('workflow_start');\n * this.client.track('step_completed', { step: 1 });\n * \n * // Start a new session for different workflow\n * this.client.newEventSession();\n * this.client.track('different_workflow_start');\n * ```\n */\n public newEventSession(id?: string): void {\n\n this.getClient().then((client) => {\n if (id !== undefined) {\n client.newEventSession();\n } else {\n client.newEventSession(id);\n }\n })\n }\n\n /**\n * Gets the root folder path utilized by this player device.\n * \n * This returns the base directory path where the Revel Digital player\n * stores its files and resources on the local device.\n * \n * @returns Promise resolving to the path of the root folder\n * \n * ```typescript\n * const rootPath = await this.client.getRevelRoot();\n * console.log('Player root directory:', rootPath);\n * // Use for constructing file paths or understanding storage structure\n * ```\n */\n public async getRevelRoot(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getRevelRoot();\n }\n\n /**\n * Gets a map of commands currently active for this device.\n * \n * This returns the current command configuration that defines how the device\n * responds to various command triggers and remote commands.\n * \n * @returns Promise resolving to a map of currently active commands\n * \n * ```typescript\n * const commandMap = await this.client.getCommandMap();\n * console.log('Active commands:', commandMap);\n * \n * // Check if specific command is available\n * if (commandMap['customCommand']) {\n * console.log('Custom command is available');\n * }\n * ```\n */\n public async getCommandMap(): Promise<any> {\n\n const client = await this.getClient();\n\n return JSON.parse(await client.getCommandMap());\n }\n\n /**\n * Signals to the player that this gadget has completed its visualization.\n * \n * This method notifies the player that the current gadget has finished its\n * content display or interaction cycle. The player can then proceed with\n * the next item in a playlist if applicable, or handle the completion\n * according to its configuration.\n * \n * Call this method when your gadget has completed its intended function,\n * such as finishing an animation, completing a form, or reaching a natural\n * stopping point.\n * \n * ```typescript\n * // After completing an animation\n * private onAnimationComplete(): void {\n * this.client.finish();\n * }\n * \n * // After user interaction is complete\n * private onFormSubmitted(): void {\n * this.saveFormData();\n * this.client.finish();\n * }\n * \n * // After a timed display period\n * setTimeout(() => {\n * this.client.finish();\n * }, 30000); // 30 seconds\n * ```\n */\n public finish(): void {\n\n this.getClient().then((client) => {\n\n client.finish();\n })\n }\n\n /**\n * Checks if the gadget is running in preview mode.\n * \n * Preview mode is enabled when the gadget is being edited in the Revel Digital CMS,\n * tested in the gadget editor, or otherwise not running in a normal player environment.\n * This is useful for providing different behavior during development/testing versus\n * production deployment.\n * \n * @returns Promise resolving to true if running in preview mode, false if running on actual player\n * \n * ```typescript\n * const isPreview = await this.client.isPreviewMode();\n * \n * if (isPreview) {\n * console.log('Running in preview mode - using mock data');\n * this.loadMockData();\n * } else {\n * console.log('Running on player device - using live data');\n * this.loadLiveData();\n * }\n * \n * // Show different UI in preview\n * this.showPreviewIndicator = isPreview;\n * ```\n */\n public async isPreviewMode(): Promise<boolean> {\n\n const client = await this.getClient();\n\n return client instanceof NoopClient;\n }\n\n /**\n * Gets detailed information about the device running the player.\n * \n * Returns comprehensive device details including name, registration key, type,\n * service date, language, timezone, tags, and location information. This data\n * is configured in the Revel Digital CMS for each device.\n * \n * @returns Promise resolving to device details object, or null if not available\n * \n * ```typescript\n * const device = await this.client.getDevice();\n * \n * if (device) {\n * console.log('Device name:', device.name);\n * console.log('Device type:', device.deviceType);\n * console.log('Location:', device.location.city, device.location.state);\n * console.log('Tags:', device.tags);\n * \n * // Use device info for customization\n * if (device.location.country === 'US') {\n * this.loadUSContent();\n * }\n * \n * // Check device capabilities based on type\n * if (device.deviceType === 'android') {\n * this.enableTouchFeatures();\n * }\n * }\n * ```\n */\n public async getDevice(): Promise<IDevice | null> {\n\n const client = await this.getClient();\n\n const obj: any = JSON.parse(<string>await client.getDevice());\n\n const device: IDevice[] = [obj].map((device: any) => {\n\n return {\n name: device.name,\n registrationKey: device.key,\n deviceType: device.devicetype,\n enteredService: new Date(device.enteredservice),\n langCode: device.langcode,\n timeZone: device.timezone,\n tags: device.description?.split('\\n'),\n location: {\n city: device.location?.city,\n state: device.location?.state,\n country: device.location?.country,\n postalCode: device.location?.postalcode,\n address: device.location?.address,\n latitude: device.location?.latitude,\n longitude: device.location?.longitude\n }\n }\n });\n return device[0];\n }\n\n /**\n * Gets the width of the visualization area in pixels.\n * \n * This returns the available width for content display, which may be\n * different from the full screen width depending on player configuration\n * and template layout.\n * \n * @returns Promise resolving to width in pixels, or null if not available\n * \n * ```typescript\n * const width = await this.client.getWidth();\n * \n * if (width) {\n * console.log('Available width:', width, 'pixels');\n * \n * // Adapt content layout based on width\n * if (width < 800) {\n * this.enableMobileLayout();\n * } else {\n * this.enableDesktopLayout();\n * }\n * }\n * ```\n */\n public async getWidth(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getWidth();\n }\n\n /**\n * Gets the height of the visualization area in pixels.\n * \n * This returns the available height for content display, which may be\n * different from the full screen height depending on player configuration\n * and template layout.\n * \n * @returns Promise resolving to height in pixels, or null if not available\n * \n * ```typescript\n * const height = await this.client.getHeight();\n * \n * if (height) {\n * console.log('Available height:', height, 'pixels');\n * \n * // Calculate aspect ratio for responsive design\n * const width = await this.client.getWidth();\n * const aspectRatio = width / height;\n * this.adjustContentForAspectRatio(aspectRatio);\n * }\n * ```\n */\n public async getHeight(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getHeight();\n }\n\n /**\n * Gets the duration of the currently playing content item.\n * \n * This method is only applicable when the gadget is associated with a playlist\n * and returns the duration assigned to the current playlist item. The duration\n * determines how long the content should be displayed before moving to the next item.\n * \n * @returns Promise resolving to duration in milliseconds, or null if not applicable/available\n * \n * ```typescript\n * const duration = await this.client.getDuration();\n * \n * if (duration) {\n * console.log('Content duration:', duration, 'milliseconds');\n * \n * // Set up auto-finish timer\n * setTimeout(() => {\n * this.client.finish();\n * }, duration);\n * \n * // Show progress indicator\n * this.startProgressIndicator(duration);\n * }\n * ```\n */\n public async getDuration(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getDuration();\n }\n\n /**\n * Gets the current version of the Revel Digital SDK.\n * \n * @returns Promise resolving to the SDK version string\n * \n * ```typescript\n * const version = await this.client.getSdkVersion();\n * console.log('SDK Version:', version);\n * \n * // Use for compatibility checks or logging\n * this.client.track('gadget_loaded', { sdkVersion: version });\n * ```\n */\n public async getSdkVersion(): Promise<string> {\n\n return Promise.resolve(version);\n }\n\n /**\n * Applies configuration preferences to the gadget (preview mode only).\n * \n * This method is only available when running in preview mode (typically during\n * gadget development or testing in the CMS). It allows applying configuration\n * changes that would normally come from the gadget's preference settings.\n * \n * @param prefs - Dictionary of preference key-value pairs to apply\n * \n * ```typescript\n * if (await this.client.isPreviewMode()) {\n * // Apply test configuration in preview\n * await this.client.applyConfig({\n * 'title': 'Test Title',\n * 'backgroundColor': '#ff0000',\n * 'showBorder': true,\n * 'refreshInterval': 30\n * });\n * }\n * ```\n */\n public async applyConfig(prefs: IDictionary<any>) {\n\n if (await this.isPreviewMode()) {\n const client = await this.getClient();\n client.applyConfig(prefs);\n } else {\n console.log(\n '%capplyConfig() is only available in preview mode.',\n 'background-color:blue; color:yellow;'\n );\n }\n }\n\n /**\n * Creates a typed wrapper for a Revel Digital data table.\n *\n * The data table feature must be enabled for the gadget. The returned\n * {@link DataTableRef} provides typed Promise-based methods and RxJS\n * Observables for real-time row change events.\n *\n * @param tableId - The data table ID (e.g. 'tbl_menu_items')\n * @param options - Optional configuration overrides\n * @returns A {@link DataTableRef} instance\n * @throws Error if the global datatable library is not loaded\n *\n * ```typescript\n * const dt = this.client.createDataTable('tbl_menu_items');\n *\n * // Fetch rows with filtering and sorting\n * const result = await dt.getRows({\n * filter: { category: 'Entree', price: { op: 'lte', value: 25 } },\n * sort: 'price',\n * sortDir: 'asc'\n * });\n *\n * // Subscribe to real-time updates\n * dt.rowUpdated$.subscribe(change => console.log('Row updated:', change));\n * dt.rowCreated$.subscribe(change => console.log('Row created:', change));\n * dt.rowDeleted$.subscribe(change => console.log('Row deleted:', change));\n *\n * // Cleanup when done\n * dt.dispose();\n * ```\n */\n public createDataTable(tableId: string, options?: IDataTableOptions): DataTableRef {\n return new DataTableRef(tableId, options);\n }\n\n /**\n * Creates a typed data table wrapper from a gadget preference value.\n *\n * The preference JSON string (as serialized by the template editor's datatable\n * option) is parsed and used to auto-configure filter, sort, and logic settings.\n * The returned {@link DataTablePrefRef} provides a `getFilteredRows()` convenience\n * method that applies these settings automatically.\n *\n * @param prefValue - The raw gadget preference string (JSON)\n * @param options - Optional configuration overrides\n * @returns A {@link DataTablePrefRef} instance\n * @throws Error if the global datatable library is not loaded\n *\n * ```typescript\n * const cfg = this.client.createDataTableFromPref(prefs.getString('rdDataTable'));\n *\n * // Fetch rows with auto-wired filter + sort\n * const result = await cfg.getFilteredRows();\n *\n * // Access the underlying DataTableRef for events, schema, etc.\n * cfg.dataTable.rowUpdated$.subscribe(change => console.log(change));\n *\n * // Cleanup when done\n * cfg.dispose();\n * ```\n */\n public createDataTableFromPref(prefValue: string, options?: IDataTableOptions): DataTablePrefRef {\n return new DataTablePrefRef(prefValue, options);\n }\n\n // ---\n // PRIVATE METHODS.\n // ---\n /** @ignore */\n private getClient(): Promise<IClient> {\n\n if (this.clientPromise) {\n\n return (this.clientPromise);\n }\n\n if ((window as any).Client) {\n\n return (this.clientPromise = Promise.resolve((window as any).Client));\n }\n\n // A \"complete\" status indicates that the \"load\" event has been fired on the\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\n // been loaded.\n if (window.document.readyState === \"complete\") {\n\n // If this event has fired AND the 3rd-party script isn't available (see IF-\n // condition BEFORE this one), it means that the 3rd-party script either\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\n // fall-back to using a mock API.\n return (this.clientPromise = Promise.resolve(new NoopClient()));\n }\n\n // ASSERT: If we made it this far, the document has not completed loading (but it\n // may be in an \"interactive\" state which is when I believe that the Angular app\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\n // third-party scripts to load (or fail to load, or be blocked).\n this.clientPromise = new Promise<IClient>(\n (resolve) => {\n\n window.addEventListener(\n \"load\",\n function handleWindowLoad() {\n\n // At this point, the 3rd-party library is either available or\n // it's not - there's no further loading to do. If it's not\n // present on the global scope, we're going to fall-back to using\n // a mock API.\n resolve((window as any).Client || new NoopClient());\n }\n );\n\n }\n );\n\n return (this.clientPromise);\n }\n}\n\n\n\n// ----------------------------------------------------------------------------------- //\n// ----------------------------------------------------------------------------------- //\n\n/**\n * Mock implementation of the IClient interface.\n * \n * This class provides a no-operation (NOOP) implementation of the client API\n * that allows consuming code to function normally even when the actual player\n * API is not available. This typically occurs during development, testing,\n * or when the player script is blocked by ad-blockers.\n * \n * All methods in this class either return null/empty values or perform no\n * operations, allowing gadgets to function without errors while providing\n * appropriate fallback behavior.\n * \n * @private\n */\nclass NoopClient implements IClient {\n\n constructor() {\n\n console.log(\n '%cClient API not available, falling back to mock API',\n 'background-color:blue; color:yellow;'\n );\n }\n\n public callback(...args: any[]): void {\n\n // NOOP implement, nothing to do....\n }\n\n public getDeviceTime(date?: Date): Promise<string> {\n\n return Promise.resolve(new Date().toISOString());\n }\n\n public async getDeviceTimeZoneName(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceTimeZoneID(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceTimeZoneOffset(): Promise<number> {\n\n return Promise.resolve(null);\n }\n\n public async getLanguageCode(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceKey(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public sendCommand(name: string, arg: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\n\n // NOOP implement, nothing to do....\n }\n\n public track(eventName: string, properties?: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public timeEvent(eventName: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public newEventSession(id?: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public async getRevelRoot(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getCommandMap(): Promise<string> {\n\n return Promise.resolve('{}');\n }\n\n public finish(): void {\n\n // NOOP implement, nothing to do....\n }\n\n public async getDevice(): Promise<string | null> {\n\n return Promise.resolve(null);\n }\n\n public async getWidth(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getHeight(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getDuration(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getSdkVersion(): Promise<string> {\n\n return Promise.resolve(version);\n }\n\n public applyConfig(prefs: IDictionary<any>): void {\n\n const evt = { type: 'applyConfig', prefs: prefs, isOpener: window.opener !== null };\n\n if (window.opener) {\n window.opener.postMessage(\n JSON.stringify(evt),\n '*'\n );\n } else {\n window.parent.postMessage(\n JSON.stringify(evt),\n '*'\n );\n }\n }\n}\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\nimport { HttpClient } from \"@angular/common/http\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport * as yaml from \"js-yaml\";\nimport * as WebFont from 'webfontloader';\n\nconst isLocal: boolean = /localhost/.test(document.location.host);\n!isLocal && enableProdMode();\n\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class AppInitService {\n\n constructor(\n public http: HttpClient,\n private _route: ActivatedRoute,\n private _router: Router) {\n }\n\n init(): Promise<any> {\n\n return new Promise<void>((resolve) => {\n\n this.loadFonts();\n\n if (isDevMode()) {\n console.log(\n '%cRunning in development mode',\n 'background-color:blue; color:yellow;'\n );\n\n /**\n * Shim the shindig prefs functionality for dev mode\n */\n (<any>window).gadgets = {\n\n Prefs: class {\n getString(key: string) { return this.getParameterByName(key) }\n\n getArray(key: string) { return this.getParameterByName(key).split(',') }\n\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\n\n getCountry() { }\n\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\n\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\n\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\n\n getParameterByName(name: string, search = window.location.href): string {\n\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(search);\n if (!results) return '';\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n }\n };\n\n this.http.get('assets/gadget.yaml', {\n responseType: 'text'\n }).subscribe({\n next: (data) => {\n const doc: any = yaml.load(data);\n const params: any = {}\n for (const val of doc.prefs) {\n params[val.name] = val.default_value\n }\n\n this._router.navigate([], {\n relativeTo: this._route,\n queryParams: params,\n });\n\n console.log(\n `%cUser prefs loaded successfully`,\n 'background-color:blue; color:yellow;'\n );\n },\n error: (err) => {\n console.log(\n `%cUnable to load user preferences YAML definition file: ${err}`,\n 'background-color:blue; color:yellow;'\n );\n console.log(\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\n 'background-color:red; color:yellow;'\n )\n }\n })\n }\n resolve();\n });\n }\n\n\n private getFamilyName(css) {\n\n const FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\n if (FONT_FAMILY_REGEX.test(css)) {\n const matches = css.match(FONT_FAMILY_REGEX);\n return matches[1].split(',')[0];\n } else {\n return '';\n }\n }\n\n /**\n * Loads the given font from Google Web Fonts.\n */\n private loadFonts(): void {\n\n const parameters = new URLSearchParams(window.location.search);\n parameters.forEach((val, key) => {\n try {\n const fontFamily = this.getFamilyName(val);\n if (fontFamily !== '') {\n WebFont.load({\n google: {\n families: [fontFamily]\n },\n fontactive: (familyName) => {\n console.log(`%cActivating font: ${familyName}`,\n 'background-color:blue; color:yellow;');\n },\n fontinactive: (familyName) => {\n console.log(`%cFont inactive: ${familyName}`,\n 'background-color:red; color:yellow;');\n }\n });\n }\n } catch (e) {\n }\n });\n }\n}\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n/**\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\n * \n * ```html\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\n * ```\n */\n@Pipe({\n name: 'safeStyle',\n standalone: true,\n})\nexport class SafeStylePipe implements PipeTransform {\n constructor(private sanitized: DomSanitizer) { }\n\n transform(value: any): unknown {\n return this.sanitized.bypassSecurityTrustStyle(value);\n }\n}\n\n@NgModule({\n imports: [SafeStylePipe],\n exports: [SafeStylePipe],\n})\nexport class NgSafeStylePipeModule { }\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare const gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';\nexport * from './lib/datatable-ref';\nexport * from './lib/interfaces/datatable.interface';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"reveldigital-player-client.mjs","sources":["../../../../projects/reveldigital/player-client/src/lib/datatable-ref.ts","../../../../projects/reveldigital/player-client/src/lib/version.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts","../../../../projects/reveldigital/player-client/src/lib/app-init.service.ts","../../../../projects/reveldigital/player-client/src/lib/safe-style.pipe.ts","../../../../projects/reveldigital/player-client/src/lib/player-client.module.ts","../../../../projects/reveldigital/player-client/src/public-api.ts","../../../../projects/reveldigital/player-client/src/reveldigital-player-client.ts"],"sourcesContent":["import { NgZone } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport {\n IDataTableChangeEvent,\n IDataTableColumn,\n IDataTableOptions,\n IDataTablePref,\n IDataTableQueryParams,\n IDataTableResult,\n IDataTableSchema\n} from './interfaces/datatable.interface';\n\n/**\n * Angular-friendly wrapper around the global `gadgets.reveldigital.datatable` library.\n *\n * Provides typed Promise-based methods and RxJS Observables for real-time events.\n * All event emissions run inside Angular's zone to ensure change detection triggers.\n *\n * ```typescript\n * const dt = this.client.createDataTable('tbl_menu_items');\n *\n * // Fetch rows\n * const result = await dt.getRows({ sort: 'price', sortDir: 'asc' });\n *\n * // Real-time updates\n * dt.rowUpdated$.subscribe(change => console.log('Updated:', change));\n *\n * // Cleanup\n * dt.dispose();\n * ```\n */\nexport class DataTableRef {\n\n /** Emits when an existing row is modified. */\n public rowUpdated$ = new Subject<IDataTableChangeEvent>();\n\n /** Emits when a new row is added. */\n public rowCreated$ = new Subject<IDataTableChangeEvent>();\n\n /** Emits when a row is removed. */\n public rowDeleted$ = new Subject<IDataTableChangeEvent>();\n\n /** @ignore */\n private _instance: any;\n\n /** @ignore */\n private _zone: NgZone;\n\n /** @ignore */\n private _onRowUpdated!: (change: IDataTableChangeEvent) => void;\n /** @ignore */\n private _onRowCreated!: (change: IDataTableChangeEvent) => void;\n /** @ignore */\n private _onRowDeleted!: (change: IDataTableChangeEvent) => void;\n\n /**\n * Creates a new DataTableRef.\n *\n * @param tableId - The data table ID (e.g. 'tbl_menu_items')\n * @param zone - Angular NgZone for ensuring change detection on callbacks\n * @param options - Optional configuration overrides\n * @throws Error if the global datatable library is not loaded\n */\n constructor(tableId: string, zone: NgZone, options?: IDataTableOptions) {\n\n this._zone = zone;\n\n const lib = (window as any).gadgets?.['reveldigital.datatable'];\n\n if (!lib || typeof lib.create !== 'function') {\n throw new Error(\n 'RevelDigital DataTable library is not available. ' +\n 'Ensure the datatable feature is enabled for this gadget.'\n );\n }\n\n this._instance = lib.create(tableId, options);\n this._wireEvents();\n }\n\n /**\n * Fetches rows from the data table.\n *\n * @param params - Optional query parameters (filter, sort, pagination)\n * @returns Promise resolving to the result set\n *\n * ```typescript\n * const result = await dt.getRows({\n * filter: { category: 'Entree', price: { op: 'lte', value: 25 } },\n * sort: 'itemName',\n * sortDir: 'asc',\n * pageSize: 20\n * });\n * ```\n */\n public getRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._instance.getRows(params);\n }\n\n /**\n * Fetches the table schema (column definitions and metadata).\n *\n * @returns Promise resolving to the table schema\n */\n public getSchema(): Promise<IDataTableSchema> {\n return this._instance.getSchema();\n }\n\n /**\n * Gets visible (non-hidden) columns from the table schema.\n *\n * @returns Promise resolving to an array of visible column definitions\n */\n public getVisibleColumns(): Promise<IDataTableColumn[]> {\n return this._instance.getVisibleColumns();\n }\n\n /**\n * Fetches rows with hidden column data stripped.\n *\n * @param params - Optional query parameters (same as getRows)\n * @returns Promise resolving to the result set with hidden fields removed\n */\n public getVisibleRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._instance.getVisibleRows(params);\n }\n\n /**\n * Starts polling for changes at the given interval.\n * Emits on `rowUpdated$` when new data is detected.\n *\n * @param intervalMs - Polling interval in milliseconds (default 30000)\n */\n public startPolling(intervalMs?: number): void {\n this._instance.startPolling(intervalMs);\n }\n\n /**\n * Stops polling for changes.\n */\n public stopPolling(): void {\n this._instance.stopPolling();\n }\n\n /**\n * Releases all resources: stops polling, closes the real-time connection,\n * removes event listeners, and completes all RxJS observables.\n */\n public dispose(): void {\n this._instance.off('rowUpdated', this._onRowUpdated);\n this._instance.off('rowCreated', this._onRowCreated);\n this._instance.off('rowDeleted', this._onRowDeleted);\n\n this._instance.dispose();\n\n this.rowUpdated$.complete();\n this.rowCreated$.complete();\n this.rowDeleted$.complete();\n }\n\n /** @ignore */\n static _fromInstance(instance: any, zone: NgZone): DataTableRef {\n const ref = Object.create(DataTableRef.prototype) as DataTableRef;\n ref.rowUpdated$ = new Subject<IDataTableChangeEvent>();\n ref.rowCreated$ = new Subject<IDataTableChangeEvent>();\n ref.rowDeleted$ = new Subject<IDataTableChangeEvent>();\n ref._instance = instance;\n ref._zone = zone;\n ref._wireEvents();\n return ref;\n }\n\n /** @ignore */\n private _wireEvents(): void {\n this._onRowUpdated = (change: IDataTableChangeEvent) => {\n this._zone.run(() => this.rowUpdated$.next(change));\n };\n this._onRowCreated = (change: IDataTableChangeEvent) => {\n this._zone.run(() => this.rowCreated$.next(change));\n };\n this._onRowDeleted = (change: IDataTableChangeEvent) => {\n this._zone.run(() => this.rowDeleted$.next(change));\n };\n\n this._instance.on('rowUpdated', this._onRowUpdated);\n this._instance.on('rowCreated', this._onRowCreated);\n this._instance.on('rowDeleted', this._onRowDeleted);\n }\n}\n\n\n/**\n * Wrapper around a data table created from a gadget preference value.\n *\n * Automatically configures filter and sort settings from the preference,\n * and provides a `getFilteredRows()` convenience method that applies them.\n *\n * ```typescript\n * const cfg = this.client.createDataTableFromPref(prefs.getString('rdDataTable'));\n *\n * // Fetch rows with auto-wired filter + sort from the preference\n * const result = await cfg.getFilteredRows();\n *\n * // Access the underlying DataTableRef for schema, events, etc.\n * cfg.dataTable.rowUpdated$.subscribe(change => console.log(change));\n *\n * // Cleanup\n * cfg.dispose();\n * ```\n */\nexport class DataTablePrefRef {\n\n /** The underlying DataTableRef with full access to schema, events, polling, etc. */\n public readonly dataTable: DataTableRef;\n\n /** The parsed preference object. */\n public readonly pref: IDataTablePref;\n\n /** @ignore */\n private _config: any;\n\n /**\n * Creates a new DataTablePrefRef from a gadget preference JSON string.\n *\n * @param prefValue - The raw gadget preference string (JSON)\n * @param zone - Angular NgZone for ensuring change detection on callbacks\n * @param options - Optional configuration overrides\n * @throws Error if the global datatable library is not loaded\n */\n constructor(prefValue: string, zone: NgZone, options?: IDataTableOptions) {\n\n const lib = (window as any).gadgets?.['reveldigital.datatable'];\n\n if (!lib || typeof lib.createFromPref !== 'function') {\n throw new Error(\n 'RevelDigital DataTable library is not available. ' +\n 'Ensure the datatable feature is enabled for this gadget.'\n );\n }\n\n this._config = lib.createFromPref(prefValue, options);\n this.pref = this._config.pref;\n this.dataTable = DataTableRef._fromInstance(this._config.dt, zone);\n }\n\n /**\n * Fetches rows with the filter and sort settings from the preference automatically applied.\n * Additional query parameters can override or supplement the preference settings.\n *\n * @param params - Optional additional query parameters\n * @returns Promise resolving to the result set\n *\n * ```typescript\n * // Use preference defaults\n * const result = await cfg.getFilteredRows();\n *\n * // Override page size\n * const page = await cfg.getFilteredRows({ pageSize: 10 });\n * ```\n */\n public getFilteredRows(params?: IDataTableQueryParams): Promise<IDataTableResult> {\n return this._config.getFilteredRows(params);\n }\n\n /**\n * Releases all resources held by the underlying DataTableRef.\n */\n public dispose(): void {\n this.dataTable.dispose();\n }\n}\n","// Generated by genversion.\nexport const version = '2.3.0'\n","import { Injectable, NgZone, OnDestroy } from '@angular/core';\nimport { gadgets } from '@reveldigital/gadget-types';\nimport { BehaviorSubject, fromEvent, Subject, Subscription } from 'rxjs';\nimport { filter, map, share, tap } from 'rxjs/operators';\nimport { IClient } from './interfaces/client.interface';\nimport { ICommand } from './interfaces/command.interface';\nimport { IDictionary } from './interfaces/config.interface';\nimport { IDataTableOptions } from './interfaces/datatable.interface';\nimport { IDevice } from './interfaces/device.interface';\nimport { IEventProperties } from './interfaces/event-properties.interface';\nimport { DataTableRef, DataTablePrefRef } from './datatable-ref';\nimport { version } from './version';\n\n//import { version } from './version.js';\n\n// So that TypeScript doesn't complain, we're going to augment the GLOBAL / WINDOW \n// name-space definition to include the Tracker API. This also provides us with a place\n// to actually DOCUMENT the API so that our developers aren't guessing about what's\n// available on the library.\n\n/** @ignore */\ndeclare global {\n let Client: IClient;\n}\n\n/**\n * Service for interacting with the Revel Digital player client.\n * \n * This service provides a comprehensive interface for gadgets and web applications\n * to communicate with the Revel Digital player environment. It handles device\n * information, commands, events, analytics tracking, and configuration management.\n * \n * The service supports both direct API calls and event-based communication patterns,\n * allowing gadgets to respond to player lifecycle events (start, stop, commands) and\n * send data back to the player or remote devices.\n * \n * ```typescript\n * constructor(private client: PlayerClientService) {\n * // Subscribe to player events\n * this.client.onStart$.subscribe(() => {\n * console.log('Gadget started');\n * });\n * \n * this.client.onCommand$.subscribe(command => {\n * console.log('Received command:', command);\n * });\n * }\n * \n * async ngOnInit() {\n * // Get device information\n * const device = await this.client.getDevice();\n * const deviceTime = await this.client.getDeviceTime();\n * \n * // Track analytics\n * this.client.track('gadget_loaded', { version: '1.0' });\n * }\n * ```\n * \n * @since 1.0.0\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class PlayerClientService implements OnDestroy {\n\n /** @ignore */\n private zone: NgZone;\n /** @ignore */\n private clientPromise: Promise<IClient> | null;\n\n /**\n * Observable stream of commands sent to this player from the Revel Digital platform.\n * Subscribe to this to handle custom commands sent from templates, playlists, or remote devices.\n * \n * ```typescript\n * this.client.onCommand$.subscribe(command => {\n * if (command.name === 'customAction') {\n * this.handleCustomAction(command.arg);\n * }\n * });\n * ```\n */\n public onCommand$ = new Subject<ICommand>();\n\n /**\n * Observable that signals when the gadget has been loaded and is ready to start.\n * Emits `true` when ready, `false` when destroyed.\n * \n * ```typescript\n * this.client.onReady$.subscribe(isReady => {\n * if (isReady) {\n * console.log('Client is ready');\n * this.initializeGadget();\n * }\n * });\n * ```\n */\n public onReady$ = new BehaviorSubject(false);\n\n /**\n * Observable that signals when the gadget has been started by the player.\n * This event occurs when the player begins execution of the gadget content.\n * \n * ```typescript\n * this.client.onStart$.subscribe(() => {\n * console.log('Gadget started');\n * this.startAnimation();\n * });\n * ```\n */\n public onStart$ = new Subject();\n\n /**\n * Observable that signals when the gadget has been stopped by the player.\n * This event occurs when the player stops execution, typically when moving\n * to the next item in a playlist or when the content duration expires.\n * \n * ```typescript\n * this.client.onStop$.subscribe(() => {\n * console.log('Gadget stopped');\n * this.cleanup();\n * });\n * ```\n */\n public onStop$ = new Subject();\n\n /**\n * Observable that signals when the gadget should open the configuration window.\n * This allows gadgets to respond to configuration requests from the player.\n * \n * ```typescript\n * this.client.onConfig$.subscribe(() => {\n * this.openConfigurationDialog();\n * });\n * ```\n */\n public onConfig$ = new Subject();\n\n /**\n * Observable that signals when the gadget has received a postMessage event from the player.\n * This handles communication between the gadget and player via the postMessage API.\n * \n * ```typescript\n * this.client.onPostMessage$.subscribe(message => {\n * console.log('Received message:', message);\n * this.handlePlayerMessage(message);\n * });\n * ```\n */\n public onPostMessage$ = new Subject();\n\n //\n // Two methods available for calling into the library:\n //\n // 1) Using dispatchEvent() with the following custom events\n // 2) Using the window scoped RevelDigital object as defined in the constructor\n //\n /** @ignore */\n private onStartSub: Subscription;\n /** @ignore */\n private onStartEvt$ = fromEvent(window, 'RevelDigital.Start').pipe(\n share(),\n tap(this.onStart$)\n );\n /** @ignore */\n private onStopSub: Subscription;\n /** @ignore */\n private onStopEvt$ = fromEvent(window, 'RevelDigital.Stop').pipe(\n share(),\n tap(this.onStop$)\n );\n /** @ignore */\n private onCommandSub: Subscription;\n /** @ignore */\n private onCommandEvt$ = fromEvent<ICommand>(window, 'RevelDigital.Command').pipe(\n map((e: any) => { return { name: e.detail.name, arg: e.detail.arg } as ICommand }),\n share(),\n tap(this.onCommand$)\n );\n /** @ignore */\n // private onConfigSub: Subscription;\n // /** @ignore */\n // private onConfigEvt$ = fromEvent(window, 'RevelDigital.Config').pipe(\n // share(),\n // tap((e: CustomEvent) => {\n // console.log(e);\n\n // if (e.detail.type === 'applyConfig' && e.detail.isOpener) {\n // this.applyConfig(e.detail.config); // propagate config to iframe parent from the popup window\n // } else {\n // this.onConfig$.next(e.detail);\n // }\n // })\n // );\n // private onPostMessageSub: Subscription;\n // private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\n // filter((messageEvent: MessageEvent) =>\n // messageEvent.source !== window.parent &&\n // typeof messageEvent.data === 'string' &&\n // messageEvent.data.startsWith('reveldigital:')),\n // map((e: any) => { return JSON.parse(e.substring(13)) as Command }),\n // share(),\n // tap(this.onCommand$)\n // );\n\n private onPostMessageSub: Subscription;\n private onPostMessageEvt$ = fromEvent(window, 'message').pipe(\n filter((messageEvent: MessageEvent) =>\n //messageEvent.source !== window.parent &&\n typeof messageEvent.data === 'string'),\n map((e: any) => JSON.parse(e.data)),\n share(),\n tap((e: any) => {\n if (e.type === 'applyConfig' && e.isOpener) {\n e.isOpener = false;\n // propagate config to iframe parent from the popup window\n window.parent.postMessage(\n JSON.stringify(e),\n '*'\n );\n } else if (e.type === 'openConfig') {\n this.onConfig$.next(null);\n }\n }),\n tap(e => this.onPostMessage$.next(e))\n );\n\n\n /** @ignore */\n constructor(zone: NgZone) {\n\n this.zone = zone;\n\n (window as any).RevelDigital = {\n Controller: {\n onCommand: (name: string, arg: string) => {\n zone.run(() => {\n this.onCommand$.next({ name: name, arg: arg });\n });\n },\n onStart: () => {\n zone.run(() => {\n this.onStart$.next(null);\n });\n },\n onStop: () => {\n zone.run(() => {\n this.onStop$.next(null);\n });\n }\n }\n }\n\n this.onStartSub = this.onStartEvt$.subscribe(() => { });\n this.onStopSub = this.onStopEvt$.subscribe(() => { });\n this.onCommandSub = this.onCommandEvt$.subscribe(() => { });\n //this.onConfigSub = this.onConfigEvt$.subscribe(() => { });\n this.onPostMessageSub = this.onPostMessageEvt$.subscribe(() => { });\n\n this.clientPromise = null;\n\n this.onReady$.next(true);\n }\n\n /** @ignore */\n ngOnDestroy(): void {\n\n this.onStartSub?.unsubscribe();\n this.onStopSub?.unsubscribe();\n this.onCommandSub?.unsubscribe();\n //this.onConfigSub?.unsubscribe();\n this.onPostMessageSub?.unsubscribe();\n\n this.onReady$.next(false);\n }\n\n /** @ignore */\n public static init(data: any) {\n\n console.log(\n '%c⚙️ Initializing Revel Digital client library',\n 'background-color:blue; color:yellow;'\n );\n }\n\n /**\n * Sends a callback to player scripting with variable arguments.\n * \n * This method allows the gadget to communicate with player scripting.\n * If the appropriate scripting is in place in the currently running template, \n * calling this method will initiate a callback which can be acted upon in player script.\n * \n * @param args - Variable number of arguments to pass to the callback (max 5 arguments)\n * \n * ```typescript\n * // Send a simple callback\n * this.client.callback('test', 'data');\n * \n * // Send multiple parameters\n * this.client.callback('action', 'value1', 'value2', { data: 'object' });\n * ```\n */\n public callback(...args: any[]): void {\n\n this.getClient().then((client) => {\n\n switch (args.length) {\n case 0:\n client.callback();\n break;\n case 1:\n client.callback(args[0]);\n break;\n case 2:\n client.callback(args[1]);\n break;\n case 3:\n client.callback(args[2]);\n break;\n case 4:\n client.callback(args[3]);\n break;\n case 5:\n client.callback(args[4]);\n break;\n }\n })\n }\n\n /**\n * Gets the user preferences interface exposed by the Google Gadgets API.\n * \n * This method provides access to gadget preferences which can be configured\n * in the Revel Digital CMS. Use this to retrieve user-configurable settings\n * for your gadget.\n * \n * @returns The Gadgets API Prefs object for accessing preference values\n * \n * ```typescript\n * constructor(public client: PlayerClientService) {\n * const prefs = client.getPrefs();\n * const myString = prefs.getString('myStringPref');\n * const myNumber = prefs.getInt('myNumberPref');\n * const myBool = prefs.getBool('myBoolPref');\n * }\n * ```\n * \n * @see {@link https://developers.google.com/gadgets/docs/basic} Google Gadgets API documentation\n */\n public getPrefs(): gadgets.Prefs {\n\n return new window['gadgets']['Prefs']();\n }\n\n /**\n * Gets the current device time in ISO8601 format.\n * \n * Current device time is determined by the device timezone assigned to the device in the CMS.\n * This is useful for displaying time-sensitive content or scheduling operations based on\n * the device's local time rather than browser time.\n * \n * @param date - Optional. If supplied, will translate the supplied date/time to device time based on respective timezones\n * @returns Promise resolving to date/time in ISO8601 format\n * \n * ```typescript\n * // Get current device time\n * const currentTime = await this.client.getDeviceTime();\n * console.log('Device time:', currentTime);\n * \n * // Convert a specific date to device time\n * const specificDate = new Date('2023-01-01T12:00:00Z');\n * const deviceTime = await this.client.getDeviceTime(specificDate);\n * ```\n */\n public async getDeviceTime(date?: Date): Promise<string> {\n\n const client = await this.getClient();\n\n if (date !== undefined) {\n return client.getDeviceTime(date);\n }\n return client.getDeviceTime();\n }\n\n /**\n * Gets the timezone name currently assigned to the device.\n * \n * @returns Promise resolving to the timezone name (e.g., \"America/New_York\")\n * \n * ```typescript\n * const timezoneName = await this.client.getDeviceTimeZoneName();\n * console.log('Device timezone:', timezoneName);\n * ```\n */\n public async getDeviceTimeZoneName(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneName();\n }\n\n /**\n * Gets the timezone ID currently assigned to the device.\n * \n * @returns Promise resolving to the timezone ID\n * \n * ```typescript\n * const timezoneId = await this.client.getDeviceTimeZoneID();\n * console.log('Device timezone ID:', timezoneId);\n * ```\n */\n public async getDeviceTimeZoneID(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneID();\n }\n\n /**\n * Gets the numerical offset from GMT of the timezone currently assigned to the device.\n * \n * @returns Promise resolving to the timezone offset in hours (e.g., -5 for EST)\n * \n * ```typescript\n * const offset = await this.client.getDeviceTimeZoneOffset();\n * console.log('Device timezone offset:', offset, 'hours from GMT');\n * ```\n */\n public async getDeviceTimeZoneOffset(): Promise<number> {\n\n const client = await this.getClient();\n\n return client.getDeviceTimeZoneOffset();\n }\n\n /**\n * Gets the language code of the language currently assigned to the device.\n * \n * @returns Promise resolving to the language code (e.g., \"en-US\", \"fr-FR\")\n * \n * ```typescript\n * const languageCode = await this.client.getLanguageCode();\n * console.log('Device language:', languageCode);\n * // Use for localization\n * this.loadLanguageResources(languageCode);\n * ```\n */\n public async getLanguageCode(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getLanguageCode();\n }\n\n /**\n * Gets the unique Revel Digital device key associated with the device.\n * \n * The device key is a unique identifier for this specific player device\n * and can be used for device-specific operations or remote commands.\n * \n * @returns Promise resolving to the device key string\n * \n * ```typescript\n * const deviceKey = await this.client.getDeviceKey();\n * console.log('Device key:', deviceKey);\n * ```\n */\n public async getDeviceKey(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getDeviceKey();\n }\n\n /**\n * Sends a command to the local player device.\n * \n * Commands can be used to control various aspects of the player or trigger\n * specific behaviors. The command is processed by the local player only.\n * \n * @param name - The command name/identifier\n * @param arg - The command argument/payload\n * \n * ```typescript\n * // Send a simple command\n * this.client.sendCommand('refresh', '');\n * \n * // Send a command with data\n * this.client.sendCommand('setVolume', '50');\n * \n * // Send a command with JSON data\n * this.client.sendCommand('configure', JSON.stringify({ setting: 'value' }));\n * ```\n */\n public sendCommand(name: string, arg: string): void {\n\n this.getClient().then((client) => {\n client.sendCommand(name, arg);\n })\n }\n\n /**\n * Sends a command to remote player devices with the specified device keys.\n * \n * Remote commands allow cross-device communication within the same Revel Digital account.\n * This is useful for synchronized displays, device coordination, or remote control scenarios.\n * \n * Note: Remote commands can only be delivered to devices within the same account as the sender device.\n * \n * @param deviceKeys - Array of target device keys to send the command to\n * @param name - The command name/identifier\n * @param arg - The command argument/payload\n * \n * ```typescript\n * // Send command to specific devices\n * const targetDevices = ['device-key-1', 'device-key-2'];\n * this.client.sendRemoteCommand(targetDevices, 'syncAction', 'start');\n * \n * // Broadcast to multiple devices\n * this.client.sendRemoteCommand(\n * ['lobby-display', 'kiosk-1', 'kiosk-2'], \n * 'updateContent', \n * JSON.stringify({ contentId: '12345' })\n * );\n * ```\n */\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string): void {\n\n this.getClient().then((client) => {\n client.sendRemoteCommand(deviceKeys, name, arg);\n });\n }\n\n /**\n * Logs an analytics event for use with AdHawk analytics and reporting.\n * \n * Events are used for tracking various metrics including usage statistics, \n * player condition, state changes, user interactions, and custom business metrics.\n * These events can be viewed in the Revel Digital analytics dashboard.\n * \n * @param eventName - Unique name for this event (should be descriptive and consistent)\n * @param properties - Optional map of user-defined properties to associate with this event\n * \n * ```typescript\n * // Simple event tracking\n * this.client.track('gadget_loaded');\n * \n * // Event with properties\n * this.client.track('user_interaction', {\n * action: 'button_click',\n * button_id: 'start_button',\n * timestamp: new Date().toISOString()\n * });\n * \n * // Performance tracking\n * this.client.track('content_displayed', {\n * content_type: 'video',\n * duration: 30,\n * quality: 'HD'\n * });\n * ```\n */\n public track(eventName: string, properties?: IEventProperties): void {\n\n this.getClient().then((client) => {\n client.track(eventName, JSON.stringify(properties));\n })\n }\n\n /**\n * Initiates a timed event for duration tracking.\n * \n * Timed events are useful for tracking the duration of operations or user interactions.\n * This method must be followed by a call to track() with the same event name to complete\n * the timing measurement. The duration will be automatically calculated and included\n * in the event properties.\n * \n * @param eventName - Unique name for this timed event (must match the subsequent track() call)\n * \n * ```typescript\n * // Start timing an event\n * this.client.timeEvent('video_playback');\n * \n * // ... video plays for some duration ...\n * \n * // End timing and log the event with duration\n * this.client.track('video_playback', {\n * video_id: 'abc123',\n * quality: 'HD'\n * }); // Duration will be automatically added\n * \n * // Example for user interaction timing\n * this.client.timeEvent('form_completion');\n * // ... user fills out form ...\n * this.client.track('form_completion', { form_type: 'contact' });\n * ```\n */\n public timeEvent(eventName: string): void {\n\n this.getClient().then((client) => {\n client.timeEvent(eventName);\n })\n }\n\n /**\n * Creates a new analytics event session for grouping related events.\n * \n * A session is a way of grouping events together for analysis. Each event tracked\n * after calling this method will have the same session ID until a new session is created.\n * Session IDs are randomly generated unless explicitly provided.\n * \n * This is useful for tracking user journeys, workflow completion, or grouping\n * related interactions within a specific time period.\n * \n * @param id - Optional user-supplied session ID. If not provided, a random session ID will be generated\n * \n * ```typescript\n * // Start a new session with auto-generated ID\n * this.client.newEventSession();\n * this.client.track('session_start');\n * this.client.track('user_action_1');\n * this.client.track('user_action_2');\n * \n * // Start a session with custom ID\n * this.client.newEventSession('user-workflow-12345');\n * this.client.track('workflow_start');\n * this.client.track('step_completed', { step: 1 });\n * \n * // Start a new session for different workflow\n * this.client.newEventSession();\n * this.client.track('different_workflow_start');\n * ```\n */\n public newEventSession(id?: string): void {\n\n this.getClient().then((client) => {\n if (id !== undefined) {\n client.newEventSession();\n } else {\n client.newEventSession(id);\n }\n })\n }\n\n /**\n * Gets the root folder path utilized by this player device.\n * \n * This returns the base directory path where the Revel Digital player\n * stores its files and resources on the local device.\n * \n * @returns Promise resolving to the path of the root folder\n * \n * ```typescript\n * const rootPath = await this.client.getRevelRoot();\n * console.log('Player root directory:', rootPath);\n * // Use for constructing file paths or understanding storage structure\n * ```\n */\n public async getRevelRoot(): Promise<string> {\n\n const client = await this.getClient();\n\n return client.getRevelRoot();\n }\n\n /**\n * Gets a map of commands currently active for this device.\n * \n * This returns the current command configuration that defines how the device\n * responds to various command triggers and remote commands.\n * \n * @returns Promise resolving to a map of currently active commands\n * \n * ```typescript\n * const commandMap = await this.client.getCommandMap();\n * console.log('Active commands:', commandMap);\n * \n * // Check if specific command is available\n * if (commandMap['customCommand']) {\n * console.log('Custom command is available');\n * }\n * ```\n */\n public async getCommandMap(): Promise<any> {\n\n const client = await this.getClient();\n\n return JSON.parse(await client.getCommandMap());\n }\n\n /**\n * Signals to the player that this gadget has completed its visualization.\n * \n * This method notifies the player that the current gadget has finished its\n * content display or interaction cycle. The player can then proceed with\n * the next item in a playlist if applicable, or handle the completion\n * according to its configuration.\n * \n * Call this method when your gadget has completed its intended function,\n * such as finishing an animation, completing a form, or reaching a natural\n * stopping point.\n * \n * ```typescript\n * // After completing an animation\n * private onAnimationComplete(): void {\n * this.client.finish();\n * }\n * \n * // After user interaction is complete\n * private onFormSubmitted(): void {\n * this.saveFormData();\n * this.client.finish();\n * }\n * \n * // After a timed display period\n * setTimeout(() => {\n * this.client.finish();\n * }, 30000); // 30 seconds\n * ```\n */\n public finish(): void {\n\n this.getClient().then((client) => {\n\n client.finish();\n })\n }\n\n /**\n * Checks if the gadget is running in preview mode.\n * \n * Preview mode is enabled when the gadget is being edited in the Revel Digital CMS,\n * tested in the gadget editor, or otherwise not running in a normal player environment.\n * This is useful for providing different behavior during development/testing versus\n * production deployment.\n * \n * @returns Promise resolving to true if running in preview mode, false if running on actual player\n * \n * ```typescript\n * const isPreview = await this.client.isPreviewMode();\n * \n * if (isPreview) {\n * console.log('Running in preview mode - using mock data');\n * this.loadMockData();\n * } else {\n * console.log('Running on player device - using live data');\n * this.loadLiveData();\n * }\n * \n * // Show different UI in preview\n * this.showPreviewIndicator = isPreview;\n * ```\n */\n public async isPreviewMode(): Promise<boolean> {\n\n const client = await this.getClient();\n\n return client instanceof NoopClient;\n }\n\n /**\n * Gets detailed information about the device running the player.\n * \n * Returns comprehensive device details including name, registration key, type,\n * service date, language, timezone, tags, and location information. This data\n * is configured in the Revel Digital CMS for each device.\n * \n * @returns Promise resolving to device details object, or null if not available\n * \n * ```typescript\n * const device = await this.client.getDevice();\n * \n * if (device) {\n * console.log('Device name:', device.name);\n * console.log('Device type:', device.deviceType);\n * console.log('Location:', device.location.city, device.location.state);\n * console.log('Tags:', device.tags);\n * \n * // Use device info for customization\n * if (device.location.country === 'US') {\n * this.loadUSContent();\n * }\n * \n * // Check device capabilities based on type\n * if (device.deviceType === 'android') {\n * this.enableTouchFeatures();\n * }\n * }\n * ```\n */\n public async getDevice(): Promise<IDevice | null> {\n\n const client = await this.getClient();\n\n const obj: any = JSON.parse(<string>await client.getDevice());\n\n const device: IDevice[] = [obj].map((device: any) => {\n\n return {\n name: device.name,\n registrationKey: device.key,\n deviceType: device.devicetype,\n enteredService: new Date(device.enteredservice),\n langCode: device.langcode,\n timeZone: device.timezone,\n tags: device.description?.split('\\n'),\n location: {\n city: device.location?.city,\n state: device.location?.state,\n country: device.location?.country,\n postalCode: device.location?.postalcode,\n address: device.location?.address,\n latitude: device.location?.latitude,\n longitude: device.location?.longitude\n }\n }\n });\n return device[0];\n }\n\n /**\n * Gets the width of the visualization area in pixels.\n * \n * This returns the available width for content display, which may be\n * different from the full screen width depending on player configuration\n * and template layout.\n * \n * @returns Promise resolving to width in pixels, or null if not available\n * \n * ```typescript\n * const width = await this.client.getWidth();\n * \n * if (width) {\n * console.log('Available width:', width, 'pixels');\n * \n * // Adapt content layout based on width\n * if (width < 800) {\n * this.enableMobileLayout();\n * } else {\n * this.enableDesktopLayout();\n * }\n * }\n * ```\n */\n public async getWidth(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getWidth();\n }\n\n /**\n * Gets the height of the visualization area in pixels.\n * \n * This returns the available height for content display, which may be\n * different from the full screen height depending on player configuration\n * and template layout.\n * \n * @returns Promise resolving to height in pixels, or null if not available\n * \n * ```typescript\n * const height = await this.client.getHeight();\n * \n * if (height) {\n * console.log('Available height:', height, 'pixels');\n * \n * // Calculate aspect ratio for responsive design\n * const width = await this.client.getWidth();\n * const aspectRatio = width / height;\n * this.adjustContentForAspectRatio(aspectRatio);\n * }\n * ```\n */\n public async getHeight(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getHeight();\n }\n\n /**\n * Gets the duration of the currently playing content item.\n * \n * This method is only applicable when the gadget is associated with a playlist\n * and returns the duration assigned to the current playlist item. The duration\n * determines how long the content should be displayed before moving to the next item.\n * \n * @returns Promise resolving to duration in milliseconds, or null if not applicable/available\n * \n * ```typescript\n * const duration = await this.client.getDuration();\n * \n * if (duration) {\n * console.log('Content duration:', duration, 'milliseconds');\n * \n * // Set up auto-finish timer\n * setTimeout(() => {\n * this.client.finish();\n * }, duration);\n * \n * // Show progress indicator\n * this.startProgressIndicator(duration);\n * }\n * ```\n */\n public async getDuration(): Promise<number | null> {\n\n const client = await this.getClient();\n\n return client.getDuration();\n }\n\n /**\n * Gets the current version of the Revel Digital SDK.\n * \n * @returns Promise resolving to the SDK version string\n * \n * ```typescript\n * const version = await this.client.getSdkVersion();\n * console.log('SDK Version:', version);\n * \n * // Use for compatibility checks or logging\n * this.client.track('gadget_loaded', { sdkVersion: version });\n * ```\n */\n public async getSdkVersion(): Promise<string> {\n\n return Promise.resolve(version);\n }\n\n /**\n * Applies configuration preferences to the gadget (preview mode only).\n * \n * This method is only available when running in preview mode (typically during\n * gadget development or testing in the CMS). It allows applying configuration\n * changes that would normally come from the gadget's preference settings.\n * \n * @param prefs - Dictionary of preference key-value pairs to apply\n * \n * ```typescript\n * if (await this.client.isPreviewMode()) {\n * // Apply test configuration in preview\n * await this.client.applyConfig({\n * 'title': 'Test Title',\n * 'backgroundColor': '#ff0000',\n * 'showBorder': true,\n * 'refreshInterval': 30\n * });\n * }\n * ```\n */\n public async applyConfig(prefs: IDictionary<any>) {\n\n if (await this.isPreviewMode()) {\n const client = await this.getClient();\n client.applyConfig(prefs);\n } else {\n console.log(\n '%capplyConfig() is only available in preview mode.',\n 'background-color:blue; color:yellow;'\n );\n }\n }\n\n /**\n * Creates a typed wrapper for a Revel Digital data table.\n *\n * The data table feature must be enabled for the gadget. The returned\n * {@link DataTableRef} provides typed Promise-based methods and RxJS\n * Observables for real-time row change events.\n *\n * @param tableId - The data table ID (e.g. 'tbl_menu_items')\n * @param options - Optional configuration overrides\n * @returns A {@link DataTableRef} instance\n * @throws Error if the global datatable library is not loaded\n *\n * ```typescript\n * const dt = this.client.createDataTable('tbl_menu_items');\n *\n * // Fetch rows with filtering and sorting\n * const result = await dt.getRows({\n * filter: { category: 'Entree', price: { op: 'lte', value: 25 } },\n * sort: 'price',\n * sortDir: 'asc'\n * });\n *\n * // Subscribe to real-time updates\n * dt.rowUpdated$.subscribe(change => console.log('Row updated:', change));\n * dt.rowCreated$.subscribe(change => console.log('Row created:', change));\n * dt.rowDeleted$.subscribe(change => console.log('Row deleted:', change));\n *\n * // Cleanup when done\n * dt.dispose();\n * ```\n */\n public createDataTable(tableId: string, options?: IDataTableOptions): DataTableRef {\n return new DataTableRef(tableId, this.zone, options);\n }\n\n /**\n * Creates a typed data table wrapper from a gadget preference value.\n *\n * The preference JSON string (as serialized by the template editor's datatable\n * option) is parsed and used to auto-configure filter, sort, and logic settings.\n * The returned {@link DataTablePrefRef} provides a `getFilteredRows()` convenience\n * method that applies these settings automatically.\n *\n * @param prefValue - The raw gadget preference string (JSON)\n * @param options - Optional configuration overrides\n * @returns A {@link DataTablePrefRef} instance\n * @throws Error if the global datatable library is not loaded\n *\n * ```typescript\n * const cfg = this.client.createDataTableFromPref(prefs.getString('rdDataTable'));\n *\n * // Fetch rows with auto-wired filter + sort\n * const result = await cfg.getFilteredRows();\n *\n * // Access the underlying DataTableRef for events, schema, etc.\n * cfg.dataTable.rowUpdated$.subscribe(change => console.log(change));\n *\n * // Cleanup when done\n * cfg.dispose();\n * ```\n */\n public createDataTableFromPref(prefValue: string, options?: IDataTableOptions): DataTablePrefRef {\n return new DataTablePrefRef(prefValue, this.zone, options);\n }\n\n // ---\n // PRIVATE METHODS.\n // ---\n /** @ignore */\n private getClient(): Promise<IClient> {\n\n if (this.clientPromise) {\n\n return (this.clientPromise);\n }\n\n if ((window as any).Client) {\n\n return (this.clientPromise = Promise.resolve((window as any).Client));\n }\n\n // A \"complete\" status indicates that the \"load\" event has been fired on the\n // window; and, that all sub-resources such as Scripts, Images, and Frames have\n // been loaded.\n if (window.document.readyState === \"complete\") {\n\n // If this event has fired AND the 3rd-party script isn't available (see IF-\n // condition BEFORE this one), it means that the 3rd-party script either\n // failed on the network or was BLOCKED by an ad-blocker. As such, we have to\n // fall-back to using a mock API.\n return (this.clientPromise = Promise.resolve(new NoopClient()));\n }\n\n // ASSERT: If we made it this far, the document has not completed loading (but it\n // may be in an \"interactive\" state which is when I believe that the Angular app\n // gets bootstrapped). As such, we need bind to the LOAD event to wait for our\n // third-party scripts to load (or fail to load, or be blocked).\n this.clientPromise = new Promise<IClient>(\n (resolve) => {\n\n window.addEventListener(\n \"load\",\n function handleWindowLoad() {\n\n // At this point, the 3rd-party library is either available or\n // it's not - there's no further loading to do. If it's not\n // present on the global scope, we're going to fall-back to using\n // a mock API.\n resolve((window as any).Client || new NoopClient());\n }\n );\n\n }\n );\n\n return (this.clientPromise);\n }\n}\n\n\n\n// ----------------------------------------------------------------------------------- //\n// ----------------------------------------------------------------------------------- //\n\n/**\n * Mock implementation of the IClient interface.\n * \n * This class provides a no-operation (NOOP) implementation of the client API\n * that allows consuming code to function normally even when the actual player\n * API is not available. This typically occurs during development, testing,\n * or when the player script is blocked by ad-blockers.\n * \n * All methods in this class either return null/empty values or perform no\n * operations, allowing gadgets to function without errors while providing\n * appropriate fallback behavior.\n * \n * @private\n */\nclass NoopClient implements IClient {\n\n constructor() {\n\n console.log(\n '%cClient API not available, falling back to mock API',\n 'background-color:blue; color:yellow;'\n );\n }\n\n public callback(...args: any[]): void {\n\n // NOOP implement, nothing to do....\n }\n\n public getDeviceTime(date?: Date): Promise<string> {\n\n return Promise.resolve(new Date().toISOString());\n }\n\n public async getDeviceTimeZoneName(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceTimeZoneID(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceTimeZoneOffset(): Promise<number> {\n\n return Promise.resolve(null);\n }\n\n public async getLanguageCode(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getDeviceKey(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public sendCommand(name: string, arg: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public sendRemoteCommand(deviceKeys: string[], name: string, arg: string) {\n\n // NOOP implement, nothing to do....\n }\n\n public track(eventName: string, properties?: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public timeEvent(eventName: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public newEventSession(id?: string): void {\n\n // NOOP implement, nothing to do....\n }\n\n public async getRevelRoot(): Promise<string> {\n\n return Promise.resolve(null);\n }\n\n public async getCommandMap(): Promise<string> {\n\n return Promise.resolve('{}');\n }\n\n public finish(): void {\n\n // NOOP implement, nothing to do....\n }\n\n public async getDevice(): Promise<string | null> {\n\n return Promise.resolve(null);\n }\n\n public async getWidth(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getHeight(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getDuration(): Promise<number | null> {\n\n return Promise.resolve(null);\n }\n\n public async getSdkVersion(): Promise<string> {\n\n return Promise.resolve(version);\n }\n\n public applyConfig(prefs: IDictionary<any>): void {\n\n const evt = { type: 'applyConfig', prefs: prefs, isOpener: window.opener !== null };\n\n if (window.opener) {\n window.opener.postMessage(\n JSON.stringify(evt),\n '*'\n );\n } else {\n window.parent.postMessage(\n JSON.stringify(evt),\n '*'\n );\n }\n }\n}\n","import { Injectable, enableProdMode, isDevMode } from '@angular/core';\nimport { HttpClient } from \"@angular/common/http\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport * as yaml from \"js-yaml\";\nimport * as WebFont from 'webfontloader';\n\nconst isLocal: boolean = /localhost/.test(document.location.host);\n!isLocal && enableProdMode();\n\n\n/** @ignore */\n@Injectable({\n providedIn: 'root'\n})\nexport class AppInitService {\n\n constructor(\n public http: HttpClient,\n private _route: ActivatedRoute,\n private _router: Router) {\n }\n\n init(): Promise<any> {\n\n return new Promise<void>((resolve) => {\n\n this.loadFonts();\n\n if (isDevMode()) {\n console.log(\n '%cRunning in development mode',\n 'background-color:blue; color:yellow;'\n );\n\n /**\n * Shim the shindig prefs functionality for dev mode\n */\n (<any>window).gadgets = {\n\n Prefs: class {\n getString(key: string) { return this.getParameterByName(key) }\n\n getArray(key: string) { return this.getParameterByName(key).split(',') }\n\n getBool(key: string) { return this.getParameterByName(key) === 'true' }\n\n getCountry() { }\n\n getFloat(key: string) { return parseFloat(this.getParameterByName(key)) }\n\n getInt(key: string) { return parseInt(this.getParameterByName(key)) }\n\n getLang() { return this.getParameterByName('lang') === '' ? 'en' : this.getParameterByName('lang'); }\n\n getParameterByName(name: string, search = window.location.href): string {\n\n name = name.replace(/[\\[\\]]/g, '\\\\$&');\n const regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'),\n results = regex.exec(search);\n if (!results) return '';\n if (!results[2]) return '';\n return decodeURIComponent(results[2].replace(/\\+/g, ' '));\n }\n }\n };\n\n this.http.get('assets/gadget.yaml', {\n responseType: 'text'\n }).subscribe({\n next: (data) => {\n const doc: any = yaml.load(data);\n const params: any = {}\n for (const val of doc.prefs) {\n params[val.name] = val.default_value\n }\n\n this._router.navigate([], {\n relativeTo: this._route,\n queryParams: params,\n });\n\n console.log(\n `%cUser prefs loaded successfully`,\n 'background-color:blue; color:yellow;'\n );\n },\n error: (err) => {\n console.log(\n `%cUnable to load user preferences YAML definition file: ${err}`,\n 'background-color:blue; color:yellow;'\n );\n console.log(\n `%cPlease see our developer documentation for help with your app configuration: https://developer.reveldigital.com`,\n 'background-color:red; color:yellow;'\n )\n }\n })\n }\n resolve();\n });\n }\n\n\n private getFamilyName(css) {\n\n const FONT_FAMILY_REGEX = /font-family:\\s*(?:[&#39;&#34;])*['\"]*(.+?)['\"]*(?:[&#39;&#34;])*\\s*;/i;\n if (FONT_FAMILY_REGEX.test(css)) {\n const matches = css.match(FONT_FAMILY_REGEX);\n return matches[1].split(',')[0];\n } else {\n return '';\n }\n }\n\n /**\n * Loads the given font from Google Web Fonts.\n */\n private loadFonts(): void {\n\n const parameters = new URLSearchParams(window.location.search);\n parameters.forEach((val, key) => {\n try {\n const fontFamily = this.getFamilyName(val);\n if (fontFamily !== '') {\n WebFont.load({\n google: {\n families: [fontFamily]\n },\n fontactive: (familyName) => {\n console.log(`%cActivating font: ${familyName}`,\n 'background-color:blue; color:yellow;');\n },\n fontinactive: (familyName) => {\n console.log(`%cFont inactive: ${familyName}`,\n 'background-color:red; color:yellow;');\n }\n });\n }\n } catch (e) {\n }\n });\n }\n}\n","import { Pipe, PipeTransform, NgModule } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\n\n/**\n * The safe style pipe is used when custom styles are defined for a gadget and must be applied to an Angular\n * component. This pipe will ensure the style can be appied safely by utilizing the DomSanitizer.\n * \n * ```html\n * <h2 [style]=\"style | safeStyle\">Sample Pref: {{ prefs.getString('myStringPref') }}</h2>\n * ```\n */\n@Pipe({\n name: 'safeStyle',\n standalone: true,\n})\nexport class SafeStylePipe implements PipeTransform {\n constructor(private sanitized: DomSanitizer) { }\n\n transform(value: any): unknown {\n return this.sanitized.bypassSecurityTrustStyle(value);\n }\n}\n\n@NgModule({\n imports: [SafeStylePipe],\n exports: [SafeStylePipe],\n})\nexport class NgSafeStylePipeModule { }\n","import { APP_INITIALIZER, LOCALE_ID, NgModule } from '@angular/core';\nimport { PlayerClientService } from './player-client.service';\nimport { AppInitService } from './app-init.service';\nimport { HttpClientModule } from '@angular/common/http';\nimport { RouterModule } from '@angular/router';\nimport { APP_BASE_HREF } from '@angular/common';\nimport { NgSafeStylePipeModule } from './safe-style.pipe';\n\ndeclare const gadgets: any;\n\n\n@NgModule({\n imports: [\n HttpClientModule,\n RouterModule.forRoot([]),\n NgSafeStylePipeModule\n ],\n exports: [\n NgSafeStylePipeModule\n ],\n providers: [{\n provide: APP_INITIALIZER,\n useFactory: initializeApp,\n deps: [AppInitService, PlayerClientService],\n multi: true\n },\n {\n provide: LOCALE_ID,\n useFactory: () => {\n try {\n return new gadgets.Prefs().getLang();\n } catch {\n return 'en';\n }\n }\n },\n { provide: APP_BASE_HREF, useValue: '/gadgets/ifr' }]\n})\nexport class PlayerClientModule { }\n\nfunction initializeApp(appInitService: AppInitService) {\n return async () => {\n PlayerClientService.init({});\n await appInitService.init();\n }\n}\n","/*\n * Public API Surface of player-client\n */\n\nexport * from './lib/player-client.service';\nexport * from './lib/player-client.module';\nexport * from './lib/safe-style.pipe';\nexport * from './lib/datatable-ref';\nexport * from './lib/interfaces/datatable.interface';","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
@@ -1,9 +1,11 @@
1
+ import { NgZone } from '@angular/core';
1
2
  import { Subject } from 'rxjs';
2
3
  import { IDataTableChangeEvent, IDataTableColumn, IDataTableOptions, IDataTablePref, IDataTableQueryParams, IDataTableResult, IDataTableSchema } from './interfaces/datatable.interface';
3
4
  /**
4
5
  * Angular-friendly wrapper around the global `gadgets.reveldigital.datatable` library.
5
6
  *
6
7
  * Provides typed Promise-based methods and RxJS Observables for real-time events.
8
+ * All event emissions run inside Angular's zone to ensure change detection triggers.
7
9
  *
8
10
  * ```typescript
9
11
  * const dt = this.client.createDataTable('tbl_menu_items');
@@ -28,6 +30,8 @@ export declare class DataTableRef {
28
30
  /** @ignore */
29
31
  private _instance;
30
32
  /** @ignore */
33
+ private _zone;
34
+ /** @ignore */
31
35
  private _onRowUpdated;
32
36
  /** @ignore */
33
37
  private _onRowCreated;
@@ -37,10 +41,11 @@ export declare class DataTableRef {
37
41
  * Creates a new DataTableRef.
38
42
  *
39
43
  * @param tableId - The data table ID (e.g. 'tbl_menu_items')
44
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
40
45
  * @param options - Optional configuration overrides
41
46
  * @throws Error if the global datatable library is not loaded
42
47
  */
43
- constructor(tableId: string, options?: IDataTableOptions);
48
+ constructor(tableId: string, zone: NgZone, options?: IDataTableOptions);
44
49
  /**
45
50
  * Fetches rows from the data table.
46
51
  *
@@ -93,7 +98,7 @@ export declare class DataTableRef {
93
98
  */
94
99
  dispose(): void;
95
100
  /** @ignore */
96
- static _fromInstance(instance: any): DataTableRef;
101
+ static _fromInstance(instance: any, zone: NgZone): DataTableRef;
97
102
  /** @ignore */
98
103
  private _wireEvents;
99
104
  }
@@ -127,10 +132,11 @@ export declare class DataTablePrefRef {
127
132
  * Creates a new DataTablePrefRef from a gadget preference JSON string.
128
133
  *
129
134
  * @param prefValue - The raw gadget preference string (JSON)
135
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
130
136
  * @param options - Optional configuration overrides
131
137
  * @throws Error if the global datatable library is not loaded
132
138
  */
133
- constructor(prefValue: string, options?: IDataTableOptions);
139
+ constructor(prefValue: string, zone: NgZone, options?: IDataTableOptions);
134
140
  /**
135
141
  * Fetches rows with the filter and sort settings from the preference automatically applied.
136
142
  * Additional query parameters can override or supplement the preference settings.
@@ -1 +1 @@
1
- {"version":3,"file":"datatable-ref.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/datatable-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,qBAAa,YAAY;IAEvB,8CAA8C;IACvC,WAAW,iCAAwC;IAE1D,qCAAqC;IAC9B,WAAW,iCAAwC;IAE1D,mCAAmC;IAC5B,WAAW,iCAAwC;IAE1D,cAAc;IACd,OAAO,CAAC,SAAS,CAAM;IAEvB,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAChE,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAChE,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAEhE;;;;;;OAMG;gBACS,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAexD;;;;;;;;;;;;;;OAcG;IACI,OAAO,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIzE;;;;OAIG;IACI,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAI7C;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIvD;;;;;OAKG;IACI,cAAc,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIhF;;;;;OAKG;IACI,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI9C;;OAEG;IACI,WAAW,IAAI,IAAI;IAI1B;;;OAGG;IACI,OAAO,IAAI,IAAI;IAYtB,cAAc;IACd,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,YAAY;IAUjD,cAAc;IACd,OAAO,CAAC,WAAW;CASpB;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAE3B,oFAAoF;IACpF,SAAgB,SAAS,EAAE,YAAY,CAAC;IAExC,oCAAoC;IACpC,SAAgB,IAAI,EAAE,cAAc,CAAC;IAErC,cAAc;IACd,OAAO,CAAC,OAAO,CAAM;IAErB;;;;;;OAMG;gBACS,SAAS,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAgB1D;;;;;;;;;;;;;;OAcG;IACI,eAAe,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjF;;OAEG;IACI,OAAO,IAAI,IAAI;CAGvB"}
1
+ {"version":3,"file":"datatable-ref.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/datatable-ref.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EACL,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACjB,cAAc,EACd,qBAAqB,EACrB,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,kCAAkC,CAAC;AAE1C;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAY;IAEvB,8CAA8C;IACvC,WAAW,iCAAwC;IAE1D,qCAAqC;IAC9B,WAAW,iCAAwC;IAE1D,mCAAmC;IAC5B,WAAW,iCAAwC;IAE1D,cAAc;IACd,OAAO,CAAC,SAAS,CAAM;IAEvB,cAAc;IACd,OAAO,CAAC,KAAK,CAAS;IAEtB,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAChE,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAChE,cAAc;IACd,OAAO,CAAC,aAAa,CAA2C;IAEhE;;;;;;;OAOG;gBACS,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAiBtE;;;;;;;;;;;;;;OAcG;IACI,OAAO,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIzE;;;;OAIG;IACI,SAAS,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAI7C;;;;OAIG;IACI,iBAAiB,IAAI,OAAO,CAAC,gBAAgB,EAAE,CAAC;IAIvD;;;;;OAKG;IACI,cAAc,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIhF;;;;;OAKG;IACI,YAAY,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAI9C;;OAEG;IACI,WAAW,IAAI,IAAI;IAI1B;;;OAGG;IACI,OAAO,IAAI,IAAI;IAYtB,cAAc;IACd,MAAM,CAAC,aAAa,CAAC,QAAQ,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,YAAY;IAW/D,cAAc;IACd,OAAO,CAAC,WAAW;CAepB;AAGD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,gBAAgB;IAE3B,oFAAoF;IACpF,SAAgB,SAAS,EAAE,YAAY,CAAC;IAExC,oCAAoC;IACpC,SAAgB,IAAI,EAAE,cAAc,CAAC;IAErC,cAAc;IACd,OAAO,CAAC,OAAO,CAAM;IAErB;;;;;;;OAOG;gBACS,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,iBAAiB;IAgBxE;;;;;;;;;;;;;;OAcG;IACI,eAAe,CAAC,MAAM,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAIjF;;OAEG;IACI,OAAO,IAAI,IAAI;CAGvB"}
@@ -49,6 +49,8 @@ declare global {
49
49
  * @since 1.0.0
50
50
  */
51
51
  export declare class PlayerClientService implements OnDestroy {
52
+ /** @ignore */
53
+ private zone;
52
54
  /** @ignore */
53
55
  private clientPromise;
54
56
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"player-client.service.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"player-client.service.d.ts","sourceRoot":"","sources":["../../../../projects/reveldigital/player-client/src/lib/player-client.service.ts"],"names":[],"mappings":"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"}
package/lib/version.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export declare const version = "2.2.0";
1
+ export declare const version = "2.3.0";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@reveldigital/player-client",
3
- "version": "2.2.0",
3
+ "version": "2.3.0",
4
4
  "description": "Helper library for interfacing Angular apps with the Revel Digital gadget framework.",
5
5
  "schematics": "./schematics/collection.json",
6
6
  "ng-add": {