@dereekb/dbx-firebase 12.5.9 → 12.6.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.
Files changed (24) hide show
  1. package/esm2022/lib/development/development.widget.service.mjs +1 -1
  2. package/esm2022/lib/modules/storagefile/container/index.mjs +2 -1
  3. package/esm2022/lib/modules/storagefile/container/storagefile.download.button.component.mjs +244 -0
  4. package/esm2022/lib/modules/storagefile/index.mjs +3 -1
  5. package/esm2022/lib/modules/storagefile/service/index.mjs +3 -0
  6. package/esm2022/lib/modules/storagefile/service/storagefile.download.service.mjs +158 -0
  7. package/esm2022/lib/modules/storagefile/service/storagefile.download.storage.service.mjs +91 -0
  8. package/esm2022/lib/modules/storagefile/storagefile.providers.mjs +33 -0
  9. package/esm2022/lib/modules/storagefile/store/storagefile.document.store.mjs +3 -2
  10. package/esm2022/lib/providers.mjs +6 -2
  11. package/fesm2022/dereekb-dbx-firebase.mjs +512 -8
  12. package/fesm2022/dereekb-dbx-firebase.mjs.map +1 -1
  13. package/lib/development/development.widget.service.d.ts +1 -1
  14. package/lib/modules/storagefile/container/index.d.ts +1 -0
  15. package/lib/modules/storagefile/container/storagefile.download.button.component.d.ts +133 -0
  16. package/lib/modules/storagefile/index.d.ts +2 -0
  17. package/lib/modules/storagefile/service/index.d.ts +2 -0
  18. package/lib/modules/storagefile/service/storagefile.download.service.d.ts +79 -0
  19. package/lib/modules/storagefile/service/storagefile.download.storage.service.d.ts +56 -0
  20. package/lib/modules/storagefile/storagefile.providers.d.ts +13 -0
  21. package/lib/modules/storagefile/storagefile.upload.module.d.ts +1 -1
  22. package/lib/modules/storagefile/store/storagefile.document.store.d.ts +1 -0
  23. package/lib/providers.d.ts +4 -0
  24. package/package.json +1 -1
@@ -53,4 +53,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImpo
53
53
  type: Inject,
54
54
  args: [DEFAULT_FIREBASE_DEVELOPMENT_WIDGET_PROVIDERS_TOKEN]
55
55
  }] }] });
56
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2ZWxvcG1lbnQud2lkZ2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9kZXZlbG9wbWVudC9kZXZlbG9wbWVudC53aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHbkU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtREFBbUQsR0FBRyxJQUFJLGNBQWMsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0FBRXBJOzs7O0dBSUc7QUFFSCxNQUFNLE9BQU8sbUNBQW1DO0lBQ3JDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0lBRXBDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBb0QsQ0FBQztJQUV4RixZQUFxRixjQUFtRDtRQUN0SSxJQUFJLGNBQWMsRUFBRSxDQUFDO1lBQ25CLGNBQWMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDekQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILFFBQVEsQ0FBQyxRQUEyQyxFQUFFLFdBQW9CLElBQUk7UUFDNUUsTUFBTSxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFFbEMsSUFBSSxRQUFRLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDO1lBQ3pDLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDMUQsT0FBTyxJQUFJLENBQUM7UUFDZCxDQUFDO2FBQU0sQ0FBQztZQUNOLE9BQU8sS0FBSyxDQUFDO1FBQ2YsQ0FBQztJQUNILENBQUM7SUFFRCx5QkFBeUI7UUFDdkIsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sZUFBZSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNqRCxDQUFDO3dHQW5DVSxtQ0FBbUMsa0JBS2QsbURBQW1EOzRHQUx4RSxtQ0FBbUM7OzRGQUFuQyxtQ0FBbUM7a0JBRC9DLFVBQVU7OzBCQU1JLFFBQVE7OzBCQUFJLE1BQU07MkJBQUMsbURBQW1EIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaXRlcmFibGVUb0FycmF5IH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBJbmplY3QsIEluamVjdGFibGUsIEluamVjdGlvblRva2VuLCBPcHRpb25hbCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhXaWRnZXRTZXJ2aWNlLCBEYnhXaWRnZXRUeXBlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LXdlYic7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnkgfSBmcm9tICcuL2RldmVsb3BtZW50LndpZGdldCc7XG5cbi8qKlxuICogRGVmYXVsdCBwcm92aWRlcnMgdG8gaW5qZWN0LlxuICovXG5leHBvcnQgY29uc3QgREVGQVVMVF9GSVJFQkFTRV9ERVZFTE9QTUVOVF9XSURHRVRfUFJPVklERVJTX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdEZWZhdWx0RGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldEVudHJpZXMnKTtcblxuLyoqXG4gKiBTZXJ2aWNlIHVzZWQgZm9yIHJlZ2lzdGVyaW5nIHdpZGdldHMgdXNlZCBmb3IgZGV2ZWxvcG1lbnQuXG4gKlxuICogRGVmYXVsdCBwcm92aWRlcnMgY2FuIGJlIGNvbmZpZ3VyZWQgYnkgdGhlIERFRkFVTFRfRklSRUJBU0VfQVVUSF9MT0dJTl9QUk9WSURFUlNfVE9LRU4gaW5qZWN0YWJsZSB2YWx1ZS5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRTZXJ2aWNlIHtcbiAgcmVhZG9ubHkgZGJ4V2lkZ2V0U2VydmljZSA9IGluamVjdChEYnhXaWRnZXRTZXJ2aWNlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IF9lbnRyaWVzID0gbmV3IE1hcDxEYnhXaWRnZXRUeXBlLCBEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnk+KCk7XG5cbiAgY29uc3RydWN0b3IoQE9wdGlvbmFsKCkgQEluamVjdChERUZBVUxUX0ZJUkVCQVNFX0RFVkVMT1BNRU5UX1dJREdFVF9QUk9WSURFUlNfVE9LRU4pIGRlZmF1bHRFbnRyaWVzOiBEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnlbXSkge1xuICAgIGlmIChkZWZhdWx0RW50cmllcykge1xuICAgICAgZGVmYXVsdEVudHJpZXMuZm9yRWFjaCgoeCkgPT4gdGhpcy5yZWdpc3Rlcih4LCBmYWxzZSkpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVc2VkIHRvIHJlZ2lzdGVyIGEgcHJvdmlkZXIuIElmIGEgcHJvdmlkZXIgaXMgYWxyZWFkeSByZWdpc3RlcmVkLCB0aGlzIHdpbGwgb3ZlcnJpZGUgaXQgYnkgZGVmYXVsdC5cbiAgICpcbiAgICogQHBhcmFtIHByb3ZpZGVyXG4gICAqIEBwYXJhbSBvdmVycmlkZVxuICAgKi9cbiAgcmVnaXN0ZXIocHJvdmlkZXI6IERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeSwgb3ZlcnJpZGU6IGJvb2xlYW4gPSB0cnVlKTogYm9vbGVhbiB7XG4gICAgY29uc3QgdHlwZSA9IHByb3ZpZGVyLndpZGdldC50eXBlO1xuXG4gICAgaWYgKG92ZXJyaWRlIHx8ICF0aGlzLl9lbnRyaWVzLmhhcyh0eXBlKSkge1xuICAgICAgdGhpcy5fZW50cmllcy5zZXQodHlwZSwgcHJvdmlkZXIpO1xuICAgICAgdGhpcy5kYnhXaWRnZXRTZXJ2aWNlLnJlZ2lzdGVyKHByb3ZpZGVyLndpZGdldCwgb3ZlcnJpZGUpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICBnZXRFbnRyeVdpZGdldElkZW50aWZpZXJzKCk6IERieFdpZGdldFR5cGVbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fZW50cmllcy5rZXlzKCkpO1xuICB9XG5cbiAgZ2V0RW50cmllcygpOiBEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnlbXSB7XG4gICAgcmV0dXJuIGl0ZXJhYmxlVG9BcnJheSh0aGlzLl9lbnRyaWVzLnZhbHVlcygpKTtcbiAgfVxufVxuIl19
56
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2ZWxvcG1lbnQud2lkZ2V0LnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9kZXZlbG9wbWVudC9kZXZlbG9wbWVudC53aWRnZXQuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JGLE9BQU8sRUFBRSxnQkFBZ0IsRUFBaUIsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHbkU7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtREFBbUQsR0FBRyxJQUFJLGNBQWMsQ0FBc0MsNENBQTRDLENBQUMsQ0FBQztBQUV6Szs7OztHQUlHO0FBRUgsTUFBTSxPQUFPLG1DQUFtQztJQUNyQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUVwQyxRQUFRLEdBQUcsSUFBSSxHQUFHLEVBQW9ELENBQUM7SUFFeEYsWUFBcUYsY0FBbUQ7UUFDdEksSUFBSSxjQUFjLEVBQUUsQ0FBQztZQUNuQixjQUFjLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDO1FBQ3pELENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxRQUFRLENBQUMsUUFBMkMsRUFBRSxXQUFvQixJQUFJO1FBQzVFLE1BQU0sSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDO1FBRWxDLElBQUksUUFBUSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN6QyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDbEMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQzFELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQzthQUFNLENBQUM7WUFDTixPQUFPLEtBQUssQ0FBQztRQUNmLENBQUM7SUFDSCxDQUFDO0lBRUQseUJBQXlCO1FBQ3ZCLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7SUFDMUMsQ0FBQztJQUVELFVBQVU7UUFDUixPQUFPLGVBQWUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDakQsQ0FBQzt3R0FuQ1UsbUNBQW1DLGtCQUtkLG1EQUFtRDs0R0FMeEUsbUNBQW1DOzs0RkFBbkMsbUNBQW1DO2tCQUQvQyxVQUFVOzswQkFNSSxRQUFROzswQkFBSSxNQUFNOzJCQUFDLG1EQUFtRCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGl0ZXJhYmxlVG9BcnJheSB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlLCBJbmplY3Rpb25Ub2tlbiwgT3B0aW9uYWwsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRGJ4V2lkZ2V0U2VydmljZSwgRGJ4V2lkZ2V0VHlwZSB9IGZyb20gJ0BkZXJlZWtiL2RieC13ZWInO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldEVudHJ5IH0gZnJvbSAnLi9kZXZlbG9wbWVudC53aWRnZXQnO1xuXG4vKipcbiAqIERlZmF1bHQgcHJvdmlkZXJzIHRvIGluamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IERFRkFVTFRfRklSRUJBU0VfREVWRUxPUE1FTlRfV0lER0VUX1BST1ZJREVSU19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxEYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cnlbXT4oJ0RlZmF1bHREYnhGaXJlYmFzZURldmVsb3BtZW50V2lkZ2V0RW50cmllcycpO1xuXG4vKipcbiAqIFNlcnZpY2UgdXNlZCBmb3IgcmVnaXN0ZXJpbmcgd2lkZ2V0cyB1c2VkIGZvciBkZXZlbG9wbWVudC5cbiAqXG4gKiBEZWZhdWx0IHByb3ZpZGVycyBjYW4gYmUgY29uZmlndXJlZCBieSB0aGUgREVGQVVMVF9GSVJFQkFTRV9BVVRIX0xPR0lOX1BST1ZJREVSU19UT0tFTiBpbmplY3RhYmxlIHZhbHVlLlxuICovXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldFNlcnZpY2Uge1xuICByZWFkb25seSBkYnhXaWRnZXRTZXJ2aWNlID0gaW5qZWN0KERieFdpZGdldFNlcnZpY2UpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgX2VudHJpZXMgPSBuZXcgTWFwPERieFdpZGdldFR5cGUsIERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeT4oKTtcblxuICBjb25zdHJ1Y3RvcihAT3B0aW9uYWwoKSBASW5qZWN0KERFRkFVTFRfRklSRUJBU0VfREVWRUxPUE1FTlRfV0lER0VUX1BST1ZJREVSU19UT0tFTikgZGVmYXVsdEVudHJpZXM6IERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeVtdKSB7XG4gICAgaWYgKGRlZmF1bHRFbnRyaWVzKSB7XG4gICAgICBkZWZhdWx0RW50cmllcy5mb3JFYWNoKCh4KSA9PiB0aGlzLnJlZ2lzdGVyKHgsIGZhbHNlKSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFVzZWQgdG8gcmVnaXN0ZXIgYSBwcm92aWRlci4gSWYgYSBwcm92aWRlciBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQsIHRoaXMgd2lsbCBvdmVycmlkZSBpdCBieSBkZWZhdWx0LlxuICAgKlxuICAgKiBAcGFyYW0gcHJvdmlkZXJcbiAgICogQHBhcmFtIG92ZXJyaWRlXG4gICAqL1xuICByZWdpc3Rlcihwcm92aWRlcjogRGJ4RmlyZWJhc2VEZXZlbG9wbWVudFdpZGdldEVudHJ5LCBvdmVycmlkZTogYm9vbGVhbiA9IHRydWUpOiBib29sZWFuIHtcbiAgICBjb25zdCB0eXBlID0gcHJvdmlkZXIud2lkZ2V0LnR5cGU7XG5cbiAgICBpZiAob3ZlcnJpZGUgfHwgIXRoaXMuX2VudHJpZXMuaGFzKHR5cGUpKSB7XG4gICAgICB0aGlzLl9lbnRyaWVzLnNldCh0eXBlLCBwcm92aWRlcik7XG4gICAgICB0aGlzLmRieFdpZGdldFNlcnZpY2UucmVnaXN0ZXIocHJvdmlkZXIud2lkZ2V0LCBvdmVycmlkZSk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIGdldEVudHJ5V2lkZ2V0SWRlbnRpZmllcnMoKTogRGJ4V2lkZ2V0VHlwZVtdIHtcbiAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9lbnRyaWVzLmtleXMoKSk7XG4gIH1cblxuICBnZXRFbnRyaWVzKCk6IERieEZpcmViYXNlRGV2ZWxvcG1lbnRXaWRnZXRFbnRyeVtdIHtcbiAgICByZXR1cm4gaXRlcmFibGVUb0FycmF5KHRoaXMuX2VudHJpZXMudmFsdWVzKCkpO1xuICB9XG59XG4iXX0=
@@ -1,7 +1,8 @@
1
+ export * from './storagefile.download.button.component';
1
2
  export * from './storagefile.upload.action.handler.directive';
2
3
  export * from './storagefile.upload.error';
3
4
  export * from './storagefile.upload.handler';
4
5
  export * from './storagefile.upload.initialize.document.directive';
5
6
  export * from './storagefile.upload.store.directive';
6
7
  export * from './storagefile.upload.sync.directive';
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLCtDQUErQyxDQUFDO0FBQzlELGNBQWMsNEJBQTRCLENBQUM7QUFDM0MsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG9EQUFvRCxDQUFDO0FBQ25FLGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyxxQ0FBcUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmFjdGlvbi5oYW5kbGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLnN0b3JlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5zeW5jLmRpcmVjdGl2ZSc7XG4iXX0=
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2NvbnRhaW5lci9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLHlDQUF5QyxDQUFDO0FBQ3hELGNBQWMsK0NBQStDLENBQUM7QUFDOUQsY0FBYyw0QkFBNEIsQ0FBQztBQUMzQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsb0RBQW9ELENBQUM7QUFDbkUsY0FBYyxzQ0FBc0MsQ0FBQztBQUNyRCxjQUFjLHFDQUFxQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5idXR0b24uY29tcG9uZW50JztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmFjdGlvbi5oYW5kbGVyLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5lcnJvcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5oYW5kbGVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLmluaXRpYWxpemUuZG9jdW1lbnQuZGlyZWN0aXZlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLnN0b3JlLmRpcmVjdGl2ZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnVwbG9hZC5zeW5jLmRpcmVjdGl2ZSc7XG4iXX0=
@@ -0,0 +1,244 @@
1
+ import { ChangeDetectionStrategy, Component, computed, effect, inject, input, output, signal } from '@angular/core';
2
+ import { DbxActionDialogDirective, DbxActionModule, DbxActionSnackbarErrorDirective, DbxAnchorComponent, DbxButtonComponent, DbxWebFilePreviewService } from '@dereekb/dbx-web';
3
+ import { dateFromDateOrTimeSecondsNumber, isPast, MS_IN_SECOND } from '@dereekb/util';
4
+ import { DbxFirebaseStorageFileDownloadService } from '../service/storagefile.download.service';
5
+ import { maybeValueFromObservableOrValue } from '@dereekb/rxjs';
6
+ import { toObservable, toSignal } from '@angular/core/rxjs-interop';
7
+ import { combineLatest, distinctUntilChanged, interval, map, of, shareReplay, switchMap } from 'rxjs';
8
+ import { MatDialog } from '@angular/material/dialog';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@dereekb/dbx-core";
11
+ export class DbxFirebaseStorageFileDownloadButton {
12
+ matDialog = inject(MatDialog);
13
+ dbxWebFilePreviewService = inject(DbxWebFilePreviewService);
14
+ dbxFirebaseStorageFileDownloadService = inject(DbxFirebaseStorageFileDownloadService);
15
+ /**
16
+ * The StorageFileKey to set up the download button for.
17
+ */
18
+ storageFileKey = input();
19
+ /**
20
+ * The download URL to use for the download button.
21
+ */
22
+ storageFileDownloadUrl = input();
23
+ /**
24
+ * The MIME type to use the embed component.
25
+ */
26
+ embedMimeType = input();
27
+ /**
28
+ * Whether or not to show a preview button.
29
+ *
30
+ * Defaults to true.
31
+ */
32
+ showPreviewButton = input(true);
33
+ /**
34
+ * Output event emitted when the download URL changes.
35
+ */
36
+ downloadUrlChange = output();
37
+ config = input();
38
+ source = input();
39
+ source$ = toObservable(this.source);
40
+ configSignal = computed(() => {
41
+ const config = this.config();
42
+ const result = {
43
+ buttonStyle: config?.buttonStyle,
44
+ previewButtonStyle: config?.previewButtonStyle,
45
+ icon: config?.icon ?? 'cloud_download',
46
+ text: config?.text ?? 'Start Download',
47
+ downloadReadyIcon: config?.downloadReadyIcon ?? 'download',
48
+ downloadReadyText: config?.downloadReadyText ?? 'Save File',
49
+ previewIcon: config?.previewIcon ?? 'preview',
50
+ previewText: config?.previewText ?? 'View File'
51
+ };
52
+ return result;
53
+ });
54
+ preloadSignal = computed(() => {
55
+ const config = this.configSignal();
56
+ return config.preload ?? false;
57
+ });
58
+ downloadUrlSignal = signal(undefined);
59
+ downloadMimeTypeSignal = signal(undefined);
60
+ downloadUrlExpiresAtSignal = signal(undefined);
61
+ storageFileKeyFromInput$ = toObservable(this.storageFileKey).pipe(distinctUntilChanged(), shareReplay(1));
62
+ storageFileKeyFromSource$ = this.source$.pipe(map((source) => source?.storageFileKey), maybeValueFromObservableOrValue(), distinctUntilChanged(), shareReplay(1));
63
+ storageFileKey$ = combineLatest([this.storageFileKeyFromInput$, this.storageFileKeyFromSource$]).pipe(map(([storageFileKeyFromInput, storageFileKeyFromSource]) => {
64
+ return storageFileKeyFromInput ?? storageFileKeyFromSource;
65
+ }), distinctUntilChanged(), shareReplay(1));
66
+ storageFileKeySignal = toSignal(this.storageFileKey$);
67
+ hasDownloadUrlSignal = computed(() => Boolean(this.downloadUrlSignal()));
68
+ buttonStyleSignal = computed(() => {
69
+ const config = this.configSignal();
70
+ const result = {
71
+ type: 'raised',
72
+ ...config.buttonStyle
73
+ };
74
+ return result;
75
+ });
76
+ previewButtonStyleSignal = computed(() => {
77
+ const config = this.configSignal();
78
+ const result = {
79
+ type: 'raised',
80
+ ...config.previewButtonStyle
81
+ };
82
+ return result;
83
+ });
84
+ iconSignal = computed(() => {
85
+ const config = this.configSignal();
86
+ const hasDownloadUrl = this.hasDownloadUrlSignal();
87
+ return hasDownloadUrl ? (config.downloadReadyIcon ?? config.icon) : config.icon;
88
+ });
89
+ textSignal = computed(() => {
90
+ const config = this.configSignal();
91
+ const hasDownloadUrl = this.hasDownloadUrlSignal();
92
+ return hasDownloadUrl ? (config.downloadReadyText ?? config.text) : config.text;
93
+ });
94
+ previewIconSignal = computed(() => {
95
+ const config = this.configSignal();
96
+ return config.previewIcon;
97
+ });
98
+ previewTextSignal = computed(() => {
99
+ const config = this.configSignal();
100
+ return config.previewText;
101
+ });
102
+ anchorSignal = computed(() => {
103
+ const downloadUrl = this.downloadUrlSignal();
104
+ let result;
105
+ if (downloadUrl) {
106
+ result = {
107
+ url: downloadUrl
108
+ };
109
+ }
110
+ return result;
111
+ });
112
+ storageFileDownloadUrlEffect = effect(() => {
113
+ const downloadUrl = this.storageFileDownloadUrl();
114
+ if (downloadUrl || downloadUrl === null) {
115
+ this.downloadUrlSignal.set(downloadUrl);
116
+ }
117
+ }, {
118
+ allowSignalWrites: true
119
+ });
120
+ // Preview
121
+ showPreviewButtonSignal = computed(() => {
122
+ const config = this.configSignal();
123
+ const hasDownloadUrl = this.hasDownloadUrlSignal();
124
+ return hasDownloadUrl && (config.showPreviewButton ?? true);
125
+ });
126
+ openCustomPreviewSignal = computed(() => {
127
+ const config = this.configSignal();
128
+ return config.openCustomPreview;
129
+ });
130
+ handleOpenPreviewDialog = () => {
131
+ const openPreview = this.openCustomPreviewSignal();
132
+ const srcUrl = this.downloadUrlSignal();
133
+ const inputEmbedMimeType = this.embedMimeType();
134
+ const downloadMimeType = this.downloadMimeTypeSignal();
135
+ const embedMimeType = inputEmbedMimeType ?? downloadMimeType;
136
+ return openPreview?.(srcUrl, embedMimeType) ?? this.dbxWebFilePreviewService.openPreviewDialog(srcUrl, embedMimeType);
137
+ };
138
+ // Cached Url Effect
139
+ // When the key changes, check the cache to see if it is already available, and populate the download url if it is.
140
+ cachedUrlForStorageFileKey$ = this.storageFileKey$.pipe(switchMap((key) => (key ? this.dbxFirebaseStorageFileDownloadService.getCachedDownloadPairForStorageFile(key) : of(null))), shareReplay(1));
141
+ cachedUrlForStorageFileKeySignal = toSignal(this.cachedUrlForStorageFileKey$);
142
+ cachedUrlEffect = effect(() => {
143
+ const cachedPair = this.cachedUrlForStorageFileKeySignal();
144
+ if (cachedPair) {
145
+ this.downloadUrlSignal.set(cachedPair.downloadUrl);
146
+ this.downloadMimeTypeSignal.set(cachedPair.mimeType);
147
+ this.downloadUrlExpiresAtSignal.set(cachedPair.expiresAt);
148
+ }
149
+ }, {
150
+ allowSignalWrites: true
151
+ });
152
+ // Expiration Effect
153
+ downloadUrlExpiresAt$ = toObservable(this.downloadUrlExpiresAtSignal).pipe(map(dateFromDateOrTimeSecondsNumber), distinctUntilChanged(), shareReplay(1));
154
+ downloadUrlHasExpired$ = this.downloadUrlExpiresAt$.pipe(switchMap((x) => {
155
+ let obs;
156
+ if (x) {
157
+ obs = interval(MS_IN_SECOND).pipe(map(() => isPast(x)), distinctUntilChanged(), shareReplay(1));
158
+ }
159
+ else {
160
+ obs = of(false);
161
+ }
162
+ return obs;
163
+ }), distinctUntilChanged(), shareReplay(1));
164
+ downloadUrlHasExpiredSignal = toSignal(this.downloadUrlHasExpired$);
165
+ downloadUrlHasExpiredEffect = effect(() => {
166
+ const expired = this.downloadUrlHasExpiredSignal();
167
+ if (expired) {
168
+ this.downloadUrlSignal.set(undefined);
169
+ this.downloadMimeTypeSignal.set(undefined);
170
+ this.downloadUrlExpiresAtSignal.set(undefined);
171
+ }
172
+ }, {
173
+ allowSignalWrites: true
174
+ });
175
+ // Output Effect
176
+ downloadUrlChangeEffect = effect(() => {
177
+ const downloadUrl = this.downloadUrlSignal();
178
+ this.downloadUrlChange.emit(downloadUrl);
179
+ });
180
+ // Handlers
181
+ handleGetDownloadUrl = (value, context) => {
182
+ const source = this.source();
183
+ const { customSource, handleGetDownloadUrl } = source ?? {};
184
+ if (handleGetDownloadUrl) {
185
+ handleGetDownloadUrl(value, context);
186
+ }
187
+ else {
188
+ context.startWorkingWithObservable(this.dbxFirebaseStorageFileDownloadService.downloadPairForStorageFileUsingSource(value, customSource));
189
+ }
190
+ };
191
+ handleGetDownloadUrlSuccess = (value) => {
192
+ const source = this.source();
193
+ const { handleGetDownloadUrlSuccess } = source ?? {};
194
+ this.downloadUrlSignal.set(value.downloadUrl);
195
+ this.downloadMimeTypeSignal.set(value.mimeType);
196
+ this.downloadUrlExpiresAtSignal.set(value.expiresAt);
197
+ if (handleGetDownloadUrlSuccess) {
198
+ handleGetDownloadUrlSuccess(value);
199
+ }
200
+ };
201
+ handleGetDownloadUrlError = (error) => {
202
+ const source = this.source();
203
+ const { handleGetDownloadUrlError } = source ?? {};
204
+ this.downloadUrlSignal.set(undefined);
205
+ this.downloadMimeTypeSignal.set(undefined);
206
+ this.downloadUrlExpiresAtSignal.set(undefined);
207
+ if (handleGetDownloadUrlError) {
208
+ handleGetDownloadUrlError(error);
209
+ }
210
+ };
211
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, deps: [], target: i0.ɵɵFactoryTarget.Component });
212
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.13", type: DbxFirebaseStorageFileDownloadButton, isStandalone: true, selector: "dbx-firebase-storagefile-download-button", inputs: { storageFileKey: { classPropertyName: "storageFileKey", publicName: "storageFileKey", isSignal: true, isRequired: false, transformFunction: null }, storageFileDownloadUrl: { classPropertyName: "storageFileDownloadUrl", publicName: "storageFileDownloadUrl", isSignal: true, isRequired: false, transformFunction: null }, embedMimeType: { classPropertyName: "embedMimeType", publicName: "embedMimeType", isSignal: true, isRequired: false, transformFunction: null }, showPreviewButton: { classPropertyName: "showPreviewButton", publicName: "showPreviewButton", isSignal: true, isRequired: false, transformFunction: null }, config: { classPropertyName: "config", publicName: "config", isSignal: true, isRequired: false, transformFunction: null }, source: { classPropertyName: "source", publicName: "source", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { downloadUrlChange: "downloadUrlChange" }, ngImport: i0, template: `
213
+ <dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKeySignal()" [dbxActionValue]="storageFileKeySignal()" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
214
+ <dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
215
+ </dbx-anchor>
216
+ @if (showPreviewButtonSignal()) {
217
+ <ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
218
+ <span class="dbx-button-spacer"></span>
219
+ <dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
220
+ </ng-container>
221
+ }
222
+ `, isInline: true, dependencies: [{ kind: "component", type: DbxButtonComponent, selector: "dbx-button", inputs: ["bar", "type", "buttonStyle", "color", "spinnerColor", "customButtonColor", "customTextColor", "customSpinnerColor", "basic", "raised", "stroked", "flat", "iconOnly", "fab", "mode"] }, { kind: "ngmodule", type: DbxActionModule }, { kind: "directive", type: i1.DbxActionDirective, selector: "dbx-action,[dbxAction],dbx-action-context,[dbxActionContext]", exportAs: ["action", "dbxAction"] }, { kind: "directive", type: i1.DbxActionHandlerDirective, selector: "[dbxActionHandler]", inputs: ["dbxActionHandler"] }, { kind: "directive", type: i1.DbxActionHandlerValueDirective, selector: "[dbxActionHandlerValue]", inputs: ["dbxActionHandlerValue"] }, { kind: "directive", type: i1.DbxActionDisabledDirective, selector: "[dbxActionDisabled]", inputs: ["dbxActionDisabled"] }, { kind: "directive", type: i1.DbxActionAutoTriggerDirective, selector: "dbxActionAutoTrigger,[dbxActionAutoTrigger]", inputs: ["triggerDebounce", "triggerThrottle", "triggerErrorThrottle", "maxErrorsForThrottle", "triggerLimit", "dbxActionAutoTrigger", "useFastTriggerPreset", "useInstantTriggerPreset"] }, { kind: "directive", type: i1.DbxActionValueDirective, selector: "dbxActionValue,[dbxActionValue]", inputs: ["dbxActionValue"] }, { kind: "directive", type: i1.DbxActionSuccessHandlerDirective, selector: "[dbxActionSuccessHandler]", inputs: ["dbxActionSuccessHandler"] }, { kind: "directive", type: i1.DbxActionErrorHandlerDirective, selector: "[dbxActionErrorHandler]", inputs: ["dbxActionErrorHandler"] }, { kind: "directive", type: i1.DbxActionButtonDirective, selector: "[dbxActionButton]" }, { kind: "directive", type: DbxActionSnackbarErrorDirective, selector: "[dbxActionSnackbarError]", inputs: ["dbxActionSnackbarError"] }, { kind: "directive", type: DbxActionDialogDirective, selector: "[dbxActionDialog]", inputs: ["dbxActionDialog", "dbxActionDialogIsModified", "dbxActionDialogIsEqual"], exportAs: ["dbxActionDialog"] }, { kind: "component", type: DbxAnchorComponent, selector: "dbx-anchor, [dbx-anchor]", inputs: ["block"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
223
+ }
224
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadButton, decorators: [{
225
+ type: Component,
226
+ args: [{
227
+ selector: 'dbx-firebase-storagefile-download-button',
228
+ template: `
229
+ <dbx-anchor dbxActionAnchor [anchor]="anchorSignal()" dbxAction [dbxActionAutoTrigger]="preloadSignal()" dbxActionSnackbarError [dbxActionDisabled]="!storageFileKeySignal()" [dbxActionValue]="storageFileKeySignal()" [dbxActionHandler]="handleGetDownloadUrl" [dbxActionSuccessHandler]="handleGetDownloadUrlSuccess" [dbxActionErrorHandler]="handleGetDownloadUrlError">
230
+ <dbx-button dbxActionButton [buttonStyle]="buttonStyleSignal()" [icon]="iconSignal()" [text]="textSignal()"></dbx-button>
231
+ </dbx-anchor>
232
+ @if (showPreviewButtonSignal()) {
233
+ <ng-container dbxAction [dbxActionDialog]="handleOpenPreviewDialog" dbxActionHandlerValue>
234
+ <span class="dbx-button-spacer"></span>
235
+ <dbx-button dbxActionButton [buttonStyle]="previewButtonStyleSignal()" [icon]="previewIconSignal()" [text]="previewTextSignal()"></dbx-button>
236
+ </ng-container>
237
+ }
238
+ `,
239
+ imports: [DbxButtonComponent, DbxActionModule, DbxActionSnackbarErrorDirective, DbxActionDialogDirective, DbxAnchorComponent],
240
+ changeDetection: ChangeDetectionStrategy.OnPush,
241
+ standalone: true
242
+ }]
243
+ }] });
244
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuYnV0dG9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvY29udGFpbmVyL3N0b3JhZ2VmaWxlLmRvd25sb2FkLmJ1dHRvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSCxPQUFPLEVBQUUsd0JBQXdCLEVBQTJCLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSxrQkFBa0IsRUFBRSxrQkFBa0IsRUFBa0Isd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV6TixPQUFPLEVBQXVCLCtCQUErQixFQUFtQyxNQUFNLEVBQVMsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25KLE9BQU8sRUFBRSxxQ0FBcUMsRUFBcUQsTUFBTSx5Q0FBeUMsQ0FBQztBQUVuSixPQUFPLEVBQTBCLCtCQUErQixFQUFrQyxNQUFNLGVBQWUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsWUFBWSxFQUFFLFFBQVEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3BFLE9BQU8sRUFBRSxhQUFhLEVBQUUsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLEdBQUcsRUFBYyxFQUFFLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUVsSCxPQUFPLEVBQUUsU0FBUyxFQUFnQixNQUFNLDBCQUEwQixDQUFDOzs7QUFnRm5FLE1BQU0sT0FBTyxvQ0FBb0M7SUFDdEMsU0FBUyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztJQUU5Qix3QkFBd0IsR0FBRyxN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LENBQUM7UUFFL0MsSUFBSSx5QkFBeUIsRUFBRSxDQUFDO1lBQzlCLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ25DLENBQUM7SUFDSCxDQUFDLENBQUM7d0dBNVJTLG9DQUFvQzs0RkFBcEMsb0NBQW9DLHFnQ0FmckM7Ozs7Ozs7Ozs7R0FVVCw0REFDUyxrQkFBa0Isc1BBQUUsZUFBZSxpMkNBQUUsK0JBQStCLHlHQUFFLHdCQUF3QixpTEFBRSxrQkFBa0I7OzRGQUlqSCxvQ0FBb0M7a0JBakJoRCxTQUFTO21CQUFDO29CQUNULFFBQVEsRUFBRSwwQ0FBMEM7b0JBQ3BELFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO29CQUNELE9BQU8sRUFBRSxDQUFDLGtCQUFrQixFQUFFLGVBQWUsRUFBRSwrQkFBK0IsRUFBRSx3QkFBd0IsRUFBRSxrQkFBa0IsQ0FBQztvQkFDN0gsZUFBZSxFQUFFLHVCQUF1QixDQUFDLE1BQU07b0JBQy9DLFVBQVUsRUFBRSxJQUFJO2lCQUNqQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBlZmZlY3QsIGluamVjdCwgaW5wdXQsIG91dHB1dCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEYnhBY3Rpb25EaWFsb2dEaXJlY3RpdmUsIERieEFjdGlvbkRpYWxvZ0Z1bmN0aW9uLCBEYnhBY3Rpb25Nb2R1bGUsIERieEFjdGlvblNuYWNrYmFyRXJyb3JEaXJlY3RpdmUsIERieEFuY2hvckNvbXBvbmVudCwgRGJ4QnV0dG9uQ29tcG9uZW50LCBEYnhCdXR0b25TdHlsZSwgRGJ4V2ViRmlsZVByZXZpZXdTZXJ2aWNlIH0gZnJvbSAnQGRlcmVla2IvZGJ4LXdlYic7XG5pbXBvcnQgeyBTdG9yYWdlRmlsZURvd25sb2FkVXJsLCBTdG9yYWdlRmlsZUtleSB9IGZyb20gJ0BkZXJlZWtiL2ZpcmViYXNlJztcbmltcG9ydCB7IENvbnRlbnRUeXBlTWltZVR5cGUsIGRhdGVGcm9tRGF0ZU9yVGltZVNlY29uZHNOdW1iZXIsIERhdGVPclVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXIsIGlzUGFzdCwgTWF5YmUsIE1TX0lOX1NFQ09ORCB9IGZyb20gJ0BkZXJlZWtiL3V0aWwnO1xuaW1wb3J0IHsgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZSwgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB9IGZyb20gJy4uL3NlcnZpY2Uvc3RvcmFnZWZpbGUuZG93bmxvYWQuc2VydmljZSc7XG5pbXBvcnQgeyBDbGlja2FibGVBbmNob3IgfSBmcm9tICdAZGVyZWVrYi9kYngtY29yZSc7XG5pbXBvcnQgeyBNYXliZU9ic2VydmFibGVPclZhbHVlLCBtYXliZVZhbHVlRnJvbU9ic2VydmFibGVPclZhbHVlLCBXb3JrSW5zdGFuY2UsIFdvcmtVc2luZ0NvbnRleHQgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcbmltcG9ydCB7IHRvT2JzZXJ2YWJsZSwgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XG5pbXBvcnQgeyBjb21iaW5lTGF0ZXN0LCBkaXN0aW5jdFVudGlsQ2hhbmdlZCwgaW50ZXJ2YWwsIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHNoYXJlUmVwbGF5LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXIgfSBmcm9tICcuLi9zZXJ2aWNlL3N0b3JhZ2VmaWxlLmRvd25sb2FkLnN0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQgeyBNYXREaWFsb2csIE1hdERpYWxvZ1JlZiB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2RpYWxvZyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkQnV0dG9uU291cmNlIHtcbiAgLyoqXG4gICAqIEEgc3RhdGljIFN0b3JhZ2VGaWxlS2V5IHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlS2V5PzogTWF5YmVPYnNlcnZhYmxlT3JWYWx1ZTxTdG9yYWdlRmlsZUtleT47XG4gIC8qKlxuICAgKiBUaGUgZXhwZWN0ZWQgbWltZSB0eXBlIG9mIHRoZSBTdG9yYWdlRmlsZSB0byB1c2Ugd2hlbiBwcmV2aWV3aW5nLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVFbWJlZE1pbWVUeXBlPzogTWF5YmVPYnNlcnZhYmxlT3JWYWx1ZTxDb250ZW50VHlwZU1pbWVUeXBlIHwgc3RyaW5nPjtcbiAgLyoqXG4gICAqIEN1c3RvbSBzb3VyY2UgdG8gdXNlIHdpdGggdGhlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuIEEgbW9yZSBzaW1wbGUgYWx0ZXJuYXRpdmUgdG8gdXNpbmcgaGFuZGxlR2V0RG93bmxvYWRVcmwoKS5cbiAgICovXG4gIHJlYWRvbmx5IGN1c3RvbVNvdXJjZT86IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2VDdXN0b21Tb3VyY2U+O1xuICAvKipcbiAgICogT3B0aW9uYWwgY3VzdG9tIHdvcmsgdG8gdXNlIHRvIGdldCB0aGUgZG93bmxvYWQgVVJMLlxuICAgKlxuICAgKiBJZiBwcm92aWRlZCwgY3VzdG9tU291cmNlIGlzIGlnbm9yZWQuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVHZXREb3dubG9hZFVybD86IE1heWJlPFdvcmtVc2luZ0NvbnRleHQ8U3RvcmFnZUZpbGVLZXksIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+PjtcbiAgLyoqXG4gICAqIE9wdGlvbmFsIGN1c3RvbSBzdWNjZXNzIGhhbmRsZXIgZm9yIHRoZSBkb3dubG9hZCBVUkwuXG4gICAqL1xuICByZWFkb25seSBoYW5kbGVHZXREb3dubG9hZFVybFN1Y2Nlc3M/OiAodmFsdWU6IERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXIpID0+IHZvaWQ7XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gZXJyb3IgaGFuZGxlciBmb3IgdGhlIGRvd25sb2FkIFVSTC5cbiAgICovXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3I/OiAoZXJyb3I6IHVua25vd24pID0+IHZvaWQ7XG59XG5cbi8qKlxuICogQ29uZmlndXJhdGlvbiBmb3IgdGhlIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZEJ1dHRvbi5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcge1xuICByZWFkb25seSBidXR0b25TdHlsZT86IE1heWJlPERieEJ1dHRvblN0eWxlPjtcbiAgcmVhZG9ubHkgcHJldmlld0J1dHRvblN0eWxlPzogTWF5YmU8RGJ4QnV0dG9uU3R5bGU+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gcHJlLWxvYWQgdGhlIGRvd25sb2FkIHVybCBmcm9tIHRoZSBzb3VyY2UuXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIGZhbHNlLlxuICAgKi9cbiAgcmVhZG9ubHkgcHJlbG9hZD86IE1heWJlPGJvb2xlYW4+O1xuICAvKipcbiAgICogV2hldGhlciBvciBub3QgdG8gc2hvdyBhIHByZXZpZXcgYnV0dG9uLlxuICAgKlxuICAgKiBEZWZhdWx0cyB0byB0cnVlLlxuICAgKi9cbiAgcmVhZG9ubHkgc2hvd1ByZXZpZXdCdXR0b24/OiBNYXliZTxib29sZWFuPjtcbiAgcmVhZG9ubHkgaWNvbj86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IHRleHQ/OiBNYXliZTxzdHJpbmc+O1xuICByZWFkb25seSBkb3dubG9hZFJlYWR5SWNvbj86IE1heWJlPHN0cmluZz47XG4gIHJlYWRvbmx5IGRvd25sb2FkUmVhZHlUZXh0PzogTWF5YmU8c3RyaW5nPjtcbiAgcmVhZG9ubHkgcHJldmlld0ljb24/OiBNYXliZTxzdHJpbmc+O1xuICByZWFkb25seSBwcmV2aWV3VGV4dD86IE1heWJlPHN0cmluZz47XG4gIC8qKlxuICAgKiBPcHRpb25hbCBjdXN0b20gZnVuY3Rpb24gdG8gb3BlbiBhIHByZXZpZXcgZGlhbG9nLiBJZiBub3QgcHJvdmlkZWQsIHRoZSBkZWZhdWx0IHByZXZpZXcgZGlhbG9nIHByb3ZpZGVkIGJ5IHRoZSBEYnhXZWJGaWxlUHJldmlld1NlcnZpY2Ugd2lsbCBiZSB1c2VkLlxuICAgKlxuICAgKiBUaGUgZnVuY3Rpb24gY2FuIHJldHVybiB1bmRlZmluZWQsIGluIHdoaWNoIGNhc2UgdGhlIGRlZmF1bHQgcHJldmlldyBkaWFsb2cgd2lsbCBiZSB1c2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlbkN1c3RvbVByZXZpZXc/OiBNYXliZTwoZG93bmxvYWRVcmw6IFN0b3JhZ2VGaWxlRG93bmxvYWRVcmwsIGVtYmVkTWltZVR5cGU/OiBNYXliZTxzdHJpbmc+KSA9PiBNYXliZTxNYXREaWFsb2dSZWY8YW55Pj4+O1xufVxuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkYngtZmlyZWJhc2Utc3RvcmFnZWZpbGUtZG93bmxvYWQtYnV0dG9uJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGJ4LWFuY2hvciBkYnhBY3Rpb25BbmNob3IgW2FuY2hvcl09XCJhbmNob3JTaWduYWwoKVwiIGRieEFjdGlvbiBbZGJ4QWN0aW9uQXV0b1RyaWdnZXJdPVwicHJlbG9hZFNpZ25hbCgpXCIgZGJ4QWN0aW9uU25hY2tiYXJFcnJvciBbZGJ4QWN0aW9uRGlzYWJsZWRdPVwiIXN0b3JhZ2VGaWxlS2V5U2lnbmFsKClcIiBbZGJ4QWN0aW9uVmFsdWVdPVwic3RvcmFnZUZpbGVLZXlTaWduYWwoKVwiIFtkYnhBY3Rpb25IYW5kbGVyXT1cImhhbmRsZUdldERvd25sb2FkVXJsXCIgW2RieEFjdGlvblN1Y2Nlc3NIYW5kbGVyXT1cImhhbmRsZUdldERvd25sb2FkVXJsU3VjY2Vzc1wiIFtkYnhBY3Rpb25FcnJvckhhbmRsZXJdPVwiaGFuZGxlR2V0RG93bmxvYWRVcmxFcnJvclwiPlxuICAgICAgPGRieC1idXR0b24gZGJ4QWN0aW9uQnV0dG9uIFtidXR0b25TdHlsZV09XCJidXR0b25TdHlsZVNpZ25hbCgpXCIgW2ljb25dPVwiaWNvblNpZ25hbCgpXCIgW3RleHRdPVwidGV4dFNpZ25hbCgpXCI+PC9kYngtYnV0dG9uPlxuICAgIDwvZGJ4LWFuY2hvcj5cbiAgICBAaWYgKHNob3dQcmV2aWV3QnV0dG9uU2lnbmFsKCkpIHtcbiAgICAgIDxuZy1jb250YWluZXIgZGJ4QWN0aW9uIFtkYnhBY3Rpb25EaWFsb2ddPVwiaGFuZGxlT3BlblByZXZpZXdEaWFsb2dcIiBkYnhBY3Rpb25IYW5kbGVyVmFsdWU+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiZGJ4LWJ1dHRvbi1zcGFjZXJcIj48L3NwYW4+XG4gICAgICAgIDxkYngtYnV0dG9uIGRieEFjdGlvbkJ1dHRvbiBbYnV0dG9uU3R5bGVdPVwicHJldmlld0J1dHRvblN0eWxlU2lnbmFsKClcIiBbaWNvbl09XCJwcmV2aWV3SWNvblNpZ25hbCgpXCIgW3RleHRdPVwicHJldmlld1RleHRTaWduYWwoKVwiPjwvZGJ4LWJ1dHRvbj5cbiAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIH1cbiAgYCxcbiAgaW1wb3J0czogW0RieEJ1dHRvbkNvbXBvbmVudCwgRGJ4QWN0aW9uTW9kdWxlLCBEYnhBY3Rpb25TbmFja2JhckVycm9yRGlyZWN0aXZlLCBEYnhBY3Rpb25EaWFsb2dEaXJlY3RpdmUsIERieEFuY2hvckNvbXBvbmVudF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBzdGFuZGFsb25lOiB0cnVlXG59KVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZEJ1dHRvbiB7XG4gIHJlYWRvbmx5IG1hdERpYWxvZyA9IGluamVjdChNYXREaWFsb2cpO1xuXG4gIHJlYWRvbmx5IGRieFdlYkZpbGVQcmV2aWV3U2VydmljZSA9IGluamVjdChEYnhXZWJGaWxlUHJldmlld1NlcnZpY2UpO1xuICByZWFkb25seSBkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlID0gaW5qZWN0KERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UpO1xuXG4gIC8qKlxuICAgKiBUaGUgU3RvcmFnZUZpbGVLZXkgdG8gc2V0IHVwIHRoZSBkb3dubG9hZCBidXR0b24gZm9yLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVLZXkgPSBpbnB1dDxNYXliZTxTdG9yYWdlRmlsZUtleT4+KCk7XG5cbiAgLyoqXG4gICAqIFRoZSBkb3dubG9hZCBVUkwgdG8gdXNlIGZvciB0aGUgZG93bmxvYWQgYnV0dG9uLlxuICAgKi9cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVEb3dubG9hZFVybCA9IGlucHV0PE1heWJlPFN0b3JhZ2VGaWxlRG93bmxvYWRVcmw+PigpO1xuXG4gIC8qKlxuICAgKiBUaGUgTUlNRSB0eXBlIHRvIHVzZSB0aGUgZW1iZWQgY29tcG9uZW50LlxuICAgKi9cbiAgcmVhZG9ubHkgZW1iZWRNaW1lVHlwZSA9IGlucHV0PE1heWJlPENvbnRlbnRUeXBlTWltZVR5cGUgfCBzdHJpbmc+PigpO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IGEgcHJldmlldyBidXR0b24uXG4gICAqXG4gICAqIERlZmF1bHRzIHRvIHRydWUuXG4gICAqL1xuICByZWFkb25seSBzaG93UHJldmlld0J1dHRvbiA9IGlucHV0PE1heWJlPGJvb2xlYW4+Pih0cnVlKTtcblxuICAvKipcbiAgICogT3V0cHV0IGV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZG93bmxvYWQgVVJMIGNoYW5nZXMuXG4gICAqL1xuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZSA9IG91dHB1dDxNYXliZTxTdG9yYWdlRmlsZURvd25sb2FkVXJsPj4oKTtcblxuICByZWFkb25seSBjb25maWcgPSBpbnB1dDxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWc+PigpO1xuICByZWFkb25seSBzb3VyY2UgPSBpbnB1dDxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Tb3VyY2U+PigpO1xuXG4gIHJlYWRvbmx5IHNvdXJjZSQgPSB0b09ic2VydmFibGUodGhpcy5zb3VyY2UpO1xuXG4gIHJlYWRvbmx5IGNvbmZpZ1NpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZygpO1xuXG4gICAgY29uc3QgcmVzdWx0OiBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRCdXR0b25Db25maWcgPSB7XG4gICAgICBidXR0b25TdHlsZTogY29uZmlnPy5idXR0b25TdHlsZSxcbiAgICAgIHByZXZpZXdCdXR0b25TdHlsZTogY29uZmlnPy5wcmV2aWV3QnV0dG9uU3R5bGUsXG4gICAgICBpY29uOiBjb25maWc/Lmljb24gPz8gJ2Nsb3VkX2Rvd25sb2FkJyxcbiAgICAgIHRleHQ6IGNvbmZpZz8udGV4dCA/PyAnU3RhcnQgRG93bmxvYWQnLFxuICAgICAgZG93bmxvYWRSZWFkeUljb246IGNvbmZpZz8uZG93bmxvYWRSZWFkeUljb24gPz8gJ2Rvd25sb2FkJyxcbiAgICAgIGRvd25sb2FkUmVhZHlUZXh0OiBjb25maWc/LmRvd25sb2FkUmVhZHlUZXh0ID8/ICdTYXZlIEZpbGUnLFxuICAgICAgcHJldmlld0ljb246IGNvbmZpZz8ucHJldmlld0ljb24gPz8gJ3ByZXZpZXcnLFxuICAgICAgcHJldmlld1RleHQ6IGNvbmZpZz8ucHJldmlld1RleHQgPz8gJ1ZpZXcgRmlsZSdcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgcHJlbG9hZFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJlbG9hZCA/PyBmYWxzZTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgZG93bmxvYWRVcmxTaWduYWwgPSBzaWduYWw8TWF5YmU8U3RvcmFnZUZpbGVEb3dubG9hZFVybD4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkTWltZVR5cGVTaWduYWwgPSBzaWduYWw8TWF5YmU8Q29udGVudFR5cGVNaW1lVHlwZT4+KHVuZGVmaW5lZCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsID0gc2lnbmFsPE1heWJlPERhdGVPclVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXI+Pih1bmRlZmluZWQpO1xuXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlS2V5RnJvbUlucHV0JCA9IHRvT2JzZXJ2YWJsZSh0aGlzLnN0b3JhZ2VGaWxlS2V5KS5waXBlKGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleUZyb21Tb3VyY2UkOiBPYnNlcnZhYmxlPE1heWJlPFN0b3JhZ2VGaWxlS2V5Pj4gPSB0aGlzLnNvdXJjZSQucGlwZShcbiAgICBtYXAoKHNvdXJjZSkgPT4gc291cmNlPy5zdG9yYWdlRmlsZUtleSksXG4gICAgbWF5YmVWYWx1ZUZyb21PYnNlcnZhYmxlT3JWYWx1ZSgpLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleSQ6IE9ic2VydmFibGU8TWF5YmU8U3RvcmFnZUZpbGVLZXk+PiA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuc3RvcmFnZUZpbGVLZXlGcm9tSW5wdXQkLCB0aGlzLnN0b3JhZ2VGaWxlS2V5RnJvbVNvdXJjZSRdKS5waXBlKFxuICAgIG1hcCgoW3N0b3JhZ2VGaWxlS2V5RnJvbUlucHV0LCBzdG9yYWdlRmlsZUtleUZyb21Tb3VyY2VdKSA9PiB7XG4gICAgICByZXR1cm4gc3RvcmFnZUZpbGVLZXlGcm9tSW5wdXQgPz8gc3RvcmFnZUZpbGVLZXlGcm9tU291cmNlO1xuICAgIH0pLFxuICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICByZWFkb25seSBzdG9yYWdlRmlsZUtleVNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuc3RvcmFnZUZpbGVLZXkkKTtcblxuICByZWFkb25seSBoYXNEb3dubG9hZFVybFNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IEJvb2xlYW4odGhpcy5kb3dubG9hZFVybFNpZ25hbCgpKSk7XG5cbiAgcmVhZG9ubHkgYnV0dG9uU3R5bGVTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRGJ4QnV0dG9uU3R5bGUgPSB7XG4gICAgICB0eXBlOiAncmFpc2VkJyxcbiAgICAgIC4uLmNvbmZpZy5idXR0b25TdHlsZVxuICAgIH07XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICByZWFkb25seSBwcmV2aWV3QnV0dG9uU3R5bGVTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcblxuICAgIGNvbnN0IHJlc3VsdDogRGJ4QnV0dG9uU3R5bGUgPSB7XG4gICAgICB0eXBlOiAncmFpc2VkJyxcbiAgICAgIC4uLmNvbmZpZy5wcmV2aWV3QnV0dG9uU3R5bGVcbiAgICB9O1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaWNvblNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIGNvbnN0IGhhc0Rvd25sb2FkVXJsID0gdGhpcy5oYXNEb3dubG9hZFVybFNpZ25hbCgpO1xuICAgIHJldHVybiBoYXNEb3dubG9hZFVybCA/IChjb25maWcuZG93bmxvYWRSZWFkeUljb24gPz8gY29uZmlnLmljb24pIDogY29uZmlnLmljb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHRleHRTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICBjb25zdCBoYXNEb3dubG9hZFVybCA9IHRoaXMuaGFzRG93bmxvYWRVcmxTaWduYWwoKTtcbiAgICByZXR1cm4gaGFzRG93bmxvYWRVcmwgPyAoY29uZmlnLmRvd25sb2FkUmVhZHlUZXh0ID8/IGNvbmZpZy50ZXh0KSA6IGNvbmZpZy50ZXh0O1xuICB9KTtcblxuICByZWFkb25seSBwcmV2aWV3SWNvblNpZ25hbCA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICBjb25zdCBjb25maWcgPSB0aGlzLmNvbmZpZ1NpZ25hbCgpO1xuICAgIHJldHVybiBjb25maWcucHJldmlld0ljb247XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHByZXZpZXdUZXh0U2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuY29uZmlnU2lnbmFsKCk7XG4gICAgcmV0dXJuIGNvbmZpZy5wcmV2aWV3VGV4dDtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgYW5jaG9yU2lnbmFsID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIGNvbnN0IGRvd25sb2FkVXJsID0gdGhpcy5kb3dubG9hZFVybFNpZ25hbCgpO1xuXG4gICAgbGV0IHJlc3VsdDogTWF5YmU8Q2xpY2thYmxlQW5jaG9yPjtcblxuICAgIGlmIChkb3dubG9hZFVybCkge1xuICAgICAgcmVzdWx0ID0ge1xuICAgICAgICB1cmw6IGRvd25sb2FkVXJsXG4gICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiByZXN1bHQ7XG4gIH0pO1xuXG4gIHJlYWRvbmx5IHN0b3JhZ2VGaWxlRG93bmxvYWRVcmxFZmZlY3QgPSBlZmZlY3QoXG4gICAgKCkgPT4ge1xuICAgICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLnN0b3JhZ2VGaWxlRG93bmxvYWRVcmwoKTtcblxuICAgICAgaWYgKGRvd25sb2FkVXJsIHx8IGRvd25sb2FkVXJsID09PSBudWxsKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KGRvd25sb2FkVXJsKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIHtcbiAgICAgIGFsbG93U2lnbmFsV3JpdGVzOiB0cnVlXG4gICAgfVxuICApO1xuXG4gIC8vIFByZXZpZXdcbiAgcmVhZG9ubHkgc2hvd1ByZXZpZXdCdXR0b25TaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICBjb25zdCBoYXNEb3dubG9hZFVybCA9IHRoaXMuaGFzRG93bmxvYWRVcmxTaWduYWwoKTtcbiAgICByZXR1cm4gaGFzRG93bmxvYWRVcmwgJiYgKGNvbmZpZy5zaG93UHJldmlld0J1dHRvbiA/PyB0cnVlKTtcbiAgfSk7XG5cbiAgcmVhZG9ubHkgb3BlbkN1c3RvbVByZXZpZXdTaWduYWwgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgY29uc3QgY29uZmlnID0gdGhpcy5jb25maWdTaWduYWwoKTtcbiAgICByZXR1cm4gY29uZmlnLm9wZW5DdXN0b21QcmV2aWV3O1xuICB9KTtcblxuICByZWFkb25seSBoYW5kbGVPcGVuUHJldmlld0RpYWxvZzogRGJ4QWN0aW9uRGlhbG9nRnVuY3Rpb24gPSAoKSA9PiB7XG4gICAgY29uc3Qgb3BlblByZXZpZXcgPSB0aGlzLm9wZW5DdXN0b21QcmV2aWV3U2lnbmFsKCk7XG5cbiAgICBjb25zdCBzcmNVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCkgYXMgc3RyaW5nO1xuICAgIGNvbnN0IGlucHV0RW1iZWRNaW1lVHlwZSA9IHRoaXMuZW1iZWRNaW1lVHlwZSgpO1xuICAgIGNvbnN0IGRvd25sb2FkTWltZVR5cGUgPSB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwoKTtcbiAgICBjb25zdCBlbWJlZE1pbWVUeXBlID0gaW5wdXRFbWJlZE1pbWVUeXBlID8/IGRvd25sb2FkTWltZVR5cGU7XG5cbiAgICByZXR1cm4gb3BlblByZXZpZXc/LihzcmNVcmwsIGVtYmVkTWltZVR5cGUpID8/IHRoaXMuZGJ4V2ViRmlsZVByZXZpZXdTZXJ2aWNlLm9wZW5QcmV2aWV3RGlhbG9nKHNyY1VybCwgZW1iZWRNaW1lVHlwZSk7XG4gIH07XG5cbiAgLy8gQ2FjaGVkIFVybCBFZmZlY3RcbiAgLy8gV2hlbiB0aGUga2V5IGNoYW5nZXMsIGNoZWNrIHRoZSBjYWNoZSB0byBzZWUgaWYgaXQgaXMgYWxyZWFkeSBhdmFpbGFibGUsIGFuZCBwb3B1bGF0ZSB0aGUgZG93bmxvYWQgdXJsIGlmIGl0IGlzLlxuICByZWFkb25seSBjYWNoZWRVcmxGb3JTdG9yYWdlRmlsZUtleSQgPSB0aGlzLnN0b3JhZ2VGaWxlS2V5JC5waXBlKFxuICAgIHN3aXRjaE1hcCgoa2V5KSA9PiAoa2V5ID8gdGhpcy5kYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlLmdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKGtleSkgOiBvZihudWxsKSkpLFxuICAgIHNoYXJlUmVwbGF5KDEpXG4gICk7XG5cbiAgcmVhZG9ubHkgY2FjaGVkVXJsRm9yU3RvcmFnZUZpbGVLZXlTaWduYWwgPSB0b1NpZ25hbCh0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5JCk7XG5cbiAgcmVhZG9ubHkgY2FjaGVkVXJsRWZmZWN0ID0gZWZmZWN0KFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGNhY2hlZFBhaXIgPSB0aGlzLmNhY2hlZFVybEZvclN0b3JhZ2VGaWxlS2V5U2lnbmFsKCk7XG5cbiAgICAgIGlmIChjYWNoZWRQYWlyKSB7XG4gICAgICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KGNhY2hlZFBhaXIuZG93bmxvYWRVcmwpO1xuICAgICAgICB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwuc2V0KGNhY2hlZFBhaXIubWltZVR5cGUpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldChjYWNoZWRQYWlyLmV4cGlyZXNBdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICB7XG4gICAgICBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZVxuICAgIH1cbiAgKTtcblxuICAvLyBFeHBpcmF0aW9uIEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybEV4cGlyZXNBdCQgPSB0b09ic2VydmFibGUodGhpcy5kb3dubG9hZFVybEV4cGlyZXNBdFNpZ25hbCkucGlwZShtYXAoZGF0ZUZyb21EYXRlT3JUaW1lU2Vjb25kc051bWJlciksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksIHNoYXJlUmVwbGF5KDEpKTtcblxuICByZWFkb25seSBkb3dubG9hZFVybEhhc0V4cGlyZWQkID0gdGhpcy5kb3dubG9hZFVybEV4cGlyZXNBdCQucGlwZShcbiAgICBzd2l0Y2hNYXAoKHgpID0+IHtcbiAgICAgIGxldCBvYnM6IE9ic2VydmFibGU8Ym9vbGVhbj47XG5cbiAgICAgIGlmICh4KSB7XG4gICAgICAgIG9icyA9IGludGVydmFsKE1TX0lOX1NFQ09ORCkucGlwZShcbiAgICAgICAgICBtYXAoKCkgPT4gaXNQYXN0KHgpKSxcbiAgICAgICAgICBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLFxuICAgICAgICAgIHNoYXJlUmVwbGF5KDEpXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvYnMgPSBvZihmYWxzZSk7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBvYnM7XG4gICAgfSksXG4gICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICBzaGFyZVJlcGxheSgxKVxuICApO1xuXG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsSGFzRXhwaXJlZFNpZ25hbCA9IHRvU2lnbmFsKHRoaXMuZG93bmxvYWRVcmxIYXNFeHBpcmVkJCk7XG4gIHJlYWRvbmx5IGRvd25sb2FkVXJsSGFzRXhwaXJlZEVmZmVjdCA9IGVmZmVjdChcbiAgICAoKSA9PiB7XG4gICAgICBjb25zdCBleHBpcmVkID0gdGhpcy5kb3dubG9hZFVybEhhc0V4cGlyZWRTaWduYWwoKTtcblxuICAgICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgICAgdGhpcy5kb3dubG9hZFVybFNpZ25hbC5zZXQodW5kZWZpbmVkKTtcbiAgICAgICAgdGhpcy5kb3dubG9hZE1pbWVUeXBlU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgICAgfVxuICAgIH0sXG4gICAge1xuICAgICAgYWxsb3dTaWduYWxXcml0ZXM6IHRydWVcbiAgICB9XG4gICk7XG5cbiAgLy8gT3V0cHV0IEVmZmVjdFxuICByZWFkb25seSBkb3dubG9hZFVybENoYW5nZUVmZmVjdCA9IGVmZmVjdCgoKSA9PiB7XG4gICAgY29uc3QgZG93bmxvYWRVcmwgPSB0aGlzLmRvd25sb2FkVXJsU2lnbmFsKCk7XG4gICAgdGhpcy5kb3dubG9hZFVybENoYW5nZS5lbWl0KGRvd25sb2FkVXJsKTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlcnNcbiAgcmVhZG9ubHkgaGFuZGxlR2V0RG93bmxvYWRVcmw6IFdvcmtVc2luZ0NvbnRleHQ8U3RvcmFnZUZpbGVLZXksIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+ID0gKHZhbHVlOiBTdG9yYWdlRmlsZUtleSwgY29udGV4dDogV29ya0luc3RhbmNlPFN0b3JhZ2VGaWxlS2V5LCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBjdXN0b21Tb3VyY2UsIGhhbmRsZUdldERvd25sb2FkVXJsIH0gPSBzb3VyY2UgPz8ge307XG5cbiAgICBpZiAoaGFuZGxlR2V0RG93bmxvYWRVcmwpIHtcbiAgICAgIGhhbmRsZUdldERvd25sb2FkVXJsKHZhbHVlLCBjb250ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGV4dC5zdGFydFdvcmtpbmdXaXRoT2JzZXJ2YWJsZSh0aGlzLmRieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2UuZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGVVc2luZ1NvdXJjZSh2YWx1ZSwgY3VzdG9tU291cmNlKSk7XG4gICAgfVxuICB9O1xuXG4gIHJlYWRvbmx5IGhhbmRsZUdldERvd25sb2FkVXJsU3VjY2VzcyA9ICh2YWx1ZTogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBoYW5kbGVHZXREb3dubG9hZFVybFN1Y2Nlc3MgfSA9IHNvdXJjZSA/PyB7fTtcblxuICAgIHRoaXMuZG93bmxvYWRVcmxTaWduYWwuc2V0KHZhbHVlLmRvd25sb2FkVXJsKTtcbiAgICB0aGlzLmRvd25sb2FkTWltZVR5cGVTaWduYWwuc2V0KHZhbHVlLm1pbWVUeXBlKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh2YWx1ZS5leHBpcmVzQXQpO1xuXG4gICAgaWYgKGhhbmRsZUdldERvd25sb2FkVXJsU3VjY2Vzcykge1xuICAgICAgaGFuZGxlR2V0RG93bmxvYWRVcmxTdWNjZXNzKHZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmVhZG9ubHkgaGFuZGxlR2V0RG93bmxvYWRVcmxFcnJvciA9IChlcnJvcjogdW5rbm93bikgPT4ge1xuICAgIGNvbnN0IHNvdXJjZSA9IHRoaXMuc291cmNlKCk7XG4gICAgY29uc3QgeyBoYW5kbGVHZXREb3dubG9hZFVybEVycm9yIH0gPSBzb3VyY2UgPz8ge307XG5cbiAgICB0aGlzLmRvd25sb2FkVXJsU2lnbmFsLnNldCh1bmRlZmluZWQpO1xuICAgIHRoaXMuZG93bmxvYWRNaW1lVHlwZVNpZ25hbC5zZXQodW5kZWZpbmVkKTtcbiAgICB0aGlzLmRvd25sb2FkVXJsRXhwaXJlc0F0U2lnbmFsLnNldCh1bmRlZmluZWQpO1xuXG4gICAgaWYgKGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3IpIHtcbiAgICAgIGhhbmRsZUdldERvd25sb2FkVXJsRXJyb3IoZXJyb3IpO1xuICAgIH1cbiAgfTtcbn1cbiJdfQ==
@@ -1,4 +1,6 @@
1
1
  export * from './container';
2
2
  export * from './store';
3
+ export * from './service';
3
4
  export * from './storagefile.upload.module';
4
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsNkJBQTZCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tICcuL2NvbnRhaW5lcic7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZSc7XG4iXX0=
5
+ export * from './storagefile.providers';
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsU0FBUyxDQUFDO0FBQ3hCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsNkJBQTZCLENBQUM7QUFDNUMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vY29udGFpbmVyJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmUnO1xuZXhwb3J0ICogZnJvbSAnLi9zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUudXBsb2FkLm1vZHVsZSc7XG5leHBvcnQgKiBmcm9tICcuL3N0b3JhZ2VmaWxlLnByb3ZpZGVycyc7XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export * from './storagefile.download.service';
2
+ export * from './storagefile.download.storage.service';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9kYngtZmlyZWJhc2Uvc3JjL2xpYi9tb2R1bGVzL3N0b3JhZ2VmaWxlL3NlcnZpY2UvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxnQ0FBZ0MsQ0FBQztBQUMvQyxjQUFjLHdDQUF3QyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlJztcbmV4cG9ydCAqIGZyb20gJy4vc3RvcmFnZWZpbGUuZG93bmxvYWQuc3RvcmFnZS5zZXJ2aWNlJztcbiJdfQ==
@@ -0,0 +1,158 @@
1
+ import { inject, Injectable } from '@angular/core';
2
+ import { StorageFileFunctions, firestoreModelId, firestoreModelKey, storageFileIdentity } from '@dereekb/firebase';
3
+ import { addMilliseconds, MS_IN_DAY, MS_IN_HOUR, MS_IN_MINUTE, SECONDS_IN_MINUTE, unixDateTimeSecondsNumberForNow, unixDateTimeSecondsNumberFromDate } from '@dereekb/util';
4
+ import { DbxFirebaseStorageFileDownloadStorage } from './storagefile.download.storage.service';
5
+ import { first, firstValueFrom, from, interval, map, of, shareReplay, startWith, switchMap, tap } from 'rxjs';
6
+ import { throwErrorFromLoadingStateError, valueFromFinishedLoadingState } from '@dereekb/rxjs';
7
+ import * as i0 from "@angular/core";
8
+ export function dbxFirebaseStorageFileDownloadServiceCustomSourceFromObs(obsForInput) {
9
+ return {
10
+ downloadStorageFileResult: (params, storageFileId) => firstValueFrom(obsForInput(params, storageFileId).pipe(throwErrorFromLoadingStateError(), valueFromFinishedLoadingState()))
11
+ };
12
+ }
13
+ /**
14
+ * Service used for retrieving download links for StorageFiles.
15
+ */
16
+ export class DbxFirebaseStorageFileDownloadService {
17
+ /**
18
+ * Expiration duration for cached download URLs.
19
+ */
20
+ _expiresAfterTime = MS_IN_HOUR * 12;
21
+ /**
22
+ * When reading cached values, this buffer is added to the expiration time to prevent the URL from expiring while it is being used.
23
+ */
24
+ _expiresAfterTimeBuffer = SECONDS_IN_MINUTE * 10;
25
+ storageFileFunctions = inject(StorageFileFunctions);
26
+ storageFileDownloadStorage = inject(DbxFirebaseStorageFileDownloadStorage);
27
+ // MARK: Config
28
+ getExpiresAfterTime() {
29
+ return this._expiresAfterTime;
30
+ }
31
+ setExpiresAfterTime(expiresAfter) {
32
+ const maxAllowed = MS_IN_DAY * 20;
33
+ if (expiresAfter > maxAllowed) {
34
+ throw new Error(`Expires after time cannot be greater than 20 days.`);
35
+ }
36
+ else if (expiresAfter < MS_IN_HOUR) {
37
+ throw new Error(`Expires after time cannot be less than 1 hour.`);
38
+ }
39
+ this._expiresAfterTime = expiresAfter;
40
+ }
41
+ // MARK: Download
42
+ /**
43
+ * Returns an observable that returns the cached download URL pair for the StorageFile, and emits null once it expires.
44
+ *
45
+ * @param storageFileIdOrKey
46
+ * @returns
47
+ */
48
+ getCachedDownloadPairForStorageFile(storageFileIdOrKey) {
49
+ const storageFileId = firestoreModelId(storageFileIdOrKey);
50
+ return this.storageFileDownloadStorage.getDownloadUrlPair(storageFileId).pipe(switchMap((pair) => {
51
+ let result;
52
+ if (pair) {
53
+ const expiresAt = pair.expiresAt - this._expiresAfterTimeBuffer;
54
+ function pairIfNotExpired() {
55
+ const now = unixDateTimeSecondsNumberForNow();
56
+ const isExpired = now > expiresAt;
57
+ return isExpired ? null : pair;
58
+ }
59
+ const initialPair = pairIfNotExpired();
60
+ if (initialPair) {
61
+ // every minute emit the result again
62
+ result = interval(MS_IN_MINUTE).pipe(map(pairIfNotExpired), first((x) => x == null), // only emit the first null value
63
+ startWith(initialPair), // send the initial value first
64
+ shareReplay(1));
65
+ }
66
+ else {
67
+ result = of(null);
68
+ }
69
+ }
70
+ else {
71
+ result = of(null);
72
+ }
73
+ return result;
74
+ }));
75
+ }
76
+ /**
77
+ * Retrieves the download URL for the StorageFile using the default parameters.
78
+ *
79
+ * These URLs are cached locally to prevent extra/redundant calls to the server.
80
+ *
81
+ * @param storageFileIdOrKey
82
+ * @returns
83
+ */
84
+ downloadPairForStorageFile(storageFileIdOrKey) {
85
+ return this.downloadPairForStorageFileUsingSource(storageFileIdOrKey, undefined);
86
+ }
87
+ /**
88
+ * Retrieves the download URL for the StorageFile using the default parameters and pulled from the input source, if applicable.
89
+ *
90
+ * If no source is provided, uses the default internal source.
91
+ *
92
+ * These URLs are cached locally to prevent extra/redundant calls to the server.
93
+ *
94
+ * @param storageFileIdOrKey
95
+ * @returns
96
+ */
97
+ downloadPairForStorageFileUsingSource(storageFileIdOrKey, source) {
98
+ const storageFileId = firestoreModelId(storageFileIdOrKey);
99
+ const obs = this.getCachedDownloadPairForStorageFile(storageFileId).pipe(switchMap((cachedPair) => {
100
+ let result;
101
+ const downloadAndCacheResult = () => {
102
+ return from(this._createDownloadPairForStorageFileUsingSource(source, storageFileIdOrKey)).pipe(tap((downloadUrlPair) => {
103
+ this.addPairForStorageFileToCache(downloadUrlPair);
104
+ }));
105
+ };
106
+ if (cachedPair) {
107
+ result = of(cachedPair);
108
+ }
109
+ else {
110
+ result = downloadAndCacheResult();
111
+ }
112
+ return result;
113
+ }), first(), shareReplay(1));
114
+ return obs;
115
+ }
116
+ /**
117
+ * Adds the given download URL pair to the cache.
118
+ */
119
+ addPairForStorageFileToCache(downloadUrlPair) {
120
+ this.storageFileDownloadStorage.addDownloadUrl(downloadUrlPair).pipe(first()).subscribe();
121
+ }
122
+ /**
123
+ * Creates a new download URL for the StorageFile.
124
+ *
125
+ * @param storageFileIdOrKey
126
+ * @param inputParams
127
+ * @returns
128
+ */
129
+ createDownloadPairForStorageFile(storageFileIdOrKey, inputParams) {
130
+ return this._createDownloadPairForStorageFileUsingSource(undefined, storageFileIdOrKey, inputParams);
131
+ }
132
+ _createDownloadPairForStorageFileUsingSource(inputSource, storageFileIdOrKey, inputParams) {
133
+ const source = inputSource ?? {
134
+ downloadStorageFileResult: (params) => this.storageFileFunctions.storageFile.readStorageFile.download(params)
135
+ };
136
+ const storageFileId = firestoreModelId(storageFileIdOrKey);
137
+ const expiresAt = inputParams?.expiresAt ?? addMilliseconds(new Date(), this._expiresAfterTime);
138
+ const params = {
139
+ ...inputParams,
140
+ expiresAt,
141
+ key: firestoreModelKey(storageFileIdentity, storageFileId)
142
+ };
143
+ return source.downloadStorageFileResult(params, storageFileId).then((x) => {
144
+ return {
145
+ id: storageFileId,
146
+ downloadUrl: x.url,
147
+ mimeType: x.mimeType,
148
+ expiresAt: x.expiresAt ?? unixDateTimeSecondsNumberFromDate(expiresAt)
149
+ };
150
+ });
151
+ }
152
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
153
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService });
154
+ }
155
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DbxFirebaseStorageFileDownloadService, decorators: [{
156
+ type: Injectable
157
+ }] });
158
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcmFnZWZpbGUuZG93bmxvYWQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2RieC1maXJlYmFzZS9zcmMvbGliL21vZHVsZXMvc3RvcmFnZWZpbGUvc2VydmljZS9zdG9yYWdlZmlsZS5kb3dubG9hZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxvQkFBb0IsRUFBNEQsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsbUJBQW1CLEVBQTZCLE1BQU0sbUJBQW1CLENBQUM7QUFDeE0sT0FBTyxFQUFFLGVBQWUsRUFBdUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQVcsaUJBQWlCLEVBQUUsK0JBQStCLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMU0sT0FBTyxFQUFFLHFDQUFxQyxFQUF5QyxNQUFNLHdDQUF3QyxDQUFDO0FBQ3RJLE9BQU8sRUFBRSxLQUFLLEVBQUUsY0FBYyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsR0FBRyxFQUFjLEVBQUUsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDMUgsT0FBTyxFQUFnQiwrQkFBK0IsRUFBRSw2QkFBNkIsRUFBRSxNQUFNLGVBQWUsQ0FBQzs7QUFpQjdHLE1BQU0sVUFBVSx3REFBd0QsQ0FBQyxXQUFxSTtJQUM1TSxPQUFPO1FBQ0wseUJBQXlCLEVBQUUsQ0FBQyxNQUFpQyxFQUFFLGFBQTRCLEVBQUUsRUFBRSxDQUFDLGNBQWMsQ0FBQyxXQUFXLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQywrQkFBK0IsRUFBRSxFQUFFLDZCQUE2QixFQUFFLENBQUMsQ0FBdUM7S0FDbFEsQ0FB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QUFxRSxFQUFFLGtCQUFrRCxFQUFFLFdBQW9EO1FBQ2xPLE1BQU0sTUFBTSxHQUFHLFdBQVcsSUFBSTtZQUM1Qix5QkFBeUIsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztTQUM5RyxDQUFDO1FBRUYsTUFBTSxhQUFhLEdBQUcsZ0JBQWdCLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUMzRCxNQUFNLFNBQVMsR0FBRyxXQUFXLEVBQUUsU0FBUyxJQUFJLGVBQWUsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRWhHLE1BQU0sTUFBTSxHQUE4QjtZQUN4QyxHQUFHLFdBQVc7WUFDZCxTQUFTO1lBQ1QsR0FBRyxFQUFFLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLGFBQWEsQ0FBQztTQUMzRCxDQUFDO1FBRUYsT0FBTyxNQUFNLENBQUMseUJBQXlCLENBQUMsTUFBTSxFQUFFLGFBQWEsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFO1lBQ3hFLE9BQU87Z0JBQ0wsRUFBRSxFQUFFLGFBQWE7Z0JBQ2pCLFdBQVcsRUFBRSxDQUFDLENBQUMsR0FBRztnQkFDbEIsUUFBUSxFQUFFLENBQUMsQ0FBQyxRQUFRO2dCQUNwQixTQUFTLEVBQUUsQ0FBQyxDQUFDLFNBQVMsSUFBSSxpQ0FBaUMsQ0FBQyxTQUFTLENBQUM7YUFDdkUsQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0F0S1UscUNBQXFDOzRHQUFyQyxxQ0FBcUM7OzRGQUFyQyxxQ0FBcUM7a0JBRGpELFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN0b3JhZ2VGaWxlRnVuY3Rpb25zLCBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCBTdG9yYWdlRmlsZUtleSwgU3RvcmFnZUZpbGVJZCwgZmlyZXN0b3JlTW9kZWxJZCwgZmlyZXN0b3JlTW9kZWxLZXksIHN0b3JhZ2VGaWxlSWRlbnRpdHksIERvd25sb2FkU3RvcmFnZUZpbGVSZXN1bHQgfSBmcm9tICdAZGVyZWVrYi9maXJlYmFzZSc7XG5pbXBvcnQgeyBhZGRNaWxsaXNlY29uZHMsIE1heWJlLCBNaWxsaXNlY29uZHMsIE1TX0lOX0RBWSwgTVNfSU5fSE9VUiwgTVNfSU5fTUlOVVRFLCBTZWNvbmRzLCBTRUNPTkRTX0lOX01JTlVURSwgdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZvck5vdywgdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZyb21EYXRlIH0gZnJvbSAnQGRlcmVla2IvdXRpbCc7XG5pbXBvcnQgeyBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlLCBEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyIH0gZnJvbSAnLi9zdG9yYWdlZmlsZS5kb3dubG9hZC5zdG9yYWdlLnNlcnZpY2UnO1xuaW1wb3J0IHsgZmlyc3QsIGZpcnN0VmFsdWVGcm9tLCBmcm9tLCBpbnRlcnZhbCwgbWFwLCBPYnNlcnZhYmxlLCBvZiwgc2hhcmVSZXBsYXksIHN0YXJ0V2l0aCwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IExvYWRpbmdTdGF0ZSwgdGhyb3dFcnJvckZyb21Mb2FkaW5nU3RhdGVFcnJvciwgdmFsdWVGcm9tRmluaXNoZWRMb2FkaW5nU3RhdGUgfSBmcm9tICdAZGVyZWVrYi9yeGpzJztcblxuZXhwb3J0IHR5cGUgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZURvd25sb2FkRnVuY3Rpb24gPSAocGFyYW1zOiBEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCBzdG9yYWdlRmlsZUlkOiBTdG9yYWdlRmlsZUlkKSA9PiBQcm9taXNlPERvd25sb2FkU3RvcmFnZUZpbGVSZXN1bHQ+O1xuXG4vKipcbiAqIFVzZWQgYXMgYSBjdXN0b20gc291cmNlIGZvciBkb3dubG9hZGluZyBTdG9yYWdlRmlsZXMuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB7XG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGRvd25sb2FkIHJlc3VsdCBmb3IgdGhlIFN0b3JhZ2VGaWxlIHVzaW5nIHRoZSBpbnB1dCBwYXJhbWV0ZXJzLlxuICAgKlxuICAgKiBAcGFyYW0gc3RvcmFnZUZpbGVJZFxuICAgKiBAcmV0dXJuc1xuICAgKi9cbiAgZG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdDogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZURvd25sb2FkRnVuY3Rpb247XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBkYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlQ3VzdG9tU291cmNlRnJvbU9icyhvYnNGb3JJbnB1dDogKHBhcmFtczogRG93bmxvYWRTdG9yYWdlRmlsZVBhcmFtcywgc3RvcmFnZUZpbGVJZDogU3RvcmFnZUZpbGVJZCkgPT4gT2JzZXJ2YWJsZTxMb2FkaW5nU3RhdGU8RG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdD4+KTogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkU2VydmljZUN1c3RvbVNvdXJjZSB7XG4gIHJldHVybiB7XG4gICAgZG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdDogKHBhcmFtczogRG93bmxvYWRTdG9yYWdlRmlsZVBhcmFtcywgc3RvcmFnZUZpbGVJZDogU3RvcmFnZUZpbGVJZCkgPT4gZmlyc3RWYWx1ZUZyb20ob2JzRm9ySW5wdXQocGFyYW1zLCBzdG9yYWdlRmlsZUlkKS5waXBlKHRocm93RXJyb3JGcm9tTG9hZGluZ1N0YXRlRXJyb3IoKSwgdmFsdWVGcm9tRmluaXNoZWRMb2FkaW5nU3RhdGUoKSkpIGFzIFByb21pc2U8RG93bmxvYWRTdG9yYWdlRmlsZVJlc3VsdD5cbiAgfTtcbn1cblxuLyoqXG4gKiBTZXJ2aWNlIHVzZWQgZm9yIHJldHJpZXZpbmcgZG93bmxvYWQgbGlua3MgZm9yIFN0b3JhZ2VGaWxlcy5cbiAqL1xuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2Uge1xuICAvKipcbiAgICogRXhwaXJhdGlvbiBkdXJhdGlvbiBmb3IgY2FjaGVkIGRvd25sb2FkIFVSTHMuXG4gICAqL1xuICBwcm90ZWN0ZWQgX2V4cGlyZXNBZnRlclRpbWU6IE1pbGxpc2Vjb25kcyA9IE1TX0lOX0hPVVIgKiAxMjtcblxuICAvKipcbiAgICogV2hlbiByZWFkaW5nIGNhY2hlZCB2YWx1ZXMsIHRoaXMgYnVmZmVyIGlzIGFkZGVkIHRvIHRoZSBleHBpcmF0aW9uIHRpbWUgdG8gcHJldmVudCB0aGUgVVJMIGZyb20gZXhwaXJpbmcgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZC5cbiAgICovXG4gIHByb3RlY3RlZCBfZXhwaXJlc0FmdGVyVGltZUJ1ZmZlcjogU2Vjb25kcyA9IFNFQ09ORFNfSU5fTUlOVVRFICogMTA7XG5cbiAgcmVhZG9ubHkgc3RvcmFnZUZpbGVGdW5jdGlvbnMgPSBpbmplY3QoU3RvcmFnZUZpbGVGdW5jdGlvbnMpO1xuICByZWFkb25seSBzdG9yYWdlRmlsZURvd25sb2FkU3RvcmFnZSA9IGluamVjdChEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTdG9yYWdlKTtcblxuICAvLyBNQVJLOiBDb25maWdcbiAgZ2V0RXhwaXJlc0FmdGVyVGltZSgpOiBudW1iZXIge1xuICAgIHJldHVybiB0aGlzLl9leHBpcmVzQWZ0ZXJUaW1lO1xuICB9XG5cbiAgc2V0RXhwaXJlc0FmdGVyVGltZShleHBpcmVzQWZ0ZXI6IG51bWJlcik6IHZvaWQge1xuICAgIGNvbnN0IG1heEFsbG93ZWQgPSBNU19JTl9EQVkgKiAyMDtcblxuICAgIGlmIChleHBpcmVzQWZ0ZXIgPiBtYXhBbGxvd2VkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGlyZXMgYWZ0ZXIgdGltZSBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIDIwIGRheXMuYCk7XG4gICAgfSBlbHNlIGlmIChleHBpcmVzQWZ0ZXIgPCBNU19JTl9IT1VSKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGlyZXMgYWZ0ZXIgdGltZSBjYW5ub3QgYmUgbGVzcyB0aGFuIDEgaG91ci5gKTtcbiAgICB9XG5cbiAgICB0aGlzLl9leHBpcmVzQWZ0ZXJUaW1lID0gZXhwaXJlc0FmdGVyO1xuICB9XG5cbiAgLy8gTUFSSzogRG93bmxvYWRcbiAgLyoqXG4gICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IHJldHVybnMgdGhlIGNhY2hlZCBkb3dubG9hZCBVUkwgcGFpciBmb3IgdGhlIFN0b3JhZ2VGaWxlLCBhbmQgZW1pdHMgbnVsbCBvbmNlIGl0IGV4cGlyZXMuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5KTogT2JzZXJ2YWJsZTxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPj4ge1xuICAgIGNvbnN0IHN0b3JhZ2VGaWxlSWQgPSBmaXJlc3RvcmVNb2RlbElkKHN0b3JhZ2VGaWxlSWRPcktleSk7XG4gICAgcmV0dXJuIHRoaXMuc3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UuZ2V0RG93bmxvYWRVcmxQYWlyKHN0b3JhZ2VGaWxlSWQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKHBhaXIpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPj47XG5cbiAgICAgICAgaWYgKHBhaXIpIHtcbiAgICAgICAgICBjb25zdCBleHBpcmVzQXQgPSBwYWlyLmV4cGlyZXNBdCAtIHRoaXMuX2V4cGlyZXNBZnRlclRpbWVCdWZmZXI7XG5cbiAgICAgICAgICBmdW5jdGlvbiBwYWlySWZOb3RFeHBpcmVkKCk6IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHVuaXhEYXRlVGltZVNlY29uZHNOdW1iZXJGb3JOb3coKTtcbiAgICAgICAgICAgIGNvbnN0IGlzRXhwaXJlZCA9IG5vdyA+IGV4cGlyZXNBdDtcbiAgICAgICAgICAgIHJldHVybiBpc0V4cGlyZWQgPyBudWxsIDogcGFpcjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBpbml0aWFsUGFpciA9IHBhaXJJZk5vdEV4cGlyZWQoKTtcblxuICAgICAgICAgIGlmIChpbml0aWFsUGFpcikge1xuICAgICAgICAgICAgLy8gZXZlcnkgbWludXRlIGVtaXQgdGhlIHJlc3VsdCBhZ2FpblxuICAgICAgICAgICAgcmVzdWx0ID0gaW50ZXJ2YWwoTVNfSU5fTUlOVVRFKS5waXBlKFxuICAgICAgICAgICAgICBtYXAocGFpcklmTm90RXhwaXJlZCksXG4gICAgICAgICAgICAgIGZpcnN0KCh4KSA9PiB4ID09IG51bGwpLCAvLyBvbmx5IGVtaXQgdGhlIGZpcnN0IG51bGwgdmFsdWVcbiAgICAgICAgICAgICAgc3RhcnRXaXRoKGluaXRpYWxQYWlyKSwgLy8gc2VuZCB0aGUgaW5pdGlhbCB2YWx1ZSBmaXJzdFxuICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gb2YobnVsbCk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJlc3VsdCA9IG9mKG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGRvd25sb2FkIFVSTCBmb3IgdGhlIFN0b3JhZ2VGaWxlIHVzaW5nIHRoZSBkZWZhdWx0IHBhcmFtZXRlcnMuXG4gICAqXG4gICAqIFRoZXNlIFVSTHMgYXJlIGNhY2hlZCBsb2NhbGx5IHRvIHByZXZlbnQgZXh0cmEvcmVkdW5kYW50IGNhbGxzIHRvIHRoZSBzZXJ2ZXIuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHJldHVybnNcbiAgICovXG4gIGRvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5KTogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPiB7XG4gICAgcmV0dXJuIHRoaXMuZG93bmxvYWRQYWlyRm9yU3RvcmFnZUZpbGVVc2luZ1NvdXJjZShzdG9yYWdlRmlsZUlkT3JLZXksIHVuZGVmaW5lZCk7XG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBkb3dubG9hZCBVUkwgZm9yIHRoZSBTdG9yYWdlRmlsZSB1c2luZyB0aGUgZGVmYXVsdCBwYXJhbWV0ZXJzIGFuZCBwdWxsZWQgZnJvbSB0aGUgaW5wdXQgc291cmNlLCBpZiBhcHBsaWNhYmxlLlxuICAgKlxuICAgKiBJZiBubyBzb3VyY2UgaXMgcHJvdmlkZWQsIHVzZXMgdGhlIGRlZmF1bHQgaW50ZXJuYWwgc291cmNlLlxuICAgKlxuICAgKiBUaGVzZSBVUkxzIGFyZSBjYWNoZWQgbG9jYWxseSB0byBwcmV2ZW50IGV4dHJhL3JlZHVuZGFudCBjYWxscyB0byB0aGUgc2VydmVyLlxuICAgKlxuICAgKiBAcGFyYW0gc3RvcmFnZUZpbGVJZE9yS2V5XG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBkb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKHN0b3JhZ2VGaWxlSWRPcktleTogU3RvcmFnZUZpbGVJZCB8IFN0b3JhZ2VGaWxlS2V5LCBzb3VyY2U6IE1heWJlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFNlcnZpY2VDdXN0b21Tb3VyY2U+KTogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPiB7XG4gICAgY29uc3Qgc3RvcmFnZUZpbGVJZCA9IGZpcmVzdG9yZU1vZGVsSWQoc3RvcmFnZUZpbGVJZE9yS2V5KTtcbiAgICBjb25zdCBvYnM6IE9ic2VydmFibGU8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcj4gPSB0aGlzLmdldENhY2hlZERvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlKHN0b3JhZ2VGaWxlSWQpLnBpcGUoXG4gICAgICBzd2l0Y2hNYXAoKGNhY2hlZFBhaXIpID0+IHtcbiAgICAgICAgbGV0IHJlc3VsdDogT2JzZXJ2YWJsZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRVcmxQYWlyPjtcblxuICAgICAgICBjb25zdCBkb3dubG9hZEFuZENhY2hlUmVzdWx0ID0gKCkgPT4ge1xuICAgICAgICAgIHJldHVybiBmcm9tKHRoaXMuX2NyZWF0ZURvd25sb2FkUGFpckZvclN0b3JhZ2VGaWxlVXNpbmdTb3VyY2Uoc291cmNlLCBzdG9yYWdlRmlsZUlkT3JLZXkpKS5waXBlKFxuICAgICAgICAgICAgdGFwKChkb3dubG9hZFVybFBhaXIpID0+IHtcbiAgICAgICAgICAgICAgdGhpcy5hZGRQYWlyRm9yU3RvcmFnZUZpbGVUb0NhY2hlKGRvd25sb2FkVXJsUGFpcik7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGNhY2hlZFBhaXIpIHtcbiAgICAgICAgICByZXN1bHQgPSBvZihjYWNoZWRQYWlyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXN1bHQgPSBkb3dubG9hZEFuZENhY2hlUmVzdWx0KCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfSksXG4gICAgICBmaXJzdCgpLFxuICAgICAgc2hhcmVSZXBsYXkoMSlcbiAgICApO1xuXG4gICAgcmV0dXJuIG9icztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGRzIHRoZSBnaXZlbiBkb3dubG9hZCBVUkwgcGFpciB0byB0aGUgY2FjaGUuXG4gICAqL1xuICBhZGRQYWlyRm9yU3RvcmFnZUZpbGVUb0NhY2hlKGRvd25sb2FkVXJsUGFpcjogRGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcik6IHZvaWQge1xuICAgIHRoaXMuc3RvcmFnZUZpbGVEb3dubG9hZFN0b3JhZ2UuYWRkRG93bmxvYWRVcmwoZG93bmxvYWRVcmxQYWlyKS5waXBlKGZpcnN0KCkpLnN1YnNjcmliZSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgZG93bmxvYWQgVVJMIGZvciB0aGUgU3RvcmFnZUZpbGUuXG4gICAqXG4gICAqIEBwYXJhbSBzdG9yYWdlRmlsZUlkT3JLZXlcbiAgICogQHBhcmFtIGlucHV0UGFyYW1zXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBjcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZShzdG9yYWdlRmlsZUlkT3JLZXk6IFN0b3JhZ2VGaWxlSWQgfCBTdG9yYWdlRmlsZUtleSwgaW5wdXRQYXJhbXM/OiBPbWl0PERvd25sb2FkU3RvcmFnZUZpbGVQYXJhbXMsICdrZXknPik6IFByb21pc2U8RGJ4RmlyZWJhc2VTdG9yYWdlRmlsZURvd25sb2FkVXJsUGFpcj4ge1xuICAgIHJldHVybiB0aGlzLl9jcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKHVuZGVmaW5lZCwgc3RvcmFnZUZpbGVJZE9yS2V5LCBpbnB1dFBhcmFtcyk7XG4gIH1cblxuICBwcml2YXRlIF9jcmVhdGVEb3dubG9hZFBhaXJGb3JTdG9yYWdlRmlsZVVzaW5nU291cmNlKGlucHV0U291cmNlOiBNYXliZTxEYnhGaXJlYmFzZVN0b3JhZ2VGaWxlRG93bmxvYWRTZXJ2aWNlQ3VzdG9tU291cmNlPiwgc3RvcmFnZUZpbGVJZE9yS2V5OiBTdG9yYWdlRmlsZUlkIHwgU3RvcmFnZUZpbGVLZXksIGlucHV0UGFyYW1zPzogT21pdDxEb3dubG9hZFN0b3JhZ2VGaWxlUGFyYW1zLCAna2V5Jz4pOiBQcm9taXNlPERieEZpcmViYXNlU3RvcmFnZUZpbGVEb3dubG9hZFVybFBhaXI+IHtcbiAgICBjb25zdCBzb3VyY2UgPSBpbnB1dFNvdXJjZSA/PyB7XG4gICAgICBkb3dubG9hZFN0b3JhZ2VGaWxlUmVzdWx0OiAocGFyYW1zKSA9PiB0aGlzLnN0b3JhZ2VGaWxlRnVuY3Rpb25zLnN0b3JhZ2VGaWxlLnJlYWRTdG9yYWdlRmlsZS5kb3dubG9hZChwYXJhbXMpXG4gICAgfTtcblxuICAgIGNvbnN0IHN0b3JhZ2VGaWxlSWQgPSBmaXJlc3RvcmVNb2RlbElkKHN0b3JhZ2VGaWxlSWRPcktleSk7XG4gICAgY29uc3QgZXhwaXJlc0F0ID0gaW5wdXRQYXJhbXM/LmV4cGlyZXNBdCA/PyBhZGRNaWxsaXNlY29uZHMobmV3IERhdGUoKSwgdGhpcy5fZXhwaXJlc0FmdGVyVGltZSk7XG5cbiAgICBjb25zdCBwYXJhbXM6IERvd25sb2FkU3RvcmFnZUZpbGVQYXJhbXMgPSB7XG4gICAgICAuLi5pbnB1dFBhcmFtcyxcbiAgICAgIGV4cGlyZXNBdCxcbiAgICAgIGtleTogZmlyZXN0b3JlTW9kZWxLZXkoc3RvcmFnZUZpbGVJZGVudGl0eSwgc3RvcmFnZUZpbGVJZClcbiAgICB9O1xuXG4gICAgcmV0dXJuIHNvdXJjZS5kb3dubG9hZFN0b3JhZ2VGaWxlUmVzdWx0KHBhcmFtcywgc3RvcmFnZUZpbGVJZCkudGhlbigoeCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgaWQ6IHN0b3JhZ2VGaWxlSWQsXG4gICAgICAgIGRvd25sb2FkVXJsOiB4LnVybCxcbiAgICAgICAgbWltZVR5cGU6IHgubWltZVR5cGUsXG4gICAgICAgIGV4cGlyZXNBdDogeC5leHBpcmVzQXQgPz8gdW5peERhdGVUaW1lU2Vjb25kc051bWJlckZyb21EYXRlKGV4cGlyZXNBdClcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==