@lifeready/core 9.0.8 → 10.0.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/fesm2022/lifeready-core.mjs +10522 -0
- package/fesm2022/lifeready-core.mjs.map +1 -0
- package/package.json +21 -16
- package/types/lifeready-core.d.ts +5329 -0
- package/bundles/lifeready-core.umd.js +0 -13231
- package/bundles/lifeready-core.umd.js.map +0 -1
- package/bundles/lifeready-core.umd.min.js +0 -2
- package/bundles/lifeready-core.umd.min.js.map +0 -1
- package/esm2015/lib/_common/ast.js +0 -41
- package/esm2015/lib/_common/deferred-promise.js +0 -24
- package/esm2015/lib/_common/exceptions.js +0 -186
- package/esm2015/lib/_common/index.js +0 -3
- package/esm2015/lib/_common/kc-lodash.js +0 -11
- package/esm2015/lib/_common/key.js +0 -28
- package/esm2015/lib/_common/queries.gql.js +0 -43
- package/esm2015/lib/_common/run-outside-angular.js +0 -80
- package/esm2015/lib/_common/storage.js +0 -28
- package/esm2015/lib/_common/types.js +0 -2
- package/esm2015/lib/_common/utils.js +0 -73
- package/esm2015/lib/api/lr-apollo.service.js +0 -47
- package/esm2015/lib/api/lr-graphql/index.js +0 -6
- package/esm2015/lib/api/lr-graphql/lr-graphql.service.js +0 -170
- package/esm2015/lib/api/lr-graphql/lr-merged-mutation.js +0 -216
- package/esm2015/lib/api/lr-graphql/lr-mutation-base.js +0 -51
- package/esm2015/lib/api/lr-graphql/lr-mutation.js +0 -91
- package/esm2015/lib/api/lr-graphql/lr.service.js +0 -18
- package/esm2015/lib/api/query-processor/common-processors.service.js +0 -94
- package/esm2015/lib/api/query-processor/index.js +0 -3
- package/esm2015/lib/api/query-processor/query-processor.service.js +0 -307
- package/esm2015/lib/api/query-processor/tp-password-reset-processor.service.js +0 -110
- package/esm2015/lib/api/types/graphql.types.js +0 -8
- package/esm2015/lib/api/types/index.js +0 -3
- package/esm2015/lib/api/types/lr-graphql.types.js +0 -182
- package/esm2015/lib/auth/auth.config.js +0 -57
- package/esm2015/lib/auth/auth.gql.private.js +0 -85
- package/esm2015/lib/auth/auth.service.js +0 -616
- package/esm2015/lib/auth/auth.types.js +0 -19
- package/esm2015/lib/contact-card/contact-card.gql.js +0 -79
- package/esm2015/lib/contact-card/contact-card.service.js +0 -156
- package/esm2015/lib/contact-card/contact-card2.gql.js +0 -29
- package/esm2015/lib/contact-card/contact-card2.service.js +0 -103
- package/esm2015/lib/encryption/encryption.service.js +0 -188
- package/esm2015/lib/file-upload/file-upload.service.js +0 -70
- package/esm2015/lib/file-upload/file-upload.types.js +0 -2
- package/esm2015/lib/idle/idle.service.js +0 -159
- package/esm2015/lib/idle/idle.types.js +0 -7
- package/esm2015/lib/item/item.gql.js +0 -166
- package/esm2015/lib/item/item.gql.private.js +0 -41
- package/esm2015/lib/item/item.service.js +0 -662
- package/esm2015/lib/item/item.types.js +0 -2
- package/esm2015/lib/key/key-factory.service.js +0 -226
- package/esm2015/lib/key/key-graph.service.js +0 -314
- package/esm2015/lib/key/key-meta.service.js +0 -153
- package/esm2015/lib/key/key.service.js +0 -124
- package/esm2015/lib/key/key.types.js +0 -16
- package/esm2015/lib/key-exchange/key-exchange.gql.js +0 -174
- package/esm2015/lib/key-exchange/key-exchange.service.js +0 -496
- package/esm2015/lib/lbop/lbop.service.js +0 -351
- package/esm2015/lib/life-ready.config.js +0 -96
- package/esm2015/lib/life-ready.module.js +0 -42
- package/esm2015/lib/lock/lock.gql.js +0 -40
- package/esm2015/lib/lock/lock.service.js +0 -64
- package/esm2015/lib/notification/notification.gql.js +0 -43
- package/esm2015/lib/notification/notification.service.js +0 -118
- package/esm2015/lib/password/password.gql.js +0 -28
- package/esm2015/lib/password/password.service.js +0 -309
- package/esm2015/lib/persist/persist.service.js +0 -181
- package/esm2015/lib/plan/plan.gql.js +0 -91
- package/esm2015/lib/plan/plan.service.js +0 -191
- package/esm2015/lib/plan/plan.types.js +0 -2
- package/esm2015/lib/profile/profile-details.service.js +0 -261
- package/esm2015/lib/profile/profile.gql.js +0 -170
- package/esm2015/lib/profile/profile.service.js +0 -166
- package/esm2015/lib/profile/profile.types.js +0 -45
- package/esm2015/lib/register/register.service.js +0 -173
- package/esm2015/lib/register/register.types.js +0 -3
- package/esm2015/lib/reminder/reminder.gql.js +0 -27
- package/esm2015/lib/reminder/reminder.service.js +0 -85
- package/esm2015/lib/reminder/reminder.types.js +0 -2
- package/esm2015/lib/scenario/scenario.constants.js +0 -2
- package/esm2015/lib/scenario/scenario.controller.js +0 -34
- package/esm2015/lib/scenario/scenario.gql.js +0 -90
- package/esm2015/lib/scenario/scenario.private.gql.js +0 -200
- package/esm2015/lib/scenario/scenario.service.js +0 -679
- package/esm2015/lib/scenario/scenario.types.js +0 -2
- package/esm2015/lib/server-config/server-config.gql.js +0 -9
- package/esm2015/lib/server-config/server-config.service.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card.service.js +0 -119
- package/esm2015/lib/shared-contact-card/shared-contact-card2.gql.js +0 -41
- package/esm2015/lib/shared-contact-card/shared-contact-card2.service.js +0 -117
- package/esm2015/lib/slip39/slip39.service.js +0 -167
- package/esm2015/lib/time/time.service.js +0 -152
- package/esm2015/lib/tp-assembly/tp-assembly.js +0 -363
- package/esm2015/lib/tp-assembly/tp-assembly.private.gql.js +0 -22
- package/esm2015/lib/tp-assembly/tp-assembly.types.js +0 -2
- package/esm2015/lib/tp-password-reset/tp-password-reset-request.service.js +0 -98
- package/esm2015/lib/tp-password-reset/tp-password-reset-user.service.js +0 -121
- package/esm2015/lib/tp-password-reset/tp-password-reset.constants.js +0 -4
- package/esm2015/lib/tp-password-reset/tp-password-reset.controller.js +0 -34
- package/esm2015/lib/tp-password-reset/tp-password-reset.gql.js +0 -74
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.gql.js +0 -166
- package/esm2015/lib/tp-password-reset/tp-password-reset.private.service.js +0 -54
- package/esm2015/lib/tp-password-reset/tp-password-reset.service.js +0 -110
- package/esm2015/lib/tp-password-reset/tp-password-reset.types.js +0 -2
- package/esm2015/lib/trusted-party/trusted-party.gql.js +0 -96
- package/esm2015/lib/trusted-party/trusted-party.gql.private.js +0 -51
- package/esm2015/lib/trusted-party/trusted-party.service.js +0 -461
- package/esm2015/lib/trusted-party/trusted-party.types.js +0 -2
- package/esm2015/lib/two-factor/two-factor.service.js +0 -74
- package/esm2015/lib/user/user.gql.js +0 -32
- package/esm2015/lib/user/user.service.js +0 -58
- package/esm2015/lib/user/user.types.js +0 -2
- package/esm2015/lib/web-crypto/web-crypto.service.js +0 -29
- package/esm2015/lifeready-core.js +0 -17
- package/esm2015/public-api.js +0 -60
- package/fesm2015/lifeready-core.js +0 -10970
- package/fesm2015/lifeready-core.js.map +0 -1
- package/lib/_common/ast.d.ts +0 -11
- package/lib/_common/deferred-promise.d.ts +0 -12
- package/lib/_common/exceptions.d.ts +0 -126
- package/lib/_common/index.d.ts +0 -2
- package/lib/_common/kc-lodash.d.ts +0 -5
- package/lib/_common/key.d.ts +0 -14
- package/lib/_common/queries.gql.d.ts +0 -4
- package/lib/_common/run-outside-angular.d.ts +0 -14
- package/lib/_common/storage.d.ts +0 -13
- package/lib/_common/types.d.ts +0 -15
- package/lib/_common/utils.d.ts +0 -12
- package/lib/api/lr-apollo.service.d.ts +0 -15
- package/lib/api/lr-graphql/index.d.ts +0 -5
- package/lib/api/lr-graphql/lr-graphql.service.d.ts +0 -81
- package/lib/api/lr-graphql/lr-merged-mutation.d.ts +0 -46
- package/lib/api/lr-graphql/lr-mutation-base.d.ts +0 -28
- package/lib/api/lr-graphql/lr-mutation.d.ts +0 -48
- package/lib/api/lr-graphql/lr.service.d.ts +0 -9
- package/lib/api/query-processor/common-processors.service.d.ts +0 -36
- package/lib/api/query-processor/index.d.ts +0 -2
- package/lib/api/query-processor/query-processor.service.d.ts +0 -18
- package/lib/api/query-processor/tp-password-reset-processor.service.d.ts +0 -15
- package/lib/api/types/graphql.types.d.ts +0 -30
- package/lib/api/types/index.d.ts +0 -2
- package/lib/api/types/lr-graphql.types.d.ts +0 -807
- package/lib/auth/auth.config.d.ts +0 -5
- package/lib/auth/auth.gql.private.d.ts +0 -25
- package/lib/auth/auth.service.d.ts +0 -72
- package/lib/auth/auth.types.d.ts +0 -70
- package/lib/contact-card/contact-card.gql.d.ts +0 -7
- package/lib/contact-card/contact-card.service.d.ts +0 -53
- package/lib/contact-card/contact-card2.gql.d.ts +0 -25
- package/lib/contact-card/contact-card2.service.d.ts +0 -64
- package/lib/encryption/encryption.service.d.ts +0 -42
- package/lib/file-upload/file-upload.service.d.ts +0 -15
- package/lib/file-upload/file-upload.types.d.ts +0 -5
- package/lib/idle/idle.service.d.ts +0 -47
- package/lib/idle/idle.types.d.ts +0 -10
- package/lib/item/item.gql.d.ts +0 -134
- package/lib/item/item.gql.private.d.ts +0 -35
- package/lib/item/item.service.d.ts +0 -201
- package/lib/item/item.types.d.ts +0 -95
- package/lib/key/key-factory.service.d.ts +0 -40
- package/lib/key/key-graph.service.d.ts +0 -41
- package/lib/key/key-meta.service.d.ts +0 -51
- package/lib/key/key.service.d.ts +0 -36
- package/lib/key/key.types.d.ts +0 -86
- package/lib/key-exchange/key-exchange.gql.d.ts +0 -141
- package/lib/key-exchange/key-exchange.service.d.ts +0 -179
- package/lib/lbop/lbop.service.d.ts +0 -99
- package/lib/life-ready.config.d.ts +0 -26
- package/lib/life-ready.module.d.ts +0 -5
- package/lib/lock/lock.gql.d.ts +0 -27
- package/lib/lock/lock.service.d.ts +0 -34
- package/lib/notification/notification.gql.d.ts +0 -37
- package/lib/notification/notification.service.d.ts +0 -64
- package/lib/password/password.gql.d.ts +0 -3
- package/lib/password/password.service.d.ts +0 -79
- package/lib/persist/persist.service.d.ts +0 -31
- package/lib/plan/plan.gql.d.ts +0 -69
- package/lib/plan/plan.service.d.ts +0 -111
- package/lib/plan/plan.types.d.ts +0 -16
- package/lib/profile/profile-details.service.d.ts +0 -20
- package/lib/profile/profile.gql.d.ts +0 -21
- package/lib/profile/profile.service.d.ts +0 -32
- package/lib/profile/profile.types.d.ts +0 -121
- package/lib/register/register.service.d.ts +0 -25
- package/lib/register/register.types.d.ts +0 -6
- package/lib/reminder/reminder.gql.d.ts +0 -23
- package/lib/reminder/reminder.service.d.ts +0 -33
- package/lib/reminder/reminder.types.d.ts +0 -17
- package/lib/scenario/scenario.constants.d.ts +0 -1
- package/lib/scenario/scenario.controller.d.ts +0 -10
- package/lib/scenario/scenario.gql.d.ts +0 -78
- package/lib/scenario/scenario.private.gql.d.ts +0 -16
- package/lib/scenario/scenario.service.d.ts +0 -655
- package/lib/scenario/scenario.types.d.ts +0 -64
- package/lib/server-config/server-config.gql.d.ts +0 -5
- package/lib/server-config/server-config.service.d.ts +0 -9
- package/lib/shared-contact-card/shared-contact-card.service.d.ts +0 -33
- package/lib/shared-contact-card/shared-contact-card2.gql.d.ts +0 -36
- package/lib/shared-contact-card/shared-contact-card2.service.d.ts +0 -45
- package/lib/slip39/slip39.service.d.ts +0 -42
- package/lib/time/time.service.d.ts +0 -26
- package/lib/tp-assembly/tp-assembly.d.ts +0 -177
- package/lib/tp-assembly/tp-assembly.private.gql.d.ts +0 -5
- package/lib/tp-assembly/tp-assembly.types.d.ts +0 -40
- package/lib/tp-password-reset/tp-password-reset-request.service.d.ts +0 -16
- package/lib/tp-password-reset/tp-password-reset-user.service.d.ts +0 -29
- package/lib/tp-password-reset/tp-password-reset.constants.d.ts +0 -3
- package/lib/tp-password-reset/tp-password-reset.controller.d.ts +0 -10
- package/lib/tp-password-reset/tp-password-reset.gql.d.ts +0 -63
- package/lib/tp-password-reset/tp-password-reset.private.gql.d.ts +0 -163
- package/lib/tp-password-reset/tp-password-reset.private.service.d.ts +0 -59
- package/lib/tp-password-reset/tp-password-reset.service.d.ts +0 -112
- package/lib/tp-password-reset/tp-password-reset.types.d.ts +0 -40
- package/lib/trusted-party/trusted-party.gql.d.ts +0 -85
- package/lib/trusted-party/trusted-party.gql.private.d.ts +0 -40
- package/lib/trusted-party/trusted-party.service.d.ts +0 -192
- package/lib/trusted-party/trusted-party.types.d.ts +0 -31
- package/lib/two-factor/two-factor.service.d.ts +0 -15
- package/lib/user/user.gql.d.ts +0 -8
- package/lib/user/user.service.d.ts +0 -9
- package/lib/user/user.types.d.ts +0 -16
- package/lib/web-crypto/web-crypto.service.d.ts +0 -5
- package/lifeready-core.d.ts +0 -16
- package/lifeready-core.metadata.json +0 -1
- package/public-api.d.ts +0 -56
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
import { __decorate } from "tslib";
|
|
2
|
-
import { Injectable, Injector, NgZone } from '@angular/core';
|
|
3
|
-
import { LrMutation, LrService } from '../api/lr-graphql';
|
|
4
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
5
|
-
import { AcquireLockMutation, ReleaseLockMutation, UpdateLockMutation, } from './lock.gql';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
let LockService = class LockService extends LrService {
|
|
8
|
-
constructor(ngZone, injector) {
|
|
9
|
-
super(injector);
|
|
10
|
-
this.ngZone = ngZone;
|
|
11
|
-
this.injector = injector;
|
|
12
|
-
}
|
|
13
|
-
// Updating the lock version is always to be down along with another mutation.
|
|
14
|
-
updateLockMutation(options) {
|
|
15
|
-
return new LrMutation({
|
|
16
|
-
mutation: UpdateLockMutation,
|
|
17
|
-
variables: {
|
|
18
|
-
input: {
|
|
19
|
-
resourceId: options.resourceId,
|
|
20
|
-
version: options.version,
|
|
21
|
-
},
|
|
22
|
-
},
|
|
23
|
-
});
|
|
24
|
-
}
|
|
25
|
-
acquireLockMutation(options) {
|
|
26
|
-
return new LrMutation({
|
|
27
|
-
mutation: AcquireLockMutation,
|
|
28
|
-
variables: {
|
|
29
|
-
input: {
|
|
30
|
-
resourceId: options.resourceId,
|
|
31
|
-
timeoutMs: options.timeoutMs,
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
releaseLockMutation(options) {
|
|
37
|
-
return new LrMutation({
|
|
38
|
-
mutation: ReleaseLockMutation,
|
|
39
|
-
variables: {
|
|
40
|
-
input: {
|
|
41
|
-
resourceId: options.resourceId,
|
|
42
|
-
version: options.version,
|
|
43
|
-
},
|
|
44
|
-
},
|
|
45
|
-
});
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
LockService.ɵprov = i0.ɵɵdefineInjectable({ factory: function LockService_Factory() { return new LockService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR)); }, token: LockService, providedIn: "root" });
|
|
49
|
-
LockService.decorators = [
|
|
50
|
-
{ type: Injectable, args: [{
|
|
51
|
-
providedIn: 'root',
|
|
52
|
-
},] }
|
|
53
|
-
];
|
|
54
|
-
LockService.ctorParameters = () => [
|
|
55
|
-
{ type: NgZone },
|
|
56
|
-
{ type: Injector }
|
|
57
|
-
];
|
|
58
|
-
LockService = __decorate([
|
|
59
|
-
RunOutsideAngular({
|
|
60
|
-
ngZoneName: 'ngZone',
|
|
61
|
-
})
|
|
62
|
-
], LockService);
|
|
63
|
-
export { LockService };
|
|
64
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jay5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL2xvY2svbG9jay5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUMxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsbUJBQW1CLEVBQ25CLG1CQUFtQixFQUNuQixrQkFBa0IsR0FDbkIsTUFBTSxZQUFZLENBQUM7O0lBUVAsV0FBVyxTQUFYLFdBQVksU0FBUSxTQUFTO0lBQ3hDLFlBQW9CLE1BQWMsRUFBVSxRQUFrQjtRQUM1RCxLQUFLLENBQUMsUUFBUSxDQUFDLENBQUM7UUFERSxXQUFNLEdBQU4sTUFBTSxDQUFRO1FBQVUsYUFBUSxHQUFSLFFBQVEsQ0FBVTtJQUU5RCxDQUFDO0lBRUQsOEVBQThFO0lBQzlFLGtCQUFrQixDQUFDLE9BQWlEO1FBQ2xFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLGtCQUFrQjtZQUM1QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQW1EO1FBQ3JFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO2lCQUM3QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELG1CQUFtQixDQUFDLE9BQWdEO1FBQ2xFLE9BQU8sSUFBSSxVQUFVLENBQUM7WUFDcEIsUUFBUSxFQUFFLG1CQUFtQjtZQUM3QixTQUFTLEVBQUU7Z0JBQ1QsS0FBSyxFQUFFO29CQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTtvQkFDOUIsT0FBTyxFQUFFLE9BQU8sQ0FBQyxPQUFPO2lCQUN6QjthQUNGO1NBQ0YsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGLENBQUE7OztZQTVDQSxVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7OztZQWQ4QixNQUFNO1lBQWhCLFFBQVE7O0FBZWhCLFdBQVc7SUFOdkIsaUJBQWlCLENBQUM7UUFDakIsVUFBVSxFQUFFLFFBQVE7S0FDckIsQ0FBQztHQUlXLFdBQVcsQ0F5Q3ZCO1NBekNZLFdBQVciLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQgeyBSdW5PdXRzaWRlQW5ndWxhciB9IGZyb20gJy4uL19jb21tb24vcnVuLW91dHNpZGUtYW5ndWxhcic7XG5pbXBvcnQge1xuICBBY3F1aXJlTG9ja011dGF0aW9uLFxuICBSZWxlYXNlTG9ja011dGF0aW9uLFxuICBVcGRhdGVMb2NrTXV0YXRpb24sXG59IGZyb20gJy4vbG9jay5ncWwnO1xuXG5AUnVuT3V0c2lkZUFuZ3VsYXIoe1xuICBuZ1pvbmVOYW1lOiAnbmdab25lJyxcbn0pXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgTG9ja1NlcnZpY2UgZXh0ZW5kcyBMclNlcnZpY2Uge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIG5nWm9uZTogTmdab25lLCBwcml2YXRlIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKGluamVjdG9yKTtcbiAgfVxuXG4gIC8vIFVwZGF0aW5nIHRoZSBsb2NrIHZlcnNpb24gaXMgYWx3YXlzIHRvIGJlIGRvd24gYWxvbmcgd2l0aCBhbm90aGVyIG11dGF0aW9uLlxuICB1cGRhdGVMb2NrTXV0YXRpb24ob3B0aW9uczogeyByZXNvdXJjZUlkPzogc3RyaW5nOyB2ZXJzaW9uOiBzdHJpbmcgfSkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlTG9ja011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVzb3VyY2VJZDogb3B0aW9ucy5yZXNvdXJjZUlkLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhY3F1aXJlTG9ja011dGF0aW9uKG9wdGlvbnM6IHsgcmVzb3VyY2VJZD86IHN0cmluZzsgdGltZW91dE1zOiBudW1iZXIgfSkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogQWNxdWlyZUxvY2tNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHJlc291cmNlSWQ6IG9wdGlvbnMucmVzb3VyY2VJZCxcbiAgICAgICAgICB0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIHJlbGVhc2VMb2NrTXV0YXRpb24ob3B0aW9uczogeyByZXNvdXJjZUlkOiBzdHJpbmc7IHZlcnNpb246IHN0cmluZyB9KSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBSZWxlYXNlTG9ja011dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVzb3VyY2VJZDogb3B0aW9ucy5yZXNvdXJjZUlkLFxuICAgICAgICAgIHZlcnNpb246IG9wdGlvbnMudmVyc2lvbixcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cbn1cbiJdfQ==
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { gqlTyped } from '../_common/ast';
|
|
2
|
-
export const UpdateNotificationMutation = gqlTyped `
|
|
3
|
-
mutation UpdateNotificationMutation($input: UpdateNotificationInput!) {
|
|
4
|
-
updateNotification(input: $input) {
|
|
5
|
-
notification {
|
|
6
|
-
id
|
|
7
|
-
}
|
|
8
|
-
}
|
|
9
|
-
}
|
|
10
|
-
`;
|
|
11
|
-
export const UpdateAllNotificationsReadStateMutation = gqlTyped `
|
|
12
|
-
mutation UpdateAllNotificationsReadStateMutation($input: UpdateAllNotificationsReadStateInput!) {
|
|
13
|
-
updateAllNotificationsReadState(input: $input) {
|
|
14
|
-
count
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
`;
|
|
18
|
-
export const DebugCreateNotificationMutation = gqlTyped `
|
|
19
|
-
mutation DebugCreateNotificationMutation($input: DebugCreateNotificationInput!) {
|
|
20
|
-
debugCreateNotification(input: $input) {
|
|
21
|
-
notification {
|
|
22
|
-
id
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
`;
|
|
27
|
-
export const DebugDeleteAllNotificationsMutation = gqlTyped `
|
|
28
|
-
mutation DebugDeleteAllNotificationsMutation($input: DebugDeleteAllNotificationsInput!) {
|
|
29
|
-
debugDeleteAllNotifications(input: $input) {
|
|
30
|
-
count
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
`;
|
|
34
|
-
export const UpdateNotificationFeatureStateMutation = gqlTyped `
|
|
35
|
-
mutation UpdateNotificationFeatureStateMutation($input: UpdateNotificationFeatureStateInput!) {
|
|
36
|
-
updateNotificationFeatureState(input: $input) {
|
|
37
|
-
featureState {
|
|
38
|
-
notificationsLastViewed
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
`;
|
|
43
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLmdxbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9ub3RpZmljYXRpb24vbm90aWZpY2F0aW9uLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFVMUMsTUFBTSxDQUFDLE1BQU0sMEJBQTBCLEdBQUcsUUFBUSxDQUFrQzs7Ozs7Ozs7Q0FRbkYsQ0FBQztBQU9GLE1BQU0sQ0FBQyxNQUFNLHVDQUF1QyxHQUFHLFFBQVEsQ0FBK0M7Ozs7OztDQU03RyxDQUFDO0FBU0YsTUFBTSxDQUFDLE1BQU0sK0JBQStCLEdBQUcsUUFBUSxDQUF1Qzs7Ozs7Ozs7Q0FRN0YsQ0FBQztBQU9GLE1BQU0sQ0FBQyxNQUFNLG1DQUFtQyxHQUFHLFFBQVEsQ0FBMkM7Ozs7OztDQU1yRyxDQUFDO0FBU0YsTUFBTSxDQUFDLE1BQU0sc0NBQXNDLEdBQUcsUUFBUSxDQUE4Qzs7Ozs7Ozs7Q0FRM0csQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGdxbFR5cGVkIH0gZnJvbSAnLi4vX2NvbW1vbi9hc3QnO1xuaW1wb3J0IHsgRGF0ZVRpbWUsIElEIH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvblJlc3VsdCB7XG4gIHVwZGF0ZU5vdGlmaWNhdGlvbjoge1xuICAgIG5vdGlmaWNhdGlvbjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgVXBkYXRlTm90aWZpY2F0aW9uTXV0YXRpb24gPSBncWxUeXBlZDxVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvblJlc3VsdD5gXG5tdXRhdGlvbiBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvbigkaW5wdXQ6IFVwZGF0ZU5vdGlmaWNhdGlvbklucHV0ISkge1xuICB1cGRhdGVOb3RpZmljYXRpb24oaW5wdXQ6ICRpbnB1dCkge1xuICAgIG5vdGlmaWNhdGlvbiB7XG4gICAgICBpZFxuICAgIH1cbiAgfVxufVxuYDtcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb25SZXN1bHQge1xuICB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlOiB7XG4gICAgY291bnQ6IG51bWJlcjtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24gPSBncWxUeXBlZDxVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU11dGF0aW9uKCRpbnB1dDogVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZUlucHV0ISkge1xuICB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlKGlucHV0OiAkaW5wdXQpIHtcbiAgICBjb3VudFxuICB9XG59XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb25SZXN1bHQge1xuICBkZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbjoge1xuICAgIG5vdGlmaWNhdGlvbjoge1xuICAgICAgaWQ6IElEO1xuICAgIH07XG4gIH07XG59XG5leHBvcnQgY29uc3QgRGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbiA9IGdxbFR5cGVkPERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gRGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbigkaW5wdXQ6IERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uSW5wdXQhKSB7XG4gIGRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uKGlucHV0OiAkaW5wdXQpIHtcbiAgICBub3RpZmljYXRpb24ge1xuICAgICAgaWRcbiAgICB9XG4gIH1cbn1cbmA7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb25SZXN1bHQge1xuICBkZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnM6IHtcbiAgICBjb3VudDogbnVtYmVyO1xuICB9O1xufVxuZXhwb3J0IGNvbnN0IERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uID0gZ3FsVHlwZWQ8RGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb25SZXN1bHQ+YFxubXV0YXRpb24gRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zTXV0YXRpb24oJGlucHV0OiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNJbnB1dCEpIHtcbiAgZGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zKGlucHV0OiAkaW5wdXQpIHtcbiAgICBjb3VudFxuICB9XG59XG5gO1xuXG5leHBvcnQgaW50ZXJmYWNlIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uUmVzdWx0IHtcbiAgdXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlOiB7XG4gICAgZmVhdHVyZVN0YXRlOiB7XG4gICAgICBub3RpZmljYXRpb25zTGFzdFZpZXdlZDogRGF0ZVRpbWU7XG4gICAgfTtcbiAgfTtcbn1cbmV4cG9ydCBjb25zdCBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbiA9IGdxbFR5cGVkPFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uUmVzdWx0PmBcbm11dGF0aW9uIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uKCRpbnB1dDogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlSW5wdXQhKSB7XG4gIHVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZShpbnB1dDogJGlucHV0KSB7XG4gICAgZmVhdHVyZVN0YXRlIHtcbiAgICAgIG5vdGlmaWNhdGlvbnNMYXN0Vmlld2VkXG5cdFx0fVxuICB9XG59XG5gO1xuIl19
|
|
@@ -1,118 +0,0 @@
|
|
|
1
|
-
import { __awaiter, __decorate } from "tslib";
|
|
2
|
-
import { Injectable, Injector, NgZone } from '@angular/core';
|
|
3
|
-
import { LrMutation, LrService } from '../api/lr-graphql';
|
|
4
|
-
import { RunOutsideAngular } from '../_common/run-outside-angular';
|
|
5
|
-
import { DebugCreateNotificationMutation, DebugDeleteAllNotificationsMutation, UpdateAllNotificationsReadStateMutation, UpdateNotificationFeatureStateMutation, UpdateNotificationMutation, } from './notification.gql';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
let NotificationService = class NotificationService extends LrService {
|
|
8
|
-
constructor(ngZone, injector) {
|
|
9
|
-
super(injector);
|
|
10
|
-
this.ngZone = ngZone;
|
|
11
|
-
this.injector = injector;
|
|
12
|
-
}
|
|
13
|
-
updateNotification(options) {
|
|
14
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
15
|
-
return this.mutate(this.updateNotificationMutation(options));
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
updateNotificationMutation(options) {
|
|
19
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
20
|
-
return new LrMutation({
|
|
21
|
-
mutation: UpdateNotificationMutation,
|
|
22
|
-
variables: {
|
|
23
|
-
input: Object.assign({}, options),
|
|
24
|
-
},
|
|
25
|
-
});
|
|
26
|
-
});
|
|
27
|
-
}
|
|
28
|
-
updateAllNotificationsReadState(options) {
|
|
29
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
30
|
-
return this.mutate(this.updateAllNotificationsReadStateMutation(options));
|
|
31
|
-
});
|
|
32
|
-
}
|
|
33
|
-
updateAllNotificationsReadStateMutation(options) {
|
|
34
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
-
return new LrMutation({
|
|
36
|
-
mutation: UpdateAllNotificationsReadStateMutation,
|
|
37
|
-
variables: {
|
|
38
|
-
input: Object.assign({}, options),
|
|
39
|
-
},
|
|
40
|
-
});
|
|
41
|
-
});
|
|
42
|
-
}
|
|
43
|
-
debugCreateNotification(options) {
|
|
44
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
45
|
-
return this.mutate(this.debugCreateNotificationMutation(options));
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
debugCreateNotificationMutation(options) {
|
|
49
|
-
var _a;
|
|
50
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
51
|
-
return new LrMutation({
|
|
52
|
-
mutation: DebugCreateNotificationMutation,
|
|
53
|
-
variables: {
|
|
54
|
-
input: {
|
|
55
|
-
receiverId: options.receiverId,
|
|
56
|
-
hasBeenRead: options.hasBeenRead,
|
|
57
|
-
timeRead: (_a = options.timeRead) === null || _a === void 0 ? void 0 : _a.toISOString(),
|
|
58
|
-
plainData: JSON.stringify(options.plainData),
|
|
59
|
-
plainMeta: JSON.stringify(options.plainMeta),
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
}
|
|
65
|
-
debugDeleteAllNotifications(options) {
|
|
66
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
67
|
-
return this.mutate(this.debugDeleteAllNotificationsMutation(options));
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
debugDeleteAllNotificationsMutation(options) {
|
|
71
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
72
|
-
return new LrMutation({
|
|
73
|
-
mutation: DebugDeleteAllNotificationsMutation,
|
|
74
|
-
variables: {
|
|
75
|
-
input: {
|
|
76
|
-
receiverId: options.receiverId,
|
|
77
|
-
},
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
});
|
|
81
|
-
}
|
|
82
|
-
updateNotificationFeatureState(options) {
|
|
83
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
84
|
-
return this.mutate(this.updateNotificationFeatureStateMutation(options));
|
|
85
|
-
});
|
|
86
|
-
}
|
|
87
|
-
updateNotificationFeatureStateMutation(options) {
|
|
88
|
-
var _a;
|
|
89
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
90
|
-
return new LrMutation({
|
|
91
|
-
mutation: UpdateNotificationFeatureStateMutation,
|
|
92
|
-
variables: {
|
|
93
|
-
input: {
|
|
94
|
-
lastViewed: (_a = options.lastViewed) === null || _a === void 0 ? void 0 : _a.toISOString(),
|
|
95
|
-
clearLastViewed: options.lastViewed == null || undefined,
|
|
96
|
-
},
|
|
97
|
-
},
|
|
98
|
-
});
|
|
99
|
-
});
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
NotificationService.ɵprov = i0.ɵɵdefineInjectable({ factory: function NotificationService_Factory() { return new NotificationService(i0.ɵɵinject(i0.NgZone), i0.ɵɵinject(i0.INJECTOR)); }, token: NotificationService, providedIn: "root" });
|
|
103
|
-
NotificationService.decorators = [
|
|
104
|
-
{ type: Injectable, args: [{
|
|
105
|
-
providedIn: 'root',
|
|
106
|
-
},] }
|
|
107
|
-
];
|
|
108
|
-
NotificationService.ctorParameters = () => [
|
|
109
|
-
{ type: NgZone },
|
|
110
|
-
{ type: Injector }
|
|
111
|
-
];
|
|
112
|
-
NotificationService = __decorate([
|
|
113
|
-
RunOutsideAngular({
|
|
114
|
-
ngZoneName: 'ngZone',
|
|
115
|
-
})
|
|
116
|
-
], NotificationService);
|
|
117
|
-
export { NotificationService };
|
|
118
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb3JlL3NyYy9saWIvbm90aWZpY2F0aW9uL25vdGlmaWNhdGlvbi5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDN0QsT0FBTyxFQUFFLFVBQVUsRUFBRSxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRSxPQUFPLEVBQ0wsK0JBQStCLEVBQy9CLG1DQUFtQyxFQUNuQyx1Q0FBdUMsRUFDdkMsc0NBQXNDLEVBQ3RDLDBCQUEwQixHQUMzQixNQUFNLG9CQUFvQixDQUFDOztJQWlDZixtQkFBbUIsU0FBbkIsbUJBQW9CLFNBQVEsU0FBUztJQUNoRCxZQUFvQixNQUFjLEVBQVUsUUFBa0I7UUFDNUQsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBREUsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLGFBQVEsR0FBUixRQUFRLENBQVU7SUFFOUQsQ0FBQztJQUVLLGtCQUFrQixDQUFDLE9BQWtDOztZQUN6RCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDL0QsQ0FBQztLQUFBO0lBRUssMEJBQTBCLENBQUMsT0FBa0M7O1lBQ2pFLE9BQU8sSUFBSSxVQUFVLENBQUM7Z0JBQ3BCLFFBQVEsRUFBRSwwQkFBMEI7Z0JBQ3BDLFNBQVMsRUFBRTtvQkFDVCxLQUFLLG9CQUNBLE9BQU8sQ0FDWDtpQkFDRjthQUNGLENBQUMsQ0FBQztRQUNMLENBQUM7S0FBQTtJQUVLLCtCQUErQixDQUNuQyxPQUErQzs7WUFFL0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQzVFLENBQUM7S0FBQTtJQUVLLHVDQUF1QyxDQUMzQyxPQUErQzs7WUFFL0MsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLHVDQUF1QztnQkFDakQsU0FBUyxFQUFFO29CQUNULEtBQUssb0JBQ0EsT0FBTyxDQUNYO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRUssdUJBQXVCLENBQUMsT0FBdUM7O1lBQ25FLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNwRSxDQUFDO0tBQUE7SUFFSywrQkFBK0IsQ0FDbkMsT0FBdUM7OztZQUV2QyxPQUFPLElBQUksVUFBVSxDQUFDO2dCQUNwQixRQUFRLEVBQUUsK0JBQStCO2dCQUN6QyxTQUFTLEVBQUU7b0JBQ1QsS0FBSyxFQUFFO3dCQUNMLFVBQVUsRUFBRSxPQUFPLENBQUMsVUFBVTt3QkFDOUIsV0FBVyxFQUFFLE9BQU8sQ0FBQyxXQUFXO3dCQUNoQyxRQUFRLFFBQUUsT0FBTyxDQUFDLFFBQVEsMENBQUUsV0FBVyxFQUFFO3dCQUN6QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO3dCQUM1QyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDO3FCQUM3QztpQkFDRjthQUNGLENBQUMsQ0FBQzs7S0FDSjtJQUVLLDJCQUEyQixDQUMvQixPQUEyQzs7WUFFM0MsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxtQ0FBbUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ3hFLENBQUM7S0FBQTtJQUVLLG1DQUFtQyxDQUN2QyxPQUEyQzs7WUFFM0MsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLG1DQUFtQztnQkFDN0MsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7cUJBQy9CO2lCQUNGO2FBQ0YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztLQUFBO0lBRUssOEJBQThCLENBQ2xDLE9BQThDOztZQUU5QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFDM0UsQ0FBQztLQUFBO0lBRUssc0NBQXNDLENBQzFDLE9BQThDOzs7WUFFOUMsT0FBTyxJQUFJLFVBQVUsQ0FBQztnQkFDcEIsUUFBUSxFQUFFLHNDQUFzQztnQkFDaEQsU0FBUyxFQUFFO29CQUNULEtBQUssRUFBRTt3QkFDTCxVQUFVLFFBQUUsT0FBTyxDQUFDLFVBQVUsMENBQUUsV0FBVyxFQUFFO3dCQUM3QyxlQUFlLEVBQUUsT0FBTyxDQUFDLFVBQVUsSUFBSSxJQUFJLElBQUksU0FBUztxQkFDekQ7aUJBQ0Y7YUFDRixDQUFDLENBQUM7O0tBQ0o7Q0FDRixDQUFBOzs7WUFyR0EsVUFBVSxTQUFDO2dCQUNWLFVBQVUsRUFBRSxNQUFNO2FBQ25COzs7WUExQzhCLE1BQU07WUFBaEIsUUFBUTs7QUEyQ2hCLG1CQUFtQjtJQU4vQixpQkFBaUIsQ0FBQztRQUNqQixVQUFVLEVBQUUsUUFBUTtLQUNyQixDQUFDO0dBSVcsbUJBQW1CLENBa0cvQjtTQWxHWSxtQkFBbUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgTmdab25lIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBMck11dGF0aW9uLCBMclNlcnZpY2UgfSBmcm9tICcuLi9hcGkvbHItZ3JhcGhxbCc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFJ1bk91dHNpZGVBbmd1bGFyIH0gZnJvbSAnLi4vX2NvbW1vbi9ydW4tb3V0c2lkZS1hbmd1bGFyJztcbmltcG9ydCB7XG4gIERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb24sXG4gIERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uLFxuICBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24sXG4gIFVwZGF0ZU5vdGlmaWNhdGlvbkZlYXR1cmVTdGF0ZU11dGF0aW9uLFxuICBVcGRhdGVOb3RpZmljYXRpb25NdXRhdGlvbixcbn0gZnJvbSAnLi9ub3RpZmljYXRpb24uZ3FsJztcblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25PcHRpb25zIHtcbiAgbm90aWZpY2F0aW9uSWQ6IHN0cmluZztcbiAgaGFzQmVlblJlYWQ6IGJvb2xlYW47XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU9wdGlvbnMge1xuICBoYXNCZWVuUmVhZDogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk9wdGlvbnMge1xuICByZWNlaXZlcklkOiBzdHJpbmc7XG4gIHBsYWluRGF0YT86IFJlY29yZDxzdHJpbmcsIEpTT05PYmplY3Q+O1xuICBwbGFpbk1ldGE/OiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PjtcbiAgaGFzQmVlblJlYWQ/OiBib29sZWFuO1xuICB0aW1lUmVhZD86IERhdGU7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVidWdEZWxldGVBbGxOb3RpZmljYXRpb25zT3B0aW9ucyB7XG4gIHJlY2VpdmVySWQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVPcHRpb25zIHtcbiAgbGFzdFZpZXdlZDogRGF0ZSB8IG51bGw7XG59XG5cbkBSdW5PdXRzaWRlQW5ndWxhcih7XG4gIG5nWm9uZU5hbWU6ICduZ1pvbmUnLFxufSlcbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnLFxufSlcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25TZXJ2aWNlIGV4dGVuZHMgTHJTZXJ2aWNlIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBuZ1pvbmU6IE5nWm9uZSwgcHJpdmF0ZSBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICBzdXBlcihpbmplY3Rvcik7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb24ob3B0aW9uczogVXBkYXRlTm90aWZpY2F0aW9uT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uKG9wdGlvbnM6IFVwZGF0ZU5vdGlmaWNhdGlvbk9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IExyTXV0YXRpb24oe1xuICAgICAgbXV0YXRpb246IFVwZGF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlKFxuICAgIG9wdGlvbnM6IFVwZGF0ZUFsbE5vdGlmaWNhdGlvbnNSZWFkU3RhdGVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLnVwZGF0ZUFsbE5vdGlmaWNhdGlvbnNSZWFkU3RhdGVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24oXG4gICAgb3B0aW9uczogVXBkYXRlQWxsTm90aWZpY2F0aW9uc1JlYWRTdGF0ZU9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBVcGRhdGVBbGxOb3RpZmljYXRpb25zUmVhZFN0YXRlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uKG9wdGlvbnM6IERlYnVnQ3JlYXRlTm90aWZpY2F0aW9uT3B0aW9ucykge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlYnVnQ3JlYXRlTm90aWZpY2F0aW9uTXV0YXRpb24ob3B0aW9ucykpO1xuICB9XG5cbiAgYXN5bmMgZGVidWdDcmVhdGVOb3RpZmljYXRpb25NdXRhdGlvbihcbiAgICBvcHRpb25zOiBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk9wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWJ1Z0NyZWF0ZU5vdGlmaWNhdGlvbk11dGF0aW9uLFxuICAgICAgdmFyaWFibGVzOiB7XG4gICAgICAgIGlucHV0OiB7XG4gICAgICAgICAgcmVjZWl2ZXJJZDogb3B0aW9ucy5yZWNlaXZlcklkLFxuICAgICAgICAgIGhhc0JlZW5SZWFkOiBvcHRpb25zLmhhc0JlZW5SZWFkLFxuICAgICAgICAgIHRpbWVSZWFkOiBvcHRpb25zLnRpbWVSZWFkPy50b0lTT1N0cmluZygpLFxuICAgICAgICAgIHBsYWluRGF0YTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wbGFpbkRhdGEpLFxuICAgICAgICAgIHBsYWluTWV0YTogSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5wbGFpbk1ldGEpLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9ucyhcbiAgICBvcHRpb25zOiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNPcHRpb25zXG4gICkge1xuICAgIHJldHVybiB0aGlzLm11dGF0ZSh0aGlzLmRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uKG9wdGlvbnMpKTtcbiAgfVxuXG4gIGFzeW5jIGRlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc011dGF0aW9uKFxuICAgIG9wdGlvbnM6IERlYnVnRGVsZXRlQWxsTm90aWZpY2F0aW9uc09wdGlvbnNcbiAgKSB7XG4gICAgcmV0dXJuIG5ldyBMck11dGF0aW9uKHtcbiAgICAgIG11dGF0aW9uOiBEZWJ1Z0RlbGV0ZUFsbE5vdGlmaWNhdGlvbnNNdXRhdGlvbixcbiAgICAgIHZhcmlhYmxlczoge1xuICAgICAgICBpbnB1dDoge1xuICAgICAgICAgIHJlY2VpdmVySWQ6IG9wdGlvbnMucmVjZWl2ZXJJZCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGUoXG4gICAgb3B0aW9uczogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlT3B0aW9uc1xuICApIHtcbiAgICByZXR1cm4gdGhpcy5tdXRhdGUodGhpcy51cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbihvcHRpb25zKSk7XG4gIH1cblxuICBhc3luYyB1cGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVNdXRhdGlvbihcbiAgICBvcHRpb25zOiBVcGRhdGVOb3RpZmljYXRpb25GZWF0dXJlU3RhdGVPcHRpb25zXG4gICkge1xuICAgIHJldHVybiBuZXcgTHJNdXRhdGlvbih7XG4gICAgICBtdXRhdGlvbjogVXBkYXRlTm90aWZpY2F0aW9uRmVhdHVyZVN0YXRlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBsYXN0Vmlld2VkOiBvcHRpb25zLmxhc3RWaWV3ZWQ/LnRvSVNPU3RyaW5nKCksXG4gICAgICAgICAgY2xlYXJMYXN0Vmlld2VkOiBvcHRpb25zLmxhc3RWaWV3ZWQgPT0gbnVsbCB8fCB1bmRlZmluZWQsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pO1xuICB9XG59XG4iXX0=
|
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import gql from 'graphql-tag';
|
|
2
|
-
export const PasswordChangeRequestMutation = gql `
|
|
3
|
-
mutation {
|
|
4
|
-
passwordChangeRequest(input: {}) {
|
|
5
|
-
challenge
|
|
6
|
-
}
|
|
7
|
-
}
|
|
8
|
-
`;
|
|
9
|
-
export const PasswordChangeMutation = gql `
|
|
10
|
-
mutation PasswordChange($input: PasswordChangeInput!) {
|
|
11
|
-
passwordChange(input: $input) {
|
|
12
|
-
token
|
|
13
|
-
newPassKey {
|
|
14
|
-
id
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
}
|
|
18
|
-
`;
|
|
19
|
-
export const PasswordChangeConfigQuery = gql `
|
|
20
|
-
query PasswordChangeConfigQuery {
|
|
21
|
-
passwordChangeConfig {
|
|
22
|
-
maxAuthAgeSeconds
|
|
23
|
-
authTime
|
|
24
|
-
serverTime
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
`;
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQuZ3FsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvbGliL3Bhc3N3b3JkL3Bhc3N3b3JkLmdxbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxhQUFhLENBQUM7QUFFOUIsTUFBTSxDQUFDLE1BQU0sNkJBQTZCLEdBQUcsR0FBRyxDQUFBOzs7Ozs7Q0FNL0MsQ0FBQztBQUVGLE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLEdBQUcsQ0FBQTs7Ozs7Ozs7O0NBU3hDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRyxHQUFHLENBQUE7Ozs7Ozs7O0NBUTNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZ3FsIGZyb20gJ2dyYXBocWwtdGFnJztcblxuZXhwb3J0IGNvbnN0IFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uID0gZ3FsYFxuICBtdXRhdGlvbiB7XG4gICAgcGFzc3dvcmRDaGFuZ2VSZXF1ZXN0KGlucHV0OiB7fSkge1xuICAgICAgY2hhbGxlbmdlXG4gICAgfVxuICB9XG5gO1xuXG5leHBvcnQgY29uc3QgUGFzc3dvcmRDaGFuZ2VNdXRhdGlvbiA9IGdxbGBcbiAgbXV0YXRpb24gUGFzc3dvcmRDaGFuZ2UoJGlucHV0OiBQYXNzd29yZENoYW5nZUlucHV0ISkge1xuICAgIHBhc3N3b3JkQ2hhbmdlKGlucHV0OiAkaW5wdXQpIHtcbiAgICAgIHRva2VuXG4gICAgICBuZXdQYXNzS2V5IHtcbiAgICAgICAgaWRcbiAgICAgIH1cbiAgICB9XG4gIH1cbmA7XG5cbmV4cG9ydCBjb25zdCBQYXNzd29yZENoYW5nZUNvbmZpZ1F1ZXJ5ID0gZ3FsYFxuICBxdWVyeSBQYXNzd29yZENoYW5nZUNvbmZpZ1F1ZXJ5IHtcbiAgICBwYXNzd29yZENoYW5nZUNvbmZpZyB7XG4gICAgICBtYXhBdXRoQWdlU2Vjb25kc1xuICAgICAgYXV0aFRpbWVcbiAgICAgIHNlcnZlclRpbWVcbiAgICB9XG4gIH1cbmA7XG4iXX0=
|
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Inject, Injectable } from '@angular/core';
|
|
4
|
-
import { AuthClass } from '@aws-amplify/auth/lib-esm/Auth';
|
|
5
|
-
import * as moment_ from 'moment';
|
|
6
|
-
import { EncryptionService } from '../encryption/encryption.service';
|
|
7
|
-
import { KeyFactoryService as KFS } from '../key/key-factory.service';
|
|
8
|
-
import { KeyGraphService } from '../key/key-graph.service';
|
|
9
|
-
import { httpOptions, KC_CONFIG } from '../life-ready.config';
|
|
10
|
-
import { ProfileService } from '../profile/profile.service';
|
|
11
|
-
import { WebCryptoService } from '../web-crypto/web-crypto.service';
|
|
12
|
-
import { KcAuthException } from '../_common/exceptions';
|
|
13
|
-
import { LrApolloService } from './../api/lr-apollo.service';
|
|
14
|
-
import { PasswordChangeConfigQuery, PasswordChangeMutation, PasswordChangeRequestMutation, } from './password.gql';
|
|
15
|
-
import * as i0 from "@angular/core";
|
|
16
|
-
import * as i1 from "../life-ready.config";
|
|
17
|
-
import * as i2 from "@angular/common/http";
|
|
18
|
-
import * as i3 from "../api/lr-apollo.service";
|
|
19
|
-
import * as i4 from "@aws-amplify/auth/lib-esm/Auth";
|
|
20
|
-
import * as i5 from "../profile/profile.service";
|
|
21
|
-
import * as i6 from "../key/key-factory.service";
|
|
22
|
-
import * as i7 from "../encryption/encryption.service";
|
|
23
|
-
import * as i8 from "../key/key-graph.service";
|
|
24
|
-
import * as i9 from "../web-crypto/web-crypto.service";
|
|
25
|
-
// Ref: https://stackoverflow.com/questions/59735280/angular-8-moment-error-cannot-call-a-namespace-moment
|
|
26
|
-
const moment = moment_;
|
|
27
|
-
export class PasswordCheck {
|
|
28
|
-
}
|
|
29
|
-
export class PasswordService {
|
|
30
|
-
constructor(config, http, apollo, auth, profileService, keyFactory, encryptionService, keyGraph, webCryptoService) {
|
|
31
|
-
this.config = config;
|
|
32
|
-
this.http = http;
|
|
33
|
-
this.apollo = apollo;
|
|
34
|
-
this.auth = auth;
|
|
35
|
-
this.profileService = profileService;
|
|
36
|
-
this.keyFactory = keyFactory;
|
|
37
|
-
this.encryptionService = encryptionService;
|
|
38
|
-
this.keyGraph = keyGraph;
|
|
39
|
-
this.webCryptoService = webCryptoService;
|
|
40
|
-
this.CLIENT_NONCE_LENGTH = 32;
|
|
41
|
-
}
|
|
42
|
-
checkPassword(plainPassword) {
|
|
43
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
44
|
-
const { years } = this.passwordStrength(plainPassword);
|
|
45
|
-
return {
|
|
46
|
-
length: plainPassword.length,
|
|
47
|
-
timeToCrack: moment.duration({ years }),
|
|
48
|
-
passwordExposed: yield this.getExposureCount(plainPassword),
|
|
49
|
-
};
|
|
50
|
-
});
|
|
51
|
-
}
|
|
52
|
-
getExposureCount(plainPassword) {
|
|
53
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
54
|
-
const sha1Password = yield this.webCryptoService.stringDigest('SHA-1', plainPassword);
|
|
55
|
-
const first5sha1 = sha1Password.substring(0, 5);
|
|
56
|
-
const response = yield this.http
|
|
57
|
-
.get(`https://api.pwnedpasswords.com/range/${first5sha1}`, {
|
|
58
|
-
responseType: 'text',
|
|
59
|
-
})
|
|
60
|
-
.toPromise();
|
|
61
|
-
const results = new RegExp(`^(?:${sha1Password.substring(5)}:)(?<count>\\d+)$`, 'im').exec(response);
|
|
62
|
-
if (results) {
|
|
63
|
-
return +results.groups.count;
|
|
64
|
-
}
|
|
65
|
-
return 0;
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
getPassIdpString(passIdp) {
|
|
69
|
-
return passIdp.toJSON(true).k;
|
|
70
|
-
}
|
|
71
|
-
createPassKeyBundle(password) {
|
|
72
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
73
|
-
const passIdpParams = yield this.keyFactory.createPassIdpParams();
|
|
74
|
-
const passIdp = (yield this.keyFactory.derivePassIdp(Object.assign({ password }, passIdpParams))).jwk;
|
|
75
|
-
const passKeyParams = yield this.keyFactory.createPassKeyParams();
|
|
76
|
-
const passKey = (yield this.keyFactory.derivePassKey(Object.assign({ password }, passKeyParams))).jwk;
|
|
77
|
-
const passIdpVerifier = yield this.keyFactory.createPkcSignKey();
|
|
78
|
-
const wrappedPassIdpVerifierPrk = yield this.encryptionService.encrypt(passKey, passIdpVerifier.toJSON(true));
|
|
79
|
-
// There are two formats that the private key can be represented in JWK:
|
|
80
|
-
// https://tools.ietf.org/html/rfc8017#page-9
|
|
81
|
-
// The second form is an optimization:
|
|
82
|
-
// https://crypto.stackexchange.com/questions/19413/what-are-dp-and-dq-in-encryption-by-rsa-in-c
|
|
83
|
-
return {
|
|
84
|
-
passKeyParams,
|
|
85
|
-
passKey,
|
|
86
|
-
passIdpParams,
|
|
87
|
-
passIdp,
|
|
88
|
-
passIdpVerifier,
|
|
89
|
-
wrappedPassIdpVerifierPrk,
|
|
90
|
-
};
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* We need to allow for interruption of the process at any point. Each API call can be considered
|
|
95
|
-
* atomic and either succeeds or fails.
|
|
96
|
-
*
|
|
97
|
-
* The LR server APIs use semaphore tokens for locking critical operations, so concurrent calls will
|
|
98
|
-
* fail.
|
|
99
|
-
*
|
|
100
|
-
* We assume the worst case for IdP API calls. So we use the semaphore token from LR to prevent
|
|
101
|
-
* concurrent calls to IdP APIs, but we have to assume that the IdP API calls will either succeed or
|
|
102
|
-
* fail within a reasonable amount of time.
|
|
103
|
-
*
|
|
104
|
-
* Each location where the server state changes can be a potential point of interruption.
|
|
105
|
-
* Potential points of interruption are marked with: --Potential Failure Point--
|
|
106
|
-
*
|
|
107
|
-
* Places for timeout:
|
|
108
|
-
* - Login age too old at call to: verifyPassword()
|
|
109
|
-
* - Login age too old at call to: changePasswordMutation()
|
|
110
|
-
* - Semaphore token expires at call to: changePasswordComplete()
|
|
111
|
-
*
|
|
112
|
-
* Tests:
|
|
113
|
-
* - Potential Failure Point 1: should be able to restart the process, user remains signed in.
|
|
114
|
-
* - Potential Failure Point 2: should enter recovery flow
|
|
115
|
-
* - Potential Failure Point 3: should enter recovery flow
|
|
116
|
-
* - Potential Failure Point 4: should enter recovery flow
|
|
117
|
-
*
|
|
118
|
-
*/
|
|
119
|
-
isLoginRequired() {
|
|
120
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
121
|
-
const changePasswordConfig = yield this.getChangePasswordConfig();
|
|
122
|
-
const authTime = moment(changePasswordConfig.authTime);
|
|
123
|
-
const serverTime = moment(changePasswordConfig.serverTime);
|
|
124
|
-
const duration = moment.duration(serverTime.diff(authTime));
|
|
125
|
-
const seconds = duration.asSeconds();
|
|
126
|
-
if (seconds > changePasswordConfig.maxAuthAgeSeconds) {
|
|
127
|
-
return true;
|
|
128
|
-
}
|
|
129
|
-
else {
|
|
130
|
-
return false;
|
|
131
|
-
}
|
|
132
|
-
});
|
|
133
|
-
}
|
|
134
|
-
changePassword(password, newPassword) {
|
|
135
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
136
|
-
const cognitoUser = yield this.auth.currentAuthenticatedUser();
|
|
137
|
-
// Not checking that passwords are different. It makes it easier to test.
|
|
138
|
-
const { currentUser } = yield this.profileService.getCurrentUser();
|
|
139
|
-
const { passIdp, signedChallenge } = yield this.verifyPassword(password, currentUser);
|
|
140
|
-
// --Potential Failure Point 1--
|
|
141
|
-
// verifyPassword() asks for a current password challenge hence changes server state.
|
|
142
|
-
// Place break points here to test the failure scenarios.
|
|
143
|
-
// Generate the new passIdp
|
|
144
|
-
const newPassKey = yield this.createPassKeyBundle(newPassword);
|
|
145
|
-
// Re-encrypt master key with new key
|
|
146
|
-
const masterKey = yield this.keyGraph.getKey(currentUser.currentUserKey.masterKey.id);
|
|
147
|
-
const newWrappedMasterKey = yield this.encryptionService.encrypt(newPassKey.passKey, masterKey.jwk.toJSON(true));
|
|
148
|
-
// If the IdP change password failed, we need to go into recovery mode by forcing
|
|
149
|
-
// a login. We can't logout the user just yet since the IdP password change needs
|
|
150
|
-
// the user to be logged in. We _can_ removed any persisted session values for the IdP
|
|
151
|
-
// but that seems like too much trouble.
|
|
152
|
-
const { token } = yield this.changePasswordMutation(signedChallenge, currentUser.currentUserKey.masterKey.id, newWrappedMasterKey, newPassKey);
|
|
153
|
-
// --Potential Failure Point 2--
|
|
154
|
-
// changePasswordMutation() uploads new keys and obtains a semaphore lock to prevent any other
|
|
155
|
-
// clients from performing IdP password change.
|
|
156
|
-
// Now we can do the IdP password change.
|
|
157
|
-
// todo: Add this back in
|
|
158
|
-
yield this.auth.changePassword(cognitoUser, this.getPassIdpString(passIdp), this.getPassIdpString(newPassKey.passIdp));
|
|
159
|
-
// --Potential Failure Point 3--
|
|
160
|
-
// IdP password change
|
|
161
|
-
// Note that changePassword() could throw an exception for a number of reason. It could throw
|
|
162
|
-
// a network timeout for example. But we don't know if it's the response that timed out and
|
|
163
|
-
// the idp password change was actually carried out. So we have to be extra conservative and
|
|
164
|
-
// only act on a clear success. Otherwise we go into recover mode.
|
|
165
|
-
yield this.changePasswordComplete({ useNewPassword: true, token });
|
|
166
|
-
});
|
|
167
|
-
}
|
|
168
|
-
changePasswordComplete(options) {
|
|
169
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
170
|
-
const { useNewPassword, token } = options;
|
|
171
|
-
return this.http
|
|
172
|
-
.post(`${this.config.authUrl}users/password-change-complete/`, Object.assign({ use_new_password: useNewPassword }, (token && { token })), yield httpOptions(this.auth, this.config))
|
|
173
|
-
.toPromise();
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
getVerifierPrK(passKey, wrappedPrK) {
|
|
177
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
178
|
-
try {
|
|
179
|
-
const prkJson = yield this.encryptionService.decrypt(passKey, wrappedPrK);
|
|
180
|
-
return KFS.asKey(prkJson);
|
|
181
|
-
}
|
|
182
|
-
catch (error) {
|
|
183
|
-
throw new KcAuthException('Wrong current password');
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
}
|
|
187
|
-
verifyPassword(password, currentUser) {
|
|
188
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
189
|
-
// Get information from the server to prepare for password change.
|
|
190
|
-
const passwordRequest = yield this.apollo.mutate({
|
|
191
|
-
mutation: PasswordChangeRequestMutation,
|
|
192
|
-
variables: {},
|
|
193
|
-
});
|
|
194
|
-
// Get the old passKey so we can decrypt the old password verifier
|
|
195
|
-
const passKeyResult = yield this.keyFactory.derivePassKey(Object.assign({ password }, currentUser.currentUserKey.passKey.passKeyParams));
|
|
196
|
-
const verifierPrK = yield this.getVerifierPrK(passKeyResult.jwk, currentUser.currentUserKey.passKey.wrappedPassIdpVerifierPrk);
|
|
197
|
-
// Sign the server challenge to prove to the server we can decrypt the password verifier.
|
|
198
|
-
// Generate
|
|
199
|
-
const clientNonce = this.keyFactory.randomString(this.CLIENT_NONCE_LENGTH);
|
|
200
|
-
const signedChallenge = yield this.encryptionService.sign(verifierPrK, {
|
|
201
|
-
serverNonce: passwordRequest.passwordChangeRequest.challenge.serverNonce,
|
|
202
|
-
clientNonce,
|
|
203
|
-
});
|
|
204
|
-
const passIdpResult = yield this.keyFactory.derivePassIdp(Object.assign({ password }, currentUser.currentUserKey.passKey.passIdpParams));
|
|
205
|
-
return {
|
|
206
|
-
passIdp: passIdpResult.jwk,
|
|
207
|
-
signedChallenge,
|
|
208
|
-
};
|
|
209
|
-
});
|
|
210
|
-
}
|
|
211
|
-
changePasswordMutation(signedChallenge, masterKeyId, newWrappedMasterKey, passKeyBundle) {
|
|
212
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
213
|
-
const response = yield this.apollo.mutate({
|
|
214
|
-
mutation: PasswordChangeMutation,
|
|
215
|
-
variables: {
|
|
216
|
-
input: {
|
|
217
|
-
signedChallenge: JSON.stringify(signedChallenge),
|
|
218
|
-
masterKeyId,
|
|
219
|
-
newWrappedMasterKey: JSON.stringify(newWrappedMasterKey),
|
|
220
|
-
newPassKey: {
|
|
221
|
-
passIdpParams: JSON.stringify(passKeyBundle.passIdpParams),
|
|
222
|
-
passIdpVerifierPbk: JSON.stringify(passKeyBundle.passIdpVerifier.toJSON()),
|
|
223
|
-
wrappedPassIdpVerifierPrk: JSON.stringify(passKeyBundle.wrappedPassIdpVerifierPrk),
|
|
224
|
-
passKeyParams: JSON.stringify(passKeyBundle.passKeyParams),
|
|
225
|
-
},
|
|
226
|
-
},
|
|
227
|
-
},
|
|
228
|
-
});
|
|
229
|
-
return {
|
|
230
|
-
token: response.passwordChange.token,
|
|
231
|
-
newPassKeyId: response.passwordChange.newPassKey.id,
|
|
232
|
-
};
|
|
233
|
-
});
|
|
234
|
-
}
|
|
235
|
-
getChangePasswordConfig() {
|
|
236
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
237
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
238
|
-
const res = yield this.apollo.query({
|
|
239
|
-
query: PasswordChangeConfigQuery,
|
|
240
|
-
});
|
|
241
|
-
const ret = res.passwordChangeConfig;
|
|
242
|
-
ret.authTime = new Date(ret.authTime);
|
|
243
|
-
ret.serverTime = new Date(ret.serverTime);
|
|
244
|
-
return ret;
|
|
245
|
-
});
|
|
246
|
-
}
|
|
247
|
-
passwordStrength(password) {
|
|
248
|
-
const upper = /[A-Z]/g;
|
|
249
|
-
const lower = /[a-z]/g;
|
|
250
|
-
const digit = /[0-9]/g;
|
|
251
|
-
const upperChoices = 26;
|
|
252
|
-
const lowerChoices = 26;
|
|
253
|
-
const digitChoices = 10;
|
|
254
|
-
const specialChoices = 30; // /[!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~]/g
|
|
255
|
-
function instanceCount(str, re) {
|
|
256
|
-
return ((str || '').match(re) || []).length;
|
|
257
|
-
}
|
|
258
|
-
const uppers = instanceCount(password, upper);
|
|
259
|
-
const lowers = instanceCount(password, lower);
|
|
260
|
-
const digits = instanceCount(password, digit);
|
|
261
|
-
const specials = password.length - uppers - lowers - digits;
|
|
262
|
-
let choices = 0;
|
|
263
|
-
if (uppers) {
|
|
264
|
-
choices += upperChoices;
|
|
265
|
-
}
|
|
266
|
-
if (lowers) {
|
|
267
|
-
choices += lowerChoices;
|
|
268
|
-
}
|
|
269
|
-
if (digits) {
|
|
270
|
-
choices += digitChoices;
|
|
271
|
-
}
|
|
272
|
-
if (specials) {
|
|
273
|
-
choices += specialChoices;
|
|
274
|
-
}
|
|
275
|
-
if (password.length === 0) {
|
|
276
|
-
return {
|
|
277
|
-
years: 0,
|
|
278
|
-
// bits of entropy
|
|
279
|
-
bits: 0,
|
|
280
|
-
};
|
|
281
|
-
}
|
|
282
|
-
const permutations = Math.pow(choices, password.length);
|
|
283
|
-
const years = (54000 * permutations) /
|
|
284
|
-
Math.pow(upperChoices + lowerChoices + digitChoices, 12);
|
|
285
|
-
return {
|
|
286
|
-
years,
|
|
287
|
-
// bits of entropy
|
|
288
|
-
bits: Math.round(Math.log2(permutations)),
|
|
289
|
-
};
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
PasswordService.ɵprov = i0.ɵɵdefineInjectable({ factory: function PasswordService_Factory() { return new PasswordService(i0.ɵɵinject(i1.KC_CONFIG), i0.ɵɵinject(i2.HttpClient), i0.ɵɵinject(i3.LrApolloService), i0.ɵɵinject(i4.AuthClass), i0.ɵɵinject(i5.ProfileService), i0.ɵɵinject(i6.KeyFactoryService), i0.ɵɵinject(i7.EncryptionService), i0.ɵɵinject(i8.KeyGraphService), i0.ɵɵinject(i9.WebCryptoService)); }, token: PasswordService, providedIn: "root" });
|
|
293
|
-
PasswordService.decorators = [
|
|
294
|
-
{ type: Injectable, args: [{
|
|
295
|
-
providedIn: 'root',
|
|
296
|
-
},] }
|
|
297
|
-
];
|
|
298
|
-
PasswordService.ctorParameters = () => [
|
|
299
|
-
{ type: undefined, decorators: [{ type: Inject, args: [KC_CONFIG,] }] },
|
|
300
|
-
{ type: HttpClient },
|
|
301
|
-
{ type: LrApolloService },
|
|
302
|
-
{ type: AuthClass },
|
|
303
|
-
{ type: ProfileService },
|
|
304
|
-
{ type: KFS },
|
|
305
|
-
{ type: EncryptionService },
|
|
306
|
-
{ type: KeyGraphService },
|
|
307
|
-
{ type: WebCryptoService }
|
|
308
|
-
];
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFzc3dvcmQuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9wYXNzd29yZC9wYXNzd29yZC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDbEQsT0FBTyxFQUFFLE1BQU0sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFbkQsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNELE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBS2xDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsSUFBSSxHQUFHLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDM0QsT0FBTyxFQUFFLFdBQVcsRUFBWSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFFNUQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ3hELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUM3RCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLHNCQUFzQixFQUN0Qiw2QkFBNkIsR0FDOUIsTUFBTSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7QUFFeEIsMEdBQTBHO0FBQzFHLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQXlCdkIsTUFBTSxPQUFPLGFBQWE7Q0FJekI7QUFLRCxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUM2QixNQUFnQixF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Q0FBQyxLQUFLLEdBQUcsWUFBWSxDQUFDO1lBQ3RCLElBQUksQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLFlBQVksR0FBRyxZQUFZLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDM0QsT0FBTztZQUNMLEtBQUs7WUFDTCxrQkFBa0I7WUFDbEIsSUFBSSxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztTQUMxQyxDQUFDO0lBQ0osQ0FBQzs7OztZQTdXRixVQUFVLFNBQUM7Z0JBQ1YsVUFBVSxFQUFFLE1BQU07YUFDbkI7Ozs0Q0FLSSxNQUFNLFNBQUMsU0FBUztZQS9EWixVQUFVO1lBaUJWLGVBQWU7WUFkZixTQUFTO1lBVVQsY0FBYztZQUhPLEdBQUc7WUFEeEIsaUJBQWlCO1lBRWpCLGVBQWU7WUFJZixnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0LCBJbmplY3RhYmxlIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBDb2duaXRvVXNlciB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoJztcbmltcG9ydCB7IEF1dGhDbGFzcyB9IGZyb20gJ0Bhd3MtYW1wbGlmeS9hdXRoL2xpYi1lc20vQXV0aCc7XG5pbXBvcnQgKiBhcyBtb21lbnRfIGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBEdXJhdGlvbiB9IGZyb20gJ21vbWVudCc7XG5pbXBvcnQgeyBKV0ssIEpXUyB9IGZyb20gJ25vZGUtam9zZSc7XG5pbXBvcnQgeyBKU09OT2JqZWN0IH0gZnJvbSAnLi4vYXBpL3R5cGVzJztcbmltcG9ydCB7IFBhc3NLZXlCdW5kbGUgfSBmcm9tICcuLi9hdXRoL2F1dGgudHlwZXMnO1xuaW1wb3J0IHsgRW5jcnlwdGlvblNlcnZpY2UgfSBmcm9tICcuLi9lbmNyeXB0aW9uL2VuY3J5cHRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBLZXlGYWN0b3J5U2VydmljZSBhcyBLRlMgfSBmcm9tICcuLi9rZXkva2V5LWZhY3Rvcnkuc2VydmljZSc7XG5pbXBvcnQgeyBLZXlHcmFwaFNlcnZpY2UgfSBmcm9tICcuLi9rZXkva2V5LWdyYXBoLnNlcnZpY2UnO1xuaW1wb3J0IHsgaHR0cE9wdGlvbnMsIEtjQ29uZmlnLCBLQ19DT05GSUcgfSBmcm9tICcuLi9saWZlLXJlYWR5LmNvbmZpZyc7XG5pbXBvcnQgeyBQcm9maWxlU2VydmljZSB9IGZyb20gJy4uL3Byb2ZpbGUvcHJvZmlsZS5zZXJ2aWNlJztcbmltcG9ydCB7IEFwaUN1cnJlbnRVc2VyIH0gZnJvbSAnLi4vcHJvZmlsZS9wcm9maWxlLnR5cGVzJztcbmltcG9ydCB7IFdlYkNyeXB0b1NlcnZpY2UgfSBmcm9tICcuLi93ZWItY3J5cHRvL3dlYi1jcnlwdG8uc2VydmljZSc7XG5pbXBvcnQgeyBLY0F1dGhFeGNlcHRpb24gfSBmcm9tICcuLi9fY29tbW9uL2V4Y2VwdGlvbnMnO1xuaW1wb3J0IHsgTHJBcG9sbG9TZXJ2aWNlIH0gZnJvbSAnLi8uLi9hcGkvbHItYXBvbGxvLnNlcnZpY2UnO1xuaW1wb3J0IHtcbiAgUGFzc3dvcmRDaGFuZ2VDb25maWdRdWVyeSxcbiAgUGFzc3dvcmRDaGFuZ2VNdXRhdGlvbixcbiAgUGFzc3dvcmRDaGFuZ2VSZXF1ZXN0TXV0YXRpb24sXG59IGZyb20gJy4vcGFzc3dvcmQuZ3FsJztcblxuLy8gUmVmOiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy81OTczNTI4MC9hbmd1bGFyLTgtbW9tZW50LWVycm9yLWNhbm5vdC1jYWxsLWEtbmFtZXNwYWNlLW1vbWVudFxuY29uc3QgbW9tZW50ID0gbW9tZW50XztcblxuaW50ZXJmYWNlIFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uIHtcbiAgcGFzc3dvcmRDaGFuZ2VSZXF1ZXN0OiB7XG4gICAgY2hhbGxlbmdlOiB7XG4gICAgICBzZXJ2ZXJOb25jZTogc3RyaW5nO1xuICAgIH07XG4gIH07XG59XG5cbmludGVyZmFjZSBQYXNzd29yZENoYW5nZU11dGF0aW9uIHtcbiAgcGFzc3dvcmRDaGFuZ2U6IHtcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIG5ld1Bhc3NLZXk6IHtcbiAgICAgIGlkOiBzdHJpbmc7XG4gICAgfTtcbiAgfTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYXNzd29yZENoYW5nZUNvbmZpZyB7XG4gIG1heEF1dGhBZ2VTZWNvbmRzOiBudW1iZXI7XG4gIGF1dGhUaW1lOiBzdHJpbmcgfCBEYXRlO1xuICBzZXJ2ZXJUaW1lOiBzdHJpbmcgfCBEYXRlO1xufVxuXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRDaGVjayB7XG4gIGxlbmd0aD86IG51bWJlcjtcbiAgdGltZVRvQ3JhY2s/OiBEdXJhdGlvbjtcbiAgcGFzc3dvcmRFeHBvc2VkPzogbnVtYmVyO1xufVxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUGFzc3dvcmRTZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSBDTElFTlRfTk9OQ0VfTEVOR1RIID0gMzI7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdChLQ19DT05GSUcpIHByaXZhdGUgY29uZmlnOiBLY0NvbmZpZyxcbiAgICBwcml2YXRlIGh0dHA6IEh0dHBDbGllbnQsXG4gICAgcHJpdmF0ZSBhcG9sbG86IExyQXBvbGxvU2VydmljZSxcbiAgICBwcml2YXRlIGF1dGg6IEF1dGhDbGFzcyxcbiAgICBwcml2YXRlIHByb2ZpbGVTZXJ2aWNlOiBQcm9maWxlU2VydmljZSxcbiAgICBwcml2YXRlIGtleUZhY3Rvcnk6IEtGUyxcbiAgICBwcml2YXRlIGVuY3J5cHRpb25TZXJ2aWNlOiBFbmNyeXB0aW9uU2VydmljZSxcbiAgICBwcml2YXRlIGtleUdyYXBoOiBLZXlHcmFwaFNlcnZpY2UsXG4gICAgcHJpdmF0ZSB3ZWJDcnlwdG9TZXJ2aWNlOiBXZWJDcnlwdG9TZXJ2aWNlXG4gICkge31cblxuICBwdWJsaWMgYXN5bmMgY2hlY2tQYXNzd29yZChwbGFpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPFBhc3N3b3JkQ2hlY2s+IHtcbiAgICBjb25zdCB7IHllYXJzIH0gPSB0aGlzLnBhc3N3b3JkU3RyZW5ndGgocGxhaW5QYXNzd29yZCk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgbGVuZ3RoOiBwbGFpblBhc3N3b3JkLmxlbmd0aCxcbiAgICAgIHRpbWVUb0NyYWNrOiBtb21lbnQuZHVyYXRpb24oeyB5ZWFycyB9KSxcbiAgICAgIHBhc3N3b3JkRXhwb3NlZDogYXdhaXQgdGhpcy5nZXRFeHBvc3VyZUNvdW50KHBsYWluUGFzc3dvcmQpLFxuICAgIH07XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgZ2V0RXhwb3N1cmVDb3VudChwbGFpblBhc3N3b3JkOiBzdHJpbmcpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgIGNvbnN0IHNoYTFQYXNzd29yZCA9IGF3YWl0IHRoaXMud2ViQ3J5cHRvU2VydmljZS5zdHJpbmdEaWdlc3QoXG4gICAgICAnU0hBLTEnLFxuICAgICAgcGxhaW5QYXNzd29yZFxuICAgICk7XG4gICAgY29uc3QgZmlyc3Q1c2hhMSA9IHNoYTFQYXNzd29yZC5zdWJzdHJpbmcoMCwgNSk7XG5cbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuaHR0cFxuICAgICAgLmdldChgaHR0cHM6Ly9hcGkucHduZWRwYXNzd29yZHMuY29tL3JhbmdlLyR7Zmlyc3Q1c2hhMX1gLCB7XG4gICAgICAgIHJlc3BvbnNlVHlwZTogJ3RleHQnLFxuICAgICAgfSlcbiAgICAgIC50b1Byb21pc2UoKTtcblxuICAgIGNvbnN0IHJlc3VsdHMgPSBuZXcgUmVnRXhwKFxuICAgICAgYF4oPzoke3NoYTFQYXNzd29yZC5zdWJzdHJpbmcoNSl9OikoPzxjb3VudD5cXFxcZCspJGAsXG4gICAgICAnaW0nXG4gICAgKS5leGVjKHJlc3BvbnNlKTtcblxuICAgIGlmIChyZXN1bHRzKSB7XG4gICAgICByZXR1cm4gK3Jlc3VsdHMuZ3JvdXBzLmNvdW50O1xuICAgIH1cbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHB1YmxpYyBnZXRQYXNzSWRwU3RyaW5nKHBhc3NJZHA6IEpXSy5LZXkpIHtcbiAgICByZXR1cm4gKHBhc3NJZHAudG9KU09OKHRydWUpIGFzIEpTT05PYmplY3QpLms7XG4gIH1cblxuICBwdWJsaWMgYXN5bmMgY3JlYXRlUGFzc0tleUJ1bmRsZShcbiAgICBwYXNzd29yZDogQ3J5cHRvS2V5XG4gICk6IFByb21pc2U8UGFzc0tleUJ1bmRsZT4ge1xuICAgIGNvbnN0IHBhc3NJZHBQYXJhbXMgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGFzc0lkcFBhcmFtcygpO1xuICAgIGNvbnN0IHBhc3NJZHAgPSAoXG4gICAgICBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0lkcCh7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAuLi5wYXNzSWRwUGFyYW1zLFxuICAgICAgfSlcbiAgICApLmp3aztcblxuICAgIGNvbnN0IHBhc3NLZXlQYXJhbXMgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuY3JlYXRlUGFzc0tleVBhcmFtcygpO1xuICAgIGNvbnN0IHBhc3NLZXkgPSAoXG4gICAgICBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0tleSh7XG4gICAgICAgIHBhc3N3b3JkLFxuICAgICAgICAuLi5wYXNzS2V5UGFyYW1zLFxuICAgICAgfSlcbiAgICApLmp3aztcblxuICAgIGNvbnN0IHBhc3NJZHBWZXJpZmllciA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5jcmVhdGVQa2NTaWduS2V5KCk7XG5cbiAgICBjb25zdCB3cmFwcGVkUGFzc0lkcFZlcmlmaWVyUHJrID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5lbmNyeXB0KFxuICAgICAgcGFzc0tleSxcbiAgICAgIHBhc3NJZHBWZXJpZmllci50b0pTT04odHJ1ZSlcbiAgICApO1xuXG4gICAgLy8gVGhlcmUgYXJlIHR3byBmb3JtYXRzIHRoYXQgdGhlIHByaXZhdGUga2V5IGNhbiBiZSByZXByZXNlbnRlZCBpbiBKV0s6XG4gICAgLy8gaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzgwMTcjcGFnZS05XG4gICAgLy8gVGhlIHNlY29uZCBmb3JtIGlzIGFuIG9wdGltaXphdGlvbjpcbiAgICAvLyBodHRwczovL2NyeXB0by5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvMTk0MTMvd2hhdC1hcmUtZHAtYW5kLWRxLWluLWVuY3J5cHRpb24tYnktcnNhLWluLWNcblxuICAgIHJldHVybiB7XG4gICAgICBwYXNzS2V5UGFyYW1zLFxuICAgICAgcGFzc0tleSxcbiAgICAgIHBhc3NJZHBQYXJhbXMsXG4gICAgICBwYXNzSWRwLFxuICAgICAgcGFzc0lkcFZlcmlmaWVyLFxuICAgICAgd3JhcHBlZFBhc3NJZHBWZXJpZmllclByayxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFdlIG5lZWQgdG8gYWxsb3cgZm9yIGludGVycnVwdGlvbiBvZiB0aGUgcHJvY2VzcyBhdCBhbnkgcG9pbnQuIEVhY2ggQVBJIGNhbGwgY2FuIGJlIGNvbnNpZGVyZWRcbiAgICogYXRvbWljIGFuZCBlaXRoZXIgc3VjY2VlZHMgb3IgZmFpbHMuXG4gICAqXG4gICAqIFRoZSBMUiBzZXJ2ZXIgQVBJcyB1c2Ugc2VtYXBob3JlIHRva2VucyBmb3IgbG9ja2luZyBjcml0aWNhbCBvcGVyYXRpb25zLCBzbyBjb25jdXJyZW50IGNhbGxzIHdpbGxcbiAgICogZmFpbC5cbiAgICpcbiAgICogV2UgYXNzdW1lIHRoZSB3b3JzdCBjYXNlIGZvciBJZFAgQVBJIGNhbGxzLiBTbyB3ZSB1c2UgdGhlIHNlbWFwaG9yZSB0b2tlbiBmcm9tIExSIHRvIHByZXZlbnRcbiAgICogY29uY3VycmVudCBjYWxscyB0byBJZFAgQVBJcywgYnV0IHdlIGhhdmUgdG8gYXNzdW1lIHRoYXQgdGhlIElkUCBBUEkgY2FsbHMgd2lsbCBlaXRoZXIgc3VjY2VlZCBvclxuICAgKiBmYWlsIHdpdGhpbiBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuXG4gICAqXG4gICAqIEVhY2ggbG9jYXRpb24gd2hlcmUgdGhlIHNlcnZlciBzdGF0ZSBjaGFuZ2VzIGNhbiBiZSBhIHBvdGVudGlhbCBwb2ludCBvZiBpbnRlcnJ1cHRpb24uXG4gICAqIFBvdGVudGlhbCBwb2ludHMgb2YgaW50ZXJydXB0aW9uIGFyZSBtYXJrZWQgd2l0aDogLS1Qb3RlbnRpYWwgRmFpbHVyZSBQb2ludC0tXG4gICAqXG4gICAqIFBsYWNlcyBmb3IgdGltZW91dDpcbiAgICogLSBMb2dpbiBhZ2UgdG9vIG9sZCBhdCBjYWxsIHRvOiB2ZXJpZnlQYXNzd29yZCgpXG4gICAqIC0gTG9naW4gYWdlIHRvbyBvbGQgYXQgY2FsbCB0bzogY2hhbmdlUGFzc3dvcmRNdXRhdGlvbigpXG4gICAqIC0gU2VtYXBob3JlIHRva2VuIGV4cGlyZXMgYXQgY2FsbCB0bzogY2hhbmdlUGFzc3dvcmRDb21wbGV0ZSgpXG4gICAqXG4gICAqIFRlc3RzOlxuICAgKiAtIFBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDE6IHNob3VsZCBiZSBhYmxlIHRvIHJlc3RhcnQgdGhlIHByb2Nlc3MsIHVzZXIgcmVtYWlucyBzaWduZWQgaW4uXG4gICAqIC0gUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMjogc2hvdWxkIGVudGVyIHJlY292ZXJ5IGZsb3dcbiAgICogLSBQb3RlbnRpYWwgRmFpbHVyZSBQb2ludCAzOiBzaG91bGQgZW50ZXIgcmVjb3ZlcnkgZmxvd1xuICAgKiAtIFBvdGVudGlhbCBGYWlsdXJlIFBvaW50IDQ6IHNob3VsZCBlbnRlciByZWNvdmVyeSBmbG93XG4gICAqXG4gICAqL1xuXG4gIHB1YmxpYyBhc3luYyBpc0xvZ2luUmVxdWlyZWQoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgY29uc3QgY2hhbmdlUGFzc3dvcmRDb25maWcgPSBhd2FpdCB0aGlzLmdldENoYW5nZVBhc3N3b3JkQ29uZmlnKCk7XG4gICAgY29uc3QgYXV0aFRpbWUgPSBtb21lbnQoY2hhbmdlUGFzc3dvcmRDb25maWcuYXV0aFRpbWUpO1xuICAgIGNvbnN0IHNlcnZlclRpbWUgPSBtb21lbnQoY2hhbmdlUGFzc3dvcmRDb25maWcuc2VydmVyVGltZSk7XG4gICAgY29uc3QgZHVyYXRpb24gPSBtb21lbnQuZHVyYXRpb24oc2VydmVyVGltZS5kaWZmKGF1dGhUaW1lKSk7XG4gICAgY29uc3Qgc2Vjb25kcyA9IGR1cmF0aW9uLmFzU2Vjb25kcygpO1xuICAgIGlmIChzZWNvbmRzID4gY2hhbmdlUGFzc3dvcmRDb25maWcubWF4QXV0aEFnZVNlY29uZHMpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVBhc3N3b3JkKHBhc3N3b3JkOiBDcnlwdG9LZXksIG5ld1Bhc3N3b3JkOiBDcnlwdG9LZXkpIHtcbiAgICBjb25zdCBjb2duaXRvVXNlcjogQ29nbml0b1VzZXIgPSBhd2FpdCB0aGlzLmF1dGguY3VycmVudEF1dGhlbnRpY2F0ZWRVc2VyKCk7XG5cbiAgICAvLyBOb3QgY2hlY2tpbmcgdGhhdCBwYXNzd29yZHMgYXJlIGRpZmZlcmVudC4gSXQgbWFrZXMgaXQgZWFzaWVyIHRvIHRlc3QuXG4gICAgY29uc3QgeyBjdXJyZW50VXNlciB9ID0gYXdhaXQgdGhpcy5wcm9maWxlU2VydmljZS5nZXRDdXJyZW50VXNlcigpO1xuXG4gICAgY29uc3QgeyBwYXNzSWRwLCBzaWduZWRDaGFsbGVuZ2UgfSA9IGF3YWl0IHRoaXMudmVyaWZ5UGFzc3dvcmQoXG4gICAgICBwYXNzd29yZCxcbiAgICAgIGN1cnJlbnRVc2VyXG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMS0tXG4gICAgLy8gdmVyaWZ5UGFzc3dvcmQoKSBhc2tzIGZvciBhIGN1cnJlbnQgcGFzc3dvcmQgY2hhbGxlbmdlIGhlbmNlIGNoYW5nZXMgc2VydmVyIHN0YXRlLlxuICAgIC8vIFBsYWNlIGJyZWFrIHBvaW50cyBoZXJlIHRvIHRlc3QgdGhlIGZhaWx1cmUgc2NlbmFyaW9zLlxuXG4gICAgLy8gR2VuZXJhdGUgdGhlIG5ldyBwYXNzSWRwXG4gICAgY29uc3QgbmV3UGFzc0tleSA9IGF3YWl0IHRoaXMuY3JlYXRlUGFzc0tleUJ1bmRsZShuZXdQYXNzd29yZCk7XG5cbiAgICAvLyBSZS1lbmNyeXB0IG1hc3RlciBrZXkgd2l0aCBuZXcga2V5XG4gICAgY29uc3QgbWFzdGVyS2V5ID0gYXdhaXQgdGhpcy5rZXlHcmFwaC5nZXRLZXkoXG4gICAgICBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5tYXN0ZXJLZXkuaWRcbiAgICApO1xuICAgIGNvbnN0IG5ld1dyYXBwZWRNYXN0ZXJLZXkgPSBhd2FpdCB0aGlzLmVuY3J5cHRpb25TZXJ2aWNlLmVuY3J5cHQoXG4gICAgICBuZXdQYXNzS2V5LnBhc3NLZXksXG4gICAgICBtYXN0ZXJLZXkuandrLnRvSlNPTih0cnVlKVxuICAgICk7XG5cbiAgICAvLyBJZiB0aGUgSWRQIGNoYW5nZSBwYXNzd29yZCBmYWlsZWQsIHdlIG5lZWQgdG8gZ28gaW50byByZWNvdmVyeSBtb2RlIGJ5IGZvcmNpbmdcbiAgICAvLyBhIGxvZ2luLiBXZSBjYW4ndCBsb2dvdXQgdGhlIHVzZXIganVzdCB5ZXQgc2luY2UgdGhlIElkUCBwYXNzd29yZCBjaGFuZ2UgbmVlZHNcbiAgICAvLyB0aGUgdXNlciB0byBiZSBsb2dnZWQgaW4uIFdlIF9jYW5fIHJlbW92ZWQgYW55IHBlcnNpc3RlZCBzZXNzaW9uIHZhbHVlcyBmb3IgdGhlIElkUFxuICAgIC8vIGJ1dCB0aGF0IHNlZW1zIGxpa2UgdG9vIG11Y2ggdHJvdWJsZS5cblxuICAgIGNvbnN0IHsgdG9rZW4gfSA9IGF3YWl0IHRoaXMuY2hhbmdlUGFzc3dvcmRNdXRhdGlvbihcbiAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICAgIGN1cnJlbnRVc2VyLmN1cnJlbnRVc2VyS2V5Lm1hc3RlcktleS5pZCxcbiAgICAgIG5ld1dyYXBwZWRNYXN0ZXJLZXksXG4gICAgICBuZXdQYXNzS2V5XG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMi0tXG4gICAgLy8gY2hhbmdlUGFzc3dvcmRNdXRhdGlvbigpIHVwbG9hZHMgbmV3IGtleXMgYW5kIG9idGFpbnMgYSBzZW1hcGhvcmUgbG9jayB0byBwcmV2ZW50IGFueSBvdGhlclxuICAgIC8vIGNsaWVudHMgZnJvbSBwZXJmb3JtaW5nIElkUCBwYXNzd29yZCBjaGFuZ2UuXG5cbiAgICAvLyBOb3cgd2UgY2FuIGRvIHRoZSBJZFAgcGFzc3dvcmQgY2hhbmdlLlxuICAgIC8vIHRvZG86IEFkZCB0aGlzIGJhY2sgaW5cbiAgICBhd2FpdCB0aGlzLmF1dGguY2hhbmdlUGFzc3dvcmQoXG4gICAgICBjb2duaXRvVXNlcixcbiAgICAgIHRoaXMuZ2V0UGFzc0lkcFN0cmluZyhwYXNzSWRwKSxcbiAgICAgIHRoaXMuZ2V0UGFzc0lkcFN0cmluZyhuZXdQYXNzS2V5LnBhc3NJZHApXG4gICAgKTtcblxuICAgIC8vIC0tUG90ZW50aWFsIEZhaWx1cmUgUG9pbnQgMy0tXG4gICAgLy8gSWRQIHBhc3N3b3JkIGNoYW5nZVxuXG4gICAgLy8gTm90ZSB0aGF0IGNoYW5nZVBhc3N3b3JkKCkgY291bGQgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBhIG51bWJlciBvZiByZWFzb24uIEl0IGNvdWxkIHRocm93XG4gICAgLy8gYSBuZXR3b3JrIHRpbWVvdXQgZm9yIGV4YW1wbGUuIEJ1dCB3ZSBkb24ndCBrbm93IGlmIGl0J3MgdGhlIHJlc3BvbnNlIHRoYXQgdGltZWQgb3V0IGFuZFxuICAgIC8vIHRoZSBpZHAgcGFzc3dvcmQgY2hhbmdlIHdhcyBhY3R1YWxseSBjYXJyaWVkIG91dC4gU28gd2UgaGF2ZSB0byBiZSBleHRyYSBjb25zZXJ2YXRpdmUgYW5kXG4gICAgLy8gb25seSBhY3Qgb24gYSBjbGVhciBzdWNjZXNzLiBPdGhlcndpc2Ugd2UgZ28gaW50byByZWNvdmVyIG1vZGUuXG4gICAgYXdhaXQgdGhpcy5jaGFuZ2VQYXNzd29yZENvbXBsZXRlKHsgdXNlTmV3UGFzc3dvcmQ6IHRydWUsIHRva2VuIH0pO1xuICB9XG5cbiAgcHVibGljIGFzeW5jIGNoYW5nZVBhc3N3b3JkQ29tcGxldGUob3B0aW9uczoge1xuICAgIHVzZU5ld1Bhc3N3b3JkOiBib29sZWFuO1xuICAgIHRva2VuPzogc3RyaW5nO1xuICB9KSB7XG4gICAgY29uc3QgeyB1c2VOZXdQYXNzd29yZCwgdG9rZW4gfSA9IG9wdGlvbnM7XG4gICAgcmV0dXJuIHRoaXMuaHR0cFxuICAgICAgLnBvc3QoXG4gICAgICAgIGAke3RoaXMuY29uZmlnLmF1dGhVcmx9dXNlcnMvcGFzc3dvcmQtY2hhbmdlLWNvbXBsZXRlL2AsXG4gICAgICAgIHtcbiAgICAgICAgICB1c2VfbmV3X3Bhc3N3b3JkOiB1c2VOZXdQYXNzd29yZCxcbiAgICAgICAgICAuLi4odG9rZW4gJiYgeyB0b2tlbiB9KSxcbiAgICAgICAgfSxcbiAgICAgICAgYXdhaXQgaHR0cE9wdGlvbnModGhpcy5hdXRoLCB0aGlzLmNvbmZpZylcbiAgICAgIClcbiAgICAgIC50b1Byb21pc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgYXN5bmMgZ2V0VmVyaWZpZXJQcksoXG4gICAgcGFzc0tleTogSldLLktleSxcbiAgICB3cmFwcGVkUHJLOiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PlxuICApOiBQcm9taXNlPEpXSy5LZXk+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcHJrSnNvbiA9IGF3YWl0IHRoaXMuZW5jcnlwdGlvblNlcnZpY2UuZGVjcnlwdChwYXNzS2V5LCB3cmFwcGVkUHJLKTtcbiAgICAgIHJldHVybiBLRlMuYXNLZXkocHJrSnNvbik7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBLY0F1dGhFeGNlcHRpb24oJ1dyb25nIGN1cnJlbnQgcGFzc3dvcmQnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGFzeW5jIHZlcmlmeVBhc3N3b3JkKFxuICAgIHBhc3N3b3JkOiBDcnlwdG9LZXksXG4gICAgY3VycmVudFVzZXI6IEFwaUN1cnJlbnRVc2VyXG4gICk6IFByb21pc2U8eyBwYXNzSWRwOiBKV0suS2V5OyBzaWduZWRDaGFsbGVuZ2U6IEpXUy5DcmVhdGVTaWduUmVzdWx0IH0+IHtcbiAgICAvLyBHZXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgc2VydmVyIHRvIHByZXBhcmUgZm9yIHBhc3N3b3JkIGNoYW5nZS5cbiAgICBjb25zdCBwYXNzd29yZFJlcXVlc3QgPVxuICAgICAgYXdhaXQgdGhpcy5hcG9sbG8ubXV0YXRlPFBhc3N3b3JkQ2hhbmdlUmVxdWVzdE11dGF0aW9uPih7XG4gICAgICAgIG11dGF0aW9uOiBQYXNzd29yZENoYW5nZVJlcXVlc3RNdXRhdGlvbixcbiAgICAgICAgdmFyaWFibGVzOiB7fSxcbiAgICAgIH0pO1xuXG4gICAgLy8gR2V0IHRoZSBvbGQgcGFzc0tleSBzbyB3ZSBjYW4gZGVjcnlwdCB0aGUgb2xkIHBhc3N3b3JkIHZlcmlmaWVyXG4gICAgY29uc3QgcGFzc0tleVJlc3VsdCA9IGF3YWl0IHRoaXMua2V5RmFjdG9yeS5kZXJpdmVQYXNzS2V5KHtcbiAgICAgIHBhc3N3b3JkLFxuICAgICAgLi4uY3VycmVudFVzZXIuY3VycmVudFVzZXJLZXkucGFzc0tleS5wYXNzS2V5UGFyYW1zLFxuICAgIH0pO1xuXG4gICAgY29uc3QgdmVyaWZpZXJQcksgPSBhd2FpdCB0aGlzLmdldFZlcmlmaWVyUHJLKFxuICAgICAgcGFzc0tleVJlc3VsdC5qd2ssXG4gICAgICBjdXJyZW50VXNlci5jdXJyZW50VXNlcktleS5wYXNzS2V5LndyYXBwZWRQYXNzSWRwVmVyaWZpZXJQcmtcbiAgICApO1xuXG4gICAgLy8gU2lnbiB0aGUgc2VydmVyIGNoYWxsZW5nZSB0byBwcm92ZSB0byB0aGUgc2VydmVyIHdlIGNhbiBkZWNyeXB0IHRoZSBwYXNzd29yZCB2ZXJpZmllci5cbiAgICAvLyBHZW5lcmF0ZVxuICAgIGNvbnN0IGNsaWVudE5vbmNlID0gdGhpcy5rZXlGYWN0b3J5LnJhbmRvbVN0cmluZyh0aGlzLkNMSUVOVF9OT05DRV9MRU5HVEgpO1xuXG4gICAgY29uc3Qgc2lnbmVkQ2hhbGxlbmdlID0gYXdhaXQgdGhpcy5lbmNyeXB0aW9uU2VydmljZS5zaWduKHZlcmlmaWVyUHJLLCB7XG4gICAgICBzZXJ2ZXJOb25jZTogcGFzc3dvcmRSZXF1ZXN0LnBhc3N3b3JkQ2hhbmdlUmVxdWVzdC5jaGFsbGVuZ2Uuc2VydmVyTm9uY2UsXG4gICAgICBjbGllbnROb25jZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHBhc3NJZHBSZXN1bHQgPSBhd2FpdCB0aGlzLmtleUZhY3RvcnkuZGVyaXZlUGFzc0lkcCh7XG4gICAgICBwYXNzd29yZCxcbiAgICAgIC4uLmN1cnJlbnRVc2VyLmN1cnJlbnRVc2VyS2V5LnBhc3NLZXkucGFzc0lkcFBhcmFtcyxcbiAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICBwYXNzSWRwOiBwYXNzSWRwUmVzdWx0Lmp3ayxcbiAgICAgIHNpZ25lZENoYWxsZW5nZSxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBjaGFuZ2VQYXNzd29yZE11dGF0aW9uKFxuICAgIHNpZ25lZENoYWxsZW5nZTogSldTLkNyZWF0ZVNpZ25SZXN1bHQsXG4gICAgbWFzdGVyS2V5SWQ6IHN0cmluZyxcbiAgICBuZXdXcmFwcGVkTWFzdGVyS2V5OiBSZWNvcmQ8c3RyaW5nLCBKU09OT2JqZWN0PixcbiAgICBwYXNzS2V5QnVuZGxlOiBQYXNzS2V5QnVuZGxlXG4gICk6IFByb21pc2U8eyB0b2tlbjogc3RyaW5nOyBuZXdQYXNzS2V5SWQ6IHN0cmluZyB9PiB7XG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmFwb2xsby5tdXRhdGU8UGFzc3dvcmRDaGFuZ2VNdXRhdGlvbj4oe1xuICAgICAgbXV0YXRpb246IFBhc3N3b3JkQ2hhbmdlTXV0YXRpb24sXG4gICAgICB2YXJpYWJsZXM6IHtcbiAgICAgICAgaW5wdXQ6IHtcbiAgICAgICAgICBzaWduZWRDaGFsbGVuZ2U6IEpTT04uc3RyaW5naWZ5KHNpZ25lZENoYWxsZW5nZSksXG4gICAgICAgICAgbWFzdGVyS2V5SWQsXG4gICAgICAgICAgbmV3V3JhcHBlZE1hc3RlcktleTogSlNPTi5zdHJpbmdpZnkobmV3V3JhcHBlZE1hc3RlcktleSksXG4gICAgICAgICAgbmV3UGFzc0tleToge1xuICAgICAgICAgICAgcGFzc0lkcFBhcmFtczogSlNPTi5zdHJpbmdpZnkocGFzc0tleUJ1bmRsZS5wYXNzSWRwUGFyYW1zKSxcbiAgICAgICAgICAgIHBhc3NJZHBWZXJpZmllclBiazogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHBhc3NLZXlCdW5kbGUucGFzc0lkcFZlcmlmaWVyLnRvSlNPTigpXG4gICAgICAgICAgICApLFxuICAgICAgICAgICAgd3JhcHBlZFBhc3NJZHBWZXJpZmllclByazogSlNPTi5zdHJpbmdpZnkoXG4gICAgICAgICAgICAgIHBhc3NLZXlCdW5kbGUud3JhcHBlZFBhc3NJZHBWZXJpZmllclBya1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHBhc3NLZXlQYXJhbXM6IEpTT04uc3RyaW5naWZ5KHBhc3NLZXlCdW5kbGUucGFzc0tleVBhcmFtcyksXG4gICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHtcbiAgICAgIHRva2VuOiByZXNwb25zZS5wYXNzd29yZENoYW5nZS50b2tlbixcbiAgICAgIG5ld1Bhc3NLZXlJZDogcmVzcG9uc2UucGFzc3dvcmRDaGFuZ2UubmV3UGFzc0tleS5pZCxcbiAgICB9O1xuICB9XG5cbiAgYXN5bmMgZ2V0Q2hhbmdlUGFzc3dvcmRDb25maWcoKTogUHJvbWlzZTxQYXNzd29yZENoYW5nZUNvbmZpZz4ge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgY29uc3QgcmVzID0gYXdhaXQgdGhpcy5hcG9sbG8ucXVlcnk8YW55Pih7XG4gICAgICBxdWVyeTogUGFzc3dvcmRDaGFuZ2VDb25maWdRdWVyeSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHJldCA9IHJlcy5wYXNzd29yZENoYW5nZUNvbmZpZyBhcyBQYXNzd29yZENoYW5nZUNvbmZpZztcblxuICAgIHJldC5hdXRoVGltZSA9IG5ldyBEYXRlKHJldC5hdXRoVGltZSk7XG4gICAgcmV0LnNlcnZlclRpbWUgPSBuZXcgRGF0ZShyZXQuc2VydmVyVGltZSk7XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIHB1YmxpYyBwYXNzd29yZFN0cmVuZ3RoKHBhc3N3b3JkKTogeyB5ZWFyczogbnVtYmVyOyBiaXRzOiBudW1iZXIgfSB7XG4gICAgY29uc3QgdXBwZXIgPSAvW0EtWl0vZztcbiAgICBjb25zdCBsb3dlciA9IC9bYS16XS9nO1xuICAgIGNvbnN0IGRpZ2l0ID0gL1swLTldL2c7XG5cbiAgICBjb25zdCB1cHBlckNob2ljZXMgPSAyNjtcbiAgICBjb25zdCBsb3dlckNob2ljZXMgPSAyNjtcbiAgICBjb25zdCBkaWdpdENob2ljZXMgPSAxMDtcbiAgICBjb25zdCBzcGVjaWFsQ2hvaWNlcyA9IDMwOyAvLyAvWyFcIiMkJSYnKCkqKywtLi86Ozw9Pj9AW1xcXV5fYHt8fX5dL2dcblxuICAgIGZ1bmN0aW9uIGluc3RhbmNlQ291bnQoc3RyLCByZSkge1xuICAgICAgcmV0dXJuICgoc3RyIHx8ICcnKS5tYXRjaChyZSkgfHwgW10pLmxlbmd0aDtcbiAgICB9XG5cbiAgICBjb25zdCB1cHBlcnMgPSBpbnN0YW5jZUNvdW50KHBhc3N3b3JkLCB1cHBlcik7XG4gICAgY29uc3QgbG93ZXJzID0gaW5zdGFuY2VDb3VudChwYXNzd29yZCwgbG93ZXIpO1xuICAgIGNvbnN0IGRpZ2l0cyA9IGluc3RhbmNlQ291bnQocGFzc3dvcmQsIGRpZ2l0KTtcbiAgICBjb25zdCBzcGVjaWFscyA9IHBhc3N3b3JkLmxlbmd0aCAtIHVwcGVycyAtIGxvd2VycyAtIGRpZ2l0cztcblxuICAgIGxldCBjaG9pY2VzID0gMDtcbiAgICBpZiAodXBwZXJzKSB7XG4gICAgICBjaG9pY2VzICs9IHVwcGVyQ2hvaWNlcztcbiAgICB9XG4gICAgaWYgKGxvd2Vycykge1xuICAgICAgY2hvaWNlcyArPSBsb3dlckNob2ljZXM7XG4gICAgfVxuICAgIGlmIChkaWdpdHMpIHtcbiAgICAgIGNob2ljZXMgKz0gZGlnaXRDaG9pY2VzO1xuICAgIH1cbiAgICBpZiAoc3BlY2lhbHMpIHtcbiAgICAgIGNob2ljZXMgKz0gc3BlY2lhbENob2ljZXM7XG4gICAgfVxuXG4gICAgaWYgKHBhc3N3b3JkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgeWVhcnM6IDAsXG4gICAgICAgIC8vIGJpdHMgb2YgZW50cm9weVxuICAgICAgICBiaXRzOiAwLFxuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBwZXJtdXRhdGlvbnMgPSBNYXRoLnBvdyhjaG9pY2VzLCBwYXNzd29yZC5sZW5ndGgpO1xuXG4gICAgY29uc3QgeWVhcnMgPVxuICAgICAgKDU0MDAwICogcGVybXV0YXRpb25zKSAvXG4gICAgICBNYXRoLnBvdyh1cHBlckNob2ljZXMgKyBsb3dlckNob2ljZXMgKyBkaWdpdENob2ljZXMsIDEyKTtcbiAgICByZXR1cm4ge1xuICAgICAgeWVhcnMsXG4gICAgICAvLyBiaXRzIG9mIGVudHJvcHlcbiAgICAgIGJpdHM6IE1hdGgucm91bmQoTWF0aC5sb2cyKHBlcm11dGF0aW9ucykpLFxuICAgIH07XG4gIH1cbn1cbiJdfQ==
|