@ethlete/query 5.9.1 → 5.11.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.
- package/CHANGELOG.md +14 -0
- package/esm2022/lib/devtools/components/query-devtools/query-devtools.component.mjs +3 -3
- package/esm2022/lib/devtools/pipes/query-short-name.pipe.mjs +3 -3
- package/esm2022/lib/directives/infinity-query-trigger.directive.mjs +3 -3
- package/esm2022/lib/directives/infinity-query.directive.mjs +7 -8
- package/esm2022/lib/directives/query.directive.mjs +3 -3
- package/esm2022/lib/infinite-query/infinity-query.mjs +6 -2
- package/esm2022/lib/infinite-query/infinity-query.types.mjs +1 -1
- package/esm2022/lib/query-form/query-form.mjs +7 -2
- package/fesm2022/ethlete-query.mjs +28 -21
- package/fesm2022/ethlete-query.mjs.map +1 -1
- package/lib/directives/infinity-query.directive.d.ts +1 -1
- package/lib/infinite-query/infinity-query.d.ts +9 -7
- package/lib/infinite-query/infinity-query.types.d.ts +5 -0
- package/lib/query-form/query-form.d.ts +1 -1
- package/package.json +5 -5
|
@@ -269,7 +269,12 @@ export class QueryForm {
|
|
|
269
269
|
return val ?? null;
|
|
270
270
|
}
|
|
271
271
|
_transformKeyToQueryParam(key) {
|
|
272
|
-
|
|
272
|
+
if (!this._options?.queryParamPrefix)
|
|
273
|
+
return key;
|
|
274
|
+
const prefix = typeof this._options?.queryParamPrefix === 'string'
|
|
275
|
+
? this._options.queryParamPrefix
|
|
276
|
+
: this._options.queryParamPrefix();
|
|
277
|
+
return `${prefix}-${key}`;
|
|
273
278
|
}
|
|
274
279
|
_isDefaultValue(key, value) {
|
|
275
280
|
const normalizedValue = Array.isArray(value) ? `${ET_ARR_PREFIX}${JSON.stringify(value)}` : value;
|
|
@@ -339,4 +344,4 @@ export class QueryForm {
|
|
|
339
344
|
this._currentFormValue$.next(newVal);
|
|
340
345
|
}
|
|
341
346
|
}
|
|
342
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVVoSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsTUFBTSxPQUFPLFVBQVU7SUFDckIsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBbUIsSUFBMEI7UUFBMUIsU0FBSSxHQUFKLElBQUksQ0FBc0I7SUFBRyxDQUFDO0NBQ2xEO0FBRUQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFF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LENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUsIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCwgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBFVF9QUk9QRVJUWV9SRU1PVkVELCBSb3V0ZXJTdGF0ZVNlcnZpY2UsIGNsb25lLCBjcmVhdGVEZXN0cm95LCBlcXVhbCB9IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIG1hcCwgbWVyZ2UsIG9mLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgUXVlcnlGaWVsZE9wdGlvbnMsXG4gIFF1ZXJ5Rm9ybUdyb3VwLFxuICBRdWVyeUZvcm1Hcm91cENvbnRyb2xzLFxuICBRdWVyeUZvcm1PYnNlcnZlT3B0aW9ucyxcbiAgUXVlcnlGb3JtVmFsdWUsXG4gIFF1ZXJ5Rm9ybVZhbHVlRXZlbnQsXG4gIFF1ZXJ5Rm9ybVdyaXRlT3B0aW9ucyxcbn0gZnJvbSAnLi9xdWVyeS1mb3JtLnR5cGVzJztcbmltcG9ydCB7IHRyYW5zZm9ybVRvQm9vbGVhbiwgdHJhbnNmb3JtVG9OdW1iZXIgfSBmcm9tICcuL3F1ZXJ5LWZvcm0udXRpbHMnO1xuXG5jb25zdCBFVF9BUlJfUFJFRklYID0gJ0VUX0FSUl9fJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5RmllbGQ8VD4ge1xuICBnZXQgY29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNvbnRyb2w7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogUXVlcnlGaWVsZE9wdGlvbnM8VD4pIHt9XG59XG5cbmNvbnN0IElHTk9SRURfRklMVEVSX0NPVU5UX0ZJRUxEUyA9IFsncGFnZScsICdza2lwJywgJ3Rha2UnLCAnbGltaXQnLCAnc29ydCcsICdzb3J0QnknLCAnc29ydE9yZGVyJywgJ3F1ZXJ5JywgJ3NlYXJjaCddO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybU9wdGlvbnMge1xuICAvKipcbiAgICogQSBwcmVmaXggdG8gdXNlIGZvciB0aGUgcXVlcnkgcGFyYW1ldGVycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBxdWVyeSBmb3JtcyBvbiB0aGUgc2FtZSBwYWdlLlxuICAgKi9cbiAgcXVlcnlQYXJhbVByZWZpeD86IHN0cmluZztcbn1cblxuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbmV4cG9ydCBjbGFzcyBRdWVyeUZvcm08VCBleHRlbmRzIFJlY29yZDxzdHJpbmcsIFF1ZXJ5RmllbGQ8YW55Pj4+IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVzdHJveSQgPSBjcmVhdGVEZXN0cm95KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3Vub2JzZXJ2ZVRyaWdnZXIkID0gbmV3IFN1YmplY3Q8Ym9vbGVhbj4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2FjdGl2YXRlZFJvdXRlID0gaW5qZWN0KEFjdGl2YXRlZFJvdXRlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFZhbHVlcyA9IHRoaXMuX2V4dHJhY3REZWZhdWx0VmFsdWVzKCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3JvdXRlclN0YXRlU2VydmljZSA9IGluamVjdChSb3V0ZXJTdGF0ZVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IF96b25lID0gaW5qZWN0KE5nWm9uZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2RpZFZhbHVlQ2hhbmdlcyQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuXG4gIHByaXZhdGUgX2lzT2JzZXJ2aW5nID0gZmFsc2U7XG4gIHByaXZhdGUgX3NraXBOZXh0UmVzZXRzID0gZmFsc2U7XG5cbiAgLyoqXG4gICAqIFRoZSBhbmd1bGFyIGZvcm0gZ3JvdXAgdGhhdCBjb250YWlucyBhbGwgdGhlIGZpZWxkcy5cbiAgICpcbiAgICogKipEbyBub3QqKiB1c2UgYW55IG9mIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBvbiB0aGlzIGZvcm0gZ3JvdXA6XG4gICAqIC0gYHNldFZhbHVlYDogVXNlIGBRdWVyeUZvcm0uc2V0VmFsdWVgIGluc3RlYWQuXG4gICAqIC0gYHBhdGNoVmFsdWVgOiBVc2UgYFF1ZXJ5Rm9ybS5wYXRjaFZhbHVlYCBpbnN0ZWFkLlxuICAgKiAtIGB2YWx1ZUNoYW5nZXNgOiBVc2UgYFF1ZXJ5Rm9ybS5jaGFuZ2VzJGAgaW5zdGVhZC5cbiAgICogLSBgdmFsdWVgOiBVc2UgYFF1ZXJ5Rm9ybS52YWx1ZWAgaW5zdGVhZC5cbiAgICogLSBgY29udHJvbHNgOiBVc2UgYFF1ZXJ5Rm9ybS5jb250cm9sc2AgaW5zdGVhZC5cbiAgICovXG4gIHJlYWRvbmx5IGZvcm0gPSB0aGlzLl9zZXR1cEZvcm1Hcm91cCgpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2xhc3RGb3JtVmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeUZvcm1WYWx1ZTxUPiB8IG51bGw+KG51bGwpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9jdXJyZW50Rm9ybVZhbHVlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlGb3JtVmFsdWU8VD4+KHRoaXMuX2Zvcm1WYWx1ZSk7XG5cbiAgcHJpdmF0ZSBnZXQgX2Zvcm1WYWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmdldFJhd1ZhbHVlKCkgYXMgUXVlcnlGb3JtVmFsdWU8VD47XG4gIH1cblxuICBwcml2YXRlIGdldCBfZm9ybSgpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtIGFzIHVua25vd24gYXMgUXVlcnlGb3JtR3JvdXA7XG4gIH1cblxuICBwcml2YXRlIHJlYWRvbmx5IF9jaGFuZ2VzJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UXVlcnlGb3JtVmFsdWVFdmVudDxUPj4oe1xuICAgIHByZXZpb3VzVmFsdWU6IG51bGwsXG4gICAgY3VycmVudFZhbHVlOiB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBRdWVyeUZvcm1WYWx1ZTxUPixcbiAgfSk7XG5cbiAgcmVhZG9ubHkgY2hhbmdlcyQgPSB0aGlzLl9jaGFuZ2VzJC5hc09ic2VydmFibGUoKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlJCA9IHRoaXMuX2NoYW5nZXMkLnBpcGUobWFwKCh7IGN1cnJlbnRWYWx1ZSB9KSA9PiBjdXJyZW50VmFsdWUpKTtcbiAgcmVhZG9ubHkgcHJldmlvdXNWYWx1ZSQgPSB0aGlzLl9jaGFuZ2VzJC5waXBlKG1hcCgoeyBwcmV2aW91c1ZhbHVlIH0pID0+IHByZXZpb3VzVmFsdWUpKTtcblxuICByZWFkb25seSBjaGFuZ2VzID0gdG9TaWduYWwodGhpcy5jaGFuZ2VzJCk7XG4gIHJlYWRvbmx5IGN1cnJlbnRWYWx1ZSA9IHRvU2lnbmFsKHRoaXMuY3VycmVudFZhbHVlJCk7XG4gIHJlYWRvbmx5IHByZXZpb3VzVmFsdWUgPSB0b1NpZ25hbCh0aGlzLnByZXZpb3VzVmFsdWUkKTtcblxuICAvKipcbiAgICogVGhlIG51bWJlciBvZiBhY3RpdmUgZmlsdGVycy5cbiAgICpcbiAgICogRXhjbHVkZXMgdGhlIGZvbGxvd2luZyBmaWVsZHMgYnkgZGVmYXVsdDpcbiAgICogLSBgcGFnZWBcbiAgICogLSBgc2tpcGBcbiAgICogLSBgdGFrZWBcbiAgICogLSBgbGltaXRgXG4gICAqIC0gYHNvcnRgXG4gICAqIC0gYHNvcnRCeWBcbiAgICogLSBgc29ydE9yZGVyYFxuICAgKiAtIGBxdWVyeWBcbiAgICogLSBgc2VhcmNoYFxuICAgKi9cbiAgcmVhZG9ubHkgYWN0aXZlRmlsdGVyQ291bnQkID0gdGhpcy5jaGFuZ2VzJC5waXBlKFxuICAgIG1hcChcbiAgICAgICh7IGN1cnJlbnRWYWx1ZSB9KSA9PlxuICAgICAgICBPYmplY3QuZW50cmllcyhjdXJyZW50VmFsdWUpXG4gICAgICAgICAgLm1hcCgoW2tleSwgdmFsdWVdKSA9PiB7XG4gICAgICAgICAgICBpZiAoSUdOT1JFRF9GSUxURVJfQ09VTlRfRklFTERTLmluY2x1ZGVzKGtleSkgfHwgdGhpcy5fZmllbGRzW2tleV0/LmRhdGEuc2tpcEluRmlsdGVyQ291bnQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0RlZmF1bHRWYWx1ZShrZXksIHZhbHVlKTtcbiAgICAgICAgICB9KVxuICAgICAgICAgIC5maWx0ZXIoKHYpID0+IHYgPT09IGZhbHNlKS5sZW5ndGgsXG4gICAgKSxcbiAgKTtcblxuICBnZXQgY29udHJvbHMoKSB7XG4gICAgcmV0dXJuIHRoaXMuZm9ybS5jb250cm9scztcbiAgfVxuXG4gIGdldCB2YWx1ZSgpIHtcbiAgICByZXR1cm4gdGhpcy5fY2hhbmdlcyQudmFsdWUuY3VycmVudFZhbHVlO1xuICB9XG5cbiAgZ2V0IGRlZmF1bHRGb3JtVmFsdWUoKSB7XG4gICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX2RlZmF1bHRWYWx1ZXMpLnJlZHVjZSgoYWNjLCBba2V5XSkgPT4ge1xuICAgICAgYWNjW2tleSBhcyBrZXlvZiBRdWVyeUZvcm1WYWx1ZTxUPl0gPSB0aGlzLl9nZXREZWZhdWx0VmFsdWUoa2V5KTtcblxuICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCB7fSBhcyBRdWVyeUZvcm1WYWx1ZTxUPik7XG4gIH1cblxuICAvLyB3aXRoIHByZWZpeCBlZy4gcGFnZSBzaG91bGQgYmVjb21lICR7cHJlZml4fS1wYWdlXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX2ZpZWxkczogVCxcbiAgICBwcml2YXRlIF9vcHRpb25zPzogUXVlcnlGb3JtT3B0aW9ucyxcbiAgKSB7XG4gICAgYXNzZXJ0SW5JbmplY3Rpb25Db250ZXh0KFF1ZXJ5Rm9ybSk7XG4gIH1cblxuICBvYnNlcnZlKG9wdGlvbnM/OiBRdWVyeUZvcm1PYnNlcnZlT3B0aW9ucykge1xuICAgIGlmICh0aGlzLl9pc09ic2VydmluZykge1xuICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7XG4gICAgICAgIGNvbnNvbGUud2FybignUXVlcnlGb3JtLm9ic2VydmUoKSB3YXMgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGlzIGlzIG5vdCBzdXBwb3J0ZWQuJyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICB0aGlzLl9pc09ic2VydmluZyA9IHRydWU7XG5cbiAgICBpZiAob3B0aW9ucz8uc3luY09uTmF2aWdhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIGNvbnN0IGRpZENoYW5nZXMgPSB0aGlzLnNldEZvcm1WYWx1ZUZyb21VcmxRdWVyeVBhcmFtcyh7XG4gICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLl9yb3V0ZXJTdGF0ZVNlcnZpY2UucXVlcnlQYXJhbXMsXG4gICAgICB9KTtcblxuICAgICAgaWYgKGRpZENoYW5nZXMpIHtcbiAgICAgICAgdGhpcy5faGFuZGxlRm9ybUNoYW5nZSh0cnVlKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBtZXJnZSguLi5PYmplY3QudmFsdWVzKHRoaXMuX2ZpZWxkcykubWFwKChmaWVsZCkgPT4gZmllbGQuY29udHJvbC52YWx1ZUNoYW5nZXMpLCB0aGlzLl9kaWRWYWx1ZUNoYW5nZXMkKVxuICAgICAgLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgwKSxcbiAgICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgICB0aGlzLl9oYW5kbGVGb3JtQ2hhbmdlKCk7XG4gICAgICAgIH0pLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICB0YWtlVW50aWwodGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQpLFxuICAgICAgKVxuICAgICAgLnN1YnNjcmliZSgpO1xuXG4gICAgbGV0IGNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3A6IHN0cmluZ1tdID0gW107XG4gICAgbGV0IGN1cnJlbnRVbmlxdWVDaGFuZ2VkRmllbGRzOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgdGhpcy5fY3VycmVudEZvcm1WYWx1ZSRcbiAgICAgIC5waXBlKFxuICAgICAgICBtYXAoKGN1cnJlbnRWYWx1ZSkgPT4ge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBjbG9uZSh0aGlzLl9sYXN0Rm9ybVZhbHVlJC52YWx1ZSksXG4gICAgICAgICAgICBjdXJyZW50VmFsdWU6IGNsb25lKGN1cnJlbnRWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChvcHRpb25zPy53cml0ZVRvUXVlcnlQYXJhbXMgIT09IGZhbHNlKSB7XG4gICAgICAgICAgICB0aGlzLl9zeW5jVmlhVXJsUXVlcnlQYXJhbXMoY3VycmVudFZhbHVlLCBvcHRpb25zPy5yZXBsYWNlVXJsKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBkaWRSZXNldFZhbHVlcyA9IHRoaXMuX3NraXBOZXh0UmVzZXRzXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHRoaXMuX2hhbmRsZVF1ZXJ5Rm9ybVJlc2V0cyhwcmV2aW91c1ZhbHVlID8/IG51bGwsIGN1cnJlbnRWYWx1ZSk7XG5cbiAgICAgICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IGZhbHNlO1xuXG4gICAgICAgICAgY29uc3QgY2hhbmdlZEZpZWxkcyA9IE9iamVjdC5rZXlzKGN1cnJlbnRWYWx1ZSkuZmlsdGVyKFxuICAgICAgICAgICAgKGtleSkgPT4gIWVxdWFsKHByZXZpb3VzVmFsdWU/LltrZXldLCBjdXJyZW50VmFsdWVba2V5XSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmIChjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wLmxlbmd0aCkge1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkcy5wdXNoKC4uLmNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3ApO1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcCA9IFtdO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChkaWRSZXNldFZhbHVlcykge1xuICAgICAgICAgICAgdGhpcy5fZGlkVmFsdWVDaGFuZ2VzJC5uZXh0KHRydWUpO1xuICAgICAgICAgICAgY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcCA9IGNoYW5nZWRGaWVsZHM7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHMgPSBbLi4ubmV3IFNldChjaGFuZ2VkRmllbGRzKV07XG4gICAgICAgIH0pLFxuICAgICAgICBzd2l0Y2hNYXAoKHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlIH0pID0+IHtcbiAgICAgICAgICBpZiAoY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcC5sZW5ndGgpIHJldHVybiBvZihudWxsKS5waXBlKG1hcCgoKSA9PiAoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkpKTtcblxuICAgICAgICAgIGNvbnN0IGRlYm91bmNlVmFsdWVzID0gY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHMubWFwKChrZXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZmllbGRzW2tleV07XG5cbiAgICAgICAgICAgIGlmICghZmllbGQpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgICBpZiAoZmllbGQuZGF0YS5kaXNhYmxlRGVib3VuY2VJZkZhbHN5ID09PSB0cnVlICYmICFjdXJyZW50VmFsdWVba2V5XSkge1xuICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmRhdGEuZGVib3VuY2UgPz8gbnVsbDtcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGN1cnJlbnRVbmlxdWVDaGFuZ2VkRmllbGRzID0gW107XG5cbiAgICAgICAgICBpZiAoZGVib3VuY2VWYWx1ZXMuc29tZSgodikgPT4gdiA9PT0gbnVsbCkgfHwgIWRlYm91bmNlVmFsdWVzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpLnBpcGUobWFwKCgpID0+ICh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHNob3J0ZXN0RGVib3VuY2VUaW1lID0gTWF0aC5taW4oLi4uZGVib3VuY2VWYWx1ZXMuZmlsdGVyKCh2KTogdiBpcyBudW1iZXIgPT4gdiAhPT0gbnVsbCkpO1xuXG4gICAgICAgICAgcmV0dXJuIHRpbWVyKHNob3J0ZXN0RGVib3VuY2VUaW1lKS5waXBlKG1hcCgoKSA9PiAoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkpKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRhcCgoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgdGhpcy5fY2hhbmdlcyQubmV4dCh7XG4gICAgICAgICAgICBwcmV2aW91c1ZhbHVlOiBwcmV2aW91c1ZhbHVlID8/IG51bGwsXG4gICAgICAgICAgICBjdXJyZW50VmFsdWU6IGN1cnJlbnRWYWx1ZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl91bm9ic2VydmVUcmlnZ2VyJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBpZiAob3B0aW9ucz8uc3luY09uTmF2aWdhdGlvbiAhPT0gZmFsc2UpIHtcbiAgICAgIHRoaXMuX3JvdXRlclN0YXRlU2VydmljZS5xdWVyeVBhcmFtQ2hhbmdlcyRcbiAgICAgICAgLnBpcGUoXG4gICAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fdW5vYnNlcnZlVHJpZ2dlciQpLFxuICAgICAgICAgIHRhcCgoY2hhbmdlcykgPT4ge1xuICAgICAgICAgICAgY29uc3QgZGlkVmFsdWVDaGFuZ2VzID0gdGhpcy5zZXRGb3JtVmFsdWVGcm9tVXJsUXVlcnlQYXJhbXMoeyBxdWVyeVBhcmFtczogY2hhbmdlcyB9KTtcblxuICAgICAgICAgICAgaWYgKGRpZFZhbHVlQ2hhbmdlcykge1xuICAgICAgICAgICAgICB0aGlzLl9kaWRWYWx1ZUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSksXG4gICAgICAgIClcbiAgICAgICAgLnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgcHJpdmF0ZSBfaGFuZGxlUXVlcnlGb3JtUmVzZXRzKHByZXZpb3VzVmFsdWU6IFF1ZXJ5Rm9ybVZhbHVlPFQ+IHwgbnVsbCwgY3VycmVudFZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPikge1xuICAgIGxldCBkaWRSZXNldFZhbHVlcyA9IGZhbHNlO1xuXG4gICAgZm9yIChjb25zdCBmb3JtRmllbGRLZXkgaW4gdGhpcy5fZmllbGRzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1tmb3JtRmllbGRLZXldO1xuXG4gICAgICBpZiAoIWZpZWxkKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcmVzZXRzID0gZmllbGQuZGF0YS5pc1Jlc2V0Qnk7XG5cbiAgICAgIGlmICghcmVzZXRzKSBjb250aW51ZTtcblxuICAgICAgY29uc3QgcmVzZXRDb25kaXRpb25LZXlzID0gQXJyYXkuaXNBcnJheShyZXNldHMpID8gcmVzZXRzIDogW3Jlc2V0c107XG5cbiAgICAgIGZvciAoY29uc3QgcmVzZXRDb25kaXRpb25LZXkgb2YgcmVzZXRDb25kaXRpb25LZXlzKSB7XG4gICAgICAgIGlmICghKHJlc2V0Q29uZGl0aW9uS2V5IGluIHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybihgVGhlIGZpZWxkIFwiJHtyZXNldENvbmRpdGlvbktleX1cIiBpcyBub3QgZGVmaW5lZCBpbiB0aGUgUXVlcnlGb3JtLiBJcyBpdCBhIHR5cG8/YCwgdGhpcyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoXG4gICAgICAgICAgcHJldmlvdXNWYWx1ZSAmJlxuICAgICAgICAgIGN1cnJlbnRWYWx1ZSAmJlxuICAgICAgICAgICFlcXVhbChwcmV2aW91c1ZhbHVlW3Jlc2V0Q29uZGl0aW9uS2V5XSwgY3VycmVudFZhbHVlW3Jlc2V0Q29uZGl0aW9uS2V5XSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgY29uc3QgZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCA9IHRoaXMuX2dldERlZmF1bHRWYWx1ZShmb3JtRmllbGRLZXkpO1xuICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZUZvcktleVRvUmVzZXQgPSBjdXJyZW50VmFsdWVbZm9ybUZpZWxkS2V5XTtcblxuICAgICAgICAgIGlmIChlcXVhbChkZWZhdWx0VmFsdWVGb3JLZXlUb1Jlc2V0LCBjdXJyZW50VmFsdWVGb3JLZXlUb1Jlc2V0KSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdGhpcy5mb3JtLmNvbnRyb2xzW2Zvcm1GaWVsZEtleV0uc2V0VmFsdWUoZGVmYXVsdFZhbHVlRm9yS2V5VG9SZXNldCk7XG5cbiAgICAgICAgICBkaWRSZXNldFZhbHVlcyA9IHRydWU7XG5cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkaWRSZXNldFZhbHVlcztcbiAgfVxuXG4gIHVub2JzZXJ2ZSgpIHtcbiAgICB0aGlzLl91bm9ic2VydmVUcmlnZ2VyJC5uZXh0KHRydWUpO1xuICB9XG5cbiAgc2V0Rm9ybVZhbHVlRnJvbVVybFF1ZXJ5UGFyYW1zKG9wdGlvbnM6IHsgcXVlcnlQYXJhbXM6IFJlY29yZDxzdHJpbmcsIHVua25vd24+IH0pIHtcbiAgICBsZXQgZGlkVmFsdWVDaGFuZ2VzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9maWVsZHMpKSB7XG4gICAgICBjb25zdCB2YWx1ZSA9IG9wdGlvbnMucXVlcnlQYXJhbXNbdGhpcy5fdHJhbnNmb3JtS2V5VG9RdWVyeVBhcmFtKGtleSldO1xuXG4gICAgICBjb25zdCB2YWx1ZURvZXNOb3RFeGlzdCA9IHZhbHVlID09PSB1bmRlZmluZWQ7XG5cbiAgICAgIGlmICh2YWx1ZURvZXNOb3RFeGlzdCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IHZhbHVlR290UmVtb3ZlZCA9IHZhbHVlID09PSBFVF9QUk9QRVJUWV9SRU1PVkVEO1xuXG4gICAgICBpZiAodmFsdWVHb3RSZW1vdmVkKSB7XG4gICAgICAgIGZpZWxkLmNvbnRyb2wuc2V0VmFsdWUodGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSksIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgICAgZGlkVmFsdWVDaGFuZ2VzID0gdHJ1ZTtcblxuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIGxldCBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHZhbHVlO1xuXG4gICAgICBpZiAoZmllbGQuZGF0YS5xdWVyeVBhcmFtVG9WYWx1ZVRyYW5zZm9ybUZuKSB7XG4gICAgICAgIGRlc2VyaWFsaXplZFZhbHVlID0gZmllbGQuZGF0YS5xdWVyeVBhcmFtVG9WYWx1ZVRyYW5zZm9ybUZuKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSAnbnVtYmVyJykge1xuICAgICAgICBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHRyYW5zZm9ybVRvTnVtYmVyKHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgZGVzZXJpYWxpemVkVmFsdWUgPSB0cmFuc2Zvcm1Ub0Jvb2xlYW4odmFsdWUpO1xuICAgICAgfVxuXG4gICAgICBjb25zdCB2YWx1ZUlzRXF1YWxUb0N1cnJlbnQgPSBlcXVhbChkZXNlcmlhbGl6ZWRWYWx1ZSwgZmllbGQuY29udHJvbC52YWx1ZSk7XG5cbiAgICAgIGlmICh2YWx1ZUlzRXF1YWxUb0N1cnJlbnQpIGNvbnRpbnVlO1xuXG4gICAgICBmaWVsZC5jb250cm9sLnNldFZhbHVlKGRlc2VyaWFsaXplZFZhbHVlLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7XG4gICAgICBkaWRWYWx1ZUNoYW5nZXMgPSB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBkaWRWYWx1ZUNoYW5nZXM7XG4gIH1cblxuICBzZXRWYWx1ZSh2YWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4sIG9wdGlvbnM/OiBRdWVyeUZvcm1Xcml0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9mb3JtLl9zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucz8uc2tpcFJlc2V0cykge1xuICAgICAgdGhpcy5fc2tpcE5leHRSZXNldHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHBhdGNoVmFsdWUodmFsdWU6IFBhcnRpYWw8UXVlcnlGb3JtVmFsdWU8VD4+LCBvcHRpb25zPzogUXVlcnlGb3JtV3JpdGVPcHRpb25zKSB7XG4gICAgdGhpcy5fZm9ybS5fcGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7XG5cbiAgICBpZiAob3B0aW9ucz8uc2tpcFJlc2V0cykge1xuICAgICAgdGhpcy5fc2tpcE5leHRSZXNldHMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgX2dldERlZmF1bHRWYWx1ZShrZXk6IHN0cmluZykge1xuICAgIGNvbnN0IHZhbCA9IHRoaXMuX2RlZmF1bHRWYWx1ZXNba2V5XTtcblxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJyAmJiB2YWwuc3RhcnRzV2l0aChFVF9BUlJfUFJFRklYKSkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UodmFsLnNsaWNlKEVUX0FSUl9QUkVGSVgubGVuZ3RoKSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbCA/PyBudWxsO1xuICB9XG5cbiAgcHJpdmF0ZSBfdHJhbnNmb3JtS2V5VG9RdWVyeVBhcmFtKGtleTogc3RyaW5nKSB7XG4gICAgcmV0dXJuIHRoaXMuX29wdGlvbnM/LnF1ZXJ5UGFyYW1QcmVmaXggPyBgJHt0aGlzLl9vcHRpb25zLnF1ZXJ5UGFyYW1QcmVmaXh9LSR7a2V5fWAgOiBrZXk7XG4gIH1cblxuICBwcml2YXRlIF9pc0RlZmF1bHRWYWx1ZShrZXk6IHN0cmluZywgdmFsdWU6IHVua25vd24pIHtcbiAgICBjb25zdCBub3JtYWxpemVkVmFsdWUgPSBBcnJheS5pc0FycmF5KHZhbHVlKSA/IGAke0VUX0FSUl9QUkVGSVh9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YCA6IHZhbHVlO1xuXG4gICAgcmV0dXJuIHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpID09PSBub3JtYWxpemVkVmFsdWU7XG4gIH1cblxuICBwcml2YXRlIF9zZXR1cEZvcm1Hcm91cCgpIHtcbiAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30gYXMgUXVlcnlGb3JtR3JvdXBDb250cm9sczxUPikgYXMgdW5rbm93biBhcyBRdWVyeUZvcm1Hcm91cDtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGdyb3VwLmFkZENvbnRyb2woa2V5LCBmaWVsZC5jb250cm9sKTtcbiAgICB9XG5cbiAgICBncm91cC5fcGF0Y2hWYWx1ZSA9IGdyb3VwLnBhdGNoVmFsdWU7XG4gICAgZ3JvdXAuX3NldFZhbHVlID0gZ3JvdXAuc2V0VmFsdWU7XG5cbiAgICBncm91cC5wYXRjaFZhbHVlID0gdGhpcy5wYXRjaFZhbHVlLmJpbmQodGhpcyk7XG4gICAgZ3JvdXAuc2V0VmFsdWUgPSB0aGlzLnNldFZhbHVlLmJpbmQodGhpcyk7XG5cbiAgICByZXR1cm4gZ3JvdXAgYXMgdW5rbm93biBhcyBGb3JtR3JvdXA8UXVlcnlGb3JtR3JvdXBDb250cm9sczxUPj47XG4gIH1cblxuICBwcml2YXRlIF9leHRyYWN0RGVmYXVsdFZhbHVlcygpIHtcbiAgICBjb25zdCBkZWZhdWx0VmFsdWVzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9IHt9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCBmaWVsZF0gb2YgT2JqZWN0LmVudHJpZXModGhpcy5fZmllbGRzKSkge1xuICAgICAgY29uc3QgdmFsdWUgPSBmaWVsZC5jb250cm9sLnZhbHVlO1xuXG4gICAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gYCR7RVRfQVJSX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHZhbHVlKX1gO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGVmYXVsdFZhbHVlc1trZXldID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZXM7XG4gIH1cblxuICBwcml2YXRlIF9zeW5jVmlhVXJsUXVlcnlQYXJhbXModmFsdWVzOiBRdWVyeUZvcm1WYWx1ZTxUPiwgcmVwbGFjZVVybD86IGJvb2xlYW4pIHtcbiAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHsgLi4uY2xvbmUodGhpcy5fYWN0aXZhdGVkUm91dGUuc25hcHNob3QucXVlcnlQYXJhbXMpIH07XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyh2YWx1ZXMpKSB7XG4gICAgICBjb25zdCBxdWVyeVBhcmFtS2V5ID0gdGhpcy5fdHJhbnNmb3JtS2V5VG9RdWVyeVBhcmFtKGtleSk7XG4gICAgICBjb25zdCBmaWVsZCA9IHRoaXMuX2ZpZWxkc1trZXldO1xuXG4gICAgICBpZiAoIWZpZWxkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5faXNEZWZhdWx0VmFsdWUoa2V5LCB2YWx1ZSkgfHwgZmllbGQuZGF0YS5hcHBlbmRUb1VybCA9PT0gZmFsc2UpIHtcbiAgICAgICAgcXVlcnlQYXJhbXNbcXVlcnlQYXJhbUtleV0gPSB1bmRlZmluZWQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeVBhcmFtc1txdWVyeVBhcmFtS2V5XSA9IGZpZWxkLmRhdGEudmFsdWVUb1F1ZXJ5UGFyYW1UcmFuc2Zvcm1GblxuICAgICAgICAgID8gZmllbGQuZGF0YS52YWx1ZVRvUXVlcnlQYXJhbVRyYW5zZm9ybUZuPy4odmFsdWUpXG4gICAgICAgICAgOiB2YWx1ZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLl96b25lLnJ1bigoKSA9PiB7XG4gICAgICB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoW10sIHtcbiAgICAgICAgcXVlcnlQYXJhbXMsXG4gICAgICAgIHJlcGxhY2VVcmwsXG4gICAgICAgIHF1ZXJ5UGFyYW1zSGFuZGxpbmc6ICdtZXJnZScsXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgX2hhbmRsZUZvcm1DaGFuZ2UoZm9yY2VPdmVyd3JpdGUgPSBmYWxzZSkge1xuICAgIGNvbnN0IGN1cnJlbnRWYWwgPSBjbG9uZSh0aGlzLl9jdXJyZW50Rm9ybVZhbHVlJC52YWx1ZSk7XG4gICAgY29uc3QgbmV3VmFsID0gY2xvbmUodGhpcy5fZm9ybVZhbHVlKTtcblxuICAgIGlmIChlcXVhbChjdXJyZW50VmFsLCBuZXdWYWwpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGZvcmNlT3ZlcndyaXRlKSB7XG4gICAgICB0aGlzLl9sYXN0Rm9ybVZhbHVlJC5uZXh0KG5ld1ZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuX2xhc3RGb3JtVmFsdWUkLm5leHQoY3VycmVudFZhbCk7XG4gICAgfVxuXG4gICAgdGhpcy5fY3VycmVudEZvcm1WYWx1ZSQubmV4dChuZXdWYWwpO1xuICB9XG59XG4iXX0=
|
|
347
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicXVlcnktZm9ybS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvcXVlcnkvc3JjL2xpYi9xdWVyeS1mb3JtL3F1ZXJ5LWZvcm0udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3BGLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsbUJBQW1CLEVBQUUsa0JBQWtCLEVBQUUsS0FBSyxFQUFFLGFBQWEsRUFBRSxLQUFLLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDckcsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQUUsWUFBWSxFQUFFLEdBQUcsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxNQUFNLE1BQU0sQ0FBQztBQVVoSCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUUzRSxNQUFNLGFBQWEsR0FBRyxVQUFVLENBQUM7QUFFakMsTUFBTSxPQUFPLFVBQVU7SUFDckIsSUFBSSxPQUFPO1FBQ1QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsWUFBbUIsSUFBMEI7UUFBMUIsU0FBSSxHQUFKLElBQUksQ0FBc0I7SUFBRyxDQUFDO0NBQ2xEO0FBRUQsTUFBTSwyQkFBMkIsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFF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LEVBQUUsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUM5QixPQUFPO1FBQ1QsQ0FBQztRQUVELElBQUksY0FBYyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDcEMsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUN4QyxDQUFDO1FBRUQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUN2QyxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ1pvbmUsIGFzc2VydEluSW5qZWN0aW9uQ29udGV4dCwgaW5qZWN0LCBpc0Rldk1vZGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHRvU2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZS9yeGpzLWludGVyb3AnO1xuaW1wb3J0IHsgRm9ybUdyb3VwIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgQWN0aXZhdGVkUm91dGUsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBFVF9QUk9QRVJUWV9SRU1PVkVELCBSb3V0ZXJTdGF0ZVNlcnZpY2UsIGNsb25lLCBjcmVhdGVEZXN0cm95LCBlcXVhbCB9IGZyb20gJ0BldGhsZXRlL2NvcmUnO1xuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBTdWJqZWN0LCBkZWJvdW5jZVRpbWUsIG1hcCwgbWVyZ2UsIG9mLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCwgdGFwLCB0aW1lciB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtcbiAgUXVlcnlGaWVsZE9wdGlvbnMsXG4gIFF1ZXJ5Rm9ybUdyb3VwLFxuICBRdWVyeUZvcm1Hcm91cENvbnRyb2xzLFxuICBRdWVyeUZvcm1PYnNlcnZlT3B0aW9ucyxcbiAgUXVlcnlGb3JtVmFsdWUsXG4gIFF1ZXJ5Rm9ybVZhbHVlRXZlbnQsXG4gIFF1ZXJ5Rm9ybVdyaXRlT3B0aW9ucyxcbn0gZnJvbSAnLi9xdWVyeS1mb3JtLnR5cGVzJztcbmltcG9ydCB7IHRyYW5zZm9ybVRvQm9vbGVhbiwgdHJhbnNmb3JtVG9OdW1iZXIgfSBmcm9tICcuL3F1ZXJ5LWZvcm0udXRpbHMnO1xuXG5jb25zdCBFVF9BUlJfUFJFRklYID0gJ0VUX0FSUl9fJztcblxuZXhwb3J0IGNsYXNzIFF1ZXJ5RmllbGQ8VD4ge1xuICBnZXQgY29udHJvbCgpIHtcbiAgICByZXR1cm4gdGhpcy5kYXRhLmNvbnRyb2w7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZGF0YTogUXVlcnlGaWVsZE9wdGlvbnM8VD4pIHt9XG59XG5cbmNvbnN0IElHTk9SRURfRklMVEVSX0NPVU5UX0ZJRUxEUyA9IFsncGFnZScsICdza2lwJywgJ3Rha2UnLCAnbGltaXQnLCAnc29ydCcsICdzb3J0QnknLCAnc29ydE9yZGVyJywgJ3F1ZXJ5JywgJ3NlYXJjaCddO1xuXG5leHBvcnQgaW50ZXJmYWNlIFF1ZXJ5Rm9ybU9wdGlvbnMge1xuICAvKipcbiAgICogQSBwcmVmaXggdG8gdXNlIGZvciB0aGUgcXVlcnkgcGFyYW1ldGVycy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UgaGF2ZSBtdWx0aXBsZSBxdWVyeSBmb3JtcyBvbiB0aGUgc2FtZSBwYWdlLlxuICAgKi9cbiAgcXVlcnlQYXJhbVByZWZpeD86IHN0cmluZyB8ICgoKSA9PiBzdHJpbmcpO1xufVxuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuZXhwb3J0IGNsYXNzIFF1ZXJ5Rm9ybTxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgUXVlcnlGaWVsZDxhbnk+Pj4ge1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZXN0cm95JCA9IGNyZWF0ZURlc3Ryb3koKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfdW5vYnNlcnZlVHJpZ2dlciQgPSBuZXcgU3ViamVjdDxib29sZWFuPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfYWN0aXZhdGVkUm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9kZWZhdWx0VmFsdWVzID0gdGhpcy5fZXh0cmFjdERlZmF1bHRWYWx1ZXMoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfcm91dGVyU3RhdGVTZXJ2aWNlID0gaW5qZWN0KFJvdXRlclN0YXRlU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX3pvbmUgPSBpbmplY3QoTmdab25lKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfZGlkVmFsdWVDaGFuZ2VzJCA9IG5ldyBTdWJqZWN0PGJvb2xlYW4+KCk7XG5cbiAgcHJpdmF0ZSBfaXNPYnNlcnZpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2tpcE5leHRSZXNldHMgPSBmYWxzZTtcblxuICAvKipcbiAgICogVGhlIGFuZ3VsYXIgZm9ybSBncm91cCB0aGF0IGNvbnRhaW5zIGFsbCB0aGUgZmllbGRzLlxuICAgKlxuICAgKiAqKkRvIG5vdCoqIHVzZSBhbnkgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzIG9uIHRoaXMgZm9ybSBncm91cDpcbiAgICogLSBgc2V0VmFsdWVgOiBVc2UgYFF1ZXJ5Rm9ybS5zZXRWYWx1ZWAgaW5zdGVhZC5cbiAgICogLSBgcGF0Y2hWYWx1ZWA6IFVzZSBgUXVlcnlGb3JtLnBhdGNoVmFsdWVgIGluc3RlYWQuXG4gICAqIC0gYHZhbHVlQ2hhbmdlc2A6IFVzZSBgUXVlcnlGb3JtLmNoYW5nZXMkYCBpbnN0ZWFkLlxuICAgKiAtIGB2YWx1ZWA6IFVzZSBgUXVlcnlGb3JtLnZhbHVlYCBpbnN0ZWFkLlxuICAgKiAtIGBjb250cm9sc2A6IFVzZSBgUXVlcnlGb3JtLmNvbnRyb2xzYCBpbnN0ZWFkLlxuICAgKi9cbiAgcmVhZG9ubHkgZm9ybSA9IHRoaXMuX3NldHVwRm9ybUdyb3VwKCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBfbGFzdEZvcm1WYWx1ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFF1ZXJ5Rm9ybVZhbHVlPFQ+IHwgbnVsbD4obnVsbCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2N1cnJlbnRGb3JtVmFsdWUkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeUZvcm1WYWx1ZTxUPj4odGhpcy5fZm9ybVZhbHVlKTtcblxuICBwcml2YXRlIGdldCBfZm9ybVZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0uZ2V0UmF3VmFsdWUoKSBhcyBRdWVyeUZvcm1WYWx1ZTxUPjtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0IF9mb3JtKCkge1xuICAgIHJldHVybiB0aGlzLmZvcm0gYXMgdW5rbm93biBhcyBRdWVyeUZvcm1Hcm91cDtcbiAgfVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2NoYW5nZXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxRdWVyeUZvcm1WYWx1ZUV2ZW50PFQ+Pih7XG4gICAgcHJldmlvdXNWYWx1ZTogbnVsbCxcbiAgICBjdXJyZW50VmFsdWU6IHRoaXMuZm9ybS5nZXRSYXdWYWx1ZSgpIGFzIFF1ZXJ5Rm9ybVZhbHVlPFQ+LFxuICB9KTtcblxuICByZWFkb25seSBjaGFuZ2VzJCA9IHRoaXMuX2NoYW5nZXMkLmFzT2JzZXJ2YWJsZSgpO1xuICByZWFkb25seSBjdXJyZW50VmFsdWUkID0gdGhpcy5fY2hhbmdlcyQucGlwZShtYXAoKHsgY3VycmVudFZhbHVlIH0pID0+IGN1cnJlbnRWYWx1ZSkpO1xuICByZWFkb25seSBwcmV2aW91c1ZhbHVlJCA9IHRoaXMuX2NoYW5nZXMkLnBpcGUobWFwKCh7IHByZXZpb3VzVmFsdWUgfSkgPT4gcHJldmlvdXNWYWx1ZSkpO1xuXG4gIHJlYWRvbmx5IGNoYW5nZXMgPSB0b1NpZ25hbCh0aGlzLmNoYW5nZXMkKTtcbiAgcmVhZG9ubHkgY3VycmVudFZhbHVlID0gdG9TaWduYWwodGhpcy5jdXJyZW50VmFsdWUkKTtcbiAgcmVhZG9ubHkgcHJldmlvdXNWYWx1ZSA9IHRvU2lnbmFsKHRoaXMucHJldmlvdXNWYWx1ZSQpO1xuXG4gIC8qKlxuICAgKiBUaGUgbnVtYmVyIG9mIGFjdGl2ZSBmaWx0ZXJzLlxuICAgKlxuICAgKiBFeGNsdWRlcyB0aGUgZm9sbG93aW5nIGZpZWxkcyBieSBkZWZhdWx0OlxuICAgKiAtIGBwYWdlYFxuICAgKiAtIGBza2lwYFxuICAgKiAtIGB0YWtlYFxuICAgKiAtIGBsaW1pdGBcbiAgICogLSBgc29ydGBcbiAgICogLSBgc29ydEJ5YFxuICAgKiAtIGBzb3J0T3JkZXJgXG4gICAqIC0gYHF1ZXJ5YFxuICAgKiAtIGBzZWFyY2hgXG4gICAqL1xuICByZWFkb25seSBhY3RpdmVGaWx0ZXJDb3VudCQgPSB0aGlzLmNoYW5nZXMkLnBpcGUoXG4gICAgbWFwKFxuICAgICAgKHsgY3VycmVudFZhbHVlIH0pID0+XG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGN1cnJlbnRWYWx1ZSlcbiAgICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IHtcbiAgICAgICAgICAgIGlmIChJR05PUkVEX0ZJTFRFUl9DT1VOVF9GSUVMRFMuaW5jbHVkZXMoa2V5KSB8fCB0aGlzLl9maWVsZHNba2V5XT8uZGF0YS5za2lwSW5GaWx0ZXJDb3VudCkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzRGVmYXVsdFZhbHVlKGtleSwgdmFsdWUpO1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLmZpbHRlcigodikgPT4gdiA9PT0gZmFsc2UpLmxlbmd0aCxcbiAgICApLFxuICApO1xuXG4gIGdldCBjb250cm9scygpIHtcbiAgICByZXR1cm4gdGhpcy5mb3JtLmNvbnRyb2xzO1xuICB9XG5cbiAgZ2V0IHZhbHVlKCkge1xuICAgIHJldHVybiB0aGlzLl9jaGFuZ2VzJC52YWx1ZS5jdXJyZW50VmFsdWU7XG4gIH1cblxuICBnZXQgZGVmYXVsdEZvcm1WYWx1ZSgpIHtcbiAgICByZXR1cm4gT2JqZWN0LmVudHJpZXModGhpcy5fZGVmYXVsdFZhbHVlcykucmVkdWNlKChhY2MsIFtrZXldKSA9PiB7XG4gICAgICBhY2Nba2V5IGFzIGtleW9mIFF1ZXJ5Rm9ybVZhbHVlPFQ+XSA9IHRoaXMuX2dldERlZmF1bHRWYWx1ZShrZXkpO1xuXG4gICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHt9IGFzIFF1ZXJ5Rm9ybVZhbHVlPFQ+KTtcbiAgfVxuXG4gIC8vIHdpdGggcHJlZml4IGVnLiBwYWdlIHNob3VsZCBiZWNvbWUgJHtwcmVmaXh9LXBhZ2VcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfZmllbGRzOiBULFxuICAgIHByaXZhdGUgX29wdGlvbnM/OiBRdWVyeUZvcm1PcHRpb25zLFxuICApIHtcbiAgICBhc3NlcnRJbkluamVjdGlvbkNvbnRleHQoUXVlcnlGb3JtKTtcbiAgfVxuXG4gIG9ic2VydmUob3B0aW9ucz86IFF1ZXJ5Rm9ybU9ic2VydmVPcHRpb25zKSB7XG4gICAgaWYgKHRoaXMuX2lzT2JzZXJ2aW5nKSB7XG4gICAgICBpZiAoaXNEZXZNb2RlKCkpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdRdWVyeUZvcm0ub2JzZXJ2ZSgpIHdhcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoaXMgaXMgbm90IHN1cHBvcnRlZC4nKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHRoaXMuX2lzT2JzZXJ2aW5nID0gdHJ1ZTtcblxuICAgIGlmIChvcHRpb25zPy5zeW5jT25OYXZpZ2F0aW9uICE9PSBmYWxzZSkge1xuICAgICAgY29uc3QgZGlkQ2hhbmdlcyA9IHRoaXMuc2V0Rm9ybVZhbHVlRnJvbVVybFF1ZXJ5UGFyYW1zKHtcbiAgICAgICAgcXVlcnlQYXJhbXM6IHRoaXMuX3JvdXRlclN0YXRlU2VydmljZS5xdWVyeVBhcmFtcyxcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoZGlkQ2hhbmdlcykge1xuICAgICAgICB0aGlzLl9oYW5kbGVGb3JtQ2hhbmdlKHRydWUpO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lcmdlKC4uLk9iamVjdC52YWx1ZXModGhpcy5fZmllbGRzKS5tYXAoKGZpZWxkKSA9PiBmaWVsZC5jb250cm9sLnZhbHVlQ2hhbmdlcyksIHRoaXMuX2RpZFZhbHVlQ2hhbmdlcyQpXG4gICAgICAucGlwZShcbiAgICAgICAgZGVib3VuY2VUaW1lKDApLFxuICAgICAgICB0YXAoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuX2hhbmRsZUZvcm1DaGFuZ2UoKTtcbiAgICAgICAgfSksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95JCksXG4gICAgICAgIHRha2VVbnRpbCh0aGlzLl91bm9ic2VydmVUcmlnZ2VyJCksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG5cbiAgICBsZXQgY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcDogc3RyaW5nW10gPSBbXTtcbiAgICBsZXQgY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHM6IHN0cmluZ1tdID0gW107XG5cbiAgICB0aGlzLl9jdXJyZW50Rm9ybVZhbHVlJFxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY3VycmVudFZhbHVlKSA9PiB7XG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWU6IGNsb25lKHRoaXMuX2xhc3RGb3JtVmFsdWUkLnZhbHVlKSxcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY2xvbmUoY3VycmVudFZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKG9wdGlvbnM/LndyaXRlVG9RdWVyeVBhcmFtcyAhPT0gZmFsc2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3N5bmNWaWFVcmxRdWVyeVBhcmFtcyhjdXJyZW50VmFsdWUsIG9wdGlvbnM/LnJlcGxhY2VVcmwpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGRpZFJlc2V0VmFsdWVzID0gdGhpcy5fc2tpcE5leHRSZXNldHNcbiAgICAgICAgICAgID8gZmFsc2VcbiAgICAgICAgICAgIDogdGhpcy5faGFuZGxlUXVlcnlGb3JtUmVzZXRzKHByZXZpb3VzVmFsdWUgPz8gbnVsbCwgY3VycmVudFZhbHVlKTtcblxuICAgICAgICAgIHRoaXMuX3NraXBOZXh0UmVzZXRzID0gZmFsc2U7XG5cbiAgICAgICAgICBjb25zdCBjaGFuZ2VkRmllbGRzID0gT2JqZWN0LmtleXMoY3VycmVudFZhbHVlKS5maWx0ZXIoXG4gICAgICAgICAgICAoa2V5KSA9PiAhZXF1YWwocHJldmlvdXNWYWx1ZT8uW2tleV0sIGN1cnJlbnRWYWx1ZVtrZXldKSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3AubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzLnB1c2goLi4uY2hhbmdlZEZpZWxkc0luTGFzdFJlc2V0TG9vcCk7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wID0gW107XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKGRpZFJlc2V0VmFsdWVzKSB7XG4gICAgICAgICAgICB0aGlzLl9kaWRWYWx1ZUNoYW5nZXMkLm5leHQodHJ1ZSk7XG4gICAgICAgICAgICBjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wID0gY2hhbmdlZEZpZWxkcztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50VW5pcXVlQ2hhbmdlZEZpZWxkcyA9IFsuLi5uZXcgU2V0KGNoYW5nZWRGaWVsZHMpXTtcbiAgICAgICAgfSksXG4gICAgICAgIHN3aXRjaE1hcCgoeyBjdXJyZW50VmFsdWUsIHByZXZpb3VzVmFsdWUgfSkgPT4ge1xuICAgICAgICAgIGlmIChjaGFuZ2VkRmllbGRzSW5MYXN0UmVzZXRMb29wLmxlbmd0aCkgcmV0dXJuIG9mKG51bGwpLnBpcGUobWFwKCgpID0+ICh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSkpO1xuXG4gICAgICAgICAgY29uc3QgZGVib3VuY2VWYWx1ZXMgPSBjdXJyZW50VW5pcXVlQ2hhbmdlZEZpZWxkcy5tYXAoKGtleSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9maWVsZHNba2V5XTtcblxuICAgICAgICAgICAgaWYgKCFmaWVsZCkgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgICAgIGlmIChmaWVsZC5kYXRhLmRpc2FibGVEZWJvdW5jZUlmRmFsc3kgPT09IHRydWUgJiYgIWN1cnJlbnRWYWx1ZVtrZXldKSB7XG4gICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gZmllbGQuZGF0YS5kZWJvdW5jZSA/PyBudWxsO1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgY3VycmVudFVuaXF1ZUNoYW5nZWRGaWVsZHMgPSBbXTtcblxuICAgICAgICAgIGlmIChkZWJvdW5jZVZhbHVlcy5zb21lKCh2KSA9PiB2ID09PSBudWxsKSB8fCAhZGVib3VuY2VWYWx1ZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gb2YobnVsbCkucGlwZShtYXAoKCkgPT4gKHsgY3VycmVudFZhbHVlLCBwcmV2aW91c1ZhbHVlIH0pKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3Qgc2hvcnRlc3REZWJvdW5jZVRpbWUgPSBNYXRoLm1pbiguLi5kZWJvdW5jZVZhbHVlcy5maWx0ZXIoKHYpOiB2IGlzIG51bWJlciA9PiB2ICE9PSBudWxsKSk7XG5cbiAgICAgICAgICByZXR1cm4gdGltZXIoc2hvcnRlc3REZWJvdW5jZVRpbWUpLnBpcGUobWFwKCgpID0+ICh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSkpO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFwKCh7IGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSB9KSA9PiB7XG4gICAgICAgICAgaWYgKGNoYW5nZWRGaWVsZHNJbkxhc3RSZXNldExvb3AubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICB0aGlzLl9jaGFuZ2VzJC5uZXh0KHtcbiAgICAgICAgICAgIHByZXZpb3VzVmFsdWU6IHByZXZpb3VzVmFsdWUgPz8gbnVsbCxcbiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZTogY3VycmVudFZhbHVlLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9KSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kkKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMuX3Vub2JzZXJ2ZVRyaWdnZXIkKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoKTtcblxuICAgIGlmIChvcHRpb25zPy5zeW5jT25OYXZpZ2F0aW9uICE9PSBmYWxzZSkge1xuICAgICAgdGhpcy5fcm91dGVyU3RhdGVTZXJ2aWNlLnF1ZXJ5UGFyYW1DaGFuZ2VzJFxuICAgICAgICAucGlwZShcbiAgICAgICAgICB0YWtlVW50aWwodGhpcy5fZGVzdHJveSQpLFxuICAgICAgICAgIHRha2VVbnRpbCh0aGlzLl91bm9ic2VydmVUcmlnZ2VyJCksXG4gICAgICAgICAgdGFwKChjaGFuZ2VzKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBkaWRWYWx1ZUNoYW5nZXMgPSB0aGlzLnNldEZvcm1WYWx1ZUZyb21VcmxRdWVyeVBhcmFtcyh7IHF1ZXJ5UGFyYW1zOiBjaGFuZ2VzIH0pO1xuXG4gICAgICAgICAgICBpZiAoZGlkVmFsdWVDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgIHRoaXMuX2RpZFZhbHVlQ2hhbmdlcyQubmV4dCh0cnVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KSxcbiAgICAgICAgKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVRdWVyeUZvcm1SZXNldHMocHJldmlvdXNWYWx1ZTogUXVlcnlGb3JtVmFsdWU8VD4gfCBudWxsLCBjdXJyZW50VmFsdWU6IFF1ZXJ5Rm9ybVZhbHVlPFQ+KSB7XG4gICAgbGV0IGRpZFJlc2V0VmFsdWVzID0gZmFsc2U7XG5cbiAgICBmb3IgKGNvbnN0IGZvcm1GaWVsZEtleSBpbiB0aGlzLl9maWVsZHMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gdGhpcy5fZmllbGRzW2Zvcm1GaWVsZEtleV07XG5cbiAgICAgIGlmICghZmllbGQpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByZXNldHMgPSBmaWVsZC5kYXRhLmlzUmVzZXRCeTtcblxuICAgICAgaWYgKCFyZXNldHMpIGNvbnRpbnVlO1xuXG4gICAgICBjb25zdCByZXNldENvbmRpdGlvbktleXMgPSBBcnJheS5pc0FycmF5KHJlc2V0cykgPyByZXNldHMgOiBbcmVzZXRzXTtcblxuICAgICAgZm9yIChjb25zdCByZXNldENvbmRpdGlvbktleSBvZiByZXNldENvbmRpdGlvbktleXMpIHtcbiAgICAgICAgaWYgKCEocmVzZXRDb25kaXRpb25LZXkgaW4gdGhpcy5fZmllbGRzKSkge1xuICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKGBUaGUgZmllbGQgXCIke3Jlc2V0Q29uZGl0aW9uS2V5fVwiIGlzIG5vdCBkZWZpbmVkIGluIHRoZSBRdWVyeUZvcm0uIElzIGl0IGEgdHlwbz9gLCB0aGlzKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBwcmV2aW91c1ZhbHVlICYmXG4gICAgICAgICAgY3VycmVudFZhbHVlICYmXG4gICAgICAgICAgIWVxdWFsKHByZXZpb3VzVmFsdWVbcmVzZXRDb25kaXRpb25LZXldLCBjdXJyZW50VmFsdWVbcmVzZXRDb25kaXRpb25LZXldKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCBkZWZhdWx0VmFsdWVGb3JLZXlUb1Jlc2V0ID0gdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGZvcm1GaWVsZEtleSk7XG4gICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlRm9yS2V5VG9SZXNldCA9IGN1cnJlbnRWYWx1ZVtmb3JtRmllbGRLZXldO1xuXG4gICAgICAgICAgaWYgKGVxdWFsKGRlZmF1bHRWYWx1ZUZvcktleVRvUmVzZXQsIGN1cnJlbnRWYWx1ZUZvcktleVRvUmVzZXQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICB0aGlzLmZvcm0uY29udHJvbHNbZm9ybUZpZWxkS2V5XS5zZXRWYWx1ZShkZWZhdWx0VmFsdWVGb3JLZXlUb1Jlc2V0KTtcblxuICAgICAgICAgIGRpZFJlc2V0VmFsdWVzID0gdHJ1ZTtcblxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZFJlc2V0VmFsdWVzO1xuICB9XG5cbiAgdW5vYnNlcnZlKCkge1xuICAgIHRoaXMuX3Vub2JzZXJ2ZVRyaWdnZXIkLm5leHQodHJ1ZSk7XG4gIH1cblxuICBzZXRGb3JtVmFsdWVGcm9tVXJsUXVlcnlQYXJhbXMob3B0aW9uczogeyBxdWVyeVBhcmFtczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gfSkge1xuICAgIGxldCBkaWRWYWx1ZUNoYW5nZXMgPSBmYWxzZTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gb3B0aW9ucy5xdWVyeVBhcmFtc1t0aGlzLl90cmFuc2Zvcm1LZXlUb1F1ZXJ5UGFyYW0oa2V5KV07XG5cbiAgICAgIGNvbnN0IHZhbHVlRG9lc05vdEV4aXN0ID0gdmFsdWUgPT09IHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHZhbHVlRG9lc05vdEV4aXN0KSBjb250aW51ZTtcblxuICAgICAgY29uc3QgdmFsdWVHb3RSZW1vdmVkID0gdmFsdWUgPT09IEVUX1BST1BFUlRZX1JFTU9WRUQ7XG5cbiAgICAgIGlmICh2YWx1ZUdvdFJlbW92ZWQpIHtcbiAgICAgICAgZmllbGQuY29udHJvbC5zZXRWYWx1ZSh0aGlzLl9nZXREZWZhdWx0VmFsdWUoa2V5KSwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pO1xuICAgICAgICBkaWRWYWx1ZUNoYW5nZXMgPSB0cnVlO1xuXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgbGV0IGRlc2VyaWFsaXplZFZhbHVlID0gdmFsdWU7XG5cbiAgICAgIGlmIChmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4pIHtcbiAgICAgICAgZGVzZXJpYWxpemVkVmFsdWUgPSBmaWVsZC5kYXRhLnF1ZXJ5UGFyYW1Ub1ZhbHVlVHJhbnNmb3JtRm4odmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSkgPT09ICdudW1iZXInKSB7XG4gICAgICAgIGRlc2VyaWFsaXplZFZhbHVlID0gdHJhbnNmb3JtVG9OdW1iZXIodmFsdWUpO1xuICAgICAgfSBlbHNlIGlmICh0eXBlb2YgdGhpcy5fZ2V0RGVmYXVsdFZhbHVlKGtleSkgPT09ICdib29sZWFuJykge1xuICAgICAgICBkZXNlcmlhbGl6ZWRWYWx1ZSA9IHRyYW5zZm9ybVRvQm9vbGVhbih2YWx1ZSk7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHZhbHVlSXNFcXVhbFRvQ3VycmVudCA9IGVxdWFsKGRlc2VyaWFsaXplZFZhbHVlLCBmaWVsZC5jb250cm9sLnZhbHVlKTtcblxuICAgICAgaWYgKHZhbHVlSXNFcXVhbFRvQ3VycmVudCkgY29udGludWU7XG5cbiAgICAgIGZpZWxkLmNvbnRyb2wuc2V0VmFsdWUoZGVzZXJpYWxpemVkVmFsdWUsIHsgZW1pdEV2ZW50OiBmYWxzZSB9KTtcbiAgICAgIGRpZFZhbHVlQ2hhbmdlcyA9IHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRpZFZhbHVlQ2hhbmdlcztcbiAgfVxuXG4gIHNldFZhbHVlKHZhbHVlOiBRdWVyeUZvcm1WYWx1ZTxUPiwgb3B0aW9ucz86IFF1ZXJ5Rm9ybVdyaXRlT3B0aW9ucykge1xuICAgIHRoaXMuX2Zvcm0uX3NldFZhbHVlKHZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zPy5za2lwUmVzZXRzKSB7XG4gICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcGF0Y2hWYWx1ZSh2YWx1ZTogUGFydGlhbDxRdWVyeUZvcm1WYWx1ZTxUPj4sIG9wdGlvbnM/OiBRdWVyeUZvcm1Xcml0ZU9wdGlvbnMpIHtcbiAgICB0aGlzLl9mb3JtLl9wYXRjaFZhbHVlKHZhbHVlLCBvcHRpb25zKTtcblxuICAgIGlmIChvcHRpb25zPy5za2lwUmVzZXRzKSB7XG4gICAgICB0aGlzLl9za2lwTmV4dFJlc2V0cyA9IHRydWU7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBfZ2V0RGVmYXVsdFZhbHVlKGtleTogc3RyaW5nKSB7XG4gICAgY29uc3QgdmFsID0gdGhpcy5fZGVmYXVsdFZhbHVlc1trZXldO1xuXG4gICAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnICYmIHZhbC5zdGFydHNXaXRoKEVUX0FSUl9QUkVGSVgpKSB7XG4gICAgICByZXR1cm4gSlNPTi5wYXJzZSh2YWwuc2xpY2UoRVRfQVJSX1BSRUZJWC5sZW5ndGgpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdmFsID8/IG51bGw7XG4gIH1cblxuICBwcml2YXRlIF90cmFuc2Zvcm1LZXlUb1F1ZXJ5UGFyYW0oa2V5OiBzdHJpbmcpIHtcbiAgICBpZiAoIXRoaXMuX29wdGlvbnM/LnF1ZXJ5UGFyYW1QcmVmaXgpIHJldHVybiBrZXk7XG5cbiAgICBjb25zdCBwcmVmaXggPVxuICAgICAgdHlwZW9mIHRoaXMuX29wdGlvbnM/LnF1ZXJ5UGFyYW1QcmVmaXggPT09ICdzdHJpbmcnXG4gICAgICAgID8gdGhpcy5fb3B0aW9ucy5xdWVyeVBhcmFtUHJlZml4XG4gICAgICAgIDogdGhpcy5fb3B0aW9ucy5xdWVyeVBhcmFtUHJlZml4KCk7XG5cbiAgICByZXR1cm4gYCR7cHJlZml4fS0ke2tleX1gO1xuICB9XG5cbiAgcHJpdmF0ZSBfaXNEZWZhdWx0VmFsdWUoa2V5OiBzdHJpbmcsIHZhbHVlOiB1bmtub3duKSB7XG4gICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBgJHtFVF9BUlJfUFJFRklYfSR7SlNPTi5zdHJpbmdpZnkodmFsdWUpfWAgOiB2YWx1ZTtcblxuICAgIHJldHVybiB0aGlzLl9nZXREZWZhdWx0VmFsdWUoa2V5KSA9PT0gbm9ybWFsaXplZFZhbHVlO1xuICB9XG5cbiAgcHJpdmF0ZSBfc2V0dXBGb3JtR3JvdXAoKSB7XG4gICAgY29uc3QgZ3JvdXAgPSBuZXcgRm9ybUdyb3VwKHt9IGFzIFF1ZXJ5Rm9ybUdyb3VwQ29udHJvbHM8VD4pIGFzIHVua25vd24gYXMgUXVlcnlGb3JtR3JvdXA7XG5cbiAgICBmb3IgKGNvbnN0IFtrZXksIGZpZWxkXSBvZiBPYmplY3QuZW50cmllcyh0aGlzLl9maWVsZHMpKSB7XG4gICAgICBncm91cC5hZGRDb250cm9sKGtleSwgZmllbGQuY29udHJvbCk7XG4gICAgfVxuXG4gICAgZ3JvdXAuX3BhdGNoVmFsdWUgPSBncm91cC5wYXRjaFZhbHVlO1xuICAgIGdyb3VwLl9zZXRWYWx1ZSA9IGdyb3VwLnNldFZhbHVlO1xuXG4gICAgZ3JvdXAucGF0Y2hWYWx1ZSA9IHRoaXMucGF0Y2hWYWx1ZS5iaW5kKHRoaXMpO1xuICAgIGdyb3VwLnNldFZhbHVlID0gdGhpcy5zZXRWYWx1ZS5iaW5kKHRoaXMpO1xuXG4gICAgcmV0dXJuIGdyb3VwIGFzIHVua25vd24gYXMgRm9ybUdyb3VwPFF1ZXJ5Rm9ybUdyb3VwQ29udHJvbHM8VD4+O1xuICB9XG5cbiAgcHJpdmF0ZSBfZXh0cmFjdERlZmF1bHRWYWx1ZXMoKSB7XG4gICAgY29uc3QgZGVmYXVsdFZhbHVlczogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGZvciAoY29uc3QgW2tleSwgZmllbGRdIG9mIE9iamVjdC5lbnRyaWVzKHRoaXMuX2ZpZWxkcykpIHtcbiAgICAgIGNvbnN0IHZhbHVlID0gZmllbGQuY29udHJvbC52YWx1ZTtcblxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZXNba2V5XSA9IGAke0VUX0FSUl9QUkVGSVh9JHtKU09OLnN0cmluZ2lmeSh2YWx1ZSl9YDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlZmF1bHRWYWx1ZXNba2V5XSA9IHZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBkZWZhdWx0VmFsdWVzO1xuICB9XG5cbiAgcHJpdmF0ZSBfc3luY1ZpYVVybFF1ZXJ5UGFyYW1zKHZhbHVlczogUXVlcnlGb3JtVmFsdWU8VD4sIHJlcGxhY2VVcmw/OiBib29sZWFuKSB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXMgPSB7IC4uLmNsb25lKHRoaXMuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zKSB9O1xuXG4gICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXModmFsdWVzKSkge1xuICAgICAgY29uc3QgcXVlcnlQYXJhbUtleSA9IHRoaXMuX3RyYW5zZm9ybUtleVRvUXVlcnlQYXJhbShrZXkpO1xuICAgICAgY29uc3QgZmllbGQgPSB0aGlzLl9maWVsZHNba2V5XTtcblxuICAgICAgaWYgKCFmaWVsZCkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKHRoaXMuX2lzRGVmYXVsdFZhbHVlKGtleSwgdmFsdWUpIHx8IGZpZWxkLmRhdGEuYXBwZW5kVG9VcmwgPT09IGZhbHNlKSB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zW3F1ZXJ5UGFyYW1LZXldID0gdW5kZWZpbmVkO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcXVlcnlQYXJhbXNbcXVlcnlQYXJhbUtleV0gPSBmaWVsZC5kYXRhLnZhbHVlVG9RdWVyeVBhcmFtVHJhbnNmb3JtRm5cbiAgICAgICAgICA/IGZpZWxkLmRhdGEudmFsdWVUb1F1ZXJ5UGFyYW1UcmFuc2Zvcm1Gbj8uKHZhbHVlKVxuICAgICAgICAgIDogdmFsdWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5fem9uZS5ydW4oKCkgPT4ge1xuICAgICAgdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7XG4gICAgICAgIHF1ZXJ5UGFyYW1zLFxuICAgICAgICByZXBsYWNlVXJsLFxuICAgICAgICBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLFxuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIF9oYW5kbGVGb3JtQ2hhbmdlKGZvcmNlT3ZlcndyaXRlID0gZmFsc2UpIHtcbiAgICBjb25zdCBjdXJyZW50VmFsID0gY2xvbmUodGhpcy5fY3VycmVudEZvcm1WYWx1ZSQudmFsdWUpO1xuICAgIGNvbnN0IG5ld1ZhbCA9IGNsb25lKHRoaXMuX2Zvcm1WYWx1ZSk7XG5cbiAgICBpZiAoZXF1YWwoY3VycmVudFZhbCwgbmV3VmFsKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGlmIChmb3JjZU92ZXJ3cml0ZSkge1xuICAgICAgdGhpcy5fbGFzdEZvcm1WYWx1ZSQubmV4dChuZXdWYWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLl9sYXN0Rm9ybVZhbHVlJC5uZXh0KGN1cnJlbnRWYWwpO1xuICAgIH1cblxuICAgIHRoaXMuX2N1cnJlbnRGb3JtVmFsdWUkLm5leHQobmV3VmFsKTtcbiAgfVxufVxuIl19
|
|
@@ -1940,10 +1940,10 @@ class QueryDirective {
|
|
|
1940
1940
|
this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);
|
|
1941
1941
|
}
|
|
1942
1942
|
}
|
|
1943
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
1944
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.
|
|
1943
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
1944
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: QueryDirective, isStandalone: true, selector: "[etQuery]", inputs: { query: ["etQuery", "query"], cache: ["etQueryCache", "cache"] }, ngImport: i0 }); }
|
|
1945
1945
|
}
|
|
1946
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
1946
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryDirective, decorators: [{
|
|
1947
1947
|
type: Directive,
|
|
1948
1948
|
args: [{
|
|
1949
1949
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -1989,8 +1989,9 @@ class InfinityQuery {
|
|
|
1989
1989
|
get currentQuery$() {
|
|
1990
1990
|
return this._lastQuery$;
|
|
1991
1991
|
}
|
|
1992
|
-
constructor(_config) {
|
|
1992
|
+
constructor(_config, _destroy$) {
|
|
1993
1993
|
this._config = _config;
|
|
1994
|
+
this._destroy$ = _destroy$;
|
|
1994
1995
|
this._queries$ = new BehaviorSubject([]);
|
|
1995
1996
|
this._currentPage$ = new BehaviorSubject(null);
|
|
1996
1997
|
this._currentCalculatedPage$ = new BehaviorSubject(null);
|
|
@@ -2057,6 +2058,9 @@ class InfinityQuery {
|
|
|
2057
2058
|
}
|
|
2058
2059
|
const args = this._prepareArgs(this._config, calculatedPage);
|
|
2059
2060
|
const query = this._config.queryCreator.prepare(args).execute();
|
|
2061
|
+
if (this._config.pollingInterval) {
|
|
2062
|
+
query.poll({ interval: this._config.pollingInterval, takeUntil: this._destroy$ });
|
|
2063
|
+
}
|
|
2060
2064
|
this._queries$.next([...this._queries$.value, query]);
|
|
2061
2065
|
this._currentPage$.next(newPage);
|
|
2062
2066
|
this._currentCalculatedPage$.next(calculatedPage);
|
|
@@ -2149,9 +2153,6 @@ class InfinityQueryDirective {
|
|
|
2149
2153
|
get data$() {
|
|
2150
2154
|
return this._data$.asObservable();
|
|
2151
2155
|
}
|
|
2152
|
-
get data() {
|
|
2153
|
-
return this._data$.getValue();
|
|
2154
|
-
}
|
|
2155
2156
|
static ngTemplateContextGuard(dir, ctx) {
|
|
2156
2157
|
return true;
|
|
2157
2158
|
}
|
|
@@ -2178,10 +2179,11 @@ class InfinityQueryDirective {
|
|
|
2178
2179
|
this._errorHandler = inject(ErrorHandler);
|
|
2179
2180
|
this._delayable = inject(DelayableDirective, { host: true });
|
|
2180
2181
|
this._data$ = new BehaviorSubject([]);
|
|
2182
|
+
this.data = toSignal(this._data$, { requireSync: true });
|
|
2181
2183
|
this._viewContainerRef.createEmbeddedView(this._mainTemplateRef, this._viewContext);
|
|
2182
2184
|
}
|
|
2183
2185
|
_setupInfinityQuery(config) {
|
|
2184
|
-
const instance = new InfinityQuery(config);
|
|
2186
|
+
const instance = new InfinityQuery(config, this._destroy$);
|
|
2185
2187
|
combineLatest([
|
|
2186
2188
|
instance.currentQuery$.pipe(switchQueryState(), withLatestFrom(instance.currentQuery$)),
|
|
2187
2189
|
this._delayable.isDelayed$,
|
|
@@ -2251,10 +2253,10 @@ class InfinityQueryDirective {
|
|
|
2251
2253
|
this._viewContext.currentQuery = null;
|
|
2252
2254
|
this._data$.next([]);
|
|
2253
2255
|
}
|
|
2254
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
2255
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.
|
|
2256
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: InfinityQueryDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2257
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: InfinityQueryDirective, isStandalone: true, selector: "[etInfinityQuery]", inputs: { infinityQuery: ["etInfinityQuery", "infinityQuery"] }, providers: [{ provide: INFINITY_QUERY_TOKEN, useExisting: InfinityQueryDirective }], exportAs: ["etInfinityQuery"], hostDirectives: [{ directive: i1.DelayableDirective }], ngImport: i0 }); }
|
|
2256
2258
|
}
|
|
2257
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
2259
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: InfinityQueryDirective, decorators: [{
|
|
2258
2260
|
type: Directive,
|
|
2259
2261
|
args: [{
|
|
2260
2262
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -2307,10 +2309,10 @@ class InfinityQueryTriggerDirective {
|
|
|
2307
2309
|
});
|
|
2308
2310
|
this._observer.observe(this._elementRef.nativeElement);
|
|
2309
2311
|
}
|
|
2310
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
2311
|
-
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.
|
|
2312
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: InfinityQueryTriggerDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
|
|
2313
|
+
static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.6", type: InfinityQueryTriggerDirective, isStandalone: true, selector: "[etInfinityQueryTrigger], et-infinity-query-trigger", inputs: { scrollContainerSelector: "scrollContainerSelector" }, ngImport: i0 }); }
|
|
2312
2314
|
}
|
|
2313
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
2315
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: InfinityQueryTriggerDirective, decorators: [{
|
|
2314
2316
|
type: Directive,
|
|
2315
2317
|
args: [{
|
|
2316
2318
|
// eslint-disable-next-line @angular-eslint/directive-selector
|
|
@@ -2335,10 +2337,10 @@ class QueryShortNamePipe {
|
|
|
2335
2337
|
}
|
|
2336
2338
|
return route;
|
|
2337
2339
|
}
|
|
2338
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
2339
|
-
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.
|
|
2340
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryShortNamePipe, deps: [], target: i0.ɵɵFactoryTarget.Pipe }); }
|
|
2341
|
+
static { this.ɵpipe = i0.ɵɵngDeclarePipe({ minVersion: "14.0.0", version: "17.3.6", ngImport: i0, type: QueryShortNamePipe, isStandalone: true, name: "queryShortName" }); }
|
|
2340
2342
|
}
|
|
2341
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
2343
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryShortNamePipe, decorators: [{
|
|
2342
2344
|
type: Pipe,
|
|
2343
2345
|
args: [{ name: 'queryShortName', standalone: true }]
|
|
2344
2346
|
}] });
|
|
@@ -2629,10 +2631,10 @@ class QueryDevtoolsComponent {
|
|
|
2629
2631
|
clearQueryHistory() {
|
|
2630
2632
|
this.queryHistory$.next([]);
|
|
2631
2633
|
}
|
|
2632
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.
|
|
2633
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.3", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Open Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}.et-query-devtools-open-btn{position:fixed;inset-inline-start:0;inset-block-start:0;z-index:9999;all:unset;font-family:monospace}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid #3c424a;padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid #3c424a;margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid #3c424a;list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid #3c424a;background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;gap:2px}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid #3c424a;margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
2634
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryDevtoolsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2635
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.6", type: QueryDevtoolsComponent, isStandalone: true, selector: "et-query-devtools", host: { classAttribute: "et-query-devtools" }, ngImport: i0, template: "@if (!isOpen()) {\n <button (click)=\"toggleOpen()\" class=\"et-query-devtools-open-btn et-qd-chip\">Open Devtools</button>\n}\n\n@if (isOpen()) {\n <div\n [class.et-query-devtools-container--transparent]=\"isTranslucent()\"\n class=\"et-query-devtools-container et-query-devtools-container--snap-{{ snapLayout() }}\"\n >\n <header class=\"et-qd-header\">\n <h3 class=\"et-qd-header__title\">Query Devtools</h3>\n\n <div class=\"et-qd-header__select\">\n <label for=\"et-query-client-instance\">Client instance</label>\n <select [formControl]=\"selectedClientIdCtrl\" id=\"et-query-client-instance\">\n @for (clientConfig of queryClientConfigs; track trackByClient(i, clientConfig); let i = $index) {\n <option [value]=\"i\">\n {{ clientConfig.displayName ?? clientConfig.client.config.baseRoute }}\n </option>\n }\n </select>\n </div>\n\n <button (click)=\"toggleOpen()\" class=\"et-qd-btn et-qd-btn-secondary\">Close</button>\n </header>\n\n <div class=\"et-qd-sub-header\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !isTranslucent() }\"\n (click)=\"toggleTranslucent()\"\n class=\"et-qd-chip et-qd-translucent-clickable\"\n >\n Translucent\n </button>\n <div class=\"et-qd-sub-header__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'full' }\"\n (click)=\"selectSnapLayout('full')\"\n class=\"et-qd-chip\"\n >\n Fullscreen\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'top' }\"\n (click)=\"selectSnapLayout('top')\"\n class=\"et-qd-chip\"\n >\n Top\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'bottom' }\"\n (click)=\"selectSnapLayout('bottom')\"\n class=\"et-qd-chip\"\n >\n Bottom\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'left' }\"\n (click)=\"selectSnapLayout('left')\"\n class=\"et-qd-chip\"\n >\n Left\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': snapLayout() !== 'right' }\"\n (click)=\"selectSnapLayout('right')\"\n class=\"et-qd-chip\"\n >\n Right\n </button>\n </div>\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-client\">\n <p class=\"et-qd-client__title\">{{ cfg.displayName ?? cfg.client.config.baseRoute }}</p>\n\n <div class=\"et-qd-client__actions\">\n <button (click)=\"cfg.client._store.refreshQueriesInUse()\" class=\"et-qd-chip\">Refresh all</button>\n <button (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true })\" class=\"et-qd-chip\">\n Refresh all (ignore caches)\n </button>\n <button\n (click)=\"cfg.client._store.refreshQueriesInUse({ ignoreCacheValidity: true, purgeUnused: true })\"\n class=\"et-qd-chip\"\n >\n Refresh all (ignore caches & purge unused)\n </button>\n </div>\n </div>\n }\n\n @if (selectedClientConfig(); as cfg) {\n <div class=\"et-qd-queries\">\n <p class=\"et-qd-queries__title\">Inspector</p>\n <div class=\"et-qd-queries__actions\">\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'live' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('live'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Live Queries ({{ queries()?.length ?? 0 }})\n </button>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': queryListMode() !== 'history' || viewMode() !== 'query' }\"\n (click)=\"selectQueryListMode('history'); selectViewMode('query')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Query History ({{ (queryHistory$ | async)?.length ?? 0 }}/50)\n </button>\n @if (queryListMode() === 'history' && viewMode() === 'query') {\n <div class=\"et-qd-queries__divider\"></div>\n <button (click)=\"clearQueryHistory()\" class=\"et-qd-chip et-qd-chip-bordered\">Clear history</button>\n }\n\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': viewMode() !== 'authProvider' }\"\n (click)=\"selectViewMode('authProvider')\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Auth Provider\n </button>\n </div>\n\n @if (viewMode() === 'query') {\n <div class=\"et-qd-queries__browser\">\n @if (queryListMode() === 'live') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queries(); track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n @if (queryListMode() === 'history') {\n <ul class=\"et-qd-queries__browser-list\">\n @for (query of queryHistory$ | async; track trackByQuery($index, query)) {\n <li>\n <button\n [class.et-qd-query--active]=\"selectedQuery()?._id === query._id\"\n (click)=\"selectQuery(query)\"\n >\n <span> {{ query._queryConfig.method }}</span>\n <span> {{ query | queryShortName }}</span>\n </button>\n </li>\n }\n </ul>\n }\n <div class=\"et-qd-queries__browser-detail\">\n @if (selectedQuery(); as query) {\n <p class=\"et-qd-queries__browser-detail__title\">\n {{ query._queryConfig.method }} {{ query._routeWithParams }}\n </p>\n\n <div class=\"et-qd-queries__actions\">\n <button (click)=\"query.execute()\" class=\"et-qd-chip et-qd-chip-bordered\">Execute</button>\n <button (click)=\"query.execute({ skipCache: true })\" class=\"et-qd-chip et-qd-chip-bordered\">\n Execute (ignore cache)\n </button>\n\n <button (click)=\"query.abort()\" class=\"et-qd-chip et-qd-chip-bordered\">Abort</button>\n <div class=\"et-qd-queries__divider\"></div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !query.isPolling }\"\n (click)=\"query.poll({ interval: 5000, takeUntil: _destroy$ })\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Poll\n </button>\n\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': query.isPolling }\"\n (click)=\"query.stopPolling()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Stop polling\n </button>\n @if (query.isPolling || query._isPollingPaused) {\n <button (click)=\"query.pausePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Pause polling\n </button>\n <button (click)=\"query.resumePolling()\" class=\"et-qd-chip et-qd-chip-secondary et-qd-chip-bordered\">\n Resume polling\n </button>\n }\n </div>\n\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>State type</p>\n <pre>{{ query.rawState.type }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Dependents</p>\n <pre>{{ query._dependents | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is expired</p>\n <pre>{{ query.isExpired }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is in use</p>\n <pre>{{ query.isInUse }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Subscriber count</p>\n <pre>{{ query._subscriberCount }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling</p>\n <pre>{{ query.isPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Is polling paused</p>\n <pre>{{ query._isPollingPaused }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Enable smart polling</p>\n <pre>{{ query._enableSmartPolling }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query store key</p>\n <pre>{{ query._queryStoreKey }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Arguments</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showArguments() }\"\n (click)=\"toggleShowArguments()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showArguments()) {\n <pre>{{ query._arguments | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <p><i> Warning, this will cause a subscription if shown!</i></p>\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showResponse() }\"\n (click)=\"toggleShowResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showResponse()) {\n <pre>{{ query.state$ | async | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Raw state</p>\n <p><i> The query state unaffected by entity stores</i></p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showRawResponse() }\"\n (click)=\"toggleShowRawResponse()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showRawResponse()) {\n <pre>{{ query.rawState | json }}</pre>\n }\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Query config</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showQueryConfig() }\"\n (click)=\"toggleShowQueryConfig()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showQueryConfig()) {\n <pre>{{ stringifiedQueryConfig() | json }}</pre>\n }\n </div>\n\n @if (!!query._queryConfig.entity) {\n <div class=\"et-qd-list-item\">\n <p>Entity store value</p>\n\n <div>\n <button\n [ngClass]=\"{ 'et-qd-chip-secondary': !showEntityStoreValue() }\"\n (click)=\"toggleShowEntityStoreValue()\"\n class=\"et-qd-chip et-qd-chip-bordered\"\n >\n Toggle\n </button>\n </div>\n @if (showEntityStoreValue()) {\n <pre>{{ selectedQueryEntityStoreValue$ | async | json }}</pre>\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n } @else if (viewMode() === 'authProvider') {\n <div class=\"et-qd-auth-provider__viewer\">\n @if (authProviderDetails(); as details) {\n <div class=\"et-qd-list\">\n <div class=\"et-qd-list-item\">\n <p>Type</p>\n <pre>{{ details.type }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Header value</p>\n <pre>{{ details.header() | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Config</p>\n <pre>{{ details.config | json }}</pre>\n </div>\n\n @if (details.type === 'BearerAuthProvider') {\n <div class=\"et-qd-list-item\">\n <p>Tokens</p>\n <pre>{{ details.provider.tokens$ | async | json }}</pre>\n </div>\n\n <div class=\"et-qd-list-item\">\n <p>Should refresh on unauthorized response</p>\n <pre>{{ details.provider.shouldRefreshOnUnauthorizedResponse }}</pre>\n </div>\n\n <ng-container\n *etQuery=\"\n details.provider.currentRefreshQuery$ | async as response;\n loading as loading;\n error as error;\n query as query\n \"\n >\n <div class=\"et-qd-list-item\">\n <p>Refresh query response</p>\n\n <div>\n <button (click)=\"details.provider._refreshQuery()\" class=\"et-qd-chip et-qd-chip-bordered\">\n Refresh\n </button>\n </div>\n <pre>{{ response | json }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query loading</p>\n <pre>{{ loading }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>Refresh query error</p>\n <pre>{{ error ?? 'null' }}</pre>\n </div>\n <div class=\"et-qd-list-item\">\n <p>State</p>\n <pre>{{ query?.state$ | async | json }}</pre>\n </div>\n </ng-container>\n }\n </div>\n } @else {\n <p>No auth provider set</p>\n }\n </div>\n }\n </div>\n }\n </div>\n}\n", styles: [":host{position:fixed;top:0;z-index:1000000;font-size:14px;color:#fff}.et-query-devtools-container{position:fixed;inset:0;background-color:#25292e;z-index:10000;overflow:auto;font-family:monospace;display:grid;grid-template-rows:auto auto auto minmax(0,1fr)}.et-query-devtools-container.et-query-devtools-container--transparent{opacity:.25;pointer-events:none}.et-query-devtools-container.et-query-devtools-container--transparent .et-query-devtools-translucent-btn{pointer-events:all}.et-query-devtools-container.et-query-devtools-container--snap-left{inset-inline-start:0;inset-block-start:0;inset-block-end:0;width:50%;border-right:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-right{inset-inline-start:unset;inset-inline-end:0;inset-block-start:0;inset-block-end:0;width:50%;border-left:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-top{inset-inline-start:0;inset-block-start:0;inset-inline-end:0;height:50%;border-bottom:1px solid rgb(37,41,46)}.et-query-devtools-container.et-query-devtools-container--snap-bottom{inset-inline-start:0;inset-block-start:unset;inset-block-end:0;inset-inline-end:0;height:50%;border-top:1px solid rgb(37,41,46)}.et-query-devtools-open-btn{position:fixed;inset-inline-start:0;inset-block-start:0;z-index:9999;all:unset;font-family:monospace}.et-qd-header{background-color:#00ffa1;padding:12px;display:grid;grid-template-columns:1fr auto auto;gap:12px;align-items:center}.et-qd-header__title{color:#25292e;margin:0;font-size:22px}.et-qd-header__select{display:grid;background-color:#25292e;border-radius:10px;overflow:hidden}.et-qd-header__select select{width:250px;color:#fff;padding:3px 10px 2px;border:none;background-color:#25292e;font-family:monospace}.et-qd-header__select label{padding:3px 10px;color:#25292e;font-size:12px;font-weight:700;color:#fff;border-bottom:1px solid gray}.et-qd-sub-header{background-color:#00b371;padding:12px;display:flex;gap:12px;flex-wrap:wrap}.et-qd-sub-header__divider{width:1px;background-color:#25292e}.et-qd-btn{background-color:#00ffa1;color:#25292e;border:none;padding:12px;cursor:pointer;font-size:14px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;width:100%;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-btn:hover{background-color:#00cc81}.et-qd-btn.et-qd-btn-secondary{background-color:#25292e;color:#00ffa1}.et-qd-btn.et-qd-btn-secondary:hover{background-color:#3c424a}.et-qd-chip{background-color:#00ffa1;color:#25292e;border:none;padding:4px 9px;cursor:pointer;font-size:12px;font-weight:700;text-align:center;text-decoration:none;display:inline-block;transition:all .3s ease-in-out;font-family:monospace;border-radius:10px}.et-qd-chip:hover{background-color:#00cc81}.et-qd-chip.et-qd-chip-secondary{background-color:#25292e;color:#00ffa1}.et-qd-chip.et-qd-chip-secondary:hover{background-color:#3c424a}.et-qd-chip.et-qd-chip-bordered{border:1px solid rgb(0,255,161)}.et-qd-translucent-clickable{pointer-events:all}.et-qd-client{border-bottom:1px solid #3c424a;padding:12px}.et-qd-client__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-client__actions{display:flex;gap:12px;margin-top:12px}.et-qd-queries{padding:12px;display:grid;grid-template-rows:auto auto minmax(0,1fr)}.et-qd-queries__actions{display:flex;gap:12px;margin-top:12px;margin-bottom:16px}.et-qd-queries__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-queries__divider{width:1px;background-color:#3c424a}.et-qd-queries__browser{display:grid;grid-template-columns:1fr minmax(0,3fr);margin-left:-12px;margin-right:-12px;border-top:1px solid #3c424a;margin-bottom:-12px}.et-qd-queries__browser-list{border-right:1px solid #3c424a;list-style:none;padding:0;margin:0;display:grid;grid-auto-flow:row;grid-auto-rows:55px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-list li{margin:0}.et-qd-queries__browser-list li button{all:unset;font-family:monospace;box-sizing:border-box;width:100%;border:none;border-bottom:1px solid #3c424a;background-color:#25292e;color:#fff;text-align:left;padding:12px;height:100%;transition:all .3s ease-in-out;cursor:pointer;display:grid;gap:2px}.et-qd-queries__browser-list li button span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.et-qd-queries__browser-list li button span:first-of-type{font-weight:700}.et-qd-queries__browser-list li button:hover,.et-qd-queries__browser-list li button.et-qd-query--active{background-color:#30363c}.et-qd-queries__browser-detail{padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-queries__browser-detail__title{margin:0;font-size:14px;color:#fff;font-weight:700}.et-qd-auth-provider__viewer{border-top:1px solid #3c424a;margin-left:-12px;margin-right:-12px;margin-bottom:-12px;padding:12px;overflow-y:auto;overflow-x:hidden}.et-qd-list{display:grid;gap:12px}.et-qd-list-item{display:grid}.et-qd-list-item p{font-weight:700;margin:0;padding-bottom:8px}.et-qd-list-item p+p{margin-top:-8px}.et-qd-list-item div+pre{margin-top:8px}.et-qd-list-item pre{margin:0;padding:4px;background-color:#0e1012;border-radius:4px;max-height:450px;overflow:auto}\n"], dependencies: [{ kind: "pipe", type: AsyncPipe, name: "async" }, { kind: "pipe", type: JsonPipe, name: "json" }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1$1.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$1.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.FormControlDirective, selector: "[formControl]", inputs: ["formControl", "disabled", "ngModel"], outputs: ["ngModelChange"], exportAs: ["ngForm"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "pipe", type: QueryShortNamePipe, name: "queryShortName" }, { kind: "directive", type: QueryDirective, selector: "[etQuery]", inputs: ["etQuery", "etQueryCache"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.ShadowDom }); }
|
|
2634
2636
|
}
|
|
2635
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.
|
|
2637
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.6", ngImport: i0, type: QueryDevtoolsComponent, decorators: [{
|
|
2636
2638
|
type: Component,
|
|
2637
2639
|
args: [{ selector: 'et-query-devtools', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.ShadowDom, host: {
|
|
2638
2640
|
class: 'et-query-devtools',
|
|
@@ -3154,7 +3156,12 @@ class QueryForm {
|
|
|
3154
3156
|
return val ?? null;
|
|
3155
3157
|
}
|
|
3156
3158
|
_transformKeyToQueryParam(key) {
|
|
3157
|
-
|
|
3159
|
+
if (!this._options?.queryParamPrefix)
|
|
3160
|
+
return key;
|
|
3161
|
+
const prefix = typeof this._options?.queryParamPrefix === 'string'
|
|
3162
|
+
? this._options.queryParamPrefix
|
|
3163
|
+
: this._options.queryParamPrefix();
|
|
3164
|
+
return `${prefix}-${key}`;
|
|
3158
3165
|
}
|
|
3159
3166
|
_isDefaultValue(key, value) {
|
|
3160
3167
|
const normalizedValue = Array.isArray(value) ? `${ET_ARR_PREFIX}${JSON.stringify(value)}` : value;
|