@libs-ui/components-preview-text-data 0.2.352-1 → 0.2.352-2

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.
@@ -8,6 +8,7 @@ import { LibsUiNotificationService } from '@libs-ui/services-notification';
8
8
  import { get } from '@libs-ui/utils';
9
9
  import { basicSetup } from 'codemirror6';
10
10
  import { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';
11
+ import { syntaxTree } from '@codemirror/language';
11
12
  import * as i0 from "@angular/core";
12
13
  export class LibsUiComponentsPreviewTextDataComponent {
13
14
  // ==========================================================================
@@ -256,30 +257,57 @@ export class LibsUiComponentsPreviewTextDataComponent {
256
257
  }
257
258
  /**
258
259
  * Tạo SQL linter
259
- * Lazy load node-sql-parser chỉ khi cần
260
260
  */
261
261
  createSqlLinter() {
262
- return linter(async (view) => {
263
- const text = view.state.doc.toString();
262
+ return linter((view) => {
264
263
  const diagnostics = [];
265
- try {
266
- // Lazy load SQL parser chỉ khi thực sự cần
267
- const { Parser } = await import('node-sql-parser');
268
- const sqlParser = new Parser();
269
- sqlParser.astify(text);
270
- }
271
- catch (err) {
272
- diagnostics.push({
273
- from: 0,
274
- to: text.length,
275
- severity: 'error',
276
- message: get(err, 'message', ''),
277
- });
278
- }
264
+ const doc = view.state.doc;
265
+ const tree = syntaxTree(view.state);
266
+ tree.iterate({
267
+ enter: (node) => {
268
+ if (!node.type.isError)
269
+ return;
270
+ diagnostics.push({
271
+ from: Math.max(0, node.from - 1),
272
+ to: node.from,
273
+ severity: 'error',
274
+ message: this.buildSqlErrorMessage(doc, node),
275
+ });
276
+ },
277
+ });
279
278
  this.syntaxErrors.emit(diagnostics);
280
279
  return diagnostics;
281
280
  });
282
281
  }
282
+ buildSqlErrorMessage(doc, node) {
283
+ if (node.from !== node.to) {
284
+ const text = doc.sliceString(node.from, node.to);
285
+ return `SQL syntax error near "${text}"`;
286
+ }
287
+ const prevToken = this.getTokenBefore(doc, node.from);
288
+ if (!prevToken) {
289
+ return 'SQL syntax error at beginning of statement';
290
+ }
291
+ if (/FROM$/i.test(prevToken)) {
292
+ return 'Expected table name after FROM';
293
+ }
294
+ if (/SELECT$/i.test(prevToken)) {
295
+ return 'Expected column list after SELECT';
296
+ }
297
+ if (/WHERE$/i.test(prevToken)) {
298
+ return 'Expected condition after WHERE';
299
+ }
300
+ if (/\($/.test(prevToken)) {
301
+ return 'Missing closing ")"';
302
+ }
303
+ return `Unexpected end of SQL after "${prevToken}"`;
304
+ }
305
+ getTokenBefore(doc, pos) {
306
+ const start = Math.max(0, pos - 30);
307
+ const text = doc.sliceString(start, pos);
308
+ const match = text.match(/(\S+)\s*$/);
309
+ return match?.[1] ?? '';
310
+ }
283
311
  // ==========================================================================
284
312
  // PROTECTED METHODS - Event handlers
285
313
  // ==========================================================================
@@ -334,4 +362,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImpo
334
362
  type: Component,
335
363
  args: [{ selector: 'libs_ui-components-preview_text_data', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent], template: "<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n", styles: [":host ::ng-deep .libs-ui-preview-data-container{background-color:var(--background-color)!important}:host ::ng-deep .libs-ui-preview-data-container .cm-line{white-space:pre-wrap}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-error{background-color:#ff323233;border-bottom:2px solid red}:host ::ng-deep .libs-ui-preview-data-container .cm-lintRange-warning{background-color:#ffc80026}:host ::ng-deep .libs-ui-preview-data-container .cm-tooltip-lint{background:#fff8f8;color:#d32f2f;border:1px solid #f44336;padding:8px 10px;font-size:13px;font-family:Inter,sans-serif;border-radius:6px;box-shadow:0 2px 8px #ff000026}:host ::ng-deep .libs-ui-preview-data-container .cm-focused{outline:none!important}:host ::ng-deep .libs-ui-preview-data-container .cm-gutters{background-color:var(--background-color)!important}\n"] }]
336
364
  }], ctorParameters: () => [] });
337
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQzs7QUFXdkksTUFBTSxPQUFPLHdDQUF3QztJ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LGdFQUFnRTtRQUNoRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsUUFBUSxDQUFDO1lBQ2hDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxXQUFXLENBQUMsaUJBQWlCLENBQUMsRUFBRSxJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLGVBQWUsQ0FBQyxDQUFDO1NBQ3hILENBQUMsQ0FBQztRQUVILElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO1lBQ2xCLE9BQU8sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3ZCLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ3JCLFFBQVEsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQzdCLGFBQWEsRUFBRSxVQUFVO1NBQzFCLENBQUMsQ0FBQztJQUNMLENBQUM7d0dBdlhVLHdDQUF3Qzs0RkFBeEMsd0NBQXdDLGl5Q0NyQnJELHE0REF5Q0EsbzNCRHRCWSxpQ0FBaUMsaTFEQUFFLHNDQUFzQzs7NEZBRXhFLHdDQUF3QztrQkFUcEQsU0FBUzsrQkFFRSxzQ0FBc0MsY0FHcEMsSUFBSSxtQkFDQyx1QkFBdUIsQ0FBQyxNQUFNLFdBQ3RDLENBQUMsaUNBQWlDLEVBQUUsc0NBQXNDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSwgQ29tcG9uZW50LCBjb21wdXRlZCwgRGVzdHJveVJlZiwgZWZmZWN0LCBFbGVtZW50UmVmLCBpbmplY3QsIGlucHV0LCBtb2RlbCwgT25Jbml0LCBvdXRwdXQsIHNpZ25hbCwgdmlld0NoaWxkIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEaWFnbm9zdGljLCBsaW50ZXIsIGxpbnRHdXR0ZXIgfSBmcm9tICdAY29kZW1pcnJvci9saW50JztcbmltcG9ydCB7IENvbXBhcnRtZW50LCBFeHRlbnNpb24gfSBmcm9tICdAY29kZW1pcnJvci9zdGF0ZSc7XG5pbXBvcnQgeyBFZGl0b3JWaWV3LCBsaW5lTnVtYmVycywgVmlld1VwZGF0ZSB9IGZyb20gJ0Bjb2RlbWlycm9yL3ZpZXcnO1xuaW1wb3J0IHsgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uJztcbmltcG9ydCB7IElFbWl0U2VsZWN0S2V5LCBMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQgfSBmcm9tICdAbGlicy11aS9jb21wb25lbnRzLWRyb3Bkb3duJztcbmltcG9ydCB7IElMaXN0Q29uZmlnSXRlbSB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtbGlzdCc7XG5pbXBvcnQgeyBMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlIH0gZnJvbSAnQGxpYnMtdWkvc2VydmljZXMtbm90aWZpY2F0aW9uJztcbmltcG9ydCB7IGdldCB9IGZyb20gJ0BsaWJzLXVpL3V0aWxzJztcbmltcG9ydCB7IGJhc2ljU2V0dXAgfSBmcm9tICdjb2RlbWlycm9yNic7XG5pbXBvcnQgeyBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UsIGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcsIGxhbmd1YWdlUmVnaXN0cnksIG9wdGlvbnNMYW5nRGF0YSB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuZGVmaW5lJztcbmltcG9ydCB7IElQcmV2aWV3VGV4dERhdGFDaGFuZ2UsIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQgfSBmcm9tICcuL3ByZXZpZXctdGV4dC1kYXRhLmludGVyZmFjZXMnO1xuQENvbXBvbmVudCh7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAYW5ndWxhci1lc2xpbnQvY29tcG9uZW50LXNlbGVjdG9yXG4gIHNlbGVjdG9yOiAnbGlic191aS1jb21wb25lbnRzLXByZXZpZXdfdGV4dF9kYXRhJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGltcG9ydHM6IFtMaWJzVWlDb21wb25lbnRzRHJvcGRvd25Db21wb25lbnQsIExpYnNVaUNvbXBvbmVudHNCdXR0b25zQnV0dG9uQ29tcG9uZW50XSxcbn0pXG5leHBvcnQgY2xhc3MgTGlic1VpQ29tcG9uZW50c1ByZXZpZXdUZXh0RGF0YUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQWZ0ZXJWaWV3SW5pdCB7XG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgUFJPUEVSVElFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgZWRpdG9yVmlld0luc3RhbmNlPzogRWRpdG9yVmlldztcbiAgcHJpdmF0ZSByZWFkb25seSB3cmFwQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGluZU51bWJlckNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgbGludGVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcblxuICAvKiogQ2FjaGUgxJHhu4MgdHLDoW5oIGxvYWQgbOG6oWkgbGFuZ3VhZ2UgxJHDoyBsb2FkICovXG4gIHByaXZhdGUgcmVhZG9ubHkgbGFuZ3VhZ2VDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBFeHRlbnNpb24+KCk7XG5cbiAgLyoqIEZsYWcgxJHhu4MgdHLDoW5oIHVwZGF0ZSBlZGl0b3Iga2hpIMSRYW5nIGto4bufaSB04bqhbyAqL1xuICBwcml2YXRlIGlzSW5pdGlhbGl6ZWQgPSBmYWxzZTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTkpFQ1RFRCBTRVJWSUNFU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgcmVhZG9ubHkgbm90aWZpY2F0aW9uU2VydmljZSA9IGluamVjdChMaWJzVWlOb3RpZmljYXRpb25TZXJ2aWNlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBkZXN0cm95UmVmID0gaW5qZWN0KERlc3Ryb3lSZWYpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBTSUdOQUxTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGlzV3JhcCA9IHNpZ25hbDxib29sZWFuPih0cnVlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnID0gc2lnbmFsPElMaXN0Q29uZmlnSXRlbT4oaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZyh1bmRlZmluZWQpKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGxhYmVsTGFuZyA9IGNvbXB1dGVkKCgpID0+IG9wdGlvbnNMYW5nRGF0YS5maW5kKChpdGVtKSA9PiBpdGVtLmlkID09PSB0aGlzLmxhbmdTZWxlY3RlZCgpKT8ubGFiZWwpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgYWNjZXB0Q2hhbmdlTGFuZyA9IGNvbXB1dGVkKCgpID0+ICEodGhpcy5sYW5nU2VsZWN0ZWQoKSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/Lmxlbmd0aCA9PT0gMSAmJiB0aGlzLmxhbmdzQWNjZXB0KCk/LmluY2x1ZGVzKHRoaXMubGFuZ1NlbGVjdGVkKCkpKSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSU5QVVRTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcmVhZG9ubHkgY29udGVudCA9IGlucHV0PHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPignJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnJyxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgbGFuZ1NlbGVjdGVkID0gbW9kZWwucmVxdWlyZWQ8UFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVD4oKTtcbiAgcmVhZG9ubHkgbGFuZ3NBY2NlcHQgPSBpbnB1dDxBcnJheTxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPiB8IHVuZGVmaW5lZD4oKTtcblxuICByZWFkb25seSBlZGl0YWJsZSA9IGlucHV0PGJvb2xlYW4sIGJvb2xlYW4gfCB1bmRlZmluZWQ+KGZhbHNlLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBib29sZWFuKSA9PiB2YWx1ZSA/PyBmYWxzZSxcbiAgfSk7XG5cbiAgcmVhZG9ubHkgaGlkZGVuQWN0aW9uID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IGJvb2xlYW4pID0+IHZhbHVlID8/IGZhbHNlLFxuICB9KTtcblxuICByZWFkb25seSBsaW50SWdub3JlUGF0dGVybnMgPSBpbnB1dDxBcnJheTxzdHJpbmc+LCBBcnJheTxzdHJpbmc+IHwgdW5kZWZpbmVkPihbJ0Nhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudCBvdXRzaWRlIGEgbW9kdWxlJywgJ1VuZXhwZWN0ZWQgdG9rZW4gZXhwb3J0JywgJ2ltcG9ydCAnLCAnQGFuZ3VsYXIvY29yZSddLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBBcnJheTxzdHJpbmc+KSA9PiB2YWx1ZSA/PyBbJ0Nhbm5vdCB1c2UgaW1wb3J0IHN0YXRlbWVudCBvdXRzaWRlIGEgbW9kdWxlJywgJ1VuZXhwZWN0ZWQgdG9rZW4gZXhwb3J0JywgJ2ltcG9ydCAnLCAnQGFuZ3VsYXIvY29yZSddLFxuICB9KTtcblxuICByZWFkb25seSBiYWNrZ3JvdW5kID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcjZjhmOWZhJywge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogc3RyaW5nKSA9PiB2YWx1ZSA/PyAnI2Y4ZjlmYScsXG4gIH0pO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIE9VVFBVVFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBvdXRDaGFuZ2UgPSBvdXRwdXQ8SVByZXZpZXdUZXh0RGF0YUNoYW5nZT4oKTtcbiAgcmVhZG9ubHkgc3ludGF4RXJyb3JzID0gb3V0cHV0PERpYWdub3N0aWNbXT4oKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBWSUVXIENISUxEUkVOXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBjb250YWluZXJQcmV2aWV3ID0gdmlld0NoaWxkLnJlcXVpcmVkPEVsZW1lbnRSZWY8SFRNTERpdkVsZW1lbnQ+PignY29udGFpbmVyUHJldmlldycpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIENPTlNUUlVDVE9SIC0gU2V0dXAgZWZmZWN0c1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIEVmZmVjdCDEkeG7gyBzeW5jIGNvbnRlbnQgdOG7qyBpbnB1dCB2w6BvIGVkaXRvclxuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCBuZXdDb250ZW50ID0gdGhpcy5jb250ZW50KCk7XG4gICAgICBpZiAodGhpcy5pc0luaXRpYWxpemVkICYmIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2Uuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChuZXdDb250ZW50ICE9PSBjdXJyZW50Q29udGVudCkge1xuICAgICAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlLmRpc3BhdGNoKHtcbiAgICAgICAgICAgIGNoYW5nZXM6IHtcbiAgICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgICAgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCxcbiAgICAgICAgICAgICAgaW5zZXJ0OiBuZXdDb250ZW50LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gQ2xlYW51cCBraGkgY29tcG9uZW50IGLhu4sgZGVzdHJveVxuICAgIHRoaXMuZGVzdHJveVJlZi5vbkRlc3Ryb3koKCkgPT4ge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRlc3Ryb3koKTtcbiAgICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5jbGVhcigpO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gTElGRUNZQ0xFIEhPT0tTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubGFuZ3NBY2NlcHQoKT8ubGVuZ3RoKSB7XG4gICAgICB0aGlzLmNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnLnNldChodHRwUmVxdWVzdENvbmZpZ0dldE9wdGlvbnNMYW5nKHRoaXMubGFuZ3NBY2NlcHQoKSkpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIG5nQWZ0ZXJWaWV3SW5pdCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBhd2FpdCB0aGlzLmluaXRpYWxpemVFZGl0b3IoKTtcbiAgICB0aGlzLmlzSW5pdGlhbGl6ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gRWRpdG9yIGluaXRpYWxpemF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIEto4bufaSB04bqhbyBlZGl0b3IgduG7m2kgY8OhYyBleHRlbnNpb25zIGPGoSBi4bqjblxuICAgKiBMYW5ndWFnZSDEkcaw4bujYyBsb2FkIGFzeW5jIMSR4buDIHThu5FpIMawdSBidW5kbGUgc2l6ZVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBpbml0aWFsaXplRWRpdG9yKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGxhbmd1YWdlRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG4gICAgY29uc3QgbGludGVyRXh0ZW5zaW9uID0gYXdhaXQgdGhpcy5sb2FkTGludGVyRXh0ZW5zaW9uKHRoaXMubGFuZ1NlbGVjdGVkKCkpO1xuXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UgPSBuZXcgRWRpdG9yVmlldyh7XG4gICAgICBkb2M6IHRoaXMuY29udGVudCgpLFxuICAgICAgcGFyZW50OiB0aGlzLmNvbnRhaW5lclByZXZpZXcoKS5uYXRpdmVFbGVtZW50LFxuICAgICAgZXh0ZW5zaW9uczogdGhpcy5jcmVhdGVFeHRlbnNpb25zKGxhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb24pLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFThuqFvIGRhbmggc8OhY2ggZXh0ZW5zaW9ucyBjaG8gZWRpdG9yXG4gICAqL1xuICBwcml2YXRlIGNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb246IEV4dGVuc2lvbiwgbGludGVyRXh0ZW5zaW9uOiBFeHRlbnNpb24pOiBFeHRlbnNpb25bXSB7XG4gICAgcmV0dXJuIFtcbiAgICAgIGJhc2ljU2V0dXAsXG4gICAgICB0aGlzLmxhbmd1YWdlQ29tcGFydG1lbnQub2YobGFuZ3VhZ2VFeHRlbnNpb24pLFxuICAgICAgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5vZihsaW50ZXJFeHRlbnNpb24pLFxuICAgICAgdGhpcy5jcmVhdGVMaWdodFRoZW1lKCksXG4gICAgICBFZGl0b3JWaWV3LmVkaXRhYmxlLm9mKHRoaXMuZWRpdGFibGUoKSksXG4gICAgICB0aGlzLndyYXBDb21wYXJ0bWVudC5vZihFZGl0b3JWaWV3LmxpbmVXcmFwcGluZyksXG4gICAgICB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5vZihsaW5lTnVtYmVycygpKSxcbiAgICAgIGxpbnRHdXR0ZXIoKSxcbiAgICAgIHRoaXMuY3JlYXRlQnJhY2tldFRoZW1lKCksXG4gICAgICB0aGlzLmNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCksXG4gICAgXTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxhbmd1YWdlIGV4dGVuc2lvbiB24bubaSBjYWNoaW5nXG4gICAqIE3hu5dpIGxhbmd1YWdlIGNo4buJIMSRxrDhu6NjIGxvYWQgMSBs4bqnblxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGFuZ3VhZ2VFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuXG4gICAgY29uc3QgY2FjaGVkID0gdGhpcy5sYW5ndWFnZUNhY2hlLmdldChsb3dlckxhbmcpO1xuICAgIGlmIChjYWNoZWQpIHtcbiAgICAgIHJldHVybiBjYWNoZWQ7XG4gICAgfVxuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcbiAgICBjb25zdCBleHRlbnNpb24gPSByZWdpc3RyeUl0ZW0gPyBhd2FpdCByZWdpc3RyeUl0ZW0ubG9hZGVyKCkgOiBhd2FpdCBjcmVhdGVEZWZhdWx0TGFuZ3VhZ2UoKTtcblxuICAgIHRoaXMubGFuZ3VhZ2VDYWNoZS5zZXQobG93ZXJMYW5nLCBleHRlbnNpb24pO1xuICAgIHJldHVybiBleHRlbnNpb247XG4gIH1cblxuICAvKipcbiAgICogTG9hZCBsaW50ZXIgZXh0ZW5zaW9uIG7hur91IGPDs1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBsb2FkTGludGVyRXh0ZW5zaW9uKGxhbmc6IFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQpOiBQcm9taXNlPEV4dGVuc2lvbj4ge1xuICAgIGNvbnN0IGxvd2VyTGFuZyA9IGxhbmcudG9Mb3dlckNhc2UoKTtcbiAgICBjb25zdCByZWdpc3RyeUl0ZW0gPSBsYW5ndWFnZVJlZ2lzdHJ5W2xvd2VyTGFuZ107XG5cbiAgICBpZiAocmVnaXN0cnlJdGVtPy5saW50ZXIpIHtcbiAgICAgIHJldHVybiByZWdpc3RyeUl0ZW0ubGludGVyKHRoaXMpO1xuICAgIH1cblxuICAgIHJldHVybiBsaW50ZXIoKCkgPT4gW10pO1xuICB9XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBNRVRIT0RTIC0gVGhlbWUgY29uZmlndXJhdGlvblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlTGlnaHRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcmJzogeyBiYWNrZ3JvdW5kQ29sb3I6IHRoaXMuYmFja2dyb3VuZCgpLCBjb2xvcjogJyMzMzMnIH0sXG4gICAgICAnLmNtLWNvbnRlbnQnOiB7IGNhcmV0Q29sb3I6ICcjMTExJyB9LFxuICAgICAgJy5jbS1hY3RpdmVMaW5lJzogeyBiYWNrZ3JvdW5kQ29sb3I6ICcjZjBmMGYwJyB9LFxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVCcmFja2V0VGhlbWUoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy50aGVtZSh7XG4gICAgICAnLmNtLW1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgxMDAsIDIwMCwgMjU1LCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDEwMCwgMjAwLCAyNTUsIDAuNCknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgICB0cmFuc2l0aW9uOiAnYWxsIDAuMnMgZWFzZScsXG4gICAgICB9LFxuICAgICAgJy5jbS1ub25tYXRjaGluZ0JyYWNrZXQnOiB7XG4gICAgICAgIGJhY2tncm91bmRDb2xvcjogJ3JnYmEoMjU1LCAxMDAsIDEwMCwgMC4xNSknLFxuICAgICAgICBib3JkZXI6ICcxcHggc29saWQgcmdiYSgyNTUsIDEwMCwgMTAwLCAwLjMpJyxcbiAgICAgICAgYm9yZGVyUmFkaXVzOiAnM3B4JyxcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBVcGRhdGUgbGlzdGVuZXJcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIGNyZWF0ZVVwZGF0ZUxpc3RlbmVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudXBkYXRlTGlzdGVuZXIub2YoKHVwZGF0ZTogVmlld1VwZGF0ZSkgPT4ge1xuICAgICAgaWYgKHVwZGF0ZS5kb2NDaGFuZ2VkICYmIHRoaXMuZWRpdGFibGUoKSkge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IHVwZGF0ZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgdGhpcy5vdXRDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgY29udGVudDogbmV3VmFsdWUsXG4gICAgICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgICAgIGxhbmd1YWdlOiB0aGlzLmxhbmdTZWxlY3RlZCgpLFxuICAgICAgICAgIGNvbnRleHRDaGFuZ2U6ICdjb250ZW50JyxcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQVUJMSUMgTUVUSE9EUyAtIExpbnRlciBmYWN0b3JpZXMgKMSRxrDhu6NjIGfhu41pIHThu6sgcmVnaXN0cnkpXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgLyoqXG4gICAqIFThuqFvIEphdmFTY3JpcHQgbGludGVyXG4gICAqIFPhu60gZOG7pW5nIEZ1bmN0aW9uIGNvbnN0cnVjdG9yIMSR4buDIHZhbGlkYXRlIHN5bnRheFxuICAgKi9cbiAgY3JlYXRlSnNMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCB0ZXh0ID0gdmlldy5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgIGNvbnN0IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gPSBbXTtcblxuICAgICAgdHJ5IHtcbiAgICAgICAgbmV3IEZ1bmN0aW9uKHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBnZXQoZXJyLCAnbWVzc2FnZScsICcnKTtcbiAgICAgICAgY29uc3Qgc2hvdWxkSWdub3JlID0gdGhpcy5saW50SWdub3JlUGF0dGVybnMoKS5zb21lKChwYXR0ZXJuKSA9PiBtZXNzYWdlLmluY2x1ZGVzKHBhdHRlcm4pKTtcblxuICAgICAgICBpZiAoIXNob3VsZElnbm9yZSkge1xuICAgICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICAgIHRvOiB0ZXh0Lmxlbmd0aCxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gSlNPTiBsaW50ZXJcbiAgICogU+G7rSBk4bulbmcgSlNPTi5wYXJzZSDEkeG7gyB2YWxpZGF0ZVxuICAgKi9cbiAgY3JlYXRlSnNvbkxpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBKU09OLnBhcnNlKHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGdldChlcnIsICdtZXNzYWdlJywgJycpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gU1FMIGxpbnRlclxuICAgKiBMYXp5IGxvYWQgbm9kZS1zcWwtcGFyc2VyIGNo4buJIGtoaSBj4bqnblxuICAgKi9cbiAgY3JlYXRlU3FsTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcihhc3luYyAodmlldykgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIExhenkgbG9hZCBTUUwgcGFyc2VyIGNo4buJIGtoaSB0aOG7sWMgc+G7sSBj4bqnblxuICAgICAgICBjb25zdCB7IFBhcnNlciB9ID0gYXdhaXQgaW1wb3J0KCdub2RlLXNxbC1wYXJzZXInKTtcbiAgICAgICAgY29uc3Qgc3FsUGFyc2VyID0gbmV3IFBhcnNlcigpO1xuICAgICAgICBzcWxQYXJzZXIuYXN0aWZ5KHRleHQpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIGRpYWdub3N0aWNzLnB1c2goe1xuICAgICAgICAgIGZyb206IDAsXG4gICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgIG1lc3NhZ2U6IGdldChlcnIsICdtZXNzYWdlJywgJycpLFxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgdGhpcy5zeW50YXhFcnJvcnMuZW1pdChkaWFnbm9zdGljcyk7XG4gICAgICByZXR1cm4gZGlhZ25vc3RpY3M7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUk9URUNURUQgTUVUSE9EUyAtIEV2ZW50IGhhbmRsZXJzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJDb3B5KCk6IHZvaWQge1xuICAgIG5hdmlnYXRvci5jbGlwYm9hcmQud3JpdGVUZXh0KHRoaXMuY29udGVudCgpIHx8ICcnKTtcbiAgICB0aGlzLm5vdGlmaWNhdGlvblNlcnZpY2Uuc2hvd0NvbXBUeXBlVGV4dEluZm8oJ1NhbyBjaMOpcCB0aMOgbmggY8O0bmcnKTtcbiAgfVxuXG4gIHByb3RlY3RlZCBoYW5kbGVyTGluZVdyYXAoKTogdm9pZCB7XG4gICAgLy8gTOG6pXkgbuG7mWkgZHVuZyBt4bubaSBuaOG6pXQgdOG7qyBlZGl0b3Igc2F1IGtoaSDEkcOjIHjDs2EgbmV3bGluZXNcbiAgICBjb25zdCBjdXJyZW50Q29udGVudCA9IHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5zdGF0ZS5kb2MudG9TdHJpbmcoKSB8fCAnJztcbiAgICBjb25zdCB1cGRhdGVkQ29udGVudCA9IHRoaXMuaXNXcmFwKCkgJiYgY3VycmVudENvbnRlbnQgPyBjdXJyZW50Q29udGVudC5yZXBsYWNlKC9cXG4vZywgJyAnKSA6IHRoaXMuY29udGVudCgpO1xuICAgIHRoaXMuaXNXcmFwLnVwZGF0ZSgodmFsKSA9PiAhdmFsKTtcblxuICAgIGlmIChjdXJyZW50Q29udGVudCAhPT0gdXBkYXRlZENvbnRlbnQpIHtcbiAgICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICAgIGNoYW5nZXM6IHsgZnJvbTogMCwgdG86IGN1cnJlbnRDb250ZW50Lmxlbmd0aCwgaW5zZXJ0OiB1cGRhdGVkQ29udGVudCB9LFxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gQmF0Y2ggY+G6oyAyIGRpc3BhdGNoIHRow6BuaCAxIMSR4buDIHThu5FpIMawdSBwZXJmb3JtYW5jZVxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy53cmFwQ29tcGFydG1lbnQucmVjb25maWd1cmUodGhpcy5pc1dyYXAoKSA/IEVkaXRvclZpZXcubGluZVdyYXBwaW5nIDogW10pLCB0aGlzLmxpbmVOdW1iZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gbGluZU51bWJlcnMoKSA6IFtdKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHVwZGF0ZWRDb250ZW50LFxuICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICBjb250ZXh0Q2hhbmdlOiAnaXNXcmFwJyxcbiAgICB9KTtcbiAgfVxuXG4gIHByb3RlY3RlZCBhc3luYyBoYW5kbGVyU2VsZWN0S2V5KGRhdGE/OiBJRW1pdFNlbGVjdEtleSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghZGF0YT8ua2V5KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3QgbmV3TGFuZyA9IGRhdGEua2V5IGFzIFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ7XG4gICAgdGhpcy5sYW5nU2VsZWN0ZWQuc2V0KG5ld0xhbmcpO1xuXG4gICAgLy8gTG9hZCBsYW5ndWFnZSB2w6AgbGludGVyIG3hu5tpXG4gICAgY29uc3QgW2xhbmd1YWdlRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb25dID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMubG9hZExhbmd1YWdlRXh0ZW5zaW9uKG5ld0xhbmcpLCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24obmV3TGFuZyldKTtcblxuICAgIC8vIFJlY29uZmlndXJlIHRoYXkgdsOsIHThuqFvIG3hu5tpIHN0YXRlIMSR4buDIGdp4buvIGzhuqFpIGRvY3VtZW50IGNvbnRlbnRcbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGlzcGF0Y2goe1xuICAgICAgZWZmZWN0czogW3RoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsYW5ndWFnZUV4dGVuc2lvbiksIHRoaXMubGludGVyQ29tcGFydG1lbnQucmVjb25maWd1cmUobGludGVyRXh0ZW5zaW9uKV0sXG4gICAgfSk7XG5cbiAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgIGNvbnRlbnQ6IHRoaXMuY29udGVudCgpLFxuICAgICAgaXNXcmFwOiB0aGlzLmlzV3JhcCgpLFxuICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICBjb250ZXh0Q2hhbmdlOiAnbGFuZ3VhZ2UnLFxuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2XG4gIGNsYXNzPVwibGlicy11aS1wcmV2aWV3LWRhdGEtY29udGFpbmVyIGZsZXggZmxleC1jb2wgdy1mdWxsIGgtYXV0byByb3VuZGVkLVs4cHhdIGxpYnMtdWktYm9yZGVyLWdlbmVyYWwgcHgtWzhweF1cIlxuICBbc3R5bGUuLS1iYWNrZ3JvdW5kLWNvbG9yXT1cImJhY2tncm91bmQoKVwiXG4gIFtjbGFzcy5wdC1bOHB4XV09XCIhaGlkZGVuQWN0aW9uKClcIj5cbiAgQGlmICghaGlkZGVuQWN0aW9uKCkpIHtcbiAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXIgY29udGVudC1iZXR3ZWVuIGNvbG9yLVsjNmE3MzgzXVwiPlxuICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1kcm9wZG93blxuICAgICAgICBjbGFzc0luY2x1ZGU9XCJ3LVsyMDBweF1cIlxuICAgICAgICBbbGlzdENvbmZpZ109XCJjb25maWdMb2FkRGF0YUlzSHR0cENvbmZpZygpXCJcbiAgICAgICAgW2xpc3RNYXhJdGVtU2hvd109XCI1XCJcbiAgICAgICAgW2lzTmdDb250ZW50XT1cInRydWVcIlxuICAgICAgICBbcmVhZG9ubHldPVwiIWVkaXRhYmxlKCkgfHwgIWFjY2VwdENoYW5nZUxhbmcoKVwiXG4gICAgICAgIFtsaXN0SGFzQnV0dG9uVW5TZWxlY3RPcHRpb25dPVwiZmFsc2VcIlxuICAgICAgICAob3V0U2VsZWN0S2V5KT1cImhhbmRsZXJTZWxlY3RLZXkoJGV2ZW50KVwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cImxhYmVsTGFuZygpIHx8ICcnXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uUmlnaHRdPVwiZWRpdGFibGUoKSAmJiBhY2NlcHRDaGFuZ2VMYW5nKCkgPyAnbGlicy11aS1pY29uLW1vdmUtcmlnaHQgcm90YXRlLTkwJyA6ICcnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIichcC1bMHB4XScgKyAoZWRpdGFibGUoKSAmJiBhY2NlcHRDaGFuZ2VMYW5nKCkgPyAnJyA6ICchcG9pbnRlci1ldmVudHMtbm9uZSAhY3Vyc29yLWRlZmF1bHQgaG92ZXI6IXRleHQtWyM2QTczODNdJylcIiAvPlxuICAgICAgPC9saWJzX3VpLWNvbXBvbmVudHMtZHJvcGRvd24+XG4gICAgICA8ZGl2IGNsYXNzPVwiZmxleCBpdGVtcy1jZW50ZXJcIj5cbiAgICAgICAgPGxpYnNfdWktY29tcG9uZW50cy1idXR0b25zLWJ1dHRvblxuICAgICAgICAgIFt0eXBlXT1cIididXR0b24tbGluay10aGlyZCdcIlxuICAgICAgICAgIFtsYWJlbF09XCJpc1dyYXAoKSA/ICdpMThuX3JlbW92ZV9saW5lX3dyYXAnIDogJ2kxOG5fbGluZV93cmFwJ1wiXG4gICAgICAgICAgW3NpemVCdXR0b25dPVwiJ3NtYWxsJ1wiXG4gICAgICAgICAgW2NsYXNzSWNvbkxlZnRdPVwiaXNXcmFwKCkgPyAnbGlicy11aS1pY29uLXVud3JhcCcgOiAnbGlicy11aS1pY29uLXdyYXAnXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtby1saWItcC0wcHggbW8tbGliLW1yLTE2cHgnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckxpbmVXcmFwKClcIiAvPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cIidpMThuX2NvcHknXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCInbGlicy11aS1pY29uLWNvcHknXCJcbiAgICAgICAgICBbY2xhc3NJbmNsdWRlXT1cIidtby1saWItcC0wcHgnXCJcbiAgICAgICAgICAob3V0Q2xpY2spPVwiaGFuZGxlckNvcHkoKVwiIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgfVxuICA8ZGl2ICNjb250YWluZXJQcmV2aWV3PjwvZGl2PlxuPC9kaXY+XG4iXX0=
365
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy11aS9jb21wb25lbnRzL3ByZXZpZXctdGV4dC1kYXRhL3NyYy9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9saWJzLXVpL2NvbXBvbmVudHMvcHJldmlldy10ZXh0LWRhdGEvc3JjL3ByZXZpZXctdGV4dC1kYXRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsdUJBQXVCLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFjLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFVLE1BQU0sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JMLE9BQU8sRUFBYyxNQUFNLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDbEUsT0FBTyxFQUFFLFdBQVcsRUFBYSxNQUFNLG1CQUFtQixDQUFDO0FBQzNELE9BQU8sRUFBRSxVQUFVLEVBQUUsV0FBVyxFQUFjLE1BQU0sa0JBQWtCLENBQUM7QUFDdkUsT0FBTyxFQUFFLHNDQUFzQyxFQUFFLE1BQU0sb0NBQW9DLENBQUM7QUFDNUYsT0FBTyxFQUFrQixpQ0FBaUMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBRWpHLE9BQU8sRUFBRSx5QkFBeUIsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzNFLE9BQU8sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNyQyxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSwrQkFBK0IsRUFBRSxnQkFBZ0IsRUFBRSxlQUFlLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUV2SSxPQUFPLEVBQUUsVUFBVSxFQUFF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QyxDQUFDO1FBRS9CLDhCQUE4QjtRQUM5QixNQUFNLENBQUMsaUJBQWlCLEVBQUUsZUFBZSxDQUFDLEdBQUcsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLE9BQU8sQ0FBQyxFQUFFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFFekksZ0VBQWdFO1FBQ2hFLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxRQUFRLENBQUM7WUFDaEMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLG1CQUFtQixDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsZUFBZSxDQUFDLENBQUM7U0FDeEgsQ0FBQyxDQUFDO1FBRUgsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUM7WUFDbEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUU7WUFDdkIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDckIsUUFBUSxFQUFFLElBQUksQ0FBQyxZQUFZLEVBQUU7WUFDN0IsYUFBYSxFQUFFLFVBQVU7U0FDMUIsQ0FBQyxDQUFDO0lBQ0wsQ0FBQzt3R0E3WlUsd0NBQXdDOzRGQUF4Qyx3Q0FBd0MsaXlDQ3pCckQscTREQXlDQSxvM0JEbEJZLGlDQUFpQyxpMURBQUUsc0NBQXNDOzs0RkFFeEUsd0NBQXdDO2tCQVRwRCxTQUFTOytCQUVFLHNDQUFzQyxjQUdwQyxJQUFJLG1CQUNDLHVCQUF1QixDQUFDLE1BQU0sV0FDdEMsQ0FBQyxpQ0FBaUMsRUFBRSxzQ0FBc0MsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEFmdGVyVmlld0luaXQsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIGNvbXB1dGVkLCBEZXN0cm95UmVmLCBlZmZlY3QsIEVsZW1lbnRSZWYsIGluamVjdCwgaW5wdXQsIG1vZGVsLCBPbkluaXQsIG91dHB1dCwgc2lnbmFsLCB2aWV3Q2hpbGQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IERpYWdub3N0aWMsIGxpbnRlciwgbGludEd1dHRlciB9IGZyb20gJ0Bjb2RlbWlycm9yL2xpbnQnO1xuaW1wb3J0IHsgQ29tcGFydG1lbnQsIEV4dGVuc2lvbiB9IGZyb20gJ0Bjb2RlbWlycm9yL3N0YXRlJztcbmltcG9ydCB7IEVkaXRvclZpZXcsIGxpbmVOdW1iZXJzLCBWaWV3VXBkYXRlIH0gZnJvbSAnQGNvZGVtaXJyb3Ivdmlldyc7XG5pbXBvcnQgeyBMaWJzVWlDb21wb25lbnRzQnV0dG9uc0J1dHRvbkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtYnV0dG9ucy1idXR0b24nO1xuaW1wb3J0IHsgSUVtaXRTZWxlY3RLZXksIExpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCB9IGZyb20gJ0BsaWJzLXVpL2NvbXBvbmVudHMtZHJvcGRvd24nO1xuaW1wb3J0IHsgSUxpc3RDb25maWdJdGVtIH0gZnJvbSAnQGxpYnMtdWkvY29tcG9uZW50cy1saXN0JztcbmltcG9ydCB7IExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UgfSBmcm9tICdAbGlicy11aS9zZXJ2aWNlcy1ub3RpZmljYXRpb24nO1xuaW1wb3J0IHsgZ2V0IH0gZnJvbSAnQGxpYnMtdWkvdXRpbHMnO1xuaW1wb3J0IHsgYmFzaWNTZXR1cCB9IGZyb20gJ2NvZGVtaXJyb3I2JztcbmltcG9ydCB7IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSwgaHR0cFJlcXVlc3RDb25maWdHZXRPcHRpb25zTGFuZywgbGFuZ3VhZ2VSZWdpc3RyeSwgb3B0aW9uc0xhbmdEYXRhIH0gZnJvbSAnLi9wcmV2aWV3LXRleHQtZGF0YS5kZWZpbmUnO1xuaW1wb3J0IHsgSVByZXZpZXdUZXh0RGF0YUNoYW5nZSwgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCB9IGZyb20gJy4vcHJldmlldy10ZXh0LWRhdGEuaW50ZXJmYWNlcyc7XG5pbXBvcnQgeyBzeW50YXhUcmVlIH0gZnJvbSAnQGNvZGVtaXJyb3IvbGFuZ3VhZ2UnO1xuaW1wb3J0IHR5cGUgeyBTeW50YXhOb2RlUmVmIH0gZnJvbSAnQGxlemVyL2NvbW1vbic7XG5pbXBvcnQgeyBUZXh0IH0gZnJvbSAnQGNvZGVtaXJyb3Ivc3RhdGUnO1xuXG5AQ29tcG9uZW50KHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBhbmd1bGFyLWVzbGludC9jb21wb25lbnQtc2VsZWN0b3JcbiAgc2VsZWN0b3I6ICdsaWJzX3VpLWNvbXBvbmVudHMtcHJldmlld190ZXh0X2RhdGEnLFxuICB0ZW1wbGF0ZVVybDogJy4vcHJldmlldy10ZXh0LWRhdGEuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9wcmV2aWV3LXRleHQtZGF0YS5jb21wb25lbnQuc2NzcyddLFxuICBzdGFuZGFsb25lOiB0cnVlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgaW1wb3J0czogW0xpYnNVaUNvbXBvbmVudHNEcm9wZG93bkNvbXBvbmVudCwgTGlic1VpQ29tcG9uZW50c0J1dHRvbnNCdXR0b25Db21wb25lbnRdLFxufSlcbmV4cG9ydCBjbGFzcyBMaWJzVWlDb21wb25lbnRzUHJldmlld1RleHREYXRhQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBBZnRlclZpZXdJbml0IHtcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJJVkFURSBQUk9QRVJUSUVTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBlZGl0b3JWaWV3SW5zdGFuY2U/OiBFZGl0b3JWaWV3O1xuICBwcml2YXRlIHJlYWRvbmx5IHdyYXBDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxhbmd1YWdlQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW5lTnVtYmVyQ29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnQoKTtcbiAgcHJpdmF0ZSByZWFkb25seSBsaW50ZXJDb21wYXJ0bWVudCA9IG5ldyBDb21wYXJ0bWVudCgpO1xuXG4gIC8qKiBDYWNoZSDEkeG7gyB0csOhbmggbG9hZCBs4bqhaSBsYW5ndWFnZSDEkcOjIGxvYWQgKi9cbiAgcHJpdmF0ZSByZWFkb25seSBsYW5ndWFnZUNhY2hlID0gbmV3IE1hcDxzdHJpbmcsIEV4dGVuc2lvbj4oKTtcblxuICAvKiogRmxhZyDEkeG7gyB0csOhbmggdXBkYXRlIGVkaXRvciBraGkgxJFhbmcga2jhu59pIHThuqFvICovXG4gIHByaXZhdGUgaXNJbml0aWFsaXplZCA9IGZhbHNlO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElOSkVDVEVEIFNFUlZJQ0VTXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSByZWFkb25seSBub3RpZmljYXRpb25TZXJ2aWNlID0gaW5qZWN0KExpYnNVaU5vdGlmaWNhdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IGRlc3Ryb3lSZWYgPSBpbmplY3QoRGVzdHJveVJlZik7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gUFJPVEVDVEVEIFNJR05BTFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaXNXcmFwID0gc2lnbmFsPGJvb2xlYW4+KHRydWUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcgPSBzaWduYWw8SUxpc3RDb25maWdJdGVtPihodHRwUmVxdWVzdENvbmZpZ0dldE9wdGlvbnNMYW5nKHVuZGVmaW5lZCkpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgbGFiZWxMYW5nID0gY29tcHV0ZWQoKCkgPT4gb3B0aW9uc0xhbmdEYXRhLmZpbmQoKGl0ZW0pID0+IGl0ZW0uaWQgPT09IHRoaXMubGFuZ1NlbGVjdGVkKCkpPy5sYWJlbCk7XG4gIHByb3RlY3RlZCByZWFkb25seSBhY2NlcHRDaGFuZ2VMYW5nID0gY29tcHV0ZWQoKCkgPT4gISh0aGlzLmxhbmdTZWxlY3RlZCgpICYmIHRoaXMubGFuZ3NBY2NlcHQoKT8ubGVuZ3RoID09PSAxICYmIHRoaXMubGFuZ3NBY2NlcHQoKT8uaW5jbHVkZXModGhpcy5sYW5nU2VsZWN0ZWQoKSkpKTtcblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJTlBVVFNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICByZWFkb25seSBjb250ZW50ID0gaW5wdXQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+KCcnLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcnLFxuICB9KTtcblxuICByZWFkb25seSBsYW5nU2VsZWN0ZWQgPSBtb2RlbC5yZXF1aXJlZDxQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUPigpO1xuICByZWFkb25seSBsYW5nc0FjY2VwdCA9IGlucHV0PEFycmF5PFBSRVZJRVdfVEVYVF9EQVRBX0xBTkdVQUdFX1NVUFBPUlQ+IHwgdW5kZWZpbmVkPigpO1xuXG4gIHJlYWRvbmx5IGVkaXRhYmxlID0gaW5wdXQ8Ym9vbGVhbiwgYm9vbGVhbiB8IHVuZGVmaW5lZD4oZmFsc2UsIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IGJvb2xlYW4pID0+IHZhbHVlID8/IGZhbHNlLFxuICB9KTtcblxuICByZWFkb25seSBoaWRkZW5BY3Rpb24gPSBpbnB1dDxib29sZWFuLCBib29sZWFuIHwgdW5kZWZpbmVkPihmYWxzZSwge1xuICAgIHRyYW5zZm9ybTogKHZhbHVlPzogYm9vbGVhbikgPT4gdmFsdWUgPz8gZmFsc2UsXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGxpbnRJZ25vcmVQYXR0ZXJucyA9IGlucHV0PEFycmF5PHN0cmluZz4sIEFycmF5PHN0cmluZz4gfCB1bmRlZmluZWQ+KFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sIHtcbiAgICB0cmFuc2Zvcm06ICh2YWx1ZT86IEFycmF5PHN0cmluZz4pID0+IHZhbHVlID8/IFsnQ2Fubm90IHVzZSBpbXBvcnQgc3RhdGVtZW50IG91dHNpZGUgYSBtb2R1bGUnLCAnVW5leHBlY3RlZCB0b2tlbiBleHBvcnQnLCAnaW1wb3J0ICcsICdAYW5ndWxhci9jb3JlJ10sXG4gIH0pO1xuXG4gIHJlYWRvbmx5IGJhY2tncm91bmQgPSBpbnB1dDxzdHJpbmcsIHN0cmluZyB8IHVuZGVmaW5lZD4oJyNmOGY5ZmEnLCB7XG4gICAgdHJhbnNmb3JtOiAodmFsdWU/OiBzdHJpbmcpID0+IHZhbHVlID8/ICcjZjhmOWZhJyxcbiAgfSk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gT1VUUFVUU1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHJlYWRvbmx5IG91dENoYW5nZSA9IG91dHB1dDxJUHJldmlld1RleHREYXRhQ2hhbmdlPigpO1xuICByZWFkb25seSBzeW50YXhFcnJvcnMgPSBvdXRwdXQ8RGlhZ25vc3RpY1tdPigpO1xuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFZJRVcgQ0hJTERSRU5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcml2YXRlIHJlYWRvbmx5IGNvbnRhaW5lclByZXZpZXcgPSB2aWV3Q2hpbGQucmVxdWlyZWQ8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+KCdjb250YWluZXJQcmV2aWV3Jyk7XG5cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gQ09OU1RSVUNUT1IgLSBTZXR1cCBlZmZlY3RzXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgLy8gRWZmZWN0IMSR4buDIHN5bmMgY29udGVudCB04burIGlucHV0IHbDoG8gZWRpdG9yXG4gICAgZWZmZWN0KCgpID0+IHtcbiAgICAgIGNvbnN0IG5ld0NvbnRlbnQgPSB0aGlzLmNvbnRlbnQoKTtcbiAgICAgIGlmICh0aGlzLmlzSW5pdGlhbGl6ZWQgJiYgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UpIHtcbiAgICAgICAgY29uc3QgY3VycmVudENvbnRlbnQgPSB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZS5zdGF0ZS5kb2MudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKG5ld0NvbnRlbnQgIT09IGN1cnJlbnRDb250ZW50KSB7XG4gICAgICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2UuZGlzcGF0Y2goe1xuICAgICAgICAgICAgY2hhbmdlczoge1xuICAgICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgICB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLFxuICAgICAgICAgICAgICBpbnNlcnQ6IG5ld0NvbnRlbnQsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBDbGVhbnVwIGtoaSBjb21wb25lbnQgYuG7iyBkZXN0cm95XG4gICAgdGhpcy5kZXN0cm95UmVmLm9uRGVzdHJveSgoKSA9PiB7XG4gICAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgdGhpcy5sYW5ndWFnZUNhY2hlLmNsZWFyKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBMSUZFQ1lDTEUgSE9PS1NcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5sYW5nc0FjY2VwdCgpPy5sZW5ndGgpIHtcbiAgICAgIHRoaXMuY29uZmlnTG9hZERhdGFJc0h0dHBDb25maWcuc2V0KGh0dHBSZXF1ZXN0Q29uZmlnR2V0T3B0aW9uc0xhbmcodGhpcy5sYW5nc0FjY2VwdCgpKSk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgbmdBZnRlclZpZXdJbml0KCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMuaW5pdGlhbGl6ZUVkaXRvcigpO1xuICAgIHRoaXMuaXNJbml0aWFsaXplZCA9IHRydWU7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBFZGl0b3IgaW5pdGlhbGl6YXRpb25cbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogS2jhu59pIHThuqFvIGVkaXRvciB24bubaSBjw6FjIGV4dGVuc2lvbnMgY8ahIGLhuqNuXG4gICAqIExhbmd1YWdlIMSRxrDhu6NjIGxvYWQgYXN5bmMgxJHhu4MgdOG7kWkgxrB1IGJ1bmRsZSBzaXplXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGluaXRpYWxpemVFZGl0b3IoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgbGFuZ3VhZ2VFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMYW5ndWFnZUV4dGVuc2lvbih0aGlzLmxhbmdTZWxlY3RlZCgpKTtcbiAgICBjb25zdCBsaW50ZXJFeHRlbnNpb24gPSBhd2FpdCB0aGlzLmxvYWRMaW50ZXJFeHRlbnNpb24odGhpcy5sYW5nU2VsZWN0ZWQoKSk7XG5cbiAgICB0aGlzLmVkaXRvclZpZXdJbnN0YW5jZSA9IG5ldyBFZGl0b3JWaWV3KHtcbiAgICAgIGRvYzogdGhpcy5jb250ZW50KCksXG4gICAgICBwYXJlbnQ6IHRoaXMuY29udGFpbmVyUHJldmlldygpLm5hdGl2ZUVsZW1lbnQsXG4gICAgICBleHRlbnNpb25zOiB0aGlzLmNyZWF0ZUV4dGVuc2lvbnMobGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbiksXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVOG6oW8gZGFuaCBzw6FjaCBleHRlbnNpb25zIGNobyBlZGl0b3JcbiAgICovXG4gIHByaXZhdGUgY3JlYXRlRXh0ZW5zaW9ucyhsYW5ndWFnZUV4dGVuc2lvbjogRXh0ZW5zaW9uLCBsaW50ZXJFeHRlbnNpb246IEV4dGVuc2lvbik6IEV4dGVuc2lvbltdIHtcbiAgICByZXR1cm4gW1xuICAgICAgYmFzaWNTZXR1cCxcbiAgICAgIHRoaXMubGFuZ3VhZ2VDb21wYXJ0bWVudC5vZihsYW5ndWFnZUV4dGVuc2lvbiksXG4gICAgICB0aGlzLmxpbnRlckNvbXBhcnRtZW50Lm9mKGxpbnRlckV4dGVuc2lvbiksXG4gICAgICB0aGlzLmNyZWF0ZUxpZ2h0VGhlbWUoKSxcbiAgICAgIEVkaXRvclZpZXcuZWRpdGFibGUub2YodGhpcy5lZGl0YWJsZSgpKSxcbiAgICAgIHRoaXMud3JhcENvbXBhcnRtZW50Lm9mKEVkaXRvclZpZXcubGluZVdyYXBwaW5nKSxcbiAgICAgIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50Lm9mKGxpbmVOdW1iZXJzKCkpLFxuICAgICAgbGludEd1dHRlcigpLFxuICAgICAgdGhpcy5jcmVhdGVCcmFja2V0VGhlbWUoKSxcbiAgICAgIHRoaXMuY3JlYXRlVXBkYXRlTGlzdGVuZXIoKSxcbiAgICBdO1xuICB9XG5cbiAgLyoqXG4gICAqIExvYWQgbGFuZ3VhZ2UgZXh0ZW5zaW9uIHbhu5tpIGNhY2hpbmdcbiAgICogTeG7l2kgbGFuZ3VhZ2UgY2jhu4kgxJHGsOG7o2MgbG9hZCAxIGzhuqduXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRMYW5ndWFnZUV4dGVuc2lvbihsYW5nOiBQUkVWSUVXX1RFWFRfREFUQV9MQU5HVUFHRV9TVVBQT1JUKTogUHJvbWlzZTxFeHRlbnNpb24+IHtcbiAgICBjb25zdCBsb3dlckxhbmcgPSBsYW5nLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBjb25zdCBjYWNoZWQgPSB0aGlzLmxhbmd1YWdlQ2FjaGUuZ2V0KGxvd2VyTGFuZyk7XG4gICAgaWYgKGNhY2hlZCkge1xuICAgICAgcmV0dXJuIGNhY2hlZDtcbiAgICB9XG4gICAgY29uc3QgcmVnaXN0cnlJdGVtID0gbGFuZ3VhZ2VSZWdpc3RyeVtsb3dlckxhbmddO1xuICAgIGNvbnN0IGV4dGVuc2lvbiA9IHJlZ2lzdHJ5SXRlbSA/IGF3YWl0IHJlZ2lzdHJ5SXRlbS5sb2FkZXIoKSA6IGF3YWl0IGNyZWF0ZURlZmF1bHRMYW5ndWFnZSgpO1xuXG4gICAgdGhpcy5sYW5ndWFnZUNhY2hlLnNldChsb3dlckxhbmcsIGV4dGVuc2lvbik7XG4gICAgcmV0dXJuIGV4dGVuc2lvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBMb2FkIGxpbnRlciBleHRlbnNpb24gbuG6v3UgY8OzXG4gICAqL1xuICBwcml2YXRlIGFzeW5jIGxvYWRMaW50ZXJFeHRlbnNpb24obGFuZzogUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVCk6IFByb21pc2U8RXh0ZW5zaW9uPiB7XG4gICAgY29uc3QgbG93ZXJMYW5nID0gbGFuZy50b0xvd2VyQ2FzZSgpO1xuICAgIGNvbnN0IHJlZ2lzdHJ5SXRlbSA9IGxhbmd1YWdlUmVnaXN0cnlbbG93ZXJMYW5nXTtcblxuICAgIGlmIChyZWdpc3RyeUl0ZW0/LmxpbnRlcikge1xuICAgICAgcmV0dXJuIHJlZ2lzdHJ5SXRlbS5saW50ZXIodGhpcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpbnRlcigoKSA9PiBbXSk7XG4gIH1cblxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBQUklWQVRFIE1FVEhPRFMgLSBUaGVtZSBjb25maWd1cmF0aW9uXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgcHJpdmF0ZSBjcmVhdGVMaWdodFRoZW1lKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIEVkaXRvclZpZXcudGhlbWUoe1xuICAgICAgJyYnOiB7IGJhY2tncm91bmRDb2xvcjogdGhpcy5iYWNrZ3JvdW5kKCksIGNvbG9yOiAnIzMzMycgfSxcbiAgICAgICcuY20tY29udGVudCc6IHsgY2FyZXRDb2xvcjogJyMxMTEnIH0sXG4gICAgICAnLmNtLWFjdGl2ZUxpbmUnOiB7IGJhY2tncm91bmRDb2xvcjogJyNmMGYwZjAnIH0sXG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGNyZWF0ZUJyYWNrZXRUaGVtZSgpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBFZGl0b3JWaWV3LnRoZW1lKHtcbiAgICAgICcuY20tbWF0Y2hpbmdCcmFja2V0Jzoge1xuICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6ICdyZ2JhKDEwMCwgMjAwLCAyNTUsIDAuMTUpJyxcbiAgICAgICAgYm9yZGVyOiAnMXB4IHNvbGlkIHJnYmEoMTAwLCAyMDAsIDI1NSwgMC40KScsXG4gICAgICAgIGJvcmRlclJhZGl1czogJzNweCcsXG4gICAgICAgIHRyYW5zaXRpb246ICdhbGwgMC4ycyBlYXNlJyxcbiAgICAgIH0sXG4gICAgICAnLmNtLW5vbm1hdGNoaW5nQnJhY2tldCc6IHtcbiAgICAgICAgYmFja2dyb3VuZENvbG9yOiAncmdiYSgyNTUsIDEwMCwgMTAwLCAwLjE1KScsXG4gICAgICAgIGJvcmRlcjogJzFweCBzb2xpZCByZ2JhKDI1NSwgMTAwLCAxMDAsIDAuMyknLFxuICAgICAgICBib3JkZXJSYWRpdXM6ICczcHgnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBSSVZBVEUgTUVUSE9EUyAtIFVwZGF0ZSBsaXN0ZW5lclxuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIHByaXZhdGUgY3JlYXRlVXBkYXRlTGlzdGVuZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gRWRpdG9yVmlldy51cGRhdGVMaXN0ZW5lci5vZigodXBkYXRlOiBWaWV3VXBkYXRlKSA9PiB7XG4gICAgICBpZiAodXBkYXRlLmRvY0NoYW5nZWQgJiYgdGhpcy5lZGl0YWJsZSgpKSB7XG4gICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdXBkYXRlLnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgICB0aGlzLm91dENoYW5nZS5lbWl0KHtcbiAgICAgICAgICBjb250ZW50OiBuZXdWYWx1ZSxcbiAgICAgICAgICBpc1dyYXA6IHRoaXMuaXNXcmFwKCksXG4gICAgICAgICAgbGFuZ3VhZ2U6IHRoaXMubGFuZ1NlbGVjdGVkKCksXG4gICAgICAgICAgY29udGV4dENoYW5nZTogJ2NvbnRlbnQnLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBVQkxJQyBNRVRIT0RTIC0gTGludGVyIGZhY3RvcmllcyAoxJHGsOG7o2MgZ+G7jWkgdOG7qyByZWdpc3RyeSlcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogVOG6oW8gSmF2YVNjcmlwdCBsaW50ZXJcbiAgICogU+G7rSBk4bulbmcgRnVuY3Rpb24gY29uc3RydWN0b3IgxJHhu4MgdmFsaWRhdGUgc3ludGF4XG4gICAqL1xuICBjcmVhdGVKc0xpbnRlcigpOiBFeHRlbnNpb24ge1xuICAgIHJldHVybiBsaW50ZXIoKHZpZXcpID0+IHtcbiAgICAgIGNvbnN0IHRleHQgPSB2aWV3LnN0YXRlLmRvYy50b1N0cmluZygpO1xuICAgICAgY29uc3QgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSA9IFtdO1xuXG4gICAgICB0cnkge1xuICAgICAgICBuZXcgRnVuY3Rpb24odGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgY29uc3QgbWVzc2FnZSA9IGdldChlcnIsICdtZXNzYWdlJywgJycpO1xuICAgICAgICBjb25zdCBzaG91bGRJZ25vcmUgPSB0aGlzLmxpbnRJZ25vcmVQYXR0ZXJucygpLnNvbWUoKHBhdHRlcm4pID0+IG1lc3NhZ2UuaW5jbHVkZXMocGF0dGVybikpO1xuXG4gICAgICAgIGlmICghc2hvdWxkSWdub3JlKSB7XG4gICAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgICBmcm9tOiAwLFxuICAgICAgICAgICAgdG86IHRleHQubGVuZ3RoLFxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBKU09OIGxpbnRlclxuICAgKiBT4butIGThu6VuZyBKU09OLnBhcnNlIMSR4buDIHZhbGlkYXRlXG4gICAqL1xuICBjcmVhdGVKc29uTGludGVyKCk6IEV4dGVuc2lvbiB7XG4gICAgcmV0dXJuIGxpbnRlcigodmlldykgPT4ge1xuICAgICAgY29uc3QgdGV4dCA9IHZpZXcuc3RhdGUuZG9jLnRvU3RyaW5nKCk7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIEpTT04ucGFyc2UodGV4dCk7XG4gICAgICB9IGNhdGNoIChlcnI6IHVua25vd24pIHtcbiAgICAgICAgZGlhZ25vc3RpY3MucHVzaCh7XG4gICAgICAgICAgZnJvbTogMCxcbiAgICAgICAgICB0bzogdGV4dC5sZW5ndGgsXG4gICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXG4gICAgICAgICAgbWVzc2FnZTogZ2V0KGVyciwgJ21lc3NhZ2UnLCAnJyksXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICB0aGlzLnN5bnRheEVycm9ycy5lbWl0KGRpYWdub3N0aWNzKTtcbiAgICAgIHJldHVybiBkaWFnbm9zdGljcztcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBU4bqhbyBTUUwgbGludGVyXG4gICAqL1xuICBjcmVhdGVTcWxMaW50ZXIoKTogRXh0ZW5zaW9uIHtcbiAgICByZXR1cm4gbGludGVyKCh2aWV3KSA9PiB7XG4gICAgICBjb25zdCBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdID0gW107XG4gICAgICBjb25zdCBkb2MgPSB2aWV3LnN0YXRlLmRvYztcbiAgICAgIGNvbnN0IHRyZWUgPSBzeW50YXhUcmVlKHZpZXcuc3RhdGUpO1xuXG4gICAgICB0cmVlLml0ZXJhdGUoe1xuICAgICAgICBlbnRlcjogKG5vZGU6IFN5bnRheE5vZGVSZWYpID0+IHtcbiAgICAgICAgICBpZiAoIW5vZGUudHlwZS5pc0Vycm9yKSByZXR1cm47XG5cbiAgICAgICAgICBkaWFnbm9zdGljcy5wdXNoKHtcbiAgICAgICAgICAgIGZyb206IE1hdGgubWF4KDAsIG5vZGUuZnJvbSAtIDEpLFxuICAgICAgICAgICAgdG86IG5vZGUuZnJvbSxcbiAgICAgICAgICAgIHNldmVyaXR5OiAnZXJyb3InLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5idWlsZFNxbEVycm9yTWVzc2FnZShkb2MsIG5vZGUpLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG5cbiAgICAgIHRoaXMuc3ludGF4RXJyb3JzLmVtaXQoZGlhZ25vc3RpY3MpO1xuICAgICAgcmV0dXJuIGRpYWdub3N0aWNzO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBidWlsZFNxbEVycm9yTWVzc2FnZShkb2M6IFRleHQsIG5vZGU6IFN5bnRheE5vZGVSZWYpOiBzdHJpbmcge1xuICAgIGlmIChub2RlLmZyb20gIT09IG5vZGUudG8pIHtcbiAgICAgIGNvbnN0IHRleHQgPSBkb2Muc2xpY2VTdHJpbmcobm9kZS5mcm9tLCBub2RlLnRvKTtcbiAgICAgIHJldHVybiBgU1FMIHN5bnRheCBlcnJvciBuZWFyIFwiJHt0ZXh0fVwiYDtcbiAgICB9XG5cbiAgICBjb25zdCBwcmV2VG9rZW4gPSB0aGlzLmdldFRva2VuQmVmb3JlKGRvYywgbm9kZS5mcm9tKTtcblxuICAgIGlmICghcHJldlRva2VuKSB7XG4gICAgICByZXR1cm4gJ1NRTCBzeW50YXggZXJyb3IgYXQgYmVnaW5uaW5nIG9mIHN0YXRlbWVudCc7XG4gICAgfVxuXG4gICAgaWYgKC9GUk9NJC9pLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdFeHBlY3RlZCB0YWJsZSBuYW1lIGFmdGVyIEZST00nO1xuICAgIH1cblxuICAgIGlmICgvU0VMRUNUJC9pLnRlc3QocHJldlRva2VuKSkge1xuICAgICAgcmV0dXJuICdFeHBlY3RlZCBjb2x1bW4gbGlzdCBhZnRlciBTRUxFQ1QnO1xuICAgIH1cblxuICAgIGlmICgvV0hFUkUkL2kudGVzdChwcmV2VG9rZW4pKSB7XG4gICAgICByZXR1cm4gJ0V4cGVjdGVkIGNvbmRpdGlvbiBhZnRlciBXSEVSRSc7XG4gICAgfVxuXG4gICAgaWYgKC9cXCgkLy50ZXN0KHByZXZUb2tlbikpIHtcbiAgICAgIHJldHVybiAnTWlzc2luZyBjbG9zaW5nIFwiKVwiJztcbiAgICB9XG5cbiAgICByZXR1cm4gYFVuZXhwZWN0ZWQgZW5kIG9mIFNRTCBhZnRlciBcIiR7cHJldlRva2VufVwiYDtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9rZW5CZWZvcmUoZG9jOiBUZXh0LCBwb3M6IG51bWJlcik6IHN0cmluZyB7XG4gICAgY29uc3Qgc3RhcnQgPSBNYXRoLm1heCgwLCBwb3MgLSAzMCk7XG4gICAgY29uc3QgdGV4dCA9IGRvYy5zbGljZVN0cmluZyhzdGFydCwgcG9zKTtcblxuICAgIGNvbnN0IG1hdGNoID0gdGV4dC5tYXRjaCgvKFxcUyspXFxzKiQvKTtcbiAgICByZXR1cm4gbWF0Y2g/LlsxXSA/PyAnJztcbiAgfVxuXG4gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIFBST1RFQ1RFRCBNRVRIT0RTIC0gRXZlbnQgaGFuZGxlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBwcm90ZWN0ZWQgaGFuZGxlckNvcHkoKTogdm9pZCB7XG4gICAgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5jb250ZW50KCkgfHwgJycpO1xuICAgIHRoaXMubm90aWZpY2F0aW9uU2VydmljZS5zaG93Q29tcFR5cGVUZXh0SW5mbygnU2FvIGNow6lwIHRow6BuaCBjw7RuZycpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGhhbmRsZXJMaW5lV3JhcCgpOiB2b2lkIHtcbiAgICAvLyBM4bqleSBu4buZaSBkdW5nIG3hu5tpIG5o4bqldCB04burIGVkaXRvciBzYXUga2hpIMSRw6MgeMOzYSBuZXdsaW5lc1xuICAgIGNvbnN0IGN1cnJlbnRDb250ZW50ID0gdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LnN0YXRlLmRvYy50b1N0cmluZygpIHx8ICcnO1xuICAgIGNvbnN0IHVwZGF0ZWRDb250ZW50ID0gdGhpcy5pc1dyYXAoKSAmJiBjdXJyZW50Q29udGVudCA/IGN1cnJlbnRDb250ZW50LnJlcGxhY2UoL1xcbi9nLCAnICcpIDogdGhpcy5jb250ZW50KCk7XG4gICAgdGhpcy5pc1dyYXAudXBkYXRlKCh2YWwpID0+ICF2YWwpO1xuXG4gICAgaWYgKGN1cnJlbnRDb250ZW50ICE9PSB1cGRhdGVkQ29udGVudCkge1xuICAgICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgICAgY2hhbmdlczogeyBmcm9tOiAwLCB0bzogY3VycmVudENvbnRlbnQubGVuZ3RoLCBpbnNlcnQ6IHVwZGF0ZWRDb250ZW50IH0sXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBCYXRjaCBj4bqjIDIgZGlzcGF0Y2ggdGjDoG5oIDEgxJHhu4MgdOG7kWkgxrB1IHBlcmZvcm1hbmNlXG4gICAgdGhpcy5lZGl0b3JWaWV3SW5zdGFuY2U/LmRpc3BhdGNoKHtcbiAgICAgIGVmZmVjdHM6IFt0aGlzLndyYXBDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZSh0aGlzLmlzV3JhcCgpID8gRWRpdG9yVmlldy5saW5lV3JhcHBpbmcgOiBbXSksIHRoaXMubGluZU51bWJlckNvbXBhcnRtZW50LnJlY29uZmlndXJlKHRoaXMuaXNXcmFwKCkgPyBsaW5lTnVtYmVycygpIDogW10pXSxcbiAgICB9KTtcblxuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgY29udGVudDogdXBkYXRlZENvbnRlbnQsXG4gICAgICBpc1dyYXA6IHRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdpc1dyYXAnLFxuICAgIH0pO1xuICB9XG5cbiAgcHJvdGVjdGVkIGFzeW5jIGhhbmRsZXJTZWxlY3RLZXkoZGF0YT86IElFbWl0U2VsZWN0S2V5KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFkYXRhPy5rZXkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdMYW5nID0gZGF0YS5rZXkgYXMgUFJFVklFV19URVhUX0RBVEFfTEFOR1VBR0VfU1VQUE9SVDtcbiAgICB0aGlzLmxhbmdTZWxlY3RlZC5zZXQobmV3TGFuZyk7XG5cbiAgICAvLyBMb2FkIGxhbmd1YWdlIHbDoCBsaW50ZXIgbeG7m2lcbiAgICBjb25zdCBbbGFuZ3VhZ2VFeHRlbnNpb24sIGxpbnRlckV4dGVuc2lvbl0gPSBhd2FpdCBQcm9taXNlLmFsbChbdGhpcy5sb2FkTGFuZ3VhZ2VFeHRlbnNpb24obmV3TGFuZyksIHRoaXMubG9hZExpbnRlckV4dGVuc2lvbihuZXdMYW5nKV0pO1xuXG4gICAgLy8gUmVjb25maWd1cmUgdGhheSB2w6wgdOG6oW8gbeG7m2kgc3RhdGUgxJHhu4MgZ2nhu68gbOG6oWkgZG9jdW1lbnQgY29udGVudFxuICAgIHRoaXMuZWRpdG9yVmlld0luc3RhbmNlPy5kaXNwYXRjaCh7XG4gICAgICBlZmZlY3RzOiBbdGhpcy5sYW5ndWFnZUNvbXBhcnRtZW50LnJlY29uZmlndXJlKGxhbmd1YWdlRXh0ZW5zaW9uKSwgdGhpcy5saW50ZXJDb21wYXJ0bWVudC5yZWNvbmZpZ3VyZShsaW50ZXJFeHRlbnNpb24pXSxcbiAgICB9KTtcblxuICAgIHRoaXMub3V0Q2hhbmdlLmVtaXQoe1xuICAgICAgY29udGVudDogdGhpcy5jb250ZW50KCksXG4gICAgICBpc1dyYXA6IHRoaXMuaXNXcmFwKCksXG4gICAgICBsYW5ndWFnZTogdGhpcy5sYW5nU2VsZWN0ZWQoKSxcbiAgICAgIGNvbnRleHRDaGFuZ2U6ICdsYW5ndWFnZScsXG4gICAgfSk7XG4gIH1cbn1cbiIsIjxkaXZcbiAgY2xhc3M9XCJsaWJzLXVpLXByZXZpZXctZGF0YS1jb250YWluZXIgZmxleCBmbGV4LWNvbCB3LWZ1bGwgaC1hdXRvIHJvdW5kZWQtWzhweF0gbGlicy11aS1ib3JkZXItZ2VuZXJhbCBweC1bOHB4XVwiXG4gIFtzdHlsZS4tLWJhY2tncm91bmQtY29sb3JdPVwiYmFja2dyb3VuZCgpXCJcbiAgW2NsYXNzLnB0LVs4cHhdXT1cIiFoaWRkZW5BY3Rpb24oKVwiPlxuICBAaWYgKCFoaWRkZW5BY3Rpb24oKSkge1xuICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlciBjb250ZW50LWJldHdlZW4gY29sb3ItWyM2YTczODNdXCI+XG4gICAgICA8bGlic191aS1jb21wb25lbnRzLWRyb3Bkb3duXG4gICAgICAgIGNsYXNzSW5jbHVkZT1cInctWzIwMHB4XVwiXG4gICAgICAgIFtsaXN0Q29uZmlnXT1cImNvbmZpZ0xvYWREYXRhSXNIdHRwQ29uZmlnKClcIlxuICAgICAgICBbbGlzdE1heEl0ZW1TaG93XT1cIjVcIlxuICAgICAgICBbaXNOZ0NvbnRlbnRdPVwidHJ1ZVwiXG4gICAgICAgIFtyZWFkb25seV09XCIhZWRpdGFibGUoKSB8fCAhYWNjZXB0Q2hhbmdlTGFuZygpXCJcbiAgICAgICAgW2xpc3RIYXNCdXR0b25VblNlbGVjdE9wdGlvbl09XCJmYWxzZVwiXG4gICAgICAgIChvdXRTZWxlY3RLZXkpPVwiaGFuZGxlclNlbGVjdEtleSgkZXZlbnQpXCI+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwibGFiZWxMYW5nKCkgfHwgJydcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25SaWdodF09XCJlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICdsaWJzLXVpLWljb24tbW92ZS1yaWdodCByb3RhdGUtOTAnIDogJydcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJyFwLVswcHhdJyArIChlZGl0YWJsZSgpICYmIGFjY2VwdENoYW5nZUxhbmcoKSA/ICcnIDogJyFwb2ludGVyLWV2ZW50cy1ub25lICFjdXJzb3ItZGVmYXVsdCBob3ZlcjohdGV4dC1bIzZBNzM4M10nKVwiIC8+XG4gICAgICA8L2xpYnNfdWktY29tcG9uZW50cy1kcm9wZG93bj5cbiAgICAgIDxkaXYgY2xhc3M9XCJmbGV4IGl0ZW1zLWNlbnRlclwiPlxuICAgICAgICA8bGlic191aS1jb21wb25lbnRzLWJ1dHRvbnMtYnV0dG9uXG4gICAgICAgICAgW3R5cGVdPVwiJ2J1dHRvbi1saW5rLXRoaXJkJ1wiXG4gICAgICAgICAgW2xhYmVsXT1cImlzV3JhcCgpID8gJ2kxOG5fcmVtb3ZlX2xpbmVfd3JhcCcgOiAnaTE4bl9saW5lX3dyYXAnXCJcbiAgICAgICAgICBbc2l6ZUJ1dHRvbl09XCInc21hbGwnXCJcbiAgICAgICAgICBbY2xhc3NJY29uTGVmdF09XCJpc1dyYXAoKSA/ICdsaWJzLXVpLWljb24tdW53cmFwJyA6ICdsaWJzLXVpLWljb24td3JhcCdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCBtby1saWItbXItMTZweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyTGluZVdyYXAoKVwiIC8+XG4gICAgICAgIDxsaWJzX3VpLWNvbXBvbmVudHMtYnV0dG9ucy1idXR0b25cbiAgICAgICAgICBbdHlwZV09XCInYnV0dG9uLWxpbmstdGhpcmQnXCJcbiAgICAgICAgICBbbGFiZWxdPVwiJ2kxOG5fY29weSdcIlxuICAgICAgICAgIFtzaXplQnV0dG9uXT1cIidzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzc0ljb25MZWZ0XT1cIidsaWJzLXVpLWljb24tY29weSdcIlxuICAgICAgICAgIFtjbGFzc0luY2x1ZGVdPVwiJ21vLWxpYi1wLTBweCdcIlxuICAgICAgICAgIChvdXRDbGljayk9XCJoYW5kbGVyQ29weSgpXCIgLz5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICB9XG4gIDxkaXYgI2NvbnRhaW5lclByZXZpZXc+PC9kaXY+XG48L2Rpdj5cbiJdfQ==
@@ -9,6 +9,7 @@ import { LibsUiNotificationService } from '@libs-ui/services-notification';
9
9
  import { UtilsHttpParamsRequest, get } from '@libs-ui/utils';
10
10
  import { basicSetup } from 'codemirror6';
11
11
  import { returnListObject } from '@libs-ui/services-http-request';
12
+ import { syntaxTree } from '@codemirror/language';
12
13
 
13
14
  /**
14
15
  * Danh sách các ngôn ngữ được hỗ trợ
@@ -388,30 +389,57 @@ class LibsUiComponentsPreviewTextDataComponent {
388
389
  }
389
390
  /**
390
391
  * Tạo SQL linter
391
- * Lazy load node-sql-parser chỉ khi cần
392
392
  */
393
393
  createSqlLinter() {
394
- return linter(async (view) => {
395
- const text = view.state.doc.toString();
394
+ return linter((view) => {
396
395
  const diagnostics = [];
397
- try {
398
- // Lazy load SQL parser chỉ khi thực sự cần
399
- const { Parser } = await import('node-sql-parser');
400
- const sqlParser = new Parser();
401
- sqlParser.astify(text);
402
- }
403
- catch (err) {
404
- diagnostics.push({
405
- from: 0,
406
- to: text.length,
407
- severity: 'error',
408
- message: get(err, 'message', ''),
409
- });
410
- }
396
+ const doc = view.state.doc;
397
+ const tree = syntaxTree(view.state);
398
+ tree.iterate({
399
+ enter: (node) => {
400
+ if (!node.type.isError)
401
+ return;
402
+ diagnostics.push({
403
+ from: Math.max(0, node.from - 1),
404
+ to: node.from,
405
+ severity: 'error',
406
+ message: this.buildSqlErrorMessage(doc, node),
407
+ });
408
+ },
409
+ });
411
410
  this.syntaxErrors.emit(diagnostics);
412
411
  return diagnostics;
413
412
  });
414
413
  }
414
+ buildSqlErrorMessage(doc, node) {
415
+ if (node.from !== node.to) {
416
+ const text = doc.sliceString(node.from, node.to);
417
+ return `SQL syntax error near "${text}"`;
418
+ }
419
+ const prevToken = this.getTokenBefore(doc, node.from);
420
+ if (!prevToken) {
421
+ return 'SQL syntax error at beginning of statement';
422
+ }
423
+ if (/FROM$/i.test(prevToken)) {
424
+ return 'Expected table name after FROM';
425
+ }
426
+ if (/SELECT$/i.test(prevToken)) {
427
+ return 'Expected column list after SELECT';
428
+ }
429
+ if (/WHERE$/i.test(prevToken)) {
430
+ return 'Expected condition after WHERE';
431
+ }
432
+ if (/\($/.test(prevToken)) {
433
+ return 'Missing closing ")"';
434
+ }
435
+ return `Unexpected end of SQL after "${prevToken}"`;
436
+ }
437
+ getTokenBefore(doc, pos) {
438
+ const start = Math.max(0, pos - 30);
439
+ const text = doc.sliceString(start, pos);
440
+ const match = text.match(/(\S+)\s*$/);
441
+ return match?.[1] ?? '';
442
+ }
415
443
  // ==========================================================================
416
444
  // PROTECTED METHODS - Event handlers
417
445
  // ==========================================================================
@@ -1 +1 @@
1
- {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>): IListConfigItem => {\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject([...optionsLangData].filter((item) => !langsAccept || !langsAccept.length || langsAccept.includes(item.id as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT))),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, Extension } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { IPreviewTextDataChange, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT } from './preview-text-data.interfaces';\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang(undefined));\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter\n * Sử dụng Function constructor để validate syntax\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n new Function(text);\n } catch (err: unknown) {\n const message = get(err, 'message', '');\n const shouldIgnore = this.lintIgnorePatterns().some((pattern) => message.includes(pattern));\n\n if (!shouldIgnore) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message,\n });\n this.syntaxErrors.emit(diagnostics);\n }\n }\n\n return diagnostics;\n });\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n * Lazy load node-sql-parser chỉ khi cần\n */\n createSqlLinter(): Extension {\n return linter(async (view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n // Lazy load SQL parser chỉ khi thực sự cần\n const { Parser } = await import('node-sql-parser');\n const sqlParser = new Parser();\n sqlParser.astify(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.content();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n\n this.outChange.emit({\n content: updatedContent,\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'isWrap',\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"libs-ui-components-preview-text-data.mjs","sources":["../../../../../libs-ui/components/preview-text-data/src/preview-text-data.define.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.ts","../../../../../libs-ui/components/preview-text-data/src/preview-text-data.component.html","../../../../../libs-ui/components/preview-text-data/src/libs-ui-components-preview-text-data.ts"],"sourcesContent":["import { signal } from '@angular/core';\nimport { Extension } from '@codemirror/state';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { IHttpRequestConfig, returnListObject } from '@libs-ui/services-http-request';\nimport { UtilsHttpParamsRequest } from '@libs-ui/utils';\nimport { LibsUiComponentsPreviewTextDataComponent } from './preview-text-data.component';\nimport { PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT } from './preview-text-data.interfaces';\n\n/**\n * Danh sách các ngôn ngữ được hỗ trợ\n * Sử dụng const array để tránh tạo mới mỗi lần truy cập\n */\nexport const optionsLangData = [\n { id: 'text', label: 'Plain Text' },\n { id: 'javascript', label: 'JavaScript/TypeScript' },\n { id: 'html', label: 'HTML' },\n { id: 'css', label: 'CSS/SCSS/SASS' },\n { id: 'markdown', label: 'Markdown' },\n { id: 'json', label: 'JSON' },\n { id: 'sql', label: 'SQL' },\n { id: 'xml', label: 'XML' },\n { id: 'yaml', label: 'YAML' },\n { id: 'python', label: 'Python' },\n { id: 'java', label: 'Java' },\n { id: 'cpp', label: 'C/C++' },\n { id: 'php', label: 'PHP' },\n { id: 'go', label: 'Go' },\n] as const;\n\nexport const httpRequestConfigGetOptionsLang = (langsAccept?: Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>): IListConfigItem => {\n return {\n type: 'text',\n httpRequestData: signal<IHttpRequestConfig>({\n objectInstance: returnListObject([...optionsLangData].filter((item) => !langsAccept || !langsAccept.length || langsAccept.includes(item.id as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT))),\n functionName: 'list',\n argumentsValue: [new UtilsHttpParamsRequest({ fromObject: { page: 1, per_page: 40 } })],\n }),\n configTemplateText: signal({\n fieldKey: 'id',\n notUseVirtualScroll: true,\n }),\n };\n};\n\ntype T_LanguageLoader = () => Promise<Extension>;\ntype T_LinterLoader = (component: LibsUiComponentsPreviewTextDataComponent) => Promise<Extension>;\ninterface I_LanguageRegistryItem {\n loader: T_LanguageLoader;\n linter?: T_LinterLoader;\n}\n\nexport const languageRegistry: Record<string, I_LanguageRegistryItem> = {\n javascript: {\n loader: async () => {\n const { javascript } = await import('@codemirror/lang-javascript');\n return javascript({ jsx: true, typescript: true });\n },\n linter: async (component) => component.createJsLinter(),\n },\n html: {\n loader: async () => {\n const { html } = await import('@codemirror/lang-html');\n return html();\n },\n },\n css: {\n loader: async () => {\n const { css } = await import('@codemirror/lang-css');\n return css();\n },\n },\n markdown: {\n loader: async () => {\n const { markdown } = await import('@codemirror/lang-markdown');\n return markdown();\n },\n },\n json: {\n loader: async () => {\n const { json } = await import('@codemirror/lang-json');\n return json();\n },\n linter: async (component) => component.createJsonLinter(),\n },\n sql: {\n loader: async () => {\n const { sql } = await import('@codemirror/lang-sql');\n return sql();\n },\n linter: async (component) => component.createSqlLinter(),\n },\n xml: {\n loader: async () => {\n const { xml } = await import('@codemirror/lang-xml');\n return xml();\n },\n },\n yaml: {\n loader: async () => {\n const { yaml } = await import('@codemirror/lang-yaml');\n return yaml();\n },\n },\n python: {\n loader: async () => {\n const { python } = await import('@codemirror/lang-python');\n return python();\n },\n },\n java: {\n loader: async () => {\n const { java } = await import('@codemirror/lang-java');\n return java();\n },\n },\n cpp: {\n loader: async () => {\n const { cpp } = await import('@codemirror/lang-cpp');\n return cpp();\n },\n },\n php: {\n loader: async () => {\n const { php } = await import('@codemirror/lang-php');\n return php();\n },\n },\n go: {\n loader: async () => {\n const { go } = await import('@codemirror/lang-go');\n return go();\n },\n },\n};\n\n/**\n * Tạo default language extension cho plain text\n * Sử dụng khi ngôn ngữ không được hỗ trợ\n */\nexport const createDefaultLanguage = async (): Promise<Extension> => {\n const { StreamLanguage } = await import('@codemirror/language');\n return StreamLanguage.define({\n token(stream) {\n stream.skipToEnd();\n return null;\n },\n });\n};\n","import { AfterViewInit, ChangeDetectionStrategy, Component, computed, DestroyRef, effect, ElementRef, inject, input, model, OnInit, output, signal, viewChild } from '@angular/core';\nimport { Diagnostic, linter, lintGutter } from '@codemirror/lint';\nimport { Compartment, Extension } from '@codemirror/state';\nimport { EditorView, lineNumbers, ViewUpdate } from '@codemirror/view';\nimport { LibsUiComponentsButtonsButtonComponent } from '@libs-ui/components-buttons-button';\nimport { IEmitSelectKey, LibsUiComponentsDropdownComponent } from '@libs-ui/components-dropdown';\nimport { IListConfigItem } from '@libs-ui/components-list';\nimport { LibsUiNotificationService } from '@libs-ui/services-notification';\nimport { get } from '@libs-ui/utils';\nimport { basicSetup } from 'codemirror6';\nimport { createDefaultLanguage, httpRequestConfigGetOptionsLang, languageRegistry, optionsLangData } from './preview-text-data.define';\nimport { IPreviewTextDataChange, PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT } from './preview-text-data.interfaces';\nimport { syntaxTree } from '@codemirror/language';\nimport type { SyntaxNodeRef } from '@lezer/common';\nimport { Text } from '@codemirror/state';\n\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'libs_ui-components-preview_text_data',\n templateUrl: './preview-text-data.component.html',\n styleUrls: ['./preview-text-data.component.scss'],\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [LibsUiComponentsDropdownComponent, LibsUiComponentsButtonsButtonComponent],\n})\nexport class LibsUiComponentsPreviewTextDataComponent implements OnInit, AfterViewInit {\n // ==========================================================================\n // PRIVATE PROPERTIES\n // ==========================================================================\n\n private editorViewInstance?: EditorView;\n private readonly wrapCompartment = new Compartment();\n private readonly languageCompartment = new Compartment();\n private readonly lineNumberCompartment = new Compartment();\n private readonly linterCompartment = new Compartment();\n\n /** Cache để tránh load lại language đã load */\n private readonly languageCache = new Map<string, Extension>();\n\n /** Flag để tránh update editor khi đang khởi tạo */\n private isInitialized = false;\n\n // ==========================================================================\n // INJECTED SERVICES\n // ==========================================================================\n\n private readonly notificationService = inject(LibsUiNotificationService);\n private readonly destroyRef = inject(DestroyRef);\n\n // ==========================================================================\n // PROTECTED SIGNALS\n // ==========================================================================\n\n protected readonly isWrap = signal<boolean>(true);\n protected readonly configLoadDataIsHttpConfig = signal<IListConfigItem>(httpRequestConfigGetOptionsLang(undefined));\n protected readonly labelLang = computed(() => optionsLangData.find((item) => item.id === this.langSelected())?.label);\n protected readonly acceptChangeLang = computed(() => !(this.langSelected() && this.langsAccept()?.length === 1 && this.langsAccept()?.includes(this.langSelected())));\n\n // ==========================================================================\n // INPUTS\n // ==========================================================================\n\n readonly content = input<string, string | undefined>('', {\n transform: (value?: string) => value ?? '',\n });\n\n readonly langSelected = model.required<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT>();\n readonly langsAccept = input<Array<PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT> | undefined>();\n\n readonly editable = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly hiddenAction = input<boolean, boolean | undefined>(false, {\n transform: (value?: boolean) => value ?? false,\n });\n\n readonly lintIgnorePatterns = input<Array<string>, Array<string> | undefined>(['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'], {\n transform: (value?: Array<string>) => value ?? ['Cannot use import statement outside a module', 'Unexpected token export', 'import ', '@angular/core'],\n });\n\n readonly background = input<string, string | undefined>('#f8f9fa', {\n transform: (value?: string) => value ?? '#f8f9fa',\n });\n\n // ==========================================================================\n // OUTPUTS\n // ==========================================================================\n\n readonly outChange = output<IPreviewTextDataChange>();\n readonly syntaxErrors = output<Diagnostic[]>();\n\n // ==========================================================================\n // VIEW CHILDREN\n // ==========================================================================\n\n private readonly containerPreview = viewChild.required<ElementRef<HTMLDivElement>>('containerPreview');\n\n // ==========================================================================\n // CONSTRUCTOR - Setup effects\n // ==========================================================================\n\n constructor() {\n // Effect để sync content từ input vào editor\n effect(() => {\n const newContent = this.content();\n if (this.isInitialized && this.editorViewInstance) {\n const currentContent = this.editorViewInstance.state.doc.toString();\n if (newContent !== currentContent) {\n this.editorViewInstance.dispatch({\n changes: {\n from: 0,\n to: currentContent.length,\n insert: newContent,\n },\n });\n }\n }\n });\n\n // Cleanup khi component bị destroy\n this.destroyRef.onDestroy(() => {\n this.editorViewInstance?.destroy();\n this.languageCache.clear();\n });\n }\n\n // ==========================================================================\n // LIFECYCLE HOOKS\n // ==========================================================================\n\n ngOnInit(): void {\n if (this.langsAccept()?.length) {\n this.configLoadDataIsHttpConfig.set(httpRequestConfigGetOptionsLang(this.langsAccept()));\n }\n }\n\n async ngAfterViewInit(): Promise<void> {\n await this.initializeEditor();\n this.isInitialized = true;\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Editor initialization\n // ==========================================================================\n\n /**\n * Khởi tạo editor với các extensions cơ bản\n * Language được load async để tối ưu bundle size\n */\n private async initializeEditor(): Promise<void> {\n const languageExtension = await this.loadLanguageExtension(this.langSelected());\n const linterExtension = await this.loadLinterExtension(this.langSelected());\n\n this.editorViewInstance = new EditorView({\n doc: this.content(),\n parent: this.containerPreview().nativeElement,\n extensions: this.createExtensions(languageExtension, linterExtension),\n });\n }\n\n /**\n * Tạo danh sách extensions cho editor\n */\n private createExtensions(languageExtension: Extension, linterExtension: Extension): Extension[] {\n return [\n basicSetup,\n this.languageCompartment.of(languageExtension),\n this.linterCompartment.of(linterExtension),\n this.createLightTheme(),\n EditorView.editable.of(this.editable()),\n this.wrapCompartment.of(EditorView.lineWrapping),\n this.lineNumberCompartment.of(lineNumbers()),\n lintGutter(),\n this.createBracketTheme(),\n this.createUpdateListener(),\n ];\n }\n\n /**\n * Load language extension với caching\n * Mỗi language chỉ được load 1 lần\n */\n private async loadLanguageExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n\n const cached = this.languageCache.get(lowerLang);\n if (cached) {\n return cached;\n }\n const registryItem = languageRegistry[lowerLang];\n const extension = registryItem ? await registryItem.loader() : await createDefaultLanguage();\n\n this.languageCache.set(lowerLang, extension);\n return extension;\n }\n\n /**\n * Load linter extension nếu có\n */\n private async loadLinterExtension(lang: PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT): Promise<Extension> {\n const lowerLang = lang.toLowerCase();\n const registryItem = languageRegistry[lowerLang];\n\n if (registryItem?.linter) {\n return registryItem.linter(this);\n }\n\n return linter(() => []);\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Theme configuration\n // ==========================================================================\n\n private createLightTheme(): Extension {\n return EditorView.theme({\n '&': { backgroundColor: this.background(), color: '#333' },\n '.cm-content': { caretColor: '#111' },\n '.cm-activeLine': { backgroundColor: '#f0f0f0' },\n });\n }\n\n private createBracketTheme(): Extension {\n return EditorView.theme({\n '.cm-matchingBracket': {\n backgroundColor: 'rgba(100, 200, 255, 0.15)',\n border: '1px solid rgba(100, 200, 255, 0.4)',\n borderRadius: '3px',\n transition: 'all 0.2s ease',\n },\n '.cm-nonmatchingBracket': {\n backgroundColor: 'rgba(255, 100, 100, 0.15)',\n border: '1px solid rgba(255, 100, 100, 0.3)',\n borderRadius: '3px',\n },\n });\n }\n\n // ==========================================================================\n // PRIVATE METHODS - Update listener\n // ==========================================================================\n\n private createUpdateListener(): Extension {\n return EditorView.updateListener.of((update: ViewUpdate) => {\n if (update.docChanged && this.editable()) {\n const newValue = update.state.doc.toString();\n this.outChange.emit({\n content: newValue,\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'content',\n });\n }\n });\n }\n\n // ==========================================================================\n // PUBLIC METHODS - Linter factories (được gọi từ registry)\n // ==========================================================================\n\n /**\n * Tạo JavaScript linter\n * Sử dụng Function constructor để validate syntax\n */\n createJsLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n new Function(text);\n } catch (err: unknown) {\n const message = get(err, 'message', '');\n const shouldIgnore = this.lintIgnorePatterns().some((pattern) => message.includes(pattern));\n\n if (!shouldIgnore) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message,\n });\n this.syntaxErrors.emit(diagnostics);\n }\n }\n\n return diagnostics;\n });\n }\n\n /**\n * Tạo JSON linter\n * Sử dụng JSON.parse để validate\n */\n createJsonLinter(): Extension {\n return linter((view) => {\n const text = view.state.doc.toString();\n const diagnostics: Diagnostic[] = [];\n\n try {\n JSON.parse(text);\n } catch (err: unknown) {\n diagnostics.push({\n from: 0,\n to: text.length,\n severity: 'error',\n message: get(err, 'message', ''),\n });\n }\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n /**\n * Tạo SQL linter\n */\n createSqlLinter(): Extension {\n return linter((view) => {\n const diagnostics: Diagnostic[] = [];\n const doc = view.state.doc;\n const tree = syntaxTree(view.state);\n\n tree.iterate({\n enter: (node: SyntaxNodeRef) => {\n if (!node.type.isError) return;\n\n diagnostics.push({\n from: Math.max(0, node.from - 1),\n to: node.from,\n severity: 'error',\n message: this.buildSqlErrorMessage(doc, node),\n });\n },\n });\n\n this.syntaxErrors.emit(diagnostics);\n return diagnostics;\n });\n }\n\n private buildSqlErrorMessage(doc: Text, node: SyntaxNodeRef): string {\n if (node.from !== node.to) {\n const text = doc.sliceString(node.from, node.to);\n return `SQL syntax error near \"${text}\"`;\n }\n\n const prevToken = this.getTokenBefore(doc, node.from);\n\n if (!prevToken) {\n return 'SQL syntax error at beginning of statement';\n }\n\n if (/FROM$/i.test(prevToken)) {\n return 'Expected table name after FROM';\n }\n\n if (/SELECT$/i.test(prevToken)) {\n return 'Expected column list after SELECT';\n }\n\n if (/WHERE$/i.test(prevToken)) {\n return 'Expected condition after WHERE';\n }\n\n if (/\\($/.test(prevToken)) {\n return 'Missing closing \")\"';\n }\n\n return `Unexpected end of SQL after \"${prevToken}\"`;\n }\n\n private getTokenBefore(doc: Text, pos: number): string {\n const start = Math.max(0, pos - 30);\n const text = doc.sliceString(start, pos);\n\n const match = text.match(/(\\S+)\\s*$/);\n return match?.[1] ?? '';\n }\n\n // ==========================================================================\n // PROTECTED METHODS - Event handlers\n // ==========================================================================\n\n protected handlerCopy(): void {\n navigator.clipboard.writeText(this.content() || '');\n this.notificationService.showCompTypeTextInfo('Sao chép thành công');\n }\n\n protected handlerLineWrap(): void {\n // Lấy nội dung mới nhất từ editor sau khi đã xóa newlines\n const currentContent = this.editorViewInstance?.state.doc.toString() || '';\n const updatedContent = this.isWrap() && currentContent ? currentContent.replace(/\\n/g, ' ') : this.content();\n this.isWrap.update((val) => !val);\n\n if (currentContent !== updatedContent) {\n this.editorViewInstance?.dispatch({\n changes: { from: 0, to: currentContent.length, insert: updatedContent },\n });\n }\n\n // Batch cả 2 dispatch thành 1 để tối ưu performance\n this.editorViewInstance?.dispatch({\n effects: [this.wrapCompartment.reconfigure(this.isWrap() ? EditorView.lineWrapping : []), this.lineNumberCompartment.reconfigure(this.isWrap() ? lineNumbers() : [])],\n });\n\n this.outChange.emit({\n content: updatedContent,\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'isWrap',\n });\n }\n\n protected async handlerSelectKey(data?: IEmitSelectKey): Promise<void> {\n if (!data?.key) {\n return;\n }\n\n const newLang = data.key as PREVIEW_TEXT_DATA_LANGUAGE_SUPPORT;\n this.langSelected.set(newLang);\n\n // Load language và linter mới\n const [languageExtension, linterExtension] = await Promise.all([this.loadLanguageExtension(newLang), this.loadLinterExtension(newLang)]);\n\n // Reconfigure thay vì tạo mới state để giữ lại document content\n this.editorViewInstance?.dispatch({\n effects: [this.languageCompartment.reconfigure(languageExtension), this.linterCompartment.reconfigure(linterExtension)],\n });\n\n this.outChange.emit({\n content: this.content(),\n isWrap: this.isWrap(),\n language: this.langSelected(),\n contextChange: 'language',\n });\n }\n}\n","<div\n class=\"libs-ui-preview-data-container flex flex-col w-full h-auto rounded-[8px] libs-ui-border-general px-[8px]\"\n [style.--background-color]=\"background()\"\n [class.pt-[8px]]=\"!hiddenAction()\">\n @if (!hiddenAction()) {\n <div class=\"flex items-center content-between color-[#6a7383]\">\n <libs_ui-components-dropdown\n classInclude=\"w-[200px]\"\n [listConfig]=\"configLoadDataIsHttpConfig()\"\n [listMaxItemShow]=\"5\"\n [isNgContent]=\"true\"\n [readonly]=\"!editable() || !acceptChangeLang()\"\n [listHasButtonUnSelectOption]=\"false\"\n (outSelectKey)=\"handlerSelectKey($event)\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"labelLang() || ''\"\n [sizeButton]=\"'small'\"\n [classIconRight]=\"editable() && acceptChangeLang() ? 'libs-ui-icon-move-right rotate-90' : ''\"\n [classInclude]=\"'!p-[0px]' + (editable() && acceptChangeLang() ? '' : '!pointer-events-none !cursor-default hover:!text-[#6A7383]')\" />\n </libs_ui-components-dropdown>\n <div class=\"flex items-center\">\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"isWrap() ? 'i18n_remove_line_wrap' : 'i18n_line_wrap'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"isWrap() ? 'libs-ui-icon-unwrap' : 'libs-ui-icon-wrap'\"\n [classInclude]=\"'mo-lib-p-0px mo-lib-mr-16px'\"\n (outClick)=\"handlerLineWrap()\" />\n <libs_ui-components-buttons-button\n [type]=\"'button-link-third'\"\n [label]=\"'i18n_copy'\"\n [sizeButton]=\"'small'\"\n [classIconLeft]=\"'libs-ui-icon-copy'\"\n [classInclude]=\"'mo-lib-p-0px'\"\n (outClick)=\"handlerCopy()\" />\n </div>\n </div>\n }\n <div #containerPreview></div>\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,12 +1,12 @@
1
1
  {
2
2
  "name": "@libs-ui/components-preview-text-data",
3
- "version": "0.2.352-1",
3
+ "version": "0.2.352-2",
4
4
  "peerDependencies": {
5
5
  "@angular/core": ">=18.0.0",
6
- "@libs-ui/components-buttons-button": "0.2.352-1",
7
- "@libs-ui/components-dropdown": "0.2.352-1",
8
- "@libs-ui/services-notification": "0.2.352-1",
9
- "@libs-ui/utils": "0.2.352-1"
6
+ "@libs-ui/components-buttons-button": "0.2.352-2",
7
+ "@libs-ui/components-dropdown": "0.2.352-2",
8
+ "@libs-ui/services-notification": "0.2.352-2",
9
+ "@libs-ui/utils": "0.2.352-2"
10
10
  },
11
11
  "sideEffects": false,
12
12
  "module": "fesm2022/libs-ui-components-preview-text-data.mjs",
@@ -67,9 +67,10 @@ export declare class LibsUiComponentsPreviewTextDataComponent implements OnInit,
67
67
  createJsonLinter(): Extension;
68
68
  /**
69
69
  * Tạo SQL linter
70
- * Lazy load node-sql-parser chỉ khi cần
71
70
  */
72
71
  createSqlLinter(): Extension;
72
+ private buildSqlErrorMessage;
73
+ private getTokenBefore;
73
74
  protected handlerCopy(): void;
74
75
  protected handlerLineWrap(): void;
75
76
  protected handlerSelectKey(data?: IEmitSelectKey): Promise<void>;