@reveldigital/player-client 2.8.0 → 2.10.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.
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93ZXJiaS5pbnRlcmZhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXZlbGRpZ2l0YWwvcGxheWVyLWNsaWVudC9zcmMvbGliL2ludGVyZmFjZXMvcG93ZXJiaS5pbnRlcmZhY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogT3B0aW9ucyBmb3IgY3JlYXRpbmcgYSBQb3dlckJJIGVtYmVkIGluc3RhbmNlLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElQb3dlckJJT3B0aW9ucyB7XG4gIC8qKiBQb3dlciBCSSB3b3Jrc3BhY2UvZ3JvdXAgSUQuICovXG4gIHdvcmtzcGFjZUlkOiBzdHJpbmc7XG4gIC8qKiBSZXBvcnQgSUQgKGZvciByZXBvcnQgZW1iZWRkaW5nKS4gKi9cbiAgcmVwb3J0SWQ/OiBzdHJpbmc7XG4gIC8qKiBEYXNoYm9hcmQgSUQgKGZvciBkYXNoYm9hcmQgZW1iZWRkaW5nKS4gKi9cbiAgZGFzaGJvYXJkSWQ/OiBzdHJpbmc7XG4gIC8qKiBET00gZWxlbWVudCB0byBlbWJlZCBpbnRvLiAqL1xuICBjb250YWluZXI6IEhUTUxFbGVtZW50O1xuICAvKiogRW1iZWQgdHlwZTogJ3JlcG9ydCcgb3IgJ2Rhc2hib2FyZCcuIERlZmF1bHRzIHRvICdyZXBvcnQnLiAqL1xuICB0eXBlPzogJ3JlcG9ydCcgfCAnZGFzaGJvYXJkJztcbiAgLyoqIEluaXRpYWwgcGFnZSBuYW1lIGZvciByZXBvcnRzLiAqL1xuICBwYWdlTmFtZT86IHN0cmluZztcbiAgLyoqIFNob3cgdGhlIGZpbHRlciBwYW5lLiBEZWZhdWx0cyB0byBmYWxzZS4gKi9cbiAgc2hvd0ZpbHRlclBhbmU/OiBib29sZWFuO1xuICAvKiogU2hvdyB0aGUgcGFnZSBuYXZpZ2F0aW9uIHBhbmUuIERlZmF1bHRzIHRvIGZhbHNlLiAqL1xuICBzaG93TmF2UGFuZT86IGJvb2xlYW47XG4gIC8qKiBPdmVycmlkZSBhdXRvLXJlc29sdmVkIGRldmljZSByZWdpc3RyYXRpb24ga2V5LiAqL1xuICByZWdpc3RyYXRpb25LZXk/OiBzdHJpbmc7XG4gIC8qKiBPdmVycmlkZSB0aGUgQVBJIGJhc2UgVVJMLiAqL1xuICBiYXNlVXJsPzogc3RyaW5nO1xuICAvKiogVG9rZW4gcmVmcmVzaCBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgKGRlZmF1bHQ6IDU1IG1pbikuICovXG4gIHRva2VuUmVmcmVzaEludGVydmFsPzogbnVtYmVyO1xufVxuXG4vKipcbiAqIFBhcnNlZCBQb3dlciBCSSBnYWRnZXQgcHJlZmVyZW5jZSBhcyBzZXJpYWxpemVkIGJ5IHRoZSB0ZW1wbGF0ZSBlZGl0b3IuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSVBvd2VyQklQcmVmIHtcbiAgLyoqIFBvd2VyIEJJIHdvcmtzcGFjZS9ncm91cCBJRC4gKi9cbiAgd29ya3NwYWNlSWQ/OiBzdHJpbmc7XG4gIC8qKiBSZXBvcnQgSUQuICovXG4gIHJlcG9ydElkPzogc3RyaW5nO1xuICAvKiogRGFzaGJvYXJkIElELiAqL1xuICBkYXNoYm9hcmRJZD86IHN0cmluZztcbiAgLyoqIEVtYmVkIHR5cGU6ICdyZXBvcnQnIG9yICdkYXNoYm9hcmQnLiAqL1xuICB0eXBlPzogJ3JlcG9ydCcgfCAnZGFzaGJvYXJkJztcbiAgLyoqIEluaXRpYWwgcGFnZSBuYW1lIGZvciByZXBvcnRzLiAqL1xuICBwYWdlTmFtZT86IHN0cmluZztcbiAgLyoqIFNob3cgdGhlIGZpbHRlciBwYW5lLiAqL1xuICBzaG93RmlsdGVyUGFuZT86IGJvb2xlYW47XG4gIC8qKiBTaG93IHRoZSBwYWdlIG5hdmlnYXRpb24gcGFuZS4gKi9cbiAgc2hvd05hdlBhbmU/OiBib29sZWFuO1xufVxuIl19
@@ -2,6 +2,7 @@ import { Injectable } from '@angular/core';
2
2
  import { BehaviorSubject, fromEvent, Subject } from 'rxjs';
3
3
  import { filter, map, share, tap } from 'rxjs/operators';
4
4
  import { DataTableRef, DataTablePrefRef } from './datatable-ref';
5
+ import { PowerBIRef, PowerBIPrefRef } from './powerbi-ref';
5
6
  import { version } from './version';
6
7
  import * as i0 from "@angular/core";
7
8
  /**
@@ -855,6 +856,61 @@ export class PlayerClientService {
855
856
  return new DataTablePrefRef(prefValue, this.zone, options);
856
857
  }
857
858
  // ---
859
+ // POWER BI.
860
+ // ---
861
+ /**
862
+ * Creates a typed Power BI embed wrapper for embedding reports and dashboards.
863
+ *
864
+ * @param options - Power BI embed configuration (workspace, report/dashboard, container, etc.)
865
+ * @returns A {@link PowerBIRef} instance
866
+ * @throws Error if the global Power BI library is not loaded
867
+ *
868
+ * ```typescript
869
+ * const pbi = this.client.createPowerBI({
870
+ * workspaceId: '...',
871
+ * reportId: '...',
872
+ * container: document.getElementById('pbi-container')
873
+ * });
874
+ *
875
+ * // Embed the report
876
+ * await pbi.embed();
877
+ *
878
+ * // Refresh the token
879
+ * await pbi.refresh();
880
+ *
881
+ * // Cleanup when done
882
+ * pbi.dispose();
883
+ * ```
884
+ */
885
+ createPowerBI(options) {
886
+ return new PowerBIRef(options, this.zone);
887
+ }
888
+ /**
889
+ * Creates a typed Power BI embed wrapper from a gadget preference value.
890
+ *
891
+ * @param prefValue - The raw gadget preference string (JSON) from the template editor
892
+ * @param container - DOM element to embed into
893
+ * @param extraOptions - Additional options to merge with the preference
894
+ * @returns A {@link PowerBIPrefRef} instance
895
+ * @throws Error if the global Power BI library is not loaded
896
+ *
897
+ * ```typescript
898
+ * const pbi = this.client.createPowerBIFromPref(
899
+ * prefs.getString('rdPowerBI'),
900
+ * document.getElementById('pbi-container')
901
+ * );
902
+ *
903
+ * // Embed with preference settings
904
+ * await pbi.embed();
905
+ *
906
+ * // Cleanup when done
907
+ * pbi.dispose();
908
+ * ```
909
+ */
910
+ createPowerBIFromPref(prefValue, container, extraOptions) {
911
+ return new PowerBIPrefRef(prefValue, container, this.zone, extraOptions);
912
+ }
913
+ // ---
858
914
  // PRIVATE METHODS.
859
915
  // ---
860
916
  /** @ignore */
@@ -989,4 +1045,4 @@ class NoopClient {
989
1045
  }
990
1046
  }
991
1047
  }
992
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFPekQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBY3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQXFLOUIsY0FBYztJQUNkLFlBQVksSUFBWTtRQS9KeEI7Ozs7Ozs7Ozs7O1dBV0c7UUFDSSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztRQUU1Qzs7Ozs7Ozs7Ozs7O1dBWUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0M7Ozs7Ozs7Ozs7V0FVRztRQUNJLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhDOzs7Ozs7Ozs7OztXQVdHO1FBQ0ksWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0I7Ozs7Ozs7OztXQVNHO1FBQ0ksY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFakM7Ozs7Ozs7Ozs7V0FVRztRQUNJLG1CQUFjLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQztRQVV0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RyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVwRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFDbkIsR0FBRyxDQUNKLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixHQUFHLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2FkZ2V0cyB9IGZyb20gJ0ByZXZlbGRpZ2l0YWwvZ2FkZ2V0LXR5cGVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSUNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDb21tYW5kIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbW1hbmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURhdGFUYWJsZU9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvZGF0YXRhYmxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJRGV2aWNlIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2RldmljZS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSUV2ZW50UHJvcGVydGllcyB9IGZyb20gJy4vaW50ZXJmYWNlcy9ldmVudC1wcm9wZXJ0aWVzLmludGVyZmFjZSc7XG5pbXBvcnQgeyBEYXRhVGFibGVSZWYsIERhdGFUYWJsZVByZWZSZWYgfSBmcm9tICcuL2RhdGF0YWJsZS1yZWYnO1xuaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbic7XG5cbi8vaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gJy4vdmVyc2lvbi5qcyc7XG5cbi8vIFNvIHRoYXQgVHlwZVNjcmlwdCBkb2Vzbid0IGNvbXBsYWluLCB3ZSdyZSBnb2luZyB0byBhdWdtZW50IHRoZSBHTE9CQUwgLyBXSU5ET1cgXG4vLyBuYW1lLXNwYWNlIGRlZmluaXRpb24gdG8gaW5jbHVkZSB0aGUgVHJhY2tlciBBUEkuIFRoaXMgYWxzbyBwcm92aWRlcyB1cyB3aXRoIGEgcGxhY2Vcbi8vIHRvIGFjdHVhbGx5IERPQ1VNRU5UIHRoZSBBUEkgc28gdGhhdCBvdXIgZGV2ZWxvcGVycyBhcmVuJ3QgZ3Vlc3NpbmcgYWJvdXQgd2hhdCdzXG4vLyBhdmFpbGFibGUgb24gdGhlIGxpYnJhcnkuXG5cbi8qKiBAaWdub3JlICovXG5kZWNsYXJlIGdsb2JhbCB7XG4gIGxldCBDbGllbnQ6IElDbGllbnQ7XG59XG5cbi8qKlxuICogU2VydmljZSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgUmV2ZWwgRGlnaXRhbCBwbGF5ZXIgY2xpZW50LlxuICogXG4gKiBUaGlzIHNlcnZpY2UgcHJvdmlkZXMgYSBjb21wcmVoZW5zaXZlIGludGVyZmFjZSBmb3IgZ2FkZ2V0cyBhbmQgd2ViIGFwcGxpY2F0aW9uc1xuICogdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgUmV2ZWwgRGlnaXRhbCBwbGF5ZXIgZW52aXJvbm1lbnQuIEl0IGhhbmRsZXMgZGV2aWNlXG4gKiBpbmZvcm1hdGlvbiwgY29tbWFuZHMsIGV2ZW50cywgYW5hbHl0aWNzIHRyYWNraW5nLCBhbmQgY29uZmlndXJhdGlvbiBtYW5hZ2VtZW50LlxuICogXG4gKiBUaGUgc2VydmljZSBzdXBwb3J0cyBib3RoIGRpcmVjdCBBUEkgY2FsbHMgYW5kIGV2ZW50LWJhc2VkIGNvbW11bmljYXRpb24gcGF0dGVybnMsXG4gKiBhbGxvd2luZyBnYWRnZXRzIHRvIHJlc3BvbmQgdG8gcGxheWVyIGxpZmVjeWNsZSBldmVudHMgKHN0YXJ0LCBzdG9wLCBjb21tYW5kcykgYW5kXG4gKiBzZW5kIGRhdGEgYmFjayB0byB0aGUgcGxheWVyIG9yIHJlbW90ZSBkZXZpY2VzLlxuICogXG4gKiBgYGB0eXBlc2NyaXB0XG4gKiBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUGxheWVyQ2xpZW50U2VydmljZSkge1xuICogICAvLyBTdWJzY3JpYmUgdG8gcGxheWVyIGV2ZW50c1xuICogICB0aGlzLmNsaWVudC5vblN0YXJ0JC5zdWJzY3JpYmUoKCkgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdHYWRnZXQgc3RhcnRlZCcpO1xuICogICB9KTtcbiAqICAgXG4gKiAgIHRoaXMuY2xpZW50Lm9uQ29tbWFuZCQuc3Vic2NyaWJlKGNvbW1hbmQgPT4ge1xuICogICAgIGNvbnNvbGUubG9nKCdSZWNlaXZlZCBjb21tYW5kOicsIGNvbW1hbmQpO1xuICogICB9KTtcbiAqIH1cbiAqIFxuICogYXN5bmMgbmdPbkluaXQoKSB7XG4gKiAgIC8vIEdldCBkZXZpY2UgaW5mb3JtYXRpb25cbiAqICAgY29uc3QgZGV2aWNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlKCk7XG4gKiAgIGNvbnN0IGRldmljZVRpbWUgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VUaW1lKCk7XG4gKiAgIFxuICogICAvLyBUcmFjayBhbmFseXRpY3NcbiAqICAgdGhpcy5jbGllbnQudHJhY2soJ2dhZGdldF9sb2FkZWQnLCB7IHZlcnNpb246ICcxLjAnIH0pO1xuICogfVxuICogYGBgXG4gKiBcbiAqIEBzaW5jZSAxLjAuMFxuICovXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBQbGF5ZXJDbGllbnRTZXJ2aWNlIGltcGxlbWVudHMgT25EZXN0cm95IHtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIHpvbmU6IE5nWm9uZTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBjbGllbnRQcm9taXNlOiBQcm9taXNlPElDbGllbnQ+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=
1048
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxheWVyLWNsaWVudC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmV2ZWxkaWdpdGFsL3BsYXllci1jbGllbnQvc3JjL2xpYi9wbGF5ZXItY2xpZW50LnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBcUIsTUFBTSxlQUFlLENBQUM7QUFFOUQsT0FBTyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUN6RSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRekQsT0FBTyxFQUFFLFlBQVksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxXQUFXLENBQUM7O0FBY3BDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0NHO0FBSUgsTUFBTSxPQUFPLG1CQUFtQjtJQXFLOUIsY0FBYztJQUNkLFlBQVksSUFBWTtRQS9KeEI7Ozs7Ozs7Ozs7O1dBV0c7UUFDSSxlQUFVLEdBQUcsSUFBSSxPQUFPLEVBQVksQ0FBQztRQUU1Qzs7Ozs7Ozs7Ozs7O1dBWUc7UUFDSSxhQUFRLEdBQUcsSUFBSSxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFN0M7Ozs7Ozs7Ozs7V0FVRztRQUNJLGFBQVEsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBRWhDOzs7Ozs7Ozs7OztXQVdHO1FBQ0ksWUFBTyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFL0I7Ozs7Ozs7OztXQVNHO1FBQ0ksY0FBUyxHQUFHLElBQUksT0FBTyxFQUFFLENBQUM7UUFFakM7Ozs7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LElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsUUFBUTtRQUVuQixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDL0IsQ0FBQztJQUVNLEtBQUssQ0FBQyxTQUFTO1FBRXBCLE9BQU8sT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRU0sS0FBSyxDQUFDLFdBQVc7UUFFdEIsT0FBTyxPQUFPLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQy9CLENBQUM7SUFFTSxLQUFLLENBQUMsYUFBYTtRQUV4QixPQUFPLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDbEMsQ0FBQztJQUVNLFdBQVcsQ0FBQyxLQUF1QjtRQUV4QyxNQUFNLEdBQUcsR0FBRyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE1BQU0sS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUVwRixJQUFJLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNsQixNQUFNLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FDdkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsRUFDbkIsR0FBRyxDQUNKLENBQUM7UUFDSixDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUNuQixHQUFHLENBQ0osQ0FBQztRQUNKLENBQUM7SUFDSCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBOZ1pvbmUsIE9uRGVzdHJveSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZ2FkZ2V0cyB9IGZyb20gJ0ByZXZlbGRpZ2l0YWwvZ2FkZ2V0LXR5cGVzJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgZnJvbUV2ZW50LCBTdWJqZWN0LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgbWFwLCBzaGFyZSwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgSUNsaWVudCB9IGZyb20gJy4vaW50ZXJmYWNlcy9jbGllbnQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElDb21tYW5kIH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbW1hbmQuaW50ZXJmYWNlJztcbmltcG9ydCB7IElEaWN0aW9uYXJ5IH0gZnJvbSAnLi9pbnRlcmZhY2VzL2NvbmZpZy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURhdGFUYWJsZU9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvZGF0YXRhYmxlLmludGVyZmFjZSc7XG5pbXBvcnQgeyBJUG93ZXJCSU9wdGlvbnMgfSBmcm9tICcuL2ludGVyZmFjZXMvcG93ZXJiaS5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgSURldmljZSB9IGZyb20gJy4vaW50ZXJmYWNlcy9kZXZpY2UuaW50ZXJmYWNlJztcbmltcG9ydCB7IElFdmVudFByb3BlcnRpZXMgfSBmcm9tICcuL2ludGVyZmFjZXMvZXZlbnQtcHJvcGVydGllcy5pbnRlcmZhY2UnO1xuaW1wb3J0IHsgRGF0YVRhYmxlUmVmLCBEYXRhVGFibGVQcmVmUmVmIH0gZnJvbSAnLi9kYXRhdGFibGUtcmVmJztcbmltcG9ydCB7IFBvd2VyQklSZWYsIFBvd2VyQklQcmVmUmVmIH0gZnJvbSAnLi9wb3dlcmJpLXJlZic7XG5pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uJztcblxuLy9pbXBvcnQgeyB2ZXJzaW9uIH0gZnJvbSAnLi92ZXJzaW9uLmpzJztcblxuLy8gU28gdGhhdCBUeXBlU2NyaXB0IGRvZXNuJ3QgY29tcGxhaW4sIHdlJ3JlIGdvaW5nIHRvIGF1Z21lbnQgdGhlIEdMT0JBTCAvIFdJTkRPVyBcbi8vIG5hbWUtc3BhY2UgZGVmaW5pdGlvbiB0byBpbmNsdWRlIHRoZSBUcmFja2VyIEFQSS4gVGhpcyBhbHNvIHByb3ZpZGVzIHVzIHdpdGggYSBwbGFjZVxuLy8gdG8gYWN0dWFsbHkgRE9DVU1FTlQgdGhlIEFQSSBzbyB0aGF0IG91ciBkZXZlbG9wZXJzIGFyZW4ndCBndWVzc2luZyBhYm91dCB3aGF0J3Ncbi8vIGF2YWlsYWJsZSBvbiB0aGUgbGlicmFyeS5cblxuLyoqIEBpZ25vcmUgKi9cbmRlY2xhcmUgZ2xvYmFsIHtcbiAgbGV0IENsaWVudDogSUNsaWVudDtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIGZvciBpbnRlcmFjdGluZyB3aXRoIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllciBjbGllbnQuXG4gKiBcbiAqIFRoaXMgc2VydmljZSBwcm92aWRlcyBhIGNvbXByZWhlbnNpdmUgaW50ZXJmYWNlIGZvciBnYWRnZXRzIGFuZCB3ZWIgYXBwbGljYXRpb25zXG4gKiB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBSZXZlbCBEaWdpdGFsIHBsYXllciBlbnZpcm9ubWVudC4gSXQgaGFuZGxlcyBkZXZpY2VcbiAqIGluZm9ybWF0aW9uLCBjb21tYW5kcywgZXZlbnRzLCBhbmFseXRpY3MgdHJhY2tpbmcsIGFuZCBjb25maWd1cmF0aW9uIG1hbmFnZW1lbnQuXG4gKiBcbiAqIFRoZSBzZXJ2aWNlIHN1cHBvcnRzIGJvdGggZGlyZWN0IEFQSSBjYWxscyBhbmQgZXZlbnQtYmFzZWQgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyxcbiAqIGFsbG93aW5nIGdhZGdldHMgdG8gcmVzcG9uZCB0byBwbGF5ZXIgbGlmZWN5Y2xlIGV2ZW50cyAoc3RhcnQsIHN0b3AsIGNvbW1hbmRzKSBhbmRcbiAqIHNlbmQgZGF0YSBiYWNrIHRvIHRoZSBwbGF5ZXIgb3IgcmVtb3RlIGRldmljZXMuXG4gKiBcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBQbGF5ZXJDbGllbnRTZXJ2aWNlKSB7XG4gKiAgIC8vIFN1YnNjcmliZSB0byBwbGF5ZXIgZXZlbnRzXG4gKiAgIHRoaXMuY2xpZW50Lm9uU3RhcnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ0dhZGdldCBzdGFydGVkJyk7XG4gKiAgIH0pO1xuICogICBcbiAqICAgdGhpcy5jbGllbnQub25Db21tYW5kJC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XG4gKiAgICAgY29uc29sZS5sb2coJ1JlY2VpdmVkIGNvbW1hbmQ6JywgY29tbWFuZCk7XG4gKiAgIH0pO1xuICogfVxuICogXG4gKiBhc3luYyBuZ09uSW5pdCgpIHtcbiAqICAgLy8gR2V0IGRldmljZSBpbmZvcm1hdGlvblxuICogICBjb25zdCBkZXZpY2UgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2UoKTtcbiAqICAgY29uc3QgZGV2aWNlVGltZSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZVRpbWUoKTtcbiAqICAgXG4gKiAgIC8vIFRyYWNrIGFuYWx5dGljc1xuICogICB0aGlzLmNsaWVudC50cmFjaygnZ2FkZ2V0X2xvYWRlZCcsIHsgdmVyc2lvbjogJzEuMCcgfSk7XG4gKiB9XG4gKiBgYGBcbiAqIFxuICogQHNpbmNlIDEuMC4wXG4gKi9cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFBsYXllckNsaWVudFNlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgem9uZTogTmdab25lO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIGNsaWVudFByb21pc2U6IFByb21pc2U8SUNsaWVudD4gfCBudWxsO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHN0cmVhbSBvZiBjb21tYW5kcyBzZW50IHRvIHRoaXMgcGxheWVyIGZyb20gdGhlIFJldmVsIERpZ2l0YWwgcGxhdGZvcm0uXG4gICAqIFN1YnNjcmliZSB0byB0aGlzIHRvIGhhbmRsZSBjdXN0b20gY29tbWFuZHMgc2VudCBmcm9tIHRlbXBsYXRlcywgcGxheWxpc3RzLCBvciByZW1vdGUgZGV2aWNlcy5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25Db21tYW5kJC5zdWJzY3JpYmUoY29tbWFuZCA9PiB7XG4gICAqICAgaWYgKGNvbW1hbmQubmFtZSA9PT0gJ2N1c3RvbUFjdGlvbicpIHtcbiAgICogICAgIHRoaXMuaGFuZGxlQ3VzdG9tQWN0aW9uKGNvbW1hbmQuYXJnKTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvbkNvbW1hbmQkID0gbmV3IFN1YmplY3Q8SUNvbW1hbmQ+KCk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIHdoZW4gdGhlIGdhZGdldCBoYXMgYmVlbiBsb2FkZWQgYW5kIGlzIHJlYWR5IHRvIHN0YXJ0LlxuICAgKiBFbWl0cyBgdHJ1ZWAgd2hlbiByZWFkeSwgYGZhbHNlYCB3aGVuIGRlc3Ryb3llZC5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25SZWFkeSQuc3Vic2NyaWJlKGlzUmVhZHkgPT4ge1xuICAgKiAgIGlmIChpc1JlYWR5KSB7XG4gICAqICAgICBjb25zb2xlLmxvZygnQ2xpZW50IGlzIHJlYWR5Jyk7XG4gICAqICAgICB0aGlzLmluaXRpYWxpemVHYWRnZXQoKTtcbiAgICogICB9XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvblJlYWR5JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBnYWRnZXQgaGFzIGJlZW4gc3RhcnRlZCBieSB0aGUgcGxheWVyLlxuICAgKiBUaGlzIGV2ZW50IG9jY3VycyB3aGVuIHRoZSBwbGF5ZXIgYmVnaW5zIGV4ZWN1dGlvbiBvZiB0aGUgZ2FkZ2V0IGNvbnRlbnQuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uU3RhcnQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAqICAgY29uc29sZS5sb2coJ0dhZGdldCBzdGFydGVkJyk7XG4gICAqICAgdGhpcy5zdGFydEFuaW1hdGlvbigpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25TdGFydCQgPSBuZXcgU3ViamVjdCgpO1xuXG4gIC8qKlxuICAgKiBPYnNlcnZhYmxlIHRoYXQgc2lnbmFscyB3aGVuIHRoZSBnYWRnZXQgaGFzIGJlZW4gc3RvcHBlZCBieSB0aGUgcGxheWVyLlxuICAgKiBUaGlzIGV2ZW50IG9jY3VycyB3aGVuIHRoZSBwbGF5ZXIgc3RvcHMgZXhlY3V0aW9uLCB0eXBpY2FsbHkgd2hlbiBtb3ZpbmdcbiAgICogdG8gdGhlIG5leHQgaXRlbSBpbiBhIHBsYXlsaXN0IG9yIHdoZW4gdGhlIGNvbnRlbnQgZHVyYXRpb24gZXhwaXJlcy5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25TdG9wJC5zdWJzY3JpYmUoKCkgPT4ge1xuICAgKiAgIGNvbnNvbGUubG9nKCdHYWRnZXQgc3RvcHBlZCcpO1xuICAgKiAgIHRoaXMuY2xlYW51cCgpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25TdG9wJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLyoqXG4gICAqIE9ic2VydmFibGUgdGhhdCBzaWduYWxzIHdoZW4gdGhlIGdhZGdldCBzaG91bGQgb3BlbiB0aGUgY29uZmlndXJhdGlvbiB3aW5kb3cuXG4gICAqIFRoaXMgYWxsb3dzIGdhZGdldHMgdG8gcmVzcG9uZCB0byBjb25maWd1cmF0aW9uIHJlcXVlc3RzIGZyb20gdGhlIHBsYXllci5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogdGhpcy5jbGllbnQub25Db25maWckLnN1YnNjcmliZSgoKSA9PiB7XG4gICAqICAgdGhpcy5vcGVuQ29uZmlndXJhdGlvbkRpYWxvZygpO1xuICAgKiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgb25Db25maWckID0gbmV3IFN1YmplY3QoKTtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IHNpZ25hbHMgd2hlbiB0aGUgZ2FkZ2V0IGhhcyByZWNlaXZlZCBhIHBvc3RNZXNzYWdlIGV2ZW50IGZyb20gdGhlIHBsYXllci5cbiAgICogVGhpcyBoYW5kbGVzIGNvbW11bmljYXRpb24gYmV0d2VlbiB0aGUgZ2FkZ2V0IGFuZCBwbGF5ZXIgdmlhIHRoZSBwb3N0TWVzc2FnZSBBUEkuXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIHRoaXMuY2xpZW50Lm9uUG9zdE1lc3NhZ2UkLnN1YnNjcmliZShtZXNzYWdlID0+IHtcbiAgICogICBjb25zb2xlLmxvZygnUmVjZWl2ZWQgbWVzc2FnZTonLCBtZXNzYWdlKTtcbiAgICogICB0aGlzLmhhbmRsZVBsYXllck1lc3NhZ2UobWVzc2FnZSk7XG4gICAqIH0pO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBvblBvc3RNZXNzYWdlJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgLy9cbiAgLy8gVHdvIG1ldGhvZHMgYXZhaWxhYmxlIGZvciBjYWxsaW5nIGludG8gdGhlIGxpYnJhcnk6XG4gIC8vXG4gIC8vIDEpIFVzaW5nIGRpc3BhdGNoRXZlbnQoKSB3aXRoIHRoZSBmb2xsb3dpbmcgY3VzdG9tIGV2ZW50c1xuICAvLyAyKSBVc2luZyB0aGUgd2luZG93IHNjb3BlZCBSZXZlbERpZ2l0YWwgb2JqZWN0IGFzIGRlZmluZWQgaW4gdGhlIGNvbnN0cnVjdG9yXG4gIC8vXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25TdGFydFN1YjogU3Vic2NyaXB0aW9uO1xuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIG9uU3RhcnRFdnQkID0gZnJvbUV2ZW50KHdpbmRvdywgJ1JldmVsRGlnaXRhbC5TdGFydCcpLnBpcGUoXG4gICAgc2hhcmUoKSxcbiAgICB0YXAodGhpcy5vblN0YXJ0JClcbiAgKTtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvblN0b3BTdWI6IFN1YnNjcmlwdGlvbjtcbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBvblN0b3BFdnQkID0gZnJvbUV2ZW50KHdpbmRvdywgJ1JldmVsRGlnaXRhbC5TdG9wJykucGlwZShcbiAgICBzaGFyZSgpLFxuICAgIHRhcCh0aGlzLm9uU3RvcCQpXG4gICk7XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25Db21tYW5kU3ViOiBTdWJzY3JpcHRpb247XG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgb25Db21tYW5kRXZ0JCA9IGZyb21FdmVudDxJQ29tbWFuZD4od2luZG93LCAnUmV2ZWxEaWdpdGFsLkNvbW1hbmQnKS5waXBlKFxuICAgIG1hcCgoZTogYW55KSA9PiB7IHJldHVybiB7IG5hbWU6IGUuZGV0YWlsLm5hbWUsIGFyZzogZS5kZXRhaWwuYXJnIH0gYXMgSUNvbW1hbmQgfSksXG4gICAgc2hhcmUoKSxcbiAgICB0YXAodGhpcy5vbkNvbW1hbmQkKVxuICApO1xuICAvKiogQGlnbm9yZSAqL1xuICAvLyBwcml2YXRlIG9uQ29uZmlnU3ViOiBTdWJzY3JpcHRpb247XG4gIC8vIC8qKiBAaWdub3JlICovXG4gIC8vIHByaXZhdGUgb25Db25maWdFdnQkID0gZnJvbUV2ZW50KHdpbmRvdywgJ1JldmVsRGlnaXRhbC5Db25maWcnKS5waXBlKFxuICAvLyAgIHNoYXJlKCksXG4gIC8vICAgdGFwKChlOiBDdXN0b21FdmVudCkgPT4ge1xuICAvLyAgICAgY29uc29sZS5sb2coZSk7XG5cbiAgLy8gICAgIGlmIChlLmRldGFpbC50eXBlID09PSAnYXBwbHlDb25maWcnICYmIGUuZGV0YWlsLmlzT3BlbmVyKSB7XG4gIC8vICAgICAgIHRoaXMuYXBwbHlDb25maWcoZS5kZXRhaWwuY29uZmlnKTsgLy8gcHJvcGFnYXRlIGNvbmZpZyB0byBpZnJhbWUgcGFyZW50IGZyb20gdGhlIHBvcHVwIHdpbmRvd1xuICAvLyAgICAgfSBlbHNlIHtcbiAgLy8gICAgICAgdGhpcy5vbkNvbmZpZyQubmV4dChlLmRldGFpbCk7XG4gIC8vICAgICB9XG4gIC8vICAgfSlcbiAgLy8gKTtcbiAgLy8gcHJpdmF0ZSBvblBvc3RNZXNzYWdlU3ViOiBTdWJzY3JpcHRpb247XG4gIC8vIHByaXZhdGUgb25Qb3N0TWVzc2FnZUV2dCQgPSBmcm9tRXZlbnQod2luZG93LCAnbWVzc2FnZScpLnBpcGUoXG4gIC8vICAgZmlsdGVyKChtZXNzYWdlRXZlbnQ6IE1lc3NhZ2VFdmVudCkgPT5cbiAgLy8gICAgIG1lc3NhZ2VFdmVudC5zb3VyY2UgIT09IHdpbmRvdy5wYXJlbnQgJiZcbiAgLy8gICAgIHR5cGVvZiBtZXNzYWdlRXZlbnQuZGF0YSA9PT0gJ3N0cmluZycgJiZcbiAgLy8gICAgIG1lc3NhZ2VFdmVudC5kYXRhLnN0YXJ0c1dpdGgoJ3JldmVsZGlnaXRhbDonKSksXG4gIC8vICAgbWFwKChlOiBhbnkpID0+IHsgcmV0dXJuIEpTT04ucGFyc2UoZS5zdWJzdHJpbmcoMTMpKSBhcyBDb21tYW5kIH0pLFxuICAvLyAgIHNoYXJlKCksXG4gIC8vICAgdGFwKHRoaXMub25Db21tYW5kJClcbiAgLy8gKTtcblxuICBwcml2YXRlIG9uUG9zdE1lc3NhZ2VTdWI6IFN1YnNjcmlwdGlvbjtcbiAgcHJpdmF0ZSBvblBvc3RNZXNzYWdlRXZ0JCA9IGZyb21FdmVudCh3aW5kb3csICdtZXNzYWdlJykucGlwZShcbiAgICBmaWx0ZXIoKG1lc3NhZ2VFdmVudDogTWVzc2FnZUV2ZW50KSA9PlxuICAgICAgLy9tZXNzYWdlRXZlbnQuc291cmNlICE9PSB3aW5kb3cucGFyZW50ICYmXG4gICAgICB0eXBlb2YgbWVzc2FnZUV2ZW50LmRhdGEgPT09ICdzdHJpbmcnKSxcbiAgICBtYXAoKGU6IGFueSkgPT4gSlNPTi5wYXJzZShlLmRhdGEpKSxcbiAgICBzaGFyZSgpLFxuICAgIHRhcCgoZTogYW55KSA9PiB7XG4gICAgICBpZiAoZS50eXBlID09PSAnYXBwbHlDb25maWcnICYmIGUuaXNPcGVuZXIpIHtcbiAgICAgICAgZS5pc09wZW5lciA9IGZhbHNlO1xuICAgICAgICAvLyBwcm9wYWdhdGUgY29uZmlnIHRvIGlmcmFtZSBwYXJlbnQgZnJvbSB0aGUgcG9wdXAgd2luZG93XG4gICAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgSlNPTi5zdHJpbmdpZnkoZSksXG4gICAgICAgICAgJyonXG4gICAgICAgICk7XG4gICAgICB9IGVsc2UgaWYgKGUudHlwZSA9PT0gJ29wZW5Db25maWcnKSB7XG4gICAgICAgIHRoaXMub25Db25maWckLm5leHQobnVsbCk7XG4gICAgICB9XG4gICAgfSksXG4gICAgdGFwKGUgPT4gdGhpcy5vblBvc3RNZXNzYWdlJC5uZXh0KGUpKVxuICApO1xuXG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgY29uc3RydWN0b3Ioem9uZTogTmdab25lKSB7XG5cbiAgICB0aGlzLnpvbmUgPSB6b25lO1xuXG4gICAgKHdpbmRvdyBhcyBhbnkpLlJldmVsRGlnaXRhbCA9IHtcbiAgICAgIENvbnRyb2xsZXI6IHtcbiAgICAgICAgb25Db21tYW5kOiAobmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZykgPT4ge1xuICAgICAgICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25Db21tYW5kJC5uZXh0KHsgbmFtZTogbmFtZSwgYXJnOiBhcmcgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU3RhcnQ6ICgpID0+IHtcbiAgICAgICAgICB6b25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm9uU3RhcnQkLm5leHQobnVsbCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uU3RvcDogKCkgPT4ge1xuICAgICAgICAgIHpvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25TdG9wJC5uZXh0KG51bGwpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5vblN0YXJ0U3ViID0gdGhpcy5vblN0YXJ0RXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB0aGlzLm9uU3RvcFN1YiA9IHRoaXMub25TdG9wRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB0aGlzLm9uQ29tbWFuZFN1YiA9IHRoaXMub25Db21tYW5kRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICAvL3RoaXMub25Db25maWdTdWIgPSB0aGlzLm9uQ29uZmlnRXZ0JC5zdWJzY3JpYmUoKCkgPT4geyB9KTtcbiAgICB0aGlzLm9uUG9zdE1lc3NhZ2VTdWIgPSB0aGlzLm9uUG9zdE1lc3NhZ2VFdnQkLnN1YnNjcmliZSgoKSA9PiB7IH0pO1xuXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbnVsbDtcblxuICAgIHRoaXMub25SZWFkeSQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuXG4gICAgdGhpcy5vblN0YXJ0U3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25TdG9wU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIHRoaXMub25Db21tYW5kU3ViPy51bnN1YnNjcmliZSgpO1xuICAgIC8vdGhpcy5vbkNvbmZpZ1N1Yj8udW5zdWJzY3JpYmUoKTtcbiAgICB0aGlzLm9uUG9zdE1lc3NhZ2VTdWI/LnVuc3Vic2NyaWJlKCk7XG5cbiAgICB0aGlzLm9uUmVhZHkkLm5leHQoZmFsc2UpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHVibGljIHN0YXRpYyBpbml0KGRhdGE6IGFueSkge1xuXG4gICAgY29uc29sZS5sb2coXG4gICAgICAnJWPimpnvuI8gSW5pdGlhbGl6aW5nIFJldmVsIERpZ2l0YWwgY2xpZW50IGxpYnJhcnknLFxuICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY2FsbGJhY2sgdG8gcGxheWVyIHNjcmlwdGluZyB3aXRoIHZhcmlhYmxlIGFyZ3VtZW50cy5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIGFsbG93cyB0aGUgZ2FkZ2V0IHRvIGNvbW11bmljYXRlIHdpdGggcGxheWVyIHNjcmlwdGluZy5cbiAgICogSWYgdGhlIGFwcHJvcHJpYXRlIHNjcmlwdGluZyBpcyBpbiBwbGFjZSBpbiB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGVtcGxhdGUsIFxuICAgKiBjYWxsaW5nIHRoaXMgbWV0aG9kIHdpbGwgaW5pdGlhdGUgYSBjYWxsYmFjayB3aGljaCBjYW4gYmUgYWN0ZWQgdXBvbiBpbiBwbGF5ZXIgc2NyaXB0LlxuICAgKiBcbiAgICogQHBhcmFtIGFyZ3MgLSBWYXJpYWJsZSBudW1iZXIgb2YgYXJndW1lbnRzIHRvIHBhc3MgdG8gdGhlIGNhbGxiYWNrIChtYXggNSBhcmd1bWVudHMpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNlbmQgYSBzaW1wbGUgY2FsbGJhY2tcbiAgICogdGhpcy5jbGllbnQuY2FsbGJhY2soJ3Rlc3QnLCAnZGF0YScpO1xuICAgKiBcbiAgICogLy8gU2VuZCBtdWx0aXBsZSBwYXJhbWV0ZXJzXG4gICAqIHRoaXMuY2xpZW50LmNhbGxiYWNrKCdhY3Rpb24nLCAndmFsdWUxJywgJ3ZhbHVlMicsIHsgZGF0YTogJ29iamVjdCcgfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGNhbGxiYWNrKC4uLmFyZ3M6IGFueVtdKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuXG4gICAgICBzd2l0Y2ggKGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgIGNhc2UgMDpcbiAgICAgICAgICBjbGllbnQuY2FsbGJhY2soKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzBdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzFdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzNdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSA1OlxuICAgICAgICAgIGNsaWVudC5jYWxsYmFjayhhcmdzWzRdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIHVzZXIgcHJlZmVyZW5jZXMgaW50ZXJmYWNlIGV4cG9zZWQgYnkgdGhlIEdvb2dsZSBHYWRnZXRzIEFQSS5cbiAgICogXG4gICAqIFRoaXMgbWV0aG9kIHByb3ZpZGVzIGFjY2VzcyB0byBnYWRnZXQgcHJlZmVyZW5jZXMgd2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWRcbiAgICogaW4gdGhlIFJldmVsIERpZ2l0YWwgQ01TLiBVc2UgdGhpcyB0byByZXRyaWV2ZSB1c2VyLWNvbmZpZ3VyYWJsZSBzZXR0aW5nc1xuICAgKiBmb3IgeW91ciBnYWRnZXQuXG4gICAqIFxuICAgKiBAcmV0dXJucyBUaGUgR2FkZ2V0cyBBUEkgUHJlZnMgb2JqZWN0IGZvciBhY2Nlc3NpbmcgcHJlZmVyZW5jZSB2YWx1ZXNcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3RydWN0b3IocHVibGljIGNsaWVudDogUGxheWVyQ2xpZW50U2VydmljZSkge1xuICAgKiAgIGNvbnN0IHByZWZzID0gY2xpZW50LmdldFByZWZzKCk7XG4gICAqICAgY29uc3QgbXlTdHJpbmcgPSBwcmVmcy5nZXRTdHJpbmcoJ215U3RyaW5nUHJlZicpO1xuICAgKiAgIGNvbnN0IG15TnVtYmVyID0gcHJlZnMuZ2V0SW50KCdteU51bWJlclByZWYnKTtcbiAgICogICBjb25zdCBteUJvb2wgPSBwcmVmcy5nZXRCb29sKCdteUJvb2xQcmVmJyk7XG4gICAqIH1cbiAgICogYGBgXG4gICAqIFxuICAgKiBAc2VlIHtAbGluayBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9nYWRnZXRzL2RvY3MvYmFzaWN9IEdvb2dsZSBHYWRnZXRzIEFQSSBkb2N1bWVudGF0aW9uXG4gICAqL1xuICBwdWJsaWMgZ2V0UHJlZnMoKTogZ2FkZ2V0cy5QcmVmcyB7XG5cbiAgICByZXR1cm4gbmV3IHdpbmRvd1snZ2FkZ2V0cyddWydQcmVmcyddKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgY3VycmVudCBkZXZpY2UgdGltZSBpbiBJU084NjAxIGZvcm1hdC5cbiAgICogXG4gICAqIEN1cnJlbnQgZGV2aWNlIHRpbWUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZGV2aWNlIHRpbWV6b25lIGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UgaW4gdGhlIENNUy5cbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIGRpc3BsYXlpbmcgdGltZS1zZW5zaXRpdmUgY29udGVudCBvciBzY2hlZHVsaW5nIG9wZXJhdGlvbnMgYmFzZWQgb25cbiAgICogdGhlIGRldmljZSdzIGxvY2FsIHRpbWUgcmF0aGVyIHRoYW4gYnJvd3NlciB0aW1lLlxuICAgKiBcbiAgICogQHBhcmFtIGRhdGUgLSBPcHRpb25hbC4gSWYgc3VwcGxpZWQsIHdpbGwgdHJhbnNsYXRlIHRoZSBzdXBwbGllZCBkYXRlL3RpbWUgdG8gZGV2aWNlIHRpbWUgYmFzZWQgb24gcmVzcGVjdGl2ZSB0aW1lem9uZXNcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZGF0ZS90aW1lIGluIElTTzg2MDEgZm9ybWF0XG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIEdldCBjdXJyZW50IGRldmljZSB0aW1lXG4gICAqIGNvbnN0IGN1cnJlbnRUaW1lID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRpbWU6JywgY3VycmVudFRpbWUpO1xuICAgKiBcbiAgICogLy8gQ29udmVydCBhIHNwZWNpZmljIGRhdGUgdG8gZGV2aWNlIHRpbWVcbiAgICogY29uc3Qgc3BlY2lmaWNEYXRlID0gbmV3IERhdGUoJzIwMjMtMDEtMDFUMTI6MDA6MDBaJyk7XG4gICAqIGNvbnN0IGRldmljZVRpbWUgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VUaW1lKHNwZWNpZmljRGF0ZSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWUoZGF0ZT86IERhdGUpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIGlmIChkYXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZShkYXRlKTtcbiAgICB9XG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgdGltZXpvbmUgbmFtZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0aW1lem9uZSBuYW1lIChlLmcuLCBcIkFtZXJpY2EvTmV3X1lvcmtcIilcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgdGltZXpvbmVOYW1lID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk7XG4gICAqIGNvbnNvbGUubG9nKCdEZXZpY2UgdGltZXpvbmU6JywgdGltZXpvbmVOYW1lKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZU5hbWUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB0aW1lem9uZSBJRCBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0aW1lem9uZSBJRFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB0aW1lem9uZUlkID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVJRCgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRpbWV6b25lIElEOicsIHRpbWV6b25lSWQpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZUlEKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXREZXZpY2VUaW1lWm9uZUlEKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgbnVtZXJpY2FsIG9mZnNldCBmcm9tIEdNVCBvZiB0aGUgdGltZXpvbmUgY3VycmVudGx5IGFzc2lnbmVkIHRvIHRoZSBkZXZpY2UuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdGltZXpvbmUgb2Zmc2V0IGluIGhvdXJzIChlLmcuLCAtNSBmb3IgRVNUKVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIHRpbWV6b25lIG9mZnNldDonLCBvZmZzZXQsICdob3VycyBmcm9tIEdNVCcpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VUaW1lWm9uZU9mZnNldCgpOiBQcm9taXNlPG51bWJlcj4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIHJldHVybiBjbGllbnQuZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSBsYW5ndWFnZSBjb2RlIG9mIHRoZSBsYW5ndWFnZSBjdXJyZW50bHkgYXNzaWduZWQgdG8gdGhlIGRldmljZS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBsYW5ndWFnZSBjb2RlIChlLmcuLCBcImVuLVVTXCIsIFwiZnItRlJcIilcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgbGFuZ3VhZ2VDb2RlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0TGFuZ3VhZ2VDb2RlKCk7XG4gICAqIGNvbnNvbGUubG9nKCdEZXZpY2UgbGFuZ3VhZ2U6JywgbGFuZ3VhZ2VDb2RlKTtcbiAgICogLy8gVXNlIGZvciBsb2NhbGl6YXRpb25cbiAgICogdGhpcy5sb2FkTGFuZ3VhZ2VSZXNvdXJjZXMobGFuZ3VhZ2VDb2RlKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRMYW5ndWFnZUNvZGUoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB1bmlxdWUgUmV2ZWwgRGlnaXRhbCBkZXZpY2Uga2V5IGFzc29jaWF0ZWQgd2l0aCB0aGUgZGV2aWNlLlxuICAgKiBcbiAgICogVGhlIGRldmljZSBrZXkgaXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBzcGVjaWZpYyBwbGF5ZXIgZGV2aWNlXG4gICAqIGFuZCBjYW4gYmUgdXNlZCBmb3IgZGV2aWNlLXNwZWNpZmljIG9wZXJhdGlvbnMgb3IgcmVtb3RlIGNvbW1hbmRzLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGRldmljZSBrZXkgc3RyaW5nXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGRldmljZUtleSA9IGF3YWl0IHRoaXMuY2xpZW50LmdldERldmljZUtleSgpO1xuICAgKiBjb25zb2xlLmxvZygnRGV2aWNlIGtleTonLCBkZXZpY2VLZXkpO1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2VLZXkoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50LmdldERldmljZUtleSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byB0aGUgbG9jYWwgcGxheWVyIGRldmljZS5cbiAgICogXG4gICAqIENvbW1hbmRzIGNhbiBiZSB1c2VkIHRvIGNvbnRyb2wgdmFyaW91cyBhc3BlY3RzIG9mIHRoZSBwbGF5ZXIgb3IgdHJpZ2dlclxuICAgKiBzcGVjaWZpYyBiZWhhdmlvcnMuIFRoZSBjb21tYW5kIGlzIHByb2Nlc3NlZCBieSB0aGUgbG9jYWwgcGxheWVyIG9ubHkuXG4gICAqIFxuICAgKiBAcGFyYW0gbmFtZSAtIFRoZSBjb21tYW5kIG5hbWUvaWRlbnRpZmllclxuICAgKiBAcGFyYW0gYXJnIC0gVGhlIGNvbW1hbmQgYXJndW1lbnQvcGF5bG9hZFxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiAvLyBTZW5kIGEgc2ltcGxlIGNvbW1hbmRcbiAgICogdGhpcy5jbGllbnQuc2VuZENvbW1hbmQoJ3JlZnJlc2gnLCAnJyk7XG4gICAqIFxuICAgKiAvLyBTZW5kIGEgY29tbWFuZCB3aXRoIGRhdGFcbiAgICogdGhpcy5jbGllbnQuc2VuZENvbW1hbmQoJ3NldFZvbHVtZScsICc1MCcpO1xuICAgKiBcbiAgICogLy8gU2VuZCBhIGNvbW1hbmQgd2l0aCBKU09OIGRhdGFcbiAgICogdGhpcy5jbGllbnQuc2VuZENvbW1hbmQoJ2NvbmZpZ3VyZScsIEpTT04uc3RyaW5naWZ5KHsgc2V0dGluZzogJ3ZhbHVlJyB9KSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHNlbmRDb21tYW5kKG5hbWU6IHN0cmluZywgYXJnOiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIHRoaXMuZ2V0Q2xpZW50KCkudGhlbigoY2xpZW50KSA9PiB7XG4gICAgICBjbGllbnQuc2VuZENvbW1hbmQobmFtZSwgYXJnKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFNlbmRzIGEgY29tbWFuZCB0byByZW1vdGUgcGxheWVyIGRldmljZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGRldmljZSBrZXlzLlxuICAgKiBcbiAgICogUmVtb3RlIGNvbW1hbmRzIGFsbG93IGNyb3NzLWRldmljZSBjb21tdW5pY2F0aW9uIHdpdGhpbiB0aGUgc2FtZSBSZXZlbCBEaWdpdGFsIGFjY291bnQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBzeW5jaHJvbml6ZWQgZGlzcGxheXMsIGRldmljZSBjb29yZGluYXRpb24sIG9yIHJlbW90ZSBjb250cm9sIHNjZW5hcmlvcy5cbiAgICogXG4gICAqIE5vdGU6IFJlbW90ZSBjb21tYW5kcyBjYW4gb25seSBiZSBkZWxpdmVyZWQgdG8gZGV2aWNlcyB3aXRoaW4gdGhlIHNhbWUgYWNjb3VudCBhcyB0aGUgc2VuZGVyIGRldmljZS5cbiAgICogXG4gICAqIEBwYXJhbSBkZXZpY2VLZXlzIC0gQXJyYXkgb2YgdGFyZ2V0IGRldmljZSBrZXlzIHRvIHNlbmQgdGhlIGNvbW1hbmQgdG9cbiAgICogQHBhcmFtIG5hbWUgLSBUaGUgY29tbWFuZCBuYW1lL2lkZW50aWZpZXJcbiAgICogQHBhcmFtIGFyZyAtIFRoZSBjb21tYW5kIGFyZ3VtZW50L3BheWxvYWRcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU2VuZCBjb21tYW5kIHRvIHNwZWNpZmljIGRldmljZXNcbiAgICogY29uc3QgdGFyZ2V0RGV2aWNlcyA9IFsnZGV2aWNlLWtleS0xJywgJ2RldmljZS1rZXktMiddO1xuICAgKiB0aGlzLmNsaWVudC5zZW5kUmVtb3RlQ29tbWFuZCh0YXJnZXREZXZpY2VzLCAnc3luY0FjdGlvbicsICdzdGFydCcpO1xuICAgKiBcbiAgICogLy8gQnJvYWRjYXN0IHRvIG11bHRpcGxlIGRldmljZXNcbiAgICogdGhpcy5jbGllbnQuc2VuZFJlbW90ZUNvbW1hbmQoXG4gICAqICAgWydsb2JieS1kaXNwbGF5JywgJ2tpb3NrLTEnLCAna2lvc2stMiddLCBcbiAgICogICAndXBkYXRlQ29udGVudCcsIFxuICAgKiAgIEpTT04uc3RyaW5naWZ5KHsgY29udGVudElkOiAnMTIzNDUnIH0pXG4gICAqICk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXM6IHN0cmluZ1tdLCBuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuICAgICAgY2xpZW50LnNlbmRSZW1vdGVDb21tYW5kKGRldmljZUtleXMsIG5hbWUsIGFyZyk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ncyBhbiBhbmFseXRpY3MgZXZlbnQgZm9yIHVzZSB3aXRoIEFkSGF3ayBhbmFseXRpY3MgYW5kIHJlcG9ydGluZy5cbiAgICogXG4gICAqIEV2ZW50cyBhcmUgdXNlZCBmb3IgdHJhY2tpbmcgdmFyaW91cyBtZXRyaWNzIGluY2x1ZGluZyB1c2FnZSBzdGF0aXN0aWNzLCBcbiAgICogcGxheWVyIGNvbmRpdGlvbiwgc3RhdGUgY2hhbmdlcywgdXNlciBpbnRlcmFjdGlvbnMsIGFuZCBjdXN0b20gYnVzaW5lc3MgbWV0cmljcy5cbiAgICogVGhlc2UgZXZlbnRzIGNhbiBiZSB2aWV3ZWQgaW4gdGhlIFJldmVsIERpZ2l0YWwgYW5hbHl0aWNzIGRhc2hib2FyZC5cbiAgICogXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBVbmlxdWUgbmFtZSBmb3IgdGhpcyBldmVudCAoc2hvdWxkIGJlIGRlc2NyaXB0aXZlIGFuZCBjb25zaXN0ZW50KVxuICAgKiBAcGFyYW0gcHJvcGVydGllcyAtIE9wdGlvbmFsIG1hcCBvZiB1c2VyLWRlZmluZWQgcHJvcGVydGllcyB0byBhc3NvY2lhdGUgd2l0aCB0aGlzIGV2ZW50XG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFNpbXBsZSBldmVudCB0cmFja2luZ1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnZ2FkZ2V0X2xvYWRlZCcpO1xuICAgKiBcbiAgICogLy8gRXZlbnQgd2l0aCBwcm9wZXJ0aWVzXG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCd1c2VyX2ludGVyYWN0aW9uJywge1xuICAgKiAgIGFjdGlvbjogJ2J1dHRvbl9jbGljaycsXG4gICAqICAgYnV0dG9uX2lkOiAnc3RhcnRfYnV0dG9uJyxcbiAgICogICB0aW1lc3RhbXA6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKVxuICAgKiB9KTtcbiAgICogXG4gICAqIC8vIFBlcmZvcm1hbmNlIHRyYWNraW5nXG4gICAqIHRoaXMuY2xpZW50LnRyYWNrKCdjb250ZW50X2Rpc3BsYXllZCcsIHtcbiAgICogICBjb250ZW50X3R5cGU6ICd2aWRlbycsXG4gICAqICAgZHVyYXRpb246IDMwLFxuICAgKiAgIHF1YWxpdHk6ICdIRCdcbiAgICogfSk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIHRyYWNrKGV2ZW50TmFtZTogc3RyaW5nLCBwcm9wZXJ0aWVzPzogSUV2ZW50UHJvcGVydGllcyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGNsaWVudC50cmFjayhldmVudE5hbWUsIEpTT04uc3RyaW5naWZ5KHByb3BlcnRpZXMpKTtcbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEluaXRpYXRlcyBhIHRpbWVkIGV2ZW50IGZvciBkdXJhdGlvbiB0cmFja2luZy5cbiAgICogXG4gICAqIFRpbWVkIGV2ZW50cyBhcmUgdXNlZnVsIGZvciB0cmFja2luZyB0aGUgZHVyYXRpb24gb2Ygb3BlcmF0aW9ucyBvciB1c2VyIGludGVyYWN0aW9ucy5cbiAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBmb2xsb3dlZCBieSBhIGNhbGwgdG8gdHJhY2soKSB3aXRoIHRoZSBzYW1lIGV2ZW50IG5hbWUgdG8gY29tcGxldGVcbiAgICogdGhlIHRpbWluZyBtZWFzdXJlbWVudC4gVGhlIGR1cmF0aW9uIHdpbGwgYmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGFuZCBpbmNsdWRlZFxuICAgKiBpbiB0aGUgZXZlbnQgcHJvcGVydGllcy5cbiAgICogXG4gICAqIEBwYXJhbSBldmVudE5hbWUgLSBVbmlxdWUgbmFtZSBmb3IgdGhpcyB0aW1lZCBldmVudCAobXVzdCBtYXRjaCB0aGUgc3Vic2VxdWVudCB0cmFjaygpIGNhbGwpXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIC8vIFN0YXJ0IHRpbWluZyBhbiBldmVudFxuICAgKiB0aGlzLmNsaWVudC50aW1lRXZlbnQoJ3ZpZGVvX3BsYXliYWNrJyk7XG4gICAqIFxuICAgKiAvLyAuLi4gdmlkZW8gcGxheXMgZm9yIHNvbWUgZHVyYXRpb24gLi4uXG4gICAqIFxuICAgKiAvLyBFbmQgdGltaW5nIGFuZCBsb2cgdGhlIGV2ZW50IHdpdGggZHVyYXRpb25cbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3ZpZGVvX3BsYXliYWNrJywge1xuICAgKiAgIHZpZGVvX2lkOiAnYWJjMTIzJyxcbiAgICogICBxdWFsaXR5OiAnSEQnXG4gICAqIH0pOyAvLyBEdXJhdGlvbiB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWRcbiAgICogXG4gICAqIC8vIEV4YW1wbGUgZm9yIHVzZXIgaW50ZXJhY3Rpb24gdGltaW5nXG4gICAqIHRoaXMuY2xpZW50LnRpbWVFdmVudCgnZm9ybV9jb21wbGV0aW9uJyk7XG4gICAqIC8vIC4uLiB1c2VyIGZpbGxzIG91dCBmb3JtIC4uLlxuICAgKiB0aGlzLmNsaWVudC50cmFjaygnZm9ybV9jb21wbGV0aW9uJywgeyBmb3JtX3R5cGU6ICdjb250YWN0JyB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgdGltZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuICAgICAgY2xpZW50LnRpbWVFdmVudChldmVudE5hbWUpO1xuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBhbmFseXRpY3MgZXZlbnQgc2Vzc2lvbiBmb3IgZ3JvdXBpbmcgcmVsYXRlZCBldmVudHMuXG4gICAqIFxuICAgKiBBIHNlc3Npb24gaXMgYSB3YXkgb2YgZ3JvdXBpbmcgZXZlbnRzIHRvZ2V0aGVyIGZvciBhbmFseXNpcy4gRWFjaCBldmVudCB0cmFja2VkXG4gICAqIGFmdGVyIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBoYXZlIHRoZSBzYW1lIHNlc3Npb24gSUQgdW50aWwgYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLlxuICAgKiBTZXNzaW9uIElEcyBhcmUgcmFuZG9tbHkgZ2VuZXJhdGVkIHVubGVzcyBleHBsaWNpdGx5IHByb3ZpZGVkLlxuICAgKiBcbiAgICogVGhpcyBpcyB1c2VmdWwgZm9yIHRyYWNraW5nIHVzZXIgam91cm5leXMsIHdvcmtmbG93IGNvbXBsZXRpb24sIG9yIGdyb3VwaW5nXG4gICAqIHJlbGF0ZWQgaW50ZXJhY3Rpb25zIHdpdGhpbiBhIHNwZWNpZmljIHRpbWUgcGVyaW9kLlxuICAgKiBcbiAgICogQHBhcmFtIGlkIC0gT3B0aW9uYWwgdXNlci1zdXBwbGllZCBzZXNzaW9uIElELiBJZiBub3QgcHJvdmlkZWQsIGEgcmFuZG9tIHNlc3Npb24gSUQgd2lsbCBiZSBnZW5lcmF0ZWRcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gU3RhcnQgYSBuZXcgc2Vzc2lvbiB3aXRoIGF1dG8tZ2VuZXJhdGVkIElEXG4gICAqIHRoaXMuY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbigpO1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnc2Vzc2lvbl9zdGFydCcpO1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygndXNlcl9hY3Rpb25fMScpO1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygndXNlcl9hY3Rpb25fMicpO1xuICAgKiBcbiAgICogLy8gU3RhcnQgYSBzZXNzaW9uIHdpdGggY3VzdG9tIElEXG4gICAqIHRoaXMuY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbigndXNlci13b3JrZmxvdy0xMjM0NScpO1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnd29ya2Zsb3dfc3RhcnQnKTtcbiAgICogdGhpcy5jbGllbnQudHJhY2soJ3N0ZXBfY29tcGxldGVkJywgeyBzdGVwOiAxIH0pO1xuICAgKiBcbiAgICogLy8gU3RhcnQgYSBuZXcgc2Vzc2lvbiBmb3IgZGlmZmVyZW50IHdvcmtmbG93XG4gICAqIHRoaXMuY2xpZW50Lm5ld0V2ZW50U2Vzc2lvbigpO1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnZGlmZmVyZW50X3dvcmtmbG93X3N0YXJ0Jyk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIG5ld0V2ZW50U2Vzc2lvbihpZD86IHN0cmluZyk6IHZvaWQge1xuXG4gICAgdGhpcy5nZXRDbGllbnQoKS50aGVuKChjbGllbnQpID0+IHtcbiAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNsaWVudC5uZXdFdmVudFNlc3Npb24oKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNsaWVudC5uZXdFdmVudFNlc3Npb24oaWQpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgcm9vdCBmb2xkZXIgcGF0aCB1dGlsaXplZCBieSB0aGlzIHBsYXllciBkZXZpY2UuXG4gICAqIFxuICAgKiBUaGlzIHJldHVybnMgdGhlIGJhc2UgZGlyZWN0b3J5IHBhdGggd2hlcmUgdGhlIFJldmVsIERpZ2l0YWwgcGxheWVyXG4gICAqIHN0b3JlcyBpdHMgZmlsZXMgYW5kIHJlc291cmNlcyBvbiB0aGUgbG9jYWwgZGV2aWNlLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHBhdGggb2YgdGhlIHJvb3QgZm9sZGVyXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHJvb3RQYXRoID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0UmV2ZWxSb290KCk7XG4gICAqIGNvbnNvbGUubG9nKCdQbGF5ZXIgcm9vdCBkaXJlY3Rvcnk6Jywgcm9vdFBhdGgpO1xuICAgKiAvLyBVc2UgZm9yIGNvbnN0cnVjdGluZyBmaWxlIHBhdGhzIG9yIHVuZGVyc3RhbmRpbmcgc3RvcmFnZSBzdHJ1Y3R1cmVcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0UmV2ZWxSb290KCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXRSZXZlbFJvb3QoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGEgbWFwIG9mIGNvbW1hbmRzIGN1cnJlbnRseSBhY3RpdmUgZm9yIHRoaXMgZGV2aWNlLlxuICAgKiBcbiAgICogVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbW1hbmQgY29uZmlndXJhdGlvbiB0aGF0IGRlZmluZXMgaG93IHRoZSBkZXZpY2VcbiAgICogcmVzcG9uZHMgdG8gdmFyaW91cyBjb21tYW5kIHRyaWdnZXJzIGFuZCByZW1vdGUgY29tbWFuZHMuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byBhIG1hcCBvZiBjdXJyZW50bHkgYWN0aXZlIGNvbW1hbmRzXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNvbW1hbmRNYXAgPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRDb21tYW5kTWFwKCk7XG4gICAqIGNvbnNvbGUubG9nKCdBY3RpdmUgY29tbWFuZHM6JywgY29tbWFuZE1hcCk7XG4gICAqIFxuICAgKiAvLyBDaGVjayBpZiBzcGVjaWZpYyBjb21tYW5kIGlzIGF2YWlsYWJsZVxuICAgKiBpZiAoY29tbWFuZE1hcFsnY3VzdG9tQ29tbWFuZCddKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0N1c3RvbSBjb21tYW5kIGlzIGF2YWlsYWJsZScpO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldENvbW1hbmRNYXAoKTogUHJvbWlzZTxhbnk+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gSlNPTi5wYXJzZShhd2FpdCBjbGllbnQuZ2V0Q29tbWFuZE1hcCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWduYWxzIHRvIHRoZSBwbGF5ZXIgdGhhdCB0aGlzIGdhZGdldCBoYXMgY29tcGxldGVkIGl0cyB2aXN1YWxpemF0aW9uLlxuICAgKiBcbiAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIHBsYXllciB0aGF0IHRoZSBjdXJyZW50IGdhZGdldCBoYXMgZmluaXNoZWQgaXRzXG4gICAqIGNvbnRlbnQgZGlzcGxheSBvciBpbnRlcmFjdGlvbiBjeWNsZS4gVGhlIHBsYXllciBjYW4gdGhlbiBwcm9jZWVkIHdpdGhcbiAgICogdGhlIG5leHQgaXRlbSBpbiBhIHBsYXlsaXN0IGlmIGFwcGxpY2FibGUsIG9yIGhhbmRsZSB0aGUgY29tcGxldGlvblxuICAgKiBhY2NvcmRpbmcgdG8gaXRzIGNvbmZpZ3VyYXRpb24uXG4gICAqIFxuICAgKiBDYWxsIHRoaXMgbWV0aG9kIHdoZW4geW91ciBnYWRnZXQgaGFzIGNvbXBsZXRlZCBpdHMgaW50ZW5kZWQgZnVuY3Rpb24sXG4gICAqIHN1Y2ggYXMgZmluaXNoaW5nIGFuIGFuaW1hdGlvbiwgY29tcGxldGluZyBhIGZvcm0sIG9yIHJlYWNoaW5nIGEgbmF0dXJhbFxuICAgKiBzdG9wcGluZyBwb2ludC5cbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogLy8gQWZ0ZXIgY29tcGxldGluZyBhbiBhbmltYXRpb25cbiAgICogcHJpdmF0ZSBvbkFuaW1hdGlvbkNvbXBsZXRlKCk6IHZvaWQge1xuICAgKiAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiB9XG4gICAqIFxuICAgKiAvLyBBZnRlciB1c2VyIGludGVyYWN0aW9uIGlzIGNvbXBsZXRlXG4gICAqIHByaXZhdGUgb25Gb3JtU3VibWl0dGVkKCk6IHZvaWQge1xuICAgKiAgIHRoaXMuc2F2ZUZvcm1EYXRhKCk7XG4gICAqICAgdGhpcy5jbGllbnQuZmluaXNoKCk7XG4gICAqIH1cbiAgICogXG4gICAqIC8vIEFmdGVyIGEgdGltZWQgZGlzcGxheSBwZXJpb2RcbiAgICogc2V0VGltZW91dCgoKSA9PiB7XG4gICAqICAgdGhpcy5jbGllbnQuZmluaXNoKCk7XG4gICAqIH0sIDMwMDAwKTsgLy8gMzAgc2Vjb25kc1xuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG5cbiAgICB0aGlzLmdldENsaWVudCgpLnRoZW4oKGNsaWVudCkgPT4ge1xuXG4gICAgICBjbGllbnQuZmluaXNoKCk7XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgdGhlIGdhZGdldCBpcyBydW5uaW5nIGluIHByZXZpZXcgbW9kZS5cbiAgICogXG4gICAqIFByZXZpZXcgbW9kZSBpcyBlbmFibGVkIHdoZW4gdGhlIGdhZGdldCBpcyBiZWluZyBlZGl0ZWQgaW4gdGhlIFJldmVsIERpZ2l0YWwgQ01TLFxuICAgKiB0ZXN0ZWQgaW4gdGhlIGdhZGdldCBlZGl0b3IsIG9yIG90aGVyd2lzZSBub3QgcnVubmluZyBpbiBhIG5vcm1hbCBwbGF5ZXIgZW52aXJvbm1lbnQuXG4gICAqIFRoaXMgaXMgdXNlZnVsIGZvciBwcm92aWRpbmcgZGlmZmVyZW50IGJlaGF2aW9yIGR1cmluZyBkZXZlbG9wbWVudC90ZXN0aW5nIHZlcnN1c1xuICAgKiBwcm9kdWN0aW9uIGRlcGxveW1lbnQuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0cnVlIGlmIHJ1bm5pbmcgaW4gcHJldmlldyBtb2RlLCBmYWxzZSBpZiBydW5uaW5nIG9uIGFjdHVhbCBwbGF5ZXJcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgaXNQcmV2aWV3ID0gYXdhaXQgdGhpcy5jbGllbnQuaXNQcmV2aWV3TW9kZSgpO1xuICAgKiBcbiAgICogaWYgKGlzUHJldmlldykge1xuICAgKiAgIGNvbnNvbGUubG9nKCdSdW5uaW5nIGluIHByZXZpZXcgbW9kZSAtIHVzaW5nIG1vY2sgZGF0YScpO1xuICAgKiAgIHRoaXMubG9hZE1vY2tEYXRhKCk7XG4gICAqIH0gZWxzZSB7XG4gICAqICAgY29uc29sZS5sb2coJ1J1bm5pbmcgb24gcGxheWVyIGRldmljZSAtIHVzaW5nIGxpdmUgZGF0YScpO1xuICAgKiAgIHRoaXMubG9hZExpdmVEYXRhKCk7XG4gICAqIH1cbiAgICogXG4gICAqIC8vIFNob3cgZGlmZmVyZW50IFVJIGluIHByZXZpZXdcbiAgICogdGhpcy5zaG93UHJldmlld0luZGljYXRvciA9IGlzUHJldmlldztcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgaXNQcmV2aWV3TW9kZSgpOiBQcm9taXNlPGJvb2xlYW4+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50IGluc3RhbmNlb2YgTm9vcENsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBkZXZpY2UgcnVubmluZyB0aGUgcGxheWVyLlxuICAgKiBcbiAgICogUmV0dXJucyBjb21wcmVoZW5zaXZlIGRldmljZSBkZXRhaWxzIGluY2x1ZGluZyBuYW1lLCByZWdpc3RyYXRpb24ga2V5LCB0eXBlLFxuICAgKiBzZXJ2aWNlIGRhdGUsIGxhbmd1YWdlLCB0aW1lem9uZSwgdGFncywgYW5kIGxvY2F0aW9uIGluZm9ybWF0aW9uLiBUaGlzIGRhdGFcbiAgICogaXMgY29uZmlndXJlZCBpbiB0aGUgUmV2ZWwgRGlnaXRhbCBDTVMgZm9yIGVhY2ggZGV2aWNlLlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gZGV2aWNlIGRldGFpbHMgb2JqZWN0LCBvciBudWxsIGlmIG5vdCBhdmFpbGFibGVcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZGV2aWNlID0gYXdhaXQgdGhpcy5jbGllbnQuZ2V0RGV2aWNlKCk7XG4gICAqIFxuICAgKiBpZiAoZGV2aWNlKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0RldmljZSBuYW1lOicsIGRldmljZS5uYW1lKTtcbiAgICogICBjb25zb2xlLmxvZygnRGV2aWNlIHR5cGU6JywgZGV2aWNlLmRldmljZVR5cGUpO1xuICAgKiAgIGNvbnNvbGUubG9nKCdMb2NhdGlvbjonLCBkZXZpY2UubG9jYXRpb24uY2l0eSwgZGV2aWNlLmxvY2F0aW9uLnN0YXRlKTtcbiAgICogICBjb25zb2xlLmxvZygnVGFnczonLCBkZXZpY2UudGFncyk7XG4gICAqICAgXG4gICAqICAgLy8gVXNlIGRldmljZSBpbmZvIGZvciBjdXN0b21pemF0aW9uXG4gICAqICAgaWYgKGRldmljZS5sb2NhdGlvbi5jb3VudHJ5ID09PSAnVVMnKSB7XG4gICAqICAgICB0aGlzLmxvYWRVU0NvbnRlbnQoKTtcbiAgICogICB9XG4gICAqICAgXG4gICAqICAgLy8gQ2hlY2sgZGV2aWNlIGNhcGFiaWxpdGllcyBiYXNlZCBvbiB0eXBlXG4gICAqICAgaWYgKGRldmljZS5kZXZpY2VUeXBlID09PSAnYW5kcm9pZCcpIHtcbiAgICogICAgIHRoaXMuZW5hYmxlVG91Y2hGZWF0dXJlcygpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2UoKTogUHJvbWlzZTxJRGV2aWNlIHwgbnVsbD4ge1xuXG4gICAgY29uc3QgY2xpZW50ID0gYXdhaXQgdGhpcy5nZXRDbGllbnQoKTtcblxuICAgIGNvbnN0IG9iajogYW55ID0gSlNPTi5wYXJzZSg8c3RyaW5nPmF3YWl0IGNsaWVudC5nZXREZXZpY2UoKSk7XG5cbiAgICBjb25zdCBkZXZpY2U6IElEZXZpY2VbXSA9IFtvYmpdLm1hcCgoZGV2aWNlOiBhbnkpID0+IHtcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmFtZTogZGV2aWNlLm5hbWUsXG4gICAgICAgIHJlZ2lzdHJhdGlvbktleTogZGV2aWNlLmtleSxcbiAgICAgICAgZGV2aWNlVHlwZTogZGV2aWNlLmRldmljZXR5cGUsXG4gICAgICAgIGVudGVyZWRTZXJ2aWNlOiBuZXcgRGF0ZShkZXZpY2UuZW50ZXJlZHNlcnZpY2UpLFxuICAgICAgICBsYW5nQ29kZTogZGV2aWNlLmxhbmdjb2RlLFxuICAgICAgICB0aW1lWm9uZTogZGV2aWNlLnRpbWV6b25lLFxuICAgICAgICB0YWdzOiBkZXZpY2UuZGVzY3JpcHRpb24/LnNwbGl0KCdcXG4nKSxcbiAgICAgICAgbG9jYXRpb246IHtcbiAgICAgICAgICBjaXR5OiBkZXZpY2UubG9jYXRpb24/LmNpdHksXG4gICAgICAgICAgc3RhdGU6IGRldmljZS5sb2NhdGlvbj8uc3RhdGUsXG4gICAgICAgICAgY291bnRyeTogZGV2aWNlLmxvY2F0aW9uPy5jb3VudHJ5LFxuICAgICAgICAgIHBvc3RhbENvZGU6IGRldmljZS5sb2NhdGlvbj8ucG9zdGFsY29kZSxcbiAgICAgICAgICBhZGRyZXNzOiBkZXZpY2UubG9jYXRpb24/LmFkZHJlc3MsXG4gICAgICAgICAgbGF0aXR1ZGU6IGRldmljZS5sb2NhdGlvbj8ubGF0aXR1ZGUsXG4gICAgICAgICAgbG9uZ2l0dWRlOiBkZXZpY2UubG9jYXRpb24/LmxvbmdpdHVkZVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGRldmljZVswXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXRzIHRoZSB3aWR0aCBvZiB0aGUgdmlzdWFsaXphdGlvbiBhcmVhIGluIHBpeGVscy5cbiAgICogXG4gICAqIFRoaXMgcmV0dXJucyB0aGUgYXZhaWxhYmxlIHdpZHRoIGZvciBjb250ZW50IGRpc3BsYXksIHdoaWNoIG1heSBiZVxuICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgZnVsbCBzY3JlZW4gd2lkdGggZGVwZW5kaW5nIG9uIHBsYXllciBjb25maWd1cmF0aW9uXG4gICAqIGFuZCB0ZW1wbGF0ZSBsYXlvdXQuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB3aWR0aCBpbiBwaXhlbHMsIG9yIG51bGwgaWYgbm90IGF2YWlsYWJsZVxuICAgKiBcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCB3aWR0aCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldFdpZHRoKCk7XG4gICAqIFxuICAgKiBpZiAod2lkdGgpIHtcbiAgICogICBjb25zb2xlLmxvZygnQXZhaWxhYmxlIHdpZHRoOicsIHdpZHRoLCAncGl4ZWxzJyk7XG4gICAqICAgXG4gICAqICAgLy8gQWRhcHQgY29udGVudCBsYXlvdXQgYmFzZWQgb24gd2lkdGhcbiAgICogICBpZiAod2lkdGggPCA4MDApIHtcbiAgICogICAgIHRoaXMuZW5hYmxlTW9iaWxlTGF5b3V0KCk7XG4gICAqICAgfSBlbHNlIHtcbiAgICogICAgIHRoaXMuZW5hYmxlRGVza3RvcExheW91dCgpO1xuICAgKiAgIH1cbiAgICogfVxuICAgKiBgYGBcbiAgICovXG4gIHB1YmxpYyBhc3luYyBnZXRXaWR0aCgpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50LmdldFdpZHRoKCk7XG4gIH1cblxuICAvKipcbiAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSB2aXN1YWxpemF0aW9uIGFyZWEgaW4gcGl4ZWxzLlxuICAgKiBcbiAgICogVGhpcyByZXR1cm5zIHRoZSBhdmFpbGFibGUgaGVpZ2h0IGZvciBjb250ZW50IGRpc3BsYXksIHdoaWNoIG1heSBiZVxuICAgKiBkaWZmZXJlbnQgZnJvbSB0aGUgZnVsbCBzY3JlZW4gaGVpZ2h0IGRlcGVuZGluZyBvbiBwbGF5ZXIgY29uZmlndXJhdGlvblxuICAgKiBhbmQgdGVtcGxhdGUgbGF5b3V0LlxuICAgKiBcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gaGVpZ2h0IGluIHBpeGVscywgb3IgbnVsbCBpZiBub3QgYXZhaWxhYmxlXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGhlaWdodCA9IGF3YWl0IHRoaXMuY2xpZW50LmdldEhlaWdodCgpO1xuICAgKiBcbiAgICogaWYgKGhlaWdodCkge1xuICAgKiAgIGNvbnNvbGUubG9nKCdBdmFpbGFibGUgaGVpZ2h0OicsIGhlaWdodCwgJ3BpeGVscycpO1xuICAgKiAgIFxuICAgKiAgIC8vIENhbGN1bGF0ZSBhc3BlY3QgcmF0aW8gZm9yIHJlc3BvbnNpdmUgZGVzaWduXG4gICAqICAgY29uc3Qgd2lkdGggPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRXaWR0aCgpO1xuICAgKiAgIGNvbnN0IGFzcGVjdFJhdGlvID0gd2lkdGggLyBoZWlnaHQ7XG4gICAqICAgdGhpcy5hZGp1c3RDb250ZW50Rm9yQXNwZWN0UmF0aW8oYXNwZWN0UmF0aW8pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGdldEhlaWdodCgpOiBQcm9taXNlPG51bWJlciB8IG51bGw+IHtcblxuICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG5cbiAgICByZXR1cm4gY2xpZW50LmdldEhlaWdodCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50IGl0ZW0uXG4gICAqIFxuICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGFwcGxpY2FibGUgd2hlbiB0aGUgZ2FkZ2V0IGlzIGFzc29jaWF0ZWQgd2l0aCBhIHBsYXlsaXN0XG4gICAqIGFuZCByZXR1cm5zIHRoZSBkdXJhdGlvbiBhc3NpZ25lZCB0byB0aGUgY3VycmVudCBwbGF5bGlzdCBpdGVtLiBUaGUgZHVyYXRpb25cbiAgICogZGV0ZXJtaW5lcyBob3cgbG9uZyB0aGUgY29udGVudCBzaG91bGQgYmUgZGlzcGxheWVkIGJlZm9yZSBtb3ZpbmcgdG8gdGhlIG5leHQgaXRlbS5cbiAgICogXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgbnVsbCBpZiBub3QgYXBwbGljYWJsZS9hdmFpbGFibGVcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgZHVyYXRpb24gPSBhd2FpdCB0aGlzLmNsaWVudC5nZXREdXJhdGlvbigpO1xuICAgKiBcbiAgICogaWYgKGR1cmF0aW9uKSB7XG4gICAqICAgY29uc29sZS5sb2coJ0NvbnRlbnQgZHVyYXRpb246JywgZHVyYXRpb24sICdtaWxsaXNlY29uZHMnKTtcbiAgICogICBcbiAgICogICAvLyBTZXQgdXAgYXV0by1maW5pc2ggdGltZXJcbiAgICogICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICogICAgIHRoaXMuY2xpZW50LmZpbmlzaCgpO1xuICAgKiAgIH0sIGR1cmF0aW9uKTtcbiAgICogICBcbiAgICogICAvLyBTaG93IHByb2dyZXNzIGluZGljYXRvclxuICAgKiAgIHRoaXMuc3RhcnRQcm9ncmVzc0luZGljYXRvcihkdXJhdGlvbik7XG4gICAqIH1cbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0RHVyYXRpb24oKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICBjb25zdCBjbGllbnQgPSBhd2FpdCB0aGlzLmdldENsaWVudCgpO1xuXG4gICAgcmV0dXJuIGNsaWVudC5nZXREdXJhdGlvbigpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgUmV2ZWwgRGlnaXRhbCBTREsuXG4gICAqIFxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgU0RLIHZlcnNpb24gc3RyaW5nXG4gICAqIFxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IHZlcnNpb24gPSBhd2FpdCB0aGlzLmNsaWVudC5nZXRTZGtWZXJzaW9uKCk7XG4gICAqIGNvbnNvbGUubG9nKCdTREsgVmVyc2lvbjonLCB2ZXJzaW9uKTtcbiAgICogXG4gICAqIC8vIFVzZSBmb3IgY29tcGF0aWJpbGl0eSBjaGVja3Mgb3IgbG9nZ2luZ1xuICAgKiB0aGlzLmNsaWVudC50cmFjaygnZ2FkZ2V0X2xvYWRlZCcsIHsgc2RrVmVyc2lvbjogdmVyc2lvbiB9KTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZ2V0U2RrVmVyc2lvbigpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh2ZXJzaW9uKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBcHBsaWVzIGNvbmZpZ3VyYXRpb24gcHJlZmVyZW5jZXMgdG8gdGhlIGdhZGdldCAocHJldmlldyBtb2RlIG9ubHkpLlxuICAgKiBcbiAgICogVGhpcyBtZXRob2QgaXMgb25seSBhdmFpbGFibGUgd2hlbiBydW5uaW5nIGluIHByZXZpZXcgbW9kZSAodHlwaWNhbGx5IGR1cmluZ1xuICAgKiBnYWRnZXQgZGV2ZWxvcG1lbnQgb3IgdGVzdGluZyBpbiB0aGUgQ01TKS4gSXQgYWxsb3dzIGFwcGx5aW5nIGNvbmZpZ3VyYXRpb25cbiAgICogY2hhbmdlcyB0aGF0IHdvdWxkIG5vcm1hbGx5IGNvbWUgZnJvbSB0aGUgZ2FkZ2V0J3MgcHJlZmVyZW5jZSBzZXR0aW5ncy5cbiAgICogXG4gICAqIEBwYXJhbSBwcmVmcyAtIERpY3Rpb25hcnkgb2YgcHJlZmVyZW5jZSBrZXktdmFsdWUgcGFpcnMgdG8gYXBwbHlcbiAgICogXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogaWYgKGF3YWl0IHRoaXMuY2xpZW50LmlzUHJldmlld01vZGUoKSkge1xuICAgKiAgIC8vIEFwcGx5IHRlc3QgY29uZmlndXJhdGlvbiBpbiBwcmV2aWV3XG4gICAqICAgYXdhaXQgdGhpcy5jbGllbnQuYXBwbHlDb25maWcoe1xuICAgKiAgICAgJ3RpdGxlJzogJ1Rlc3QgVGl0bGUnLFxuICAgKiAgICAgJ2JhY2tncm91bmRDb2xvcic6ICcjZmYwMDAwJyxcbiAgICogICAgICdzaG93Qm9yZGVyJzogdHJ1ZSxcbiAgICogICAgICdyZWZyZXNoSW50ZXJ2YWwnOiAzMFxuICAgKiAgIH0pO1xuICAgKiB9XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGFzeW5jIGFwcGx5Q29uZmlnKHByZWZzOiBJRGljdGlvbmFyeTxhbnk+KSB7XG5cbiAgICBpZiAoYXdhaXQgdGhpcy5pc1ByZXZpZXdNb2RlKCkpIHtcbiAgICAgIGNvbnN0IGNsaWVudCA9IGF3YWl0IHRoaXMuZ2V0Q2xpZW50KCk7XG4gICAgICBjbGllbnQuYXBwbHlDb25maWcocHJlZnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zb2xlLmxvZyhcbiAgICAgICAgJyVjYXBwbHlDb25maWcoKSBpcyBvbmx5IGF2YWlsYWJsZSBpbiBwcmV2aWV3IG1vZGUuJyxcbiAgICAgICAgJ2JhY2tncm91bmQtY29sb3I6Ymx1ZTsgY29sb3I6eWVsbG93OydcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0eXBlZCB3cmFwcGVyIGZvciBhIFJldmVsIERpZ2l0YWwgZGF0YSB0YWJsZS5cbiAgICpcbiAgICogVGhlIGRhdGEgdGFibGUgZmVhdHVyZSBtdXN0IGJlIGVuYWJsZWQgZm9yIHRoZSBnYWRnZXQuIFRoZSByZXR1cm5lZFxuICAgKiB7QGxpbmsgRGF0YVRhYmxlUmVmfSBwcm92aWRlcyB0eXBlZCBQcm9taXNlLWJhc2VkIG1ldGhvZHMgYW5kIFJ4SlNcbiAgICogT2JzZXJ2YWJsZXMgZm9yIHJlYWwtdGltZSByb3cgY2hhbmdlIGV2ZW50cy5cbiAgICpcbiAgICogQHBhcmFtIHRhYmxlSWQgLSBUaGUgZGF0YSB0YWJsZSBJRCAoZS5nLiAndGJsX21lbnVfaXRlbXMnKVxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3ZlcnJpZGVzXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERhdGFUYWJsZVJlZn0gaW5zdGFuY2VcbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZ2xvYmFsIGRhdGF0YWJsZSBsaWJyYXJ5IGlzIG5vdCBsb2FkZWRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBkdCA9IHRoaXMuY2xpZW50LmNyZWF0ZURhdGFUYWJsZSgndGJsX21lbnVfaXRlbXMnKTtcbiAgICpcbiAgICogLy8gRmV0Y2ggcm93cyB3aXRoIGZpbHRlcmluZyBhbmQgc29ydGluZ1xuICAgKiBjb25zdCByZXN1bHQgPSBhd2FpdCBkdC5nZXRSb3dzKHtcbiAgICogICBmaWx0ZXI6IHsgY2F0ZWdvcnk6ICdFbnRyZWUnLCBwcmljZTogeyBvcDogJ2x0ZScsIHZhbHVlOiAyNSB9IH0sXG4gICAqICAgc29ydDogJ3ByaWNlJyxcbiAgICogICBzb3J0RGlyOiAnYXNjJ1xuICAgKiB9KTtcbiAgICpcbiAgICogLy8gU3Vic2NyaWJlIHRvIHJlYWwtdGltZSB1cGRhdGVzXG4gICAqIGR0LnJvd1VwZGF0ZWQkLnN1YnNjcmliZShjaGFuZ2UgPT4gY29uc29sZS5sb2coJ1JvdyB1cGRhdGVkOicsIGNoYW5nZSkpO1xuICAgKiBkdC5yb3dDcmVhdGVkJC5zdWJzY3JpYmUoY2hhbmdlID0+IGNvbnNvbGUubG9nKCdSb3cgY3JlYXRlZDonLCBjaGFuZ2UpKTtcbiAgICogZHQucm93RGVsZXRlZCQuc3Vic2NyaWJlKGNoYW5nZSA9PiBjb25zb2xlLmxvZygnUm93IGRlbGV0ZWQ6JywgY2hhbmdlKSk7XG4gICAqXG4gICAqIC8vIENsZWFudXAgd2hlbiBkb25lXG4gICAqIGR0LmRpc3Bvc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlRGF0YVRhYmxlKHRhYmxlSWQ6IHN0cmluZywgb3B0aW9ucz86IElEYXRhVGFibGVPcHRpb25zKTogRGF0YVRhYmxlUmVmIHtcbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZVJlZih0YWJsZUlkLCB0aGlzLnpvbmUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSB0eXBlZCBkYXRhIHRhYmxlIHdyYXBwZXIgZnJvbSBhIGdhZGdldCBwcmVmZXJlbmNlIHZhbHVlLlxuICAgKlxuICAgKiBUaGUgcHJlZmVyZW5jZSBKU09OIHN0cmluZyAoYXMgc2VyaWFsaXplZCBieSB0aGUgdGVtcGxhdGUgZWRpdG9yJ3MgZGF0YXRhYmxlXG4gICAqIG9wdGlvbikgaXMgcGFyc2VkIGFuZCB1c2VkIHRvIGF1dG8tY29uZmlndXJlIGZpbHRlciwgc29ydCwgYW5kIGxvZ2ljIHNldHRpbmdzLlxuICAgKiBUaGUgcmV0dXJuZWQge0BsaW5rIERhdGFUYWJsZVByZWZSZWZ9IHByb3ZpZGVzIGEgYGdldEZpbHRlcmVkUm93cygpYCBjb252ZW5pZW5jZVxuICAgKiBtZXRob2QgdGhhdCBhcHBsaWVzIHRoZXNlIHNldHRpbmdzIGF1dG9tYXRpY2FsbHkuXG4gICAqXG4gICAqIEBwYXJhbSBwcmVmVmFsdWUgLSBUaGUgcmF3IGdhZGdldCBwcmVmZXJlbmNlIHN0cmluZyAoSlNPTilcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBPcHRpb25hbCBjb25maWd1cmF0aW9uIG92ZXJyaWRlc1xuICAgKiBAcmV0dXJucyBBIHtAbGluayBEYXRhVGFibGVQcmVmUmVmfSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBnbG9iYWwgZGF0YXRhYmxlIGxpYnJhcnkgaXMgbm90IGxvYWRlZFxuICAgKlxuICAgKiBgYGB0eXBlc2NyaXB0XG4gICAqIGNvbnN0IGNmZyA9IHRoaXMuY2xpZW50LmNyZWF0ZURhdGFUYWJsZUZyb21QcmVmKHByZWZzLmdldFN0cmluZygncmREYXRhVGFibGUnKSk7XG4gICAqXG4gICAqIC8vIEZldGNoIHJvd3Mgd2l0aCBhdXRvLXdpcmVkIGZpbHRlciArIHNvcnRcbiAgICogY29uc3QgcmVzdWx0ID0gYXdhaXQgY2ZnLmdldEZpbHRlcmVkUm93cygpO1xuICAgKlxuICAgKiAvLyBBY2Nlc3MgdGhlIHVuZGVybHlpbmcgRGF0YVRhYmxlUmVmIGZvciBldmVudHMsIHNjaGVtYSwgZXRjLlxuICAgKiBjZmcuZGF0YVRhYmxlLnJvd1VwZGF0ZWQkLnN1YnNjcmliZShjaGFuZ2UgPT4gY29uc29sZS5sb2coY2hhbmdlKSk7XG4gICAqXG4gICAqIC8vIENsZWFudXAgd2hlbiBkb25lXG4gICAqIGNmZy5kaXNwb3NlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZURhdGFUYWJsZUZyb21QcmVmKHByZWZWYWx1ZTogc3RyaW5nLCBvcHRpb25zPzogSURhdGFUYWJsZU9wdGlvbnMpOiBEYXRhVGFibGVQcmVmUmVmIHtcbiAgICByZXR1cm4gbmV3IERhdGFUYWJsZVByZWZSZWYocHJlZlZhbHVlLCB0aGlzLnpvbmUsIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gLS0tXG4gIC8vIFBPV0VSIEJJLlxuICAvLyAtLS1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHR5cGVkIFBvd2VyIEJJIGVtYmVkIHdyYXBwZXIgZm9yIGVtYmVkZGluZyByZXBvcnRzIGFuZCBkYXNoYm9hcmRzLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyAtIFBvd2VyIEJJIGVtYmVkIGNvbmZpZ3VyYXRpb24gKHdvcmtzcGFjZSwgcmVwb3J0L2Rhc2hib2FyZCwgY29udGFpbmVyLCBldGMuKVxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQb3dlckJJUmVmfSBpbnN0YW5jZVxuICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBnbG9iYWwgUG93ZXIgQkkgbGlicmFyeSBpcyBub3QgbG9hZGVkXG4gICAqXG4gICAqIGBgYHR5cGVzY3JpcHRcbiAgICogY29uc3QgcGJpID0gdGhpcy5jbGllbnQuY3JlYXRlUG93ZXJCSSh7XG4gICAqICAgd29ya3NwYWNlSWQ6ICcuLi4nLFxuICAgKiAgIHJlcG9ydElkOiAnLi4uJyxcbiAgICogICBjb250YWluZXI6IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYmktY29udGFpbmVyJylcbiAgICogfSk7XG4gICAqXG4gICAqIC8vIEVtYmVkIHRoZSByZXBvcnRcbiAgICogYXdhaXQgcGJpLmVtYmVkKCk7XG4gICAqXG4gICAqIC8vIFJlZnJlc2ggdGhlIHRva2VuXG4gICAqIGF3YWl0IHBiaS5yZWZyZXNoKCk7XG4gICAqXG4gICAqIC8vIENsZWFudXAgd2hlbiBkb25lXG4gICAqIHBiaS5kaXNwb3NlKCk7XG4gICAqIGBgYFxuICAgKi9cbiAgcHVibGljIGNyZWF0ZVBvd2VyQkkob3B0aW9uczogSVBvd2VyQklPcHRpb25zKTogUG93ZXJCSVJlZiB7XG4gICAgcmV0dXJuIG5ldyBQb3dlckJJUmVmKG9wdGlvbnMsIHRoaXMuem9uZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlcyBhIHR5cGVkIFBvd2VyIEJJIGVtYmVkIHdyYXBwZXIgZnJvbSBhIGdhZGdldCBwcmVmZXJlbmNlIHZhbHVlLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZlZhbHVlIC0gVGhlIHJhdyBnYWRnZXQgcHJlZmVyZW5jZSBzdHJpbmcgKEpTT04pIGZyb20gdGhlIHRlbXBsYXRlIGVkaXRvclxuICAgKiBAcGFyYW0gY29udGFpbmVyIC0gRE9NIGVsZW1lbnQgdG8gZW1iZWQgaW50b1xuICAgKiBAcGFyYW0gZXh0cmFPcHRpb25zIC0gQWRkaXRpb25hbCBvcHRpb25zIHRvIG1lcmdlIHdpdGggdGhlIHByZWZlcmVuY2VcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUG93ZXJCSVByZWZSZWZ9IGluc3RhbmNlXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBQb3dlciBCSSBsaWJyYXJ5IGlzIG5vdCBsb2FkZWRcbiAgICpcbiAgICogYGBgdHlwZXNjcmlwdFxuICAgKiBjb25zdCBwYmkgPSB0aGlzLmNsaWVudC5jcmVhdGVQb3dlckJJRnJvbVByZWYoXG4gICAqICAgcHJlZnMuZ2V0U3RyaW5nKCdyZFBvd2VyQkknKSxcbiAgICogICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGJpLWNvbnRhaW5lcicpXG4gICAqICk7XG4gICAqXG4gICAqIC8vIEVtYmVkIHdpdGggcHJlZmVyZW5jZSBzZXR0aW5nc1xuICAgKiBhd2FpdCBwYmkuZW1iZWQoKTtcbiAgICpcbiAgICogLy8gQ2xlYW51cCB3aGVuIGRvbmVcbiAgICogcGJpLmRpc3Bvc2UoKTtcbiAgICogYGBgXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlUG93ZXJCSUZyb21QcmVmKHByZWZWYWx1ZTogc3RyaW5nLCBjb250YWluZXI6IEhUTUxFbGVtZW50LCBleHRyYU9wdGlvbnM/OiBQYXJ0aWFsPElQb3dlckJJT3B0aW9ucz4pOiBQb3dlckJJUHJlZlJlZiB7XG4gICAgcmV0dXJuIG5ldyBQb3dlckJJUHJlZlJlZihwcmVmVmFsdWUsIGNvbnRhaW5lciwgdGhpcy56b25lLCBleHRyYU9wdGlvbnMpO1xuICB9XG5cbiAgLy8gLS0tXG4gIC8vIFBSSVZBVEUgTUVUSE9EUy5cbiAgLy8gLS0tXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgZ2V0Q2xpZW50KCk6IFByb21pc2U8SUNsaWVudD4ge1xuXG4gICAgaWYgKHRoaXMuY2xpZW50UHJvbWlzZSkge1xuXG4gICAgICByZXR1cm4gKHRoaXMuY2xpZW50UHJvbWlzZSk7XG4gICAgfVxuXG4gICAgaWYgKCh3aW5kb3cgYXMgYW55KS5DbGllbnQpIHtcblxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUoKHdpbmRvdyBhcyBhbnkpLkNsaWVudCkpO1xuICAgIH1cblxuICAgIC8vIEEgXCJjb21wbGV0ZVwiIHN0YXR1cyBpbmRpY2F0ZXMgdGhhdCB0aGUgXCJsb2FkXCIgZXZlbnQgaGFzIGJlZW4gZmlyZWQgb24gdGhlXG4gICAgLy8gd2luZG93OyBhbmQsIHRoYXQgYWxsIHN1Yi1yZXNvdXJjZXMgc3VjaCBhcyBTY3JpcHRzLCBJbWFnZXMsIGFuZCBGcmFtZXMgaGF2ZVxuICAgIC8vIGJlZW4gbG9hZGVkLlxuICAgIGlmICh3aW5kb3cuZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiKSB7XG5cbiAgICAgIC8vIElmIHRoaXMgZXZlbnQgaGFzIGZpcmVkIEFORCB0aGUgM3JkLXBhcnR5IHNjcmlwdCBpc24ndCBhdmFpbGFibGUgKHNlZSBJRi1cbiAgICAgIC8vIGNvbmRpdGlvbiBCRUZPUkUgdGhpcyBvbmUpLCBpdCBtZWFucyB0aGF0IHRoZSAzcmQtcGFydHkgc2NyaXB0IGVpdGhlclxuICAgICAgLy8gZmFpbGVkIG9uIHRoZSBuZXR3b3JrIG9yIHdhcyBCTE9DS0VEIGJ5IGFuIGFkLWJsb2NrZXIuIEFzIHN1Y2gsIHdlIGhhdmUgdG9cbiAgICAgIC8vIGZhbGwtYmFjayB0byB1c2luZyBhIG1vY2sgQVBJLlxuICAgICAgcmV0dXJuICh0aGlzLmNsaWVudFByb21pc2UgPSBQcm9taXNlLnJlc29sdmUobmV3IE5vb3BDbGllbnQoKSkpO1xuICAgIH1cblxuICAgIC8vIEFTU0VSVDogSWYgd2UgbWFkZSBpdCB0aGlzIGZhciwgdGhlIGRvY3VtZW50IGhhcyBub3QgY29tcGxldGVkIGxvYWRpbmcgKGJ1dCBpdFxuICAgIC8vIG1heSBiZSBpbiBhbiBcImludGVyYWN0aXZlXCIgc3RhdGUgd2hpY2ggaXMgd2hlbiBJIGJlbGlldmUgdGhhdCB0aGUgQW5ndWxhciBhcHBcbiAgICAvLyBnZXRzIGJvb3RzdHJhcHBlZCkuIEFzIHN1Y2gsIHdlIG5lZWQgYmluZCB0byB0aGUgTE9BRCBldmVudCB0byB3YWl0IGZvciBvdXJcbiAgICAvLyB0aGlyZC1wYXJ0eSBzY3JpcHRzIHRvIGxvYWQgKG9yIGZhaWwgdG8gbG9hZCwgb3IgYmUgYmxvY2tlZCkuXG4gICAgdGhpcy5jbGllbnRQcm9taXNlID0gbmV3IFByb21pc2U8SUNsaWVudD4oXG4gICAgICAocmVzb2x2ZSkgPT4ge1xuXG4gICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFxuICAgICAgICAgIFwibG9hZFwiLFxuICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVdpbmRvd0xvYWQoKSB7XG5cbiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSAzcmQtcGFydHkgbGlicmFyeSBpcyBlaXRoZXIgYXZhaWxhYmxlIG9yXG4gICAgICAgICAgICAvLyBpdCdzIG5vdCAtIHRoZXJlJ3Mgbm8gZnVydGhlciBsb2FkaW5nIHRvIGRvLiBJZiBpdCdzIG5vdFxuICAgICAgICAgICAgLy8gcHJlc2VudCBvbiB0aGUgZ2xvYmFsIHNjb3BlLCB3ZSdyZSBnb2luZyB0byBmYWxsLWJhY2sgdG8gdXNpbmdcbiAgICAgICAgICAgIC8vIGEgbW9jayBBUEkuXG4gICAgICAgICAgICByZXNvbHZlKCh3aW5kb3cgYXMgYW55KS5DbGllbnQgfHwgbmV3IE5vb3BDbGllbnQoKSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICB9XG4gICAgKTtcblxuICAgIHJldHVybiAodGhpcy5jbGllbnRQcm9taXNlKTtcbiAgfVxufVxuXG5cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNsaWVudCBpbnRlcmZhY2UuXG4gKiBcbiAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBuby1vcGVyYXRpb24gKE5PT1ApIGltcGxlbWVudGF0aW9uIG9mIHRoZSBjbGllbnQgQVBJXG4gKiB0aGF0IGFsbG93cyBjb25zdW1pbmcgY29kZSB0byBmdW5jdGlvbiBub3JtYWxseSBldmVuIHdoZW4gdGhlIGFjdHVhbCBwbGF5ZXJcbiAqIEFQSSBpcyBub3QgYXZhaWxhYmxlLiBUaGlzIHR5cGljYWxseSBvY2N1cnMgZHVyaW5nIGRldmVsb3BtZW50LCB0ZXN0aW5nLFxuICogb3Igd2hlbiB0aGUgcGxheWVyIHNjcmlwdCBpcyBibG9ja2VkIGJ5IGFkLWJsb2NrZXJzLlxuICogXG4gKiBBbGwgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGVpdGhlciByZXR1cm4gbnVsbC9lbXB0eSB2YWx1ZXMgb3IgcGVyZm9ybSBub1xuICogb3BlcmF0aW9ucywgYWxsb3dpbmcgZ2FkZ2V0cyB0byBmdW5jdGlvbiB3aXRob3V0IGVycm9ycyB3aGlsZSBwcm92aWRpbmdcbiAqIGFwcHJvcHJpYXRlIGZhbGxiYWNrIGJlaGF2aW9yLlxuICogXG4gKiBAcHJpdmF0ZVxuICovXG5jbGFzcyBOb29wQ2xpZW50IGltcGxlbWVudHMgSUNsaWVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG5cbiAgICBjb25zb2xlLmxvZyhcbiAgICAgICclY0NsaWVudCBBUEkgbm90IGF2YWlsYWJsZSwgZmFsbGluZyBiYWNrIHRvIG1vY2sgQVBJJyxcbiAgICAgICdiYWNrZ3JvdW5kLWNvbG9yOmJsdWU7IGNvbG9yOnllbGxvdzsnXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBjYWxsYmFjayguLi5hcmdzOiBhbnlbXSk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgZ2V0RGV2aWNlVGltZShkYXRlPzogRGF0ZSk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVOYW1lKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZVRpbWVab25lSUQoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RGV2aWNlVGltZVpvbmVPZmZzZXQoKTogUHJvbWlzZTxudW1iZXI+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0TGFuZ3VhZ2VDb2RlKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldERldmljZUtleSgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBzZW5kQ29tbWFuZChuYW1lOiBzdHJpbmcsIGFyZzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBzZW5kUmVtb3RlQ29tbWFuZChkZXZpY2VLZXlzOiBzdHJpbmdbXSwgbmFtZTogc3RyaW5nLCBhcmc6IHN0cmluZykge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgdHJhY2soZXZlbnROYW1lOiBzdHJpbmcsIHByb3BlcnRpZXM/OiBzdHJpbmcpOiB2b2lkIHtcblxuICAgIC8vIE5PT1AgaW1wbGVtZW50LCBub3RoaW5nIHRvIGRvLi4uLlxuICB9XG5cbiAgcHVibGljIHRpbWVFdmVudChldmVudE5hbWU6IHN0cmluZyk6IHZvaWQge1xuXG4gICAgLy8gTk9PUCBpbXBsZW1lbnQsIG5vdGhpbmcgdG8gZG8uLi4uXG4gIH1cblxuICBwdWJsaWMgbmV3RXZlbnRTZXNzaW9uKGlkPzogc3RyaW5nKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRSZXZlbFJvb3QoKTogUHJvbWlzZTxzdHJpbmc+IHtcblxuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0Q29tbWFuZE1hcCgpOiBQcm9taXNlPHN0cmluZz4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgne30nKTtcbiAgfVxuXG4gIHB1YmxpYyBmaW5pc2goKTogdm9pZCB7XG5cbiAgICAvLyBOT09QIGltcGxlbWVudCwgbm90aGluZyB0byBkby4uLi5cbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXREZXZpY2UoKTogUHJvbWlzZTxzdHJpbmcgfCBudWxsPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldFdpZHRoKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRIZWlnaHQoKTogUHJvbWlzZTxudW1iZXIgfCBudWxsPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGdldER1cmF0aW9uKCk6IFByb21pc2U8bnVtYmVyIHwgbnVsbD4ge1xuXG4gICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcbiAgfVxuXG4gIHB1YmxpYyBhc3luYyBnZXRTZGtWZXJzaW9uKCk6IFByb21pc2U8c3RyaW5nPiB7XG5cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZlcnNpb24pO1xuICB9XG5cbiAgcHVibGljIGFwcGx5Q29uZmlnKHByZWZzOiBJRGljdGlvbmFyeTxhbnk+KTogdm9pZCB7XG5cbiAgICBjb25zdCBldnQgPSB7IHR5cGU6ICdhcHBseUNvbmZpZycsIHByZWZzOiBwcmVmcywgaXNPcGVuZXI6IHdpbmRvdy5vcGVuZXIgIT09IG51bGwgfTtcblxuICAgIGlmICh3aW5kb3cub3BlbmVyKSB7XG4gICAgICB3aW5kb3cub3BlbmVyLnBvc3RNZXNzYWdlKFxuICAgICAgICBKU09OLnN0cmluZ2lmeShldnQpLFxuICAgICAgICAnKidcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHdpbmRvdy5wYXJlbnQucG9zdE1lc3NhZ2UoXG4gICAgICAgIEpTT04uc3RyaW5naWZ5KGV2dCksXG4gICAgICAgICcqJ1xuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,146 @@
1
+ import { decode } from 'html-entities';
2
+ /**
3
+ * Angular-friendly wrapper around the global `gadgets.reveldigital.powerbi` library.
4
+ *
5
+ * Provides typed Promise-based methods for embedding Power BI reports and dashboards.
6
+ *
7
+ * ```typescript
8
+ * const pbi = this.client.createPowerBI({
9
+ * workspaceId: '...',
10
+ * reportId: '...',
11
+ * container: this.containerEl.nativeElement
12
+ * });
13
+ *
14
+ * // Embed the report
15
+ * await pbi.embed();
16
+ *
17
+ * // Refresh the token
18
+ * await pbi.refresh();
19
+ *
20
+ * // Cleanup
21
+ * pbi.dispose();
22
+ * ```
23
+ */
24
+ export class PowerBIRef {
25
+ /**
26
+ * Creates a new PowerBIRef.
27
+ *
28
+ * @param options - Power BI embed configuration
29
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
30
+ * @throws Error if the global Power BI library is not loaded
31
+ */
32
+ constructor(options, zone) {
33
+ this._zone = zone;
34
+ const lib = window.gadgets?.['reveldigital.powerbi'];
35
+ if (!lib || typeof lib.create !== 'function') {
36
+ throw new Error('RevelDigital PowerBI library is not available. ' +
37
+ 'Ensure the Power BI feature is enabled for this gadget.');
38
+ }
39
+ this._instance = lib.create(options);
40
+ }
41
+ /**
42
+ * Fetches the embed configuration from the API and renders the Power BI
43
+ * content in the container element.
44
+ *
45
+ * @returns Promise resolving to the embed configuration returned by the API
46
+ */
47
+ embed() {
48
+ return this._zone.run(() => this._instance.embed());
49
+ }
50
+ /**
51
+ * Refreshes the embed token without re-rendering.
52
+ *
53
+ * @returns Promise resolving when the token has been refreshed
54
+ */
55
+ refresh() {
56
+ return this._zone.run(() => this._instance.refresh());
57
+ }
58
+ /**
59
+ * Releases all resources: stops the token refresh timer and disposes
60
+ * the embedded Power BI component.
61
+ */
62
+ dispose() {
63
+ this._instance.dispose();
64
+ }
65
+ /** @ignore */
66
+ static _fromInstance(instance, zone) {
67
+ const ref = Object.create(PowerBIRef.prototype);
68
+ ref._instance = instance;
69
+ ref._zone = zone;
70
+ return ref;
71
+ }
72
+ }
73
+ /**
74
+ * Wrapper around a Power BI embed created from a gadget preference value.
75
+ *
76
+ * Automatically configures workspace, report/dashboard, and display settings
77
+ * from the preference.
78
+ *
79
+ * ```typescript
80
+ * const pbi = this.client.createPowerBIFromPref(
81
+ * prefs.getString('rdPowerBI'),
82
+ * this.containerEl.nativeElement
83
+ * );
84
+ *
85
+ * // Embed with preference settings
86
+ * await pbi.embed();
87
+ *
88
+ * // Cleanup
89
+ * pbi.dispose();
90
+ * ```
91
+ */
92
+ export class PowerBIPrefRef {
93
+ /**
94
+ * Creates a new PowerBIPrefRef from a gadget preference JSON string.
95
+ *
96
+ * @param prefValue - The raw gadget preference string (JSON)
97
+ * @param container - DOM element to embed into
98
+ * @param zone - Angular NgZone for ensuring change detection on callbacks
99
+ * @param extraOptions - Additional options to merge
100
+ * @throws Error if the global Power BI library is not loaded
101
+ */
102
+ constructor(prefValue, container, zone, extraOptions) {
103
+ const lib = window.gadgets?.['reveldigital.powerbi'];
104
+ if (!lib || typeof lib.createFromPref !== 'function') {
105
+ throw new Error('RevelDigital PowerBI library is not available. ' +
106
+ 'Ensure the Power BI feature is enabled for this gadget.');
107
+ }
108
+ // gadgets.Prefs.getString() returns HTML-encoded values, decode before parsing
109
+ const decoded = decode(prefValue);
110
+ const instance = lib.createFromPref(decoded, container, extraOptions);
111
+ this.pref = this._parsePref(decoded);
112
+ this.powerBI = PowerBIRef._fromInstance(instance, zone);
113
+ }
114
+ /**
115
+ * Fetches the embed configuration and renders the Power BI content.
116
+ *
117
+ * @returns Promise resolving to the embed configuration
118
+ */
119
+ embed() {
120
+ return this.powerBI.embed();
121
+ }
122
+ /**
123
+ * Refreshes the embed token without re-rendering.
124
+ *
125
+ * @returns Promise resolving when the token has been refreshed
126
+ */
127
+ refresh() {
128
+ return this.powerBI.refresh();
129
+ }
130
+ /**
131
+ * Releases all resources held by the underlying PowerBIRef.
132
+ */
133
+ dispose() {
134
+ this.powerBI.dispose();
135
+ }
136
+ /** @ignore */
137
+ _parsePref(decoded) {
138
+ try {
139
+ return JSON.parse(decoded);
140
+ }
141
+ catch {
142
+ return {};
143
+ }
144
+ }
145
+ }
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG93ZXJiaS1yZWYuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9yZXZlbGRpZ2l0YWwvcGxheWVyLWNsaWVudC9zcmMvbGliL3Bvd2VyYmktcmVmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHdkM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFCRztBQUNILE1BQU0sT0FBTyxVQUFVO0lBUXJCOzs7Ozs7T0FNRztJQUNILFlBQVksT0FBd0IsRUFBRSxJQUFZO1FBRWhELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDO1FBRWxCLE1BQU0sR0FBRyxHQUFJLE1BQWMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1FBRTlELElBQUksQ0FBQyxHQUFHLElBQUksT0FBTyxHQUFHLENBQUMsTUFBTSxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSxLQUFLLENBQ2IsaURBQWlEO2dCQUNqRCx5REFBeUQsQ0FDMUQsQ0FBQztRQUNKLENBQUM7UUFFRCxJQUFJLENBQUMsU0FBUyxHQUFHLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdkMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksS0FBSztRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3RELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksT0FBTztRQUNaLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRDs7O09BR0c7SUFDSSxPQUFPO1FBQ1osSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUMzQixDQUFDO0lBRUQsY0FBYztJQUNkLE1BQU0sQ0FBQyxhQUFhLENBQUMsUUFBYSxFQUFFLElBQVk7UUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFlLENBQUM7UUFDOUQsR0FBRyxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUM7UUFDekIsR0FBRyxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUM7UUFDakIsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDO0NBQ0Y7QUFHRDs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBa0JHO0FBQ0gsTUFBTSxPQUFPLGNBQWM7SUFRekI7Ozs7Ozs7O09BUUc7SUFDSCxZQUFZLFNBQWlCLEVBQUUsU0FBc0IsRUFBRSxJQUFZLEVBQUUsWUFBdUM7UUFFMUcsTUFBTSxHQUFHLEdBQUksTUFBYyxDQUFDLE9BQU8sRUFBRSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFFOUQsSUFBSSxDQUFDLEdBQUcsSUFBSSxPQUFPLEdBQUcsQ0FBQyxjQUFjLEtBQUssVUFBVSxFQUFFLENBQUM7WUFDckQsTUFBTSxJQUFJLEtBQUssQ0FDYixpREFBaUQ7Z0JBQ2pELHlEQUF5RCxDQUMxRCxDQUFDO1FBQ0osQ0FBQztRQUVELCtFQUErRTtRQUMvRSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFbEMsTUFBTSxRQUFRLEdBQUcsR0FBRyxDQUFDLGNBQWMsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3RFLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsT0FBTyxHQUFHLFVBQVUsQ0FBQyxhQUFhLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzFELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksS0FBSztRQUNWLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLE9BQU87UUFDWixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDaEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksT0FBTztRQUNaLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDekIsQ0FBQztJQUVELGNBQWM7SUFDTixVQUFVLENBQUMsT0FBZTtRQUNoQyxJQUFJLENBQUM7WUFDSCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLE9BQU8sRUFBRSxDQUFDO1FBQ1osQ0FBQztJQUNILENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE5nWm9uZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgZGVjb2RlIH0gZnJvbSAnaHRtbC1lbnRpdGllcyc7XG5pbXBvcnQgeyBJUG93ZXJCSU9wdGlvbnMsIElQb3dlckJJUHJlZiB9IGZyb20gJy4vaW50ZXJmYWNlcy9wb3dlcmJpLmludGVyZmFjZSc7XG5cbi8qKlxuICogQW5ndWxhci1mcmllbmRseSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIGBnYWRnZXRzLnJldmVsZGlnaXRhbC5wb3dlcmJpYCBsaWJyYXJ5LlxuICpcbiAqIFByb3ZpZGVzIHR5cGVkIFByb21pc2UtYmFzZWQgbWV0aG9kcyBmb3IgZW1iZWRkaW5nIFBvd2VyIEJJIHJlcG9ydHMgYW5kIGRhc2hib2FyZHMuXG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogY29uc3QgcGJpID0gdGhpcy5jbGllbnQuY3JlYXRlUG93ZXJCSSh7XG4gKiAgIHdvcmtzcGFjZUlkOiAnLi4uJyxcbiAqICAgcmVwb3J0SWQ6ICcuLi4nLFxuICogICBjb250YWluZXI6IHRoaXMuY29udGFpbmVyRWwubmF0aXZlRWxlbWVudFxuICogfSk7XG4gKlxuICogLy8gRW1iZWQgdGhlIHJlcG9ydFxuICogYXdhaXQgcGJpLmVtYmVkKCk7XG4gKlxuICogLy8gUmVmcmVzaCB0aGUgdG9rZW5cbiAqIGF3YWl0IHBiaS5yZWZyZXNoKCk7XG4gKlxuICogLy8gQ2xlYW51cFxuICogcGJpLmRpc3Bvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUG93ZXJCSVJlZiB7XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgcHJpdmF0ZSBfaW5zdGFuY2U6IGFueTtcblxuICAvKiogQGlnbm9yZSAqL1xuICBwcml2YXRlIF96b25lOiBOZ1pvbmU7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUG93ZXJCSVJlZi5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgLSBQb3dlciBCSSBlbWJlZCBjb25maWd1cmF0aW9uXG4gICAqIEBwYXJhbSB6b25lIC0gQW5ndWxhciBOZ1pvbmUgZm9yIGVuc3VyaW5nIGNoYW5nZSBkZXRlY3Rpb24gb24gY2FsbGJhY2tzXG4gICAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGdsb2JhbCBQb3dlciBCSSBsaWJyYXJ5IGlzIG5vdCBsb2FkZWRcbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnM6IElQb3dlckJJT3B0aW9ucywgem9uZTogTmdab25lKSB7XG5cbiAgICB0aGlzLl96b25lID0gem9uZTtcblxuICAgIGNvbnN0IGxpYiA9ICh3aW5kb3cgYXMgYW55KS5nYWRnZXRzPy5bJ3JldmVsZGlnaXRhbC5wb3dlcmJpJ107XG5cbiAgICBpZiAoIWxpYiB8fCB0eXBlb2YgbGliLmNyZWF0ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmV2ZWxEaWdpdGFsIFBvd2VyQkkgbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0Vuc3VyZSB0aGUgUG93ZXIgQkkgZmVhdHVyZSBpcyBlbmFibGVkIGZvciB0aGlzIGdhZGdldC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIHRoaXMuX2luc3RhbmNlID0gbGliLmNyZWF0ZShvcHRpb25zKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBGZXRjaGVzIHRoZSBlbWJlZCBjb25maWd1cmF0aW9uIGZyb20gdGhlIEFQSSBhbmQgcmVuZGVycyB0aGUgUG93ZXIgQklcbiAgICogY29udGVudCBpbiB0aGUgY29udGFpbmVyIGVsZW1lbnQuXG4gICAqXG4gICAqIEByZXR1cm5zIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBlbWJlZCBjb25maWd1cmF0aW9uIHJldHVybmVkIGJ5IHRoZSBBUElcbiAgICovXG4gIHB1YmxpYyBlbWJlZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLl9pbnN0YW5jZS5lbWJlZCgpKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGVtYmVkIHRva2VuIHdpdGhvdXQgcmUtcmVuZGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aGVuIHRoZSB0b2tlbiBoYXMgYmVlbiByZWZyZXNoZWRcbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB0aGlzLl9pbnN0YW5jZS5yZWZyZXNoKCkpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXM6IHN0b3BzIHRoZSB0b2tlbiByZWZyZXNoIHRpbWVyIGFuZCBkaXNwb3Nlc1xuICAgKiB0aGUgZW1iZWRkZWQgUG93ZXIgQkkgY29tcG9uZW50LlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5faW5zdGFuY2UuZGlzcG9zZSgpO1xuICB9XG5cbiAgLyoqIEBpZ25vcmUgKi9cbiAgc3RhdGljIF9mcm9tSW5zdGFuY2UoaW5zdGFuY2U6IGFueSwgem9uZTogTmdab25lKTogUG93ZXJCSVJlZiB7XG4gICAgY29uc3QgcmVmID0gT2JqZWN0LmNyZWF0ZShQb3dlckJJUmVmLnByb3RvdHlwZSkgYXMgUG93ZXJCSVJlZjtcbiAgICByZWYuX2luc3RhbmNlID0gaW5zdGFuY2U7XG4gICAgcmVmLl96b25lID0gem9uZTtcbiAgICByZXR1cm4gcmVmO1xuICB9XG59XG5cblxuLyoqXG4gKiBXcmFwcGVyIGFyb3VuZCBhIFBvd2VyIEJJIGVtYmVkIGNyZWF0ZWQgZnJvbSBhIGdhZGdldCBwcmVmZXJlbmNlIHZhbHVlLlxuICpcbiAqIEF1dG9tYXRpY2FsbHkgY29uZmlndXJlcyB3b3Jrc3BhY2UsIHJlcG9ydC9kYXNoYm9hcmQsIGFuZCBkaXNwbGF5IHNldHRpbmdzXG4gKiBmcm9tIHRoZSBwcmVmZXJlbmNlLlxuICpcbiAqIGBgYHR5cGVzY3JpcHRcbiAqIGNvbnN0IHBiaSA9IHRoaXMuY2xpZW50LmNyZWF0ZVBvd2VyQklGcm9tUHJlZihcbiAqICAgcHJlZnMuZ2V0U3RyaW5nKCdyZFBvd2VyQkknKSxcbiAqICAgdGhpcy5jb250YWluZXJFbC5uYXRpdmVFbGVtZW50XG4gKiApO1xuICpcbiAqIC8vIEVtYmVkIHdpdGggcHJlZmVyZW5jZSBzZXR0aW5nc1xuICogYXdhaXQgcGJpLmVtYmVkKCk7XG4gKlxuICogLy8gQ2xlYW51cFxuICogcGJpLmRpc3Bvc2UoKTtcbiAqIGBgYFxuICovXG5leHBvcnQgY2xhc3MgUG93ZXJCSVByZWZSZWYge1xuXG4gIC8qKiBUaGUgdW5kZXJseWluZyBQb3dlckJJUmVmIHdpdGggZnVsbCBhY2Nlc3MgdG8gZW1iZWQsIHJlZnJlc2gsIGV0Yy4gKi9cbiAgcHVibGljIHJlYWRvbmx5IHBvd2VyQkk6IFBvd2VyQklSZWY7XG5cbiAgLyoqIFRoZSBwYXJzZWQgcHJlZmVyZW5jZSBvYmplY3QuICovXG4gIHB1YmxpYyByZWFkb25seSBwcmVmOiBJUG93ZXJCSVByZWY7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgUG93ZXJCSVByZWZSZWYgZnJvbSBhIGdhZGdldCBwcmVmZXJlbmNlIEpTT04gc3RyaW5nLlxuICAgKlxuICAgKiBAcGFyYW0gcHJlZlZhbHVlIC0gVGhlIHJhdyBnYWRnZXQgcHJlZmVyZW5jZSBzdHJpbmcgKEpTT04pXG4gICAqIEBwYXJhbSBjb250YWluZXIgLSBET00gZWxlbWVudCB0byBlbWJlZCBpbnRvXG4gICAqIEBwYXJhbSB6b25lIC0gQW5ndWxhciBOZ1pvbmUgZm9yIGVuc3VyaW5nIGNoYW5nZSBkZXRlY3Rpb24gb24gY2FsbGJhY2tzXG4gICAqIEBwYXJhbSBleHRyYU9wdGlvbnMgLSBBZGRpdGlvbmFsIG9wdGlvbnMgdG8gbWVyZ2VcbiAgICogQHRocm93cyBFcnJvciBpZiB0aGUgZ2xvYmFsIFBvd2VyIEJJIGxpYnJhcnkgaXMgbm90IGxvYWRlZFxuICAgKi9cbiAgY29uc3RydWN0b3IocHJlZlZhbHVlOiBzdHJpbmcsIGNvbnRhaW5lcjogSFRNTEVsZW1lbnQsIHpvbmU6IE5nWm9uZSwgZXh0cmFPcHRpb25zPzogUGFydGlhbDxJUG93ZXJCSU9wdGlvbnM+KSB7XG5cbiAgICBjb25zdCBsaWIgPSAod2luZG93IGFzIGFueSkuZ2FkZ2V0cz8uWydyZXZlbGRpZ2l0YWwucG93ZXJiaSddO1xuXG4gICAgaWYgKCFsaWIgfHwgdHlwZW9mIGxpYi5jcmVhdGVGcm9tUHJlZiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnUmV2ZWxEaWdpdGFsIFBvd2VyQkkgbGlicmFyeSBpcyBub3QgYXZhaWxhYmxlLiAnICtcbiAgICAgICAgJ0Vuc3VyZSB0aGUgUG93ZXIgQkkgZmVhdHVyZSBpcyBlbmFibGVkIGZvciB0aGlzIGdhZGdldC4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGdhZGdldHMuUHJlZnMuZ2V0U3RyaW5nKCkgcmV0dXJucyBIVE1MLWVuY29kZWQgdmFsdWVzLCBkZWNvZGUgYmVmb3JlIHBhcnNpbmdcbiAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlKHByZWZWYWx1ZSk7XG5cbiAgICBjb25zdCBpbnN0YW5jZSA9IGxpYi5jcmVhdGVGcm9tUHJlZihkZWNvZGVkLCBjb250YWluZXIsIGV4dHJhT3B0aW9ucyk7XG4gICAgdGhpcy5wcmVmID0gdGhpcy5fcGFyc2VQcmVmKGRlY29kZWQpO1xuICAgIHRoaXMucG93ZXJCSSA9IFBvd2VyQklSZWYuX2Zyb21JbnN0YW5jZShpbnN0YW5jZSwgem9uZSk7XG4gIH1cblxuICAvKipcbiAgICogRmV0Y2hlcyB0aGUgZW1iZWQgY29uZmlndXJhdGlvbiBhbmQgcmVuZGVycyB0aGUgUG93ZXIgQkkgY29udGVudC5cbiAgICpcbiAgICogQHJldHVybnMgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIGVtYmVkIGNvbmZpZ3VyYXRpb25cbiAgICovXG4gIHB1YmxpYyBlbWJlZCgpOiBQcm9taXNlPGFueT4ge1xuICAgIHJldHVybiB0aGlzLnBvd2VyQkkuZW1iZWQoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWZyZXNoZXMgdGhlIGVtYmVkIHRva2VuIHdpdGhvdXQgcmUtcmVuZGVyaW5nLlxuICAgKlxuICAgKiBAcmV0dXJucyBQcm9taXNlIHJlc29sdmluZyB3aGVuIHRoZSB0b2tlbiBoYXMgYmVlbiByZWZyZXNoZWRcbiAgICovXG4gIHB1YmxpYyByZWZyZXNoKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLnBvd2VyQkkucmVmcmVzaCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGFsbCByZXNvdXJjZXMgaGVsZCBieSB0aGUgdW5kZXJseWluZyBQb3dlckJJUmVmLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5wb3dlckJJLmRpc3Bvc2UoKTtcbiAgfVxuXG4gIC8qKiBAaWdub3JlICovXG4gIHByaXZhdGUgX3BhcnNlUHJlZihkZWNvZGVkOiBzdHJpbmcpOiBJUG93ZXJCSVByZWYge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZShkZWNvZGVkKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHJldHVybiB7fTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==
@@ -1,3 +1,3 @@
1
1
  // Generated by genversion.
2
- export const version = '2.8.0';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBnZW52ZXJzaW9uLlxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMi44LjAnXG4iXX0=
2
+ export const version = '2.10.0';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9saWIvdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSwyQkFBMkI7QUFDM0IsTUFBTSxDQUFDLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbIi8vIEdlbmVyYXRlZCBieSBnZW52ZXJzaW9uLlxuZXhwb3J0IGNvbnN0IHZlcnNpb24gPSAnMi4xMC4wJ1xuIl19
@@ -6,4 +6,6 @@ export * from './lib/player-client.module';
6
6
  export * from './lib/safe-style.pipe';
7
7
  export * from './lib/datatable-ref';
8
8
  export * from './lib/interfaces/datatable.interface';
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNDQUFzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFB1YmxpYyBBUEkgU3VyZmFjZSBvZiBwbGF5ZXItY2xpZW50XG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9saWIvcGxheWVyLWNsaWVudC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3BsYXllci1jbGllbnQubW9kdWxlJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL3NhZmUtc3R5bGUucGlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9kYXRhdGFibGUtcmVmJztcbmV4cG9ydCAqIGZyb20gJy4vbGliL2ludGVyZmFjZXMvZGF0YXRhYmxlLmludGVyZmFjZSc7Il19
9
+ export * from './lib/powerbi-ref';
10
+ export * from './lib/interfaces/powerbi.interface';
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHVibGljLWFwaS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3JldmVsZGlnaXRhbC9wbGF5ZXItY2xpZW50L3NyYy9wdWJsaWMtYXBpLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyw2QkFBNkIsQ0FBQztBQUM1QyxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyxxQkFBcUIsQ0FBQztBQUNwQyxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxvQ0FBb0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBQdWJsaWMgQVBJIFN1cmZhY2Ugb2YgcGxheWVyLWNsaWVudFxuICovXG5cbmV4cG9ydCAqIGZyb20gJy4vbGliL3BsYXllci1jbGllbnQuc2VydmljZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9wbGF5ZXItY2xpZW50Lm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9zYWZlLXN0eWxlLnBpcGUnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvZGF0YXRhYmxlLXJlZic7XG5leHBvcnQgKiBmcm9tICcuL2xpYi9pbnRlcmZhY2VzL2RhdGF0YWJsZS5pbnRlcmZhY2UnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvcG93ZXJiaS1yZWYnO1xuZXhwb3J0ICogZnJvbSAnLi9saWIvaW50ZXJmYWNlcy9wb3dlcmJpLmludGVyZmFjZSc7Il19