@yelon/bis 18.3.0 → 19.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -21
- package/fesm2022/bis.mjs +63 -57
- package/fesm2022/bis.mjs.map +1 -1
- package/fesm2022/layout.mjs +70 -74
- package/fesm2022/layout.mjs.map +1 -1
- package/fesm2022/yunzai-widgets.mjs +92 -102
- package/fesm2022/yunzai-widgets.mjs.map +1 -1
- package/layout/layout-basic.component.d.ts +1 -2
- package/layout/style/layout-website-01.less +1 -0
- package/package.json +12 -20
- package/src/helper.d.ts +1 -2
- package/src/refresh-token.d.ts +1 -2
- package/src/website/layout-website-01.component.d.ts +4 -5
- package/src/website/layout-website-02.component.d.ts +6 -7
- package/src/yunzai-analysis-addon.guard.d.ts +1 -2
- package/esm2022/bis.mjs +0 -5
- package/esm2022/config/bis.config.mjs +0 -15
- package/esm2022/config/config.mjs +0 -5
- package/esm2022/config/public_api.mjs +0 -2
- package/esm2022/layout/layout-basic.component.mjs +0 -518
- package/esm2022/layout/layout-nav-application.component.mjs +0 -372
- package/esm2022/layout/layout-nav-group.component.mjs +0 -166
- package/esm2022/layout/layout-nav-tile.component.mjs +0 -15
- package/esm2022/layout/layout.mjs +0 -5
- package/esm2022/layout/layout.module.mjs +0 -54
- package/esm2022/layout/public_api.mjs +0 -6
- package/esm2022/public_api.mjs +0 -11
- package/esm2022/src/bis.module.mjs +0 -17
- package/esm2022/src/helper.mjs +0 -45
- package/esm2022/src/provide.mjs +0 -8
- package/esm2022/src/refresh-token.mjs +0 -79
- package/esm2022/src/startup.service.mjs +0 -205
- package/esm2022/src/website/layout-website-01.component.mjs +0 -173
- package/esm2022/src/website/layout-website-02.component.mjs +0 -204
- package/esm2022/src/yunzai-act.guard.mjs +0 -88
- package/esm2022/src/yunzai-analysis-addon.guard.mjs +0 -99
- package/esm2022/src/yunzai-default.interceptor.mjs +0 -63
- package/esm2022/yunzai-widgets/public_api.mjs +0 -7
- package/esm2022/yunzai-widgets/yunzai-clear-storage.component.mjs +0 -47
- package/esm2022/yunzai-widgets/yunzai-fullscreen.component.mjs +0 -47
- package/esm2022/yunzai-widgets/yunzai-i18n.component.mjs +0 -139
- package/esm2022/yunzai-widgets/yunzai-notify.component.mjs +0 -180
- package/esm2022/yunzai-widgets/yunzai-user.component.mjs +0 -120
- package/esm2022/yunzai-widgets/yunzai-widget.module.mjs +0 -62
- package/esm2022/yunzai-widgets/yunzai-widgets.mjs +0 -5
|
@@ -1,518 +0,0 @@
|
|
|
1
|
-
import { CommonModule } from '@angular/common';
|
|
2
|
-
import { HttpClient } from '@angular/common/http';
|
|
3
|
-
import { Component, inject } from '@angular/core';
|
|
4
|
-
import { RouterModule } from '@angular/router';
|
|
5
|
-
import { ReuseTabModule } from '@yelon/abc/reuse-tab';
|
|
6
|
-
import { YunzaiWidgetsModule } from '@yelon/bis/yunzai-widgets';
|
|
7
|
-
import { StompService } from '@yelon/socket';
|
|
8
|
-
import { I18nPipe } from '@yelon/theme';
|
|
9
|
-
import { LayoutDefaultModule, LayoutDisplayService } from '@yelon/theme/layout-default';
|
|
10
|
-
import { ThemeBtnModule } from '@yelon/theme/theme-btn';
|
|
11
|
-
import { hasFavicon, log, NavType, setFavicon, useLocalStorageCurrent, useLocalStorageDefaultRoute, useLocalStorageHeaderType, useLocalStorageProjectInfo, WINDOW, YUNZAI_CONFIG } from '@yelon/util';
|
|
12
|
-
import { NzAvatarModule } from 'ng-zorro-antd/avatar';
|
|
13
|
-
import { NzDescriptionsModule } from 'ng-zorro-antd/descriptions';
|
|
14
|
-
import { NzDropDownModule } from 'ng-zorro-antd/dropdown';
|
|
15
|
-
import { NzIconModule } from 'ng-zorro-antd/icon';
|
|
16
|
-
import { NzModalModule } from 'ng-zorro-antd/modal';
|
|
17
|
-
import { NzSkeletonModule } from 'ng-zorro-antd/skeleton';
|
|
18
|
-
import { YunzaiNavApplicationComponent } from './layout-nav-application.component';
|
|
19
|
-
import { YunzaiLayoutNavGroupComponent } from './layout-nav-group.component';
|
|
20
|
-
import { YunzaiLayoutNavTileComponent } from './layout-nav-tile.component';
|
|
21
|
-
import * as i0 from "@angular/core";
|
|
22
|
-
import * as i1 from "@yelon/theme/layout-default";
|
|
23
|
-
import * as i2 from "@angular/router";
|
|
24
|
-
import * as i3 from "@yelon/abc/reuse-tab";
|
|
25
|
-
import * as i4 from "@angular/common";
|
|
26
|
-
import * as i5 from "ng-zorro-antd/menu";
|
|
27
|
-
import * as i6 from "ng-zorro-antd/dropdown";
|
|
28
|
-
import * as i7 from "ng-zorro-antd/avatar";
|
|
29
|
-
import * as i8 from "ng-zorro-antd/icon";
|
|
30
|
-
import * as i9 from "ng-zorro-antd/modal";
|
|
31
|
-
import * as i10 from "ng-zorro-antd/skeleton";
|
|
32
|
-
import * as i11 from "ng-zorro-antd/descriptions";
|
|
33
|
-
import * as i12 from "@yelon/theme/theme-btn";
|
|
34
|
-
import * as i13 from "@yelon/bis/yunzai-widgets";
|
|
35
|
-
export class YunzaiLayoutBasicComponent {
|
|
36
|
-
constructor() {
|
|
37
|
-
this.stomp = inject(StompService);
|
|
38
|
-
this.win = inject(WINDOW);
|
|
39
|
-
this.layoutDisplayService = inject(LayoutDisplayService);
|
|
40
|
-
this.conf = inject(YUNZAI_CONFIG);
|
|
41
|
-
this.NavType = NavType;
|
|
42
|
-
this.state = {
|
|
43
|
-
options: {
|
|
44
|
-
logoExpanded: `./assets/logo-full.svg`,
|
|
45
|
-
logoCollapsed: `./assets/logo.svg`
|
|
46
|
-
},
|
|
47
|
-
aside: {
|
|
48
|
-
name: '',
|
|
49
|
-
intro: '',
|
|
50
|
-
icon: ''
|
|
51
|
-
},
|
|
52
|
-
display: {
|
|
53
|
-
nav: true,
|
|
54
|
-
aside: true,
|
|
55
|
-
reusetab: true
|
|
56
|
-
},
|
|
57
|
-
navType: NavType.APPLICATION
|
|
58
|
-
};
|
|
59
|
-
this.headerStyleList = [];
|
|
60
|
-
this.applicationModal = {
|
|
61
|
-
isVisible: false,
|
|
62
|
-
loading: false
|
|
63
|
-
};
|
|
64
|
-
this.httpClient = inject(HttpClient);
|
|
65
|
-
}
|
|
66
|
-
get options() {
|
|
67
|
-
return this.state.options;
|
|
68
|
-
}
|
|
69
|
-
get navType() {
|
|
70
|
-
return this.state.navType;
|
|
71
|
-
}
|
|
72
|
-
get aside() {
|
|
73
|
-
return this.state.aside;
|
|
74
|
-
}
|
|
75
|
-
get displayReusetab() {
|
|
76
|
-
return this.state.display.reusetab;
|
|
77
|
-
}
|
|
78
|
-
get reusetabCSS() {
|
|
79
|
-
let cascadingStyleSheet = {};
|
|
80
|
-
if (!this.state.display.nav) {
|
|
81
|
-
cascadingStyleSheet = {
|
|
82
|
-
...cascadingStyleSheet,
|
|
83
|
-
top: '0px'
|
|
84
|
-
};
|
|
85
|
-
}
|
|
86
|
-
if (!this.state.display.aside) {
|
|
87
|
-
cascadingStyleSheet = {
|
|
88
|
-
...cascadingStyleSheet,
|
|
89
|
-
left: '0px'
|
|
90
|
-
};
|
|
91
|
-
}
|
|
92
|
-
return cascadingStyleSheet;
|
|
93
|
-
}
|
|
94
|
-
ngOnInit() {
|
|
95
|
-
this.config = this.conf.bis;
|
|
96
|
-
this.initLogo();
|
|
97
|
-
this.initFavicon();
|
|
98
|
-
this.initNavType();
|
|
99
|
-
this.initAside();
|
|
100
|
-
this.addLayoutDisplayListener();
|
|
101
|
-
this.stomp.listen();
|
|
102
|
-
this.toIndex();
|
|
103
|
-
}
|
|
104
|
-
initFavicon() {
|
|
105
|
-
const [, getProjectInfo] = useLocalStorageProjectInfo();
|
|
106
|
-
const projectInfo = getProjectInfo();
|
|
107
|
-
if (projectInfo.faviconUrl) {
|
|
108
|
-
hasFavicon(projectInfo.faviconUrl).then((has) => {
|
|
109
|
-
if (has) {
|
|
110
|
-
setFavicon(projectInfo.faviconUrl);
|
|
111
|
-
}
|
|
112
|
-
else {
|
|
113
|
-
setFavicon('./assets/favicon.ico');
|
|
114
|
-
}
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
}
|
|
118
|
-
initAside() {
|
|
119
|
-
const [, getCurrent] = useLocalStorageCurrent();
|
|
120
|
-
const aside = getCurrent();
|
|
121
|
-
this.state.aside = { ...aside };
|
|
122
|
-
}
|
|
123
|
-
initLogo() {
|
|
124
|
-
const [, getProjectInfo] = useLocalStorageProjectInfo();
|
|
125
|
-
const projectInfo = getProjectInfo();
|
|
126
|
-
this.state.options.logoExpanded = projectInfo.maxLogoUrl ? projectInfo.maxLogoUrl : `./assets/logo-full.svg`;
|
|
127
|
-
this.state.options.logoCollapsed = projectInfo.miniLogoUrl ? projectInfo.miniLogoUrl : `./assets/logo.svg`;
|
|
128
|
-
}
|
|
129
|
-
initNavType() {
|
|
130
|
-
const [, getHeaderType] = useLocalStorageHeaderType();
|
|
131
|
-
const [, getProjectInfo] = useLocalStorageProjectInfo();
|
|
132
|
-
const navType = getHeaderType();
|
|
133
|
-
const projectInfo = getProjectInfo();
|
|
134
|
-
if (navType !== null) {
|
|
135
|
-
this.state.navType = navType;
|
|
136
|
-
}
|
|
137
|
-
else {
|
|
138
|
-
this.state.navType = NavType.APPLICATION;
|
|
139
|
-
}
|
|
140
|
-
if (projectInfo.headerStyle && projectInfo.headerStyle.length > 0) {
|
|
141
|
-
this.headerStyleList = projectInfo.headerStyle;
|
|
142
|
-
const hasThis = this.headerStyleList.some(item => item.value === this.state.navType);
|
|
143
|
-
if (!hasThis) {
|
|
144
|
-
this.state.navType = projectInfo.headerStyle[0].value;
|
|
145
|
-
const [setHeaderType] = useLocalStorageHeaderType();
|
|
146
|
-
setHeaderType(this.state.navType);
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
toIndex() {
|
|
151
|
-
const [, getDefaultRoute] = useLocalStorageDefaultRoute();
|
|
152
|
-
const defaultRoute = getDefaultRoute();
|
|
153
|
-
log('YunzaiLayoutBasicComponent: ', `todo: the default route was ${defaultRoute}, 但是还没想好如何实现.`);
|
|
154
|
-
}
|
|
155
|
-
onNavTypeChange(type) {
|
|
156
|
-
const [setHeaderType] = useLocalStorageHeaderType();
|
|
157
|
-
setHeaderType(type);
|
|
158
|
-
this.win.location.reload();
|
|
159
|
-
}
|
|
160
|
-
addLayoutDisplayListener() {
|
|
161
|
-
this.layoutDisplayService.listen('reuseTab', (display) => {
|
|
162
|
-
this.state.display.reusetab = display;
|
|
163
|
-
});
|
|
164
|
-
this.layoutDisplayService.listen('nav', (display) => {
|
|
165
|
-
this.state.display.nav = display;
|
|
166
|
-
});
|
|
167
|
-
this.layoutDisplayService.listen('aside', (display) => {
|
|
168
|
-
this.state.display.aside = display;
|
|
169
|
-
});
|
|
170
|
-
}
|
|
171
|
-
// 关于本应用
|
|
172
|
-
aboutApplication() {
|
|
173
|
-
const urlArr = window.location.pathname.split(`${this.config.baseUrl}/`);
|
|
174
|
-
if (urlArr.length > 1) {
|
|
175
|
-
// 应用标识,截取路径中 /backstage/后第一个字符串
|
|
176
|
-
// 例: http://222.30.194.61/backstage/auth/page/oafportal/#/base/menu 中 auth
|
|
177
|
-
const name = urlArr[1].split('/')[0];
|
|
178
|
-
this.applicationModal.isVisible = true;
|
|
179
|
-
this.applicationModal.loading = true;
|
|
180
|
-
// eslint-disable-next-line deprecation/deprecation
|
|
181
|
-
this.httpClient.get(`/basic/api/app/aboutApp?name=${name}`).subscribe(
|
|
182
|
-
// @ts-ignore
|
|
183
|
-
(response) => {
|
|
184
|
-
this.applicationModal.loading = false;
|
|
185
|
-
if (response.data) {
|
|
186
|
-
this.applicationInfo = response.data;
|
|
187
|
-
}
|
|
188
|
-
}, () => {
|
|
189
|
-
this.applicationModal.loading = false;
|
|
190
|
-
});
|
|
191
|
-
}
|
|
192
|
-
}
|
|
193
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: YunzaiLayoutBasicComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
194
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "18.2.11", type: YunzaiLayoutBasicComponent, isStandalone: true, selector: "yunzai-layout-basic", ngImport: i0, template: `
|
|
195
|
-
<layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
|
|
196
|
-
<layout-default-header-item direction="left">
|
|
197
|
-
<ng-container [ngSwitch]="navType">
|
|
198
|
-
<ng-container *ngSwitchCase="NavType.APPLICATION">
|
|
199
|
-
<yunzai-layout-nav-application />
|
|
200
|
-
</ng-container>
|
|
201
|
-
<ng-container *ngSwitchCase="NavType.GROUP">
|
|
202
|
-
<yunzai-layout-nav-group />
|
|
203
|
-
</ng-container>
|
|
204
|
-
<ng-container *ngSwitchCase="NavType.TILE">
|
|
205
|
-
<yunzai-layout-nav-tile />
|
|
206
|
-
</ng-container>
|
|
207
|
-
<ng-container *ngSwitchCase="NavType.BLANK" />
|
|
208
|
-
<ng-container *ngSwitchCase="NavType.TABS" />
|
|
209
|
-
<ng-container *ngSwitchDefault>
|
|
210
|
-
<yunzai-layout-nav-application />
|
|
211
|
-
</ng-container>
|
|
212
|
-
</ng-container>
|
|
213
|
-
</layout-default-header-item>
|
|
214
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
215
|
-
<yunzai-header-notify />
|
|
216
|
-
</layout-default-header-item>
|
|
217
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
218
|
-
<theme-btn />
|
|
219
|
-
</layout-default-header-item>
|
|
220
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
221
|
-
<div
|
|
222
|
-
data-event-id="_nav_settings"
|
|
223
|
-
layout-default-header-item-trigger
|
|
224
|
-
nz-dropdown
|
|
225
|
-
[nzDropdownMenu]="settingsMenu"
|
|
226
|
-
nzTrigger="click"
|
|
227
|
-
nzPlacement="bottomRight"
|
|
228
|
-
>
|
|
229
|
-
<i nz-icon nzType="setting"></i>
|
|
230
|
-
</div>
|
|
231
|
-
<nz-dropdown-menu #settingsMenu="nzDropdownMenu">
|
|
232
|
-
<div nz-menu style="width: 200px;">
|
|
233
|
-
<div data-event-id="_nav_mode" nz-menu-item>
|
|
234
|
-
{{ 'mode.nav' | i18n }}
|
|
235
|
-
</div>
|
|
236
|
-
|
|
237
|
-
@if (headerStyleList.length > 1) {
|
|
238
|
-
@for (i of headerStyleList; track $index) {
|
|
239
|
-
<div
|
|
240
|
-
data-event-id="_nav_mode"
|
|
241
|
-
nz-menu-item
|
|
242
|
-
[attr.data-type]="i.value"
|
|
243
|
-
(click)="onNavTypeChange(i.value)"
|
|
244
|
-
>
|
|
245
|
-
<ng-container [ngSwitch]="i.value">
|
|
246
|
-
<ng-container *ngSwitchCase="NavType.APPLICATION">
|
|
247
|
-
<i nz-icon nzType="appstore" class="mr-sm"></i>
|
|
248
|
-
</ng-container>
|
|
249
|
-
<ng-container *ngSwitchCase="NavType.GROUP">
|
|
250
|
-
<i nz-icon nzType="group" class="mr-sm"></i>
|
|
251
|
-
</ng-container>
|
|
252
|
-
<ng-container *ngSwitchCase="NavType.TILE">
|
|
253
|
-
<i nz-icon nzType="dash" class="mr-sm"></i>
|
|
254
|
-
</ng-container>
|
|
255
|
-
<ng-container *ngSwitchCase="NavType.BLANK">
|
|
256
|
-
<i nz-icon nzType="border" class="mr-sm"></i>
|
|
257
|
-
</ng-container>
|
|
258
|
-
<ng-container *ngSwitchCase="NavType.TABS">
|
|
259
|
-
<i nz-icon nzType="insert-row-above" class="mr-sm"></i>
|
|
260
|
-
</ng-container>
|
|
261
|
-
<ng-container *ngSwitchDefault>
|
|
262
|
-
<i nz-icon nzType="appstore" class="mr-sm"></i>
|
|
263
|
-
</ng-container>
|
|
264
|
-
{{ 'mode.nav.' + i.value | i18n }}
|
|
265
|
-
</ng-container>
|
|
266
|
-
</div>
|
|
267
|
-
}
|
|
268
|
-
}
|
|
269
|
-
|
|
270
|
-
<div data-event-id="_nav_fullscreen" nz-menu-item>
|
|
271
|
-
<yunzai-header-fullscreen />
|
|
272
|
-
</div>
|
|
273
|
-
<div data-event-id="_nav_clearstorage" nz-menu-item>
|
|
274
|
-
<yunzai-header-clear-storage />
|
|
275
|
-
</div>
|
|
276
|
-
<div data-event-id="_nav_i18n" nz-menu-item>
|
|
277
|
-
<yunzai-header-i18n />
|
|
278
|
-
</div>
|
|
279
|
-
</div>
|
|
280
|
-
</nz-dropdown-menu>
|
|
281
|
-
</layout-default-header-item>
|
|
282
|
-
<layout-default-header-item direction="right">
|
|
283
|
-
<yunzai-header-user />
|
|
284
|
-
</layout-default-header-item>
|
|
285
|
-
</layout-default>
|
|
286
|
-
<ng-template #asideUserTpl>
|
|
287
|
-
<div data-event-id="_route_user" class="yunzai-default__aside-user">
|
|
288
|
-
<nz-avatar
|
|
289
|
-
class="yunzai-default__aside-user-avatar"
|
|
290
|
-
[nzSize]="40"
|
|
291
|
-
[nzSrc]="aside.icon"
|
|
292
|
-
(click)="aboutApplication()"
|
|
293
|
-
/>
|
|
294
|
-
<div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
|
|
295
|
-
<strong>{{ aside.name | i18n }}</strong>
|
|
296
|
-
<p>{{ aside.intro | i18n }}</p>
|
|
297
|
-
</div>
|
|
298
|
-
</div>
|
|
299
|
-
<nz-dropdown-menu #userMenu="nzDropdownMenu">
|
|
300
|
-
<ul nz-menu>
|
|
301
|
-
<li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
|
|
302
|
-
</ul>
|
|
303
|
-
</nz-dropdown-menu>
|
|
304
|
-
</ng-template>
|
|
305
|
-
<ng-template #contentTpl>
|
|
306
|
-
<reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
|
|
307
|
-
<router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
|
|
308
|
-
</ng-template>
|
|
309
|
-
<ng-template #noneTpl>
|
|
310
|
-
<router-outlet />
|
|
311
|
-
</ng-template>
|
|
312
|
-
|
|
313
|
-
<nz-modal
|
|
314
|
-
nzTitle="关于本应用"
|
|
315
|
-
[(nzVisible)]="applicationModal.isVisible"
|
|
316
|
-
[nzOkText]="null"
|
|
317
|
-
[nzCancelText]="'关闭'"
|
|
318
|
-
[nzWidth]="700"
|
|
319
|
-
(nzOnCancel)="applicationModal.isVisible = false"
|
|
320
|
-
>
|
|
321
|
-
<ng-container *nzModalContent>
|
|
322
|
-
<nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
|
|
323
|
-
<nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
|
|
324
|
-
<nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
|
|
325
|
-
<nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
|
|
326
|
-
<nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
|
|
327
|
-
<nz-descriptions-item nzTitle="应用首次部署时间">{{
|
|
328
|
-
applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
329
|
-
}}</nz-descriptions-item>
|
|
330
|
-
<nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
|
|
331
|
-
<nz-descriptions-item nzTitle="当前版本部署时间">{{
|
|
332
|
-
applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
333
|
-
}}</nz-descriptions-item>
|
|
334
|
-
<nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
|
|
335
|
-
<nz-descriptions-item nzTitle="最新版本发布时间">{{
|
|
336
|
-
applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
337
|
-
}}</nz-descriptions-item>
|
|
338
|
-
</nz-descriptions>
|
|
339
|
-
</nz-skeleton>
|
|
340
|
-
</ng-container>
|
|
341
|
-
</nz-modal>
|
|
342
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: LayoutDefaultModule }, { kind: "component", type: i1.LayoutDefaultComponent, selector: "layout-default", inputs: ["options", "asideUser", "asideBottom", "nav", "content", "customError", "fetchingStrictly", "fetching"], exportAs: ["layoutDefault"] }, { kind: "component", type: i1.LayoutDefaultHeaderItemComponent, selector: "layout-default-header-item", inputs: ["hidden", "direction"] }, { kind: "directive", type: i1.LayoutDefaultHeaderItemTriggerDirective, selector: "[layout-default-header-item-trigger]" }, { kind: "ngmodule", type: RouterModule }, { kind: "directive", type: i2.RouterOutlet, selector: "router-outlet", inputs: ["name"], outputs: ["activate", "deactivate", "attach", "detach"], exportAs: ["outlet"] }, { kind: "directive", type: i2.RouterLink, selector: "[routerLink]", inputs: ["target", "queryParams", "fragment", "queryParamsHandling", "state", "info", "relativeTo", "preserveFragment", "skipLocationChange", "replaceUrl", "routerLink"] }, { kind: "ngmodule", type: ReuseTabModule }, { kind: "component", type: i3.ReuseTabComponent, selector: "reuse-tab, [reuse-tab]", inputs: ["mode", "i18n", "debug", "max", "tabMaxWidth", "excludes", "allowClose", "keepingScroll", "storageState", "keepingScrollContainer", "customContextMenu", "tabBarExtraContent", "tabBarGutter", "tabBarStyle", "tabType", "routeParamMatchMode", "disabled", "titleRender", "canClose"], outputs: ["change", "close"], exportAs: ["reuseTab"] }, { kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i4.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i4.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i4.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "pipe", type: i4.DatePipe, name: "date" }, { kind: "pipe", type: I18nPipe, name: "i18n" }, { kind: "ngmodule", type: NzDropDownModule }, { kind: "directive", type: i5.NzMenuDirective, selector: "[nz-menu]", inputs: ["nzInlineIndent", "nzTheme", "nzMode", "nzInlineCollapsed", "nzSelectable"], outputs: ["nzClick"], exportAs: ["nzMenu"] }, { kind: "component", type: i5.NzMenuItemComponent, selector: "[nz-menu-item]", inputs: ["nzPaddingLeft", "nzDisabled", "nzSelected", "nzDanger", "nzMatchRouterExact", "nzMatchRouter"], exportAs: ["nzMenuItem"] }, { kind: "directive", type: i6.NzDropDownDirective, selector: "[nz-dropdown]", inputs: ["nzDropdownMenu", "nzTrigger", "nzMatchWidthElement", "nzBackdrop", "nzClickHide", "nzDisabled", "nzVisible", "nzOverlayClassName", "nzOverlayStyle", "nzPlacement"], outputs: ["nzVisibleChange"], exportAs: ["nzDropdown"] }, { kind: "component", type: i6.NzDropdownMenuComponent, selector: "nz-dropdown-menu", exportAs: ["nzDropdownMenu"] }, { kind: "ngmodule", type: NzAvatarModule }, { kind: "component", type: i7.NzAvatarComponent, selector: "nz-avatar", inputs: ["nzShape", "nzSize", "nzGap", "nzText", "nzSrc", "nzSrcSet", "nzAlt", "nzIcon"], outputs: ["nzError"], exportAs: ["nzAvatar"] }, { kind: "ngmodule", type: NzIconModule }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "ngmodule", type: NzModalModule }, { kind: "component", type: i9.NzModalComponent, selector: "nz-modal", inputs: ["nzMask", "nzMaskClosable", "nzCloseOnNavigation", "nzVisible", "nzClosable", "nzOkLoading", "nzOkDisabled", "nzCancelDisabled", "nzCancelLoading", "nzKeyboard", "nzNoAnimation", "nzCentered", "nzDraggable", "nzContent", "nzFooter", "nzZIndex", "nzWidth", "nzWrapClassName", "nzClassName", "nzStyle", "nzTitle", "nzCloseIcon", "nzMaskStyle", "nzBodyStyle", "nzOkText", "nzCancelText", "nzOkType", "nzOkDanger", "nzIconType", "nzModalType", "nzAutofocus", "nzOnOk", "nzOnCancel"], outputs: ["nzOnOk", "nzOnCancel", "nzAfterOpen", "nzAfterClose", "nzVisibleChange"], exportAs: ["nzModal"] }, { kind: "directive", type: i9.NzModalContentDirective, selector: "[nzModalContent]", exportAs: ["nzModalContent"] }, { kind: "ngmodule", type: NzSkeletonModule }, { kind: "component", type: i10.NzSkeletonComponent, selector: "nz-skeleton", inputs: ["nzActive", "nzLoading", "nzRound", "nzTitle", "nzAvatar", "nzParagraph"], exportAs: ["nzSkeleton"] }, { kind: "ngmodule", type: NzDescriptionsModule }, { kind: "component", type: i11.NzDescriptionsComponent, selector: "nz-descriptions", inputs: ["nzBordered", "nzLayout", "nzColumn", "nzSize", "nzTitle", "nzExtra", "nzColon"], exportAs: ["nzDescriptions"] }, { kind: "component", type: i11.NzDescriptionsItemComponent, selector: "nz-descriptions-item", inputs: ["nzSpan", "nzTitle"], exportAs: ["nzDescriptionsItem"] }, { kind: "ngmodule", type: ThemeBtnModule }, { kind: "component", type: i12.ThemeBtnComponent, selector: "theme-btn", inputs: ["types", "devTips", "deployUrl"], outputs: ["themeChange"] }, { kind: "ngmodule", type: YunzaiWidgetsModule }, { kind: "component", type: i13.YunzaiHeaderClearStorageComponent, selector: "yunzai-header-clear-storage" }, { kind: "component", type: i13.YunzaiHeaderFullScreenComponent, selector: "yunzai-header-fullscreen" }, { kind: "component", type: i13.YunzaiHeaderNotifyComponent, selector: "yunzai-header-notify" }, { kind: "component", type: i13.YunzaiHeaderI18nComponent, selector: "yunzai-header-i18n", inputs: ["showLangText"] }, { kind: "component", type: i13.YunzaiHeaderUserComponent, selector: "yunzai-header-user" }, { kind: "component", type: YunzaiNavApplicationComponent, selector: "yunzai-layout-nav-application" }, { kind: "component", type: YunzaiLayoutNavGroupComponent, selector: "yunzai-layout-nav-group" }, { kind: "component", type: YunzaiLayoutNavTileComponent, selector: "yunzai-layout-nav-tile" }] }); }
|
|
343
|
-
}
|
|
344
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.11", ngImport: i0, type: YunzaiLayoutBasicComponent, decorators: [{
|
|
345
|
-
type: Component,
|
|
346
|
-
args: [{
|
|
347
|
-
selector: `yunzai-layout-basic`,
|
|
348
|
-
template: `
|
|
349
|
-
<layout-default [options]="options" [asideUser]="asideUserTpl" [content]="displayReusetab ? contentTpl : noneTpl">
|
|
350
|
-
<layout-default-header-item direction="left">
|
|
351
|
-
<ng-container [ngSwitch]="navType">
|
|
352
|
-
<ng-container *ngSwitchCase="NavType.APPLICATION">
|
|
353
|
-
<yunzai-layout-nav-application />
|
|
354
|
-
</ng-container>
|
|
355
|
-
<ng-container *ngSwitchCase="NavType.GROUP">
|
|
356
|
-
<yunzai-layout-nav-group />
|
|
357
|
-
</ng-container>
|
|
358
|
-
<ng-container *ngSwitchCase="NavType.TILE">
|
|
359
|
-
<yunzai-layout-nav-tile />
|
|
360
|
-
</ng-container>
|
|
361
|
-
<ng-container *ngSwitchCase="NavType.BLANK" />
|
|
362
|
-
<ng-container *ngSwitchCase="NavType.TABS" />
|
|
363
|
-
<ng-container *ngSwitchDefault>
|
|
364
|
-
<yunzai-layout-nav-application />
|
|
365
|
-
</ng-container>
|
|
366
|
-
</ng-container>
|
|
367
|
-
</layout-default-header-item>
|
|
368
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
369
|
-
<yunzai-header-notify />
|
|
370
|
-
</layout-default-header-item>
|
|
371
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
372
|
-
<theme-btn />
|
|
373
|
-
</layout-default-header-item>
|
|
374
|
-
<layout-default-header-item direction="right" hidden="mobile">
|
|
375
|
-
<div
|
|
376
|
-
data-event-id="_nav_settings"
|
|
377
|
-
layout-default-header-item-trigger
|
|
378
|
-
nz-dropdown
|
|
379
|
-
[nzDropdownMenu]="settingsMenu"
|
|
380
|
-
nzTrigger="click"
|
|
381
|
-
nzPlacement="bottomRight"
|
|
382
|
-
>
|
|
383
|
-
<i nz-icon nzType="setting"></i>
|
|
384
|
-
</div>
|
|
385
|
-
<nz-dropdown-menu #settingsMenu="nzDropdownMenu">
|
|
386
|
-
<div nz-menu style="width: 200px;">
|
|
387
|
-
<div data-event-id="_nav_mode" nz-menu-item>
|
|
388
|
-
{{ 'mode.nav' | i18n }}
|
|
389
|
-
</div>
|
|
390
|
-
|
|
391
|
-
@if (headerStyleList.length > 1) {
|
|
392
|
-
@for (i of headerStyleList; track $index) {
|
|
393
|
-
<div
|
|
394
|
-
data-event-id="_nav_mode"
|
|
395
|
-
nz-menu-item
|
|
396
|
-
[attr.data-type]="i.value"
|
|
397
|
-
(click)="onNavTypeChange(i.value)"
|
|
398
|
-
>
|
|
399
|
-
<ng-container [ngSwitch]="i.value">
|
|
400
|
-
<ng-container *ngSwitchCase="NavType.APPLICATION">
|
|
401
|
-
<i nz-icon nzType="appstore" class="mr-sm"></i>
|
|
402
|
-
</ng-container>
|
|
403
|
-
<ng-container *ngSwitchCase="NavType.GROUP">
|
|
404
|
-
<i nz-icon nzType="group" class="mr-sm"></i>
|
|
405
|
-
</ng-container>
|
|
406
|
-
<ng-container *ngSwitchCase="NavType.TILE">
|
|
407
|
-
<i nz-icon nzType="dash" class="mr-sm"></i>
|
|
408
|
-
</ng-container>
|
|
409
|
-
<ng-container *ngSwitchCase="NavType.BLANK">
|
|
410
|
-
<i nz-icon nzType="border" class="mr-sm"></i>
|
|
411
|
-
</ng-container>
|
|
412
|
-
<ng-container *ngSwitchCase="NavType.TABS">
|
|
413
|
-
<i nz-icon nzType="insert-row-above" class="mr-sm"></i>
|
|
414
|
-
</ng-container>
|
|
415
|
-
<ng-container *ngSwitchDefault>
|
|
416
|
-
<i nz-icon nzType="appstore" class="mr-sm"></i>
|
|
417
|
-
</ng-container>
|
|
418
|
-
{{ 'mode.nav.' + i.value | i18n }}
|
|
419
|
-
</ng-container>
|
|
420
|
-
</div>
|
|
421
|
-
}
|
|
422
|
-
}
|
|
423
|
-
|
|
424
|
-
<div data-event-id="_nav_fullscreen" nz-menu-item>
|
|
425
|
-
<yunzai-header-fullscreen />
|
|
426
|
-
</div>
|
|
427
|
-
<div data-event-id="_nav_clearstorage" nz-menu-item>
|
|
428
|
-
<yunzai-header-clear-storage />
|
|
429
|
-
</div>
|
|
430
|
-
<div data-event-id="_nav_i18n" nz-menu-item>
|
|
431
|
-
<yunzai-header-i18n />
|
|
432
|
-
</div>
|
|
433
|
-
</div>
|
|
434
|
-
</nz-dropdown-menu>
|
|
435
|
-
</layout-default-header-item>
|
|
436
|
-
<layout-default-header-item direction="right">
|
|
437
|
-
<yunzai-header-user />
|
|
438
|
-
</layout-default-header-item>
|
|
439
|
-
</layout-default>
|
|
440
|
-
<ng-template #asideUserTpl>
|
|
441
|
-
<div data-event-id="_route_user" class="yunzai-default__aside-user">
|
|
442
|
-
<nz-avatar
|
|
443
|
-
class="yunzai-default__aside-user-avatar"
|
|
444
|
-
[nzSize]="40"
|
|
445
|
-
[nzSrc]="aside.icon"
|
|
446
|
-
(click)="aboutApplication()"
|
|
447
|
-
/>
|
|
448
|
-
<div class="yunzai-default__aside-user-info" nz-dropdown nzTrigger="click" [nzDropdownMenu]="userMenu">
|
|
449
|
-
<strong>{{ aside.name | i18n }}</strong>
|
|
450
|
-
<p>{{ aside.intro | i18n }}</p>
|
|
451
|
-
</div>
|
|
452
|
-
</div>
|
|
453
|
-
<nz-dropdown-menu #userMenu="nzDropdownMenu">
|
|
454
|
-
<ul nz-menu>
|
|
455
|
-
<li data-event-id="_route_backhome" nz-menu-item routerLink="/">{{ 'back.home' | i18n }}</li>
|
|
456
|
-
</ul>
|
|
457
|
-
</nz-dropdown-menu>
|
|
458
|
-
</ng-template>
|
|
459
|
-
<ng-template #contentTpl>
|
|
460
|
-
<reuse-tab #reuseTab [ngStyle]="reusetabCSS" />
|
|
461
|
-
<router-outlet (activate)="reuseTab.activate($event)" (attach)="reuseTab.activate($event)" />
|
|
462
|
-
</ng-template>
|
|
463
|
-
<ng-template #noneTpl>
|
|
464
|
-
<router-outlet />
|
|
465
|
-
</ng-template>
|
|
466
|
-
|
|
467
|
-
<nz-modal
|
|
468
|
-
nzTitle="关于本应用"
|
|
469
|
-
[(nzVisible)]="applicationModal.isVisible"
|
|
470
|
-
[nzOkText]="null"
|
|
471
|
-
[nzCancelText]="'关闭'"
|
|
472
|
-
[nzWidth]="700"
|
|
473
|
-
(nzOnCancel)="applicationModal.isVisible = false"
|
|
474
|
-
>
|
|
475
|
-
<ng-container *nzModalContent>
|
|
476
|
-
<nz-skeleton [nzLoading]="applicationModal.loading" [nzActive]="true">
|
|
477
|
-
<nz-descriptions nzBordered [nzSize]="'middle'" [nzColumn]="{ xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1 }">
|
|
478
|
-
<nz-descriptions-item nzTitle="应用名称">{{ applicationInfo?.showName }}</nz-descriptions-item>
|
|
479
|
-
<nz-descriptions-item nzTitle="应用标识">{{ applicationInfo?.name }}</nz-descriptions-item>
|
|
480
|
-
<nz-descriptions-item nzTitle="版本总数">{{ applicationInfo?.versionNum }}</nz-descriptions-item>
|
|
481
|
-
<nz-descriptions-item nzTitle="应用首次部署时间">{{
|
|
482
|
-
applicationInfo?.firstDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
483
|
-
}}</nz-descriptions-item>
|
|
484
|
-
<nz-descriptions-item nzTitle="当前版本">{{ applicationInfo?.currentVersion }}</nz-descriptions-item>
|
|
485
|
-
<nz-descriptions-item nzTitle="当前版本部署时间">{{
|
|
486
|
-
applicationInfo?.currentDeploymentDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
487
|
-
}}</nz-descriptions-item>
|
|
488
|
-
<nz-descriptions-item nzTitle="最新版本">{{ applicationInfo?.lastVersion }}</nz-descriptions-item>
|
|
489
|
-
<nz-descriptions-item nzTitle="最新版本发布时间">{{
|
|
490
|
-
applicationInfo?.lastPushDate | date: 'yyyy-MM-dd HH:mm:ss'
|
|
491
|
-
}}</nz-descriptions-item>
|
|
492
|
-
</nz-descriptions>
|
|
493
|
-
</nz-skeleton>
|
|
494
|
-
</ng-container>
|
|
495
|
-
</nz-modal>
|
|
496
|
-
`,
|
|
497
|
-
standalone: true,
|
|
498
|
-
imports: [
|
|
499
|
-
LayoutDefaultModule,
|
|
500
|
-
RouterModule,
|
|
501
|
-
ReuseTabModule,
|
|
502
|
-
CommonModule,
|
|
503
|
-
I18nPipe,
|
|
504
|
-
NzDropDownModule,
|
|
505
|
-
NzAvatarModule,
|
|
506
|
-
NzIconModule,
|
|
507
|
-
NzModalModule,
|
|
508
|
-
NzSkeletonModule,
|
|
509
|
-
NzDescriptionsModule,
|
|
510
|
-
ThemeBtnModule,
|
|
511
|
-
YunzaiWidgetsModule,
|
|
512
|
-
YunzaiNavApplicationComponent,
|
|
513
|
-
YunzaiLayoutNavGroupComponent,
|
|
514
|
-
YunzaiLayoutNavTileComponent
|
|
515
|
-
]
|
|
516
|
-
}]
|
|
517
|
-
}] });
|
|
518
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LWJhc2ljLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL2Jpcy9sYXlvdXQvbGF5b3V0LWJhc2ljLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDL0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxFQUFVLE1BQU0sZUFBZSxDQUFDO0FBQzFELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDdEQsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUM3QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3hDLE9BQU8sRUFBRSxtQkFBbUIsRUFBd0Isb0JBQW9CLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUM5RyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEQsT0FBTyxFQUNMLFVBQVUsRUFHVixHQUFHLEVBQ0gsT0FBTyxFQUNQLFVBQVUsRUFDVixzQkFBc0IsRUFDdEIsMkJBQTJCLEVBQzNCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFDMUIsTUFBTSxFQUNOLGFBQWEsRUFLZCxNQUFNLGFBQWEsQ0FBQztBQUNyQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFdEQsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDbEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDMUQsT0FBTyxF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YUFDWixRQUFRLDRDQUNSLGdCQUFnQix5MkJBQ2hCLGNBQWMsZ1BBQ2QsWUFBWSxpTkFDWixhQUFhLGd6QkFDYixnQkFBZ0IsMk5BQ2hCLG9CQUFvQiwrWUFDcEIsY0FBYyw4S0FDZCxtQkFBbUIsc2lCQUNuQiw2QkFBNkIsMEVBQzdCLDZCQUE2QixvRUFDN0IsNEJBQTRCOzs0RkFHbkIsMEJBQTBCO2tCQTNLdEMsU0FBUzttQkFBQztvQkFDVCxRQUFRLEVBQUUscUJBQXFCO29CQUMvQixRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FvSlQ7b0JBQ0QsVUFBVSxFQUFFLElBQUk7b0JBQ2hCLE9BQU8sRUFBRTt3QkFDUCxtQkFBbUI7d0JBQ25CLFlBQVk7d0JBQ1osY0FBYzt3QkFDZCxZQUFZO3dCQUNaLFFBQVE7d0JBQ1IsZ0JBQWdCO3dCQUNoQixjQUFjO3dCQUNkLFlBQVk7d0JBQ1osYUFBYTt3QkFDYixnQkFBZ0I7d0JBQ2hCLG9CQUFvQjt3QkFDcEIsY0FBYzt3QkFDZCxtQkFBbUI7d0JBQ25CLDZCQUE2Qjt3QkFDN0IsNkJBQTZCO3dCQUM3Qiw0QkFBNEI7cUJBQzdCO2lCQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBDb21wb25lbnQsIGluamVjdCwgT25Jbml0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBSb3V0ZXJNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuXG5pbXBvcnQgeyBSZXVzZVRhYk1vZHVsZSB9IGZyb20gJ0B5ZWxvbi9hYmMvcmV1c2UtdGFiJztcbmltcG9ydCB7IFl1bnphaVdpZGdldHNNb2R1bGUgfSBmcm9tICdAeWVsb24vYmlzL3l1bnphaS13aWRnZXRzJztcbmltcG9ydCB7IFN0b21wU2VydmljZSB9IGZyb20gJ0B5ZWxvbi9zb2NrZXQnO1xuaW1wb3J0IHsgSTE4blBpcGUgfSBmcm9tICdAeWVsb24vdGhlbWUnO1xuaW1wb3J0IHsgTGF5b3V0RGVmYXVsdE1vZHVsZSwgTGF5b3V0RGVmYXVsdE9wdGlvbnMsIExheW91dERpc3BsYXlTZXJ2aWNlIH0gZnJvbSAnQHllbG9uL3RoZW1lL2xheW91dC1kZWZhdWx0JztcbmltcG9ydCB7IFRoZW1lQnRuTW9kdWxlIH0gZnJvbSAnQHllbG9uL3RoZW1lL3RoZW1lLWJ0bic7XG5pbXBvcnQge1xuICBoYXNGYXZpY29uLFxuICBMYXlvdXRCYXNpY0FzaWRlLFxuICBMYXlvdXRCYXNpY0Rpc3BsYXksXG4gIGxvZyxcbiAgTmF2VHlwZSxcbiAgc2V0RmF2aWNvbixcbiAgdXNlTG9jYWxTdG9yYWdlQ3VycmVudCxcbiAgdXNlTG9jYWxTdG9yYWdlRGVmYXVsdFJvdXRlLFxuICB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlLFxuICB1c2VMb2NhbFN0b3JhZ2VQcm9qZWN0SW5mbyxcbiAgV0lORE9XLFxuICBZVU5aQUlfQ09ORklHLFxuICBZdW56YWlCdXNpbmVzc0NvbmZpZyxcbiAgWXVuemFpQ29uZmlnLFxuICBZdW56YWlIZWFkZXJTdHlsZSxcbiAgWXVuemFpUHJvamVjdEluZm9cbn0gZnJvbSAnQHllbG9uL3V0aWwnO1xuaW1wb3J0IHsgTnpBdmF0YXJNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2F2YXRhcic7XG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgTnpEZXNjcmlwdGlvbnNNb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2Rlc2NyaXB0aW9ucyc7XG5pbXBvcnQgeyBOekRyb3BEb3duTW9kdWxlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9kcm9wZG93bic7XG5pbXBvcnQgeyBOekljb25Nb2R1bGUgfSBmcm9tICduZy16b3Jyby1hbnRkL2ljb24nO1xuaW1wb3J0IHsgTnpNb2RhbE1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvbW9kYWwnO1xuaW1wb3J0IHsgTnpTa2VsZXRvbk1vZHVsZSB9IGZyb20gJ25nLXpvcnJvLWFudGQvc2tlbGV0b24nO1xuXG5pbXBvcnQgeyBZdW56YWlOYXZBcHBsaWNhdGlvbkNvbXBvbmVudCB9IGZyb20gJy4vbGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQnO1xuaW1wb3J0IHsgWXVuemFpTGF5b3V0TmF2R3JvdXBDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1uYXYtZ3JvdXAuY29tcG9uZW50JztcbmltcG9ydCB7IFl1bnphaUxheW91dE5hdlRpbGVDb21wb25lbnQgfSBmcm9tICcuL2xheW91dC1uYXYtdGlsZS5jb21wb25lbnQnO1xuXG5leHBvcnQgaW50ZXJmYWNlIExheW91dEJhc2ljU3RhdGUge1xuICBvcHRpb25zOiBMYXlvdXREZWZhdWx0T3B0aW9ucztcbiAgYXNpZGU6IExheW91dEJhc2ljQXNpZGU7XG4gIGRpc3BsYXk6IExheW91dEJhc2ljRGlzcGxheTtcbiAgbmF2VHlwZTogTmF2VHlwZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBBcHBsaWNhdGlvbkluZm9JbnRlcmZhY2Uge1xuICBpZD86IHN0cmluZztcbiAgbmFtZT86IHN0cmluZztcbiAgc2hvd05hbWU/OiBzdHJpbmc7XG4gIGxhc3RWZXJzaW9uPzogc3RyaW5nO1xuICB2ZXJzaW9uTnVtPzogc3RyaW5nO1xuICBjdXJyZW50VmVyc2lvbj86IHN0cmluZztcbiAgZmlyc3REZXBsb3ltZW50RGF0ZT86IHN0cmluZztcbiAgY3VycmVudERlcGxveW1lbnREYXRlPzogc3RyaW5nO1xuICBsYXN0UHVzaERhdGU/OiBzdHJpbmc7XG59XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogYHl1bnphaS1sYXlvdXQtYmFzaWNgLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxsYXlvdXQtZGVmYXVsdCBbb3B0aW9uc109XCJvcHRpb25zXCIgW2FzaWRlVXNlcl09XCJhc2lkZVVzZXJUcGxcIiBbY29udGVudF09XCJkaXNwbGF5UmV1c2V0YWIgPyBjb250ZW50VHBsIDogbm9uZVRwbFwiPlxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cImxlZnRcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciBbbmdTd2l0Y2hdPVwibmF2VHlwZVwiPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuQVBQTElDQVRJT05cIj5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1hcHBsaWNhdGlvbiAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuR1JPVVBcIj5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1ncm91cCAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuVElMRVwiPlxuICAgICAgICAgICAgPHl1bnphaS1sYXlvdXQtbmF2LXRpbGUgLz5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLkJMQU5LXCIgLz5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRBQlNcIiAvPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoRGVmYXVsdD5cbiAgICAgICAgICAgIDx5dW56YWktbGF5b3V0LW5hdi1hcHBsaWNhdGlvbiAvPlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPHl1bnphaS1oZWFkZXItbm90aWZ5IC8+XG4gICAgICA8L2xheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtPlxuICAgICAgPGxheW91dC1kZWZhdWx0LWhlYWRlci1pdGVtIGRpcmVjdGlvbj1cInJpZ2h0XCIgaGlkZGVuPVwibW9iaWxlXCI+XG4gICAgICAgIDx0aGVtZS1idG4gLz5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIiBoaWRkZW49XCJtb2JpbGVcIj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X3NldHRpbmdzXCJcbiAgICAgICAgICBsYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbS10cmlnZ2VyXG4gICAgICAgICAgbnotZHJvcGRvd25cbiAgICAgICAgICBbbnpEcm9wZG93bk1lbnVdPVwic2V0dGluZ3NNZW51XCJcbiAgICAgICAgICBuelRyaWdnZXI9XCJjbGlja1wiXG4gICAgICAgICAgbnpQbGFjZW1lbnQ9XCJib3R0b21SaWdodFwiXG4gICAgICAgID5cbiAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cInNldHRpbmdcIj48L2k+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotZHJvcGRvd24tbWVudSAjc2V0dGluZ3NNZW51PVwibnpEcm9wZG93bk1lbnVcIj5cbiAgICAgICAgICA8ZGl2IG56LW1lbnUgc3R5bGU9XCJ3aWR0aDogMjAwcHg7XCI+XG4gICAgICAgICAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X21vZGVcIiBuei1tZW51LWl0ZW0+XG4gICAgICAgICAgICAgIHt7ICdtb2RlLm5hdicgfCBpMThuIH19XG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgQGlmIChoZWFkZXJTdHlsZUxpc3QubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICBAZm9yIChpIG9mIGhlYWRlclN0eWxlTGlzdDsgdHJhY2sgJGluZGV4KSB7XG4gICAgICAgICAgICAgICAgPGRpdlxuICAgICAgICAgICAgICAgICAgZGF0YS1ldmVudC1pZD1cIl9uYXZfbW9kZVwiXG4gICAgICAgICAgICAgICAgICBuei1tZW51LWl0ZW1cbiAgICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtdHlwZV09XCJpLnZhbHVlXCJcbiAgICAgICAgICAgICAgICAgIChjbGljayk9XCJvbk5hdlR5cGVDaGFuZ2UoaS52YWx1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgW25nU3dpdGNoXT1cImkudmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5BUFBMSUNBVElPTlwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYXBwc3RvcmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5HUk9VUFwiPlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiZ3JvdXBcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiTmF2VHlwZS5USUxFXCI+XG4gICAgICAgICAgICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJkYXNoXCIgY2xhc3M9XCJtci1zbVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIk5hdlR5cGUuQkxBTktcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImJvcmRlclwiIGNsYXNzPVwibXItc21cIj48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCJOYXZUeXBlLlRBQlNcIj5cbiAgICAgICAgICAgICAgICAgICAgICA8aSBuei1pY29uIG56VHlwZT1cImluc2VydC1yb3ctYWJvdmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgICAgICAgICAgIDxpIG56LWljb24gbnpUeXBlPVwiYXBwc3RvcmVcIiBjbGFzcz1cIm1yLXNtXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAge3sgJ21vZGUubmF2LicgKyBpLnZhbHVlIHwgaTE4biB9fVxuICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX25hdl9mdWxsc2NyZWVuXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1mdWxsc2NyZWVuIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfY2xlYXJzdG9yYWdlXCIgbnotbWVudS1pdGVtPlxuICAgICAgICAgICAgICA8eXVuemFpLWhlYWRlci1jbGVhci1zdG9yYWdlIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgZGF0YS1ldmVudC1pZD1cIl9uYXZfaTE4blwiIG56LW1lbnUtaXRlbT5cbiAgICAgICAgICAgICAgPHl1bnphaS1oZWFkZXItaTE4biAvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbnotZHJvcGRvd24tbWVudT5cbiAgICAgIDwvbGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0+XG4gICAgICA8bGF5b3V0LWRlZmF1bHQtaGVhZGVyLWl0ZW0gZGlyZWN0aW9uPVwicmlnaHRcIj5cbiAgICAgICAgPHl1bnphaS1oZWFkZXItdXNlciAvPlxuICAgICAgPC9sYXlvdXQtZGVmYXVsdC1oZWFkZXItaXRlbT5cbiAgICA8L2xheW91dC1kZWZhdWx0PlxuICAgIDxuZy10ZW1wbGF0ZSAjYXNpZGVVc2VyVHBsPlxuICAgICAgPGRpdiBkYXRhLWV2ZW50LWlkPVwiX3JvdXRlX3VzZXJcIiBjbGFzcz1cInl1bnphaS1kZWZhdWx0X19hc2lkZS11c2VyXCI+XG4gICAgICAgIDxuei1hdmF0YXJcbiAgICAgICAgICBjbGFzcz1cInl1bnphaS1kZWZhdWx0X19hc2lkZS11c2VyLWF2YXRhclwiXG4gICAgICAgICAgW256U2l6ZV09XCI0MFwiXG4gICAgICAgICAgW256U3JjXT1cImFzaWRlLmljb25cIlxuICAgICAgICAgIChjbGljayk9XCJhYm91dEFwcGxpY2F0aW9uKClcIlxuICAgICAgICAvPlxuICAgICAgICA8ZGl2IGNsYXNzPVwieXVuemFpLWRlZmF1bHRfX2FzaWRlLXVzZXItaW5mb1wiIG56LWRyb3Bkb3duIG56VHJpZ2dlcj1cImNsaWNrXCIgW256RHJvcGRvd25NZW51XT1cInVzZXJNZW51XCI+XG4gICAgICAgICAgPHN0cm9uZz57eyBhc2lkZS5uYW1lIHwgaTE4biB9fTwvc3Ryb25nPlxuICAgICAgICAgIDxwPnt7IGFzaWRlLmludHJvIHwgaTE4biB9fTwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuei1kcm9wZG93bi1tZW51ICN1c2VyTWVudT1cIm56RHJvcGRvd25NZW51XCI+XG4gICAgICAgIDx1bCBuei1tZW51PlxuICAgICAgICAgIDxsaSBkYXRhLWV2ZW50LWlkPVwiX3JvdXRlX2JhY2tob21lXCIgbnotbWVudS1pdGVtIHJvdXRlckxpbms9XCIvXCI+e3sgJ2JhY2suaG9tZScgfCBpMThuIH19PC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvbnotZHJvcGRvd24tbWVudT5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjY29udGVudFRwbD5cbiAgICAgIDxyZXVzZS10YWIgI3JldXNlVGFiIFtuZ1N0eWxlXT1cInJldXNldGFiQ1NTXCIgLz5cbiAgICAgIDxyb3V0ZXItb3V0bGV0IChhY3RpdmF0ZSk9XCJyZXVzZVRhYi5hY3RpdmF0ZSgkZXZlbnQpXCIgKGF0dGFjaCk9XCJyZXVzZVRhYi5hY3RpdmF0ZSgkZXZlbnQpXCIgLz5cbiAgICA8L25nLXRlbXBsYXRlPlxuICAgIDxuZy10ZW1wbGF0ZSAjbm9uZVRwbD5cbiAgICAgIDxyb3V0ZXItb3V0bGV0IC8+XG4gICAgPC9uZy10ZW1wbGF0ZT5cblxuICAgIDxuei1tb2RhbFxuICAgICAgbnpUaXRsZT1cIuWFs+S6juacrOW6lOeUqFwiXG4gICAgICBbKG56VmlzaWJsZSldPVwiYXBwbGljYXRpb25Nb2RhbC5pc1Zpc2libGVcIlxuICAgICAgW256T2tUZXh0XT1cIm51bGxcIlxuICAgICAgW256Q2FuY2VsVGV4dF09XCIn5YWz6ZetJ1wiXG4gICAgICBbbnpXaWR0aF09XCI3MDBcIlxuICAgICAgKG56T25DYW5jZWwpPVwiYXBwbGljYXRpb25Nb2RhbC5pc1Zpc2libGUgPSBmYWxzZVwiXG4gICAgPlxuICAgICAgPG5nLWNvbnRhaW5lciAqbnpNb2RhbENvbnRlbnQ+XG4gICAgICAgIDxuei1za2VsZXRvbiBbbnpMb2FkaW5nXT1cImFwcGxpY2F0aW9uTW9kYWwubG9hZGluZ1wiIFtuekFjdGl2ZV09XCJ0cnVlXCI+XG4gICAgICAgICAgPG56LWRlc2NyaXB0aW9ucyBuekJvcmRlcmVkIFtuelNpemVdPVwiJ21pZGRsZSdcIiBbbnpDb2x1bW5dPVwieyB4eGw6IDIsIHhsOiAyLCBsZzogMiwgbWQ6IDIsIHNtOiAyLCB4czogMSB9XCI+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuW6lOeUqOWQjeensFwiPnt7IGFwcGxpY2F0aW9uSW5mbz8uc2hvd05hbWUgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlupTnlKjmoIfor4ZcIj57eyBhcHBsaWNhdGlvbkluZm8/Lm5hbWUgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLniYjmnKzmgLvmlbBcIj57eyBhcHBsaWNhdGlvbkluZm8/LnZlcnNpb25OdW0gfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLlupTnlKjpppbmrKHpg6jnvbLml7bpl7RcIj57e1xuICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8/LmZpcnN0RGVwbG95bWVudERhdGUgfCBkYXRlOiAneXl5eS1NTS1kZCBISDptbTpzcydcbiAgICAgICAgICAgIH19PC9uei1kZXNjcmlwdGlvbnMtaXRlbT5cbiAgICAgICAgICAgIDxuei1kZXNjcmlwdGlvbnMtaXRlbSBuelRpdGxlPVwi5b2T5YmN54mI5pysXCI+e3sgYXBwbGljYXRpb25JbmZvPy5jdXJyZW50VmVyc2lvbiB9fTwvbnotZGVzY3JpcHRpb25zLWl0ZW0+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuW9k+WJjeeJiOacrOmDqOe9suaXtumXtFwiPnt7XG4gICAgICAgICAgICAgIGFwcGxpY2F0aW9uSW5mbz8uY3VycmVudERlcGxveW1lbnREYXRlIHwgZGF0ZTogJ3l5eXktTU0tZGQgSEg6bW06c3MnXG4gICAgICAgICAgICB9fTwvbnotZGVzY3JpcHRpb25zLWl0ZW0+XG4gICAgICAgICAgICA8bnotZGVzY3JpcHRpb25zLWl0ZW0gbnpUaXRsZT1cIuacgOaWsOeJiOacrFwiPnt7IGFwcGxpY2F0aW9uSW5mbz8ubGFzdFZlcnNpb24gfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgICAgPG56LWRlc2NyaXB0aW9ucy1pdGVtIG56VGl0bGU9XCLmnIDmlrDniYjmnKzlj5HluIPml7bpl7RcIj57e1xuICAgICAgICAgICAgICBhcHBsaWNhdGlvbkluZm8/Lmxhc3RQdXNoRGF0ZSB8IGRhdGU6ICd5eXl5LU1NLWRkIEhIOm1tOnNzJ1xuICAgICAgICAgICAgfX08L256LWRlc2NyaXB0aW9ucy1pdGVtPlxuICAgICAgICAgIDwvbnotZGVzY3JpcHRpb25zPlxuICAgICAgICA8L256LXNrZWxldG9uPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9uei1tb2RhbD5cbiAgYCxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW1xuICAgIExheW91dERlZmF1bHRNb2R1bGUsXG4gICAgUm91dGVyTW9kdWxlLFxuICAgIFJldXNlVGFiTW9kdWxlLFxuICAgIENvbW1vbk1vZHVsZSxcbiAgICBJMThuUGlwZSxcbiAgICBOekRyb3BEb3duTW9kdWxlLFxuICAgIE56QXZhdGFyTW9kdWxlLFxuICAgIE56SWNvbk1vZHVsZSxcbiAgICBOek1vZGFsTW9kdWxlLFxuICAgIE56U2tlbGV0b25Nb2R1bGUsXG4gICAgTnpEZXNjcmlwdGlvbnNNb2R1bGUsXG4gICAgVGhlbWVCdG5Nb2R1bGUsXG4gICAgWXVuemFpV2lkZ2V0c01vZHVsZSxcbiAgICBZdW56YWlOYXZBcHBsaWNhdGlvbkNvbXBvbmVudCxcbiAgICBZdW56YWlMYXlvdXROYXZHcm91cENvbXBvbmVudCxcbiAgICBZdW56YWlMYXlvdXROYXZUaWxlQ29tcG9uZW50XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgWXVuemFpTGF5b3V0QmFzaWNDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQge1xuICBwcml2YXRlIHJlYWRvbmx5IHN0b21wID0gaW5qZWN0KFN0b21wU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgd2luID0gaW5qZWN0KFdJTkRPVyk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGF5b3V0RGlzcGxheVNlcnZpY2UgPSBpbmplY3QoTGF5b3V0RGlzcGxheVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGNvbmY6IFl1bnphaUNvbmZpZyA9IGluamVjdChZVU5aQUlfQ09ORklHKTtcblxuICBwdWJsaWMgTmF2VHlwZSA9IE5hdlR5cGU7XG4gIHByaXZhdGUgc3RhdGU6IExheW91dEJhc2ljU3RhdGUgPSB7XG4gICAgb3B0aW9uczoge1xuICAgICAgbG9nb0V4cGFuZGVkOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2AsXG4gICAgICBsb2dvQ29sbGFwc2VkOiBgLi9hc3NldHMvbG9nby5zdmdgXG4gICAgfSxcbiAgICBhc2lkZToge1xuICAgICAgbmFtZTogJycsXG4gICAgICBpbnRybzogJycsXG4gICAgICBpY29uOiAnJ1xuICAgIH0sXG4gICAgZGlzcGxheToge1xuICAgICAgbmF2OiB0cnVlLFxuICAgICAgYXNpZGU6IHRydWUsXG4gICAgICByZXVzZXRhYjogdHJ1ZVxuICAgIH0sXG4gICAgbmF2VHlwZTogTmF2VHlwZS5BUFBMSUNBVElPTlxuICB9O1xuXG4gIGhlYWRlclN0eWxlTGlzdDogWXVuemFpSGVhZGVyU3R5bGVbXSA9IFtdO1xuXG4gIGFwcGxpY2F0aW9uSW5mbyE6IEFwcGxpY2F0aW9uSW5mb0ludGVyZmFjZTtcblxuICBhcHBsaWNhdGlvbk1vZGFsID0ge1xuICAgIGlzVmlzaWJsZTogZmFsc2UsXG4gICAgbG9hZGluZzogZmFsc2VcbiAgfTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGh0dHBDbGllbnQgPSBpbmplY3QoSHR0cENsaWVudCk7XG4gIHByaXZhdGUgY29uZmlnITogWXVuemFpQnVzaW5lc3NDb25maWc7XG5cbiAgZ2V0IG9wdGlvbnMoKTogTGF5b3V0RGVmYXVsdE9wdGlvbnMge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLm9wdGlvbnM7XG4gIH1cblxuICBnZXQgbmF2VHlwZSgpOiBOYXZUeXBlIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5uYXZUeXBlO1xuICB9XG5cbiAgZ2V0IGFzaWRlKCk6IExheW91dEJhc2ljQXNpZGUge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLmFzaWRlO1xuICB9XG5cbiAgZ2V0IGRpc3BsYXlSZXVzZXRhYigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5zdGF0ZS5kaXNwbGF5LnJldXNldGFiO1xuICB9XG5cbiAgZ2V0IHJldXNldGFiQ1NTKCk6IE56U2FmZUFueSB7XG4gICAgbGV0IGNhc2NhZGluZ1N0eWxlU2hlZXQgPSB7fTtcbiAgICBpZiAoIXRoaXMuc3RhdGUuZGlzcGxheS5uYXYpIHtcbiAgICAgIGNhc2NhZGluZ1N0eWxlU2hlZXQgPSB7XG4gICAgICAgIC4uLmNhc2NhZGluZ1N0eWxlU2hlZXQsXG4gICAgICAgIHRvcDogJzBweCdcbiAgICAgIH07XG4gICAgfVxuICAgIGlmICghdGhpcy5zdGF0ZS5kaXNwbGF5LmFzaWRlKSB7XG4gICAgICBjYXNjYWRpbmdTdHlsZVNoZWV0ID0ge1xuICAgICAgICAuLi5jYXNjYWRpbmdTdHlsZVNoZWV0LFxuICAgICAgICBsZWZ0OiAnMHB4J1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIGNhc2NhZGluZ1N0eWxlU2hlZXQ7XG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbmZpZyA9IHRoaXMuY29uZi5iaXMhO1xuICAgIHRoaXMuaW5pdExvZ28oKTtcbiAgICB0aGlzLmluaXRGYXZpY29uKCk7XG4gICAgdGhpcy5pbml0TmF2VHlwZSgpO1xuICAgIHRoaXMuaW5pdEFzaWRlKCk7XG4gICAgdGhpcy5hZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTtcbiAgICB0aGlzLnN0b21wLmxpc3RlbigpO1xuICAgIHRoaXMudG9JbmRleCgpO1xuICB9XG5cbiAgaW5pdEZhdmljb24oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICBpZiAocHJvamVjdEluZm8uZmF2aWNvblVybCkge1xuICAgICAgaGFzRmF2aWNvbihwcm9qZWN0SW5mby5mYXZpY29uVXJsKS50aGVuKChoYXM6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgaWYgKGhhcykge1xuICAgICAgICAgIHNldEZhdmljb24ocHJvamVjdEluZm8uZmF2aWNvblVybCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0RmF2aWNvbignLi9hc3NldHMvZmF2aWNvbi5pY28nKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEFzaWRlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEN1cnJlbnRdID0gdXNlTG9jYWxTdG9yYWdlQ3VycmVudCgpO1xuICAgIGNvbnN0IGFzaWRlOiBMYXlvdXRCYXNpY0FzaWRlID0gZ2V0Q3VycmVudCgpITtcbiAgICB0aGlzLnN0YXRlLmFzaWRlID0geyAuLi5hc2lkZSB9O1xuICB9XG5cbiAgaW5pdExvZ28oKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0UHJvamVjdEluZm9dID0gdXNlTG9jYWxTdG9yYWdlUHJvamVjdEluZm8oKTtcbiAgICBjb25zdCBwcm9qZWN0SW5mbzogWXVuemFpUHJvamVjdEluZm8gPSBnZXRQcm9qZWN0SW5mbygpITtcbiAgICB0aGlzLnN0YXRlLm9wdGlvbnMubG9nb0V4cGFuZGVkID0gcHJvamVjdEluZm8ubWF4TG9nb1VybCA/IHByb2plY3RJbmZvLm1heExvZ29VcmwgOiBgLi9hc3NldHMvbG9nby1mdWxsLnN2Z2A7XG4gICAgdGhpcy5zdGF0ZS5vcHRpb25zLmxvZ29Db2xsYXBzZWQgPSBwcm9qZWN0SW5mby5taW5pTG9nb1VybCA/IHByb2plY3RJbmZvLm1pbmlMb2dvVXJsIDogYC4vYXNzZXRzL2xvZ28uc3ZnYDtcbiAgfVxuXG4gIGluaXROYXZUeXBlKCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIGNvbnN0IFssIGdldFByb2plY3RJbmZvXSA9IHVzZUxvY2FsU3RvcmFnZVByb2plY3RJbmZvKCk7XG4gICAgY29uc3QgbmF2VHlwZTogTmF2VHlwZSB8IG51bGwgPSBnZXRIZWFkZXJUeXBlKCk7XG4gICAgY29uc3QgcHJvamVjdEluZm86IFl1bnphaVByb2plY3RJbmZvID0gZ2V0UHJvamVjdEluZm8oKSE7XG4gICAgaWYgKG5hdlR5cGUgIT09IG51bGwpIHtcbiAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IG5hdlR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IE5hdlR5cGUuQVBQTElDQVRJT047XG4gICAgfVxuICAgIGlmIChwcm9qZWN0SW5mby5oZWFkZXJTdHlsZSAmJiBwcm9qZWN0SW5mby5oZWFkZXJTdHlsZS5sZW5ndGggPiAwKSB7XG4gICAgICB0aGlzLmhlYWRlclN0eWxlTGlzdCA9IHByb2plY3RJbmZvLmhlYWRlclN0eWxlO1xuICAgICAgY29uc3QgaGFzVGhpcyA9IHRoaXMuaGVhZGVyU3R5bGVMaXN0LnNvbWUoaXRlbSA9PiBpdGVtLnZhbHVlID09PSB0aGlzLnN0YXRlLm5hdlR5cGUpO1xuICAgICAgaWYgKCFoYXNUaGlzKSB7XG4gICAgICAgIHRoaXMuc3RhdGUubmF2VHlwZSA9IDxOYXZUeXBlPnByb2plY3RJbmZvLmhlYWRlclN0eWxlWzBdLnZhbHVlO1xuICAgICAgICBjb25zdCBbc2V0SGVhZGVyVHlwZV0gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXJUeXBlKCk7XG4gICAgICAgIHNldEhlYWRlclR5cGUodGhpcy5zdGF0ZS5uYXZUeXBlKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0b0luZGV4KCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldERlZmF1bHRSb3V0ZV0gPSB1c2VMb2NhbFN0b3JhZ2VEZWZhdWx0Um91dGUoKTtcbiAgICBjb25zdCBkZWZhdWx0Um91dGUgPSBnZXREZWZhdWx0Um91dGUoKSE7XG4gICAgbG9nKCdZdW56YWlMYXlvdXRCYXNpY0NvbXBvbmVudDogJywgYHRvZG86IHRoZSBkZWZhdWx0IHJvdXRlIHdhcyAke2RlZmF1bHRSb3V0ZX0sIOS9huaYr+i/mOayoeaDs+WlveWmguS9leWunueOsC5gKTtcbiAgfVxuXG4gIG9uTmF2VHlwZUNoYW5nZSh0eXBlOiBOYXZUeXBlIHwgc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgW3NldEhlYWRlclR5cGVdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyVHlwZSgpO1xuICAgIHNldEhlYWRlclR5cGUoPE5hdlR5cGU+dHlwZSk7XG4gICAgdGhpcy53aW4ubG9jYXRpb24ucmVsb2FkKCk7XG4gIH1cblxuICBhZGRMYXlvdXREaXNwbGF5TGlzdGVuZXIoKTogdm9pZCB7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ3JldXNlVGFiJywgKGRpc3BsYXk6IGJvb2xlYW4pID0+IHtcbiAgICAgIHRoaXMuc3RhdGUuZGlzcGxheS5yZXVzZXRhYiA9IGRpc3BsYXk7XG4gICAgfSk7XG4gICAgdGhpcy5sYXlvdXREaXNwbGF5U2VydmljZS5saXN0ZW4oJ25hdicsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkubmF2ID0gZGlzcGxheTtcbiAgICB9KTtcblxuICAgIHRoaXMubGF5b3V0RGlzcGxheVNlcnZpY2UubGlzdGVuKCdhc2lkZScsIChkaXNwbGF5OiBib29sZWFuKSA9PiB7XG4gICAgICB0aGlzLnN0YXRlLmRpc3BsYXkuYXNpZGUgPSBkaXNwbGF5O1xuICAgIH0pO1xuICB9XG5cbiAgLy8g5YWz5LqO5pys5bqU55SoXG4gIGFib3V0QXBwbGljYXRpb24oKTogdm9pZCB7XG4gICAgY29uc3QgdXJsQXJyID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lLnNwbGl0KGAke3RoaXMuY29uZmlnLmJhc2VVcmx9L2ApO1xuICAgIGlmICh1cmxBcnIubGVuZ3RoID4gMSkge1xuICAgICAgLy8g5bqU55So5qCH6K+G77yM5oiq5Y+W6Lev5b6E5LitIC9iYWNrc3RhZ2Uv5ZCO56ys5LiA5Liq5a2X56ym5LiyXG4gICAgICAvLyDkvos6IGh0dHA6Ly8yMjIuMzAuMTk0LjYxL2JhY2tzdGFnZS9hdXRoL3BhZ2Uvb2FmcG9ydGFsLyMvYmFzZS9tZW51ICDkuK0gYXV0aFxuICAgICAgY29uc3QgbmFtZSA9IHVybEFyclsxXS5zcGxpdCgnLycpWzBdO1xuICAgICAgdGhpcy5hcHBsaWNhdGlvbk1vZGFsLmlzVmlzaWJsZSA9IHRydWU7XG4gICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwubG9hZGluZyA9IHRydWU7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgZGVwcmVjYXRpb24vZGVwcmVjYXRpb25cbiAgICAgIHRoaXMuaHR0cENsaWVudC5nZXQoYC9iYXNpYy9hcGkvYXBwL2Fib3V0QXBwP25hbWU9JHtuYW1lfWApLnN1YnNjcmliZShcbiAgICAgICAgLy8gQHRzLWlnbm9yZVxuICAgICAgICAocmVzcG9uc2U6IE56U2FmZUFueSkgPT4ge1xuICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25Nb2RhbC5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEpIHtcbiAgICAgICAgICAgIHRoaXMuYXBwbGljYXRpb25JbmZvID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgICgpID0+IHtcbiAgICAgICAgICB0aGlzLmFwcGxpY2F0aW9uTW9kYWwubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuIl19
|