@tehw0lf/wordlist-generator 0.19.2 → 0.20.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/tehw0lf-wordlist-generator.mjs +18 -18
- package/fesm2022/tehw0lf-wordlist-generator.mjs.map +1 -1
- package/index.d.ts +57 -1
- package/package.json +8 -8
- package/lib/filetypes.d.ts +0 -5
- package/lib/parsers.d.ts +0 -12
- package/lib/wordlist-generator.component.d.ts +0 -51
- package/lib/wordlist-generator.service.d.ts +0 -8
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import { moveItemInArray, CdkDropList, CdkDrag } from '@angular/cdk/drag-drop';
|
|
2
2
|
import { NgStyle, AsyncPipe } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Injectable,
|
|
5
|
-
import * as
|
|
6
|
-
import { Validators, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
-
import * as
|
|
4
|
+
import { Injectable, inject, input, ViewEncapsulation, Component } from '@angular/core';
|
|
5
|
+
import * as i3 from '@angular/forms';
|
|
6
|
+
import { UntypedFormBuilder, Validators, ReactiveFormsModule } from '@angular/forms';
|
|
7
|
+
import * as i1 from '@angular/material/button';
|
|
8
8
|
import { MatButtonModule } from '@angular/material/button';
|
|
9
|
-
import * as
|
|
9
|
+
import * as i4 from '@angular/material/form-field';
|
|
10
10
|
import { MatFormFieldModule } from '@angular/material/form-field';
|
|
11
|
-
import * as
|
|
11
|
+
import * as i6 from '@angular/material/icon';
|
|
12
12
|
import { MatIconModule } from '@angular/material/icon';
|
|
13
|
-
import * as
|
|
13
|
+
import * as i5 from '@angular/material/input';
|
|
14
14
|
import { MatInputModule } from '@angular/material/input';
|
|
15
|
-
import * as
|
|
15
|
+
import * as i2 from '@angular/material/menu';
|
|
16
16
|
import { MatMenuModule } from '@angular/material/menu';
|
|
17
17
|
import { from, Subject } from 'rxjs';
|
|
18
18
|
import { map, tap, reduce, takeUntil } from 'rxjs/operators';
|
|
@@ -56,10 +56,10 @@ class WordlistGeneratorService {
|
|
|
56
56
|
return word.join('');
|
|
57
57
|
}));
|
|
58
58
|
}
|
|
59
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
60
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
59
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
60
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }
|
|
61
61
|
}
|
|
62
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
62
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorService, decorators: [{
|
|
63
63
|
type: Injectable,
|
|
64
64
|
args: [{
|
|
65
65
|
providedIn: 'root'
|
|
@@ -68,9 +68,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
|
|
|
68
68
|
|
|
69
69
|
/* eslint-disable @angular-eslint/component-selector */
|
|
70
70
|
class WordlistGeneratorComponent {
|
|
71
|
-
constructor(
|
|
72
|
-
this.formBuilder =
|
|
73
|
-
this.wordlistGenerator =
|
|
71
|
+
constructor() {
|
|
72
|
+
this.formBuilder = inject(UntypedFormBuilder);
|
|
73
|
+
this.wordlistGenerator = inject(WordlistGeneratorService);
|
|
74
74
|
this.buttonStyle = input({
|
|
75
75
|
'background-color': '#333333',
|
|
76
76
|
color: '#cc7832'
|
|
@@ -199,10 +199,10 @@ class WordlistGeneratorComponent {
|
|
|
199
199
|
this.charsets.removeAt(i);
|
|
200
200
|
}
|
|
201
201
|
}
|
|
202
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
203
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "19.1.6", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i3.MatButton, selector: " button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button] ", exportAs: ["matButton"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i4.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i4.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i4.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i1.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i1.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i5.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i5.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i6.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i7.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
202
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
|
|
203
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.0.3", type: WordlistGeneratorComponent, isStandalone: true, selector: "wordlist-generator", inputs: { buttonStyle: { classPropertyName: "buttonStyle", publicName: "buttonStyle", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: "dragStyle", publicName: "dragStyle", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: "textStyle", publicName: "textStyle", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "component", type: i1.MatButton, selector: " button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] ", inputs: ["matButton"], exportAs: ["matButton", "matAnchor"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "ngmodule", type: MatMenuModule }, { kind: "component", type: i2.MatMenu, selector: "mat-menu", inputs: ["backdropClass", "aria-label", "aria-labelledby", "aria-describedby", "xPosition", "yPosition", "overlapTrigger", "hasBackdrop", "class", "classList"], outputs: ["closed", "close"], exportAs: ["matMenu"] }, { kind: "component", type: i2.MatMenuItem, selector: "[mat-menu-item]", inputs: ["role", "disabled", "disableRipple"], exportAs: ["matMenuItem"] }, { kind: "directive", type: i2.MatMenuTrigger, selector: "[mat-menu-trigger-for], [matMenuTriggerFor]", inputs: ["mat-menu-trigger-for", "matMenuTriggerFor", "matMenuTriggerData", "matMenuTriggerRestoreFocus"], outputs: ["menuOpened", "onMenuOpen", "menuClosed", "onMenuClose"], exportAs: ["matMenuTrigger"] }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i3.ɵNgNoValidate, selector: "form:not([ngNoForm]):not([ngNativeValidate])" }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i3.RequiredValidator, selector: ":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]", inputs: ["required"] }, { kind: "directive", type: i3.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i3.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "directive", type: i3.FormArrayName, selector: "[formArrayName]", inputs: ["formArrayName"] }, { kind: "ngmodule", type: MatFormFieldModule }, { kind: "component", type: i4.MatFormField, selector: "mat-form-field", inputs: ["hideRequiredMarker", "color", "floatLabel", "appearance", "subscriptSizing", "hintLabel"], exportAs: ["matFormField"] }, { kind: "directive", type: i4.MatLabel, selector: "mat-label" }, { kind: "ngmodule", type: MatInputModule }, { kind: "directive", type: i5.MatInput, selector: "input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]", inputs: ["disabled", "id", "placeholder", "name", "required", "type", "errorStateMatcher", "aria-describedby", "value", "readonly", "disabledInteractive"], exportAs: ["matInput"] }, { kind: "directive", type: CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "ngmodule", type: MatIconModule }, { kind: "component", type: i6.MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "pipe", type: AsyncPipe, name: "async" }], encapsulation: i0.ViewEncapsulation.None }); }
|
|
204
204
|
}
|
|
205
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
205
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.0.3", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{
|
|
206
206
|
type: Component,
|
|
207
207
|
args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [
|
|
208
208
|
MatButtonModule,
|
|
@@ -216,7 +216,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "19.1.6", ngImpor
|
|
|
216
216
|
MatIconModule,
|
|
217
217
|
AsyncPipe
|
|
218
218
|
], template: "<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n", styles: [".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\n"] }]
|
|
219
|
-
}]
|
|
219
|
+
}] });
|
|
220
220
|
|
|
221
221
|
/**
|
|
222
222
|
* Generated bundle index. Do not edit.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../../../../libs/wordlist-generator/src/lib/filetypes.ts","../../../../libs/wordlist-generator/src/lib/parsers.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.service.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.component.ts","../../../../libs/wordlist-generator/src/lib/wordlist-generator.component.html","../../../../libs/wordlist-generator/src/tehw0lf-wordlist-generator.ts"],"sourcesContent":["/* eslint-disable no-shadow */\nexport enum FileType {\n plaintext = 'txt',\n xml = 'xml',\n csv = 'csv'\n}\n","export const toPlaintext = (\n wordlist: string\n): { wordlist: string; contentType: string } => ({\n wordlist,\n contentType: 'text/plain'\n});\n\nexport const toXML = (\n wordlist: string\n): { wordlist: string; contentType: string } => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\n\nexport const toCSV = (\n wordlist: string\n): { wordlist: string; contentType: string } => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from, Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class WordlistGeneratorService {\n constructor() {\n //\n }\n\n generateWordlist(...charsets: string[]): Observable<string> {\n return from(product(...charsets)).pipe(\n map((word: string[]) => {\n return word.join('');\n })\n );\n }\n}\n","import {\n CdkDrag,\n CdkDragDrop,\n CdkDropList,\n moveItemInArray\n} from '@angular/cdk/drag-drop';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport {\n Component,\n input,\n OnDestroy,\n OnInit,\n ViewEncapsulation\n} from '@angular/core';\nimport {\n ReactiveFormsModule,\n UntypedFormArray,\n UntypedFormBuilder,\n UntypedFormGroup,\n Validators\n} from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { Observable, Subject } from 'rxjs';\nimport { reduce, takeUntil, tap } from 'rxjs/operators';\n\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\n\n/* eslint-disable @angular-eslint/component-selector */\n@Component({\n selector: 'wordlist-generator',\n templateUrl: './wordlist-generator.component.html',\n styleUrls: ['./wordlist-generator.component.scss'],\n encapsulation: ViewEncapsulation.None,\n imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n AsyncPipe\n ]\n})\nexport class WordlistGeneratorComponent implements OnInit, OnDestroy {\n buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n\n dragStyle = input({ color: '#cc7832' });\n textStyle = input({ color: '#cc7832' });\n\n charsetForm: UntypedFormGroup | undefined;\n wordsGenerated: number | undefined;\n wordlist$: Observable<string> | undefined;\n\n displayWordlist = false;\n fileType = FileType.plaintext;\n fileTypes = Object.values(FileType);\n filteredCharset: string[] = [];\n prefix = '';\n suffix = '';\n\n private unsubscribe$ = new Subject<void>();\n\n constructor(\n private formBuilder: UntypedFormBuilder,\n private wordlistGenerator: WordlistGeneratorService\n ) {}\n\n ngOnInit(): void {\n this.generateForm();\n }\n\n ngOnDestroy(): void {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n\n get charsets(): UntypedFormArray | undefined {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets') as UntypedFormArray;\n }\n return undefined;\n }\n\n addCharset(): void {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n\n cloneCharset(index: number): void {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(\n index,\n this.formBuilder.control(charset, Validators.required)\n );\n }\n }\n\n downloadWordlist(): void {\n if (this.charsets) {\n if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;\n this.getWordlist()\n .pipe(\n tap((wordlist: string) => {\n if (wordlist.length > 0) {\n const parsed = this.parseWordlist(wordlist);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if ((window.navigator as any).msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window.navigator as any).msSaveOrOpenBlob(file, filename);\n } else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n })\n )\n .subscribe();\n }\n }\n\n drop(event: CdkDragDrop<string[]>): void {\n if (this.charsets) {\n moveItemInArray(\n this.charsets.controls,\n event.previousIndex,\n event.currentIndex\n );\n this.charsets.updateValueAndValidity();\n }\n }\n\n generateForm(): void {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n\n generateWordlist(): void {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset = this.filterCharset(this.charsets.value);\n this.prefix = this.charsetForm.get('prefix')?.value\n ? this.charsetForm.get('prefix')?.value\n : '';\n this.suffix = this.charsetForm.get('suffix')?.value\n ? this.charsetForm.get('suffix')?.value\n : '';\n\n this.wordsGenerated = this.filteredCharset\n .map((charset: string) => charset.length)\n .reduce(\n (previousLength: number, currentLength: number) =>\n previousLength * currentLength\n );\n this.displayWordlist = this.wordsGenerated <= 100;\n this.wordlist$ = this.getWordlist();\n }\n }\n\n getWordlist(): Observable<string> {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset)\n .pipe(\n reduce(\n (wordlist: string, word: string) =>\n `${wordlist}${this.prefix}${word}${this.suffix}\\n`,\n ''\n ),\n takeUntil(this.unsubscribe$)\n );\n }\n\n filterCharset(charsets: string[]): string[] {\n return charsets.map((charset: string) => this.removeDuplicates(charset));\n }\n\n parseWordlist(wordlist: string): { wordlist: string; contentType: string } {\n switch (this.fileType) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n\n removeCharset(i: number): void {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n\n removeDuplicates = (unfiltered: string): string =>\n [...new Set(unfiltered)].join('');\n}\n","<div class=\"meta-container flex-row-wrap\">\n <div class=\"form-container flex-column flex-fxflex\">\n <div class=\"flex-row-wrap bottom-10\">\n <button\n class=\"generate-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"generateWordlist()\"\n >\n Generate wordlist\n </button>\n @if (wordlist$) {\n <button\n class=\"choose-format\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n [matMenuTriggerFor]=\"menu\"\n >\n Choose format\n </button>\n }\n <mat-menu #menu=\"matMenu\">\n @for (type of fileTypes; track type) {\n <button\n [ngStyle]=\"buttonStyle()\"\n mat-menu-item\n (click)=\"fileType = type\"\n >\n {{ type }}\n </button>\n }\n </mat-menu>\n @if (wordlist$) {\n <button\n class=\"download-wordlist\"\n [ngStyle]=\"buttonStyle()\"\n mat-raised-button\n (click)=\"downloadWordlist()\"\n >\n Download as\n @if (this.fileType) {\n {{ this.fileType }}\n }\n </button>\n }\n </div>\n @if (charsetForm) {\n <form [formGroup]=\"charsetForm\">\n <mat-form-field class=\"fixed-width bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">prefix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"prefix\"\n formControlName=\"prefix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n <div formArrayName=\"charsets\">\n <div cdkDropList (cdkDropListDropped)=\"drop($event)\">\n @for (\n charset of charsets?.controls;\n track charset;\n let i = $index\n ) {\n <div class=\"charset-container\" cdkDrag>\n <mat-icon class=\"drag-indicator\" [ngStyle]=\"dragStyle()\"\n >drag_indicator</mat-icon\n >\n <mat-form-field class=\"charset bottom-10\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">\n character set for string position {{ i }}\n </mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"position-{{ i }}\"\n [formControlName]=\"i\"\n (keydown.enter)=\"$event.preventDefault()\"\n required\n />\n </mat-form-field>\n <button\n mat-raised-button\n class=\"clone-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"cloneCharset(i)\"\n >\n <mat-icon class=\"row-button-icon\">content_copy</mat-icon>\n </button>\n <button\n mat-raised-button\n class=\"remove-charset\"\n [ngStyle]=\"buttonStyle()\"\n (click)=\"removeCharset(i)\"\n [disabled]=\"this.charsets?.value.length === 1\"\n >\n <mat-icon class=\"row-button-icon\">remove</mat-icon>\n </button>\n <button\n mat-raised-button\n [ngStyle]=\"buttonStyle()\"\n (click)=\"addCharset()\"\n >\n <mat-icon class=\"row-button-icon\">add</mat-icon>\n </button>\n </div>\n }\n </div>\n </div>\n <mat-form-field class=\"fixed-width\" appearance=\"outline\">\n <mat-label [ngStyle]=\"textStyle()\">suffix (optional)</mat-label>\n <input\n [ngStyle]=\"textStyle()\"\n matInput\n type=\"text\"\n id=\"suffix\"\n formControlName=\"suffix\"\n (keydown.enter)=\"$event.preventDefault()\"\n />\n </mat-form-field>\n </form>\n }\n </div>\n @if (wordlist$) {\n <div class=\"wordlist-container flex-column flex-fxflex\">\n @if (displayWordlist) {\n <h3 class=\"wordlist-header\">Generated wordlist:</h3>\n <code class=\"wordlist\">\n {{ wordlist$ | async }}\n </code>\n } @else {\n The generated wordlist is too large to be displayed. You can still\n download it.\n }\n </div>\n }\n</div>\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i2.WordlistGeneratorService"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tehw0lf-wordlist-generator.mjs","sources":["../tmp-esm2022/lib/filetypes.js","../tmp-esm2022/lib/parsers.js","../tmp-esm2022/lib/wordlist-generator.service.js","../tmp-esm2022/lib/wordlist-generator.component.js","../tmp-esm2022/tehw0lf-wordlist-generator.js"],"sourcesContent":["/* eslint-disable no-shadow */\nexport var FileType;\n(function (FileType) {\n FileType[\"plaintext\"] = \"txt\";\n FileType[\"xml\"] = \"xml\";\n FileType[\"csv\"] = \"csv\";\n})(FileType || (FileType = {}));\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmlsZXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy93b3JkbGlzdC1nZW5lcmF0b3Ivc3JjL2xpYi9maWxldHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsOEJBQThCO0FBQzlCLE1BQU0sQ0FBTixJQUFZLFFBSVg7QUFKRCxXQUFZLFFBQVE7SUFDbEIsNkJBQWlCLENBQUE7SUFDakIsdUJBQVcsQ0FBQTtJQUNYLHVCQUFXLENBQUE7QUFDYixDQUFDLEVBSlcsUUFBUSxLQUFSLFFBQVEsUUFJbkIiLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQtZGlzYWJsZSBuby1zaGFkb3cgKi9cbmV4cG9ydCBlbnVtIEZpbGVUeXBlIHtcbiAgcGxhaW50ZXh0ID0gJ3R4dCcsXG4gIHhtbCA9ICd4bWwnLFxuICBjc3YgPSAnY3N2J1xufVxuIl19","export const toPlaintext = (wordlist) => ({\n wordlist,\n contentType: 'text/plain'\n});\nexport const toXML = (wordlist) => {\n const head = '<wordlist><word>';\n const glue = '</word><word>';\n const tail = '</word></wordlist>';\n return {\n wordlist: head + wordlist.replace(/\\n/g, glue) + tail,\n contentType: 'text/xml'\n };\n};\nexport const toCSV = (wordlist) => {\n const glue = ',';\n return {\n wordlist: wordlist.replace(/\\n/g, glue),\n contentType: 'text/csv'\n };\n};\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2Vycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvcGFyc2Vycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FDekIsUUFBZ0IsRUFDMkIsRUFBRSxDQUFDLENBQUM7SUFDL0MsUUFBUTtJQUNSLFdBQVcsRUFBRSxZQUFZO0NBQzFCLENBQUMsQ0FBQztBQUVILE1BQU0sQ0FBQyxNQUFNLEtBQUssR0FBRyxDQUNuQixRQUFnQixFQUMyQixFQUFFO0lBQzdDLE1BQU0sSUFBSSxHQUFHLGtCQUFrQixDQUFDO0lBQ2hDLE1BQU0sSUFBSSxHQUFHLGVBQWUsQ0FBQztJQUM3QixNQUFNLElBQUksR0FBRyxvQkFBb0IsQ0FBQztJQUNsQyxPQUFPO1FBQ0wsUUFBUSxFQUFFLElBQUksR0FBRyxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUMsR0FBRyxJQUFJO1FBQ3JELFdBQVcsRUFBRSxVQUFVO0tBQ3hCLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixNQUFNLENBQUMsTUFBTSxLQUFLLEdBQUcsQ0FDbkIsUUFBZ0IsRUFDMkIsRUFBRTtJQUM3QyxNQUFNLElBQUksR0FBRyxHQUFHLENBQUM7SUFDakIsT0FBTztRQUNMLFFBQVEsRUFBRSxRQUFRLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFJLENBQUM7UUFDdkMsV0FBVyxFQUFFLFVBQVU7S0FDeEIsQ0FBQztBQUNKLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCB0b1BsYWludGV4dCA9IChcbiAgd29yZGxpc3Q6IHN0cmluZ1xuKTogeyB3b3JkbGlzdDogc3RyaW5nOyBjb250ZW50VHlwZTogc3RyaW5nIH0gPT4gKHtcbiAgd29yZGxpc3QsXG4gIGNvbnRlbnRUeXBlOiAndGV4dC9wbGFpbidcbn0pO1xuXG5leHBvcnQgY29uc3QgdG9YTUwgPSAoXG4gIHdvcmRsaXN0OiBzdHJpbmdcbik6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9ID0+IHtcbiAgY29uc3QgaGVhZCA9ICc8d29yZGxpc3Q+PHdvcmQ+JztcbiAgY29uc3QgZ2x1ZSA9ICc8L3dvcmQ+PHdvcmQ+JztcbiAgY29uc3QgdGFpbCA9ICc8L3dvcmQ+PC93b3JkbGlzdD4nO1xuICByZXR1cm4ge1xuICAgIHdvcmRsaXN0OiBoZWFkICsgd29yZGxpc3QucmVwbGFjZSgvXFxuL2csIGdsdWUpICsgdGFpbCxcbiAgICBjb250ZW50VHlwZTogJ3RleHQveG1sJ1xuICB9O1xufTtcblxuZXhwb3J0IGNvbnN0IHRvQ1NWID0gKFxuICB3b3JkbGlzdDogc3RyaW5nXG4pOiB7IHdvcmRsaXN0OiBzdHJpbmc7IGNvbnRlbnRUeXBlOiBzdHJpbmcgfSA9PiB7XG4gIGNvbnN0IGdsdWUgPSAnLCc7XG4gIHJldHVybiB7XG4gICAgd29yZGxpc3Q6IHdvcmRsaXN0LnJlcGxhY2UoL1xcbi9nLCBnbHVlKSxcbiAgICBjb250ZW50VHlwZTogJ3RleHQvY3N2J1xuICB9O1xufTtcbiJdfQ==","import { Injectable } from '@angular/core';\nimport { product } from 'cartesian-product-generator';\nimport { from } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport * as i0 from \"@angular/core\";\nexport class WordlistGeneratorService {\n constructor() {\n //\n }\n generateWordlist(...charsets) {\n return from(product(...charsets)).pipe(map((word) => {\n return word.join('');\n }));\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }\n static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, providedIn: 'root' }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorService, decorators: [{\n type: Injectable,\n args: [{\n providedIn: 'root'\n }]\n }], ctorParameters: () => [] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvbGliL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDM0MsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ3RELE9BQU8sRUFBRSxJQUFJLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDeEMsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDOztBQUtyQyxNQUFNLE9BQU8sd0JBQXdCO0lBQ25DO1FBQ0UsRUFBRTtJQUNKLENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxHQUFHLFFBQWtCO1FBQ3BDLE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUNwQyxHQUFHLENBQUMsQ0FBQyxJQUFjLEVBQUUsRUFBRTtZQUNyQixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7OEdBWFUsd0JBQXdCO2tIQUF4Qix3QkFBd0IsY0FGdkIsTUFBTTs7MkZBRVAsd0JBQXdCO2tCQUhwQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IHByb2R1Y3QgfSBmcm9tICdjYXJ0ZXNpYW4tcHJvZHVjdC1nZW5lcmF0b3InO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2Uge1xuICBjb25zdHJ1Y3RvcigpIHtcbiAgICAvL1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCguLi5jaGFyc2V0czogc3RyaW5nW10pOiBPYnNlcnZhYmxlPHN0cmluZz4ge1xuICAgIHJldHVybiBmcm9tKHByb2R1Y3QoLi4uY2hhcnNldHMpKS5waXBlKFxuICAgICAgbWFwKCh3b3JkOiBzdHJpbmdbXSkgPT4ge1xuICAgICAgICByZXR1cm4gd29yZC5qb2luKCcnKTtcbiAgICAgIH0pXG4gICAgKTtcbiAgfVxufVxuIl19","import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop';\nimport { AsyncPipe, NgStyle } from '@angular/common';\nimport { Component, input, ViewEncapsulation, inject } from '@angular/core';\nimport { ReactiveFormsModule, UntypedFormBuilder, Validators } from '@angular/forms';\nimport { MatButtonModule } from '@angular/material/button';\nimport { MatFormFieldModule } from '@angular/material/form-field';\nimport { MatIconModule } from '@angular/material/icon';\nimport { MatInputModule } from '@angular/material/input';\nimport { MatMenuModule } from '@angular/material/menu';\nimport { Subject } from 'rxjs';\nimport { reduce, takeUntil, tap } from 'rxjs/operators';\nimport { FileType } from './filetypes';\nimport { toCSV, toPlaintext, toXML } from './parsers';\nimport { WordlistGeneratorService } from './wordlist-generator.service';\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"@angular/material/button\";\nimport * as i2 from \"@angular/material/menu\";\nimport * as i3 from \"@angular/forms\";\nimport * as i4 from \"@angular/material/form-field\";\nimport * as i5 from \"@angular/material/input\";\nimport * as i6 from \"@angular/material/icon\";\n/* eslint-disable @angular-eslint/component-selector */\nexport class WordlistGeneratorComponent {\n constructor() {\n this.formBuilder = inject(UntypedFormBuilder);\n this.wordlistGenerator = inject(WordlistGeneratorService);\n this.buttonStyle = input({\n 'background-color': '#333333',\n color: '#cc7832'\n });\n this.dragStyle = input({ color: '#cc7832' });\n this.textStyle = input({ color: '#cc7832' });\n this.displayWordlist = false;\n this.fileType = FileType.plaintext;\n this.fileTypes = Object.values(FileType);\n this.filteredCharset = [];\n this.prefix = '';\n this.suffix = '';\n this.unsubscribe$ = new Subject();\n this.removeDuplicates = (unfiltered) => [...new Set(unfiltered)].join('');\n }\n ngOnInit() {\n this.generateForm();\n }\n ngOnDestroy() {\n this.unsubscribe$.next();\n this.unsubscribe$.complete();\n }\n get charsets() {\n if (this.charsetForm) {\n return this.charsetForm.get('charsets');\n }\n return undefined;\n }\n addCharset() {\n if (this.charsets) {\n this.charsets.push(this.formBuilder.control('', Validators.required));\n }\n }\n cloneCharset(index) {\n if (this.charsets) {\n const charset = this.charsets.value[index];\n this.charsets.insert(index, this.formBuilder.control(charset, Validators.required));\n }\n }\n downloadWordlist() {\n if (this.charsets) {\n if (this.filteredCharset !== this.filterCharset(this.charsets.value)) {\n this.generateWordlist();\n }\n const filename = `wordlist_${this.wordsGenerated}_words_${this.charsets.length}_positions.${this.fileType}`;\n this.getWordlist()\n .pipe(tap((wordlist) => {\n if (wordlist.length > 0) {\n const parsed = this.parseWordlist(wordlist);\n const file = new Blob([parsed.wordlist], {\n type: parsed.contentType\n });\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n if (window.navigator.msSaveOrOpenBlob) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n window.navigator.msSaveOrOpenBlob(file, filename);\n }\n else {\n const a = document.createElement('a');\n const url = URL.createObjectURL(file);\n a.href = url;\n a.download = filename;\n document.body.appendChild(a);\n a.click();\n setTimeout(() => {\n document.body.removeChild(a);\n window.URL.revokeObjectURL(url);\n }, 0);\n }\n }\n }))\n .subscribe();\n }\n }\n drop(event) {\n if (this.charsets) {\n moveItemInArray(this.charsets.controls, event.previousIndex, event.currentIndex);\n this.charsets.updateValueAndValidity();\n }\n }\n generateForm() {\n this.charsetForm = this.formBuilder.group({\n charsets: this.formBuilder.array([\n this.formBuilder.control('', Validators.required)\n ]),\n prefix: this.formBuilder.control(''),\n suffix: this.formBuilder.control('')\n });\n }\n generateWordlist() {\n if (this.charsetForm && this.charsets && this.charsets.valid) {\n this.filteredCharset = this.filterCharset(this.charsets.value);\n this.prefix = this.charsetForm.get('prefix')?.value\n ? this.charsetForm.get('prefix')?.value\n : '';\n this.suffix = this.charsetForm.get('suffix')?.value\n ? this.charsetForm.get('suffix')?.value\n : '';\n this.wordsGenerated = this.filteredCharset\n .map((charset) => charset.length)\n .reduce((previousLength, currentLength) => previousLength * currentLength);\n this.displayWordlist = this.wordsGenerated <= 100;\n this.wordlist$ = this.getWordlist();\n }\n }\n getWordlist() {\n return this.wordlistGenerator\n .generateWordlist(...this.filteredCharset)\n .pipe(reduce((wordlist, word) => `${wordlist}${this.prefix}${word}${this.suffix}\\n`, ''), takeUntil(this.unsubscribe$));\n }\n filterCharset(charsets) {\n return charsets.map((charset) => this.removeDuplicates(charset));\n }\n parseWordlist(wordlist) {\n switch (this.fileType) {\n case FileType.plaintext:\n return toPlaintext(wordlist);\n case FileType.xml:\n return toXML(wordlist);\n case FileType.csv:\n return toCSV(wordlist);\n }\n }\n removeCharset(i) {\n if (this.charsets && this.charsets.length > 1) {\n this.charsets.removeAt(i);\n }\n }\n static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }\n static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: \"17.0.0\", version: \"20.0.3\", type: WordlistGeneratorComponent, isStandalone: true, selector: \"wordlist-generator\", inputs: { buttonStyle: { classPropertyName: \"buttonStyle\", publicName: \"buttonStyle\", isSignal: true, isRequired: false, transformFunction: null }, dragStyle: { classPropertyName: \"dragStyle\", publicName: \"dragStyle\", isSignal: true, isRequired: false, transformFunction: null }, textStyle: { classPropertyName: \"textStyle\", publicName: \"textStyle\", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0, template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"], dependencies: [{ kind: \"ngmodule\", type: MatButtonModule }, { kind: \"component\", type: i1.MatButton, selector: \" button[matButton], a[matButton], button[mat-button], button[mat-raised-button], button[mat-flat-button], button[mat-stroked-button], a[mat-button], a[mat-raised-button], a[mat-flat-button], a[mat-stroked-button] \", inputs: [\"matButton\"], exportAs: [\"matButton\", \"matAnchor\"] }, { kind: \"directive\", type: NgStyle, selector: \"[ngStyle]\", inputs: [\"ngStyle\"] }, { kind: \"ngmodule\", type: MatMenuModule }, { kind: \"component\", type: i2.MatMenu, selector: \"mat-menu\", inputs: [\"backdropClass\", \"aria-label\", \"aria-labelledby\", \"aria-describedby\", \"xPosition\", \"yPosition\", \"overlapTrigger\", \"hasBackdrop\", \"class\", \"classList\"], outputs: [\"closed\", \"close\"], exportAs: [\"matMenu\"] }, { kind: \"component\", type: i2.MatMenuItem, selector: \"[mat-menu-item]\", inputs: [\"role\", \"disabled\", \"disableRipple\"], exportAs: [\"matMenuItem\"] }, { kind: \"directive\", type: i2.MatMenuTrigger, selector: \"[mat-menu-trigger-for], [matMenuTriggerFor]\", inputs: [\"mat-menu-trigger-for\", \"matMenuTriggerFor\", \"matMenuTriggerData\", \"matMenuTriggerRestoreFocus\"], outputs: [\"menuOpened\", \"onMenuOpen\", \"menuClosed\", \"onMenuClose\"], exportAs: [\"matMenuTrigger\"] }, { kind: \"ngmodule\", type: ReactiveFormsModule }, { kind: \"directive\", type: i3.ɵNgNoValidate, selector: \"form:not([ngNoForm]):not([ngNativeValidate])\" }, { kind: \"directive\", type: i3.DefaultValueAccessor, selector: \"input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]\" }, { kind: \"directive\", type: i3.NgControlStatus, selector: \"[formControlName],[ngModel],[formControl]\" }, { kind: \"directive\", type: i3.NgControlStatusGroup, selector: \"[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]\" }, { kind: \"directive\", type: i3.RequiredValidator, selector: \":not([type=checkbox])[required][formControlName],:not([type=checkbox])[required][formControl],:not([type=checkbox])[required][ngModel]\", inputs: [\"required\"] }, { kind: \"directive\", type: i3.FormGroupDirective, selector: \"[formGroup]\", inputs: [\"formGroup\"], outputs: [\"ngSubmit\"], exportAs: [\"ngForm\"] }, { kind: \"directive\", type: i3.FormControlName, selector: \"[formControlName]\", inputs: [\"formControlName\", \"disabled\", \"ngModel\"], outputs: [\"ngModelChange\"] }, { kind: \"directive\", type: i3.FormArrayName, selector: \"[formArrayName]\", inputs: [\"formArrayName\"] }, { kind: \"ngmodule\", type: MatFormFieldModule }, { kind: \"component\", type: i4.MatFormField, selector: \"mat-form-field\", inputs: [\"hideRequiredMarker\", \"color\", \"floatLabel\", \"appearance\", \"subscriptSizing\", \"hintLabel\"], exportAs: [\"matFormField\"] }, { kind: \"directive\", type: i4.MatLabel, selector: \"mat-label\" }, { kind: \"ngmodule\", type: MatInputModule }, { kind: \"directive\", type: i5.MatInput, selector: \"input[matInput], textarea[matInput], select[matNativeControl], input[matNativeControl], textarea[matNativeControl]\", inputs: [\"disabled\", \"id\", \"placeholder\", \"name\", \"required\", \"type\", \"errorStateMatcher\", \"aria-describedby\", \"value\", \"readonly\", \"disabledInteractive\"], exportAs: [\"matInput\"] }, { kind: \"directive\", type: CdkDropList, selector: \"[cdkDropList], cdk-drop-list\", inputs: [\"cdkDropListConnectedTo\", \"cdkDropListData\", \"cdkDropListOrientation\", \"id\", \"cdkDropListLockAxis\", \"cdkDropListDisabled\", \"cdkDropListSortingDisabled\", \"cdkDropListEnterPredicate\", \"cdkDropListSortPredicate\", \"cdkDropListAutoScrollDisabled\", \"cdkDropListAutoScrollStep\", \"cdkDropListElementContainer\"], outputs: [\"cdkDropListDropped\", \"cdkDropListEntered\", \"cdkDropListExited\", \"cdkDropListSorted\"], exportAs: [\"cdkDropList\"] }, { kind: \"directive\", type: CdkDrag, selector: \"[cdkDrag]\", inputs: [\"cdkDragData\", \"cdkDragLockAxis\", \"cdkDragRootElement\", \"cdkDragBoundary\", \"cdkDragStartDelay\", \"cdkDragFreeDragPosition\", \"cdkDragDisabled\", \"cdkDragConstrainPosition\", \"cdkDragPreviewClass\", \"cdkDragPreviewContainer\", \"cdkDragScale\"], outputs: [\"cdkDragStarted\", \"cdkDragReleased\", \"cdkDragEnded\", \"cdkDragEntered\", \"cdkDragExited\", \"cdkDragDropped\", \"cdkDragMoved\"], exportAs: [\"cdkDrag\"] }, { kind: \"ngmodule\", type: MatIconModule }, { kind: \"component\", type: i6.MatIcon, selector: \"mat-icon\", inputs: [\"color\", \"inline\", \"svgIcon\", \"fontSet\", \"fontIcon\"], exportAs: [\"matIcon\"] }, { kind: \"pipe\", type: AsyncPipe, name: \"async\" }], encapsulation: i0.ViewEncapsulation.None }); }\n}\ni0.ɵɵngDeclareClassMetadata({ minVersion: \"12.0.0\", version: \"20.0.3\", ngImport: i0, type: WordlistGeneratorComponent, decorators: [{\n type: Component,\n args: [{ selector: 'wordlist-generator', encapsulation: ViewEncapsulation.None, imports: [\n MatButtonModule,\n NgStyle,\n MatMenuModule,\n ReactiveFormsModule,\n MatFormFieldModule,\n MatInputModule,\n CdkDropList,\n CdkDrag,\n MatIconModule,\n AsyncPipe\n ], template: \"<div class=\\\"meta-container flex-row-wrap\\\">\\n <div class=\\\"form-container flex-column flex-fxflex\\\">\\n <div class=\\\"flex-row-wrap bottom-10\\\">\\n <button\\n class=\\\"generate-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"generateWordlist()\\\"\\n >\\n Generate wordlist\\n </button>\\n @if (wordlist$) {\\n <button\\n class=\\\"choose-format\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n [matMenuTriggerFor]=\\\"menu\\\"\\n >\\n Choose format\\n </button>\\n }\\n <mat-menu #menu=\\\"matMenu\\\">\\n @for (type of fileTypes; track type) {\\n <button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-menu-item\\n (click)=\\\"fileType = type\\\"\\n >\\n {{ type }}\\n </button>\\n }\\n </mat-menu>\\n @if (wordlist$) {\\n <button\\n class=\\\"download-wordlist\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n mat-raised-button\\n (click)=\\\"downloadWordlist()\\\"\\n >\\n Download as\\n @if (this.fileType) {\\n {{ this.fileType }}\\n }\\n </button>\\n }\\n </div>\\n @if (charsetForm) {\\n <form [formGroup]=\\\"charsetForm\\\">\\n <mat-form-field class=\\\"fixed-width bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">prefix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"prefix\\\"\\n formControlName=\\\"prefix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n <div formArrayName=\\\"charsets\\\">\\n <div cdkDropList (cdkDropListDropped)=\\\"drop($event)\\\">\\n @for (\\n charset of charsets?.controls;\\n track charset;\\n let i = $index\\n ) {\\n <div class=\\\"charset-container\\\" cdkDrag>\\n <mat-icon class=\\\"drag-indicator\\\" [ngStyle]=\\\"dragStyle()\\\"\\n >drag_indicator</mat-icon\\n >\\n <mat-form-field class=\\\"charset bottom-10\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">\\n character set for string position {{ i }}\\n </mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"position-{{ i }}\\\"\\n [formControlName]=\\\"i\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n required\\n />\\n </mat-form-field>\\n <button\\n mat-raised-button\\n class=\\\"clone-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"cloneCharset(i)\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">content_copy</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n class=\\\"remove-charset\\\"\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"removeCharset(i)\\\"\\n [disabled]=\\\"this.charsets?.value.length === 1\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">remove</mat-icon>\\n </button>\\n <button\\n mat-raised-button\\n [ngStyle]=\\\"buttonStyle()\\\"\\n (click)=\\\"addCharset()\\\"\\n >\\n <mat-icon class=\\\"row-button-icon\\\">add</mat-icon>\\n </button>\\n </div>\\n }\\n </div>\\n </div>\\n <mat-form-field class=\\\"fixed-width\\\" appearance=\\\"outline\\\">\\n <mat-label [ngStyle]=\\\"textStyle()\\\">suffix (optional)</mat-label>\\n <input\\n [ngStyle]=\\\"textStyle()\\\"\\n matInput\\n type=\\\"text\\\"\\n id=\\\"suffix\\\"\\n formControlName=\\\"suffix\\\"\\n (keydown.enter)=\\\"$event.preventDefault()\\\"\\n />\\n </mat-form-field>\\n </form>\\n }\\n </div>\\n @if (wordlist$) {\\n <div class=\\\"wordlist-container flex-column flex-fxflex\\\">\\n @if (displayWordlist) {\\n <h3 class=\\\"wordlist-header\\\">Generated wordlist:</h3>\\n <code class=\\\"wordlist\\\">\\n {{ wordlist$ | async }}\\n </code>\\n } @else {\\n The generated wordlist is too large to be displayed. You can still\\n download it.\\n }\\n </div>\\n }\\n</div>\\n\", styles: [\".flex-align-start{justify-content:flex-start}.flex-align-stretch{align-content:stretch;align-items:stretch}.flex-column{display:flex;flex-direction:column;box-sizing:border-box}.flex-row{display:flex;flex-direction:row;box-sizing:border-box}.flex-row-wrap{display:flex;flex-direction:row;flex-wrap:wrap;box-sizing:border-box}.flex-fxflex{flex:1 1 0%}.flex-fxflex-responsive{flex:0 1 calc(33.3% - 32px)}.flex-fxflex-lt-md{flex:0 1 calc(50% - 32px)}.flex-fxflex-lt-sm{flex:100%}.flex-fxflex-fill{height:100%;min-height:100%;min-width:100%;width:100%}.flex-gap-5{margin-right:5px}.flex-gap-12{margin-right:12px}.flex-gap-20{margin-right:20px}.meta-container{max-width:100vw}.meta-container .form-container{float:left}.meta-container .form-container .charset-container .drag-indicator{height:20px;width:20px;margin-right:10px}.meta-container .form-container .charset-container .clone-charset{margin:0 10px}.meta-container .form-container .charset-container .remove-charset{margin-right:10px}@media screen and (max-width: 430px){.meta-container .form-container .charset-container{margin-bottom:15px}}.meta-container .form-container .charset{width:19.15em}.meta-container .form-container .charset-container:not(:last-child) .add-charset{display:none}.meta-container .form-container .choose-format{margin:0 34px 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .form-container .generate-wordlist,.meta-container .form-container .download-wordlist{margin:0 0 10px;width:150px;line-height:36px;letter-spacing:normal}.meta-container .wordlist-container{max-height:80vh}.meta-container .wordlist-container .wordlist-header{margin-top:0}.meta-container .wordlist-container .wordlist{font-size:12px;margin-left:1em;overflow-wrap:normal;width:1%}.row-button-icon{font-size:24px!important;height:24px!important;width:24px!important;margin:0!important}.mat-mdc-menu-panel{width:150px}.mat-mdc-menu-item-text{line-height:48px!important;letter-spacing:normal!important;font-size:14px!important}.mat-mdc-form-field{height:50px!important}.mat-mdc-form-field-infix{height:42px!important;min-height:42px!important;max-height:42px!important;border:0!important;padding:.5em 0!important}.mat-mdc-text-field-wrapper{height:42px!important;padding-left:12px!important;padding-bottom:0!important}.mat-mdc-floating-label:not(.mdc-floating-label--float-above){top:19px!important}.mat-mdc-form-field:not(.mat-form-field-no-animations) .mdc-floating-label{transition:none!important}.fixed-width{width:21em}.bottom-10{margin-bottom:10px}\\n\"] }]\n }] });\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvd29yZGxpc3QtZ2VuZXJhdG9yL3NyYy9saWIvd29yZGxpc3QtZ2VuZXJhdG9yLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxPQUFPLEVBRVAsV0FBVyxFQUNYLGVBQWUsRUFDaEIsTUFBTSx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3JELE9BQU8sRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFxQixpQkFBaUIsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDL0YsT0FBTyxFQUNMLG1CQUFtQixFQUVuQixrQkFBa0IsRUFFbEIsVUFBVSxFQUNYLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzNELE9BQU8sRUFBRSxrQkFBa0IsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQ2xFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFBYyxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDM0MsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFP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Z0Ryb3AsXG4gIENka0Ryb3BMaXN0LFxuICBtb3ZlSXRlbUluQXJyYXlcbn0gZnJvbSAnQGFuZ3VsYXIvY2RrL2RyYWctZHJvcCc7XG5pbXBvcnQgeyBBc3luY1BpcGUsIE5nU3R5bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHsgQ29tcG9uZW50LCBpbnB1dCwgT25EZXN0cm95LCBPbkluaXQsIFZpZXdFbmNhcHN1bGF0aW9uLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7XG4gIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gIFVudHlwZWRGb3JtQXJyYXksXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBNYXRCdXR0b25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgTWF0Rm9ybUZpZWxkTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvZm9ybS1maWVsZCc7XG5pbXBvcnQgeyBNYXRJY29uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvbWF0ZXJpYWwvaWNvbic7XG5pbXBvcnQgeyBNYXRJbnB1dE1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL21hdGVyaWFsL2lucHV0JztcbmltcG9ydCB7IE1hdE1lbnVNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9tZW51JztcbmltcG9ydCB7IE9ic2VydmFibGUsIFN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IHJlZHVjZSwgdGFrZVVudGlsLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5cbmltcG9ydCB7IEZpbGVUeXBlIH0gZnJvbSAnLi9maWxldHlwZXMnO1xuaW1wb3J0IHsgdG9DU1YsIHRvUGxhaW50ZXh0LCB0b1hNTCB9IGZyb20gJy4vcGFyc2Vycyc7XG5pbXBvcnQgeyBXb3JkbGlzdEdlbmVyYXRvclNlcnZpY2UgfSBmcm9tICcuL3dvcmRsaXN0LWdlbmVyYXRvci5zZXJ2aWNlJztcblxuLyogZXNsaW50LWRpc2FibGUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICd3b3JkbGlzdC1nZW5lcmF0b3InLFxuICAgIHRlbXBsYXRlVXJsOiAnLi93b3JkbGlzdC1nZW5lcmF0b3IuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL3dvcmRsaXN0LWdlbmVyYXRvci5jb21wb25lbnQuc2NzcyddLFxuICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uLk5vbmUsXG4gICAgaW1wb3J0czogW1xuICAgICAgICBNYXRCdXR0b25Nb2R1bGUsXG4gICAgICAgIE5nU3R5bGUsXG4gICAgICAgIE1hdE1lbnVNb2R1bGUsXG4gICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsXG4gICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSxcbiAgICAgICAgTWF0SW5wdXRNb2R1bGUsXG4gICAgICAgIENka0Ryb3BMaXN0LFxuICAgICAgICBDZGtEcmFnLFxuICAgICAgICBNYXRJY29uTW9kdWxlLFxuICAgICAgICBBc3luY1BpcGVcbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIFdvcmRsaXN0R2VuZXJhdG9yQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBwcml2YXRlIGZvcm1CdWlsZGVyID0gaW5qZWN0KFVudHlwZWRGb3JtQnVpbGRlcik7XG4gIHByaXZhdGUgd29yZGxpc3RHZW5lcmF0b3IgPSBpbmplY3QoV29yZGxpc3RHZW5lcmF0b3JTZXJ2aWNlKTtcblxuICBidXR0b25TdHlsZSA9IGlucHV0KHtcbiAgICAnYmFja2dyb3VuZC1jb2xvcic6ICcjMzMzMzMzJyxcbiAgICBjb2xvcjogJyNjYzc4MzInXG4gIH0pO1xuXG4gIGRyYWdTdHlsZSA9IGlucHV0KHsgY29sb3I6ICcjY2M3ODMyJyB9KTtcbiAgdGV4dFN0eWxlID0gaW5wdXQoeyBjb2xvcjogJyNjYzc4MzInIH0pO1xuXG4gIGNoYXJzZXRGb3JtOiBVbnR5cGVkRm9ybUdyb3VwIHwgdW5kZWZpbmVkO1xuICB3b3Jkc0dlbmVyYXRlZDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICB3b3JkbGlzdCQ6IE9ic2VydmFibGU8c3RyaW5nPiB8IHVuZGVmaW5lZDtcblxuICBkaXNwbGF5V29yZGxpc3QgPSBmYWxzZTtcbiAgZmlsZVR5cGUgPSBGaWxlVHlwZS5wbGFpbnRleHQ7XG4gIGZpbGVUeXBlcyA9IE9iamVjdC52YWx1ZXMoRmlsZVR5cGUpO1xuICBmaWx0ZXJlZENoYXJzZXQ6IHN0cmluZ1tdID0gW107XG4gIHByZWZpeCA9ICcnO1xuICBzdWZmaXggPSAnJztcblxuICBwcml2YXRlIHVuc3Vic2NyaWJlJCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgdGhpcy5nZW5lcmF0ZUZvcm0oKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xuICAgIHRoaXMudW5zdWJzY3JpYmUkLm5leHQoKTtcbiAgICB0aGlzLnVuc3Vic2NyaWJlJC5jb21wbGV0ZSgpO1xuICB9XG5cbiAgZ2V0IGNoYXJzZXRzKCk6IFVudHlwZWRGb3JtQXJyYXkgfCB1bmRlZmluZWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRGb3JtKSB7XG4gICAgICByZXR1cm4gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ2NoYXJzZXRzJykgYXMgVW50eXBlZEZvcm1BcnJheTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIGFkZENoYXJzZXQoKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuY2hhcnNldHMpIHtcbiAgICAgIHRoaXMuY2hhcnNldHMucHVzaCh0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpKTtcbiAgICB9XG4gIH1cblxuICBjbG9uZUNoYXJzZXQoaW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBjb25zdCBjaGFyc2V0ID0gdGhpcy5jaGFyc2V0cy52YWx1ZVtpbmRleF07XG4gICAgICB0aGlzLmNoYXJzZXRzLmluc2VydChcbiAgICAgICAgaW5kZXgsXG4gICAgICAgIHRoaXMuZm9ybUJ1aWxkZXIuY29udHJvbChjaGFyc2V0LCBWYWxpZGF0b3JzLnJlcXVpcmVkKVxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICBkb3dubG9hZFdvcmRsaXN0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzKSB7XG4gICAgICBpZiAodGhpcy5maWx0ZXJlZENoYXJzZXQgIT09IHRoaXMuZmlsdGVyQ2hhcnNldCh0aGlzLmNoYXJzZXRzLnZhbHVlKSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRlV29yZGxpc3QoKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGZpbGVuYW1lID0gYHdvcmRsaXN0XyR7dGhpcy53b3Jkc0dlbmVyYXRlZH1fd29yZHNfJHt0aGlzLmNoYXJzZXRzLmxlbmd0aH1fcG9zaXRpb25zLiR7dGhpcy5maWxlVHlwZX1gO1xuICAgICAgdGhpcy5nZXRXb3JkbGlzdCgpXG4gICAgICAgIC5waXBlKFxuICAgICAgICAgIHRhcCgod29yZGxpc3Q6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgaWYgKHdvcmRsaXN0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgY29uc3QgcGFyc2VkID0gdGhpcy5wYXJzZVdvcmRsaXN0KHdvcmRsaXN0KTtcbiAgICAgICAgICAgICAgY29uc3QgZmlsZSA9IG5ldyBCbG9iKFtwYXJzZWQud29yZGxpc3RdLCB7XG4gICAgICAgICAgICAgICAgdHlwZTogcGFyc2VkLmNvbnRlbnRUeXBlXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICBpZiAoKHdpbmRvdy5uYXZpZ2F0b3IgYXMgYW55KS5tc1NhdmVPck9wZW5CbG9iKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAod2luZG93Lm5hdmlnYXRvciBhcyBhbnkpLm1zU2F2ZU9yT3BlbkJsb2IoZmlsZSwgZmlsZW5hbWUpO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gVVJMLmNyZWF0ZU9iamVjdFVSTChmaWxlKTtcbiAgICAgICAgICAgICAgICBhLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgYS5kb3dubG9hZCA9IGZpbGVuYW1lO1xuICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYSk7XG4gICAgICAgICAgICAgICAgYS5jbGljaygpO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChhKTtcbiAgICAgICAgICAgICAgICAgIHdpbmRvdy5VUkwucmV2b2tlT2JqZWN0VVJMKHVybCk7XG4gICAgICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5zdWJzY3JpYmUoKTtcbiAgICB9XG4gIH1cblxuICBkcm9wKGV2ZW50OiBDZGtEcmFnRHJvcDxzdHJpbmdbXT4pOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0cykge1xuICAgICAgbW92ZUl0ZW1JbkFycmF5KFxuICAgICAgICB0aGlzLmNoYXJzZXRzLmNvbnRyb2xzLFxuICAgICAgICBldmVudC5wcmV2aW91c0luZGV4LFxuICAgICAgICBldmVudC5jdXJyZW50SW5kZXhcbiAgICAgICk7XG4gICAgICB0aGlzLmNoYXJzZXRzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTtcbiAgICB9XG4gIH1cblxuICBnZW5lcmF0ZUZvcm0oKTogdm9pZCB7XG4gICAgdGhpcy5jaGFyc2V0Rm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgY2hhcnNldHM6IHRoaXMuZm9ybUJ1aWxkZXIuYXJyYXkoW1xuICAgICAgICB0aGlzLmZvcm1CdWlsZGVyLmNvbnRyb2woJycsIFZhbGlkYXRvcnMucmVxdWlyZWQpXG4gICAgICBdKSxcbiAgICAgIHByZWZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKSxcbiAgICAgIHN1ZmZpeDogdGhpcy5mb3JtQnVpbGRlci5jb250cm9sKCcnKVxuICAgIH0pO1xuICB9XG5cbiAgZ2VuZXJhdGVXb3JkbGlzdCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5jaGFyc2V0Rm9ybSAmJiB0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMudmFsaWQpIHtcbiAgICAgIHRoaXMuZmlsdGVyZWRDaGFyc2V0ID0gdGhpcy5maWx0ZXJDaGFyc2V0KHRoaXMuY2hhcnNldHMudmFsdWUpO1xuICAgICAgdGhpcy5wcmVmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgncHJlZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3ByZWZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuICAgICAgdGhpcy5zdWZmaXggPSB0aGlzLmNoYXJzZXRGb3JtLmdldCgnc3VmZml4Jyk/LnZhbHVlXG4gICAgICAgID8gdGhpcy5jaGFyc2V0Rm9ybS5nZXQoJ3N1ZmZpeCcpPy52YWx1ZVxuICAgICAgICA6ICcnO1xuXG4gICAgICB0aGlzLndvcmRzR2VuZXJhdGVkID0gdGhpcy5maWx0ZXJlZENoYXJzZXRcbiAgICAgICAgLm1hcCgoY2hhcnNldDogc3RyaW5nKSA9PiBjaGFyc2V0Lmxlbmd0aClcbiAgICAgICAgLnJlZHVjZShcbiAgICAgICAgICAocHJldmlvdXNMZW5ndGg6IG51bWJlciwgY3VycmVudExlbmd0aDogbnVtYmVyKSA9PlxuICAgICAgICAgICAgcHJldmlvdXNMZW5ndGggKiBjdXJyZW50TGVuZ3RoXG4gICAgICAgICk7XG4gICAgICB0aGlzLmRpc3BsYXlXb3JkbGlzdCA9IHRoaXMud29yZHNHZW5lcmF0ZWQgPD0gMTAwO1xuICAgICAgdGhpcy53b3JkbGlzdCQgPSB0aGlzLmdldFdvcmRsaXN0KCk7XG4gICAgfVxuICB9XG5cbiAgZ2V0V29yZGxpc3QoKTogT2JzZXJ2YWJsZTxzdHJpbmc+IHtcbiAgICByZXR1cm4gdGhpcy53b3JkbGlzdEdlbmVyYXRvclxuICAgICAgLmdlbmVyYXRlV29yZGxpc3QoLi4udGhpcy5maWx0ZXJlZENoYXJzZXQpXG4gICAgICAucGlwZShcbiAgICAgICAgcmVkdWNlKFxuICAgICAgICAgICh3b3JkbGlzdDogc3RyaW5nLCB3b3JkOiBzdHJpbmcpID0+XG4gICAgICAgICAgICBgJHt3b3JkbGlzdH0ke3RoaXMucHJlZml4fSR7d29yZH0ke3RoaXMuc3VmZml4fVxcbmAsXG4gICAgICAgICAgJydcbiAgICAgICAgKSxcbiAgICAgICAgdGFrZVVudGlsKHRoaXMudW5zdWJzY3JpYmUkKVxuICAgICAgKTtcbiAgfVxuXG4gIGZpbHRlckNoYXJzZXQoY2hhcnNldHM6IHN0cmluZ1tdKTogc3RyaW5nW10ge1xuICAgIHJldHVybiBjaGFyc2V0cy5tYXAoKGNoYXJzZXQ6IHN0cmluZykgPT4gdGhpcy5yZW1vdmVEdXBsaWNhdGVzKGNoYXJzZXQpKTtcbiAgfVxuXG4gIHBhcnNlV29yZGxpc3Qod29yZGxpc3Q6IHN0cmluZyk6IHsgd29yZGxpc3Q6IHN0cmluZzsgY29udGVudFR5cGU6IHN0cmluZyB9IHtcbiAgICBzd2l0Y2ggKHRoaXMuZmlsZVR5cGUpIHtcbiAgICAgIGNhc2UgRmlsZVR5cGUucGxhaW50ZXh0OlxuICAgICAgICByZXR1cm4gdG9QbGFpbnRleHQod29yZGxpc3QpO1xuICAgICAgY2FzZSBGaWxlVHlwZS54bWw6XG4gICAgICAgIHJldHVybiB0b1hNTCh3b3JkbGlzdCk7XG4gICAgICBjYXNlIEZpbGVUeXBlLmNzdjpcbiAgICAgICAgcmV0dXJuIHRvQ1NWKHdvcmRsaXN0KTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVDaGFyc2V0KGk6IG51bWJlcik6IHZvaWQge1xuICAgIGlmICh0aGlzLmNoYXJzZXRzICYmIHRoaXMuY2hhcnNldHMubGVuZ3RoID4gMSkge1xuICAgICAgdGhpcy5jaGFyc2V0cy5yZW1vdmVBdChpKTtcbiAgICB9XG4gIH1cblxuICByZW1vdmVEdXBsaWNhdGVzID0gKHVuZmlsdGVyZWQ6IHN0cmluZyk6IHN0cmluZyA9PlxuICAgIFsuLi5uZXcgU2V0KHVuZmlsdGVyZWQpXS5qb2luKCcnKTtcbn1cbiIsIjxkaXYgY2xhc3M9XCJtZXRhLWNvbnRhaW5lciBmbGV4LXJvdy13cmFwXCI+XG4gIDxkaXYgY2xhc3M9XCJmb3JtLWNvbnRhaW5lciBmbGV4LWNvbHVtbiBmbGV4LWZ4ZmxleFwiPlxuICAgIDxkaXYgY2xhc3M9XCJmbGV4LXJvdy13cmFwIGJvdHRvbS0xMFwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBjbGFzcz1cImdlbmVyYXRlLXdvcmRsaXN0XCJcbiAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgIChjbGljayk9XCJnZW5lcmF0ZVdvcmRsaXN0KClcIlxuICAgICAgPlxuICAgICAgICBHZW5lcmF0ZSB3b3JkbGlzdFxuICAgICAgPC9idXR0b24+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJjaG9vc2UtZm9ybWF0XCJcbiAgICAgICAgICBbbmdTdHlsZV09XCJidXR0b25TdHlsZSgpXCJcbiAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgIFttYXRNZW51VHJpZ2dlckZvcl09XCJtZW51XCJcbiAgICAgICAgPlxuICAgICAgICAgIENob29zZSBmb3JtYXRcbiAgICAgICAgPC9idXR0b24+XG4gICAgICB9XG4gICAgICA8bWF0LW1lbnUgI21lbnU9XCJtYXRNZW51XCI+XG4gICAgICAgIEBmb3IgKHR5cGUgb2YgZmlsZVR5cGVzOyB0cmFjayB0eXBlKSB7XG4gICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICBtYXQtbWVudS1pdGVtXG4gICAgICAgICAgICAoY2xpY2spPVwiZmlsZVR5cGUgPSB0eXBlXCJcbiAgICAgICAgICA+XG4gICAgICAgICAgICB7eyB0eXBlIH19XG4gICAgICAgICAgPC9idXR0b24+XG4gICAgICAgIH1cbiAgICAgIDwvbWF0LW1lbnU+XG4gICAgICBAaWYgKHdvcmRsaXN0JCkge1xuICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgY2xhc3M9XCJkb3dubG9hZC13b3JkbGlzdFwiXG4gICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgbWF0LXJhaXNlZC1idXR0b25cbiAgICAgICAgICAoY2xpY2spPVwiZG93bmxvYWRXb3JkbGlzdCgpXCJcbiAgICAgICAgPlxuICAgICAgICAgIERvd25sb2FkIGFzXG4gICAgICAgICAgQGlmICh0aGlzLmZpbGVUeXBlKSB7XG4gICAgICAgICAgICB7eyB0aGlzLmZpbGVUeXBlIH19XG4gICAgICAgICAgfVxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBAaWYgKGNoYXJzZXRGb3JtKSB7XG4gICAgICA8Zm9ybSBbZm9ybUdyb3VwXT1cImNoYXJzZXRGb3JtXCI+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoIGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgPG1hdC1sYWJlbCBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiPnByZWZpeCAob3B0aW9uYWwpPC9tYXQtbGFiZWw+XG4gICAgICAgICAgPGlucHV0XG4gICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICBtYXRJbnB1dFxuICAgICAgICAgICAgdHlwZT1cInRleHRcIlxuICAgICAgICAgICAgaWQ9XCJwcmVmaXhcIlxuICAgICAgICAgICAgZm9ybUNvbnRyb2xOYW1lPVwicHJlZml4XCJcbiAgICAgICAgICAgIChrZXlkb3duLmVudGVyKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpXCJcbiAgICAgICAgICAvPlxuICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9XCJjaGFyc2V0c1wiPlxuICAgICAgICAgIDxkaXYgY2RrRHJvcExpc3QgKGNka0Ryb3BMaXN0RHJvcHBlZCk9XCJkcm9wKCRldmVudClcIj5cbiAgICAgICAgICAgIEBmb3IgKFxuICAgICAgICAgICAgICBjaGFyc2V0IG9mIGNoYXJzZXRzPy5jb250cm9scztcbiAgICAgICAgICAgICAgdHJhY2sgY2hhcnNldDtcbiAgICAgICAgICAgICAgbGV0IGkgPSAkaW5kZXhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hhcnNldC1jb250YWluZXJcIiBjZGtEcmFnPlxuICAgICAgICAgICAgICAgIDxtYXQtaWNvbiBjbGFzcz1cImRyYWctaW5kaWNhdG9yXCIgW25nU3R5bGVdPVwiZHJhZ1N0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgPmRyYWdfaW5kaWNhdG9yPC9tYXQtaWNvblxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICA8bWF0LWZvcm0tZmllbGQgY2xhc3M9XCJjaGFyc2V0IGJvdHRvbS0xMFwiIGFwcGVhcmFuY2U9XCJvdXRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+XG4gICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlciBzZXQgZm9yIHN0cmluZyBwb3NpdGlvbiB7eyBpIH19XG4gICAgICAgICAgICAgICAgICA8L21hdC1sYWJlbD5cbiAgICAgICAgICAgICAgICAgIDxpbnB1dFxuICAgICAgICAgICAgICAgICAgICBbbmdTdHlsZV09XCJ0ZXh0U3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJ0ZXh0XCJcbiAgICAgICAgICAgICAgICAgICAgaWQ9XCJwb3NpdGlvbi17eyBpIH19XCJcbiAgICAgICAgICAgICAgICAgICAgW2Zvcm1Db250cm9sTmFtZV09XCJpXCJcbiAgICAgICAgICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgICAgICAgICAgICByZXF1aXJlZFxuICAgICAgICAgICAgICAgICAgLz5cbiAgICAgICAgICAgICAgICA8L21hdC1mb3JtLWZpZWxkPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cImNsb25lLWNoYXJzZXRcIlxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiY2xvbmVDaGFyc2V0KGkpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5jb250ZW50X2NvcHk8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgIG1hdC1yYWlzZWQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICBjbGFzcz1cInJlbW92ZS1jaGFyc2V0XCJcbiAgICAgICAgICAgICAgICAgIFtuZ1N0eWxlXT1cImJ1dHRvblN0eWxlKClcIlxuICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInJlbW92ZUNoYXJzZXQoaSlcIlxuICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cInRoaXMuY2hhcnNldHM/LnZhbHVlLmxlbmd0aCA9PT0gMVwiXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgPG1hdC1pY29uIGNsYXNzPVwicm93LWJ1dHRvbi1pY29uXCI+cmVtb3ZlPC9tYXQtaWNvbj5cbiAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICBtYXQtcmFpc2VkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgW25nU3R5bGVdPVwiYnV0dG9uU3R5bGUoKVwiXG4gICAgICAgICAgICAgICAgICAoY2xpY2spPVwiYWRkQ2hhcnNldCgpXCJcbiAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICA8bWF0LWljb24gY2xhc3M9XCJyb3ctYnV0dG9uLWljb25cIj5hZGQ8L21hdC1pY29uPlxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxtYXQtZm9ybS1maWVsZCBjbGFzcz1cImZpeGVkLXdpZHRoXCIgYXBwZWFyYW5jZT1cIm91dGxpbmVcIj5cbiAgICAgICAgICA8bWF0LWxhYmVsIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCI+c3VmZml4IChvcHRpb25hbCk8L21hdC1sYWJlbD5cbiAgICAgICAgICA8aW5wdXRcbiAgICAgICAgICAgIFtuZ1N0eWxlXT1cInRleHRTdHlsZSgpXCJcbiAgICAgICAgICAgIG1hdElucHV0XG4gICAgICAgICAgICB0eXBlPVwidGV4dFwiXG4gICAgICAgICAgICBpZD1cInN1ZmZpeFwiXG4gICAgICAgICAgICBmb3JtQ29udHJvbE5hbWU9XCJzdWZmaXhcIlxuICAgICAgICAgICAgKGtleWRvd24uZW50ZXIpPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KClcIlxuICAgICAgICAgIC8+XG4gICAgICAgIDwvbWF0LWZvcm0tZmllbGQ+XG4gICAgICA8L2Zvcm0+XG4gICAgfVxuICA8L2Rpdj5cbiAgQGlmICh3b3JkbGlzdCQpIHtcbiAgICA8ZGl2IGNsYXNzPVwid29yZGxpc3QtY29udGFpbmVyIGZsZXgtY29sdW1uIGZsZXgtZnhmbGV4XCI+XG4gICAgICBAaWYgKGRpc3BsYXlXb3JkbGlzdCkge1xuICAgICAgICA8aDMgY2xhc3M9XCJ3b3JkbGlzdC1oZWFkZXJcIj5HZW5lcmF0ZWQgd29yZGxpc3Q6PC9oMz5cbiAgICAgICAgPGNvZGUgY2xhc3M9XCJ3b3JkbGlzdFwiPlxuICAgICAgICAgIHt7IHdvcmRsaXN0JCB8IGFzeW5jIH19XG4gICAgICAgIDwvY29kZT5cbiAgICAgIH0gQGVsc2Uge1xuICAgICAgICBUaGUgZ2VuZXJhdGVkIHdvcmRsaXN0IGlzIHRvbyBsYXJnZSB0byBiZSBkaXNwbGF5ZWQuIFlvdSBjYW4gc3RpbGxcbiAgICAgICAgZG93bmxvYWQgaXQuXG4gICAgICB9XG4gICAgPC9kaXY+XG4gIH1cbjwvZGl2PlxuIl19","/**\n * Generated bundle index. Do not edit.\n */\nexport * from './index';\n//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9saWJzL3dvcmRsaXN0LWdlbmVyYXRvci9zcmMvdGVodzBsZi13b3JkbGlzdC1nZW5lcmF0b3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7O0dBRUc7QUFFSCxjQUFjLFNBQVMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogR2VuZXJhdGVkIGJ1bmRsZSBpbmRleC4gRG8gbm90IGVkaXQuXG4gKi9cblxuZXhwb3J0ICogZnJvbSAnLi9pbmRleCc7XG4iXX0="],"names":[],"mappings":"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"}
|
package/index.d.ts
CHANGED
|
@@ -1 +1,57 @@
|
|
|
1
|
-
|
|
1
|
+
import * as _angular_core from '@angular/core';
|
|
2
|
+
import { OnInit, OnDestroy } from '@angular/core';
|
|
3
|
+
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
4
|
+
import { UntypedFormGroup, UntypedFormArray } from '@angular/forms';
|
|
5
|
+
import { Observable } from 'rxjs';
|
|
6
|
+
|
|
7
|
+
declare enum FileType {
|
|
8
|
+
plaintext = "txt",
|
|
9
|
+
xml = "xml",
|
|
10
|
+
csv = "csv"
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
declare class WordlistGeneratorComponent implements OnInit, OnDestroy {
|
|
14
|
+
private formBuilder;
|
|
15
|
+
private wordlistGenerator;
|
|
16
|
+
buttonStyle: _angular_core.InputSignal<{
|
|
17
|
+
'background-color': string;
|
|
18
|
+
color: string;
|
|
19
|
+
}>;
|
|
20
|
+
dragStyle: _angular_core.InputSignal<{
|
|
21
|
+
color: string;
|
|
22
|
+
}>;
|
|
23
|
+
textStyle: _angular_core.InputSignal<{
|
|
24
|
+
color: string;
|
|
25
|
+
}>;
|
|
26
|
+
charsetForm: UntypedFormGroup | undefined;
|
|
27
|
+
wordsGenerated: number | undefined;
|
|
28
|
+
wordlist$: Observable<string> | undefined;
|
|
29
|
+
displayWordlist: boolean;
|
|
30
|
+
fileType: FileType;
|
|
31
|
+
fileTypes: FileType[];
|
|
32
|
+
filteredCharset: string[];
|
|
33
|
+
prefix: string;
|
|
34
|
+
suffix: string;
|
|
35
|
+
private unsubscribe$;
|
|
36
|
+
ngOnInit(): void;
|
|
37
|
+
ngOnDestroy(): void;
|
|
38
|
+
get charsets(): UntypedFormArray | undefined;
|
|
39
|
+
addCharset(): void;
|
|
40
|
+
cloneCharset(index: number): void;
|
|
41
|
+
downloadWordlist(): void;
|
|
42
|
+
drop(event: CdkDragDrop<string[]>): void;
|
|
43
|
+
generateForm(): void;
|
|
44
|
+
generateWordlist(): void;
|
|
45
|
+
getWordlist(): Observable<string>;
|
|
46
|
+
filterCharset(charsets: string[]): string[];
|
|
47
|
+
parseWordlist(wordlist: string): {
|
|
48
|
+
wordlist: string;
|
|
49
|
+
contentType: string;
|
|
50
|
+
};
|
|
51
|
+
removeCharset(i: number): void;
|
|
52
|
+
removeDuplicates: (unfiltered: string) => string;
|
|
53
|
+
static ɵfac: _angular_core.ɵɵFactoryDeclaration<WordlistGeneratorComponent, never>;
|
|
54
|
+
static ɵcmp: _angular_core.ɵɵComponentDeclaration<WordlistGeneratorComponent, "wordlist-generator", never, { "buttonStyle": { "alias": "buttonStyle"; "required": false; "isSignal": true; }; "dragStyle": { "alias": "dragStyle"; "required": false; "isSignal": true; }; "textStyle": { "alias": "textStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { WordlistGeneratorComponent };
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tehw0lf/wordlist-generator",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.1",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"homepage": "https://github.com/tehw0lf/tehwolf.de.git",
|
|
6
6
|
"repository": {
|
|
@@ -8,13 +8,13 @@
|
|
|
8
8
|
"url": "git+https://github.com/tehw0lf/tehwolf.de.git"
|
|
9
9
|
},
|
|
10
10
|
"peerDependencies": {
|
|
11
|
-
"@angular/animations": "
|
|
12
|
-
"@angular/cdk": "
|
|
13
|
-
"@angular/common": "
|
|
14
|
-
"@angular/core": "
|
|
15
|
-
"@angular/forms": "
|
|
16
|
-
"@angular/material": "
|
|
17
|
-
"@tehw0lf/mvc": "^0.0.
|
|
11
|
+
"@angular/animations": "20.0.3",
|
|
12
|
+
"@angular/cdk": "20.0.3",
|
|
13
|
+
"@angular/common": "20.0.3",
|
|
14
|
+
"@angular/core": "20.0.3",
|
|
15
|
+
"@angular/forms": "20.0.3",
|
|
16
|
+
"@angular/material": "20.0.3",
|
|
17
|
+
"@tehw0lf/mvc": "^0.0.4"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"tslib": "^2.2.0"
|
package/lib/filetypes.d.ts
DELETED
package/lib/parsers.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export declare const toPlaintext: (wordlist: string) => {
|
|
2
|
-
wordlist: string;
|
|
3
|
-
contentType: string;
|
|
4
|
-
};
|
|
5
|
-
export declare const toXML: (wordlist: string) => {
|
|
6
|
-
wordlist: string;
|
|
7
|
-
contentType: string;
|
|
8
|
-
};
|
|
9
|
-
export declare const toCSV: (wordlist: string) => {
|
|
10
|
-
wordlist: string;
|
|
11
|
-
contentType: string;
|
|
12
|
-
};
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { CdkDragDrop } from '@angular/cdk/drag-drop';
|
|
2
|
-
import { OnDestroy, OnInit } from '@angular/core';
|
|
3
|
-
import { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';
|
|
4
|
-
import { Observable } from 'rxjs';
|
|
5
|
-
import { FileType } from './filetypes';
|
|
6
|
-
import { WordlistGeneratorService } from './wordlist-generator.service';
|
|
7
|
-
import * as i0 from "@angular/core";
|
|
8
|
-
export declare class WordlistGeneratorComponent implements OnInit, OnDestroy {
|
|
9
|
-
private formBuilder;
|
|
10
|
-
private wordlistGenerator;
|
|
11
|
-
buttonStyle: import("@angular/core").InputSignal<{
|
|
12
|
-
'background-color': string;
|
|
13
|
-
color: string;
|
|
14
|
-
}>;
|
|
15
|
-
dragStyle: import("@angular/core").InputSignal<{
|
|
16
|
-
color: string;
|
|
17
|
-
}>;
|
|
18
|
-
textStyle: import("@angular/core").InputSignal<{
|
|
19
|
-
color: string;
|
|
20
|
-
}>;
|
|
21
|
-
charsetForm: UntypedFormGroup | undefined;
|
|
22
|
-
wordsGenerated: number | undefined;
|
|
23
|
-
wordlist$: Observable<string> | undefined;
|
|
24
|
-
displayWordlist: boolean;
|
|
25
|
-
fileType: FileType;
|
|
26
|
-
fileTypes: FileType[];
|
|
27
|
-
filteredCharset: string[];
|
|
28
|
-
prefix: string;
|
|
29
|
-
suffix: string;
|
|
30
|
-
private unsubscribe$;
|
|
31
|
-
constructor(formBuilder: UntypedFormBuilder, wordlistGenerator: WordlistGeneratorService);
|
|
32
|
-
ngOnInit(): void;
|
|
33
|
-
ngOnDestroy(): void;
|
|
34
|
-
get charsets(): UntypedFormArray | undefined;
|
|
35
|
-
addCharset(): void;
|
|
36
|
-
cloneCharset(index: number): void;
|
|
37
|
-
downloadWordlist(): void;
|
|
38
|
-
drop(event: CdkDragDrop<string[]>): void;
|
|
39
|
-
generateForm(): void;
|
|
40
|
-
generateWordlist(): void;
|
|
41
|
-
getWordlist(): Observable<string>;
|
|
42
|
-
filterCharset(charsets: string[]): string[];
|
|
43
|
-
parseWordlist(wordlist: string): {
|
|
44
|
-
wordlist: string;
|
|
45
|
-
contentType: string;
|
|
46
|
-
};
|
|
47
|
-
removeCharset(i: number): void;
|
|
48
|
-
removeDuplicates: (unfiltered: string) => string;
|
|
49
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<WordlistGeneratorComponent, never>;
|
|
50
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<WordlistGeneratorComponent, "wordlist-generator", never, { "buttonStyle": { "alias": "buttonStyle"; "required": false; "isSignal": true; }; "dragStyle": { "alias": "dragStyle"; "required": false; "isSignal": true; }; "textStyle": { "alias": "textStyle"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
|
|
51
|
-
}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { Observable } from 'rxjs';
|
|
2
|
-
import * as i0 from "@angular/core";
|
|
3
|
-
export declare class WordlistGeneratorService {
|
|
4
|
-
constructor();
|
|
5
|
-
generateWordlist(...charsets: string[]): Observable<string>;
|
|
6
|
-
static ɵfac: i0.ɵɵFactoryDeclaration<WordlistGeneratorService, never>;
|
|
7
|
-
static ɵprov: i0.ɵɵInjectableDeclaration<WordlistGeneratorService>;
|
|
8
|
-
}
|