@c8y/ngx-components 1017.0.152 → 1017.0.153
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/esm2020/trusted-certificates/trusted-certificates.component.mjs +2 -2
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs +1 -1
- package/fesm2015/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs +1 -1
- package/fesm2020/c8y-ngx-components-trusted-certificates.mjs.map +1 -1
- package/locales/locales.pot +1 -1
- package/package.json +2 -2
|
@@ -27,7 +27,7 @@ export class TrustedCertificatesComponent {
|
|
|
27
27
|
this.translateService = translateService;
|
|
28
28
|
this.clipboardService = clipboardService;
|
|
29
29
|
this.PROOF_OF_POSSESSION_POPOVER = gettext('"Proof of possession" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.');
|
|
30
|
-
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>');
|
|
30
|
+
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A');
|
|
31
31
|
this.reloading = new BehaviorSubject(false);
|
|
32
32
|
this.reload = new BehaviorSubject(null);
|
|
33
33
|
this.trustedCertificates = this.reload.pipe(tap(() => this.reloading.next(true)), switchMap(() => this.getTrustedCertificates()), tap(() => this.reloading.next(false)));
|
|
@@ -149,4 +149,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImpor
|
|
|
149
149
|
type: Component,
|
|
150
150
|
args: [{ selector: 'c8y-trusted-certificates', template: "<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n" }]
|
|
151
151
|
}], ctorParameters: function () { return [{ type: i1.BsModalService }, { type: i2.AlertService }, { type: i3.TrustedCertificateService }, { type: i2.ModalService }, { type: i4.TranslateService }, { type: i2.ClipboardService }]; } });
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBdUIseUJBQXlCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBTW5DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFD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cG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRydXN0ZWQtY2VydGlmaWNhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGlwZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4nXG4gICk7XG5cbiAgcmVsb2FkaW5nOiBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KGZhbHNlKTtcbiAgcmVsb2FkOiBCZWhhdmlvclN1YmplY3Q8dm9pZD4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuICB0cnVzdGVkQ2VydGlmaWNhdGVzOiBPYnNlcnZhYmxlPElSZXN1bHRMaXN0PElUcnVzdGVkQ2VydGlmaWNhdGU+PiA9IHRoaXMucmVsb2FkLnBpcGUoXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQodHJ1ZSkpLFxuICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSksXG4gICAgdGFwKCgpID0+IHRoaXMucmVsb2FkaW5nLm5leHQoZmFsc2UpKVxuICApO1xuICBzb3J0QnlFeHBpcmF0aW9uRGF0ZUFzYyA9IHBpcGUoXG4gICAgdGFwKChyZXN1bHRzOiBJVHJ1c3RlZENlcnRpZmljYXRlW10pID0+IHtcbiAgICAgIHJldHVybiByZXN1bHRzLnNvcnQoKG4xLCBuMikgPT4gbjEubm90QWZ0ZXIubG9jYWxlQ29tcGFyZShuMi5ub3RBZnRlcikpO1xuICAgIH0pXG4gICk7XG5cbiAgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZTogc3RyaW5nO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgYnNNb2RhbDogQnNNb2RhbFNlcnZpY2UsXG4gICAgcHJpdmF0ZSBhbGVydFNlcnZpY2U6IEFsZXJ0U2VydmljZSxcbiAgICBwcml2YXRlIHRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2U6IFRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBtb2RhbFNlcnZpY2U6IE1vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIHRyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgcHJpdmF0ZSBjbGlwYm9hcmRTZXJ2aWNlOiBDbGlwYm9hcmRTZXJ2aWNlXG4gICkge31cblxuICBhc3luYyBuZ09uSW5pdCgpIHtcbiAgICBhd2FpdCB0aGlzLmxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCk7XG4gIH1cblxuICBhc3luYyBsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpIHtcbiAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gIH1cblxuICBnZXRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIGNvbnN0IGZpbHRlcjogb2JqZWN0ID0ge1xuICAgICAgcGFnZVNpemU6IDEwMDAsXG4gICAgICB3aXRoVG90YWxQYWdlczogdHJ1ZVxuICAgIH07XG4gICAgcmV0dXJuIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5saXN0KGZpbHRlcik7XG4gIH1cblxuICBhc3luYyBhZGRUcnVzdGVkQ2VydGlmaWNhdGUoKSB7XG4gICAgY29uc3QgbW9kYWwgPSB0aGlzLmJzTW9kYWwuc2hvdyhBZGRUcnVzdGVkQ2VydGlmaWNhdGVDb21wb25lbnQsIHtcbiAgICAgIGNsYXNzOiAnbW9kYWwtc20nLFxuICAgICAgYXJpYURlc2NyaWJlZGJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbERlc2NyaXB0aW9uJyxcbiAgICAgIGFyaWFMYWJlbGxlZEJ5OiAnYWRkQ2VydGlmaWNhdGVNb2RhbFRpdGxlJyxcbiAgICAgIGlnbm9yZUJhY2tkcm9wQ2xpY2s6IHRydWVcbiAgICB9KS5jb250ZW50IGFzIEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudDtcbiAgICB0cnkge1xuICAgICAgYXdhaXQgbW9kYWwucmVzdWx0O1xuICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgICB9IGNhdGNoIChleCkge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZShjZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHRpdGxlID0gZ2V0dGV4dCgnRGVsZXRlIHRydXN0ZWQgY2VydGlmaWNhdGUnKTtcbiAgICBjb25zdCBjb25maXJtYXRpb25UZXh0ID0gZ2V0dGV4dChcbiAgICAgICdZb3UgYXJlIGFib3V0IHRvIGRlbGV0ZSBhIHRydXN0ZWQgY2VydGlmaWNhdGUgXCJ7eyBjZXJ0aWZpY2F0ZU5hbWUgfX1cIi4nXG4gICAgKTtcbiAgICBjb25zdCBmaW5hbFF1ZXN0aW9uID0gZ2V0dGV4dCgnRG8geW91IHdhbnQgdG8gcHJvY2VlZD8nKTtcbiAgICBjb25zdCBjZXJ0aWZpY2F0ZU5hbWUgPSBjZXJ0aWZpY2F0ZS5uYW1lO1xuICAgIGNvbnN0IGJvZHkgPSBbXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChjb25maXJtYXRpb25UZXh0LCB7XG4gICAgICAgIGNlcnRpZmljYXRlTmFtZVxuICAgICAgfSksXG4gICAgICB0aGlzLnRyYW5zbGF0ZVNlcnZpY2UuaW5zdGFudChmaW5hbFF1ZXN0aW9uKVxuICAgIF0uam9pbignICcpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMubW9kYWxTZXJ2aWNlLmNvbmZpcm0odGl0bGUsIGJvZHksIFN0YXR1cy5EQU5HRVIsIHsgb2s6IGdldHRleHQoJ0RlbGV0ZScpIH0pO1xuICAgICAgYXdhaXQgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmRlbGV0ZShjZXJ0aWZpY2F0ZS5maW5nZXJwcmludCk7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ0NlcnRpZmljYXRlIGRlbGV0ZWQuJykpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBhc3luYyB1cGRhdGVDZXJ0aWZpY2F0ZShcbiAgICB0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUsXG4gICAgdXBkYXRpbmdQYXJ0OiBQYXJ0aWFsPElUcnVzdGVkQ2VydGlmaWNhdGU+XG4gICkge1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UudXBkYXRlKHtcbiAgICAgICAgZmluZ2VycHJpbnQ6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5maW5nZXJwcmludCxcbiAgICAgICAgLi4udXBkYXRpbmdQYXJ0XG4gICAgICB9KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgc2F2ZWQuJykpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KTtcbiAgICB9XG4gIH1cblxuICBoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXMoaXRlbTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IHdhcm5pbmdPZmZzZXQgPSAyNCAqIDYwICogNjAgKiAxMDAwICogOTA7IC8vIDkwIGRheXNcbiAgICBjb25zdCB0b2RheVRpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgIGNvbnN0IHdhcm5pbmdUaW1lc3RhbXAgPSBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIHdhcm5pbmdPZmZzZXQ7XG4gICAgY29uc3Qgbm90QWZ0ZXJUaW1lc3RhbXAgPSBuZXcgRGF0ZShpdGVtLm5vdEFmdGVyKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZXhwaXJlZCA9IG5vdEFmdGVyVGltZXN0YW1wIDwgdG9kYXlUaW1lc3RhbXA7XG4gICAgY29uc3QgZXhwaXJlc0luTGVzc1RoYW45MERheXMgPSBub3RBZnRlclRpbWVzdGFtcCA8IHdhcm5pbmdUaW1lc3RhbXA7XG4gICAgaWYgKGV4cGlyZWQpIHtcbiAgICAgIHJldHVybiAndGV4dC1kYW5nZXInO1xuICAgIH1cbiAgICBpZiAoZXhwaXJlc0luTGVzc1RoYW45MERheXMpIHtcbiAgICAgIHJldHVybiAndGV4dC13YXJuaW5nJztcbiAgICB9XG4gICAgcmV0dXJuICcnO1xuICB9XG5cbiAgcmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGU6IElUcnVzdGVkQ2VydGlmaWNhdGUpIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UucmVnZW5lcmF0ZVBvUFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKS50aGVuKFxuICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgIGFzc2lnbih0cnVzdGVkQ2VydGlmaWNhdGUsIGRhdGEpO1xuICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1ZlcmlmaWNhdGlvbiBjb2RlIHJlZ2VuZXJhdGVkLicpKTtcbiAgICAgIH0sXG4gICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICk7XG4gIH1cblxuICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmdcbiAgKSB7XG4gICAgdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlXG4gICAgICAudmVyaWZ5U2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpXG4gICAgICAudGhlbihcbiAgICAgICAgKHsgZGF0YSB9KSA9PiB7XG4gICAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUgdmVyaWZpZWQuJykpO1xuICAgICAgICB9LFxuICAgICAgICBleCA9PiB0aGlzLmFsZXJ0U2VydmljZS5hZGRTZXJ2ZXJGYWlsdXJlKGV4KVxuICAgICAgKTtcbiAgfVxuXG4gIGRvd25sb2FkVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIGNvbnN0IGJsb2IgPSBuZXcgQmxvYihbdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXSk7XG4gICAgY29uc3QgZmlsZU5hbWUgPSB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZTtcbiAgICBzYXZlQXMoYmxvYiwgYCR7ZmlsZU5hbWV9LnR4dGApO1xuICB9XG5cbiAgY29weVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVRvQ2xpcGJvYXJkKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMuY2xpcGJvYXJkU2VydmljZS53cml0ZVRleHQodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKTtcbiAgfVxuXG4gIG9uRmlsZUlucHV0KGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSBldmVudC50YXJnZXQ7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcbiAgICByZWFkZXIub25sb2FkID0gKCkgPT4ge1xuICAgICAgdGhpcy5zaWduZWRWZXJpZmljYXRpb25Db2RlID0gcmVhZGVyLnJlc3VsdCBhcyBzdHJpbmc7XG4gICAgfTtcbiAgICByZWFkZXIucmVhZEFzVGV4dChpbnB1dC5maWxlc1swXSk7XG4gIH1cbn1cbiIsIjxjOHktdGl0bGU+e3sgJ1RydXN0ZWQgY2VydGlmaWNhdGVzJyB8IHRyYW5zbGF0ZSB9fTwvYzh5LXRpdGxlPlxuXG48Yzh5LWJyZWFkY3J1bWI+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnTWFuYWdlbWVudCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGljb249XCJjOHktbWFuYWdlbWVudFwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG4gIDxjOHktYnJlYWRjcnVtYi1pdGVtXG4gICAgbGFiZWw9XCJ7eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBpY29uPVwiY2VydGlmaWNhdGVcIlxuICA+PC9jOHktYnJlYWRjcnVtYi1pdGVtPlxuPC9jOHktYnJlYWRjcnVtYj5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rXCJcbiAgICAoY2xpY2spPVwiYWRkVHJ1c3RlZENlcnRpZmljYXRlKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInBsdXMtY2lyY2xlXCI+PC9pPlxuICAgIHt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS1hY3Rpb24tYmFyLWl0ZW0+XG5cbjxjOHktYWN0aW9uLWJhci1pdGVtIFtwbGFjZW1lbnRdPVwiJ3JpZ2h0J1wiPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJsb2FkVHJ1c3RlZENlcnRpZmljYXRlcygpXCJcbiAgPlxuICAgIDxpIGM4eUljb249XCJyZWZyZXNoXCIgW25nQ2xhc3NdPVwieyAnaWNvbi1zcGluJzogcmVsb2FkaW5nIHwgYXN5bmMgfVwiPjwvaT5cbiAgICB7eyAnUmVsb2FkJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1oZWxwIHNyYz1cIi91c2Vycy1ndWlkZS9kZXZpY2UtbWFuYWdlbWVudC8jdHJ1c3RlZC1jZXJ0aWZpY2F0ZXNcIj48L2M4eS1oZWxwPlxuXG48Yzh5LXVpLWVtcHR5LXN0YXRlXG4gICpuZ0lmPVwiKHRydXN0ZWRDZXJ0aWZpY2F0ZXMgfCBhc3luYyk/LmRhdGEubGVuZ3RoID09PSAwXCJcbiAgW2ljb25dPVwiJ2NlcnRpZmljYXRlJ1wiXG4gIFt0aXRsZV09XCInTm8gdHJ1c3RlZCBjZXJ0aWZpY2F0ZXMgdG8gZGlzcGxheS4nIHwgdHJhbnNsYXRlXCJcbiAgW3N1YnRpdGxlXT1cIidBZGQgeW91ciBmaXJzdCBjZXJ0aWZpY2F0ZSBieSBjbGlja2luZyBiZWxvdy4nIHwgdHJhbnNsYXRlXCJcbj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgKGNsaWNrKT1cImFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpXCJcbiAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeVwiXG4gID5cbiAgICB7eyAnQWRkIHRydXN0ZWQgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktdWktZW1wdHktc3RhdGU+XG5cbjxjOHktbGlzdC1ncm91cCBjbGFzcz1cIm0tYi0yNFwiPlxuICA8ZGl2XG4gICAgKm5nSWY9XCIodHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPiAwXCJcbiAgICBjbGFzcz1cInBhZ2Utc3RpY2t5LWhlYWRlciBoaWRkZW4teHMgYzh5LWxpc3RfX2l0ZW0gYzh5LWxpc3RfX2l0ZW0tLWVtcHR5LWFjdGlvbnNcIlxuICA+XG4gICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19ibG9ja1wiPlxuICAgICAgPGRpdiBjbGFzcz1cImM4eS1saXN0X19pdGVtX19pY29uXCI+XG4gICAgICAgIDxpIGM4eUljb249XCJjZXJ0aWZpY2F0ZVwiIGNsYXNzPVwiaW52aXNpYmxlXCI+PC9pPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2JvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fSBcIj5cbiAgICAgICAgICAgICAge3sgJ0NlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnU3RhdHVzJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCIgdGl0bGU9XCIge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cIj5cbiAgICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2FjdGlvbnNcIj48L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG5cbiAgPGM4eS1saVxuICAgICpjOHlGb3I9XCJcbiAgICAgIGxldCB0cnVzdGVkQ2VydGlmaWNhdGUgb2YgdHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jO1xuICAgICAgbGV0IGkgPSBpbmRleDtcbiAgICAgIHBpcGU6IHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjO1xuICAgICAgbG9hZE1vcmU6ICdub25lJ1xuICAgIFwiXG4gICAgI2xpc3RJdGVtXG4gID5cbiAgICA8Yzh5LWxpLWljb24+XG4gICAgICA8aSBjOHlJY29uPVwiY2VydGlmaWNhdGVcIj48L2k+XG4gICAgPC9jOHktbGktaWNvbj5cblxuICAgIDxjOHktbGktYm9keSBjbGFzcz1cImNvbnRlbnQtZmxleC02MFwiPlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cImJ0bi1jbGVhbiB0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH19XCJcbiAgICAgICAgICAoY2xpY2spPVwibGlzdEl0ZW0udG9nZ2xlQ29sbGFwc2VkKClcIlxuICAgICAgICA+XG4gICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidmlzaWJsZS14cyBwLThcIj48L2Rpdj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgIGNsYXNzPVwiYnRuIGM4eS1idG4tY2hlY2tib3gtLWlubGluZVwiXG4gICAgICAgICAgbmFtZT1cImNlcnRpZmljYXRlU3RhdHVzXCJcbiAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5zdGF0dXNcIlxuICAgICAgICAgIGJ0bkNoZWNrYm94XG4gICAgICAgICAgYnRuQ2hlY2tib3hUcnVlPVwiRU5BQkxFRFwiXG4gICAgICAgICAgYnRuQ2hlY2tib3hGYWxzZT1cIkRJU0FCTEVEXCJcbiAgICAgICAgICAobmdNb2RlbENoYW5nZSk9XCJ1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgc3RhdHVzOiAkZXZlbnQgfSlcIlxuICAgICAgICA+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdEaXNhYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0RJU0FCTEVEJ1wiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0Rpc2FibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgIFtoaWRkZW5dPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1cyAhPT0gJ0VOQUJMRUQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRW5hYmxlZGB0cnVzdGVkIGNlcnRpZmljYXRlIHN0YXR1c2AnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aXNpYmxlLXhzIHAtOFwiPjwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLmFsZ29yaXRobU5hbWUgfX1cIlxuICAgICAgICA+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci04IHZpc2libGUteHMtaW5saW5lXCIgdHJhbnNsYXRlPkFsZ29yaXRobTwvc3Bhbj5cbiAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiXG4gICAgICAgICAgdGl0bGU9XCJ7eyAnRXhwaXJhdGlvbiBkYXRlJyB8IHRyYW5zbGF0ZSB9fToge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS10LTggbS1yLTggdmlzaWJsZS14cy1pbmxpbmVcIiB0cmFuc2xhdGU+XG4gICAgICAgICAgICBFeHBpcmF0aW9uIGRhdGVcbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNtYWxsIFtuZ0NsYXNzXT1cImhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyh0cnVzdGVkQ2VydGlmaWNhdGUpXCI+XG4gICAgICAgICAgICA8aVxuICAgICAgICAgICAgICBjOHlJY29uPVwiY2FsZW5kYXJcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCIhaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJ3YXJuaW5nXCJcbiAgICAgICAgICAgICAgY2xhc3M9XCJtLXItNFwiXG4gICAgICAgICAgICAgICpuZ0lmPVwiaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgPjwvaT5cbiAgICAgICAgICAgIDxzcGFuPnt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RBZnRlciB8IGM4eURhdGUgfX08L3NwYW4+XG4gICAgICAgICAgPC9zbWFsbD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCJ0cnVzdGVkQ2VydGlmaWNhdGUuYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0VuYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFbmFibGVkYGF1dG8gcmVnaXN0cmF0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5hdXRvUmVnaXN0cmF0aW9uRW5hYmxlZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnRGlzYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdEaXNhYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yIGQtZmxleFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItNCB2aXNpYmxlLXhzLWlubGluZVwiPlxuICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInN1Y2Nlc3NcIiBjbGFzcz1cInRleHQtc3VjY2Vzc1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25WYWxpZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICdJbmNvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgfX1cIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWZsZXhcIj5cbiAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cIndhcm5pbmdcIiBjbGFzcz1cInRleHQtd2FybmluZ1wiPjwvaT5cbiAgICAgICAgICAgICAge3sgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJtLWwtYXV0byBidG4tZG90IGJ0bi1kb3QtLWRhbmdlciBidG4gc2hvd09uSG92ZXIgbS1yLThcIlxuICAgICAgICAgIChjbGljayk9XCJkZWxldGVUcnVzdGVkQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgdG9vbHRpcD1cInt7ICdEZWxldGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEZWxldGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxpIGM4eUljb249XCJkZWxldGVcIj48L2k+XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktYm9keT5cblxuICAgIDxjOHktbGktY29sbGFwc2U+XG4gICAgICA8ZGl2IGNsYXNzPVwicC10LTE2IHAtYi0xNlwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC00XCI+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwIGlucHV0LWdyb3VwLWVkaXRhYmxlXCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbFwiXG4gICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgIHJlcXVpcmVkXG4gICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8c3Bhbj48L3NwYW4+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImlucHV0LWdyb3VwLWJ0blwiPlxuICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdVcGRhdGUgY2VydGlmaWNhdGUgbmFtZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ2VydGlmaWNhdGUodHJ1c3RlZENlcnRpZmljYXRlLCB7IG5hbWU6IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lIH0pXG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUubmFtZVwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdTYXZlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTFcIj48L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTdcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cImNlcnRJblBlbUZvcm1hdFwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5DZXJ0aWZpY2F0ZTwvbGFiZWw+XG4gICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIG5hbWU9XCJjZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICByb3dzPVwiN1wiXG4gICAgICAgICAgICAgICAgcmVhZG9ubHlcbiAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5jZXJ0SW5QZW1Gb3JtYXRcIlxuICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICA8Yzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgIDxsYWJlbCB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cIiBjbGFzcz1cImM4eS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLmF1dG9SZWdpc3RyYXRpb25FbmFibGVkXCJcbiAgICAgICAgICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIlxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWQ6ICRldmVudCB9KVxuICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3Bhbj57eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19PC9zcGFuPlxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsZWdlbmQgZm9ybS1ibG9ja1wiIHRyYW5zbGF0ZT5BZGRpdGlvbmFsIHByb3BlcnRpZXM8L2Rpdj5cbiAgICAgICAgICAgIDx1bCBjbGFzcz1cImxpc3QtdW5zdHlsZWRcIj5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0FsZ29yaXRobScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1ZlcnNpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnZlcnNpb24gfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdWYWxpZCBmcm9tJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5ub3RCZWZvcmUgfCBjOHlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnSXNzdWVyJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5pc3N1ZXIgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1NlcmlhbCBudW1iZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnNlcmlhbE51bWJlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1N1YmplY3Rgb2YgYSBjZXJ0aWZpY2F0ZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLnN1YmplY3QgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCI+XG4gICAgICAgICAgICAgIHt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgIHBvcG92ZXI9XCJ7eyBQUk9PRl9PRl9QT1NTRVNTSU9OX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICB0cmlnZ2Vycz1cImZvY3VzXCJcbiAgICAgICAgICAgICAgICBjb250YWluZXI9XCJib2R5XCJcbiAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJyaWdodFwiXG4gICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPGRpdiAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAgICAgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZVxuICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tZmxleFwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic3VjY2Vzc1wiIGNsYXNzPVwidGV4dC1zdWNjZXNzXCI+PC9pPlxuICAgICAgICAgICAgICAgIHt7ICdDb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCI+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3cgbS1iLTE2XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC02XCI+XG4gICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICAgICAgICAgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgICAgIH19XCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJpY29uLWZsZXhcIlxuICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiIGNsYXNzPVwidGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICB7eyAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTYgdGV4dC1yaWdodC1tZFwiPlxuICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tci00XCI+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZmljYXRpb24gY29kZSBleHBpcmVzL2V4cGlyZWQgb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAodHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmVyaWZpY2F0aW9uQ29kZVVzYWJsZVVudGlsIHwgYzh5RGF0ZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAnLS0tJ1xuICAgICAgICAgICAgICAgICAgfX1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgICAgICAgICAgICBWZXJpZmljYXRpb24gY29kZVxuICAgICAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgICAgICA8dGV4dGFyZWFcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImZvcm0tY29udHJvbCBuby1yZXNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgIG5hbWU9XCJ1bnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwidW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgICByb3dzPVwiNVwiXG4gICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdSZWdlbmVyYXRlIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwicmVnZW5lcmF0ZVVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdSZWdlbmVyYXRlYHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1zbSBidG4tZGVmYXVsdCBtLWwtYXV0byBtLXItMFwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdDb3B5IHRvIGNsaXBib2FyZCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0NvcHkgdG8gY2xpcGJvYXJkJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJjb3B5VW5zaWduZWRWZXJpZmljYXRpb25Db2RlVG9DbGlwYm9hcmQodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiY2xpcGJvYXJkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1kZWZhdWx0IGJ0bi1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcD1cInt7ICdEb3dubG9hZCBhcyBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInRG93bmxvYWQgYXMgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwiZG93bmxvYWRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTYgY29sLWxnLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGZvcj1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIiBjbGFzcz1cImNvbnRyb2wtbGFiZWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnU2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4taGVscCBidG4taGVscC0tc21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFNJR05FRF9WRVJJRklDQVRJT05fQ09ERV9QT1BPVkVSIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0hlbHAnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2VtZW50PVwidG9wXCJcbiAgICAgICAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIGlkPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICA+PC90ZXh0YXJlYT5cbiAgICAgICAgICAgICAgICAgIDwvYzh5LWZvcm0tZ3JvdXA+XG4gICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZC1mbGV4XCI+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdWZXJpZnkgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnkgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSlcbiAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICB7eyAnVmVyaWZ5YHNpZ25lZCB2ZXJpZmljYXRpb24gY29kZWAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tbC1hdXRvXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ1VwbG9hZCBmaWxlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZmlsZUlucHV0LmNsaWNrKClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgYzh5SWNvbj1cInVwbG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxpbnB1dCAjZmlsZUlucHV0IHR5cGU9XCJmaWxlXCIgKGNoYW5nZSk9XCJvbkZpbGVJbnB1dCgkZXZlbnQpXCIgY2xhc3M9XCJoaWRkZW5cIiAvPlxuICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgPC9jOHktbGktY29sbGFwc2U+XG4gIDwvYzh5LWxpPlxuPC9jOHktbGlzdC1ncm91cD5cbiJdfQ==
|
|
152
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMvdHJ1c3RlZC1jZXJ0aWZpY2F0ZXMuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBVSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUsWUFBWSxFQUFFLGdCQUFnQixFQUFFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEcsT0FBTyxFQUFFLDhCQUE4QixFQUFFLE1BQU0scUNBQXFDLENBQUM7QUFDckYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3JELE9BQU8sRUFBdUIseUJBQXlCLEVBQWUsTUFBTSxhQUFhLENBQUM7QUFDMUYsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDdkQsT0FBTyxFQUFFLEdBQUcsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRCxPQUFPLEVBQUUsSUFBSSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUN6RCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3BDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxXQUFXLENBQUM7Ozs7Ozs7Ozs7O0FBTW5DLE1BQU0sT0FBTyw0QkFBNEI7SUF1QnZDLFlBQ1UsT0FBdUIsRUFDdkIsWUFBMEIsRUFDMUIseUJBQW9ELEVBQ3BELFlBQTBCLEVBQzFCLGdCQUFrQyxFQUNsQyxnQkFBa0M7UUFMbEMsWUFBTyxHQUFQLE9BQU8sQ0FBZ0I7UUFDdkIsaUJBQVksR0FBWixZQUFZLENBQWM7UUFD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cG9uZW50LCBPbkluaXQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFsZXJ0U2VydmljZSwgQ2xpcGJvYXJkU2VydmljZSwgZ2V0dGV4dCwgTW9kYWxTZXJ2aWNlLCBTdGF0dXMgfSBmcm9tICdAYzh5L25neC1jb21wb25lbnRzJztcbmltcG9ydCB7IEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCB9IGZyb20gJy4vYWRkLXRydXN0ZWQtY2VydGlmaWNhdGUuY29tcG9uZW50JztcbmltcG9ydCB7IEJzTW9kYWxTZXJ2aWNlIH0gZnJvbSAnbmd4LWJvb3RzdHJhcC9tb2RhbCc7XG5pbXBvcnQgeyBJVHJ1c3RlZENlcnRpZmljYXRlLCBUcnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLCBJUmVzdWx0TGlzdCB9IGZyb20gJ0BjOHkvY2xpZW50JztcbmltcG9ydCB7IFRyYW5zbGF0ZVNlcnZpY2UgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJztcbmltcG9ydCB7IHRhcCwgc3dpdGNoTWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgcGlwZSwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzYXZlQXMgfSBmcm9tICdmaWxlLXNhdmVyJztcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gJ2xvZGFzaC1lcyc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2M4eS10cnVzdGVkLWNlcnRpZmljYXRlcycsXG4gIHRlbXBsYXRlVXJsOiAnLi90cnVzdGVkLWNlcnRpZmljYXRlcy5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgVHJ1c3RlZENlcnRpZmljYXRlc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiA9IGdldHRleHQoXG4gICAgJ1wiUHJvb2Ygb2YgcG9zc2Vzc2lvblwiIGlzIGEgc2VjdXJpdHkgbWV0aG9kIHVzZWQgdG8gcHJvdmUgdGhhdCB3aG9ldmVyIHNlbmRzIGEgbWVzc2FnZSBpcyBhbHNvIGluIHRoZSBwb3NzZXNzaW9uIG9mIHRoZSBwYXJ0aWN1bGFyIGNyeXB0b2dyYXBoaWMga2V5LidcbiAgKTtcbiAgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgPSBnZXR0ZXh0KFxuICAgICdVc2UgdGhlIGZvbGxvd2luZyBvcGVuc3NsIGNvbW1hbmQgdG8gY3JlYXRlIHRoZSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGU6IG9wZW5zc2wgZGdzdCAtc2hhMjU2IC1zaWduIDxwcml2YXRlLmtleT4gPHZlcmlmaWNhdGlvbl9jb2RlLnR4dD4gfCBvcGVuc3NsIGJhc2U2NCAtQSdcbiAgKTtcblxuICByZWxvYWRpbmc6IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPiA9IG5ldyBCZWhhdmlvclN1YmplY3QoZmFsc2UpO1xuICByZWxvYWQ6IEJlaGF2aW9yU3ViamVjdDx2b2lkPiA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7XG4gIHRydXN0ZWRDZXJ0aWZpY2F0ZXM6IE9ic2VydmFibGU8SVJlc3VsdExpc3Q8SVRydXN0ZWRDZXJ0aWZpY2F0ZT4+ID0gdGhpcy5yZWxvYWQucGlwZShcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dCh0cnVlKSksXG4gICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuZ2V0VHJ1c3RlZENlcnRpZmljYXRlcygpKSxcbiAgICB0YXAoKCkgPT4gdGhpcy5yZWxvYWRpbmcubmV4dChmYWxzZSkpXG4gICk7XG4gIHNvcnRCeUV4cGlyYXRpb25EYXRlQXNjID0gcGlwZShcbiAgICB0YXAoKHJlc3VsdHM6IElUcnVzdGVkQ2VydGlmaWNhdGVbXSkgPT4ge1xuICAgICAgcmV0dXJuIHJlc3VsdHMuc29ydCgobjEsIG4yKSA9PiBuMS5ub3RBZnRlci5sb2NhbGVDb21wYXJlKG4yLm5vdEFmdGVyKSk7XG4gICAgfSlcbiAgKTtcblxuICBzaWduZWRWZXJpZmljYXRpb25Db2RlOiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBic01vZGFsOiBCc01vZGFsU2VydmljZSxcbiAgICBwcml2YXRlIGFsZXJ0U2VydmljZTogQWxlcnRTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJ1c3RlZENlcnRpZmljYXRlU2VydmljZTogVHJ1c3RlZENlcnRpZmljYXRlU2VydmljZSxcbiAgICBwcml2YXRlIG1vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlLFxuICAgIHByaXZhdGUgdHJhbnNsYXRlU2VydmljZTogVHJhbnNsYXRlU2VydmljZSxcbiAgICBwcml2YXRlIGNsaXBib2FyZFNlcnZpY2U6IENsaXBib2FyZFNlcnZpY2VcbiAgKSB7fVxuXG4gIGFzeW5jIG5nT25Jbml0KCkge1xuICAgIGF3YWl0IHRoaXMubG9hZFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKTtcbiAgfVxuXG4gIGFzeW5jIGxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKCkge1xuICAgIHRoaXMucmVsb2FkLm5leHQoKTtcbiAgfVxuXG4gIGdldFRydXN0ZWRDZXJ0aWZpY2F0ZXMoKSB7XG4gICAgY29uc3QgZmlsdGVyOiBvYmplY3QgPSB7XG4gICAgICBwYWdlU2l6ZTogMTAwMCxcbiAgICAgIHdpdGhUb3RhbFBhZ2VzOiB0cnVlXG4gICAgfTtcbiAgICByZXR1cm4gdGhpcy50cnVzdGVkQ2VydGlmaWNhdGVTZXJ2aWNlLmxpc3QoZmlsdGVyKTtcbiAgfVxuXG4gIGFzeW5jIGFkZFRydXN0ZWRDZXJ0aWZpY2F0ZSgpIHtcbiAgICBjb25zdCBtb2RhbCA9IHRoaXMuYnNNb2RhbC5zaG93KEFkZFRydXN0ZWRDZXJ0aWZpY2F0ZUNvbXBvbmVudCwge1xuICAgICAgY2xhc3M6ICdtb2RhbC1zbScsXG4gICAgICBhcmlhRGVzY3JpYmVkYnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsRGVzY3JpcHRpb24nLFxuICAgICAgYXJpYUxhYmVsbGVkQnk6ICdhZGRDZXJ0aWZpY2F0ZU1vZGFsVGl0bGUnLFxuICAgICAgaWdub3JlQmFja2Ryb3BDbGljazogdHJ1ZVxuICAgIH0pLmNvbnRlbnQgYXMgQWRkVHJ1c3RlZENlcnRpZmljYXRlQ29tcG9uZW50O1xuICAgIHRyeSB7XG4gICAgICBhd2FpdCBtb2RhbC5yZXN1bHQ7XG4gICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgdGhpcy5yZWxvYWQubmV4dCgpO1xuICAgIH0gY2F0Y2ggKGV4KSB7XG4gICAgICAvLyBkbyBub3RoaW5nXG4gICAgfVxuICB9XG5cbiAgYXN5bmMgZGVsZXRlVHJ1c3RlZENlcnRpZmljYXRlKGNlcnRpZmljYXRlKSB7XG4gICAgY29uc3QgdGl0bGUgPSBnZXR0ZXh0KCdEZWxldGUgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScpO1xuICAgIGNvbnN0IGNvbmZpcm1hdGlvblRleHQgPSBnZXR0ZXh0KFxuICAgICAgJ1lvdSBhcmUgYWJvdXQgdG8gZGVsZXRlIGEgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBcInt7IGNlcnRpZmljYXRlTmFtZSB9fVwiLidcbiAgICApO1xuICAgIGNvbnN0IGZpbmFsUXVlc3Rpb24gPSBnZXR0ZXh0KCdEbyB5b3Ugd2FudCB0byBwcm9jZWVkPycpO1xuICAgIGNvbnN0IGNlcnRpZmljYXRlTmFtZSA9IGNlcnRpZmljYXRlLm5hbWU7XG4gICAgY29uc3QgYm9keSA9IFtcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGNvbmZpcm1hdGlvblRleHQsIHtcbiAgICAgICAgY2VydGlmaWNhdGVOYW1lXG4gICAgICB9KSxcbiAgICAgIHRoaXMudHJhbnNsYXRlU2VydmljZS5pbnN0YW50KGZpbmFsUXVlc3Rpb24pXG4gICAgXS5qb2luKCcgJyk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgdGhpcy5tb2RhbFNlcnZpY2UuY29uZmlybSh0aXRsZSwgYm9keSwgU3RhdHVzLkRBTkdFUiwgeyBvazogZ2V0dGV4dCgnRGVsZXRlJykgfSk7XG4gICAgICBhd2FpdCB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2UuZGVsZXRlKGNlcnRpZmljYXRlLmZpbmdlcnByaW50KTtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnQ2VydGlmaWNhdGUgZGVsZXRlZC4nKSk7XG4gICAgICB0aGlzLnJlbG9hZC5uZXh0KCk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZUNlcnRpZmljYXRlKFxuICAgIHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSxcbiAgICB1cGRhdGluZ1BhcnQ6IFBhcnRpYWw8SVRydXN0ZWRDZXJ0aWZpY2F0ZT5cbiAgKSB7XG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS51cGRhdGUoe1xuICAgICAgICBmaW5nZXJwcmludDogdHJ1c3RlZENlcnRpZmljYXRlLmZpbmdlcnByaW50LFxuICAgICAgICAuLi51cGRhdGluZ1BhcnRcbiAgICAgIH0pO1xuICAgICAgdGhpcy5hbGVydFNlcnZpY2Uuc3VjY2VzcyhnZXR0ZXh0KCdDZXJ0aWZpY2F0ZSBzYXZlZC4nKSk7XG4gICAgfSBjYXRjaCAoZXgpIHtcbiAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpO1xuICAgIH1cbiAgfVxuXG4gIGhpZ2hsaWdodERlcGVuZGluZ09uRXhwaXJhdGlvblN0YXR1cyhpdGVtOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgY29uc3Qgd2FybmluZ09mZnNldCA9IDI0ICogNjAgKiA2MCAqIDEwMDAgKiA5MDsgLy8gOTAgZGF5c1xuICAgIGNvbnN0IHRvZGF5VGltZXN0YW1wID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3Qgd2FybmluZ1RpbWVzdGFtcCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgd2FybmluZ09mZnNldDtcbiAgICBjb25zdCBub3RBZnRlclRpbWVzdGFtcCA9IG5ldyBEYXRlKGl0ZW0ubm90QWZ0ZXIpLmdldFRpbWUoKTtcbiAgICBjb25zdCBleHBpcmVkID0gbm90QWZ0ZXJUaW1lc3RhbXAgPCB0b2RheVRpbWVzdGFtcDtcbiAgICBjb25zdCBleHBpcmVzSW5MZXNzVGhhbjkwRGF5cyA9IG5vdEFmdGVyVGltZXN0YW1wIDwgd2FybmluZ1RpbWVzdGFtcDtcbiAgICBpZiAoZXhwaXJlZCkge1xuICAgICAgcmV0dXJuICd0ZXh0LWRhbmdlcic7XG4gICAgfVxuICAgIGlmIChleHBpcmVzSW5MZXNzVGhhbjkwRGF5cykge1xuICAgICAgcmV0dXJuICd0ZXh0LXdhcm5pbmcnO1xuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICByZWdlbmVyYXRlVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZTogSVRydXN0ZWRDZXJ0aWZpY2F0ZSkge1xuICAgIHRoaXMudHJ1c3RlZENlcnRpZmljYXRlU2VydmljZS5yZWdlbmVyYXRlUG9QVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpLnRoZW4oXG4gICAgICAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgYXNzaWduKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgZGF0YSk7XG4gICAgICAgIHRoaXMuYWxlcnRTZXJ2aWNlLnN1Y2Nlc3MoZ2V0dGV4dCgnVmVyaWZpY2F0aW9uIGNvZGUgcmVnZW5lcmF0ZWQuJykpO1xuICAgICAgfSxcbiAgICAgIGV4ID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpXG4gICAgKTtcbiAgfVxuXG4gIHZlcmlmeVNpZ25lZFZlcmlmaWNhdGlvbkNvZGUoXG4gICAgdHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlLFxuICAgIHNpZ25lZFZlcmlmaWNhdGlvbkNvZGU6IHN0cmluZ1xuICApIHtcbiAgICB0aGlzLnRydXN0ZWRDZXJ0aWZpY2F0ZVNlcnZpY2VcbiAgICAgIC52ZXJpZnlTaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSlcbiAgICAgIC50aGVuKFxuICAgICAgICAoeyBkYXRhIH0pID0+IHtcbiAgICAgICAgICBhc3NpZ24odHJ1c3RlZENlcnRpZmljYXRlLCBkYXRhKTtcbiAgICAgICAgICB0aGlzLmFsZXJ0U2VydmljZS5zdWNjZXNzKGdldHRleHQoJ1NpZ25lZCB2ZXJpZmljYXRpb24gY29kZSB2ZXJpZmllZC4nKSk7XG4gICAgICAgIH0sXG4gICAgICAgIGV4ID0+IHRoaXMuYWxlcnRTZXJ2aWNlLmFkZFNlcnZlckZhaWx1cmUoZXgpXG4gICAgICApO1xuICB9XG5cbiAgZG93bmxvYWRVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFt0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVdKTtcbiAgICBjb25zdCBmaWxlTmFtZSA9IHRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lO1xuICAgIHNhdmVBcyhibG9iLCBgJHtmaWxlTmFtZX0udHh0YCk7XG4gIH1cblxuICBjb3B5VW5zaWduZWRWZXJpZmljYXRpb25Db2RlVG9DbGlwYm9hcmQodHJ1c3RlZENlcnRpZmljYXRlOiBJVHJ1c3RlZENlcnRpZmljYXRlKSB7XG4gICAgdGhpcy5jbGlwYm9hcmRTZXJ2aWNlLndyaXRlVGV4dCh0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUpO1xuICB9XG5cbiAgb25GaWxlSW5wdXQoZXZlbnQpIHtcbiAgICBjb25zdCBpbnB1dCA9IGV2ZW50LnRhcmdldDtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICAgIHJlYWRlci5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICB0aGlzLnNpZ25lZFZlcmlmaWNhdGlvbkNvZGUgPSByZWFkZXIucmVzdWx0IGFzIHN0cmluZztcbiAgICB9O1xuICAgIHJlYWRlci5yZWFkQXNUZXh0KGlucHV0LmZpbGVzWzBdKTtcbiAgfVxufVxuIiwiPGM4eS10aXRsZT57eyAnVHJ1c3RlZCBjZXJ0aWZpY2F0ZXMnIHwgdHJhbnNsYXRlIH19PC9jOHktdGl0bGU+XG5cbjxjOHktYnJlYWRjcnVtYj5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBsYWJlbD1cInt7ICdNYW5hZ2VtZW50JyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgaWNvbj1cImM4eS1tYW5hZ2VtZW50XCJcbiAgPjwvYzh5LWJyZWFkY3J1bWItaXRlbT5cbiAgPGM4eS1icmVhZGNydW1iLWl0ZW1cbiAgICBsYWJlbD1cInt7ICdUcnVzdGVkIGNlcnRpZmljYXRlcycgfCB0cmFuc2xhdGUgfX1cIlxuICAgIGljb249XCJjZXJ0aWZpY2F0ZVwiXG4gID48L2M4eS1icmVhZGNydW1iLWl0ZW0+XG48L2M4eS1icmVhZGNydW1iPlxuXG48Yzh5LWFjdGlvbi1iYXItaXRlbSBbcGxhY2VtZW50XT1cIidyaWdodCdcIj5cbiAgPGJ1dHRvblxuICAgIHRpdGxlPVwie3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgY2xhc3M9XCJidG4gYnRuLWxpbmtcIlxuICAgIChjbGljayk9XCJhZGRUcnVzdGVkQ2VydGlmaWNhdGUoKVwiXG4gID5cbiAgICA8aSBjOHlJY29uPVwicGx1cy1jaXJjbGVcIj48L2k+XG4gICAge3sgJ0FkZCB0cnVzdGVkIGNlcnRpZmljYXRlJyB8IHRyYW5zbGF0ZSB9fVxuICA8L2J1dHRvbj5cbjwvYzh5LWFjdGlvbi1iYXItaXRlbT5cblxuPGM4eS1hY3Rpb24tYmFyLWl0ZW0gW3BsYWNlbWVudF09XCIncmlnaHQnXCI+XG4gIDxidXR0b25cbiAgICB0aXRsZT1cInt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XCJcbiAgICBjbGFzcz1cImJ0biBidG4tbGlua1wiXG4gICAgKGNsaWNrKT1cImxvYWRUcnVzdGVkQ2VydGlmaWNhdGVzKClcIlxuICA+XG4gICAgPGkgYzh5SWNvbj1cInJlZnJlc2hcIiBbbmdDbGFzc109XCJ7ICdpY29uLXNwaW4nOiByZWxvYWRpbmcgfCBhc3luYyB9XCI+PC9pPlxuICAgIHt7ICdSZWxvYWQnIHwgdHJhbnNsYXRlIH19XG4gIDwvYnV0dG9uPlxuPC9jOHktYWN0aW9uLWJhci1pdGVtPlxuXG48Yzh5LWhlbHAgc3JjPVwiL3VzZXJzLWd1aWRlL2RldmljZS1tYW5hZ2VtZW50LyN0cnVzdGVkLWNlcnRpZmljYXRlc1wiPjwvYzh5LWhlbHA+XG5cbjxjOHktdWktZW1wdHktc3RhdGVcbiAgKm5nSWY9XCIodHJ1c3RlZENlcnRpZmljYXRlcyB8IGFzeW5jKT8uZGF0YS5sZW5ndGggPT09IDBcIlxuICBbaWNvbl09XCInY2VydGlmaWNhdGUnXCJcbiAgW3RpdGxlXT1cIidObyB0cnVzdGVkIGNlcnRpZmljYXRlcyB0byBkaXNwbGF5LicgfCB0cmFuc2xhdGVcIlxuICBbc3VidGl0bGVdPVwiJ0FkZCB5b3VyIGZpcnN0IGNlcnRpZmljYXRlIGJ5IGNsaWNraW5nIGJlbG93LicgfCB0cmFuc2xhdGVcIlxuPlxuICA8YnV0dG9uXG4gICAgdGl0bGU9XCJ7eyAnQWRkIHRydXN0ZWQgY2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAoY2xpY2spPVwiYWRkVHJ1c3RlZENlcnRpZmljYXRlKClcIlxuICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAgPlxuICAgIHt7ICdBZGQgdHJ1c3RlZCBjZXJ0aWZpY2F0ZScgfCB0cmFuc2xhdGUgfX1cbiAgPC9idXR0b24+XG48L2M4eS11aS1lbXB0eS1zdGF0ZT5cblxuPGM4eS1saXN0LWdyb3VwIGNsYXNzPVwibS1iLTI0XCI+XG4gIDxkaXZcbiAgICAqbmdJZj1cIih0cnVzdGVkQ2VydGlmaWNhdGVzIHwgYXN5bmMpPy5kYXRhLmxlbmd0aCA+IDBcIlxuICAgIGNsYXNzPVwicGFnZS1zdGlja3ktaGVhZGVyIGhpZGRlbi14cyBjOHktbGlzdF9faXRlbSBjOHktbGlzdF9faXRlbS0tZW1wdHktYWN0aW9uc1wiXG4gID5cbiAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2Jsb2NrXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYzh5LWxpc3RfX2l0ZW1fX2ljb25cIj5cbiAgICAgICAgPGkgYzh5SWNvbj1cImNlcnRpZmljYXRlXCIgY2xhc3M9XCJpbnZpc2libGVcIj48L2k+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudC1mbGV4LTYwXCI+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnQ2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19IFwiPlxuICAgICAgICAgICAgICB7eyAnQ2VydGlmaWNhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdTdGF0dXMnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdTdGF0dXMnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cInt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtdHJ1bmNhdGVcIiB0aXRsZT1cIiB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XCI+XG4gICAgICAgICAgICAgIHt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC10cnVuY2F0ZVwiIHRpdGxlPVwiIHt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fVwiPlxuICAgICAgICAgICAgICB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktbGlzdF9faXRlbV9fYWN0aW9uc1wiPjwvZGl2PlxuICAgIDwvZGl2PlxuICA8L2Rpdj5cblxuICA8Yzh5LWxpXG4gICAgKmM4eUZvcj1cIlxuICAgICAgbGV0IHRydXN0ZWRDZXJ0aWZpY2F0ZSBvZiB0cnVzdGVkQ2VydGlmaWNhdGVzIHwgYXN5bmM7XG4gICAgICBsZXQgaSA9IGluZGV4O1xuICAgICAgcGlwZTogc29ydEJ5RXhwaXJhdGlvbkRhdGVBc2M7XG4gICAgICBsb2FkTW9yZTogJ25vbmUnXG4gICAgXCJcbiAgICAjbGlzdEl0ZW1cbiAgPlxuICAgIDxjOHktbGktaWNvbj5cbiAgICAgIDxpIGM4eUljb249XCJjZXJ0aWZpY2F0ZVwiPjwvaT5cbiAgICA8L2M4eS1saS1pY29uPlxuXG4gICAgPGM4eS1saS1ib2R5IGNsYXNzPVwiY29udGVudC1mbGV4LTYwXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTJcIj5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgIGNsYXNzPVwiYnRuLWNsZWFuIHRleHQtdHJ1bmNhdGVcIlxuICAgICAgICAgIHRpdGxlPVwie3sgdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfX1cIlxuICAgICAgICAgIChjbGljayk9XCJsaXN0SXRlbS50b2dnbGVDb2xsYXBzZWQoKVwiXG4gICAgICAgID5cbiAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubmFtZSB9fVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ2aXNpYmxlLXhzIHAtOFwiPjwvZGl2PlxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgY2xhc3M9XCJidG4gYzh5LWJ0bi1jaGVja2JveC0taW5saW5lXCJcbiAgICAgICAgICBuYW1lPVwiY2VydGlmaWNhdGVTdGF0dXNcIlxuICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLnN0YXR1c1wiXG4gICAgICAgICAgYnRuQ2hlY2tib3hcbiAgICAgICAgICBidG5DaGVja2JveFRydWU9XCJFTkFCTEVEXCJcbiAgICAgICAgICBidG5DaGVja2JveEZhbHNlPVwiRElTQUJMRURcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cInVwZGF0ZUNlcnRpZmljYXRlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgeyBzdGF0dXM6ICRldmVudCB9KVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c21hbGxcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0Rpc2FibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuc3RhdHVzICE9PSAnRElTQUJMRUQnXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyAnRGlzYWJsZWRgdHJ1c3RlZCBjZXJ0aWZpY2F0ZSBzdGF0dXNgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc21hbGw+XG4gICAgICAgICAgPHNtYWxsXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdFbmFibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgW2hpZGRlbl09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuc3RhdHVzICE9PSAnRU5BQkxFRCdcIlxuICAgICAgICAgID5cbiAgICAgICAgICAgIHt7ICdFbmFibGVkYHRydXN0ZWQgY2VydGlmaWNhdGUgc3RhdHVzYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInZpc2libGUteHMgcC04XCI+PC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdBbGdvcml0aG0nIHwgdHJhbnNsYXRlIH19OiB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuYWxnb3JpdGhtTmFtZSB9fVwiXG4gICAgICAgID5cbiAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS10LTggbS1yLTggdmlzaWJsZS14cy1pbmxpbmVcIiB0cmFuc2xhdGU+QWxnb3JpdGhtPC9zcGFuPlxuICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5hbGdvcml0aG1OYW1lIH19XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxkaXYgY2xhc3M9XCJjb2wtMlwiPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCJcbiAgICAgICAgICB0aXRsZT1cInt7ICdFeHBpcmF0aW9uIGRhdGUnIHwgdHJhbnNsYXRlIH19OiB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubm90QWZ0ZXIgfCBjOHlEYXRlIH19XCJcbiAgICAgICAgPlxuICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dC1sYWJlbC1zbWFsbCBtLXQtOCBtLXItOCB2aXNpYmxlLXhzLWlubGluZVwiIHRyYW5zbGF0ZT5cbiAgICAgICAgICAgIEV4cGlyYXRpb24gZGF0ZVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c21hbGwgW25nQ2xhc3NdPVwiaGlnaGxpZ2h0RGVwZW5kaW5nT25FeHBpcmF0aW9uU3RhdHVzKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIj5cbiAgICAgICAgICAgIDxpXG4gICAgICAgICAgICAgIGM4eUljb249XCJjYWxlbmRhclwiXG4gICAgICAgICAgICAgIGNsYXNzPVwibS1yLTRcIlxuICAgICAgICAgICAgICAqbmdJZj1cIiFoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXModHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPGlcbiAgICAgICAgICAgICAgYzh5SWNvbj1cIndhcm5pbmdcIlxuICAgICAgICAgICAgICBjbGFzcz1cIm0tci00XCJcbiAgICAgICAgICAgICAgKm5nSWY9XCJoaWdobGlnaHREZXBlbmRpbmdPbkV4cGlyYXRpb25TdGF0dXModHJ1c3RlZENlcnRpZmljYXRlKVwiXG4gICAgICAgICAgICA+PC9pPlxuICAgICAgICAgICAgPHNwYW4+e3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEFmdGVyIHwgYzh5RGF0ZSB9fTwvc3Bhbj5cbiAgICAgICAgICA8L3NtYWxsPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgICAgPGRpdiBjbGFzcz1cImNvbC0yXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci00IHZpc2libGUteHMtaW5saW5lXCI+XG4gICAgICAgICAgICB7eyAnQXV0byByZWdpc3RyYXRpb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5hdXRvUmVnaXN0cmF0aW9uRW5hYmxlZFwiXG4gICAgICAgICAgICB0aXRsZT1cInt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnRW5hYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0VuYWJsZWRgYXV0byByZWdpc3RyYXRpb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgKm5nSWY9XCIhdHJ1c3RlZENlcnRpZmljYXRlLmF1dG9SZWdpc3RyYXRpb25FbmFibGVkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICdEaXNhYmxlZGBhdXRvIHJlZ2lzdHJhdGlvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAge3sgJ0Rpc2FibGVkYGF1dG8gcmVnaXN0cmF0aW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgIDwvZGl2PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiY29sLTIgZC1mbGV4XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LXRydW5jYXRlXCI+XG4gICAgICAgICAgPHNwYW4gY2xhc3M9XCJ0ZXh0LWxhYmVsLXNtYWxsIG0tdC04IG0tci00IHZpc2libGUteHMtaW5saW5lXCI+XG4gICAgICAgICAgICB7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwidHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIlxuICAgICAgICAgICAgdGl0bGU9XCJ7eyAnUHJvb2Ygb2YgcG9zc2Vzc2lvbicgfCB0cmFuc2xhdGUgfX06ICB7e1xuICAgICAgICAgICAgICAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwic3VjY2Vzc1wiIGNsYXNzPVwidGV4dC1zdWNjZXNzXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICpuZ0lmPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblZhbGlkXCJcbiAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgJ0luY29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICB9fVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImljb24tZmxleFwiPlxuICAgICAgICAgICAgICA8aSBjOHlJY29uPVwid2FybmluZ1wiIGNsYXNzPVwidGV4dC13YXJuaW5nXCI+PC9pPlxuICAgICAgICAgICAgICB7eyAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxidXR0b25cbiAgICAgICAgICBjbGFzcz1cIm0tbC1hdXRvIGJ0bi1kb3QgYnRuLWRvdC0tZGFuZ2VyIGJ0biBzaG93T25Ib3ZlciBtLXItOFwiXG4gICAgICAgICAgKGNsaWNrKT1cImRlbGV0ZVRydXN0ZWRDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICB0b29sdGlwPVwie3sgJ0RlbGV0ZScgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgIFtkZWxheV09XCI1MDBcIlxuICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiJ0RlbGV0ZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICA+XG4gICAgICAgICAgPGkgYzh5SWNvbj1cImRlbGV0ZVwiPjwvaT5cbiAgICAgICAgPC9idXR0b24+XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1ib2R5PlxuXG4gICAgPGM4eS1saS1jb2xsYXBzZT5cbiAgICAgIDxkaXYgY2xhc3M9XCJwLXQtMTYgcC1iLTE2XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTRcIj5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgIHt7ICdDZXJ0aWZpY2F0ZSBuYW1lJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAgaW5wdXQtZ3JvdXAtZWRpdGFibGVcIj5cbiAgICAgICAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sXCJcbiAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLm5hbWVcIlxuICAgICAgICAgICAgICAgICAgcmVxdWlyZWRcbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICAgIDxzcGFuPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiaW5wdXQtZ3JvdXAtYnRuXCI+XG4gICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1VwZGF0ZSBjZXJ0aWZpY2F0ZSBuYW1lJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDZXJ0aWZpY2F0ZSh0cnVzdGVkQ2VydGlmaWNhdGUsIHsgbmFtZTogdHJ1c3RlZENlcnRpZmljYXRlLm5hbWUgfSlcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXByaW1hcnlcIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5uYW1lXCJcbiAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3sgJ1NhdmUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtMVwiPjwvZGl2PlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtN1wiPlxuICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwiY2VydEluUGVtRm9ybWF0XCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPkNlcnRpZmljYXRlPC9sYWJlbD5cbiAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbm8tcmVzaXplXCJcbiAgICAgICAgICAgICAgICBpZD1cImNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgbmFtZT1cImNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgIHJvd3M9XCI3XCJcbiAgICAgICAgICAgICAgICByZWFkb25seVxuICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwidHJ1c3RlZENlcnRpZmljYXRlLmNlcnRJblBlbUZvcm1hdFwiXG4gICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgIDxjOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgPGxhYmVsIHRpdGxlPVwie3sgJ0F1dG8gcmVnaXN0cmF0aW9uJyB8IHRyYW5zbGF0ZSB9fVwiIGNsYXNzPVwiYzh5LWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICAgICAgICB0eXBlPVwiY2hlY2tib3hcIlxuICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJ0cnVzdGVkQ2VydGlmaWNhdGUuYXV0b1JlZ2lzdHJhdGlvbkVuYWJsZWRcIlxuICAgICAgICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwiXG4gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUNlcnRpZmljYXRlKHRydXN0ZWRDZXJ0aWZpY2F0ZSwgeyBhdXRvUmVnaXN0cmF0aW9uRW5hYmxlZDogJGV2ZW50IH0pXG4gICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgICAgPHNwYW4+PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuPnt7ICdBdXRvIHJlZ2lzdHJhdGlvbicgfCB0cmFuc2xhdGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICA8L2M4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2VuZCBmb3JtLWJsb2NrXCIgdHJhbnNsYXRlPkFkZGl0aW9uYWwgcHJvcGVydGllczwvZGl2PlxuICAgICAgICAgICAgPHVsIGNsYXNzPVwibGlzdC11bnN0eWxlZFwiPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnQWxnb3JpdGhtJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJtLWwtYXV0byB0ZXh0LWJyZWFrLXdvcmRcIj5cbiAgICAgICAgICAgICAgICAgIHt7IHRydXN0ZWRDZXJ0aWZpY2F0ZS5hbGdvcml0aG1OYW1lIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnVmVyc2lvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUudmVyc2lvbiB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ1ZhbGlkIGZyb20nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLm5vdEJlZm9yZSB8IGM4eURhdGUgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgIDxsaSBjbGFzcz1cInAtdC00IHAtYi00IGQtZmxleCBzZXBhcmF0b3ItYm90dG9tIGZsZXgtd3JhcFwiPlxuICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cInNtYWxsIG0tYi0wIG0tci04IGEtcy1zdGFydCBmbGV4LWdyb3dcIj5cbiAgICAgICAgICAgICAgICAgIHt7ICdJc3N1ZXInIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cIm0tbC1hdXRvIHRleHQtYnJlYWstd29yZFwiPlxuICAgICAgICAgICAgICAgICAge3sgdHJ1c3RlZENlcnRpZmljYXRlLmlzc3VlciB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgICAgPGxpIGNsYXNzPVwicC10LTQgcC1iLTQgZC1mbGV4IHNlcGFyYXRvci1ib3R0b20gZmxleC13cmFwXCI+XG4gICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwic21hbGwgbS1iLTAgbS1yLTggYS1zLXN0YXJ0IGZsZXgtZ3Jvd1wiPlxuICAgICAgICAgICAgICAgICAge3sgJ0V4cGlyYXRpb24gZGF0ZScgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUubm90QWZ0ZXIgfCBjOHlEYXRlIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnU2VyaWFsIG51bWJlcicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuc2VyaWFsTnVtYmVyIH19XG4gICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJwLXQtNCBwLWItNCBkLWZsZXggc2VwYXJhdG9yLWJvdHRvbSBmbGV4LXdyYXBcIj5cbiAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJzbWFsbCBtLWItMCBtLXItOCBhLXMtc3RhcnQgZmxleC1ncm93XCI+XG4gICAgICAgICAgICAgICAgICB7eyAnU3ViamVjdGBvZiBhIGNlcnRpZmljYXRlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibS1sLWF1dG8gdGV4dC1icmVhay13b3JkXCI+XG4gICAgICAgICAgICAgICAgICB7eyB0cnVzdGVkQ2VydGlmaWNhdGUuc3ViamVjdCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgPC9saT5cbiAgICAgICAgICAgIDwvdWw+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC0xXCI+PC9kaXY+XG4gICAgICAgICAgPGRpdiBjbGFzcz1cImNvbC1tZC03XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGVnZW5kIGZvcm0tYmxvY2tcIj5cbiAgICAgICAgICAgICAge3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgcG9wb3Zlcj1cInt7IFBST09GX09GX1BPU1NFU1NJT05fUE9QT1ZFUiB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgIHRyaWdnZXJzPVwiZm9jdXNcIlxuICAgICAgICAgICAgICAgIGNvbnRhaW5lcj1cImJvZHlcIlxuICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cInJpZ2h0XCJcbiAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2ICpuZ0lmPVwidHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIj5cbiAgICAgICAgICAgICAgPHNwYW5cbiAgICAgICAgICAgICAgICB0aXRsZT1cInt7ICdQcm9vZiBvZiBwb3NzZXNzaW9uJyB8IHRyYW5zbGF0ZSB9fTogIHt7XG4gICAgICAgICAgICAgICAgICAnQ29tcGxldGVgcHJvb2Ygb2YgcG9zc2Vzc2lvbmAnIHwgdHJhbnNsYXRlXG4gICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiaWNvbi1mbGV4XCJcbiAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJzdWNjZXNzXCIgY2xhc3M9XCJ0ZXh0LXN1Y2Nlc3NcIj48L2k+XG4gICAgICAgICAgICAgICAge3sgJ0NvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgKm5nSWY9XCIhdHJ1c3RlZENlcnRpZmljYXRlLnByb29mT2ZQb3NzZXNzaW9uVmFsaWRcIj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvdyBtLWItMTZcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY29sLW1kLTZcIj5cbiAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1Byb29mIG9mIHBvc3Nlc3Npb24nIHwgdHJhbnNsYXRlIH19OiAge3tcbiAgICAgICAgICAgICAgICAgICAgICAnSW5jb21wbGV0ZWBwcm9vZiBvZiBwb3NzZXNzaW9uYCcgfCB0cmFuc2xhdGVcbiAgICAgICAgICAgICAgICAgICAgfX1cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImljb24tZmxleFwiXG4gICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJ3YXJuaW5nXCIgY2xhc3M9XCJ0ZXh0LXdhcm5pbmdcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIHt7ICdJbmNvbXBsZXRlYHByb29mIG9mIHBvc3Nlc3Npb25gJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNiB0ZXh0LXJpZ2h0LW1kXCI+XG4gICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInRleHQtbGFiZWwtc21hbGwgbS1yLTRcIj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ1ZlcmlmaWNhdGlvbiBjb2RlIGV4cGlyZXMvZXhwaXJlZCBvbicgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICh0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25WZXJpZmljYXRpb25Db2RlVXNhYmxlVW50aWwgfCBjOHlEYXRlKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICctLS0nXG4gICAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwidW5zaWduZWRWZXJpZmljYXRpb25Db2RlXCIgY2xhc3M9XCJjb250cm9sLWxhYmVsXCIgdHJhbnNsYXRlPlxuICAgICAgICAgICAgICAgICAgICAgIFZlcmlmaWNhdGlvbiBjb2RlXG4gICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgIDx0ZXh0YXJlYVxuICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiZm9ybS1jb250cm9sIG5vLXJlc2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgbmFtZT1cInVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJ1bnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5XG4gICAgICAgICAgICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgICAgICAgICAgIHJvd3M9XCI1XCJcbiAgICAgICAgICAgICAgICAgICAgICBbKG5nTW9kZWwpXT1cInRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1JlZ2VuZXJhdGUgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJyZWdlbmVyYXRlVW5zaWduZWRWZXJpZmljYXRpb25Db2RlKHRydXN0ZWRDZXJ0aWZpY2F0ZSlcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAge3sgJ1JlZ2VuZXJhdGVgdmVyaWZpY2F0aW9uIGNvZGVgJyB8IHRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLXNtIGJ0bi1kZWZhdWx0IG0tbC1hdXRvIG0tci0wXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0NvcHkgdG8gY2xpcGJvYXJkJyB8IHRyYW5zbGF0ZSB9fVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2RlbGF5XT1cIjUwMFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInQ29weSB0byBjbGlwYm9hcmQnIHwgdHJhbnNsYXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRydXN0ZWRDZXJ0aWZpY2F0ZS5wcm9vZk9mUG9zc2Vzc2lvblVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImNvcHlVbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVUb0NsaXBib2FyZCh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJjbGlwYm9hcmRcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgYnRuLXNtXCJcbiAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwPVwie3sgJ0Rvd25sb2FkIGFzIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidEb3dubG9hZCBhcyBmaWxlJyB8IHRyYW5zbGF0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiF0cnVzdGVkQ2VydGlmaWNhdGUucHJvb2ZPZlBvc3Nlc3Npb25VbnNpZ25lZFZlcmlmaWNhdGlvbkNvZGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkb3dubG9hZFVuc2lnbmVkVmVyaWZpY2F0aW9uQ29kZSh0cnVzdGVkQ2VydGlmaWNhdGUpXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIGM4eUljb249XCJkb3dubG9hZFwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjb2wtbWQtNiBjb2wtbGctNlwiPlxuICAgICAgICAgICAgICAgICAgPGM4eS1mb3JtLWdyb3VwPlxuICAgICAgICAgICAgICAgICAgICA8bGFiZWwgZm9yPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiIGNsYXNzPVwiY29udHJvbC1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdTaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0bi1oZWxwIGJ0bi1oZWxwLS1zbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3BvdmVyPVwie3sgU0lHTkVEX1ZFUklGSUNBVElPTl9DT0RFX1BPUE9WRVIgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCInSGVscCcgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyPVwiYm9keVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJ0b3BcIlxuICAgICAgICAgICAgICAgICAgICAgID48L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgPHRleHRhcmVhXG4gICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtLWNvbnRyb2wgbm8tcmVzaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICBuYW1lPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgaWQ9XCJzaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICAgICAgICAgICAgcm93cz1cIjVcIlxuICAgICAgICAgICAgICAgICAgICAgIFsobmdNb2RlbCldPVwic2lnbmVkVmVyaWZpY2F0aW9uQ29kZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3RleHRhcmVhPlxuICAgICAgICAgICAgICAgICAgPC9jOHktZm9ybS1ncm91cD5cbiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPVwie3sgJ1ZlcmlmeSBzaWduZWQgdmVyaWZpY2F0aW9uIGNvZGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tcHJpbWFyeSBidG4tc21cIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVNpZ25lZFZlcmlmaWNhdGlvbkNvZGUodHJ1c3RlZENlcnRpZmljYXRlLCBzaWduZWRWZXJpZmljYXRpb25Db2RlKVxuICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cIiFzaWduZWRWZXJpZmljYXRpb25Db2RlXCJcbiAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgIHt7ICdWZXJpZnlgc2lnbmVkIHZlcmlmaWNhdGlvbiBjb2RlYCcgfCB0cmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImJ0biBidG4tc20gYnRuLWRlZmF1bHQgbS1sLWF1dG9cIlxuICAgICAgICAgICAgICAgICAgICAgIHRvb2x0aXA9XCJ7eyAnVXBsb2FkIGZpbGUnIHwgdHJhbnNsYXRlIH19XCJcbiAgICAgICAgICAgICAgICAgICAgICBbZGVsYXldPVwiNTAwXCJcbiAgICAgICAgICAgICAgICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cIidVcGxvYWQgZmlsZScgfCB0cmFuc2xhdGVcIlxuICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJmaWxlSW5wdXQuY2xpY2soKVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBjOHlJY29uPVwidXBsb2FkXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0ICNmaWxlSW5wdXQgdHlwZT1cImZpbGVcIiAoY2hhbmdlKT1cIm9uRmlsZUlucHV0KCRldmVudClcIiBjbGFzcz1cImhpZGRlblwiIC8+XG4gICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2M4eS1saS1jb2xsYXBzZT5cbiAgPC9jOHktbGk+XG48L2M4eS1saXN0LWdyb3VwPlxuIl19
|
|
@@ -84,7 +84,7 @@ class TrustedCertificatesComponent {
|
|
|
84
84
|
this.translateService = translateService;
|
|
85
85
|
this.clipboardService = clipboardService;
|
|
86
86
|
this.PROOF_OF_POSSESSION_POPOVER = gettext('"Proof of possession" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.');
|
|
87
|
-
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>');
|
|
87
|
+
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A');
|
|
88
88
|
this.reloading = new BehaviorSubject(false);
|
|
89
89
|
this.reload = new BehaviorSubject(null);
|
|
90
90
|
this.trustedCertificates = this.reload.pipe(tap(() => this.reloading.next(true)), switchMap(() => this.getTrustedCertificates()), tap(() => this.reloading.next(false)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DroppedFile } from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html'\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <h4 translate id=\"addCertificateModalTitle\">Add trusted certificate</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n </c8y-form-group>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { AlertService, ClipboardService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ITrustedCertificate, TrustedCertificateService, IResultList } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const title = gettext('Delete trusted certificate');\n const confirmationText = gettext(\n 'You are about to delete a trusted certificate \"{{ certificateName }}\".'\n );\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n highlightDependingOnExpirationStatus(item: ITrustedCertificate) {\n const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n const todayTimestamp = new Date().getTime();\n const warningTimestamp = new Date().getTime() + warningOffset;\n const notAfterTimestamp = new Date(item.notAfter).getTime();\n const expired = notAfterTimestamp < todayTimestamp;\n const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n if (expired) {\n return 'text-danger';\n }\n if (expiresInLessThan90Days) {\n return 'text-warning';\n }\n return '';\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(\n trustedCertificate: ITrustedCertificate,\n signedVerificationCode: string\n ) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n this.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule\n ],\n entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DroppedFile } from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html'\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <h4 translate id=\"addCertificateModalTitle\">Add trusted certificate</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n </c8y-form-group>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { AlertService, ClipboardService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ITrustedCertificate, TrustedCertificateService, IResultList } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const title = gettext('Delete trusted certificate');\n const confirmationText = gettext(\n 'You are about to delete a trusted certificate \"{{ certificateName }}\".'\n );\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n highlightDependingOnExpirationStatus(item: ITrustedCertificate) {\n const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n const todayTimestamp = new Date().getTime();\n const warningTimestamp = new Date().getTime() + warningOffset;\n const notAfterTimestamp = new Date(item.notAfter).getTime();\n const expired = notAfterTimestamp < todayTimestamp;\n const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n if (expired) {\n return 'text-danger';\n }\n if (expiresInLessThan90Days) {\n return 'text-warning';\n }\n return '';\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(\n trustedCertificate: ITrustedCertificate,\n signedVerificationCode: string\n ) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n this.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule\n ],\n entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ class TrustedCertificatesComponent {
|
|
|
81
81
|
this.translateService = translateService;
|
|
82
82
|
this.clipboardService = clipboardService;
|
|
83
83
|
this.PROOF_OF_POSSESSION_POPOVER = gettext('"Proof of possession" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.');
|
|
84
|
-
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>');
|
|
84
|
+
this.SIGNED_VERIFICATION_CODE_POPOVER = gettext('Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A');
|
|
85
85
|
this.reloading = new BehaviorSubject(false);
|
|
86
86
|
this.reload = new BehaviorSubject(null);
|
|
87
87
|
this.trustedCertificates = this.reload.pipe(tap(() => this.reloading.next(true)), switchMap(() => this.getTrustedCertificates()), tap(() => this.reloading.next(false)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DroppedFile } from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html'\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <h4 translate id=\"addCertificateModalTitle\">Add trusted certificate</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n </c8y-form-group>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { AlertService, ClipboardService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ITrustedCertificate, TrustedCertificateService, IResultList } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const title = gettext('Delete trusted certificate');\n const confirmationText = gettext(\n 'You are about to delete a trusted certificate \"{{ certificateName }}\".'\n );\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n highlightDependingOnExpirationStatus(item: ITrustedCertificate) {\n const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n const todayTimestamp = new Date().getTime();\n const warningTimestamp = new Date().getTime() + warningOffset;\n const notAfterTimestamp = new Date(item.notAfter).getTime();\n const expired = notAfterTimestamp < todayTimestamp;\n const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n if (expired) {\n return 'text-danger';\n }\n if (expiresInLessThan90Days) {\n return 'text-warning';\n }\n return '';\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(\n trustedCertificate: ITrustedCertificate,\n signedVerificationCode: string\n ) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n this.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule\n ],\n entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"c8y-ngx-components-trusted-certificates.mjs","sources":["../../trusted-certificates/add-trusted-certificate.component.ts","../../trusted-certificates/add-trusted-certificate.component.html","../../trusted-certificates/trusted-certificates.component.ts","../../trusted-certificates/trusted-certificates.component.html","../../trusted-certificates/trusted-certificates-navigation.factory.ts","../../trusted-certificates/pattern-messages.data.ts","../../trusted-certificates/trusted-certificates.module.ts","../../trusted-certificates/c8y-ngx-components-trusted-certificates.ts"],"sourcesContent":["import { Component } from '@angular/core';\nimport { BsModalRef } from 'ngx-bootstrap/modal';\nimport { DroppedFile } from '@c8y/ngx-components';\nimport { ITrustedCertificate, TrustedCertificateService } from '@c8y/client';\nimport { AlertService, gettext } from '@c8y/ngx-components';\n\n@Component({\n selector: 'c8y-add-trusted-certificate',\n templateUrl: './add-trusted-certificate.component.html'\n})\nexport class AddTrustedCertificateComponent {\n maxAllowedFiles = 1;\n AUTO_REGISTRATION_POPOVER = gettext(\n 'All devices with credentials signed by this certificate will be able to communicate with the platform without a prior registration.'\n );\n trustedCertificate: Partial<ITrustedCertificate> = {\n status: 'DISABLED'\n };\n fileIsUploaded = false;\n\n result: Promise<any> = new Promise((resolve, reject) => {\n this._save = resolve;\n this._cancel = reject;\n });\n private _save;\n private _cancel;\n\n constructor(\n private modal: BsModalRef,\n private trustedCertificateService: TrustedCertificateService,\n private alertService: AlertService\n ) {}\n\n uploadFile(dropped: DroppedFile[]) {\n this.fileIsUploaded = false;\n if (dropped) {\n const reader = new FileReader();\n reader.onload = () => {\n this.fileIsUploaded = true;\n this.trustedCertificate.certInPemFormat = reader.result as string;\n };\n reader.readAsText(dropped[0].file);\n }\n }\n\n async save() {\n try {\n await this.trustedCertificateService.create(this.trustedCertificate);\n this.alertService.success(gettext('Certificate saved.'));\n this._save();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n close() {\n this._cancel();\n this.modal.hide();\n }\n}\n","<div class=\"viewport-modal\">\n <div class=\"modal-header dialog-header\">\n <i c8yIcon=\"certificate\"></i>\n <h4 translate id=\"addCertificateModalTitle\">Add trusted certificate</h4>\n </div>\n <div class=\"modal-inner-scroll\">\n <div class=\"modal-body\" id=\"addCertificateModalDescription\">\n <form #addTrustedCertificateForm=\"ngForm\">\n <c8y-form-group>\n <label translate for=\"certificateName\">Certificate name</label>\n <input\n id=\"certificateName\"\n type=\"text\"\n class=\"form-control\"\n autocomplete=\"off\"\n name=\"certificateName\"\n [(ngModel)]=\"trustedCertificate.name\"\n placeholder=\"{{ 'e.g. My certificate' | translate }}\"\n required\n />\n </c8y-form-group>\n <c8y-form-group>\n <label translate for=\"certificate\">Certificate</label>\n <c8y-drop-area\n class=\"drop-area-sm\"\n (dropped)=\"uploadFile($event)\"\n [loadingMessage]=\"'Importing, please wait.' | translate\"\n [title]=\"'Paste the certificate in PEM format.' | translate\"\n [maxAllowedFiles]=\"maxAllowedFiles\"\n ></c8y-drop-area>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n id=\"autoRegistration\"\n type=\"checkbox\"\n name=\"autoRegistration\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n <button\n class=\"btn-help\"\n type=\"button\"\n popover=\"{{ AUTO_REGISTRATION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n >\n <i [c8yIcon]=\"'question-circle-o'\"></i>\n </button>\n </label>\n </c8y-form-group>\n <button\n type=\"button\"\n class=\"btn\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n >\n <span\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </span>\n <span\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </span>\n </button>\n </form>\n </div>\n </div>\n <div class=\"modal-footer\">\n <button\n title=\"{{ 'Cancel' | translate }}\"\n type=\"button\"\n class=\"btn btn-default\"\n (click)=\"close()\"\n >\n {{ 'Cancel' | translate }}\n </button>\n\n <button\n title=\"{{ 'Add certificate' | translate }}\"\n type=\"button\"\n class=\"btn btn-primary\"\n (click)=\"save()\"\n [disabled]=\"\n addTrustedCertificateForm.form.invalid ||\n addTrustedCertificateForm.form.pristine ||\n !fileIsUploaded\n \"\n >\n {{ 'Add certificate' | translate }}\n </button>\n </div>\n</div>\n","import { Component, OnInit } from '@angular/core';\nimport { AlertService, ClipboardService, gettext, ModalService, Status } from '@c8y/ngx-components';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { BsModalService } from 'ngx-bootstrap/modal';\nimport { ITrustedCertificate, TrustedCertificateService, IResultList } from '@c8y/client';\nimport { TranslateService } from '@ngx-translate/core';\nimport { tap, switchMap } from 'rxjs/operators';\nimport { pipe, BehaviorSubject, Observable } from 'rxjs';\nimport { saveAs } from 'file-saver';\nimport { assign } from 'lodash-es';\n\n@Component({\n selector: 'c8y-trusted-certificates',\n templateUrl: './trusted-certificates.component.html'\n})\nexport class TrustedCertificatesComponent implements OnInit {\n PROOF_OF_POSSESSION_POPOVER = gettext(\n '\"Proof of possession\" is a security method used to prove that whoever sends a message is also in the possession of the particular cryptographic key.'\n );\n SIGNED_VERIFICATION_CODE_POPOVER = gettext(\n 'Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A'\n );\n\n reloading: BehaviorSubject<boolean> = new BehaviorSubject(false);\n reload: BehaviorSubject<void> = new BehaviorSubject(null);\n trustedCertificates: Observable<IResultList<ITrustedCertificate>> = this.reload.pipe(\n tap(() => this.reloading.next(true)),\n switchMap(() => this.getTrustedCertificates()),\n tap(() => this.reloading.next(false))\n );\n sortByExpirationDateAsc = pipe(\n tap((results: ITrustedCertificate[]) => {\n return results.sort((n1, n2) => n1.notAfter.localeCompare(n2.notAfter));\n })\n );\n\n signedVerificationCode: string;\n\n constructor(\n private bsModal: BsModalService,\n private alertService: AlertService,\n private trustedCertificateService: TrustedCertificateService,\n private modalService: ModalService,\n private translateService: TranslateService,\n private clipboardService: ClipboardService\n ) {}\n\n async ngOnInit() {\n await this.loadTrustedCertificates();\n }\n\n async loadTrustedCertificates() {\n this.reload.next();\n }\n\n getTrustedCertificates() {\n const filter: object = {\n pageSize: 1000,\n withTotalPages: true\n };\n return this.trustedCertificateService.list(filter);\n }\n\n async addTrustedCertificate() {\n const modal = this.bsModal.show(AddTrustedCertificateComponent, {\n class: 'modal-sm',\n ariaDescribedby: 'addCertificateModalDescription',\n ariaLabelledBy: 'addCertificateModalTitle',\n ignoreBackdropClick: true\n }).content as AddTrustedCertificateComponent;\n try {\n await modal.result;\n modal.close();\n this.reload.next();\n } catch (ex) {\n // do nothing\n }\n }\n\n async deleteTrustedCertificate(certificate) {\n const title = gettext('Delete trusted certificate');\n const confirmationText = gettext(\n 'You are about to delete a trusted certificate \"{{ certificateName }}\".'\n );\n const finalQuestion = gettext('Do you want to proceed?');\n const certificateName = certificate.name;\n const body = [\n this.translateService.instant(confirmationText, {\n certificateName\n }),\n this.translateService.instant(finalQuestion)\n ].join(' ');\n\n try {\n await this.modalService.confirm(title, body, Status.DANGER, { ok: gettext('Delete') });\n await this.trustedCertificateService.delete(certificate.fingerprint);\n this.alertService.success(gettext('Certificate deleted.'));\n this.reload.next();\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n async updateCertificate(\n trustedCertificate: ITrustedCertificate,\n updatingPart: Partial<ITrustedCertificate>\n ) {\n try {\n await this.trustedCertificateService.update({\n fingerprint: trustedCertificate.fingerprint,\n ...updatingPart\n });\n this.alertService.success(gettext('Certificate saved.'));\n } catch (ex) {\n this.alertService.addServerFailure(ex);\n }\n }\n\n highlightDependingOnExpirationStatus(item: ITrustedCertificate) {\n const warningOffset = 24 * 60 * 60 * 1000 * 90; // 90 days\n const todayTimestamp = new Date().getTime();\n const warningTimestamp = new Date().getTime() + warningOffset;\n const notAfterTimestamp = new Date(item.notAfter).getTime();\n const expired = notAfterTimestamp < todayTimestamp;\n const expiresInLessThan90Days = notAfterTimestamp < warningTimestamp;\n if (expired) {\n return 'text-danger';\n }\n if (expiresInLessThan90Days) {\n return 'text-warning';\n }\n return '';\n }\n\n regenerateUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n this.trustedCertificateService.regeneratePoPVerificationCode(trustedCertificate).then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Verification code regenerated.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n verifySignedVerificationCode(\n trustedCertificate: ITrustedCertificate,\n signedVerificationCode: string\n ) {\n this.trustedCertificateService\n .verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n .then(\n ({ data }) => {\n assign(trustedCertificate, data);\n this.alertService.success(gettext('Signed verification code verified.'));\n },\n ex => this.alertService.addServerFailure(ex)\n );\n }\n\n downloadUnsignedVerificationCode(trustedCertificate: ITrustedCertificate) {\n const blob = new Blob([trustedCertificate.proofOfPossessionUnsignedVerificationCode]);\n const fileName = trustedCertificate.name;\n saveAs(blob, `${fileName}.txt`);\n }\n\n copyUnsignedVerificationCodeToClipboard(trustedCertificate: ITrustedCertificate) {\n this.clipboardService.writeText(trustedCertificate.proofOfPossessionUnsignedVerificationCode);\n }\n\n onFileInput(event) {\n const input = event.target;\n const reader = new FileReader();\n reader.onload = () => {\n this.signedVerificationCode = reader.result as string;\n };\n reader.readAsText(input.files[0]);\n }\n}\n","<c8y-title>{{ 'Trusted certificates' | translate }}</c8y-title>\n\n<c8y-breadcrumb>\n <c8y-breadcrumb-item\n label=\"{{ 'Management' | translate }}\"\n icon=\"c8y-management\"\n ></c8y-breadcrumb-item>\n <c8y-breadcrumb-item\n label=\"{{ 'Trusted certificates' | translate }}\"\n icon=\"certificate\"\n ></c8y-breadcrumb-item>\n</c8y-breadcrumb>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"addTrustedCertificate()\"\n >\n <i c8yIcon=\"plus-circle\"></i>\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-action-bar-item [placement]=\"'right'\">\n <button\n title=\"{{ 'Reload' | translate }}\"\n class=\"btn btn-link\"\n (click)=\"loadTrustedCertificates()\"\n >\n <i c8yIcon=\"refresh\" [ngClass]=\"{ 'icon-spin': reloading | async }\"></i>\n {{ 'Reload' | translate }}\n </button>\n</c8y-action-bar-item>\n\n<c8y-help src=\"/users-guide/device-management/#trusted-certificates\"></c8y-help>\n\n<c8y-ui-empty-state\n *ngIf=\"(trustedCertificates | async)?.data.length === 0\"\n [icon]=\"'certificate'\"\n [title]=\"'No trusted certificates to display.' | translate\"\n [subtitle]=\"'Add your first certificate by clicking below.' | translate\"\n>\n <button\n title=\"{{ 'Add trusted certificate' | translate }}\"\n (click)=\"addTrustedCertificate()\"\n class=\"btn btn-primary\"\n >\n {{ 'Add trusted certificate' | translate }}\n </button>\n</c8y-ui-empty-state>\n\n<c8y-list-group class=\"m-b-24\">\n <div\n *ngIf=\"(trustedCertificates | async)?.data.length > 0\"\n class=\"page-sticky-header hidden-xs c8y-list__item c8y-list__item--empty-actions\"\n >\n <div class=\"c8y-list__item__block\">\n <div class=\"c8y-list__item__icon\">\n <i c8yIcon=\"certificate\" class=\"invisible\"></i>\n </div>\n <div class=\"c8y-list__item__body\">\n <div class=\"content-flex-60\">\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Certificate' | translate }} \">\n {{ 'Certificate' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Status' | translate }}\">\n {{ 'Status' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Algorithm' | translate }}\">\n {{ 'Algorithm' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\"{{ 'Expiration date' | translate }}\">\n {{ 'Expiration date' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Auto registration' | translate }}\">\n {{ 'Auto registration' | translate }}\n </span>\n </div>\n <div class=\"col-2\">\n <span class=\"text-truncate\" title=\" {{ 'Proof of possession' | translate }}\">\n {{ 'Proof of possession' | translate }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"c8y-list__item__actions\"></div>\n </div>\n </div>\n\n <c8y-li\n *c8yFor=\"\n let trustedCertificate of trustedCertificates | async;\n let i = index;\n pipe: sortByExpirationDateAsc;\n loadMore: 'none'\n \"\n #listItem\n >\n <c8y-li-icon>\n <i c8yIcon=\"certificate\"></i>\n </c8y-li-icon>\n\n <c8y-li-body class=\"content-flex-60\">\n <div class=\"col-2\">\n <button\n class=\"btn-clean text-truncate\"\n title=\"{{ trustedCertificate.name }}\"\n (click)=\"listItem.toggleCollapsed()\"\n >\n {{ trustedCertificate.name }}\n </button>\n </div>\n <div class=\"col-2\">\n <div class=\"visible-xs p-8\"></div>\n <button\n type=\"button\"\n class=\"btn c8y-btn-checkbox--inline\"\n name=\"certificateStatus\"\n [(ngModel)]=\"trustedCertificate.status\"\n btnCheckbox\n btnCheckboxTrue=\"ENABLED\"\n btnCheckboxFalse=\"DISABLED\"\n (ngModelChange)=\"updateCertificate(trustedCertificate, { status: $event })\"\n >\n <small\n title=\"{{ 'Disabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'DISABLED'\"\n >\n {{ 'Disabled`trusted certificate status`' | translate }}\n </small>\n <small\n title=\"{{ 'Enabled`trusted certificate status`' | translate }}\"\n [hidden]=\"trustedCertificate.status !== 'ENABLED'\"\n >\n {{ 'Enabled`trusted certificate status`' | translate }}\n </small>\n </button>\n <div class=\"visible-xs p-8\"></div>\n </div>\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Algorithm' | translate }}: {{ trustedCertificate.algorithmName }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>Algorithm</span>\n {{ trustedCertificate.algorithmName }}\n </div>\n </div>\n\n <div class=\"col-2\">\n <div\n class=\"text-truncate\"\n title=\"{{ 'Expiration date' | translate }}: {{ trustedCertificate.notAfter | c8yDate }}\"\n >\n <span class=\"text-label-small m-t-8 m-r-8 visible-xs-inline\" translate>\n Expiration date\n </span>\n <small [ngClass]=\"highlightDependingOnExpirationStatus(trustedCertificate)\">\n <i\n c8yIcon=\"calendar\"\n class=\"m-r-4\"\n *ngIf=\"!highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <i\n c8yIcon=\"warning\"\n class=\"m-r-4\"\n *ngIf=\"highlightDependingOnExpirationStatus(trustedCertificate)\"\n ></i>\n <span>{{ trustedCertificate.notAfter | c8yDate }}</span>\n </small>\n </div>\n </div>\n <div class=\"col-2\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Auto registration' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Enabled`auto registration`' | translate\n }}\"\n >\n {{ 'Enabled`auto registration`' | translate }}\n </span>\n <span\n *ngIf=\"!trustedCertificate.autoRegistrationEnabled\"\n title=\"{{ 'Auto registration' | translate }}: {{\n 'Disabled`auto registration`' | translate\n }}\"\n >\n {{ 'Disabled`auto registration`' | translate }}\n </span>\n </div>\n </div>\n <div class=\"col-2 d-flex\">\n <div class=\"text-truncate\">\n <span class=\"text-label-small m-t-8 m-r-4 visible-xs-inline\">\n {{ 'Proof of possession' | translate }}\n </span>\n <span\n *ngIf=\"trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </div>\n </span>\n <span\n *ngIf=\"!trustedCertificate.proofOfPossessionValid\"\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n >\n <div class=\"icon-flex\">\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </div>\n </span>\n </div>\n <button\n class=\"m-l-auto btn-dot btn-dot--danger btn showOnHover m-r-8\"\n (click)=\"deleteTrustedCertificate(trustedCertificate)\"\n type=\"button\"\n tooltip=\"{{ 'Delete' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Delete' | translate\"\n >\n <i c8yIcon=\"delete\"></i>\n </button>\n </div>\n </c8y-li-body>\n\n <c8y-li-collapse>\n <div class=\"p-t-16 p-b-16\">\n <div class=\"row\">\n <div class=\"col-md-4\">\n <c8y-form-group>\n <label class=\"control-label\">\n {{ 'Certificate name' | translate }}\n </label>\n <div class=\"input-group input-group-editable\">\n <input\n type=\"text\"\n class=\"form-control\"\n [(ngModel)]=\"trustedCertificate.name\"\n required\n />\n <span></span>\n <div class=\"input-group-btn\">\n <button\n title=\"{{ 'Update certificate name' | translate }}\"\n (click)=\"\n updateCertificate(trustedCertificate, { name: trustedCertificate.name })\n \"\n class=\"btn btn-primary\"\n [disabled]=\"!trustedCertificate.name\"\n >\n {{ 'Save' | translate }}\n </button>\n </div>\n </div>\n </c8y-form-group>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <c8y-form-group>\n <label for=\"certInPemFormat\" class=\"control-label\" translate>Certificate</label>\n <textarea\n class=\"form-control no-resize\"\n id=\"certInPemFormat\"\n name=\"certInPemFormat\"\n type=\"text\"\n rows=\"7\"\n readonly\n [(ngModel)]=\"trustedCertificate.certInPemFormat\"\n ></textarea>\n </c8y-form-group>\n <c8y-form-group>\n <label title=\"{{ 'Auto registration' | translate }}\" class=\"c8y-checkbox\">\n <input\n type=\"checkbox\"\n [(ngModel)]=\"trustedCertificate.autoRegistrationEnabled\"\n (ngModelChange)=\"\n updateCertificate(trustedCertificate, { autoRegistrationEnabled: $event })\n \"\n />\n <span></span>\n <span>{{ 'Auto registration' | translate }}</span>\n </label>\n </c8y-form-group>\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-4\">\n <div class=\"legend form-block\" translate>Additional properties</div>\n <ul class=\"list-unstyled\">\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Algorithm' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.algorithmName }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Version' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.version }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Valid from' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notBefore | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Issuer' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.issuer }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Expiration date' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.notAfter | c8yDate }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Serial number' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.serialNumber }}\n </span>\n </li>\n <li class=\"p-t-4 p-b-4 d-flex separator-bottom flex-wrap\">\n <label class=\"small m-b-0 m-r-8 a-s-start flex-grow\">\n {{ 'Subject`of a certificate`' | translate }}\n </label>\n <span class=\"m-l-auto text-break-word\">\n {{ trustedCertificate.subject }}\n </span>\n </li>\n </ul>\n </div>\n <div class=\"col-md-1\"></div>\n <div class=\"col-md-7\">\n <div class=\"legend form-block\">\n {{ 'Proof of possession' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ PROOF_OF_POSSESSION_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n triggers=\"focus\"\n container=\"body\"\n placement=\"right\"\n ></button>\n </div>\n <div *ngIf=\"trustedCertificate.proofOfPossessionValid\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Complete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"success\" class=\"text-success\"></i>\n {{ 'Complete`proof of possession`' | translate }}\n </span>\n </div>\n <div *ngIf=\"!trustedCertificate.proofOfPossessionValid\">\n <div class=\"row m-b-16\">\n <div class=\"col-md-6\">\n <span\n title=\"{{ 'Proof of possession' | translate }}: {{\n 'Incomplete`proof of possession`' | translate\n }}\"\n class=\"icon-flex\"\n >\n <i c8yIcon=\"warning\" class=\"text-warning\"></i>\n {{ 'Incomplete`proof of possession`' | translate }}\n </span>\n </div>\n <div class=\"col-md-6 col-lg-6 text-right-md\">\n <span class=\"text-label-small m-r-4\">\n {{ 'Verification code expires/expired on' | translate }}\n </span>\n {{\n (trustedCertificate.proofOfPossessionVerificationCodeUsableUntil | c8yDate) ||\n '---'\n }}\n </div>\n </div>\n <div class=\"row\">\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"unsignedVerificationCode\" class=\"control-label\" translate>\n Verification code\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"unsignedVerificationCode\"\n id=\"unsignedVerificationCode\"\n readonly\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Regenerate verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"regenerateUnsignedVerificationCode(trustedCertificate)\"\n >\n {{ 'Regenerate`verification code`' | translate }}\n </button>\n\n <button\n class=\"btn btn-sm btn-default m-l-auto m-r-0\"\n tooltip=\"{{ 'Copy to clipboard' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Copy to clipboard' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"copyUnsignedVerificationCodeToClipboard(trustedCertificate)\"\n >\n <i c8yIcon=\"clipboard\"></i>\n </button>\n <button\n class=\"btn btn-default btn-sm\"\n tooltip=\"{{ 'Download as file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Download as file' | translate\"\n [disabled]=\"!trustedCertificate.proofOfPossessionUnsignedVerificationCode\"\n (click)=\"downloadUnsignedVerificationCode(trustedCertificate)\"\n >\n <i c8yIcon=\"download\"></i>\n </button>\n </div>\n </div>\n\n <div class=\"col-md-6 col-lg-6\">\n <c8y-form-group>\n <label for=\"signedVerificationCode\" class=\"control-label\">\n {{ 'Signed verification code' | translate }}\n <button\n type=\"button\"\n class=\"btn-help btn-help--sm\"\n popover=\"{{ SIGNED_VERIFICATION_CODE_POPOVER | translate }}\"\n [attr.aria-label]=\"'Help' | translate\"\n container=\"body\"\n placement=\"top\"\n ></button>\n </label>\n <textarea\n class=\"form-control no-resize\"\n name=\"signedVerificationCode\"\n id=\"signedVerificationCode\"\n type=\"text\"\n rows=\"5\"\n [(ngModel)]=\"signedVerificationCode\"\n ></textarea>\n </c8y-form-group>\n <div class=\"d-flex\">\n <button\n title=\"{{ 'Verify signed verification code' | translate }}\"\n class=\"btn btn-primary btn-sm\"\n (click)=\"\n verifySignedVerificationCode(trustedCertificate, signedVerificationCode)\n \"\n [disabled]=\"!signedVerificationCode\"\n >\n {{ 'Verify`signed verification code`' | translate }}\n </button>\n <button\n class=\"btn btn-sm btn-default m-l-auto\"\n tooltip=\"{{ 'Upload file' | translate }}\"\n [delay]=\"500\"\n [attr.aria-label]=\"'Upload file' | translate\"\n (click)=\"fileInput.click()\"\n >\n <i c8yIcon=\"upload\"></i>\n </button>\n <input #fileInput type=\"file\" (change)=\"onFileInput($event)\" class=\"hidden\" />\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </c8y-li-collapse>\n </c8y-li>\n</c8y-list-group>\n","import { Injectable } from '@angular/core';\nimport { gettext, NavigatorNode, NavigatorNodeFactory } from '@c8y/ngx-components';\n\n@Injectable()\nexport class TrustedCertificatesNavigationFactory implements NavigatorNodeFactory {\n navs: NavigatorNode[] = [];\n\n async get() {\n if (this.navs.length === 0) {\n this.navs.push(\n new NavigatorNode({\n label: gettext('Trusted certificates'),\n icon: 'certificate',\n path: '/trusted-certificates',\n parent: gettext('Management'),\n priority: 100\n })\n );\n }\n return this.navs;\n }\n}\n","/* tslint:disable:max-line-length */\nimport { gettext } from '@c8y/ngx-components';\n\nexport const MESSAGES = {\n '^Cannot find certificate with fingerprint (.+?).$': {\n gettext: gettext('Could not find {{ fingerprint }} certificate.'),\n placeholders: {\n fingerprint: '$1'\n }\n },\n '^Wrong proof of possession verification code used for tenant (.+?). Certificate (.+?), usage not granted.$':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: invalid proof of possession verification code provided, sign verification code with private key.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n },\n '^Proof of possession verification code used for tenant (.+?) expired. Certificate (.+?), usage not granted.':\n {\n gettext: gettext(\n 'Could not confirm the ownership of {{ fingerprint }} certificate: proof of possession verification code has expired, generate a new code and try again.'\n ),\n placeholders: {\n tenant: '$1',\n fingerprint: '$2'\n }\n }\n};\n","import { NgModule } from '@angular/core';\nimport { Route, RouterModule } from '@angular/router';\nimport { CommonModule, CoreModule, hookNavigator, hookPatternMessages } from '@c8y/ngx-components';\nimport { TrustedCertificatesComponent } from './trusted-certificates.component';\nimport { BsDropdownModule } from 'ngx-bootstrap/dropdown';\nimport { PopoverModule } from 'ngx-bootstrap/popover';\nimport { TooltipModule } from 'ngx-bootstrap/tooltip';\nimport { AddTrustedCertificateComponent } from './add-trusted-certificate.component';\nimport { ButtonsModule } from 'ngx-bootstrap/buttons';\nimport { ReactiveFormsModule } from '@angular/forms';\nimport { TrustedCertificatesNavigationFactory } from './trusted-certificates-navigation.factory';\nimport { MESSAGES } from './pattern-messages.data';\n\nconst trustedCertificatesRoutes: Route[] = [\n {\n path: 'trusted-certificates',\n component: TrustedCertificatesComponent\n }\n];\n\n@NgModule({\n declarations: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n exports: [],\n imports: [\n CoreModule,\n CommonModule,\n RouterModule.forChild(trustedCertificatesRoutes),\n BsDropdownModule.forRoot(),\n TooltipModule,\n ReactiveFormsModule,\n ButtonsModule,\n PopoverModule\n ],\n entryComponents: [TrustedCertificatesComponent, AddTrustedCertificateComponent],\n providers: [hookNavigator(TrustedCertificatesNavigationFactory), hookPatternMessages(MESSAGES)]\n})\nexport class TrustedCertificatesModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i3","i2","i4","i5","i6","i8","i9"],"mappings":"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"}
|
package/locales/locales.pot
CHANGED
|
@@ -15105,7 +15105,7 @@ msgstr ""
|
|
|
15105
15105
|
msgid "Use the \"Register device\" dropdown in the top right corner."
|
|
15106
15106
|
msgstr ""
|
|
15107
15107
|
|
|
15108
|
-
msgid "Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt>"
|
|
15108
|
+
msgid "Use the following openssl command to create the signed verification code: openssl dgst -sha256 -sign <private.key> <verification_code.txt> | openssl base64 -A"
|
|
15109
15109
|
msgstr ""
|
|
15110
15110
|
|
|
15111
15111
|
msgid "Use the input field above to search for devices."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@c8y/ngx-components",
|
|
3
|
-
"version": "1017.0.
|
|
3
|
+
"version": "1017.0.153",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"author": "Cumulocity",
|
|
6
6
|
"description": "Angular modules for Cumulocity IoT applications",
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"rxjs": "~6.6.3"
|
|
23
23
|
},
|
|
24
24
|
"dependencies": {
|
|
25
|
-
"@c8y/client": "1017.0.
|
|
25
|
+
"@c8y/client": "1017.0.153",
|
|
26
26
|
"@ngx-translate/core": "14.0.0",
|
|
27
27
|
"@ngx-translate/http-loader": "7.0.0",
|
|
28
28
|
"@ngx-formly/core": "5.10.13",
|