@lowcodeunit/applications-flow-common 1.34.6-integration → 1.34.7-lets-get-social-ish
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/lcu.api.mjs +3 -3
- package/esm2020/lib/applications-flow.module.mjs +22 -11
- package/esm2020/lib/controls/devops-source-control-form/devops-source-control-form.component.mjs +3 -3
- package/esm2020/lib/dialogs/custom-domain-dialog/custom-domain-dialog.component.mjs +3 -3
- package/esm2020/lib/dialogs/feed-header-dialog/feed-header-dialog.component.mjs +287 -0
- package/esm2020/lib/elements/feed-card-sm/feed-card-sm.component.mjs +2 -2
- package/esm2020/lib/elements/feed-header/feed-header.component.mjs +131 -0
- package/esm2020/lib/elements/main-feed-card/main-feed-card.component.mjs +2 -2
- package/esm2020/lib/elements/projects/controls/git-auth/git-auth.component.mjs +3 -2
- package/esm2020/lib/elements/projects/controls/tabs/domains/domains.component.mjs +2 -2
- package/esm2020/lib/elements/skeleton-feed-card/skeleton-feed-card.component.mjs +2 -2
- package/esm2020/lib/models/user-feed.model.mjs +3 -1
- package/esm2020/lib/services/applications-flow.service.mjs +8 -1
- package/esm2020/lib/services/eac.service.mjs +4 -1
- package/esm2020/lib/services/project.service.mjs +25 -1
- package/esm2020/lib/state/applications-flow.state.mjs +1 -1
- package/fesm2015/lowcodeunit-applications-flow-common.mjs +1716 -1352
- package/fesm2015/lowcodeunit-applications-flow-common.mjs.map +1 -1
- package/fesm2020/lowcodeunit-applications-flow-common.mjs +1636 -1292
- package/fesm2020/lowcodeunit-applications-flow-common.mjs.map +1 -1
- package/lcu.api.d.ts +2 -2
- package/lib/applications-flow.module.d.ts +12 -10
- package/lib/dialogs/feed-header-dialog/feed-header-dialog.component.d.ts +71 -0
- package/lib/elements/{gh-control/gh-control.component.d.ts → feed-header/feed-header.component.d.ts} +9 -7
- package/lib/models/user-feed.model.d.ts +17 -0
- package/lib/services/applications-flow.service.d.ts +2 -0
- package/lib/services/eac.service.d.ts +2 -1
- package/lib/services/project.service.d.ts +2 -1
- package/lib/state/applications-flow.state.d.ts +2 -1
- package/package.json +1 -1
- package/esm2020/lib/elements/gh-control/gh-control.component.mjs +0 -107
package/lcu.api.d.ts
CHANGED
|
@@ -62,8 +62,7 @@ export * from './lib/elements/slotted-card/slotted-card.component';
|
|
|
62
62
|
export * from './lib/elements/analytics-card/analytics-card.component';
|
|
63
63
|
export * from './lib/elements/feed-card-sm/feed-card-sm.component';
|
|
64
64
|
export * from './lib/elements/three-column/three-column.component';
|
|
65
|
-
export * from './lib/elements/
|
|
66
|
-
export * from './lib/elements/gh-control/gh-control.component';
|
|
65
|
+
export * from './lib/elements/feed-header/feed-header.component';
|
|
67
66
|
export * from './lib/elements/main-feed-card/main-feed-card.component';
|
|
68
67
|
export * from './lib/elements/project-info-card/project-info-card.component';
|
|
69
68
|
export * from './lib/elements/two-column-header/two-column-header.component';
|
|
@@ -77,5 +76,6 @@ export * from './lib/controls/build-pipeline-form/build-pipeline-form.component'
|
|
|
77
76
|
export * from './lib/controls/devops-source-control-form/devops-source-control-form.component';
|
|
78
77
|
export * from './lib/dialogs/source-control-dialog/source-control-dialog.component';
|
|
79
78
|
export * from './lib/dialogs/build-pipeline-dialog/build-pipeline-dialog.component';
|
|
79
|
+
export * from './lib/dialogs/feed-header-dialog/feed-header-dialog.component';
|
|
80
80
|
export * from './lib/controls/edit-application-form/edit-application-form.component';
|
|
81
81
|
export * from './lib/elements/breadcrumb/breadcrumb.component';
|
|
@@ -27,7 +27,7 @@ import * as i24 from "./elements/slotted-card/slotted-card.component";
|
|
|
27
27
|
import * as i25 from "./elements/project-info-card/project-info-card.component";
|
|
28
28
|
import * as i26 from "./elements/analytics-card/analytics-card.component";
|
|
29
29
|
import * as i27 from "./elements/feed-card-sm/feed-card-sm.component";
|
|
30
|
-
import * as i28 from "./elements/
|
|
30
|
+
import * as i28 from "./elements/feed-header/feed-header.component";
|
|
31
31
|
import * as i29 from "./elements/main-feed-card/main-feed-card.component";
|
|
32
32
|
import * as i30 from "./elements/two-column-header/two-column-header.component";
|
|
33
33
|
import * as i31 from "./elements/card-carousel/card-carousel.component";
|
|
@@ -47,17 +47,19 @@ import * as i44 from "./dialogs/processor-details-dialog/processor-details-dialo
|
|
|
47
47
|
import * as i45 from "./elements/skeleton-feed-card/skeleton-feed-card.component";
|
|
48
48
|
import * as i46 from "./dialogs/upgrade-dialog/upgrade-dialog.component";
|
|
49
49
|
import * as i47 from "./controls/emulated-devices-toggle/emulated-devices-toggle.component";
|
|
50
|
-
import * as i48 from "
|
|
51
|
-
import * as i49 from "@
|
|
52
|
-
import * as i50 from "@angular/
|
|
53
|
-
import * as i51 from "@
|
|
54
|
-
import * as i52 from "@
|
|
55
|
-
import * as i53 from "@angular/
|
|
56
|
-
import * as i54 from "@
|
|
57
|
-
import * as i55 from "
|
|
50
|
+
import * as i48 from "./dialogs/feed-header-dialog/feed-header-dialog.component";
|
|
51
|
+
import * as i49 from "@kolkov/angular-editor";
|
|
52
|
+
import * as i50 from "@angular/cdk/clipboard";
|
|
53
|
+
import * as i51 from "@lcu/common";
|
|
54
|
+
import * as i52 from "@angular/forms";
|
|
55
|
+
import * as i53 from "@angular/flex-layout";
|
|
56
|
+
import * as i54 from "@lowcodeunit/app-host-common";
|
|
57
|
+
import * as i55 from "@angular/material/tooltip";
|
|
58
|
+
import * as i56 from "@angular/material/slide-toggle";
|
|
59
|
+
import * as i57 from "skeleton-elements/angular";
|
|
58
60
|
export declare class ApplicationsFlowModule {
|
|
59
61
|
static forRoot(): ModuleWithProviders<ApplicationsFlowModule>;
|
|
60
62
|
static ɵfac: i0.ɵɵFactoryDeclaration<ApplicationsFlowModule, never>;
|
|
61
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<ApplicationsFlowModule, [typeof i1.ApplicationsFlowProjectsElementComponent, typeof i2.HostingDetailsFormGroupComponent, typeof i3.CreateProjectWizardComponent, typeof i4.DynamicTabsComponent, typeof i5.HeaderComponent, typeof i6.ProjectTabsComponent, typeof i7.DomainsComponent, typeof i8.ProjectItemsComponent, typeof i9.BuildsComponent, typeof i10.RecentActivitiesComponent, typeof i11.FormCardComponent, typeof i12.ProjectNameComponent, typeof i13.RootDirectoryComponent, typeof i14.BaseFormComponent, typeof i15.BaseFormTestComponent, typeof i16.GitAuthComponent, typeof i17.SourceControlFormControlsComponent, typeof i18.AppsFlowComponent, typeof i19.DevOpsComponent, typeof i20.DFSModifiersComponent, typeof i21.NpmPackageSelectComponent, typeof i22.FlowToolComponent, typeof i23.ThreeColumnComponent, typeof i24.SlottedCardComponent, typeof i25.ProjectInfoCardComponent, typeof i26.AnalyticsCardComponent, typeof i27.FeedCardSmComponent, typeof i28.
|
|
63
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ApplicationsFlowModule, [typeof i1.ApplicationsFlowProjectsElementComponent, typeof i2.HostingDetailsFormGroupComponent, typeof i3.CreateProjectWizardComponent, typeof i4.DynamicTabsComponent, typeof i5.HeaderComponent, typeof i6.ProjectTabsComponent, typeof i7.DomainsComponent, typeof i8.ProjectItemsComponent, typeof i9.BuildsComponent, typeof i10.RecentActivitiesComponent, typeof i11.FormCardComponent, typeof i12.ProjectNameComponent, typeof i13.RootDirectoryComponent, typeof i14.BaseFormComponent, typeof i15.BaseFormTestComponent, typeof i16.GitAuthComponent, typeof i17.SourceControlFormControlsComponent, typeof i18.AppsFlowComponent, typeof i19.DevOpsComponent, typeof i20.DFSModifiersComponent, typeof i21.NpmPackageSelectComponent, typeof i22.FlowToolComponent, typeof i23.ThreeColumnComponent, typeof i24.SlottedCardComponent, typeof i25.ProjectInfoCardComponent, typeof i26.AnalyticsCardComponent, typeof i27.FeedCardSmComponent, typeof i28.FeedHeaderComponent, typeof i29.MainFeedCardComponent, typeof i30.TwoColumnHeaderComponent, typeof i31.CardCarouselComponent, typeof i32.SecurityToggleComponent, typeof i33.ProcessorDetailsFormComponent, typeof i34.SourceControlFormComponent, typeof i35.BuildPipelineFormComponent, typeof i36.DevopsSourceControlFormComponent, typeof i37.SourceControlDialogComponent, typeof i38.BuildPipelineDialogComponent, typeof i39.EditApplicationFormComponent, typeof i40.BreadcrumbComponent, typeof i41.CustomDomainDialogComponent, typeof i42.EditApplicationDialogComponent, typeof i43.NewApplicationDialogComponent, typeof i44.ProcessorDetailsDialogComponent, typeof i45.SkeletonFeedCardComponent, typeof i46.UpgradeDialogComponent, typeof i47.EmulatedDevicesToggleComponent, typeof i48.FeedHeaderDialogComponent], [typeof i49.AngularEditorModule, typeof i50.ClipboardModule, typeof i51.FathymSharedModule, typeof i52.FormsModule, typeof i52.ReactiveFormsModule, typeof i53.FlexLayoutModule, typeof i51.MaterialModule, typeof i54.AppHostModule, typeof i55.MatTooltipModule, typeof i56.MatSlideToggleModule, typeof i57.SkeletonElementsModule], [typeof i1.ApplicationsFlowProjectsElementComponent, typeof i2.HostingDetailsFormGroupComponent, typeof i3.CreateProjectWizardComponent, typeof i4.DynamicTabsComponent, typeof i5.HeaderComponent, typeof i6.ProjectTabsComponent, typeof i7.DomainsComponent, typeof i8.ProjectItemsComponent, typeof i9.BuildsComponent, typeof i10.RecentActivitiesComponent, typeof i11.FormCardComponent, typeof i12.ProjectNameComponent, typeof i13.RootDirectoryComponent, typeof i14.BaseFormComponent, typeof i15.BaseFormTestComponent, typeof i16.GitAuthComponent, typeof i17.SourceControlFormControlsComponent, typeof i18.AppsFlowComponent, typeof i19.DevOpsComponent, typeof i20.DFSModifiersComponent, typeof i21.NpmPackageSelectComponent, typeof i22.FlowToolComponent, typeof i23.ThreeColumnComponent, typeof i24.SlottedCardComponent, typeof i25.ProjectInfoCardComponent, typeof i26.AnalyticsCardComponent, typeof i27.FeedCardSmComponent, typeof i28.FeedHeaderComponent, typeof i48.FeedHeaderDialogComponent, typeof i29.MainFeedCardComponent, typeof i30.TwoColumnHeaderComponent, typeof i31.CardCarouselComponent, typeof i32.SecurityToggleComponent, typeof i33.ProcessorDetailsFormComponent, typeof i34.SourceControlFormComponent, typeof i35.BuildPipelineFormComponent, typeof i36.DevopsSourceControlFormComponent, typeof i37.SourceControlDialogComponent, typeof i38.BuildPipelineDialogComponent, typeof i39.EditApplicationFormComponent, typeof i40.BreadcrumbComponent, typeof i41.CustomDomainDialogComponent, typeof i42.EditApplicationDialogComponent, typeof i43.NewApplicationDialogComponent, typeof i44.ProcessorDetailsDialogComponent, typeof i45.SkeletonFeedCardComponent, typeof i46.UpgradeDialogComponent, typeof i47.EmulatedDevicesToggleComponent, typeof i48.FeedHeaderDialogComponent]>;
|
|
62
64
|
static ɵinj: i0.ɵɵInjectorDeclaration<ApplicationsFlowModule>;
|
|
63
65
|
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { OnInit } from '@angular/core';
|
|
2
|
+
import { AbstractControl, FormBuilder, FormGroup } from '@angular/forms';
|
|
3
|
+
import { MatDialogRef } from '@angular/material/dialog';
|
|
4
|
+
import { MatSelectChange } from '@angular/material/select';
|
|
5
|
+
import { AngularEditorConfig } from '@kolkov/angular-editor';
|
|
6
|
+
import { EaCEnvironmentAsCode, EaCSourceControl } from '@semanticjs/common';
|
|
7
|
+
import { ApplicationsFlowService } from '../../services/applications-flow.service';
|
|
8
|
+
import { EaCService } from '../../services/eac.service';
|
|
9
|
+
import { ApplicationsFlowState, GitHubBranch, GitHubOrganization, GitHubRepository } from '../../state/applications-flow.state';
|
|
10
|
+
import * as i0 from "@angular/core";
|
|
11
|
+
export interface FeedHeaderDialogData {
|
|
12
|
+
dialogTitle: string;
|
|
13
|
+
type: string;
|
|
14
|
+
}
|
|
15
|
+
export declare class FeedHeaderDialogComponent implements OnInit {
|
|
16
|
+
protected appsFlowSvc: ApplicationsFlowService;
|
|
17
|
+
protected eacSvc: EaCService;
|
|
18
|
+
protected formBldr: FormBuilder;
|
|
19
|
+
dialogRef: MatDialogRef<FeedHeaderDialogComponent>;
|
|
20
|
+
data: FeedHeaderDialogData;
|
|
21
|
+
get ActionIconControl(): AbstractControl;
|
|
22
|
+
get ActionLinkControl(): AbstractControl;
|
|
23
|
+
get ActionTextControl(): AbstractControl;
|
|
24
|
+
get EditorControl(): AbstractControl;
|
|
25
|
+
get Environment(): EaCEnvironmentAsCode;
|
|
26
|
+
get TargetBranchFormControl(): AbstractControl;
|
|
27
|
+
get OrganizationFormControl(): AbstractControl;
|
|
28
|
+
get SourceBranchFormControl(): AbstractControl;
|
|
29
|
+
get RepositoryFormControl(): AbstractControl;
|
|
30
|
+
get SourceControlFormControl(): AbstractControl;
|
|
31
|
+
get SourceControlLookups(): Array<string>;
|
|
32
|
+
get SourceControls(): {
|
|
33
|
+
[lookup: string]: EaCSourceControl;
|
|
34
|
+
};
|
|
35
|
+
get SubtitleFormControl(): AbstractControl;
|
|
36
|
+
get State(): ApplicationsFlowState;
|
|
37
|
+
get TitleFormControl(): AbstractControl;
|
|
38
|
+
BranchOptions: GitHubBranch[];
|
|
39
|
+
EditorConfig: AngularEditorConfig;
|
|
40
|
+
FeedHeaderFormGroup: FormGroup;
|
|
41
|
+
OrganizationOptions: GitHubOrganization[];
|
|
42
|
+
RepositoryOptions: GitHubRepository[];
|
|
43
|
+
SourceControl: EaCSourceControl;
|
|
44
|
+
Slices: {
|
|
45
|
+
[key: string]: number;
|
|
46
|
+
};
|
|
47
|
+
SlicesCount: number;
|
|
48
|
+
constructor(appsFlowSvc: ApplicationsFlowService, eacSvc: EaCService, formBldr: FormBuilder, dialogRef: MatDialogRef<FeedHeaderDialogComponent>, data: FeedHeaderDialogData);
|
|
49
|
+
ngOnInit(): void;
|
|
50
|
+
CloseDialog(): void;
|
|
51
|
+
HandleAction(): void;
|
|
52
|
+
PullRequestSourceControlChanged(event: MatSelectChange): void;
|
|
53
|
+
FeatureBranchSourceControlChanged(event: MatSelectChange): void;
|
|
54
|
+
IssueSourceControlChanged(event: MatSelectChange): void;
|
|
55
|
+
Submit(): void;
|
|
56
|
+
OrganizationChanged(event: MatSelectChange): void;
|
|
57
|
+
RepositoryChanged(event: MatSelectChange): void;
|
|
58
|
+
protected listBranches(): void;
|
|
59
|
+
protected listOrganizations(): void;
|
|
60
|
+
protected listRepositories(activeRepo?: string): void;
|
|
61
|
+
protected setupFeedHeaderForm(): void;
|
|
62
|
+
protected setupAnnouncementForm(): void;
|
|
63
|
+
protected setupPRForm(): void;
|
|
64
|
+
protected setupBasicForm(): void;
|
|
65
|
+
protected setupIssueForm(): void;
|
|
66
|
+
protected setupFeatureBranchForm(): void;
|
|
67
|
+
protected setupSourceControlForm(): void;
|
|
68
|
+
protected setupBranchesForm(): void;
|
|
69
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FeedHeaderDialogComponent, never>;
|
|
70
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FeedHeaderDialogComponent, "lcu-feed-header-dialog", never, {}, {}, never, never>;
|
|
71
|
+
}
|
package/lib/elements/{gh-control/gh-control.component.d.ts → feed-header/feed-header.component.d.ts}
RENAMED
|
@@ -1,28 +1,30 @@
|
|
|
1
1
|
import { OnInit } from '@angular/core';
|
|
2
2
|
import { MatDialog } from '@angular/material/dialog';
|
|
3
|
+
import { FeedItemAction } from '../../models/user-feed.model';
|
|
3
4
|
import { EaCService } from '../../services/eac.service';
|
|
4
5
|
import { ApplicationsFlowState } from '../../state/applications-flow.state';
|
|
5
6
|
import * as i0 from "@angular/core";
|
|
6
|
-
export declare class
|
|
7
|
+
export declare class FeedHeaderComponent implements OnInit {
|
|
7
8
|
protected eacSvc: EaCService;
|
|
8
9
|
protected dialog: MatDialog;
|
|
10
|
+
SourceControlLookup: string;
|
|
9
11
|
get ActiveEnvironmentLookup(): string;
|
|
12
|
+
get FeedHeaderActions(): Array<FeedItemAction>;
|
|
10
13
|
get State(): ApplicationsFlowState;
|
|
11
|
-
|
|
14
|
+
ModalHeader: string;
|
|
12
15
|
SkeletonEffect: string;
|
|
13
16
|
protected selectedBtn: string;
|
|
14
17
|
value: string;
|
|
15
18
|
constructor(eacSvc: EaCService, dialog: MatDialog);
|
|
16
19
|
ngOnInit(): void;
|
|
17
20
|
ngAfterViewInit(): void;
|
|
18
|
-
|
|
19
|
-
OpenIssue(): void;
|
|
20
|
-
CreatePullRequest(): void;
|
|
21
|
+
CreateAnnouncement(): void;
|
|
21
22
|
CreateNewApp(): void;
|
|
23
|
+
OpenFHDialog(modalType: string, modalHeader: string): void;
|
|
22
24
|
RouteToPath(path: string): void;
|
|
23
25
|
Submit(): void;
|
|
24
26
|
protected addSelectBtn(): void;
|
|
25
27
|
protected removeSelectedBtn(): void;
|
|
26
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<
|
|
27
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<
|
|
28
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FeedHeaderComponent, never>;
|
|
29
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FeedHeaderComponent, "lcu-feed-header", never, { "SourceControlLookup": "source-control-lookup"; }, {}, never, never>;
|
|
28
30
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { BaseResponse, Status } from '@lcu/common';
|
|
2
2
|
export declare class UserFeedResponse extends BaseResponse {
|
|
3
|
+
Actions: Array<FeedItemAction>;
|
|
3
4
|
Items: Array<FeedItem>;
|
|
4
5
|
SourceControlLookups: Array<string>;
|
|
5
6
|
}
|
|
@@ -42,3 +43,19 @@ export declare class FeedItemTab {
|
|
|
42
43
|
};
|
|
43
44
|
Title: string;
|
|
44
45
|
}
|
|
46
|
+
export declare class FeedEntry {
|
|
47
|
+
ActionIcon: string;
|
|
48
|
+
ActionLink: string;
|
|
49
|
+
ActionText: string;
|
|
50
|
+
Avatar: string;
|
|
51
|
+
Content: string;
|
|
52
|
+
ExpiresAt: Date;
|
|
53
|
+
Organization: string;
|
|
54
|
+
Repositroy: string;
|
|
55
|
+
SourceBranch: string;
|
|
56
|
+
SourceControlLookup: string;
|
|
57
|
+
Subtitle: string;
|
|
58
|
+
TargetBranch: string;
|
|
59
|
+
Title: string;
|
|
60
|
+
Type: string;
|
|
61
|
+
}
|
|
@@ -3,6 +3,7 @@ import { LCUServiceSettings } from '@lcu/common';
|
|
|
3
3
|
import { Observable } from 'rxjs';
|
|
4
4
|
import { EnterpriseAsCode } from '@semanticjs/common';
|
|
5
5
|
import { UnpackLowCodeUnitRequest } from '../state/applications-flow.state';
|
|
6
|
+
import { FeedEntry } from '../models/user-feed.model';
|
|
6
7
|
import * as i0 from "@angular/core";
|
|
7
8
|
export declare class ApplicationsFlowService {
|
|
8
9
|
protected http: HttpClient;
|
|
@@ -28,6 +29,7 @@ export declare class ApplicationsFlowService {
|
|
|
28
29
|
LoadProjectHostingDetails(): Observable<object>;
|
|
29
30
|
SaveEnterpriseAsCode(eac: EnterpriseAsCode): Observable<object>;
|
|
30
31
|
SetActiveEnterprise(activeEntLookup: string): Observable<object>;
|
|
32
|
+
SubmitFeedEntry(entry: FeedEntry): Observable<object>;
|
|
31
33
|
UnpackLowCodeUnit(req: UnpackLowCodeUnitRequest): Observable<object>;
|
|
32
34
|
LoadUserFeed(page: number, pageSize: number, project: string, applications: string[]): Observable<object>;
|
|
33
35
|
protected loadHeaders(): {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ProjectService } from './project.service';
|
|
2
2
|
import { ApplicationsFlowState, UnpackLowCodeUnitRequest } from '../state/applications-flow.state';
|
|
3
3
|
import { EaCApplicationAsCode, EaCDataToken, EaCDFSModifier, EaCEnvironmentAsCode, EaCProjectAsCode, EnterpriseAsCode } from '@semanticjs/common';
|
|
4
|
-
import { FeedItem } from '../models/user-feed.model';
|
|
4
|
+
import { FeedEntry, FeedItem } from '../models/user-feed.model';
|
|
5
5
|
import { HttpClient } from '@angular/common/http';
|
|
6
6
|
import { Status } from '@lcu/common';
|
|
7
7
|
import { Observable } from 'rxjs';
|
|
@@ -60,6 +60,7 @@ export declare class EaCService {
|
|
|
60
60
|
SetActiveEnterprise(entLookup: any): Promise<void>;
|
|
61
61
|
SetCreatingProject(creatingProject: boolean): Promise<void>;
|
|
62
62
|
SetEditProjectSettings(projectLookup: string): Promise<void>;
|
|
63
|
+
SubmitFeedEntry(entry: FeedEntry): Promise<Status>;
|
|
63
64
|
UnpackLowCodeUnit(req: UnpackLowCodeUnitRequest): Promise<void>;
|
|
64
65
|
protected handleSaveApplication(req: SaveApplicationAsCodeEventRequest): Promise<Status>;
|
|
65
66
|
protected handleSaveDFSModifier(req: SaveDFSModifierEventRequest): Promise<void>;
|
|
@@ -2,7 +2,7 @@ import { Status } from '@lcu/common';
|
|
|
2
2
|
import { EaCApplicationAsCode, EnterpriseAsCode } from '@semanticjs/common';
|
|
3
3
|
import { ApplicationsFlowState, UnpackLowCodeUnitRequest } from '../state/applications-flow.state';
|
|
4
4
|
import { ApplicationsFlowService } from './applications-flow.service';
|
|
5
|
-
import { FeedItem } from '../models/user-feed.model';
|
|
5
|
+
import { FeedEntry, FeedItem } from '../models/user-feed.model';
|
|
6
6
|
import { ActivatedRoute } from '@angular/router';
|
|
7
7
|
import * as i0 from "@angular/core";
|
|
8
8
|
export declare class ProjectService {
|
|
@@ -32,6 +32,7 @@ export declare class ProjectService {
|
|
|
32
32
|
SaveEnterpriseAsCode(state: ApplicationsFlowState, eac: EnterpriseAsCode): Promise<Status>;
|
|
33
33
|
SetCreatingProject(creatingProject: boolean): void;
|
|
34
34
|
SetEditProjectSettings(state: ApplicationsFlowState, projectLookup: string): Promise<any>;
|
|
35
|
+
SubmitFeedEntry(state: ApplicationsFlowState, entry: FeedEntry): Promise<Status>;
|
|
35
36
|
ToggleCreateProject(): void;
|
|
36
37
|
UnpackLowCodeUnit(state: ApplicationsFlowState, req: UnpackLowCodeUnitRequest): Promise<EnterpriseAsCode>;
|
|
37
38
|
protected loadApplicationsForFeed(state: ApplicationsFlowState, paramMap: any): {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { EnterpriseAsCode } from '@semanticjs/common';
|
|
2
|
-
import { FeedItem } from '../models/user-feed.model';
|
|
2
|
+
import { FeedItem, FeedItemAction } from '../models/user-feed.model';
|
|
3
3
|
export declare class ApplicationsFlowState {
|
|
4
4
|
ActiveEnterpriseLookup?: string;
|
|
5
5
|
EaC?: EnterpriseAsCode;
|
|
@@ -8,6 +8,7 @@ export declare class ApplicationsFlowState {
|
|
|
8
8
|
Lookup: string;
|
|
9
9
|
}>;
|
|
10
10
|
Feed?: Array<FeedItem>;
|
|
11
|
+
FeedActions?: Array<FeedItemAction>;
|
|
11
12
|
FeedSourceControlLookups?: Array<string>;
|
|
12
13
|
GitHub?: GitHubSetupState;
|
|
13
14
|
HostingDetails?: ProjectHostingDetails;
|
package/package.json
CHANGED
|
@@ -1,107 +0,0 @@
|
|
|
1
|
-
import { Component } from '@angular/core';
|
|
2
|
-
import { NewApplicationDialogComponent } from '../../dialogs/new-application-dialog/new-application-dialog.component';
|
|
3
|
-
import * as i0 from "@angular/core";
|
|
4
|
-
import * as i1 from "../../services/eac.service";
|
|
5
|
-
import * as i2 from "@angular/material/dialog";
|
|
6
|
-
import * as i3 from "@angular/material/card";
|
|
7
|
-
import * as i4 from "@angular/material/icon";
|
|
8
|
-
import * as i5 from "@angular/material/form-field";
|
|
9
|
-
import * as i6 from "@angular/material/button";
|
|
10
|
-
import * as i7 from "@angular/material/menu";
|
|
11
|
-
import * as i8 from "skeleton-elements/angular";
|
|
12
|
-
import * as i9 from "@angular/common";
|
|
13
|
-
import * as i10 from "@angular/flex-layout/flex";
|
|
14
|
-
import * as i11 from "@angular/material/input";
|
|
15
|
-
import * as i12 from "@angular/forms";
|
|
16
|
-
export class GhControlComponent {
|
|
17
|
-
constructor(eacSvc, dialog) {
|
|
18
|
-
this.eacSvc = eacSvc;
|
|
19
|
-
this.dialog = dialog;
|
|
20
|
-
this.InputLabel = "Create Pull Request";
|
|
21
|
-
this.SkeletonEffect = "wave";
|
|
22
|
-
this.selectedBtn = "pr-btn";
|
|
23
|
-
}
|
|
24
|
-
get ActiveEnvironmentLookup() {
|
|
25
|
-
// TODO: Eventually support multiple environments
|
|
26
|
-
const envLookups = Object.keys(this.State?.EaC?.Environments || {});
|
|
27
|
-
return envLookups[0];
|
|
28
|
-
}
|
|
29
|
-
get State() {
|
|
30
|
-
return this.eacSvc.State;
|
|
31
|
-
}
|
|
32
|
-
ngOnInit() {
|
|
33
|
-
}
|
|
34
|
-
ngAfterViewInit() {
|
|
35
|
-
this.addSelectBtn();
|
|
36
|
-
}
|
|
37
|
-
CreateFeatureBranch() {
|
|
38
|
-
this.removeSelectedBtn();
|
|
39
|
-
this.InputLabel = "Create Feature Branch";
|
|
40
|
-
this.selectedBtn = "fb-btn";
|
|
41
|
-
this.addSelectBtn();
|
|
42
|
-
console.log("create feature branch selected");
|
|
43
|
-
}
|
|
44
|
-
OpenIssue() {
|
|
45
|
-
this.removeSelectedBtn();
|
|
46
|
-
this.InputLabel = "Open Issue";
|
|
47
|
-
this.selectedBtn = "oi-btn";
|
|
48
|
-
this.addSelectBtn();
|
|
49
|
-
console.log("open issue selected");
|
|
50
|
-
}
|
|
51
|
-
CreatePullRequest() {
|
|
52
|
-
this.removeSelectedBtn();
|
|
53
|
-
this.InputLabel = "Create Pull Request";
|
|
54
|
-
this.selectedBtn = "pr-btn";
|
|
55
|
-
this.addSelectBtn();
|
|
56
|
-
console.log("create pull request selected");
|
|
57
|
-
}
|
|
58
|
-
CreateNewApp() {
|
|
59
|
-
const dialogRef = this.dialog.open(NewApplicationDialogComponent, {
|
|
60
|
-
width: '600px',
|
|
61
|
-
data: {
|
|
62
|
-
environmentLookup: this.ActiveEnvironmentLookup,
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
dialogRef.afterClosed().subscribe((result) => {
|
|
66
|
-
// console.log('The dialog was closed');
|
|
67
|
-
// console.log("result:", result)
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
RouteToPath(path) {
|
|
71
|
-
window.location.href = path;
|
|
72
|
-
}
|
|
73
|
-
Submit() {
|
|
74
|
-
console.log("submitting: ", this.value);
|
|
75
|
-
switch (this.selectedBtn) {
|
|
76
|
-
case "pr-btn":
|
|
77
|
-
//Pull request
|
|
78
|
-
console.log("creating pull request: ", this.value);
|
|
79
|
-
break;
|
|
80
|
-
case "oi-btn":
|
|
81
|
-
//Open Issue
|
|
82
|
-
console.log("Open issue: ", this.value);
|
|
83
|
-
break;
|
|
84
|
-
case "fb-btn":
|
|
85
|
-
//Feature Branch
|
|
86
|
-
console.log("creating feature branch: ", this.value);
|
|
87
|
-
break;
|
|
88
|
-
default:
|
|
89
|
-
console.log("hmm");
|
|
90
|
-
break;
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
//HELPERS
|
|
94
|
-
addSelectBtn() {
|
|
95
|
-
// (<HTMLElement>document.getElementById(this.selectedBtn)).classList.add('selected');
|
|
96
|
-
}
|
|
97
|
-
removeSelectedBtn() {
|
|
98
|
-
// (<HTMLElement>document.getElementById(this.selectedBtn)).classList.remove('selected');
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
GhControlComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GhControlComponent, deps: [{ token: i1.EaCService }, { token: i2.MatDialog }], target: i0.ɵɵFactoryTarget.Component });
|
|
102
|
-
GhControlComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.2.2", type: GhControlComponent, selector: "lcu-gh-control", ngImport: i0, template: "<mat-card class=\"social-card\" *ngIf=\"false\">\n <ng-container *ngIf=\"!State?.Loading\">\n <div class=\"gh-card-container\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-icon fxFlex=\"15%\" class=\"gh-icon\">error_outline</mat-icon>\n <div fxFlex=\"70%\" class=\"gh-card-main-content\">\n <mat-form-field appearance=\"fill\" class=\"gh-input\">\n <mat-label>{{ InputLabel }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" />\n <!-- <button *ngIf=\"value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"value=''\">\n <mat-icon>close</mat-icon>\n </button> -->\n </mat-form-field>\n </div>\n\n <button\n fxFlex=\"15%\"\n mat-button\n (click)=\"Submit()\"\n id=\"submit-btn\"\n color=\"primary\"\n >\n Submit\n </button>\n </div>\n\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <button mat-button (click)=\"CreatePullRequest()\" id=\"pr-btn\">\n Pull Request\n </button>\n <button mat-button (click)=\"OpenIssue()\" id=\"oi-btn\">Open Issue</button>\n <button mat-button (click)=\"CreateFeatureBranch()\" id=\"fb-btn\">\n Feature Branch\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"menu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button class=\"gh-menu-action\" mat-menu-item (click)=\"CreateNewApp()\">\n Create New App\n </button>\n\n <button\n class=\"gh-menu-action\"\n mat-menu-item\n (click)=\"RouteToPath('/dashboard/create-project')\"\n >\n Create Project\n </button>\n </mat-menu>\n </mat-card-actions>\n </ng-container>\n\n <!-- SKELETON -->\n <ng-container *ngIf=\"State?.Loading\">\n <div id=\"gh-card-skeleton\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <skeleton-avatar\n class=\"gh-icon\"\n [showIcon]=\"false\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-avatar>\n\n <div fxFlex=\"70%\" class=\"gh-card-main-content\">\n <skeleton-block\n height=\"60px\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-block>\n </div>\n\n <div\n skeleton-text\n fxFlex=\"15%\"\n [effect]=\"SkeletonEffect\"\n style=\"margin: 0px 10px\"\n >\n Submit\n </div>\n </div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <div skeleton-text [effect]=\"SkeletonEffect\">Pull Request</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Open Issue</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Feature Branch</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">\n <mat-icon>more_horiz</mat-icon>\n </div>\n </div>\n </ng-container>\n</mat-card>\n", styles: [":host ::ng-deep .social-card{margin:20px;padding:15px 5px}:host ::ng-deep mat-card-actions{margin-bottom:-1px!important;margin-left:0!important;margin-right:-.5px!important}:host ::ng-deep .main-slot-container{padding:10px}:host ::ng-deep .slot-header{align-items:center}:host ::ng-deep .slot-content{width:100%}:host ::ng-deep .slot-name{font-size:13px;font-weight:600}:host ::ng-deep .slot-description{font-size:12px;margin-right:10px}:host ::ng-deep .slot-action-anchor{font-size:10px;text-decoration:none;color:#000}:host ::ng-deep .action-icon{height:25px;width:25px;font-size:25px;cursor:pointer}.gh-icon{width:60px;height:60px;font-size:60px;text-align:center}.gh-input{width:90%}.selected{border:1px solid green}.gh-input ::ng-deep .mat-form-field-flex{border:1px solid;border-radius:30px!important}.gh-input ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.gh-input ::ng-deep .mat-form-field-underline{display:none}\n"], components: [{ type: i3.MatCard, selector: "mat-card", exportAs: ["matCard"] }, { type: i4.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { type: i5.MatFormField, selector: "mat-form-field", inputs: ["color", "appearance", "hideRequiredMarker", "hintLabel", "floatLabel"], exportAs: ["matFormField"] }, { type: i6.MatButton, selector: "button[mat-button], button[mat-raised-button], button[mat-icon-button], button[mat-fab], button[mat-mini-fab], button[mat-stroked-button], button[mat-flat-button]", inputs: ["disabled", "disableRipple", "color"], exportAs: ["matButton"] }, { type: i7.MatMenu, selector: "mat-menu", exportAs: ["matMenu"] }, { type: i7.MatMenuItem, selector: "[mat-menu-item]", inputs: ["disabled", "disableRipple", "role"], exportAs: ["matMenuItem"] }, { type: i8.SkeletonAvatarComponent, selector: "skeleton-avatar", inputs: ["size", "color", "showIcon", "iconColor", "borderRadius", "effect"] }, { type: i8.SkeletonBlockComponent, selector: "skeleton-block", inputs: ["width", "height", "effect", "borderRadius"] }], directives: [{ type: i9.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i10.DefaultLayoutDirective, selector: " [fxLayout], [fxLayout.xs], [fxLayout.sm], [fxLayout.md], [fxLayout.lg], [fxLayout.xl], [fxLayout.lt-sm], [fxLayout.lt-md], [fxLayout.lt-lg], [fxLayout.lt-xl], [fxLayout.gt-xs], [fxLayout.gt-sm], [fxLayout.gt-md], [fxLayout.gt-lg]", inputs: ["fxLayout", "fxLayout.xs", "fxLayout.sm", "fxLayout.md", "fxLayout.lg", "fxLayout.xl", "fxLayout.lt-sm", "fxLayout.lt-md", "fxLayout.lt-lg", "fxLayout.lt-xl", "fxLayout.gt-xs", "fxLayout.gt-sm", "fxLayout.gt-md", "fxLayout.gt-lg"] }, { type: i10.DefaultLayoutAlignDirective, selector: " [fxLayoutAlign], [fxLayoutAlign.xs], [fxLayoutAlign.sm], [fxLayoutAlign.md], [fxLayoutAlign.lg], [fxLayoutAlign.xl], [fxLayoutAlign.lt-sm], [fxLayoutAlign.lt-md], [fxLayoutAlign.lt-lg], [fxLayoutAlign.lt-xl], [fxLayoutAlign.gt-xs], [fxLayoutAlign.gt-sm], [fxLayoutAlign.gt-md], [fxLayoutAlign.gt-lg]", inputs: ["fxLayoutAlign", "fxLayoutAlign.xs", "fxLayoutAlign.sm", "fxLayoutAlign.md", "fxLayoutAlign.lg", "fxLayoutAlign.xl", "fxLayoutAlign.lt-sm", "fxLayoutAlign.lt-md", "fxLayoutAlign.lt-lg", "fxLayoutAlign.lt-xl", "fxLayoutAlign.gt-xs", "fxLayoutAlign.gt-sm", "fxLayoutAlign.gt-md", "fxLayoutAlign.gt-lg"] }, { type: i10.DefaultFlexDirective, selector: " [fxFlex], [fxFlex.xs], [fxFlex.sm], [fxFlex.md], [fxFlex.lg], [fxFlex.xl], [fxFlex.lt-sm], [fxFlex.lt-md], [fxFlex.lt-lg], [fxFlex.lt-xl], [fxFlex.gt-xs], [fxFlex.gt-sm], [fxFlex.gt-md], [fxFlex.gt-lg]", inputs: ["fxFlex", "fxFlex.xs", "fxFlex.sm", "fxFlex.md", "fxFlex.lg", "fxFlex.xl", "fxFlex.lt-sm", "fxFlex.lt-md", "fxFlex.lt-lg", "fxFlex.lt-xl", "fxFlex.gt-xs", "fxFlex.gt-sm", "fxFlex.gt-md", "fxFlex.gt-lg"] }, { type: i5.MatLabel, selector: "mat-label" }, { type: i11.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly"], exportAs: ["matInput"] }, { type: i12.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i12.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i12.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i3.MatCardActions, selector: "mat-card-actions", inputs: ["align"], exportAs: ["matCardActions"] }, { type: i7.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", exportAs: ["matMenuTrigger"] }, { type: i8.SkeletonTextDirective, selector: "[skeleton-text]", inputs: ["effect"] }] });
|
|
103
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.2.2", ngImport: i0, type: GhControlComponent, decorators: [{
|
|
104
|
-
type: Component,
|
|
105
|
-
args: [{ selector: 'lcu-gh-control', template: "<mat-card class=\"social-card\" *ngIf=\"false\">\n <ng-container *ngIf=\"!State?.Loading\">\n <div class=\"gh-card-container\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <mat-icon fxFlex=\"15%\" class=\"gh-icon\">error_outline</mat-icon>\n <div fxFlex=\"70%\" class=\"gh-card-main-content\">\n <mat-form-field appearance=\"fill\" class=\"gh-input\">\n <mat-label>{{ InputLabel }}</mat-label>\n <input matInput type=\"text\" [(ngModel)]=\"value\" />\n <!-- <button *ngIf=\"value\" matSuffix mat-icon-button aria-label=\"Clear\" (click)=\"value=''\">\n <mat-icon>close</mat-icon>\n </button> -->\n </mat-form-field>\n </div>\n\n <button\n fxFlex=\"15%\"\n mat-button\n (click)=\"Submit()\"\n id=\"submit-btn\"\n color=\"primary\"\n >\n Submit\n </button>\n </div>\n\n <mat-card-actions fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <button mat-button (click)=\"CreatePullRequest()\" id=\"pr-btn\">\n Pull Request\n </button>\n <button mat-button (click)=\"OpenIssue()\" id=\"oi-btn\">Open Issue</button>\n <button mat-button (click)=\"CreateFeatureBranch()\" id=\"fb-btn\">\n Feature Branch\n </button>\n <button mat-icon-button [matMenuTriggerFor]=\"menu\" aria-label=\"menu\">\n <mat-icon>more_horiz</mat-icon>\n </button>\n <mat-menu #menu=\"matMenu\">\n <button class=\"gh-menu-action\" mat-menu-item (click)=\"CreateNewApp()\">\n Create New App\n </button>\n\n <button\n class=\"gh-menu-action\"\n mat-menu-item\n (click)=\"RouteToPath('/dashboard/create-project')\"\n >\n Create Project\n </button>\n </mat-menu>\n </mat-card-actions>\n </ng-container>\n\n <!-- SKELETON -->\n <ng-container *ngIf=\"State?.Loading\">\n <div id=\"gh-card-skeleton\" fxLayout=\"row\" fxLayoutAlign=\"center center\">\n <skeleton-avatar\n class=\"gh-icon\"\n [showIcon]=\"false\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-avatar>\n\n <div fxFlex=\"70%\" class=\"gh-card-main-content\">\n <skeleton-block\n height=\"60px\"\n [effect]=\"SkeletonEffect\"\n ></skeleton-block>\n </div>\n\n <div\n skeleton-text\n fxFlex=\"15%\"\n [effect]=\"SkeletonEffect\"\n style=\"margin: 0px 10px\"\n >\n Submit\n </div>\n </div>\n\n <div fxLayout=\"row\" fxLayoutAlign=\"space-around center\">\n <div skeleton-text [effect]=\"SkeletonEffect\">Pull Request</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Open Issue</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">Feature Branch</div>\n <div skeleton-text [effect]=\"SkeletonEffect\">\n <mat-icon>more_horiz</mat-icon>\n </div>\n </div>\n </ng-container>\n</mat-card>\n", styles: [":host ::ng-deep .social-card{margin:20px;padding:15px 5px}:host ::ng-deep mat-card-actions{margin-bottom:-1px!important;margin-left:0!important;margin-right:-.5px!important}:host ::ng-deep .main-slot-container{padding:10px}:host ::ng-deep .slot-header{align-items:center}:host ::ng-deep .slot-content{width:100%}:host ::ng-deep .slot-name{font-size:13px;font-weight:600}:host ::ng-deep .slot-description{font-size:12px;margin-right:10px}:host ::ng-deep .slot-action-anchor{font-size:10px;text-decoration:none;color:#000}:host ::ng-deep .action-icon{height:25px;width:25px;font-size:25px;cursor:pointer}.gh-icon{width:60px;height:60px;font-size:60px;text-align:center}.gh-input{width:90%}.selected{border:1px solid green}.gh-input ::ng-deep .mat-form-field-flex{border:1px solid;border-radius:30px!important}.gh-input ::ng-deep .mat-form-field-wrapper{padding-bottom:0!important}.gh-input ::ng-deep .mat-form-field-underline{display:none}\n"] }]
|
|
106
|
-
}], ctorParameters: function () { return [{ type: i1.EaCService }, { type: i2.MatDialog }]; } });
|
|
107
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2gtY29udHJvbC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jb21tb24vc3JjL2xpYi9lbGVtZW50cy9naC1jb250cm9sL2doLWNvbnRyb2wuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29tbW9uL3NyYy9saWIvZWxlbWVudHMvZ2gtY29udHJvbC9naC1jb250cm9sLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQVUsTUFBTSxlQUFlLENBQUM7QUFFbEQsT0FBTyxFQUFFLDZCQUE2QixFQUFFLE1BQU0sdUVBQXVFLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBU3RILE1BQU0sT0FBTyxrQkFBa0I7SUFxQjdCLFlBQ2MsTUFBa0IsRUFDbEIsTUFBaUI7UUFEakIsV0FBTSxHQUFOLE1BQU0sQ0FBWTtRQUNsQixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBRTdCLElBQUksQ0FBQyxVQUFVLEdBQUcscUJBQXFCLENBQUM7UUFDeEMsSUFBSSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUM7UUFDN0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7SUFFOUIsQ0FBQztJQTNCRCxJQUFXLHVCQUF1QjtRQUNoQyxtREFBbUQ7UUFDbkQsTUFBTSxVQUFVLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLEdBQUcsRUFBRSxZQUFZLElBQUksRUFBRSxDQUFDLENBQUM7UUFFcEUsT0FBTyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdkIsQ0FBQztJQUVELElBQVcsS0FBSztRQUNkLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7SUFDM0IsQ0FBQztJQW9CTSxRQUFRO0lBRWYsQ0FBQztJQUVNLGVBQWU7UUFDcEIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO0lBQ3RCLENBQUM7SUFFTSxtQkFBbUI7UUFDeEIsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyx1QkFBdUIsQ0FBQztRQUMxQyxJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQztRQUM1QixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDcEIsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO0lBRWhELENBQUM7SUFFTSxTQUFTO1FBQ2QsSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLFVBQVUsR0FBRyxZQUFZLENBQUM7UUFDL0IsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMscUJBQXFCLENBQUMsQ0FBQztJQUVyQyxDQUFDO0lBRU0saUJBQWlCO1FBQ3RCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcscUJBQXFCLENBQUM7UUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUM7UUFDNUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBQ3BCLE9BQU8sQ0FBQyxHQUFHLENBQUMsOEJBQThCLENBQUMsQ0FBQztJQUU5QyxDQUFDO0lBRU0sWUFBWTtRQUNqQixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRTtZQUNoRSxLQUFLLEVBQUUsT0FBTztZQUNkLElBQUksRUFBRTtnQkFDSixpQkFBaUIsRUFBRSxJQUFJLENBQUMsdUJBQXVCO2FBQ2hEO1NBQ0YsQ0FBQyxDQUFDO1FBRUgsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzNDLHdDQUF3QztZQUN4QyxpQ0FBaUM7UUFDbkMsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRU0sV0FBVyxDQUFDLElBQVk7UUFDN0IsTUFBTSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQzlCLENBQUM7SUFHTSxNQUFNO1FBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hDLFFBQVEsSUFBSSxDQUFDLFdBQVcsRUFBQztZQUN2QixLQUFLLFFBQVE7Z0JBQ1gsY0FBYztnQkFDZCxPQUFPLENBQUMsR0FBRyxDQUFDLHlCQUF5QixFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDbkQsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxZQUFZO2dCQUNaLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDeEMsTUFBTTtZQUNSLEtBQUssUUFBUTtnQkFDWCxnQkFBZ0I7Z0JBQ2hCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkJBQTJCLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyRCxNQUFNO1lBQ1I7Z0JBQ0UsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQTtnQkFFbEIsTUFBTTtTQUNUO0lBQ0gsQ0FBQztJQUVELFNBQVM7SUFFQyxZQUFZO1FBQ3BCLHNGQUFzRjtJQUN4RixDQUFDO0lBRVMsaUJBQWlCO1FBQ3pCLHlGQUF5RjtJQUMzRixDQUFDOzsrR0FuSFUsa0JBQWtCO21HQUFsQixrQkFBa0Isc0RDWC9CLCs3RkF3RkE7MkZEN0VhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDRSxnQkFBZ0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgTWF0RGlhbG9nIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZGlhbG9nJztcbmltcG9ydCB7IE5ld0FwcGxpY2F0aW9uRGlhbG9nQ29tcG9uZW50IH0gZnJvbSAnLi4vLi4vZGlhbG9ncy9uZXctYXBwbGljYXRpb24tZGlhbG9nL25ldy1hcHBsaWNhdGlvbi1kaWFsb2cuY29tcG9uZW50JztcbmltcG9ydCB7IEVhQ1NlcnZpY2UgfSBmcm9tICcuLi8uLi9zZXJ2aWNlcy9lYWMuc2VydmljZSc7XG5pbXBvcnQgeyBBcHBsaWNhdGlvbnNGbG93U3RhdGUgfSBmcm9tICcuLi8uLi9zdGF0ZS9hcHBsaWNhdGlvbnMtZmxvdy5zdGF0ZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2xjdS1naC1jb250cm9sJyxcbiAgdGVtcGxhdGVVcmw6ICcuL2doLWNvbnRyb2wuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9naC1jb250cm9sLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgR2hDb250cm9sQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcblxuICBwdWJsaWMgZ2V0IEFjdGl2ZUVudmlyb25tZW50TG9va3VwKCk6IHN0cmluZyB7XG4gICAgLy8gIFRPRE86ICBFdmVudHVhbGx5IHN1cHBvcnQgbXVsdGlwbGUgZW52aXJvbm1lbnRzXG4gICAgY29uc3QgZW52TG9va3VwcyA9IE9iamVjdC5rZXlzKHRoaXMuU3RhdGU/LkVhQz8uRW52aXJvbm1lbnRzIHx8IHt9KTtcblxuICAgIHJldHVybiBlbnZMb29rdXBzWzBdO1xuICB9XG5cbiAgcHVibGljIGdldCBTdGF0ZSgpOiBBcHBsaWNhdGlvbnNGbG93U3RhdGV7XG4gICAgcmV0dXJuIHRoaXMuZWFjU3ZjLlN0YXRlO1xuICB9XG5cbiAgcHVibGljIElucHV0TGFiZWw6IHN0cmluZztcblxuICBwdWJsaWMgU2tlbGV0b25FZmZlY3Q6IHN0cmluZztcblxuICBwcm90ZWN0ZWQgc2VsZWN0ZWRCdG46IHN0cmluZztcblxuICBwdWJsaWMgdmFsdWU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvciggXG4gICAgICBwcm90ZWN0ZWQgZWFjU3ZjOiBFYUNTZXJ2aWNlLFxuICAgICAgcHJvdGVjdGVkIGRpYWxvZzogTWF0RGlhbG9nKSB7IFxuXG4gICAgdGhpcy5JbnB1dExhYmVsID0gXCJDcmVhdGUgUHVsbCBSZXF1ZXN0XCI7XG4gICAgdGhpcy5Ta2VsZXRvbkVmZmVjdCA9IFwid2F2ZVwiO1xuICAgIHRoaXMuc2VsZWN0ZWRCdG4gPSBcInByLWJ0blwiO1xuXG4gIH1cblxuICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgXG4gIH1cblxuICBwdWJsaWMgbmdBZnRlclZpZXdJbml0KCl7XG4gICAgdGhpcy5hZGRTZWxlY3RCdG4oKTtcbiAgfVxuXG4gIHB1YmxpYyBDcmVhdGVGZWF0dXJlQnJhbmNoKCl7XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEJ0bigpO1xuICAgIHRoaXMuSW5wdXRMYWJlbCA9IFwiQ3JlYXRlIEZlYXR1cmUgQnJhbmNoXCI7XG4gICAgdGhpcy5zZWxlY3RlZEJ0biA9IFwiZmItYnRuXCI7XG4gICAgdGhpcy5hZGRTZWxlY3RCdG4oKTtcbiAgICBjb25zb2xlLmxvZyhcImNyZWF0ZSBmZWF0dXJlIGJyYW5jaCBzZWxlY3RlZFwiKTtcblxuICB9XG5cbiAgcHVibGljIE9wZW5Jc3N1ZSgpe1xuICAgIHRoaXMucmVtb3ZlU2VsZWN0ZWRCdG4oKTtcbiAgICB0aGlzLklucHV0TGFiZWwgPSBcIk9wZW4gSXNzdWVcIjtcbiAgICB0aGlzLnNlbGVjdGVkQnRuID0gXCJvaS1idG5cIjtcbiAgICB0aGlzLmFkZFNlbGVjdEJ0bigpO1xuICAgIGNvbnNvbGUubG9nKFwib3BlbiBpc3N1ZSBzZWxlY3RlZFwiKTtcblxuICB9XG5cbiAgcHVibGljIENyZWF0ZVB1bGxSZXF1ZXN0KCl7XG4gICAgdGhpcy5yZW1vdmVTZWxlY3RlZEJ0bigpO1xuICAgIHRoaXMuSW5wdXRMYWJlbCA9IFwiQ3JlYXRlIFB1bGwgUmVxdWVzdFwiO1xuICAgIHRoaXMuc2VsZWN0ZWRCdG4gPSBcInByLWJ0blwiO1xuICAgIHRoaXMuYWRkU2VsZWN0QnRuKCk7XG4gICAgY29uc29sZS5sb2coXCJjcmVhdGUgcHVsbCByZXF1ZXN0IHNlbGVjdGVkXCIpO1xuXG4gIH1cblxuICBwdWJsaWMgQ3JlYXRlTmV3QXBwKCl7XG4gICAgY29uc3QgZGlhbG9nUmVmID0gdGhpcy5kaWFsb2cub3BlbihOZXdBcHBsaWNhdGlvbkRpYWxvZ0NvbXBvbmVudCwge1xuICAgICAgd2lkdGg6ICc2MDBweCcsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGVudmlyb25tZW50TG9va3VwOiB0aGlzLkFjdGl2ZUVudmlyb25tZW50TG9va3VwLFxuICAgICAgfSxcbiAgICB9KTtcblxuICAgIGRpYWxvZ1JlZi5hZnRlckNsb3NlZCgpLnN1YnNjcmliZSgocmVzdWx0KSA9PiB7XG4gICAgICAvLyBjb25zb2xlLmxvZygnVGhlIGRpYWxvZyB3YXMgY2xvc2VkJyk7XG4gICAgICAvLyBjb25zb2xlLmxvZyhcInJlc3VsdDpcIiwgcmVzdWx0KVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIFJvdXRlVG9QYXRoKHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gcGF0aDtcbiAgfVxuXG5cbiAgcHVibGljIFN1Ym1pdCgpe1xuICAgIGNvbnNvbGUubG9nKFwic3VibWl0dGluZzogXCIsIHRoaXMudmFsdWUpO1xuICAgIHN3aXRjaCAodGhpcy5zZWxlY3RlZEJ0bil7XG4gICAgICBjYXNlIFwicHItYnRuXCI6XG4gICAgICAgIC8vUHVsbCByZXF1ZXN0XG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRpbmcgcHVsbCByZXF1ZXN0OiBcIiwgdGhpcy52YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcIm9pLWJ0blwiOlxuICAgICAgICAvL09wZW4gSXNzdWVcbiAgICAgICAgY29uc29sZS5sb2coXCJPcGVuIGlzc3VlOiBcIiwgdGhpcy52YWx1ZSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSBcImZiLWJ0blwiOlxuICAgICAgICAvL0ZlYXR1cmUgQnJhbmNoXG4gICAgICAgIGNvbnNvbGUubG9nKFwiY3JlYXRpbmcgZmVhdHVyZSBicmFuY2g6IFwiLCB0aGlzLnZhbHVlKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb25zb2xlLmxvZyhcImhtbVwiKVxuXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vSEVMUEVSU1xuXG4gIHByb3RlY3RlZCBhZGRTZWxlY3RCdG4oKXsgICAgXG4gICAgLy8gKDxIVE1MRWxlbWVudD5kb2N1bWVudC5nZXRFbGVtZW50QnlJZCh0aGlzLnNlbGVjdGVkQnRuKSkuY2xhc3NMaXN0LmFkZCgnc2VsZWN0ZWQnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZW1vdmVTZWxlY3RlZEJ0bigpe1xuICAgIC8vICg8SFRNTEVsZW1lbnQ+ZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQodGhpcy5zZWxlY3RlZEJ0bikpLmNsYXNzTGlzdC5yZW1vdmUoJ3NlbGVjdGVkJyk7XG4gIH1cblxufVxuIiwiPG1hdC1jYXJkIGNsYXNzPVwic29jaWFsLWNhcmRcIiAqbmdJZj1cImZhbHNlXCI+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCIhU3RhdGU/LkxvYWRpbmdcIj5cbiAgICA8ZGl2IGNsYXNzPVwiZ2gtY2FyZC1jb250YWluZXJcIiBmeExheW91dD1cInJvd1wiIGZ4TGF5b3V0QWxpZ249XCJjZW50ZXIgY2VudGVyXCI+XG4gICAgICA8bWF0LWljb24gZnhGbGV4PVwiMTUlXCIgY2xhc3M9XCJnaC1pY29uXCI+ZXJyb3Jfb3V0bGluZTwvbWF0LWljb24+XG4gICAgICA8ZGl2IGZ4RmxleD1cIjcwJVwiIGNsYXNzPVwiZ2gtY2FyZC1tYWluLWNvbnRlbnRcIj5cbiAgICAgICAgPG1hdC1mb3JtLWZpZWxkIGFwcGVhcmFuY2U9XCJmaWxsXCIgY2xhc3M9XCJnaC1pbnB1dFwiPlxuICAgICAgICAgIDxtYXQtbGFiZWw+e3sgSW5wdXRMYWJlbCB9fTwvbWF0LWxhYmVsPlxuICAgICAgICAgIDxpbnB1dCBtYXRJbnB1dCB0eXBlPVwidGV4dFwiIFsobmdNb2RlbCldPVwidmFsdWVcIiAvPlxuICAgICAgICAgIDwhLS0gPGJ1dHRvbiAqbmdJZj1cInZhbHVlXCIgbWF0U3VmZml4IG1hdC1pY29uLWJ1dHRvbiBhcmlhLWxhYmVsPVwiQ2xlYXJcIiAoY2xpY2spPVwidmFsdWU9JydcIj5cbiAgICAgICAgICAgICAgICAgICAgPG1hdC1pY29uPmNsb3NlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+IC0tPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgPC9kaXY+XG5cbiAgICAgIDxidXR0b25cbiAgICAgICAgZnhGbGV4PVwiMTUlXCJcbiAgICAgICAgbWF0LWJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiU3VibWl0KClcIlxuICAgICAgICBpZD1cInN1Ym1pdC1idG5cIlxuICAgICAgICBjb2xvcj1cInByaW1hcnlcIlxuICAgICAgPlxuICAgICAgICBTdWJtaXRcbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuXG4gICAgPG1hdC1jYXJkLWFjdGlvbnMgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwic3BhY2UtYXJvdW5kIGNlbnRlclwiPlxuICAgICAgPGJ1dHRvbiBtYXQtYnV0dG9uIChjbGljayk9XCJDcmVhdGVQdWxsUmVxdWVzdCgpXCIgaWQ9XCJwci1idG5cIj5cbiAgICAgICAgUHVsbCBSZXF1ZXN0XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiT3Blbklzc3VlKClcIiBpZD1cIm9pLWJ0blwiPk9wZW4gSXNzdWU8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gbWF0LWJ1dHRvbiAoY2xpY2spPVwiQ3JlYXRlRmVhdHVyZUJyYW5jaCgpXCIgaWQ9XCJmYi1idG5cIj5cbiAgICAgICAgRmVhdHVyZSBCcmFuY2hcbiAgICAgIDwvYnV0dG9uPlxuICAgICAgPGJ1dHRvbiBtYXQtaWNvbi1idXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT1cIm1lbnVcIiBhcmlhLWxhYmVsPVwibWVudVwiPlxuICAgICAgICA8bWF0LWljb24+bW9yZV9ob3JpejwvbWF0LWljb24+XG4gICAgICA8L2J1dHRvbj5cbiAgICAgIDxtYXQtbWVudSAjbWVudT1cIm1hdE1lbnVcIj5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImdoLW1lbnUtYWN0aW9uXCIgbWF0LW1lbnUtaXRlbSAoY2xpY2spPVwiQ3JlYXRlTmV3QXBwKClcIj5cbiAgICAgICAgICBDcmVhdGUgTmV3IEFwcFxuICAgICAgICA8L2J1dHRvbj5cblxuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJnaC1tZW51LWFjdGlvblwiXG4gICAgICAgICAgbWF0LW1lbnUtaXRlbVxuICAgICAgICAgIChjbGljayk9XCJSb3V0ZVRvUGF0aCgnL2Rhc2hib2FyZC9jcmVhdGUtcHJvamVjdCcpXCJcbiAgICAgICAgPlxuICAgICAgICAgIENyZWF0ZSBQcm9qZWN0XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgPC9tYXQtbWVudT5cbiAgICA8L21hdC1jYXJkLWFjdGlvbnM+XG4gIDwvbmctY29udGFpbmVyPlxuXG4gIDwhLS0gU0tFTEVUT04gLS0+XG4gIDxuZy1jb250YWluZXIgKm5nSWY9XCJTdGF0ZT8uTG9hZGluZ1wiPlxuICAgIDxkaXYgaWQ9XCJnaC1jYXJkLXNrZWxldG9uXCIgZnhMYXlvdXQ9XCJyb3dcIiBmeExheW91dEFsaWduPVwiY2VudGVyIGNlbnRlclwiPlxuICAgICAgPHNrZWxldG9uLWF2YXRhclxuICAgICAgICBjbGFzcz1cImdoLWljb25cIlxuICAgICAgICBbc2hvd0ljb25dPVwiZmFsc2VcIlxuICAgICAgICBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCJcbiAgICAgID48L3NrZWxldG9uLWF2YXRhcj5cblxuICAgICAgPGRpdiBmeEZsZXg9XCI3MCVcIiBjbGFzcz1cImdoLWNhcmQtbWFpbi1jb250ZW50XCI+XG4gICAgICAgIDxza2VsZXRvbi1ibG9ja1xuICAgICAgICAgIGhlaWdodD1cIjYwcHhcIlxuICAgICAgICAgIFtlZmZlY3RdPVwiU2tlbGV0b25FZmZlY3RcIlxuICAgICAgICA+PC9za2VsZXRvbi1ibG9jaz5cbiAgICAgIDwvZGl2PlxuXG4gICAgICA8ZGl2XG4gICAgICAgIHNrZWxldG9uLXRleHRcbiAgICAgICAgZnhGbGV4PVwiMTUlXCJcbiAgICAgICAgW2VmZmVjdF09XCJTa2VsZXRvbkVmZmVjdFwiXG4gICAgICAgIHN0eWxlPVwibWFyZ2luOiAwcHggMTBweFwiXG4gICAgICA+XG4gICAgICAgIFN1Ym1pdFxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGZ4TGF5b3V0PVwicm93XCIgZnhMYXlvdXRBbGlnbj1cInNwYWNlLWFyb3VuZCBjZW50ZXJcIj5cbiAgICAgIDxkaXYgc2tlbGV0b24tdGV4dCBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCI+UHVsbCBSZXF1ZXN0PC9kaXY+XG4gICAgICA8ZGl2IHNrZWxldG9uLXRleHQgW2VmZmVjdF09XCJTa2VsZXRvbkVmZmVjdFwiPk9wZW4gSXNzdWU8L2Rpdj5cbiAgICAgIDxkaXYgc2tlbGV0b24tdGV4dCBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCI+RmVhdHVyZSBCcmFuY2g8L2Rpdj5cbiAgICAgIDxkaXYgc2tlbGV0b24tdGV4dCBbZWZmZWN0XT1cIlNrZWxldG9uRWZmZWN0XCI+XG4gICAgICAgIDxtYXQtaWNvbj5tb3JlX2hvcml6PC9tYXQtaWNvbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLWNvbnRhaW5lcj5cbjwvbWF0LWNhcmQ+XG4iXX0=
|