@yelon/bis 16.2.5 → 16.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/LICENSE +21 -21
  2. package/README.md +23 -23
  3. package/esm2022/bis.mjs +4 -4
  4. package/esm2022/index.mjs +1 -1
  5. package/esm2022/layout/bis.config.mjs +14 -14
  6. package/esm2022/layout/html-names.mjs +32 -32
  7. package/esm2022/layout/icon/style-icons.mjs +795 -795
  8. package/esm2022/layout/layout-basic/index.mjs +2 -2
  9. package/esm2022/layout/layout-basic/interface.mjs +1 -1
  10. package/esm2022/layout/layout-basic/layout-basic.component.mjs +372 -372
  11. package/esm2022/layout/layout-nav/index.mjs +3 -3
  12. package/esm2022/layout/layout-nav/layout-nav-application.component.mjs +364 -364
  13. package/esm2022/layout/layout-nav/layout-nav-group.component.mjs +122 -122
  14. package/esm2022/layout/layout-nav/layout-nav-tile.component.mjs +14 -14
  15. package/esm2022/layout/layout.mjs +4 -4
  16. package/esm2022/layout/public_api.mjs +12 -12
  17. package/esm2022/layout/widgets/index.mjs +6 -6
  18. package/esm2022/layout/widgets/yunzai-clear-storage.component.mjs +44 -44
  19. package/esm2022/layout/widgets/yunzai-fullscreen.component.mjs +44 -44
  20. package/esm2022/layout/widgets/yunzai-i18n.component.mjs +145 -145
  21. package/esm2022/layout/widgets/yunzai-notify.component.mjs +182 -182
  22. package/esm2022/layout/widgets/yunzai-theme-btn.component.mjs +199 -199
  23. package/esm2022/layout/widgets/yunzai-user.component.mjs +129 -129
  24. package/esm2022/layout/yunzai-act.guard.mjs +106 -106
  25. package/esm2022/layout/yunzai-auth.service.mjs +107 -107
  26. package/esm2022/layout/yunzai-default.interceptor.mjs +200 -201
  27. package/esm2022/layout/yunzai-i18n.service.mjs +101 -101
  28. package/esm2022/layout/yunzai-lang.mjs +113 -113
  29. package/esm2022/layout/yunzai-layout.module.mjs +76 -76
  30. package/esm2022/layout/yunzai-startup.service.mjs +151 -151
  31. package/esm2022/public_api.mjs +1 -1
  32. package/fesm2022/bis.mjs +6 -6
  33. package/fesm2022/layout.mjs +3197 -3198
  34. package/fesm2022/layout.mjs.map +1 -1
  35. package/index.d.ts +1 -1
  36. package/index.less +1 -1
  37. package/layout/bis.config.d.ts +3 -3
  38. package/layout/html-names.d.ts +31 -31
  39. package/layout/icon/style-icons.d.ts +1 -1
  40. package/layout/index.d.ts +5 -5
  41. package/layout/layout-basic/index.d.ts +2 -2
  42. package/layout/layout-basic/interface.d.ts +8 -8
  43. package/layout/layout-basic/layout-basic.component.d.ts +28 -28
  44. package/layout/layout-nav/index.d.ts +3 -3
  45. package/layout/layout-nav/layout-nav-application.component.d.ts +31 -31
  46. package/layout/layout-nav/layout-nav-group.component.d.ts +16 -16
  47. package/layout/layout-nav/layout-nav-tile.component.d.ts +6 -6
  48. package/layout/public_api.d.ts +12 -12
  49. package/layout/style/index.less +154 -154
  50. package/layout/widgets/index.d.ts +6 -6
  51. package/layout/widgets/yunzai-clear-storage.component.d.ts +11 -11
  52. package/layout/widgets/yunzai-fullscreen.component.d.ts +8 -8
  53. package/layout/widgets/yunzai-i18n.component.d.ts +21 -21
  54. package/layout/widgets/yunzai-notify.component.d.ts +30 -30
  55. package/layout/widgets/yunzai-theme-btn.component.d.ts +32 -32
  56. package/layout/widgets/yunzai-user.component.d.ts +26 -26
  57. package/layout/yunzai-act.guard.d.ts +20 -20
  58. package/layout/yunzai-auth.service.d.ts +19 -19
  59. package/layout/yunzai-default.interceptor.d.ts +27 -27
  60. package/layout/yunzai-i18n.service.d.ts +26 -26
  61. package/layout/yunzai-lang.d.ts +11 -11
  62. package/layout/yunzai-layout.module.d.ts +22 -22
  63. package/layout/yunzai-startup.service.d.ts +34 -34
  64. package/package.json +39 -39
  65. package/public_api.d.ts +2 -2
  66. package/theme-compact.less +3 -3
  67. package/theme-dark.less +46 -46
  68. package/theme-default.less +46 -46
@@ -1,365 +1,365 @@
1
- import { Component, Inject } from '@angular/core';
2
- import { useLocalStorageHeader, WINDOW } from '@yelon/util';
3
- import { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from "../bis.config";
4
- import { Subject, takeUntil } from "rxjs";
5
- import * as i0 from "@angular/core";
6
- import * as i1 from "../yunzai-i18n.service";
7
- import * as i2 from "@yelon/theme";
8
- import * as i3 from "@yelon/util";
9
- import * as i4 from "@angular/common";
10
- import * as i5 from "@angular/forms";
11
- import * as i6 from "ng-zorro-antd/core/transition-patch";
12
- import * as i7 from "ng-zorro-antd/grid";
13
- import * as i8 from "ng-zorro-antd/icon";
14
- import * as i9 from "ng-zorro-antd/input";
15
- export class LayoutNavApplicationComponent {
16
- get showAllMenu() {
17
- if (this.bis.nav)
18
- return this.bis.nav.all;
19
- return true;
20
- }
21
- get showMineMenu() {
22
- if (this.bis.nav)
23
- return this.bis.nav.mine;
24
- return true;
25
- }
26
- constructor(i18n, http, inject,
27
- // @ts-ignore
28
- configService, win) {
29
- this.i18n = i18n;
30
- this.http = http;
31
- this.inject = inject;
32
- this.configService = configService;
33
- this.win = win;
34
- this.bis = BUSINESS_DEFAULT_CONFIG;
35
- this.$destroy = new Subject();
36
- this.state = {
37
- active: false,
38
- type: 'all',
39
- topic: undefined,
40
- topics: [],
41
- list: [],
42
- search: null,
43
- };
44
- this.bis = mergeBisConfig(configService);
45
- }
46
- ngOnInit() {
47
- this.fetchAllTopic();
48
- this.attachNav('all');
49
- this.win.addEventListener("click", (event) => {
50
- const { target } = event;
51
- const btn = this.win.document.getElementById("navBtn");
52
- const dropdown = this.win.document.getElementById("navDropdown");
53
- if (btn && dropdown && !dropdown.contains(target) && !btn.contains(target)) {
54
- this.state.active = false;
55
- }
56
- });
57
- }
58
- fetchAllTopic() {
59
- const [, getTopics] = useLocalStorageHeader();
60
- this.state.topics = getTopics();
61
- }
62
- attachNav(type, topic) {
63
- this.state.type = type;
64
- this.clearSearch();
65
- if (type === 'all') {
66
- this.displayAllNav();
67
- }
68
- if (type === 'mine') {
69
- this.displayMineNav();
70
- }
71
- if (type === 'other' && topic) {
72
- this.displayOtherNav(topic);
73
- }
74
- }
75
- clearSearch() {
76
- this.state.search = null;
77
- }
78
- displayAllNav() {
79
- const [, getTopics] = useLocalStorageHeader();
80
- this.state.list = getTopics();
81
- }
82
- displayMineNav() {
83
- const [, getTopics] = useLocalStorageHeader();
84
- this.state.list = getTopics()
85
- .filter((topic) => {
86
- topic.children = topic.children.filter((child) => {
87
- return child.auth;
88
- });
89
- return topic;
90
- })
91
- .filter((topic) => {
92
- return topic.children.length > 0;
93
- });
94
- }
95
- displayOtherNav(topic) {
96
- const [, getTopics] = useLocalStorageHeader();
97
- this.state.topic = topic;
98
- const temp = getTopics();
99
- this.state.list = temp.filter(t => t.key === topic.key)[0].children;
100
- }
101
- diffChange(flag) {
102
- if (flag) {
103
- this.state.active = flag;
104
- }
105
- else {
106
- this.state.active = !this.state.active;
107
- }
108
- }
109
- open(topic) {
110
- if (topic.key) {
111
- this.http
112
- .post(`/app-manager/web-scan/save`, {
113
- appId: topic.key,
114
- createDate: new Date()
115
- })
116
- .pipe(takeUntil(this.$destroy))
117
- .subscribe();
118
- }
119
- switch (topic.target) {
120
- case 'href':
121
- this.inject.get(WINDOW).location.href = topic.url;
122
- break;
123
- case 'blank':
124
- this.inject.get(WINDOW).location.href = topic.url;
125
- break;
126
- case 'target':
127
- this.inject.get(WINDOW).location.href = topic.url;
128
- break;
129
- default:
130
- this.inject.get(WINDOW).location.href = topic.url;
131
- break;
132
- }
133
- }
134
- onSearch() {
135
- const [, getTopics] = useLocalStorageHeader();
136
- const temp = getTopics();
137
- if (this.state.search) {
138
- this.state.list = temp
139
- .filter((topic) => {
140
- if (this.i18n.fanyi(topic.name).includes(this.state.search)) {
141
- return topic;
142
- }
143
- else {
144
- topic.children = topic.children.filter((child) => {
145
- return this.i18n.fanyi(child.name).includes(this.state.search);
146
- });
147
- return topic;
148
- }
149
- })
150
- .filter((topic) => {
151
- return topic.children.length > 0;
152
- });
153
- }
154
- else {
155
- const [, getTopics] = useLocalStorageHeader();
156
- this.state.list = getTopics();
157
- }
158
- }
159
- ngOnDestroy() {
160
- this.$destroy.complete();
161
- }
162
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: LayoutNavApplicationComponent, deps: [{ token: i1.YunzaiI18NService }, { token: i2._HttpClient }, { token: i0.Injector }, { token: i3.YunzaiConfigService }, { token: WINDOW }], target: i0.ɵɵFactoryTarget.Component }); }
163
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.1", type: LayoutNavApplicationComponent, selector: "layout-nav-application", ngImport: i0, template: `
164
- <!-- search start-->
165
- <ng-template #search>
166
- <div nz-row class="yz-application-list-search">
167
- <nz-input-group [nzPrefix]="prefixTemplate">
168
- <input
169
- data-event-id="_nav_search"
170
- type="text"
171
- nz-input
172
- placeholder="{{ 'application.search' | i18n }}"
173
- [(ngModel)]="state.search"
174
- (ngModelChange)="onSearch()"
175
- />
176
- <ng-template #prefixTemplate>
177
- <i nz-icon nzType="search" nzTheme="outline"></i>
178
- </ng-template>
179
- </nz-input-group>
180
- </div>
181
- </ng-template>
182
- <!-- search end -->
183
-
184
- <!-- right menu start -->
185
- <ng-template #ld>
186
- <div class="yz-application-list">
187
- <ul>
188
- <li *ngFor="let topic of state.list">
189
- <h5>{{ topic.name | i18n }}</h5>
190
- <a
191
- data-event-id="_nav_item"
192
- [attr.data-name]="nav.name | i18n"
193
- href="javascript:;"
194
- *ngFor="let nav of topic.children"
195
- (click)="open(nav)"
196
- >{{ nav.name | i18n }}</a
197
- >
198
- </li>
199
- </ul>
200
- </div>
201
- </ng-template>
202
- <!-- right menu end -->
203
-
204
- <!-- button start-->
205
- <div data-event-id="_nav_app" id="navBtn" class="yunzai-default__nav-item"
206
- (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
207
- <!-- button end-->
208
-
209
- <!-- header start-->
210
- <div class="yz-application" id="navDropdown" nz-row *ngIf="state.active">
211
- <div nz-col [nzSpan]="3" class="yz-application-topic">
212
- <div *ngIf="showAllMenu" data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text"
213
- (click)="attachNav('all')">{{
214
- 'mode.nav.all' | i18n
215
- }}</div>
216
- <div *ngIf="showMineMenu" data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text"
217
- (click)="attachNav('mine')">{{
218
- 'mode.nav.mine' | i18n
219
- }}</div>
220
- <div
221
- data-event-id="_nav_topic"
222
- [attr.data-name]="nav.name | i18n"
223
- class="yz-application-text"
224
- *ngFor="let nav of state.topics"
225
- (click)="attachNav('other', nav)"
226
- >{{ nav.name | i18n }}</div
227
- >
228
- </div>
229
- <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
230
- <div *ngIf="state.type === 'all'">
231
- <ng-template [ngTemplateOutlet]="search"></ng-template>
232
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
233
- </div>
234
- <div *ngIf="state.type === 'mine'">
235
- <ng-template [ngTemplateOutlet]="search"></ng-template>
236
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
237
- </div>
238
- <div *ngIf="state.type === 'other'" class="yz-application-list">
239
- <div class="yz-application-list-item">
240
- <ul>
241
- <li
242
- data-event-id="_nav_item"
243
- [attr.data-name]="nav.name | i18n"
244
- *ngFor="let nav of state.list"
245
- (click)="open(nav)"
246
- >
247
- <a href="javascript:;">
248
- <h4>{{ nav.name | i18n }}</h4>
249
- <p>{{ nav.intro | i18n }}</p>
250
- </a>
251
- </li>
252
- </ul>
253
- </div>
254
- </div>
255
- </div>
256
- </div>
257
- <!-- header end-->
258
- `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i7.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i9.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i9.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i9.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }] }); }
259
- }
260
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.1", ngImport: i0, type: LayoutNavApplicationComponent, decorators: [{
261
- type: Component,
262
- args: [{
263
- selector: `layout-nav-application`,
264
- template: `
265
- <!-- search start-->
266
- <ng-template #search>
267
- <div nz-row class="yz-application-list-search">
268
- <nz-input-group [nzPrefix]="prefixTemplate">
269
- <input
270
- data-event-id="_nav_search"
271
- type="text"
272
- nz-input
273
- placeholder="{{ 'application.search' | i18n }}"
274
- [(ngModel)]="state.search"
275
- (ngModelChange)="onSearch()"
276
- />
277
- <ng-template #prefixTemplate>
278
- <i nz-icon nzType="search" nzTheme="outline"></i>
279
- </ng-template>
280
- </nz-input-group>
281
- </div>
282
- </ng-template>
283
- <!-- search end -->
284
-
285
- <!-- right menu start -->
286
- <ng-template #ld>
287
- <div class="yz-application-list">
288
- <ul>
289
- <li *ngFor="let topic of state.list">
290
- <h5>{{ topic.name | i18n }}</h5>
291
- <a
292
- data-event-id="_nav_item"
293
- [attr.data-name]="nav.name | i18n"
294
- href="javascript:;"
295
- *ngFor="let nav of topic.children"
296
- (click)="open(nav)"
297
- >{{ nav.name | i18n }}</a
298
- >
299
- </li>
300
- </ul>
301
- </div>
302
- </ng-template>
303
- <!-- right menu end -->
304
-
305
- <!-- button start-->
306
- <div data-event-id="_nav_app" id="navBtn" class="yunzai-default__nav-item"
307
- (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
308
- <!-- button end-->
309
-
310
- <!-- header start-->
311
- <div class="yz-application" id="navDropdown" nz-row *ngIf="state.active">
312
- <div nz-col [nzSpan]="3" class="yz-application-topic">
313
- <div *ngIf="showAllMenu" data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text"
314
- (click)="attachNav('all')">{{
315
- 'mode.nav.all' | i18n
316
- }}</div>
317
- <div *ngIf="showMineMenu" data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text"
318
- (click)="attachNav('mine')">{{
319
- 'mode.nav.mine' | i18n
320
- }}</div>
321
- <div
322
- data-event-id="_nav_topic"
323
- [attr.data-name]="nav.name | i18n"
324
- class="yz-application-text"
325
- *ngFor="let nav of state.topics"
326
- (click)="attachNav('other', nav)"
327
- >{{ nav.name | i18n }}</div
328
- >
329
- </div>
330
- <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
331
- <div *ngIf="state.type === 'all'">
332
- <ng-template [ngTemplateOutlet]="search"></ng-template>
333
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
334
- </div>
335
- <div *ngIf="state.type === 'mine'">
336
- <ng-template [ngTemplateOutlet]="search"></ng-template>
337
- <ng-template [ngTemplateOutlet]="ld"></ng-template>
338
- </div>
339
- <div *ngIf="state.type === 'other'" class="yz-application-list">
340
- <div class="yz-application-list-item">
341
- <ul>
342
- <li
343
- data-event-id="_nav_item"
344
- [attr.data-name]="nav.name | i18n"
345
- *ngFor="let nav of state.list"
346
- (click)="open(nav)"
347
- >
348
- <a href="javascript:;">
349
- <h4>{{ nav.name | i18n }}</h4>
350
- <p>{{ nav.intro | i18n }}</p>
351
- </a>
352
- </li>
353
- </ul>
354
- </div>
355
- </div>
356
- </div>
357
- </div>
358
- <!-- header end-->
359
- `
360
- }]
361
- }], ctorParameters: function () { return [{ type: i1.YunzaiI18NService }, { type: i2._HttpClient }, { type: i0.Injector }, { type: i3.YunzaiConfigService }, { type: undefined, decorators: [{
362
- type: Inject,
363
- args: [WINDOW]
364
- }] }]; } });
1
+ import { Component, Inject } from '@angular/core';
2
+ import { useLocalStorageHeader, WINDOW } from '@yelon/util';
3
+ import { BUSINESS_DEFAULT_CONFIG, mergeBisConfig } from "../bis.config";
4
+ import { Subject, takeUntil } from "rxjs";
5
+ import * as i0 from "@angular/core";
6
+ import * as i1 from "../yunzai-i18n.service";
7
+ import * as i2 from "@yelon/theme";
8
+ import * as i3 from "@yelon/util";
9
+ import * as i4 from "@angular/common";
10
+ import * as i5 from "@angular/forms";
11
+ import * as i6 from "ng-zorro-antd/core/transition-patch";
12
+ import * as i7 from "ng-zorro-antd/grid";
13
+ import * as i8 from "ng-zorro-antd/icon";
14
+ import * as i9 from "ng-zorro-antd/input";
15
+ export class LayoutNavApplicationComponent {
16
+ get showAllMenu() {
17
+ if (this.bis.nav)
18
+ return this.bis.nav.all;
19
+ return true;
20
+ }
21
+ get showMineMenu() {
22
+ if (this.bis.nav)
23
+ return this.bis.nav.mine;
24
+ return true;
25
+ }
26
+ constructor(i18n, http, inject,
27
+ // @ts-ignore
28
+ configService, win) {
29
+ this.i18n = i18n;
30
+ this.http = http;
31
+ this.inject = inject;
32
+ this.configService = configService;
33
+ this.win = win;
34
+ this.bis = BUSINESS_DEFAULT_CONFIG;
35
+ this.$destroy = new Subject();
36
+ this.state = {
37
+ active: false,
38
+ type: 'all',
39
+ topic: undefined,
40
+ topics: [],
41
+ list: [],
42
+ search: null,
43
+ };
44
+ this.bis = mergeBisConfig(configService);
45
+ }
46
+ ngOnInit() {
47
+ this.fetchAllTopic();
48
+ this.attachNav('all');
49
+ this.win.addEventListener("click", (event) => {
50
+ const { target } = event;
51
+ const btn = this.win.document.getElementById("navBtn");
52
+ const dropdown = this.win.document.getElementById("navDropdown");
53
+ if (btn && dropdown && !dropdown.contains(target) && !btn.contains(target)) {
54
+ this.state.active = false;
55
+ }
56
+ });
57
+ }
58
+ fetchAllTopic() {
59
+ const [, getTopics] = useLocalStorageHeader();
60
+ this.state.topics = getTopics();
61
+ }
62
+ attachNav(type, topic) {
63
+ this.state.type = type;
64
+ this.clearSearch();
65
+ if (type === 'all') {
66
+ this.displayAllNav();
67
+ }
68
+ if (type === 'mine') {
69
+ this.displayMineNav();
70
+ }
71
+ if (type === 'other' && topic) {
72
+ this.displayOtherNav(topic);
73
+ }
74
+ }
75
+ clearSearch() {
76
+ this.state.search = null;
77
+ }
78
+ displayAllNav() {
79
+ const [, getTopics] = useLocalStorageHeader();
80
+ this.state.list = getTopics();
81
+ }
82
+ displayMineNav() {
83
+ const [, getTopics] = useLocalStorageHeader();
84
+ this.state.list = getTopics()
85
+ .filter((topic) => {
86
+ topic.children = topic.children.filter((child) => {
87
+ return child.auth;
88
+ });
89
+ return topic;
90
+ })
91
+ .filter((topic) => {
92
+ return topic.children.length > 0;
93
+ });
94
+ }
95
+ displayOtherNav(topic) {
96
+ const [, getTopics] = useLocalStorageHeader();
97
+ this.state.topic = topic;
98
+ const temp = getTopics();
99
+ this.state.list = temp.filter(t => t.key === topic.key)[0].children;
100
+ }
101
+ diffChange(flag) {
102
+ if (flag) {
103
+ this.state.active = flag;
104
+ }
105
+ else {
106
+ this.state.active = !this.state.active;
107
+ }
108
+ }
109
+ open(topic) {
110
+ if (topic.key) {
111
+ this.http
112
+ .post(`/app-manager/web-scan/save`, {
113
+ appId: topic.key,
114
+ createDate: new Date()
115
+ })
116
+ .pipe(takeUntil(this.$destroy))
117
+ .subscribe();
118
+ }
119
+ switch (topic.target) {
120
+ case 'href':
121
+ this.inject.get(WINDOW).location.href = topic.url;
122
+ break;
123
+ case 'blank':
124
+ this.inject.get(WINDOW).location.href = topic.url;
125
+ break;
126
+ case 'target':
127
+ this.inject.get(WINDOW).location.href = topic.url;
128
+ break;
129
+ default:
130
+ this.inject.get(WINDOW).location.href = topic.url;
131
+ break;
132
+ }
133
+ }
134
+ onSearch() {
135
+ const [, getTopics] = useLocalStorageHeader();
136
+ const temp = getTopics();
137
+ if (this.state.search) {
138
+ this.state.list = temp
139
+ .filter((topic) => {
140
+ if (this.i18n.fanyi(topic.name).includes(this.state.search)) {
141
+ return topic;
142
+ }
143
+ else {
144
+ topic.children = topic.children.filter((child) => {
145
+ return this.i18n.fanyi(child.name).includes(this.state.search);
146
+ });
147
+ return topic;
148
+ }
149
+ })
150
+ .filter((topic) => {
151
+ return topic.children.length > 0;
152
+ });
153
+ }
154
+ else {
155
+ const [, getTopics] = useLocalStorageHeader();
156
+ this.state.list = getTopics();
157
+ }
158
+ }
159
+ ngOnDestroy() {
160
+ this.$destroy.complete();
161
+ }
162
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: LayoutNavApplicationComponent, deps: [{ token: i1.YunzaiI18NService }, { token: i2._HttpClient }, { token: i0.Injector }, { token: i3.YunzaiConfigService }, { token: WINDOW }], target: i0.ɵɵFactoryTarget.Component }); }
163
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.7", type: LayoutNavApplicationComponent, selector: "layout-nav-application", ngImport: i0, template: `
164
+ <!-- search start-->
165
+ <ng-template #search>
166
+ <div nz-row class="yz-application-list-search">
167
+ <nz-input-group [nzPrefix]="prefixTemplate">
168
+ <input
169
+ data-event-id="_nav_search"
170
+ type="text"
171
+ nz-input
172
+ placeholder="{{ 'application.search' | i18n }}"
173
+ [(ngModel)]="state.search"
174
+ (ngModelChange)="onSearch()"
175
+ />
176
+ <ng-template #prefixTemplate>
177
+ <i nz-icon nzType="search" nzTheme="outline"></i>
178
+ </ng-template>
179
+ </nz-input-group>
180
+ </div>
181
+ </ng-template>
182
+ <!-- search end -->
183
+
184
+ <!-- right menu start -->
185
+ <ng-template #ld>
186
+ <div class="yz-application-list">
187
+ <ul>
188
+ <li *ngFor="let topic of state.list">
189
+ <h5>{{ topic.name | i18n }}</h5>
190
+ <a
191
+ data-event-id="_nav_item"
192
+ [attr.data-name]="nav.name | i18n"
193
+ href="javascript:;"
194
+ *ngFor="let nav of topic.children"
195
+ (click)="open(nav)"
196
+ >{{ nav.name | i18n }}</a
197
+ >
198
+ </li>
199
+ </ul>
200
+ </div>
201
+ </ng-template>
202
+ <!-- right menu end -->
203
+
204
+ <!-- button start-->
205
+ <div data-event-id="_nav_app" id="navBtn" class="yunzai-default__nav-item"
206
+ (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
207
+ <!-- button end-->
208
+
209
+ <!-- header start-->
210
+ <div class="yz-application" id="navDropdown" nz-row *ngIf="state.active">
211
+ <div nz-col [nzSpan]="3" class="yz-application-topic">
212
+ <div *ngIf="showAllMenu" data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text"
213
+ (click)="attachNav('all')">{{
214
+ 'mode.nav.all' | i18n
215
+ }}</div>
216
+ <div *ngIf="showMineMenu" data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text"
217
+ (click)="attachNav('mine')">{{
218
+ 'mode.nav.mine' | i18n
219
+ }}</div>
220
+ <div
221
+ data-event-id="_nav_topic"
222
+ [attr.data-name]="nav.name | i18n"
223
+ class="yz-application-text"
224
+ *ngFor="let nav of state.topics"
225
+ (click)="attachNav('other', nav)"
226
+ >{{ nav.name | i18n }}</div
227
+ >
228
+ </div>
229
+ <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
230
+ <div *ngIf="state.type === 'all'">
231
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
232
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
233
+ </div>
234
+ <div *ngIf="state.type === 'mine'">
235
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
236
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
237
+ </div>
238
+ <div *ngIf="state.type === 'other'" class="yz-application-list">
239
+ <div class="yz-application-list-item">
240
+ <ul>
241
+ <li
242
+ data-event-id="_nav_item"
243
+ [attr.data-name]="nav.name | i18n"
244
+ *ngFor="let nav of state.list"
245
+ (click)="open(nav)"
246
+ >
247
+ <a href="javascript:;">
248
+ <h4>{{ nav.name | i18n }}</h4>
249
+ <p>{{ nav.intro | i18n }}</p>
250
+ </a>
251
+ </li>
252
+ </ul>
253
+ </div>
254
+ </div>
255
+ </div>
256
+ </div>
257
+ <!-- header end-->
258
+ `, isInline: true, dependencies: [{ kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i5.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "directive", type: i6.ɵNzTransitionPatchDirective, selector: "[nz-button], nz-button-group, [nz-icon], [nz-menu-item], [nz-submenu], nz-select-top-control, nz-select-placeholder, nz-input-group", inputs: ["hidden"] }, { kind: "directive", type: i7.NzColDirective, selector: "[nz-col],nz-col,nz-form-control,nz-form-label", inputs: ["nzFlex", "nzSpan", "nzOrder", "nzOffset", "nzPush", "nzPull", "nzXs", "nzSm", "nzMd", "nzLg", "nzXl", "nzXXl"], exportAs: ["nzCol"] }, { kind: "directive", type: i7.NzRowDirective, selector: "[nz-row],nz-row,nz-form-item", inputs: ["nzAlign", "nzJustify", "nzGutter"], exportAs: ["nzRow"] }, { kind: "directive", type: i8.NzIconDirective, selector: "[nz-icon]", inputs: ["nzSpin", "nzRotate", "nzType", "nzTheme", "nzTwotoneColor", "nzIconfont"], exportAs: ["nzIcon"] }, { kind: "directive", type: i9.NzInputDirective, selector: "input[nz-input],textarea[nz-input]", inputs: ["nzBorderless", "nzSize", "nzStepperless", "nzStatus", "disabled"], exportAs: ["nzInput"] }, { kind: "component", type: i9.NzInputGroupComponent, selector: "nz-input-group", inputs: ["nzAddOnBeforeIcon", "nzAddOnAfterIcon", "nzPrefixIcon", "nzSuffixIcon", "nzAddOnBefore", "nzAddOnAfter", "nzPrefix", "nzStatus", "nzSuffix", "nzSize", "nzSearch", "nzCompact"], exportAs: ["nzInputGroup"] }, { kind: "directive", type: i9.NzInputGroupWhitSuffixOrPrefixDirective, selector: "nz-input-group[nzSuffix], nz-input-group[nzPrefix]" }, { kind: "pipe", type: i2.I18nPipe, name: "i18n" }] }); }
259
+ }
260
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.7", ngImport: i0, type: LayoutNavApplicationComponent, decorators: [{
261
+ type: Component,
262
+ args: [{
263
+ selector: `layout-nav-application`,
264
+ template: `
265
+ <!-- search start-->
266
+ <ng-template #search>
267
+ <div nz-row class="yz-application-list-search">
268
+ <nz-input-group [nzPrefix]="prefixTemplate">
269
+ <input
270
+ data-event-id="_nav_search"
271
+ type="text"
272
+ nz-input
273
+ placeholder="{{ 'application.search' | i18n }}"
274
+ [(ngModel)]="state.search"
275
+ (ngModelChange)="onSearch()"
276
+ />
277
+ <ng-template #prefixTemplate>
278
+ <i nz-icon nzType="search" nzTheme="outline"></i>
279
+ </ng-template>
280
+ </nz-input-group>
281
+ </div>
282
+ </ng-template>
283
+ <!-- search end -->
284
+
285
+ <!-- right menu start -->
286
+ <ng-template #ld>
287
+ <div class="yz-application-list">
288
+ <ul>
289
+ <li *ngFor="let topic of state.list">
290
+ <h5>{{ topic.name | i18n }}</h5>
291
+ <a
292
+ data-event-id="_nav_item"
293
+ [attr.data-name]="nav.name | i18n"
294
+ href="javascript:;"
295
+ *ngFor="let nav of topic.children"
296
+ (click)="open(nav)"
297
+ >{{ nav.name | i18n }}</a
298
+ >
299
+ </li>
300
+ </ul>
301
+ </div>
302
+ </ng-template>
303
+ <!-- right menu end -->
304
+
305
+ <!-- button start-->
306
+ <div data-event-id="_nav_app" id="navBtn" class="yunzai-default__nav-item"
307
+ (click)="diffChange()"> {{ 'mode.nav' | i18n }}</div>
308
+ <!-- button end-->
309
+
310
+ <!-- header start-->
311
+ <div class="yz-application" id="navDropdown" nz-row *ngIf="state.active">
312
+ <div nz-col [nzSpan]="3" class="yz-application-topic">
313
+ <div *ngIf="showAllMenu" data-event-id="_nav_topic" data-name="全部应用" class="yz-application-text"
314
+ (click)="attachNav('all')">{{
315
+ 'mode.nav.all' | i18n
316
+ }}</div>
317
+ <div *ngIf="showMineMenu" data-event-id="_nav_topic" data-name="我的应用" class="yz-application-text"
318
+ (click)="attachNav('mine')">{{
319
+ 'mode.nav.mine' | i18n
320
+ }}</div>
321
+ <div
322
+ data-event-id="_nav_topic"
323
+ [attr.data-name]="nav.name | i18n"
324
+ class="yz-application-text"
325
+ *ngFor="let nav of state.topics"
326
+ (click)="attachNav('other', nav)"
327
+ >{{ nav.name | i18n }}</div
328
+ >
329
+ </div>
330
+ <div nz-col [nzSpan]="21" [ngSwitch]="state.topic" class="yz-application-container">
331
+ <div *ngIf="state.type === 'all'">
332
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
333
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
334
+ </div>
335
+ <div *ngIf="state.type === 'mine'">
336
+ <ng-template [ngTemplateOutlet]="search"></ng-template>
337
+ <ng-template [ngTemplateOutlet]="ld"></ng-template>
338
+ </div>
339
+ <div *ngIf="state.type === 'other'" class="yz-application-list">
340
+ <div class="yz-application-list-item">
341
+ <ul>
342
+ <li
343
+ data-event-id="_nav_item"
344
+ [attr.data-name]="nav.name | i18n"
345
+ *ngFor="let nav of state.list"
346
+ (click)="open(nav)"
347
+ >
348
+ <a href="javascript:;">
349
+ <h4>{{ nav.name | i18n }}</h4>
350
+ <p>{{ nav.intro | i18n }}</p>
351
+ </a>
352
+ </li>
353
+ </ul>
354
+ </div>
355
+ </div>
356
+ </div>
357
+ </div>
358
+ <!-- header end-->
359
+ `
360
+ }]
361
+ }], ctorParameters: function () { return [{ type: i1.YunzaiI18NService }, { type: i2._HttpClient }, { type: i0.Injector }, { type: i3.YunzaiConfigService }, { type: undefined, decorators: [{
362
+ type: Inject,
363
+ args: [WINDOW]
364
+ }] }]; } });
365
365
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9iaXMvbGF5b3V0L2xheW91dC1uYXYvbGF5b3V0LW5hdi1hcHBsaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFNBQVMsRUFBRSxNQUFNLEVBQThCLE1BQU0sZUFBZSxDQUFDO0FBRzdFLE9BQU8sRUFFTCxxQkFBcUIsRUFDckIsTUFBTSxFQUlQLE1BQU0sYUFBYSxDQUFDO0FBR3JCLE9BQU8sRUFBQyx1QkFBdUIsRUFBRSxjQUFjLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDdEUsT0FBTyxFQUFDLE9BQU8sRUFBRSxTQUFTLEVBQUMsTUFBTSxNQUFNLENBQUM7Ozs7Ozs7Ozs7O0FBcUd4QyxNQUFNLE9BQU8sNkJBQTZCO0lBWXhDLElBQUksV0FBVztRQUNiLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHO1lBQUUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUksQ0FBQyxHQUFJLENBQUE7UUFDM0MsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRUQsSUFBSSxZQUFZO1FBQ2QsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUc7WUFBRSxPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBSSxDQUFDLElBQUssQ0FBQTtRQUM1QyxPQUFPLElBQUksQ0FBQTtJQUNiLENBQUM7SUFFRCxZQUNVLElBQXVCLEVBQ3ZCLElBQWlCLEVBQ2pCLE1BQWdCO0lBQ3hCLGFBQWE7SUFDTCxhQUFrQyxFQUNsQixHQUFRO1FBTHhCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLFNBQUksR0FBSixJQUFJLENBQWE7UUFDakIsV0FBTSxHQUFOLE1BQU0sQ0FBVTtRQUVoQixrQkFBYSxHQUFiLGFBQWEsQ0FBcUI7UUFDbEIsUUFBRyxHQUFILEdB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RUFBRTt3QkFDL0QsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTyxDQUFDLENBQUM7b0JBQ2xFLENBQUMsQ0FBQyxDQUFDO29CQUNILE9BQU8sS0FBSyxDQUFDO2lCQUNkO1lBQ0gsQ0FBQyxDQUFDO2lCQUNELE1BQU0sQ0FBQyxDQUFDLEtBQXFCLEVBQUUsRUFBRTtnQkFDaEMsT0FBTyxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7WUFDbkMsQ0FBQyxDQUFDLENBQUM7U0FDTjthQUFNO1lBQ0wsTUFBTSxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcscUJBQXFCLEVBQUUsQ0FBQztZQUM5QyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUcsQ0FBQztTQUNoQztJQUNILENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtJQUMxQixDQUFDOzhHQTNKVSw2QkFBNkIseUlBNEI5QixNQUFNO2tHQTVCTCw2QkFBNkIsOERBakc5Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0ErRlQ7OzJGQUVVLDZCQUE2QjtrQkFuR3pDLFNBQVM7bUJBQUM7b0JBQ1QsUUFBUSxFQUFFLHdCQUF3QjtvQkFDbEMsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQStGVDtpQkFDRjs7MEJBNkJJLE1BQU07MkJBQUMsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7Q29tcG9uZW50LCBJbmplY3QsIEluamVjdG9yLCBPbkRlc3Ryb3ksIE9uSW5pdH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7X0h0dHBDbGllbnR9IGZyb20gJ0B5ZWxvbi90aGVtZSc7XG5pbXBvcnQge1xuICBMYXlvdXROYXZBcHBsaWNhdGlvblN0YXRlLFxuICB1c2VMb2NhbFN0b3JhZ2VIZWFkZXIsXG4gIFdJTkRPVyxcbiAgWXVuemFpQnVzaW5lc3NDb25maWcsXG4gIFl1bnphaUNvbmZpZ1NlcnZpY2UsXG4gIFl1bnphaU5hdlRvcGljXG59IGZyb20gJ0B5ZWxvbi91dGlsJztcblxuaW1wb3J0IHtZdW56YWlJMThOU2VydmljZX0gZnJvbSAnLi4veXVuemFpLWkxOG4uc2VydmljZSc7XG5pbXBvcnQge0JVU0lORVNTX0RFRkFVTFRfQ09ORklHLCBtZXJnZUJpc0NvbmZpZ30gZnJvbSBcIi4uL2Jpcy5jb25maWdcIjtcbmltcG9ydCB7U3ViamVjdCwgdGFrZVVudGlsfSBmcm9tIFwicnhqc1wiO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6IGBsYXlvdXQtbmF2LWFwcGxpY2F0aW9uYCxcbiAgdGVtcGxhdGU6IGBcbiAgICA8IS0tICAgICAgc2VhcmNoIHN0YXJ0LS0+XG4gICAgPG5nLXRlbXBsYXRlICNzZWFyY2g+XG4gICAgICA8ZGl2IG56LXJvdyBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLWxpc3Qtc2VhcmNoXCI+XG4gICAgICAgIDxuei1pbnB1dC1ncm91cCBbbnpQcmVmaXhdPVwicHJlZml4VGVtcGxhdGVcIj5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X3NlYXJjaFwiXG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBuei1pbnB1dFxuICAgICAgICAgICAgcGxhY2Vob2xkZXI9XCJ7eyAnYXBwbGljYXRpb24uc2VhcmNoJyB8IGkxOG4gfX1cIlxuICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJzdGF0ZS5zZWFyY2hcIlxuICAgICAgICAgICAgKG5nTW9kZWxDaGFuZ2UpPVwib25TZWFyY2goKVwiXG4gICAgICAgICAgLz5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgI3ByZWZpeFRlbXBsYXRlPlxuICAgICAgICAgICAgPGkgbnotaWNvbiBuelR5cGU9XCJzZWFyY2hcIiBuelRoZW1lPVwib3V0bGluZVwiPjwvaT5cbiAgICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8L256LWlucHV0LWdyb3VwPlxuICAgICAgPC9kaXY+XG4gICAgPC9uZy10ZW1wbGF0ZT5cbiAgICA8IS0tIHNlYXJjaCBlbmQgLS0+XG5cbiAgICA8IS0tIHJpZ2h0IG1lbnUgc3RhcnQgLS0+XG4gICAgPG5nLXRlbXBsYXRlICNsZD5cbiAgICAgIDxkaXYgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1saXN0XCI+XG4gICAgICAgIDx1bD5cbiAgICAgICAgICA8bGkgKm5nRm9yPVwibGV0IHRvcGljIG9mIHN0YXRlLmxpc3RcIj5cbiAgICAgICAgICAgIDxoNT57eyB0b3BpYy5uYW1lIHwgaTE4biB9fTwvaDU+XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICBkYXRhLWV2ZW50LWlkPVwiX25hdl9pdGVtXCJcbiAgICAgICAgICAgICAgW2F0dHIuZGF0YS1uYW1lXT1cIm5hdi5uYW1lIHwgaTE4blwiXG4gICAgICAgICAgICAgIGhyZWY9XCJqYXZhc2NyaXB0OjtcIlxuICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgbmF2IG9mIHRvcGljLmNoaWxkcmVuXCJcbiAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4obmF2KVwiXG4gICAgICAgICAgICA+e3sgbmF2Lm5hbWUgfCBpMThuIH19PC9hXG4gICAgICAgICAgICA+XG4gICAgICAgICAgPC9saT5cbiAgICAgICAgPC91bD5cbiAgICAgIDwvZGl2PlxuICAgIDwvbmctdGVtcGxhdGU+XG4gICAgPCEtLSByaWdodCBtZW51IGVuZCAtLT5cblxuICAgIDwhLS0gICAgICBidXR0b24gc3RhcnQtLT5cbiAgICA8ZGl2IGRhdGEtZXZlbnQtaWQ9XCJfbmF2X2FwcFwiIGlkPVwibmF2QnRuXCIgY2xhc3M9XCJ5dW56YWktZGVmYXVsdF9fbmF2LWl0ZW1cIlxuICAgICAgICAgKGNsaWNrKT1cImRpZmZDaGFuZ2UoKVwiPiB7eyAnbW9kZS5uYXYnIHwgaTE4biB9fTwvZGl2PlxuICAgIDwhLS0gICAgICBidXR0b24gZW5kLS0+XG5cbiAgICA8IS0tICAgICAgaGVhZGVyIHN0YXJ0LS0+XG4gICAgPGRpdiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uXCIgaWQ9XCJuYXZEcm9wZG93blwiIG56LXJvdyAqbmdJZj1cInN0YXRlLmFjdGl2ZVwiPlxuICAgICAgPGRpdiBuei1jb2wgW256U3Bhbl09XCIzXCIgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi10b3BpY1wiPlxuICAgICAgICA8ZGl2ICpuZ0lmPVwic2hvd0FsbE1lbnVcIiBkYXRhLWV2ZW50LWlkPVwiX25hdl90b3BpY1wiIGRhdGEtbmFtZT1cIuWFqOmDqOW6lOeUqFwiIGNsYXNzPVwieXotYXBwbGljYXRpb24tdGV4dFwiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImF0dGFjaE5hdignYWxsJylcIj57e1xuICAgICAgICAgICdtb2RlLm5hdi5hbGwnIHwgaTE4blxuICAgICAgICAgIH19PC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzaG93TWluZU1lbnVcIiBkYXRhLWV2ZW50LWlkPVwiX25hdl90b3BpY1wiIGRhdGEtbmFtZT1cIuaIkeeahOW6lOeUqFwiIGNsYXNzPVwieXotYXBwbGljYXRpb24tdGV4dFwiXG4gICAgICAgICAgICAgKGNsaWNrKT1cImF0dGFjaE5hdignbWluZScpXCI+e3tcbiAgICAgICAgICAnbW9kZS5uYXYubWluZScgfCBpMThuXG4gICAgICAgICAgfX08L2Rpdj5cbiAgICAgICAgPGRpdlxuICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X3RvcGljXCJcbiAgICAgICAgICBbYXR0ci5kYXRhLW5hbWVdPVwibmF2Lm5hbWUgfCBpMThuXCJcbiAgICAgICAgICBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLXRleHRcIlxuICAgICAgICAgICpuZ0Zvcj1cImxldCBuYXYgb2Ygc3RhdGUudG9waWNzXCJcbiAgICAgICAgICAoY2xpY2spPVwiYXR0YWNoTmF2KCdvdGhlcicsIG5hdilcIlxuICAgICAgICA+e3sgbmF2Lm5hbWUgfCBpMThuIH19PC9kaXZcbiAgICAgICAgPlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IG56LWNvbCBbbnpTcGFuXT1cIjIxXCIgW25nU3dpdGNoXT1cInN0YXRlLnRvcGljXCIgY2xhc3M9XCJ5ei1hcHBsaWNhdGlvbi1jb250YWluZXJcIj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInN0YXRlLnR5cGUgPT09ICdhbGwnXCI+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInNlYXJjaFwiPjwvbmctdGVtcGxhdGU+XG4gICAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cImxkXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgKm5nSWY9XCJzdGF0ZS50eXBlID09PSAnbWluZSdcIj5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwic2VhcmNoXCI+PC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICA8bmctdGVtcGxhdGUgW25nVGVtcGxhdGVPdXRsZXRdPVwibGRcIj48L25nLXRlbXBsYXRlPlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiAqbmdJZj1cInN0YXRlLnR5cGUgPT09ICdvdGhlcidcIiBjbGFzcz1cInl6LWFwcGxpY2F0aW9uLWxpc3RcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwieXotYXBwbGljYXRpb24tbGlzdC1pdGVtXCI+XG4gICAgICAgICAgICA8dWw+XG4gICAgICAgICAgICAgIDxsaVxuICAgICAgICAgICAgICAgIGRhdGEtZXZlbnQtaWQ9XCJfbmF2X2l0ZW1cIlxuICAgICAgICAgICAgICAgIFthdHRyLmRhdGEtbmFtZV09XCJuYXYubmFtZSB8IGkxOG5cIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBuYXYgb2Ygc3RhdGUubGlzdFwiXG4gICAgICAgICAgICAgICAgKGNsaWNrKT1cIm9wZW4obmF2KVwiXG4gICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiamF2YXNjcmlwdDo7XCI+XG4gICAgICAgICAgICAgICAgICA8aDQ+e3sgbmF2Lm5hbWUgfCBpMThuIH19PC9oND5cbiAgICAgICAgICAgICAgICAgIDxwPnt7IG5hdi5pbnRybyB8IGkxOG4gfX08L3A+XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgPC91bD5cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8IS0tICAgICAgaGVhZGVyIGVuZC0tPlxuICBgXG59KVxuZXhwb3J0IGNsYXNzIExheW91dE5hdkFwcGxpY2F0aW9uQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGJpczogWXVuemFpQnVzaW5lc3NDb25maWcgPSBCVVNJTkVTU19ERUZBVUxUX0NPTkZJRztcbiAgcHJpdmF0ZSAkZGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7XG4gIHN0YXRlOiBMYXlvdXROYXZBcHBsaWNhdGlvblN0YXRlID0ge1xuICAgIGFjdGl2ZTogZmFsc2UsXG4gICAgdHlwZTogJ2FsbCcsXG4gICAgdG9waWM6IHVuZGVmaW5lZCxcbiAgICB0b3BpY3M6IFtdLFxuICAgIGxpc3Q6IFtdLFxuICAgIHNlYXJjaDogbnVsbCxcbiAgfTtcblxuICBnZXQgc2hvd0FsbE1lbnUoKTogYm9vbGVhbiB7XG4gICAgaWYgKHRoaXMuYmlzLm5hdikgcmV0dXJuIHRoaXMuYmlzLm5hdiEuYWxsIVxuICAgIHJldHVybiB0cnVlXG4gIH1cblxuICBnZXQgc2hvd01pbmVNZW51KCk6IGJvb2xlYW4ge1xuICAgIGlmICh0aGlzLmJpcy5uYXYpIHJldHVybiB0aGlzLmJpcy5uYXYhLm1pbmUhXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgaTE4bjogWXVuemFpSTE4TlNlcnZpY2UsXG4gICAgcHJpdmF0ZSBodHRwOiBfSHR0cENsaWVudCxcbiAgICBwcml2YXRlIGluamVjdDogSW5qZWN0b3IsXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHByaXZhdGUgY29uZmlnU2VydmljZTogWXVuemFpQ29uZmlnU2VydmljZSxcbiAgICBASW5qZWN0KFdJTkRPVykgcHJpdmF0ZSB3aW46IGFueVxuICApIHtcbiAgICB0aGlzLmJpcyA9IG1lcmdlQmlzQ29uZmlnKGNvbmZpZ1NlcnZpY2UpXG4gIH1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICB0aGlzLmZldGNoQWxsVG9waWMoKTtcbiAgICB0aGlzLmF0dGFjaE5hdignYWxsJyk7XG4gICAgdGhpcy53aW4uYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIChldmVudDogYW55KSA9PiB7XG4gICAgICBjb25zdCB7dGFyZ2V0fSA9IGV2ZW50XG4gICAgICBjb25zdCBidG4gPSB0aGlzLndpbi5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5hdkJ0blwiKVxuICAgICAgY29uc3QgZHJvcGRvd24gPSB0aGlzLndpbi5kb2N1bWVudC5nZXRFbGVtZW50QnlJZChcIm5hdkRyb3Bkb3duXCIpXG4gICAgICBpZiAoYnRuICYmIGRyb3Bkb3duICYmICFkcm9wZG93bi5jb250YWlucyh0YXJnZXQpICYmICFidG4uY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICB0aGlzLnN0YXRlLmFjdGl2ZSA9IGZhbHNlXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGZldGNoQWxsVG9waWMoKTogdm9pZCB7XG4gICAgY29uc3QgWywgZ2V0VG9waWNzXSA9IHVzZUxvY2FsU3RvcmFnZUhlYWRlcigpO1xuICAgIHRoaXMuc3RhdGUudG9waWNzID0gZ2V0VG9waWNzKCkhO1xuICB9XG5cbiAgYXR0YWNoTmF2KHR5cGU6ICdhbGwnIHwgJ21pbmUnIHwgJ290aGVyJywgdG9waWM/OiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIHRoaXMuc3RhdGUudHlwZSA9IHR5cGU7XG4gICAgdGhpcy5jbGVhclNlYXJjaCgpO1xuICAgIGlmICh0eXBlID09PSAnYWxsJykge1xuICAgICAgdGhpcy5kaXNwbGF5QWxsTmF2KCk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSAnbWluZScpIHtcbiAgICAgIHRoaXMuZGlzcGxheU1pbmVOYXYoKTtcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdvdGhlcicgJiYgdG9waWMpIHtcbiAgICAgIHRoaXMuZGlzcGxheU90aGVyTmF2KHRvcGljKTtcbiAgICB9XG4gIH1cblxuICBjbGVhclNlYXJjaCgpOiB2b2lkIHtcbiAgICB0aGlzLnN0YXRlLnNlYXJjaCA9IG51bGw7XG4gIH1cblxuICBkaXNwbGF5QWxsTmF2KCk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldFRvcGljc10gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXIoKTtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSBnZXRUb3BpY3MoKSE7XG4gIH1cblxuICBkaXNwbGF5TWluZU5hdigpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRUb3BpY3NdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyKCk7XG4gICAgdGhpcy5zdGF0ZS5saXN0ID0gZ2V0VG9waWNzKCkhXG4gICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgdG9waWMuY2hpbGRyZW4gPSB0b3BpYy5jaGlsZHJlbi5maWx0ZXIoKGNoaWxkOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICAgIHJldHVybiBjaGlsZC5hdXRoO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRvcGljO1xuICAgICAgfSlcbiAgICAgIC5maWx0ZXIoKHRvcGljOiBZdW56YWlOYXZUb3BpYykgPT4ge1xuICAgICAgICByZXR1cm4gdG9waWMuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICAgIH0pO1xuICB9XG5cbiAgZGlzcGxheU90aGVyTmF2KHRvcGljOiBZdW56YWlOYXZUb3BpYyk6IHZvaWQge1xuICAgIGNvbnN0IFssIGdldFRvcGljc10gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXIoKTtcbiAgICB0aGlzLnN0YXRlLnRvcGljID0gdG9waWM7XG4gICAgY29uc3QgdGVtcDogWXVuemFpTmF2VG9waWNbXSA9IGdldFRvcGljcygpITtcbiAgICB0aGlzLnN0YXRlLmxpc3QgPSB0ZW1wLmZpbHRlcih0ID0+IHQua2V5ID09PSB0b3BpYy5rZXkpWzBdLmNoaWxkcmVuO1xuICB9XG5cbiAgZGlmZkNoYW5nZShmbGFnPzogYm9vbGVhbik6IHZvaWQge1xuICAgIGlmIChmbGFnKSB7XG4gICAgICB0aGlzLnN0YXRlLmFjdGl2ZSA9IGZsYWc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuc3RhdGUuYWN0aXZlID0gIXRoaXMuc3RhdGUuYWN0aXZlO1xuICAgIH1cbiAgfVxuXG4gIG9wZW4odG9waWM6IFl1bnphaU5hdlRvcGljKTogdm9pZCB7XG4gICAgaWYgKHRvcGljLmtleSkge1xuICAgICAgdGhpcy5odHRwXG4gICAgICAgIC5wb3N0KGAvYXBwLW1hbmFnZXIvd2ViLXNjYW4vc2F2ZWAsIHtcbiAgICAgICAgICBhcHBJZDogdG9waWMua2V5LFxuICAgICAgICAgIGNyZWF0ZURhdGU6IG5ldyBEYXRlKClcbiAgICAgICAgfSlcbiAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuJGRlc3Ryb3kpKVxuICAgICAgICAuc3Vic2NyaWJlKCk7XG4gICAgfVxuICAgIHN3aXRjaCAodG9waWMudGFyZ2V0KSB7XG4gICAgICBjYXNlICdocmVmJzpcbiAgICAgICAgdGhpcy5pbmplY3QuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHRvcGljLnVybDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdibGFuayc6XG4gICAgICAgIHRoaXMuaW5qZWN0LmdldChXSU5ET1cpLmxvY2F0aW9uLmhyZWYgPSB0b3BpYy51cmw7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAndGFyZ2V0JzpcbiAgICAgICAgdGhpcy5pbmplY3QuZ2V0KFdJTkRPVykubG9jYXRpb24uaHJlZiA9IHRvcGljLnVybDtcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aGlzLmluamVjdC5nZXQoV0lORE9XKS5sb2NhdGlvbi5ocmVmID0gdG9waWMudXJsO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICBvblNlYXJjaCgpOiB2b2lkIHtcbiAgICBjb25zdCBbLCBnZXRUb3BpY3NdID0gdXNlTG9jYWxTdG9yYWdlSGVhZGVyKCk7XG4gICAgY29uc3QgdGVtcDogWXVuemFpTmF2VG9waWNbXSA9IGdldFRvcGljcygpITtcbiAgICBpZiAodGhpcy5zdGF0ZS5zZWFyY2gpIHtcbiAgICAgIHRoaXMuc3RhdGUubGlzdCA9IHRlbXBcbiAgICAgICAgLmZpbHRlcigodG9waWM6IFl1bnphaU5hdlRvcGljKSA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuaTE4bi5mYW55aSh0b3BpYy5uYW1lKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnNlYXJjaCEpKSB7XG4gICAgICAgICAgICByZXR1cm4gdG9waWM7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvcGljLmNoaWxkcmVuID0gdG9waWMuY2hpbGRyZW4uZmlsdGVyKChjaGlsZDogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaTE4bi5mYW55aShjaGlsZC5uYW1lKS5pbmNsdWRlcyh0aGlzLnN0YXRlLnNlYXJjaCEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gdG9waWM7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmlsdGVyKCh0b3BpYzogWXVuemFpTmF2VG9waWMpID0+IHtcbiAgICAgICAgICByZXR1cm4gdG9waWMuY2hpbGRyZW4ubGVuZ3RoID4gMDtcbiAgICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IFssIGdldFRvcGljc10gPSB1c2VMb2NhbFN0b3JhZ2VIZWFkZXIoKTtcbiAgICAgIHRoaXMuc3RhdGUubGlzdCA9IGdldFRvcGljcygpITtcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLiRkZXN0cm95LmNvbXBsZXRlKClcbiAgfVxuXG59XG4iXX0=