obsidian-dev-utils 97.0.0 → 98.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +17 -0
- package/LICENSE +1 -1
- package/dist/integration-test-plugin/main.js +624 -483
- package/dist/lib/cjs/__merged.cjs +14 -9
- package/dist/lib/cjs/__merged.d.cts +2 -1
- package/dist/lib/cjs/generated-during-build.cjs +1 -1
- package/dist/lib/cjs/obsidian/components/rename-delete-handler-component.cjs +38 -38
- package/dist/lib/cjs/obsidian/demo-vault-naming.cjs +167 -0
- package/dist/lib/cjs/obsidian/demo-vault-naming.d.cts +54 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +11 -5
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +10 -8
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +9 -9
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +23 -4
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.cjs +195 -0
- package/dist/lib/cjs/obsidian/mobile-trusted-input.d.cts +93 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +2 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +4 -0
- package/dist/lib/cjs/obsidian/resource-lock.cjs +122 -122
- package/dist/lib/cjs/obsidian/trusted-input.cjs +206 -0
- package/dist/lib/cjs/obsidian/trusted-input.d.cts +126 -0
- package/dist/lib/cjs/script-utils/build.cjs +30 -6
- package/dist/lib/cjs/script-utils/build.d.cts +5 -0
- package/dist/lib/cjs/script-utils/demo-vault.cjs +26 -6
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +12 -8
- package/dist/lib/cjs/script-utils/exec.cjs +1 -1
- package/dist/lib/cjs/script-utils/formatters/dprint.cjs +3 -2
- package/dist/lib/cjs/script-utils/index.cjs +4 -1
- package/dist/lib/cjs/script-utils/index.d.cts +1 -0
- package/dist/lib/cjs/script-utils/linters/cspell.cjs +3 -3
- package/dist/lib/cjs/script-utils/linters/eslint-config.cjs +39 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.cjs +16 -1
- package/dist/lib/cjs/script-utils/linters/eslint-rules/index.d.cts +5 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.cjs +254 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-description.d.cts +54 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.cjs +217 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-helpers.d.cts +141 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.cjs +214 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-id.d.cts +32 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.cjs +215 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-name.d.cts +30 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.cjs +318 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/manifest-schema.d.cts +45 -0
- package/dist/lib/cjs/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.cjs +9 -1
- package/dist/lib/cjs/script-utils/linters/eslint.cjs +3 -2
- package/dist/lib/cjs/script-utils/linters/markdownlint.cjs +4 -4
- package/dist/lib/cjs/script-utils/npm-run.cjs +4 -3
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +10 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +37 -1
- package/dist/lib/cjs/script-utils/package-manager.cjs +287 -0
- package/dist/lib/cjs/script-utils/package-manager.d.cts +77 -0
- package/dist/lib/cjs/script-utils/version.cjs +21 -9
- package/dist/lib/esm/__merged.d.mts +2 -1
- package/dist/lib/esm/__merged.mjs +16 -10
- package/dist/lib/esm/generated-during-build.mjs +1 -1
- package/dist/lib/esm/obsidian/components/rename-delete-handler-component.mjs +38 -38
- package/dist/lib/esm/obsidian/demo-vault-naming.d.mts +54 -0
- package/dist/lib/esm/obsidian/demo-vault-naming.mjs +61 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +10 -8
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +14 -5
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +23 -4
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +9 -9
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/mobile-trusted-input.d.mts +93 -0
- package/dist/lib/esm/obsidian/mobile-trusted-input.mjs +84 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +4 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +2 -1
- package/dist/lib/esm/obsidian/resource-lock.mjs +122 -122
- package/dist/lib/esm/obsidian/trusted-input.d.mts +126 -0
- package/dist/lib/esm/obsidian/trusted-input.mjs +85 -0
- package/dist/lib/esm/script-utils/build.d.mts +5 -0
- package/dist/lib/esm/script-utils/build.mjs +30 -6
- package/dist/lib/esm/script-utils/demo-vault.d.mts +12 -8
- package/dist/lib/esm/script-utils/demo-vault.mjs +29 -6
- package/dist/lib/esm/script-utils/exec.mjs +1 -1
- package/dist/lib/esm/script-utils/formatters/dprint.mjs +3 -2
- package/dist/lib/esm/script-utils/index.d.mts +1 -0
- package/dist/lib/esm/script-utils/index.mjs +3 -1
- package/dist/lib/esm/script-utils/linters/cspell.mjs +3 -3
- package/dist/lib/esm/script-utils/linters/eslint-config.mjs +39 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.d.mts +5 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/index.mjs +11 -1
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.d.mts +54 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-description.mjs +148 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.d.mts +141 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-helpers.mjs +92 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.d.mts +32 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-id.mjs +111 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.d.mts +30 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-name.mjs +112 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.d.mts +45 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/manifest-schema.mjs +217 -0
- package/dist/lib/esm/script-utils/linters/eslint-rules/obsidian-dev-utils-plugin.mjs +9 -1
- package/dist/lib/esm/script-utils/linters/eslint.mjs +3 -2
- package/dist/lib/esm/script-utils/linters/markdownlint.mjs +4 -4
- package/dist/lib/esm/script-utils/npm-run.mjs +4 -3
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +37 -1
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +10 -1
- package/dist/lib/esm/script-utils/package-manager.d.mts +77 -0
- package/dist/lib/esm/script-utils/package-manager.mjs +173 -0
- package/dist/lib/esm/script-utils/version.mjs +21 -9
- package/obsidian/demo-vault-naming/package.json +6 -0
- package/obsidian/mobile-trusted-input/package.json +6 -0
- package/obsidian/trusted-input/package.json +6 -0
- package/package.json +19 -17
- package/script-utils/linters/eslint-rules/manifest-description/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-helpers/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-id/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-name/package.json +6 -0
- package/script-utils/linters/eslint-rules/manifest-schema/package.json +6 -0
- package/script-utils/package-manager/package.json +6 -0
|
@@ -115,127 +115,6 @@ class ResourceLockEventsComponent extends ComponentEx {
|
|
|
115
115
|
}));
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
|
-
class ResourceLockMutationBlockerComponent extends MonkeyAroundComponent {
|
|
119
|
-
shouldBlockMutation;
|
|
120
|
-
constructor(params) {
|
|
121
|
-
super();
|
|
122
|
-
this.shouldBlockMutation = params.shouldBlockMutation;
|
|
123
|
-
}
|
|
124
|
-
onload() {
|
|
125
|
-
super.onload();
|
|
126
|
-
this.registerMethodPatch({
|
|
127
|
-
$object: Vault.prototype,
|
|
128
|
-
methodName: "append",
|
|
129
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
130
|
-
this.assertNotBlocked([file.path]);
|
|
131
|
-
return fallback();
|
|
132
|
-
}
|
|
133
|
-
});
|
|
134
|
-
this.registerMethodPatch({
|
|
135
|
-
$object: Vault.prototype,
|
|
136
|
-
methodName: "copy",
|
|
137
|
-
patchHandler: ({ fallback, originalArguments: [, newPath] }) => {
|
|
138
|
-
this.assertNotBlocked([newPath]);
|
|
139
|
-
return fallback();
|
|
140
|
-
}
|
|
141
|
-
});
|
|
142
|
-
this.registerMethodPatch({
|
|
143
|
-
$object: Vault.prototype,
|
|
144
|
-
methodName: "create",
|
|
145
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
146
|
-
this.assertNotBlocked([path]);
|
|
147
|
-
return fallback();
|
|
148
|
-
}
|
|
149
|
-
});
|
|
150
|
-
this.registerMethodPatch({
|
|
151
|
-
$object: Vault.prototype,
|
|
152
|
-
methodName: "createBinary",
|
|
153
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
154
|
-
this.assertNotBlocked([path]);
|
|
155
|
-
return fallback();
|
|
156
|
-
}
|
|
157
|
-
});
|
|
158
|
-
this.registerMethodPatch({
|
|
159
|
-
$object: Vault.prototype,
|
|
160
|
-
methodName: "createFolder",
|
|
161
|
-
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
162
|
-
this.assertNotBlocked([path]);
|
|
163
|
-
return fallback();
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
this.registerMethodPatch({
|
|
167
|
-
$object: Vault.prototype,
|
|
168
|
-
methodName: "delete",
|
|
169
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
170
|
-
this.assertNotBlocked([file.path]);
|
|
171
|
-
return fallback();
|
|
172
|
-
}
|
|
173
|
-
});
|
|
174
|
-
this.registerMethodPatch({
|
|
175
|
-
$object: Vault.prototype,
|
|
176
|
-
methodName: "modify",
|
|
177
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
178
|
-
this.assertNotBlocked([file.path]);
|
|
179
|
-
return fallback();
|
|
180
|
-
}
|
|
181
|
-
});
|
|
182
|
-
this.registerMethodPatch({
|
|
183
|
-
$object: Vault.prototype,
|
|
184
|
-
methodName: "modifyBinary",
|
|
185
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
186
|
-
this.assertNotBlocked([file.path]);
|
|
187
|
-
return fallback();
|
|
188
|
-
}
|
|
189
|
-
});
|
|
190
|
-
this.registerMethodPatch({
|
|
191
|
-
$object: Vault.prototype,
|
|
192
|
-
methodName: "process",
|
|
193
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
194
|
-
this.assertNotBlocked([file.path]);
|
|
195
|
-
return fallback();
|
|
196
|
-
}
|
|
197
|
-
});
|
|
198
|
-
this.registerMethodPatch({
|
|
199
|
-
$object: Vault.prototype,
|
|
200
|
-
methodName: "rename",
|
|
201
|
-
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
202
|
-
this.assertNotBlocked([file.path, newPath]);
|
|
203
|
-
return fallback();
|
|
204
|
-
}
|
|
205
|
-
});
|
|
206
|
-
this.registerMethodPatch({
|
|
207
|
-
$object: Vault.prototype,
|
|
208
|
-
methodName: "trash",
|
|
209
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
210
|
-
this.assertNotBlocked([file.path]);
|
|
211
|
-
return fallback();
|
|
212
|
-
}
|
|
213
|
-
});
|
|
214
|
-
this.registerMethodPatch({
|
|
215
|
-
$object: FileManager.prototype,
|
|
216
|
-
methodName: "renameFile",
|
|
217
|
-
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
218
|
-
this.assertNotBlocked([file.path, newPath]);
|
|
219
|
-
return fallback();
|
|
220
|
-
}
|
|
221
|
-
});
|
|
222
|
-
this.registerMethodPatch({
|
|
223
|
-
$object: FileManager.prototype,
|
|
224
|
-
methodName: "trashFile",
|
|
225
|
-
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
226
|
-
this.assertNotBlocked([file.path]);
|
|
227
|
-
return fallback();
|
|
228
|
-
}
|
|
229
|
-
});
|
|
230
|
-
}
|
|
231
|
-
assertNotBlocked(paths) {
|
|
232
|
-
for (const path of paths) {
|
|
233
|
-
if (this.shouldBlockMutation(path)) {
|
|
234
|
-
throw new ResourceLockedError(path);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
}
|
|
239
118
|
class ResourceLockManager {
|
|
240
119
|
beeper = new Beeper();
|
|
241
120
|
// The inner sets are mutable so a rename can re-key the paths of an in-flight bypass scope in place;
|
|
@@ -830,6 +709,127 @@ ${entry.operationName}`;
|
|
|
830
709
|
}, { once: true });
|
|
831
710
|
}
|
|
832
711
|
}
|
|
712
|
+
class ResourceLockMutationBlockerComponent extends MonkeyAroundComponent {
|
|
713
|
+
shouldBlockMutation;
|
|
714
|
+
constructor(params) {
|
|
715
|
+
super();
|
|
716
|
+
this.shouldBlockMutation = params.shouldBlockMutation;
|
|
717
|
+
}
|
|
718
|
+
onload() {
|
|
719
|
+
super.onload();
|
|
720
|
+
this.registerMethodPatch({
|
|
721
|
+
$object: Vault.prototype,
|
|
722
|
+
methodName: "append",
|
|
723
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
724
|
+
this.assertNotBlocked([file.path]);
|
|
725
|
+
return fallback();
|
|
726
|
+
}
|
|
727
|
+
});
|
|
728
|
+
this.registerMethodPatch({
|
|
729
|
+
$object: Vault.prototype,
|
|
730
|
+
methodName: "copy",
|
|
731
|
+
patchHandler: ({ fallback, originalArguments: [, newPath] }) => {
|
|
732
|
+
this.assertNotBlocked([newPath]);
|
|
733
|
+
return fallback();
|
|
734
|
+
}
|
|
735
|
+
});
|
|
736
|
+
this.registerMethodPatch({
|
|
737
|
+
$object: Vault.prototype,
|
|
738
|
+
methodName: "create",
|
|
739
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
740
|
+
this.assertNotBlocked([path]);
|
|
741
|
+
return fallback();
|
|
742
|
+
}
|
|
743
|
+
});
|
|
744
|
+
this.registerMethodPatch({
|
|
745
|
+
$object: Vault.prototype,
|
|
746
|
+
methodName: "createBinary",
|
|
747
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
748
|
+
this.assertNotBlocked([path]);
|
|
749
|
+
return fallback();
|
|
750
|
+
}
|
|
751
|
+
});
|
|
752
|
+
this.registerMethodPatch({
|
|
753
|
+
$object: Vault.prototype,
|
|
754
|
+
methodName: "createFolder",
|
|
755
|
+
patchHandler: ({ fallback, originalArguments: [path] }) => {
|
|
756
|
+
this.assertNotBlocked([path]);
|
|
757
|
+
return fallback();
|
|
758
|
+
}
|
|
759
|
+
});
|
|
760
|
+
this.registerMethodPatch({
|
|
761
|
+
$object: Vault.prototype,
|
|
762
|
+
methodName: "delete",
|
|
763
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
764
|
+
this.assertNotBlocked([file.path]);
|
|
765
|
+
return fallback();
|
|
766
|
+
}
|
|
767
|
+
});
|
|
768
|
+
this.registerMethodPatch({
|
|
769
|
+
$object: Vault.prototype,
|
|
770
|
+
methodName: "modify",
|
|
771
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
772
|
+
this.assertNotBlocked([file.path]);
|
|
773
|
+
return fallback();
|
|
774
|
+
}
|
|
775
|
+
});
|
|
776
|
+
this.registerMethodPatch({
|
|
777
|
+
$object: Vault.prototype,
|
|
778
|
+
methodName: "modifyBinary",
|
|
779
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
780
|
+
this.assertNotBlocked([file.path]);
|
|
781
|
+
return fallback();
|
|
782
|
+
}
|
|
783
|
+
});
|
|
784
|
+
this.registerMethodPatch({
|
|
785
|
+
$object: Vault.prototype,
|
|
786
|
+
methodName: "process",
|
|
787
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
788
|
+
this.assertNotBlocked([file.path]);
|
|
789
|
+
return fallback();
|
|
790
|
+
}
|
|
791
|
+
});
|
|
792
|
+
this.registerMethodPatch({
|
|
793
|
+
$object: Vault.prototype,
|
|
794
|
+
methodName: "rename",
|
|
795
|
+
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
796
|
+
this.assertNotBlocked([file.path, newPath]);
|
|
797
|
+
return fallback();
|
|
798
|
+
}
|
|
799
|
+
});
|
|
800
|
+
this.registerMethodPatch({
|
|
801
|
+
$object: Vault.prototype,
|
|
802
|
+
methodName: "trash",
|
|
803
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
804
|
+
this.assertNotBlocked([file.path]);
|
|
805
|
+
return fallback();
|
|
806
|
+
}
|
|
807
|
+
});
|
|
808
|
+
this.registerMethodPatch({
|
|
809
|
+
$object: FileManager.prototype,
|
|
810
|
+
methodName: "renameFile",
|
|
811
|
+
patchHandler: ({ fallback, originalArguments: [file, newPath] }) => {
|
|
812
|
+
this.assertNotBlocked([file.path, newPath]);
|
|
813
|
+
return fallback();
|
|
814
|
+
}
|
|
815
|
+
});
|
|
816
|
+
this.registerMethodPatch({
|
|
817
|
+
$object: FileManager.prototype,
|
|
818
|
+
methodName: "trashFile",
|
|
819
|
+
patchHandler: ({ fallback, originalArguments: [file] }) => {
|
|
820
|
+
this.assertNotBlocked([file.path]);
|
|
821
|
+
return fallback();
|
|
822
|
+
}
|
|
823
|
+
});
|
|
824
|
+
}
|
|
825
|
+
assertNotBlocked(paths) {
|
|
826
|
+
for (const path of paths) {
|
|
827
|
+
if (this.shouldBlockMutation(path)) {
|
|
828
|
+
throw new ResourceLockedError(path);
|
|
829
|
+
}
|
|
830
|
+
}
|
|
831
|
+
}
|
|
832
|
+
}
|
|
833
833
|
class ResourceLockComponent extends ComponentEx {
|
|
834
834
|
/**
|
|
835
835
|
* The Obsidian app instance.
|
|
@@ -1012,4 +1012,4 @@ export {
|
|
|
1012
1012
|
requestResourceUnlockForPath,
|
|
1013
1013
|
unlockResourceForPath
|
|
1014
1014
|
};
|
|
1015
|
-
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgTWFya2Rvd25WaWV3LFxuICBNZW51LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uL2JlZXBlci50cyc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Rpc3Bvc2FibGUsXG4gIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yXG59IGZyb20gJy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdG9nZ2xlRWRpdG9yUmVhZE9ubHkgfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4vbW9kYWxzL2NvbmZpcm0udHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbmNvbnN0IExPQ0tfSUNPTl9JRCA9ICdsb2NrJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3InO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvci1mbGFzaCc7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5jb25zdCBVTkxPQ0tfSUNPTl9JRCA9ICd1bmxvY2snO1xuY29uc3QgTUlERExFX01PVVNFX0JVVFRPTiA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0YWtpbmcgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgKS4gU2hvd24gbmV4dCB0b1xuICAgKiB0aGUgcGx1Z2luIG5hbWUgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gYSBsb2NrIGluZGljYXRvciBpcyBjbGlja2VkICh3aXRoXG4gICAqIGFueSBtb3VzZSBidXR0b24pIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2ssIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgcnVucywgb3JcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0gLyB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkXG4gICAqIGZvciB0aGUgcGF0aCwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmLiBVbmxlc3NcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0fSBpcyBzZXQsIHRoZSBvcGVyYXRpb24gaXNcbiAgICogZXhwZWN0ZWQgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuIFdoZW4gb21pdHRlZCwgYW4gdW5sb2NrIHN0aWxsIHJlbGVhc2VzIHRoZSBsb2NrIGJ1dFxuICAgKiBjYW5ub3QgY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBzY29wZS4gYCdzdWJ0cmVlJ2AgYWxzbyBsb2NrcyBldmVyeSBkZXNjZW5kYW50IG9mIGEgZm9sZGVyIHBhdGg7IGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlXG4gICAqIGV4YWN0IHBhdGguIEEgYHN1YnRyZWVgIGxvY2sgbXVzdCBiZSByZWxlYXNlZCB2aWEgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAobm90IHRoZVxuICAgKiBleHBsaWNpdCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnVubG9ja0ZvclBhdGh9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdmaWxlJ2BcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiB1bmxvY2sgb2YgdGhlIGxvY2sgaXMgcmVxdWVzdGVkIFx1MjAxNCBpLmUuIHdoZW4gdGhlXG4gICAqIGxvY2sncyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkIChieSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgXCJVbmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSxcbiAgICogb3Ige0BsaW5rIGhhbmRsZUV4dGVybmFsTXV0YXRpb259KS4gVXNlIGl0IHRvIGNsZWFyIGNvbnN1bWVyLXNpZGUgc3RhdGUgdGhhdCBzaGFkb3dzIHRoZSBsb2NrIChlLmcuXG4gICAqIGEgcGVuZGluZy1vcGVyYXRpb24gYnVmZmVyIG9yIGEgbm90aWNlKSB3aXRob3V0IGhhbmQtd2lyaW5nIGFuIGBhYm9ydGAgbGlzdGVuZXIuIEZpcmVzIGF0IG1vc3Qgb25jZS5cbiAgICovXG4gIG9uVW5sb2NrUmVxdWVzdGVkPyh0aGlzOiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCwgYCdNZXJnZVxuICAgKiBub3RlcydgKS4gSXQgaXMgc2hvd24gXHUyMDE0IG5leHQgdG8gdGhlIGxvY2tpbmcgcGx1Z2luJ3MgbmFtZSBcdTIwMTQgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLCBzb1xuICAgKiB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hpY2ggb3BlcmF0aW9uIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IFx1MjAxNCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIHJlbGVhc2VzIGl0c2VsZiB0aGUgbW9tZW50IGl0c1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbiAgICogdGhlIG93bmluZyBvcGVyYXRpb24gdG8gcmVsZWFzZSBpdCBpbiBpdHMgb3duIGNsZWFudXAuIFVzZSBpdCBmb3IgYSBsb2NrIGhlbGQgKippbmRlZmluaXRlbHkqKlxuICAgKiBvdXRzaWRlIGEgYHVzaW5nYCBzY29wZSAoc28gdGhlcmUgaXMgbm8gYGZpbmFsbHlgIHRvIHJlbGVhc2UgaXQpIFx1MjAxNCBlLmcuIGEgbG9jayB0aGF0IHN0YXlzIHVudGlsIHRoZVxuICAgKiB1c2VyIGV4cGxpY2l0bHkgdW5sb2Nrcy4gTGVhdmUgaXQgYGZhbHNlYCBmb3IgYSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGhvbGRzIHRoZSBsb2NrIHRocm91Z2hcbiAgICogaXRzIG93biBhYm9ydC1kcml2ZW4gcm9sbGJhY2sgYW5kIHJlbGVhc2VzIGl0IHZpYSBgdXNpbmdgIGF0IHNjb3BlIGV4aXQuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tEZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBlbnRyeSBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1bmRlci4gRGVsaWJlcmF0ZWx5IG11dGFibGU6IGEgcmVuYW1lIHJlLWtleXMgdGhlXG4gICAqIHJlZ2lzdHJ5LCBhbmQgcmVsZWFzZSBtdXN0IGZpbmQgdGhlIGVudHJ5IGF0IGl0cyBDVVJSRU5UIHBhdGggXHUyMDE0IGEgcmVsZWFzZSB0aGF0IGNhcHR1cmVkIHRoZSBwYXRoXG4gICAqIGF0IGxvY2sgdGltZSB3b3VsZCBzaWxlbnRseSBuby1vcCBhZnRlciB0aGUgcmVzb3VyY2UgbW92ZWQsIGxlYWtpbmcgdGhlIGxvY2sgZm9yZXZlci5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIGRpc3Bvc2VUeXBlTGlzdGVuZXIoKTogdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICBvbkNoYW5nZSh0aGlzOiB2b2lkKTogdm9pZDtcbiAgb25FeHRlcm5hbE11dGF0aW9uKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG4gIG9uUmVuYW1lKHRoaXM6IHZvaWQsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub25DaGFuZ2UgPSBwYXJhbXMub25DaGFuZ2U7XG4gICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24gPSBwYXJhbXMub25FeHRlcm5hbE11dGF0aW9uO1xuICAgIHRoaXMub25GaWxlTWVudSA9IHBhcmFtcy5vbkZpbGVNZW51O1xuICAgIHRoaXMub25SZW5hbWUgPSBwYXJhbXMub25SZW5hbWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIFNhbWUtbGVhZiBuYXZpZ2F0aW9uIHRvIGFub3RoZXIgbm90ZSBmaXJlcyBubyBsZWFmL2xheW91dCBjaGFuZ2U7IHdpdGhvdXQgdGhpcyBpdCBzdGF5cyByZWFkLW9ubHkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIEFkZHMgYW4gXCJVbmxvY2tcIiBpdGVtIHRvIGEgbG9ja2VkIG5vdGUncyB0YWIvZmlsZSBjb250ZXh0IG1lbnUgKGFsb25nc2lkZSB0aGUgaW5kaWNhdG9yIG1lbnVzKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCB0aGlzLm9uRmlsZU1lbnUpKTtcbiAgICAvLyBFeHRlcm5hbC1jaGFuZ2UgYmFja3N0b3A6IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggbm90IGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBhbiBpbnRydWRlciAoYSBzeW5jL0ZTL2FkYXB0ZXIgY2hhbmdlIHRoYXQgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2gpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpOiB2b2lkID0+IHtcbiAgICAgIC8vIFJlLWtleSBGSVJTVCwgc28gdGhlIGNoZWNrcyBiZWxvdyBydW4gYWdhaW5zdCB3aGVyZSB0aGUgbG9ja3MgYWN0dWFsbHkgYXJlIG5vdy5cbiAgICAgIC8vIEludHJ1ZGVyIGRldGVjdGlvbiBpcyB1bmFmZmVjdGVkOiB0aGUgb2xkIHBhdGggc3RvcHMgcmVzb2x2aW5nLCBidXQgdGhlIG5ldyBvbmUgaXMgY292ZXJlZCBpbnN0ZWFkLlxuICAgICAgdGhpcy5vblJlbmFtZShvbGRQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIE1vbmtleS1wYXRjaGVzIHRoZSB2YXVsdC1tdXRhdGlvbiBjaG9rZSBwb2ludHMgb24gYFZhdWx0YC9gRmlsZU1hbmFnZXJgIHNvIHRoYXQgYW55IGVkaXQsIGRlbGV0ZSxcbiAqIHJlbmFtZSwgbW92ZSwgb3IgKHJlKWNyZWF0ZSBvZiBhIG11dGF0aW9uLWJsb2NrZWQgcGF0aCB0aHJvd3MgYSB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uXG4gKiBJbnN0YWxsZWQgbGF6aWx5IGJ5IHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyfSBvbiB0aGUgZmlyc3QgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrIGFuZCByZW1vdmVkXG4gKiB3aGVuIHRoZSBsYXN0IG9uZSBpcyByZWxlYXNlZDsgYmVpbmcgYSB7QGxpbmsgTW9ua2V5QXJvdW5kQ29tcG9uZW50fSwgZXZlcnkgcGF0Y2ggaXMgdG9ybiBkb3duIG9uXG4gKiBgdW5sb2FkYC4gUmVuYW1lL2NvcHkgY2hlY2sgYm90aCBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uOyB0aGUgb3RoZXIgbWV0aG9kcyBjaGVjayB0aGVpciBzaW5nbGUgcGF0aC5cbiAqL1xuY2xhc3MgUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50IGV4dGVuZHMgTW9ua2V5QXJvdW5kQ29tcG9uZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aDogc3RyaW5nKSA9PiBib29sZWFuO1xuXG4gIHB1YmxpYyBjb25zdHJ1Y3RvcihwYXJhbXM6IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24gPSBwYXJhbXMuc2hvdWxkQmxvY2tNdXRhdGlvbjtcbiAgfVxuXG4gIHB1YmxpYyBvdmVycmlkZSBvbmxvYWQoKTogdm9pZCB7XG4gICAgc3VwZXIub25sb2FkKCk7XG5cbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdhcHBlbmQnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnYXBwZW5kJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjb3B5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NvcHknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFssIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtuZXdQYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVCaW5hcnknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlQmluYXJ5JyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlRm9sZGVyJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZUZvbGRlcicsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2RlbGV0ZSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdkZWxldGUnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ21vZGlmeUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdtb2RpZnlCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ3Byb2Nlc3MnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncHJvY2VzcycsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncmVuYW1lJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3JlbmFtZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAndHJhc2gnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2gnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxGaWxlTWFuYWdlciwgJ3JlbmFtZUZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGUsIG5ld1BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGgsIG5ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAndHJhc2hGaWxlJz4oe1xuICAgICAgJG9iamVjdDogRmlsZU1hbmFnZXIucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ3RyYXNoRmlsZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGFzc2VydE5vdEJsb2NrZWQocGF0aHM6IHN0cmluZ1tdKTogdm9pZCB7XG4gICAgZm9yIChjb25zdCBwYXRoIG9mIHBhdGhzKSB7XG4gICAgICBpZiAodGhpcy5zaG91bGRCbG9ja011dGF0aW9uKHBhdGgpKSB7XG4gICAgICAgIHRocm93IG5ldyBSZXNvdXJjZUxvY2tlZEVycm9yKHBhdGgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgLy8gVGhlIGlubmVyIHNldHMgYXJlIG11dGFibGUgc28gYSByZW5hbWUgY2FuIHJlLWtleSB0aGUgcGF0aHMgb2YgYW4gaW4tZmxpZ2h0IGJ5cGFzcyBzY29wZSBpbiBwbGFjZTtcbiAgLy8gVGhlIHNjb3BlJ3MgYERpc3Bvc2FibGVgIGRlbGV0ZXMgYnkgc2V0IGlkZW50aXR5LCBzbyBtdXRhdGluZyB0aGUgY29udGVudHMgY2Fubm90IG9ycGhhbiBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICBwcml2YXRlIG11dGF0aW9uQmxvY2tlckNvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBieXBhc3MoYXBwOiBBcHAsIHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgYnlwYXNzZWRQYXRocyA9IG5ldyBTZXQocGF0aHNPckZpbGVzLm1hcCgocGF0aE9yRmlsZSkgPT4gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSk7XG4gICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5hZGQoYnlwYXNzZWRQYXRocyk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5kZWxldGUoYnlwYXNzZWRQYXRocyk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGguIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0IFx1MjAxNCB0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIFx1MjAxNCB0aGVuIGFib3J0cyBldmVyeVxuICAgKiB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSByZWdpc3RlcmVkIG9uIHRoYXQgb3duZXIgKGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbnMgdGhhdCB0b29rIHRoZSBsb2NrcylcbiAgICogQU5EIHJlbW92ZXMgdGhlIG93bmVyJ3MgbG9jayBlbnRyaWVzIChyZWxlYXNpbmcgdGhlIGxvY2sgdW5jb25kaXRpb25hbGx5KS4gVW5saWtlXG4gICAqIHtAbGluayByZXF1ZXN0VW5sb2NrfSwgd2hpY2ggb25seSBhYm9ydHMgdGhlIGV4YWN0IHBhdGgncyBjb250cm9sbGVycyBhbmQgcmVsaWVzIG9uIGVhY2ggb3BlcmF0aW9uXG4gICAqIHJlbGVhc2luZyBpdHMgb3duIGxvY2ssIHRoaXMgcmVzb2x2ZXMgYW5jZXN0b3IgY292ZXJhZ2UgYW5kIGFsd2F5cyByZWxlYXNlcyBcdTIwMTQgc28gYSBub3RlIGhlbGQgYnkgYW5cbiAgICogaW5kZWZpbml0ZWx5LWhlbGQgbG9jayBpcyBndWFyYW50ZWVkIHRvIGJlY29tZSBlZGl0YWJsZS4gQSBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyBmb3JjZVVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgb3duZXJQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvclxuICAgKiBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgY292ZXJlZCBieSBhIG11dGF0aW9uLWJsb2NraW5nIGxvY2sgKG9uZSB0YWtlbiB3aXRoXG4gICAqIGBibG9ja3NNdXRhdGlvbnNgKSBkaXJlY3RseSBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGV4YWN0RW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmIChleGFjdEVudHJpZXM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGxvY2socGFyYW1zOiBNYW5hZ2VyTG9ja1BhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMucGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cnk6IExvY2tFbnRyeSA9IHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlciA/PyBudWxsLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuYmxvY2tzTXV0YXRpb25zID8/IGZhbHNlLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUgPz8gJ2ZpbGUnLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCA/PyBudWxsLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnQgPz8gZmFsc2VcbiAgICB9O1xuICAgIGxldCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICBlbnRyaWVzID0gW107XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCBlbnRyaWVzKTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICBpZiAoZW50cnkuYmxvY2tzTXV0YXRpb25zKSB7XG4gICAgICB0aGlzLmVuc3VyZUJsb2NrZXJJbnN0YWxsZWQoYXBwKTtcbiAgICB9XG4gICAgdGhpcy53aXJlUmVsZWFzZU9uQWJvcnQoYXBwLCBlbnRyeSk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIHdoaWNoXG4gICAqIGNhbmNlbHMgdGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9jay4gRWFjaCBvcGVyYXRpb24gcmVsZWFzZXMgaXRzIG93biBsb2NrIGluIGl0cyBgZmluYWxseWBcbiAgICogd2hlbiBpdCBvYnNlcnZlcyB0aGUgYWJvcnQsIHNvIHRoaXMgZG9lcyBub3QgdW5sb2NrIHRoZSBwYXRoIGRpcmVjdGx5LiBBIG5vLW9wIHdoZW4gbm8gY29udHJvbGxlclxuICAgKiBpcyByZWdpc3RlcmVkIGZvciB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHVibGljIHVubG9ja0FsbEZvclBsdWdpbihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW3BhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgIT09IHBsdWdpbklkKTtcbiAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcubGVuZ3RoICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gb24gdGhlIGdpdmVuIChhbHJlYWR5LXJlc29sdmVkKSBvd25lciBwYXRoJ3MgbG9jayBlbnRyaWVzIFx1MjAxNFxuICAgKiBjYW5jZWxsaW5nIHRoZSBvd25pbmcgb3BlcmF0aW9ucyBcdTIwMTQgYW5kIHJlbW92ZXMgdGhvc2UgZW50cmllcywgcmVsZWFzaW5nIHRoZSBsb2NrLiBUaGUgZW50cmllc1xuICAgKiBzbmFwc2hvdCBpcyBjb3BpZWQgZmlyc3QgYmVjYXVzZSBhbiBlbnRyeSdzIGBzaG91bGRSZWxlYXNlT25BYm9ydGAgYWJvcnQgbGlzdGVuZXIgbXV0YXRlcyB0aGVcbiAgICogYXJyYXkgYXMgaXQgZmlyZXMuIEFsd2F5cyBsZWF2ZXMgdGhlIG93bmVyIHBhdGggd2l0aCBubyBlbnRyaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG93bmVyUGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgb3duZXIgcGF0aCB3aG9zZSBlbnRyaWVzIHRvIGFib3J0IGFuZCByZWxlYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcDogQXBwLCBvd25lclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChvd25lclBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QoZW50cmllcykpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUob3duZXJQYXRoKTtcbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtVGl0bGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyBgcGF0aGAgaXMgdGhlIHJlc29sdmVkIG93bmVyIHBhdGgsIHNvIGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBhbmQgcmVsZWFzZSB0aGUgbG9jayBvdXRyaWdodC5cbiAgICAgICAgICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICAvLyBUaGUgaW5kaWNhdG9ycyBvdXRsaXZlIGEgcmVuYW1lIG9mIHRoZSBub3RlIChvciBvZiBhbiBlbmNsb3NpbmcgbG9ja2VkIGZvbGRlciksIHNvIHRoZXkgcmVzb2x2ZVxuICAgIC8vIFRoZSBvd25lciBsb2NrIGF0IENMSUNLIHRpbWUgZnJvbSB0aGUgdmlldydzIGN1cnJlbnQgZmlsZSwgZXhhY3RseSBhcyB0aGUgc3RhdHVzLWJhciBpdGVtIGRvZXMuXG4gICAgLy8gQSBjYXB0dXJlZCBvd25lciBwYXRoIHdvdWxkIGdvIHN0YWxlIHRoZSBtb21lbnQgdGhlIGxvY2sgaXMgcmUta2V5ZWQuXG4gICAgY29uc3QgZ2V0T3duZXJQYXRoID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB0aGlzLnJlc29sdmVWaWV3T3duZXJQYXRoKGFwcCwgdmlldyk7XG5cbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0YWJJY29uRWwsIGdldE93bmVyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9LFxuICAgICAgb25SZW5hbWU6IChvbGRQYXRoLCBuZXdQYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuYW1lKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbGVtZW50LmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkgXHUyMDE0IGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgICAvLyBUaGUgdG9nZ2xlIGlzIGlkZW1wb3RlbnQsIHNvIHJlLWFwcGx5aW5nIHRvIGFuIGFscmVhZHktbG9ja2VkIHZpZXcgaXMgY2hlYXAuXG4gICAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKHZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgIGluZGljYXRvcnMuZGlzcG9zZVR5cGVMaXN0ZW5lcigpO1xuICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZUFuZENsZWFudXAoYXBwOiBBcHApOiB2b2lkIHtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIGlmICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclVubG9ja01lbnUoYXBwOiBBcHAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudCgkZXZlbnQpO1xuICAgIH07XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb3BlblVubG9ja01lbnUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudSgkZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgQ1VSUkVOVCBwYXRoLCBub3Qgb25lIGNhcHR1cmVkIHdoZW4gdGhlIGxvY2sgd2FzIHRha2VuOiBhIHJlbmFtZSBtYXkgaGF2ZVxuICAgIC8vIFJlLWtleWVkIGl0IHNpbmNlLCBhbmQgbG9va2luZyBpdCB1cCB1bmRlciB0aGUgb2xkIHBhdGggd291bGQgc2lsZW50bHkgbGVhayB0aGUgbG9jay5cbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZW50cnkucGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKGVudHJ5LnBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3aGljaCBsb2NrZWQgcGF0aCAoaWYgYW55KSBjb3ZlcnMgdGhlIGdpdmVuIHBhdGg6IHRoZSBwYXRoIGl0c2VsZiB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBsb25nZXN0IGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyIHRoYXQgY29udGFpbnMgaXQgKGxvbmdlc3Qgc28gYSBuZXN0ZWRcbiAgICogc3VidHJlZSBsb2NrIHdpbnMgZGV0ZXJtaW5pc3RpY2FsbHkgb3ZlciBhbiBvdXRlciBvbmUpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTG9ja093bmVyUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgbGV0IGJlc3RPd25lclBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGhhc1N1YnRyZWVMb2NrID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnKTtcbiAgICAgIGlmIChoYXNTdWJ0cmVlTG9jayAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkgJiYgKGJlc3RPd25lclBhdGggPT09IG51bGwgfHwgbG9ja2VkUGF0aC5sZW5ndGggPiBiZXN0T3duZXJQYXRoLmxlbmd0aCkpIHtcbiAgICAgICAgYmVzdE93bmVyUGF0aCA9IGxvY2tlZFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0T3duZXJQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIHRoZSBub3RlIGEgdmlldyBjdXJyZW50bHkgc2hvd3MgXHUyMDE0IGl0cyBvd24gcGF0aCB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuIFJlYWQgYXQgY2xpY2sgdGltZSBieSB0aGUgdmlldydzIGxvY2sgaW5kaWNhdG9ycyxcbiAgICogc28gaXQgcmVmbGVjdHMgcmVuYW1lcyBvZiB0aGUgbm90ZSBhbmQgb2YgdGhlIGxvY2tlZCBmb2xkZXIgYWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdmlldyAtIFRoZSB2aWV3IHdob3NlIGN1cnJlbnQgZmlsZSB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZpZXcgaGFzIG5vIGZpbGUgb3Igbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWaWV3T3duZXJQYXRoKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggbXVzdCBiZSBibG9ja2VkOiBgdHJ1ZWAgd2hlbiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkXG4gICAqIGFuZCBub3QgY292ZXJlZCBieSBhbnkgYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWplY3QgdGhlIG11dGF0aW9uLCBgZmFsc2VgIHRvIGFsbG93IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCbG9ja011dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIGxvY2tzIGN1cnJlbnRseSBoZWxkOiBlYWNoIHBsdWdpbiBuYW1lIGFzIGEgY29kZSBibG9jayBmb2xsb3dlZCBieVxuICAgIC8vIFRoZSBvcGVyYXRpb24gaXQgaXMgcnVubmluZywgb25lIHBlciBsaW5lLlxuICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLmxvY2tEZXNjcmlwdG9ycyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgZGVzY3JpcHRvci5wbHVnaW5OYW1lKTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoYDogJHtkZXNjcmlwdG9yLm9wZXJhdGlvbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZXMgYW4gb3B0LWluIGBhYm9ydGAgbGlzdGVuZXIgZm9yIGEgbG9jayBlbnRyeTogd2hlbiB0aGUgZW50cnkncyBjb250cm9sbGVyIGFib3J0cywgcmVsZWFzZXNcbiAgICogdGhlIGVudHJ5IChpZiB7QGxpbmsgTG9ja0VudHJ5LnNob3VsZFJlbGVhc2VPbkFib3J0fSkgYW5kL29yIGludm9rZXNcbiAgICoge0BsaW5rIExvY2tFbnRyeS5vblVubG9ja1JlcXVlc3RlZH0uIEEgbm8tb3Agd2hlbiB0aGUgZW50cnkgaGFzIG5vIGNvbnRyb2xsZXIgb3IgbmVpdGhlciBvcHQtaW4gaXNcbiAgICogc2V0LCBzbyB0cmFuc2FjdGlvbmFsIGxvY2tzIGtlZXAgcmVsZWFzaW5nIHZpYSB0aGVpciBvd24gY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRyeSAtIFRoZSBsb2NrIGVudHJ5IHdob3NlIGNvbnRyb2xsZXIgdG8gb2JzZXJ2ZS5cbiAgICovXG4gIHByaXZhdGUgd2lyZVJlbGVhc2VPbkFib3J0KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgeyBvblVubG9ja1JlcXVlc3RlZCwgc2hvdWxkUmVsZWFzZU9uQWJvcnQgfSA9IGVudHJ5O1xuICAgIGlmICghZW50cnkuYWJvcnRDb250cm9sbGVyIHx8ICghc2hvdWxkUmVsZWFzZU9uQWJvcnQgJiYgIW9uVW5sb2NrUmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlbGVhc2VPbkFib3J0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICBvblVubG9ja1JlcXVlc3RlZD8uKCk7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3IgcGF0aC1zY29wZWQgcmVzb3VyY2UgbG9ja2luZyAoZWRpdG9yIHJlYWQtb25seSwgb3B0aW9uYWwgdmF1bHQtbXV0YXRpb25cbiAqIGJsb2NraW5nLCBhbmQgZXh0ZXJuYWwtY2hhbmdlIGRldGVjdGlvbiBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3KS4gQWRkIGl0IGFzIGEgY2hpbGQgb2YgeW91ciBwbHVnaW5cbiAqIChgdGhpcy5hZGRDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgcmVzb3VyY2UgY2FuIG5ldmVyIGJlIGxlZnQgc3R1Y2sgbG9ja2VkIGJlY2F1c2UgdGhlIHBsdWdpblxuICogdGhhdCBsb2NrZWQgaXQgd2FzIGRpc2FibGVkIG9yIHJlbG9hZGVkIG1pZC1vcGVyYXRpb24uXG4gKlxuICogTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBhdHRyaWJ1dGVkIHRvIHRoaXMgcGx1Z2luLCBzbyB0aGUgbG9jayBpbmRpY2F0b3JzJyB0b29sdGlwIG5hbWVzIGl0XG4gKiBhbW9uZyB0aGUgcGx1Z2lucyBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc306XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ieXBhc3MgPSBjb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhbc291cmNlRmlsZSwgdGFyZ2V0RmlsZV0pO1xuICAgKiAvLyAuLi4gdGhlIG9wZXJhdGlvbidzIG93biB2YXVsdCBtdXRhdGlvbnMgb2YgdGhvc2UgcGF0aHMgYXJlIGFsbG93ZWQgLi4uXG4gICAqIC8vIHNjb3BlIGVuZDogdGhlIHBhdGhzIGFyZSBlbmZvcmNlZCBhZ2FpblxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzT3JGaWxlcyAtIFRoZSBwYXRocyAob3IgZmlsZXMvZm9sZGVycykgd2hvc2UgbXV0YXRpb24gYnkgdGhpcyBvcGVyYXRpb24gaXMgc2FuY3Rpb25lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBlbmRzIHRoZSBieXBhc3Mgc2NvcGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBieXBhc3NCbG9ja2VkTXV0YXRpb25zKHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5ieXBhc3ModGhpcy5hcHAsIHBhdGhzT3JGaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkIGJ5IGEgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrXG4gICAqIG9uIHRoZSBwYXRoIGl0c2VsZiBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlZGl0aW5nL2RlbGV0aW5nL3JlbmFtaW5nL21vdmluZy9jcmVhdGluZyB0aGUgcGF0aCB3b3VsZCB0aHJvdyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIExvY2tpbmcgcGFyYW1ldGVycy4gSXRzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5wYXRoT3JGaWxlfVxuICAgKiBhbmQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLm9wZXJhdGlvbk5hbWV9IGFyZSByZXF1aXJlZCAodGhlIGxhdHRlciBpcyBzaG93blxuICAgKiBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbikuIFBhc3MgYW4ge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSBhIGxvY2sgaW5kaWNhdG9yJ3MgXCJ1bmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLFxuICAgKiBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhcmFtczogUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aDogcmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgKHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIpLCBjYW5jZWxzIHRoZSBvcGVyYXRpb24ocykgdGhhdCB0b29rXG4gICAqIHRoZSBsb2NrIGJ5IGFib3J0aW5nIHRoZWlyIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9cywgYW5kIHJlbGVhc2VzIHRoZSBsb2NrIHNvIHRoZSBub3RlIGJlY29tZXNcbiAgICogZWRpdGFibGUgXHUyMDE0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGx1Z2luIGhvbGRzIHRoZSBsb2NrLiBQb3dlcnMgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZC4gQVxuICAgKiBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkuZm9yY2VVbmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG5cbi8qKlxuICogTWFwcyBhIHN0b3JlZCBwYXRoIHRocm91Z2ggYSByZW5hbWU6IHRoZSByZW5hbWVkIHBhdGggaXRzZWxmIGJlY29tZXMgdGhlIG5ldyBwYXRoLCBhbmQgYSBkZXNjZW5kYW50XG4gKiBvZiBpdCBrZWVwcyBpdHMgc3VmZml4IHVuZGVyIHRoZSBuZXcgcGF0aC4gU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gcmV1c2luZyB7QGxpbmsgaXNDaGlsZE9yU2VsZn1cbiAqIGJlY2F1c2UgdGhlIHJlYmFzZWQgc3VmZml4IGhhcyB0byBiZSBjb21wdXRlZCBmcm9tIHRoZSBzYW1lIHByZWZpeCB0aGUgdGVzdCBtYXRjaGVkLCBhbmQgYSByZW5hbWVcbiAqIHNvdXJjZSBpcyBuZXZlciB0aGUgdmF1bHQgcm9vdCAodGhlIG9uZSBjYXNlIHRob3NlIGhlbHBlcnMgdHJlYXQgc3BlY2lhbGx5KS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBzdG9yZWQgcGF0aCB0byBtYXAuXG4gKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCBmcm9tLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gKiBAcmV0dXJucyBUaGUgcmViYXNlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiB0aGUgcmVuYW1lIGRvZXMgbm90IGFmZmVjdCBpdC5cbiAqL1xuZnVuY3Rpb24gcmViYXNlUGF0aChwYXRoOiBzdHJpbmcsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChwYXRoID09PSBvbGRQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtvbGRQYXRofS9gKSkge1xuICAgIHJldHVybiBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENBLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGVBQWU7QUFDeEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHNCQUFzQjtBQXVLNUIsTUFBTSxvQ0FBb0MsWUFBWTtBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFzRDtBQUN2RSxVQUFNO0FBQ04sU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLGFBQWEsT0FBTztBQUN6QixTQUFLLFdBQVcsT0FBTztBQUFB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
|
|
1015
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vLi4vc3JjL29ic2lkaWFuL3Jlc291cmNlLWxvY2sudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBQYXRoLXNjb3BlZCByZXNvdXJjZSBsb2NraW5nIGZvciB2YXVsdCBmaWxlcyBhbmQgZm9sZGVycywgd2l0aCB0aHJlZSBlbmZvcmNlbWVudCBsYXllcnMgb3ZlciBvbmVcbiAqIHNoYXJlZCBsb2NrZWQtcGF0aCBzZXQ6XG4gKlxuICogMS4gKipFZGl0b3IgcmVhZC1vbmx5KiogXHUyMDE0IHdoaWxlIGEgcGF0aCBpcyBsb2NrZWQsIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSBvZlxuICogICAgdGhhdCBub3RlIChpbiBhbnkgd2luZG93LCBpbmNsdWRpbmcgcG9wb3V0cykgaXMgbWFkZSByZWFkLW9ubHkgYW5kIHNob3dzIGEgbG9jayBpbmRpY2F0b3IgaW4gaXRzXG4gKiAgICB0YWIgaGVhZGVyLCBpdHMgdmlldyBhY3Rpb24gYmFyLCBhbmQgdGhlIHN0YXR1cyBiYXI7IGEgbm90ZSBpbnNpZGUgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBpc1xuICogICAgY292ZXJlZCB0b28uIExvY2tzIGFyZSByZWZlcmVuY2UtY291bnRlZCBwZXIgbG9ja2luZyBwbHVnaW4gKHRoZSBpbmRpY2F0b3JzJyB0b29sdGlwIGxpc3RzIHdoaWNoXG4gKiAgICBwbHVnaW5zIGhvbGQgYSBsb2NrKSwgc28gbmVzdGVkL2NvbmN1cnJlbnQgb3BlcmF0aW9ucyBhcmUgc2FmZSBcdTIwMTQgdGhlIHBhdGggaXMgdW5sb2NrZWQgb25seSB3aGVuXG4gKiAgICB0aGUgbGFzdCBsb2NrIGlzIHJlbGVhc2VkLlxuICogMi4gKipWYXVsdC1tdXRhdGlvbiBibG9ja2luZyoqIChvcHQtaW4gdmlhIGBzaG91bGRCbG9ja011dGF0aW9uc2ApIFx1MjAxNCBhbnkgZWRpdC9kZWxldGUvcmVuYW1lL21vdmUvXG4gKiAgICBjcmVhdGUgb2YgYSBsb2NrZWQgcGF0aCB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0sXG4gKiAgICB1bmxlc3MgdGhlIG93bmluZyBvcGVyYXRpb24gaGFzIG9wZW5lZCBhIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9uc30gc2NvcGVcbiAqICAgIG92ZXIgdGhhdCBwYXRoLlxuICogMy4gKipFeHRlcm5hbC1jaGFuZ2UgZGV0ZWN0aW9uKiogXHUyMDE0IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBsb2NrZWQgcGF0aCB0aGF0IG5vIGJ5cGFzcyBzY29wZVxuICogICAgY292ZXJzIGlzIHRyZWF0ZWQgYXMgYW4gaW50cnVkZXIgKFN5bmMgLyByYXcgZmlsZXN5c3RlbSAvIGFub3RoZXIgcGx1Z2luKSBhbmQgYWJvcnRzIHRoZSBvd25pbmdcbiAqICAgIG9wZXJhdGlvbidzIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9LlxuICpcbiAqIEEgbG9jayAqKmZvbGxvd3MgaXRzIHJlc291cmNlIGFjcm9zcyBhIHJlbmFtZSoqOiB3aGVuIGEgbG9ja2VkIHBhdGggKG9yIGFuIGFuY2VzdG9yIGZvbGRlciBvZiBpdCkgaXNcbiAqIHJlbmFtZWQsIHRoZSBsb2NrIHJlZ2lzdHJ5IGFuZCBldmVyeSBhY3RpdmUgYnlwYXNzIHNjb3BlIGFyZSByZS1rZXllZCBvbnRvIHRoZSBuZXcgcGF0aCwgc28gYVxuICogbXVsdGktc3RlcCBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCBrZWVwcyBpdHMgY292ZXJhZ2UgZm9yIHRoZSByZXN0IG9mIHRoZVxuICogdHJhbnNhY3Rpb24uXG4gKlxuICogVGhlIGFjcXVpcmVycyByZXR1cm4gYSB7QGxpbmsgRGlzcG9zYWJsZX0sIHNvIHRoZSBwcmVmZXJyZWQgY2FsbCBzdHlsZSBpcyBhIGB1c2luZ2AgZGVjbGFyYXRpb24gdGhhdFxuICogcmVsZWFzZXMgYXV0b21hdGljYWxseSBhdCBzY29wZSBleGl0IChpbmNsdWRpbmcgb24gdGhyb3cpOlxuICpcbiAqIGBgYHRzXG4gKiB1c2luZyBfbG9jayA9IGxvY2tSZXNvdXJjZUZvclBhdGgoeyBhcHAsIHBhdGhPckZpbGU6IHBhdGgsIHBsdWdpbklkOiB0aGlzLm1hbmlmZXN0LmlkLCBvcGVyYXRpb25OYW1lOiAnUHJvY2VzcyBub3RlJyB9KTtcbiAqIC8vIC4uLiBsb25nLXJ1bm5pbmcgd29yayAocHJvY2VzcywgcHJvY2Vzc0Zyb250TWF0dGVyLCBtZXJnZS9zcGxpdCkgLi4uXG4gKiAvLyBhdXRvLXVubG9ja2VkIGF0IHNjb3BlIGV4aXRcbiAqIGBgYFxuICpcbiAqIFRoZSBleHBsaWNpdCB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBwYWlyIHJlbWFpbnMgYXZhaWxhYmxlIGZvciBub24tYHVzaW5nYCBjYWxsIHNpdGVzLlxuICovXG5cbmltcG9ydCB0eXBlIHtcbiAgQXBwLFxuICBUQWJzdHJhY3RGaWxlXG59IGZyb20gJ29ic2lkaWFuJztcblxuaW1wb3J0IHsgVmlld1R5cGUgfSBmcm9tICdAb2JzaWRpYW4tdHlwaW5ncy9vYnNpZGlhbi1wdWJsaWMtbGF0ZXN0L2ltcGxlbWVudGF0aW9ucyc7XG5pbXBvcnQge1xuICBGaWxlTWFuYWdlcixcbiAgTWFya2Rvd25WaWV3LFxuICBNZW51LFxuICBzZXRJY29uLFxuICBzZXRUb29sdGlwLFxuICBWYXVsdFxufSBmcm9tICdvYnNpZGlhbic7XG5cbmltcG9ydCB0eXBlIHsgUGF0aE9yRmlsZSB9IGZyb20gJy4vZmlsZS1zeXN0ZW0udHMnO1xuXG5pbXBvcnQgeyBzbmFwc2hvdCB9IGZyb20gJy4uL2FycmF5LnRzJztcbmltcG9ydCB7IGNvbnZlcnRBc3luY1RvU3luYyB9IGZyb20gJy4uL2FzeW5jLnRzJztcbmltcG9ydCB7IEJlZXBlciB9IGZyb20gJy4uL2JlZXBlci50cyc7XG5pbXBvcnQge1xuICBDYWxsYmFja0Rpc3Bvc2FibGUsXG4gIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yXG59IGZyb20gJy4uL2Rpc3Bvc2FibGUudHMnO1xuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL2Z1bmN0aW9uLnRzJztcbmltcG9ydCB7IGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZSB9IGZyb20gJy4uL29ic2lkaWFuLWRldi11dGlscy1zdGF0ZS50cyc7XG5pbXBvcnQgeyBhc3NlcnROb25OdWxsYWJsZSB9IGZyb20gJy4uL3R5cGUtZ3VhcmRzLnRzJztcbmltcG9ydCB7IENvbXBvbmVudEV4IH0gZnJvbSAnLi9jb21wb25lbnRzL2NvbXBvbmVudC1leC50cyc7XG5pbXBvcnQgeyBNb25rZXlBcm91bmRDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMvbW9ua2V5LWFyb3VuZC1jb21wb25lbnQudHMnO1xuaW1wb3J0IHsgdG9nZ2xlRWRpdG9yUmVhZE9ubHkgfSBmcm9tICcuL2VkaXRvci50cyc7XG5pbXBvcnQgeyBnZXRQYXRoIH0gZnJvbSAnLi9maWxlLXN5c3RlbS50cyc7XG5pbXBvcnQgeyBhcHBlbmRDb2RlQmxvY2sgfSBmcm9tICcuL2h0bWwtZWxlbWVudC50cyc7XG5pbXBvcnQgeyB0IH0gZnJvbSAnLi9pMThuL2kxOG4udHMnO1xuaW1wb3J0IHsgY29uZmlybSB9IGZyb20gJy4vbW9kYWxzL2NvbmZpcm0udHMnO1xuaW1wb3J0IHtcbiAgaXNDaGlsZCxcbiAgaXNDaGlsZE9yU2VsZlxufSBmcm9tICcuL3ZhdWx0LnRzJztcblxuY29uc3QgUkVTT1VSQ0VfTE9DS19TVEFURV9LRVkgPSAncmVzb3VyY2VMb2NrJztcbmNvbnN0IExPQ0tfSUNPTl9JRCA9ICdsb2NrJztcbmNvbnN0IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyA9ICdvYnNpZGlhbi1kZXYtdXRpbHMtbG9jay1pbmRpY2F0b3InO1xuY29uc3QgTE9DS19JTkRJQ0FUT1JfRkxBU0hfQ1NTX0NMQVNTID0gJ29ic2lkaWFuLWRldi11dGlscy1sb2NrLWluZGljYXRvci1mbGFzaCc7XG5jb25zdCBTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTID0gJ3N0YXR1cy1iYXItaXRlbSc7XG5jb25zdCBTVEFUVVNfQkFSX0NTU19TRUxFQ1RPUiA9ICcuc3RhdHVzLWJhcic7XG5jb25zdCBVTkxPQ0tfSUNPTl9JRCA9ICd1bmxvY2snO1xuY29uc3QgTUlERExFX01PVVNFX0JVVFRPTiA9IDE7XG5cbi8qKlxuICogUGFyYW1ldGVycyBmb3Ige0BsaW5rIGxvY2tSZXNvdXJjZUZvclBhdGh9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIExvY2tSZXNvdXJjZUZvclBhdGhQYXJhbXMge1xuICAvKipcbiAgICogVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICovXG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBBIGh1bWFuLXJlYWRhYmxlIG5hbWUgb2YgdGhlIG9wZXJhdGlvbiB0YWtpbmcgdGhlIGxvY2sgKGUuZy4gYCdNb3ZlIHNlbGVjdGlvbidgKS4gU2hvd24gbmV4dCB0b1xuICAgKiB0aGUgcGx1Z2luIG5hbWUgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLlxuICAgKi9cbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGxvY2suXG4gICAqL1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIGxvY2tpbmcgcGx1Z2luIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKS4gVGhlIGxvY2sgaXMgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbn1cblxuLyoqXG4gKiBQYXJhbWV0ZXJzIGZvciB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LmxvY2tGb3JQYXRofS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcyB7XG4gIC8qKlxuICAgKiBBbiBvcHRpb25hbCB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2suIFdoZW4gYSBsb2NrIGluZGljYXRvciBpcyBjbGlja2VkICh3aXRoXG4gICAqIGFueSBtb3VzZSBidXR0b24pIGFuZCB0aGUgdXNlciBjb25maXJtcyBhbiB1bmxvY2ssIHRoZSBcIlVubG9jayBhY3RpdmUgbm90ZVwiIGNvbW1hbmQgcnVucywgb3JcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5yZXF1ZXN0VW5sb2NrRm9yUGF0aH0gLyB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0gaXMgY2FsbGVkXG4gICAqIGZvciB0aGUgcGF0aCwgdGhpcyBjb250cm9sbGVyIGlzIGFib3J0ZWQgc28gdGhlIG9wZXJhdGlvbiBob2xkaW5nIHRoZSBsb2NrIGNhbiBjYW5jZWwgaXRzZWxmLiBVbmxlc3NcbiAgICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLnNob3VsZFJlbGVhc2VPbkFib3J0fSBpcyBzZXQsIHRoZSBvcGVyYXRpb24gaXNcbiAgICogZXhwZWN0ZWQgdG8gcmVsZWFzZSB0aGUgbG9jayBpbiBpdHMgb3duIGNsZWFudXAuIFdoZW4gb21pdHRlZCwgYW4gdW5sb2NrIHN0aWxsIHJlbGVhc2VzIHRoZSBsb2NrIGJ1dFxuICAgKiBjYW5ub3QgY2FuY2VsIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIGl0LlxuICAgKi9cbiAgcmVhZG9ubHkgYWJvcnRDb250cm9sbGVyPzogQWJvcnRDb250cm9sbGVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbG9jayBzY29wZS4gYCdzdWJ0cmVlJ2AgYWxzbyBsb2NrcyBldmVyeSBkZXNjZW5kYW50IG9mIGEgZm9sZGVyIHBhdGg7IGAnZmlsZSdgIGxvY2tzIG9ubHkgdGhlXG4gICAqIGV4YWN0IHBhdGguIEEgYHN1YnRyZWVgIGxvY2sgbXVzdCBiZSByZWxlYXNlZCB2aWEgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSAobm90IHRoZVxuICAgKiBleHBsaWNpdCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnVubG9ja0ZvclBhdGh9KS5cbiAgICpcbiAgICogQGRlZmF1bHQgYCdmaWxlJ2BcbiAgICovXG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlO1xuXG4gIC8qKlxuICAgKiBXaGVuIHByb3ZpZGVkLCB0aGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiB1bmxvY2sgb2YgdGhlIGxvY2sgaXMgcmVxdWVzdGVkIFx1MjAxNCBpLmUuIHdoZW4gdGhlXG4gICAqIGxvY2sncyB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkIChieSB0aGVcbiAgICogaW5kaWNhdG9yJ3MgXCJVbmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLCB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50LnJlcXVlc3RVbmxvY2tGb3JQYXRofSxcbiAgICogb3Ige0BsaW5rIGhhbmRsZUV4dGVybmFsTXV0YXRpb259KS4gVXNlIGl0IHRvIGNsZWFyIGNvbnN1bWVyLXNpZGUgc3RhdGUgdGhhdCBzaGFkb3dzIHRoZSBsb2NrIChlLmcuXG4gICAqIGEgcGVuZGluZy1vcGVyYXRpb24gYnVmZmVyIG9yIGEgbm90aWNlKSB3aXRob3V0IGhhbmQtd2lyaW5nIGFuIGBhYm9ydGAgbGlzdGVuZXIuIEZpcmVzIGF0IG1vc3Qgb25jZS5cbiAgICovXG4gIG9uVW5sb2NrUmVxdWVzdGVkPyh0aGlzOiB2b2lkKTogdm9pZDtcblxuICAvKipcbiAgICogQSBodW1hbi1yZWFkYWJsZSBuYW1lIG9mIHRoZSBvcGVyYXRpb24gdGhhdCB0b29rIHRoZSBsb2NrIChlLmcuIGAnTW92ZSBzZWxlY3Rpb24nYCwgYCdNZXJnZVxuICAgKiBub3RlcydgKS4gSXQgaXMgc2hvd24gXHUyMDE0IG5leHQgdG8gdGhlIGxvY2tpbmcgcGx1Z2luJ3MgbmFtZSBcdTIwMTQgaW4gdGhlIHVubG9jayBjb25maXJtYXRpb24gZGlhbG9nLCBzb1xuICAgKiB0aGUgdXNlciBzZWVzIGV4YWN0bHkgd2hpY2ggb3BlcmF0aW9uIGFuIHVubG9jayB3b3VsZCBjYW5jZWwuXG4gICAqL1xuICByZWFkb25seSBvcGVyYXRpb25OYW1lOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gbG9jay5cbiAgICovXG4gIHJlYWRvbmx5IHBhdGhPckZpbGU6IFBhdGhPckZpbGU7XG5cbiAgLyoqXG4gICAqIFdoZW4gYHRydWVgLCB0aGUgbG9jayBhbHNvICoqYmxvY2tzIHZhdWx0IG11dGF0aW9ucyoqIG9mIHRoZSBjb3ZlcmVkIHBhdGgocyk6IGFueSBhdHRlbXB0IHRvIGVkaXQsXG4gICAqIGRlbGV0ZSwgcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIHRoZSByZXNvdXJjZSB0aHJvdWdoIHRoZSBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgQVBJIHRocm93cyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS4gSW5zdGFsbGVkIGxhemlseSBvbiB0aGUgZmlyc3Qgc3VjaCBsb2NrIGFuZCByZW1vdmVkIHdoZW4gdGhlIGxhc3Qgb25lXG4gICAqIGlzIHJlbGVhc2VkLiBXaGVuIGBmYWxzZWAgKHRoZSBkZWZhdWx0KSB0aGUgbG9jayBvbmx5IG1ha2VzIHRoZSBlZGl0b3IgcmVhZC1vbmx5IFx1MjAxNCBsZWdhY3kgYmVoYXZpb3IsXG4gICAqIHNvIGV4aXN0aW5nIGNvbnN1bWVycyB0aGF0IHdyaXRlIHRvIGEgbm90ZSB0aGV5IGhvbGQgYW4gZWRpdG9yIGxvY2sgb24gYXJlIHVuYWZmZWN0ZWQuXG4gICAqXG4gICAqIEBkZWZhdWx0IGBmYWxzZWBcbiAgICovXG4gIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb25zPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogV2hlbiBgdHJ1ZWAsIHRoZSBsb2NrIHJlbGVhc2VzIGl0c2VsZiB0aGUgbW9tZW50IGl0c1xuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfSBpcyBhYm9ydGVkLCBpbnN0ZWFkIG9mIHJlbHlpbmcgb25cbiAgICogdGhlIG93bmluZyBvcGVyYXRpb24gdG8gcmVsZWFzZSBpdCBpbiBpdHMgb3duIGNsZWFudXAuIFVzZSBpdCBmb3IgYSBsb2NrIGhlbGQgKippbmRlZmluaXRlbHkqKlxuICAgKiBvdXRzaWRlIGEgYHVzaW5nYCBzY29wZSAoc28gdGhlcmUgaXMgbm8gYGZpbmFsbHlgIHRvIHJlbGVhc2UgaXQpIFx1MjAxNCBlLmcuIGEgbG9jayB0aGF0IHN0YXlzIHVudGlsIHRoZVxuICAgKiB1c2VyIGV4cGxpY2l0bHkgdW5sb2Nrcy4gTGVhdmUgaXQgYGZhbHNlYCBmb3IgYSB0cmFuc2FjdGlvbmFsIG9wZXJhdGlvbiB0aGF0IGhvbGRzIHRoZSBsb2NrIHRocm91Z2hcbiAgICogaXRzIG93biBhYm9ydC1kcml2ZW4gcm9sbGJhY2sgYW5kIHJlbGVhc2VzIGl0IHZpYSBgdXNpbmdgIGF0IHNjb3BlIGV4aXQuIEhhcyBubyBlZmZlY3Qgd2l0aG91dCBhblxuICAgKiB7QGxpbmsgUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMuYWJvcnRDb250cm9sbGVyfS5cbiAgICpcbiAgICogQGRlZmF1bHQgYGZhbHNlYFxuICAgKi9cbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ/OiBib29sZWFuO1xufVxuXG4vKipcbiAqIFRoZSBzY29wZSBvZiBhIGxvY2suXG4gKlxuICogLSBgJ2ZpbGUnYCBsb2NrcyBvbmx5IHRoZSBleGFjdCBwYXRoLlxuICogLSBgJ3N1YnRyZWUnYCBsb2NrcyB0aGUgcGF0aCBhbmQgZXZlcnkgZGVzY2VuZGFudCB1bmRlciBpdCAoaXRzIHdob2xlIGZvbGRlciBzdWJ0cmVlKSwgc28gYSBmaWxlXG4gKiAgIGluc2lkZSBhIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIGlzIHRyZWF0ZWQgYXMgbG9ja2VkIHRvby5cbiAqL1xuZXhwb3J0IHR5cGUgUmVzb3VyY2VMb2NrTW9kZSA9ICdmaWxlJyB8ICdzdWJ0cmVlJztcblxuaW50ZXJmYWNlIExvY2tEZXNjcmlwdG9yIHtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwbHVnaW5OYW1lOiBzdHJpbmc7XG59XG5cbmludGVyZmFjZSBMb2NrRW50cnkge1xuICByZWFkb25seSBhYm9ydENvbnRyb2xsZXI6IEFib3J0Q29udHJvbGxlciB8IG51bGw7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9uczogYm9vbGVhbjtcbiAgcmVhZG9ubHkgbW9kZTogUmVzb3VyY2VMb2NrTW9kZTtcbiAgcmVhZG9ubHkgb25VbmxvY2tSZXF1ZXN0ZWQ6ICgoKSA9PiB2b2lkKSB8IG51bGw7XG4gIHJlYWRvbmx5IG9wZXJhdGlvbk5hbWU6IHN0cmluZztcbiAgLyoqXG4gICAqIFRoZSBwYXRoIHRoZSBlbnRyeSBpcyBjdXJyZW50bHkgcmVnaXN0ZXJlZCB1bmRlci4gRGVsaWJlcmF0ZWx5IG11dGFibGU6IGEgcmVuYW1lIHJlLWtleXMgdGhlXG4gICAqIHJlZ2lzdHJ5LCBhbmQgcmVsZWFzZSBtdXN0IGZpbmQgdGhlIGVudHJ5IGF0IGl0cyBDVVJSRU5UIHBhdGggXHUyMDE0IGEgcmVsZWFzZSB0aGF0IGNhcHR1cmVkIHRoZSBwYXRoXG4gICAqIGF0IGxvY2sgdGltZSB3b3VsZCBzaWxlbnRseSBuby1vcCBhZnRlciB0aGUgcmVzb3VyY2UgbW92ZWQsIGxlYWtpbmcgdGhlIGxvY2sgZm9yZXZlci5cbiAgICovXG4gIHBhdGg6IHN0cmluZztcbiAgcmVhZG9ubHkgcGx1Z2luSWQ6IHN0cmluZztcbiAgcmVhZG9ubHkgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IGJvb2xlYW47XG59XG5cbmludGVyZmFjZSBMb2NrSW5kaWNhdG9ycyB7XG4gIHJlYWRvbmx5IGFjdGlvbkljb25FbDogSFRNTEVsZW1lbnQ7XG4gIGRpc3Bvc2VUeXBlTGlzdGVuZXIoKTogdm9pZDtcbiAgcmVhZG9ubHkgdGFiSWNvbkVsOiBIVE1MRWxlbWVudCB8IG51bGw7XG59XG5cbmludGVyZmFjZSBNYW5hZ2VyTG9ja1BhcmFtcyB7XG4gIHJlYWRvbmx5IGFib3J0Q29udHJvbGxlcj86IEFib3J0Q29udHJvbGxlciB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgYXBwOiBBcHA7XG4gIHJlYWRvbmx5IGJsb2Nrc011dGF0aW9ucz86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG4gIHJlYWRvbmx5IG1vZGU/OiBSZXNvdXJjZUxvY2tNb2RlIHwgdW5kZWZpbmVkO1xuICByZWFkb25seSBvblVubG9ja1JlcXVlc3RlZD86ICgoKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcbiAgcmVhZG9ubHkgb3BlcmF0aW9uTmFtZTogc3RyaW5nO1xuICByZWFkb25seSBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlO1xuICByZWFkb25seSBwbHVnaW5JZDogc3RyaW5nO1xuICByZWFkb25seSBzaG91bGRSZWxlYXNlT25BYm9ydD86IGJvb2xlYW4gfCB1bmRlZmluZWQ7XG59XG5cbi8qKlxuICogQ29uc3RydWN0b3IgcGFyYW1ldGVycyBmb3Ige0BsaW5rIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudH0uXG4gKi9cbmludGVyZmFjZSBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIHJlYWRvbmx5IGFwcDogQXBwO1xuICBvbkNoYW5nZSh0aGlzOiB2b2lkKTogdm9pZDtcbiAgb25FeHRlcm5hbE11dGF0aW9uKHRoaXM6IHZvaWQsIHBhdGg6IHN0cmluZyk6IHZvaWQ7XG4gIG9uRmlsZU1lbnUodGhpczogdm9pZCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQ7XG4gIG9uUmVuYW1lKHRoaXM6IHZvaWQsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogdm9pZDtcbn1cblxuaW50ZXJmYWNlIFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudENvbnN0cnVjdG9yUGFyYW1zIHtcbiAgc2hvdWxkQmxvY2tNdXRhdGlvbih0aGlzOiB2b2lkLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuO1xufVxuXG4vKipcbiAqIFN1YnNjcmliZXMgdG8gdGhlIHdvcmtzcGFjZSBldmVudHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGxvY2sgcmVjb25jaWxlIChhbmQgdGhlIGZpbGUgY29udGV4dC1tZW51XG4gKiBldmVudCB0aGF0IG9mZmVycyBhbiBcIlVubG9ja1wiIGl0ZW0pLiBJbXBsZW1lbnRlZCBhcyBhIHtAbGluayBDb21wb25lbnRFeH0gc28gdGhlIHN1YnNjcmlwdGlvbnMgYXJlXG4gKiByZWdpc3RlcmVkIG9uIGBsb2FkKClgIGFuZCBhdXRvbWF0aWNhbGx5IHJlbW92ZWQgb24gYHVubG9hZCgpYCwgaW5zdGVhZCBvZiBiZWluZyB0cmFja2VkIGJ5IGhhbmQuXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja0V2ZW50c0NvbXBvbmVudCBleHRlbmRzIENvbXBvbmVudEV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcHA6IEFwcDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkNoYW5nZTogKCkgPT4gdm9pZDtcbiAgcHJpdmF0ZSByZWFkb25seSBvbkV4dGVybmFsTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25GaWxlTWVudTogKG1lbnU6IE1lbnUsIGZpbGU6IFRBYnN0cmFjdEZpbGUpID0+IHZvaWQ7XG4gIHByaXZhdGUgcmVhZG9ubHkgb25SZW5hbWU6IChvbGRQYXRoOiBzdHJpbmcsIG5ld1BhdGg6IHN0cmluZykgPT4gdm9pZDtcblxuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBSZXNvdXJjZUxvY2tFdmVudHNDb21wb25lbnRDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHN1cGVyKCk7XG4gICAgdGhpcy5hcHAgPSBwYXJhbXMuYXBwO1xuICAgIHRoaXMub25DaGFuZ2UgPSBwYXJhbXMub25DaGFuZ2U7XG4gICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24gPSBwYXJhbXMub25FeHRlcm5hbE11dGF0aW9uO1xuICAgIHRoaXMub25GaWxlTWVudSA9IHBhcmFtcy5vbkZpbGVNZW51O1xuICAgIHRoaXMub25SZW5hbWUgPSBwYXJhbXMub25SZW5hbWU7XG4gIH1cblxuICBwdWJsaWMgb3ZlcnJpZGUgb25sb2FkKCk6IHZvaWQge1xuICAgIHN1cGVyLm9ubG9hZCgpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC53b3Jrc3BhY2Uub24oJ2FjdGl2ZS1sZWFmLWNoYW5nZScsIHRoaXMub25DaGFuZ2UpKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdsYXlvdXQtY2hhbmdlJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIFNhbWUtbGVhZiBuYXZpZ2F0aW9uIHRvIGFub3RoZXIgbm90ZSBmaXJlcyBubyBsZWFmL2xheW91dCBjaGFuZ2U7IHdpdGhvdXQgdGhpcyBpdCBzdGF5cyByZWFkLW9ubHkuXG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KHRoaXMuYXBwLndvcmtzcGFjZS5vbignZmlsZS1vcGVuJywgdGhpcy5vbkNoYW5nZSkpO1xuICAgIC8vIEFkZHMgYW4gXCJVbmxvY2tcIiBpdGVtIHRvIGEgbG9ja2VkIG5vdGUncyB0YWIvZmlsZSBjb250ZXh0IG1lbnUgKGFsb25nc2lkZSB0aGUgaW5kaWNhdG9yIG1lbnVzKS5cbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAud29ya3NwYWNlLm9uKCdmaWxlLW1lbnUnLCB0aGlzLm9uRmlsZU1lbnUpKTtcbiAgICAvLyBFeHRlcm5hbC1jaGFuZ2UgYmFja3N0b3A6IGEgdmF1bHQvbWV0YWRhdGEgZXZlbnQgb24gYSBtdXRhdGlvbi1ibG9ja2VkIHBhdGggbm90IGNvdmVyZWQgYnkgYW4gYWN0aXZlIGJ5cGFzcyBzY29wZSBpcyBhbiBpbnRydWRlciAoYSBzeW5jL0ZTL2FkYXB0ZXIgY2hhbmdlIHRoYXQgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2gpLlxuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignY3JlYXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbignZGVsZXRlJywgKGZpbGUpOiB2b2lkID0+IHtcbiAgICAgIHRoaXMub25FeHRlcm5hbE11dGF0aW9uKGZpbGUucGF0aCk7XG4gICAgfSkpO1xuICAgIHRoaXMucmVnaXN0ZXJFdmVudCh0aGlzLmFwcC52YXVsdC5vbigncmVuYW1lJywgKGZpbGUsIG9sZFBhdGgpOiB2b2lkID0+IHtcbiAgICAgIC8vIFJlLWtleSBGSVJTVCwgc28gdGhlIGNoZWNrcyBiZWxvdyBydW4gYWdhaW5zdCB3aGVyZSB0aGUgbG9ja3MgYWN0dWFsbHkgYXJlIG5vdy5cbiAgICAgIC8vIEludHJ1ZGVyIGRldGVjdGlvbiBpcyB1bmFmZmVjdGVkOiB0aGUgb2xkIHBhdGggc3RvcHMgcmVzb2x2aW5nLCBidXQgdGhlIG5ldyBvbmUgaXMgY292ZXJlZCBpbnN0ZWFkLlxuICAgICAgdGhpcy5vblJlbmFtZShvbGRQYXRoLCBmaWxlLnBhdGgpO1xuICAgICAgdGhpcy5vbkV4dGVybmFsTXV0YXRpb24ob2xkUGF0aCk7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQodGhpcy5hcHAubWV0YWRhdGFDYWNoZS5vbignZGVsZXRlZCcsIChmaWxlKTogdm9pZCA9PiB7XG4gICAgICB0aGlzLm9uRXh0ZXJuYWxNdXRhdGlvbihmaWxlLnBhdGgpO1xuICAgIH0pKTtcbiAgfVxufVxuXG4vKipcbiAqIFRyYWNrcyBwYXRoLXNjb3BlZCBlZGl0b3IgbG9ja3MgYW5kIGtlZXBzIGV2ZXJ5IG9wZW4ge0BsaW5rIE1hcmtkb3duVmlld30gaW4gc3luYyB3aXRoIHRoZSBsb2NrZWRcbiAqIHNldC4gQSBzaW5nbGUgaW5zdGFuY2UgbGl2ZXMgb24gdGhlIHNoYXJlZCBgb2JzaWRpYW4tZGV2LXV0aWxzYCBzdGF0ZS4gRWFjaCBsb2NrIGlzIG9uZVxuICoge0BsaW5rIExvY2tFbnRyeX0gaW4gYSBwZXItcGF0aCBsaXN0LCBzbyBhIHBhdGggY2FuIGJlIGhlbGQgYnkgc2V2ZXJhbCBwbHVnaW5zIChvciBzZXZlcmFsIHRpbWVzIGJ5XG4gKiBvbmUpIGNvbmN1cnJlbnRseSBhbmQgaXMgcmVsZWFzZWQgb25seSB3aGVuIGl0cyBsYXN0IGVudHJ5IGlzIHJlbW92ZWQ7IHRoZSBpbmRpY2F0b3JzIHJlcG9ydCB3aGljaFxuICogcGx1Z2lucyBjdXJyZW50bHkgaG9sZCBhIGxvY2suXG4gKi9cbmNsYXNzIFJlc291cmNlTG9ja01hbmFnZXIge1xuICBwcml2YXRlIHJlYWRvbmx5IGJlZXBlciA9IG5ldyBCZWVwZXIoKTtcbiAgLy8gVGhlIGlubmVyIHNldHMgYXJlIG11dGFibGUgc28gYSByZW5hbWUgY2FuIHJlLWtleSB0aGUgcGF0aHMgb2YgYW4gaW4tZmxpZ2h0IGJ5cGFzcyBzY29wZSBpbiBwbGFjZTtcbiAgLy8gVGhlIHNjb3BlJ3MgYERpc3Bvc2FibGVgIGRlbGV0ZXMgYnkgc2V0IGlkZW50aXR5LCBzbyBtdXRhdGluZyB0aGUgY29udGVudHMgY2Fubm90IG9ycGhhbiBpdC5cbiAgcHJpdmF0ZSByZWFkb25seSBieXBhc3NQYXRoU2V0cyA9IG5ldyBTZXQ8U2V0PHN0cmluZz4+KCk7XG4gIHByaXZhdGUgZXZlbnRzQ29tcG9uZW50OiBudWxsIHwgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgcHJpdmF0ZSByZWFkb25seSBpbmRpY2F0b3JzQnlWaWV3ID0gbmV3IE1hcDxNYXJrZG93blZpZXcsIExvY2tJbmRpY2F0b3JzPigpO1xuICBwcml2YXRlIHJlYWRvbmx5IGxvY2tFbnRyaWVzQnlQYXRoID0gbmV3IE1hcDxzdHJpbmcsIExvY2tFbnRyeVtdPigpO1xuICBwcml2YXRlIG11dGF0aW9uQmxvY2tlckNvbXBvbmVudDogbnVsbCB8IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gIHByaXZhdGUgc3RhdHVzQmFySXRlbUVsOiBIVE1MRWxlbWVudCB8IG51bGwgPSBudWxsO1xuXG4gIHB1YmxpYyBieXBhc3MoYXBwOiBBcHAsIHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgY29uc3QgYnlwYXNzZWRQYXRocyA9IG5ldyBTZXQocGF0aHNPckZpbGVzLm1hcCgocGF0aE9yRmlsZSkgPT4gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpKSk7XG4gICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5hZGQoYnlwYXNzZWRQYXRocyk7XG4gICAgcmV0dXJuIG5ldyBDYWxsYmFja0Rpc3Bvc2FibGUoe1xuICAgICAgY2FsbGJhY2s6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdGhpcy5ieXBhc3NQYXRoU2V0cy5kZWxldGUoYnlwYXNzZWRQYXRocyk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEZ1bGx5IHVubG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGguIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIGl0IFx1MjAxNCB0aGUgcGF0aCBpdHNlbGYgd2hlblxuICAgKiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyIFx1MjAxNCB0aGVuIGFib3J0cyBldmVyeVxuICAgKiB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSByZWdpc3RlcmVkIG9uIHRoYXQgb3duZXIgKGNhbmNlbGxpbmcgdGhlIG9wZXJhdGlvbnMgdGhhdCB0b29rIHRoZSBsb2NrcylcbiAgICogQU5EIHJlbW92ZXMgdGhlIG93bmVyJ3MgbG9jayBlbnRyaWVzIChyZWxlYXNpbmcgdGhlIGxvY2sgdW5jb25kaXRpb25hbGx5KS4gVW5saWtlXG4gICAqIHtAbGluayByZXF1ZXN0VW5sb2NrfSwgd2hpY2ggb25seSBhYm9ydHMgdGhlIGV4YWN0IHBhdGgncyBjb250cm9sbGVycyBhbmQgcmVsaWVzIG9uIGVhY2ggb3BlcmF0aW9uXG4gICAqIHJlbGVhc2luZyBpdHMgb3duIGxvY2ssIHRoaXMgcmVzb2x2ZXMgYW5jZXN0b3IgY292ZXJhZ2UgYW5kIGFsd2F5cyByZWxlYXNlcyBcdTIwMTQgc28gYSBub3RlIGhlbGQgYnkgYW5cbiAgICogaW5kZWZpbml0ZWx5LWhlbGQgbG9jayBpcyBndWFyYW50ZWVkIHRvIGJlY29tZSBlZGl0YWJsZS4gQSBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIHVubG9jay5cbiAgICovXG4gIHB1YmxpYyBmb3JjZVVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcCwgb3duZXJQYXRoKTtcbiAgfVxuXG4gIHB1YmxpYyBpc0xvY2tlZChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmlzUGF0aExvY2tlZChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBwYXRoIGlzIGxvY2tlZCBkaXJlY3RseSBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvclxuICAgKiBmb2xkZXIuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlci5cbiAgICovXG4gIHB1YmxpYyBpc0xvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5yZXNvbHZlTG9ja093bmVyUGF0aChhcHAsIGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKSkgIT09IG51bGw7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHBhdGggaXMgY292ZXJlZCBieSBhIG11dGF0aW9uLWJsb2NraW5nIGxvY2sgKG9uZSB0YWtlbiB3aXRoXG4gICAqIGBibG9ja3NNdXRhdGlvbnNgKSBkaXJlY3RseSBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgYSBtdXRhdGlvbiBvZiB0aGUgcGF0aCBpcyBjdXJyZW50bHkgYmxvY2tlZC5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3IoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICBjb25zdCBwYXRoID0gZ2V0UGF0aChhcHAsIHBhdGhPckZpbGUpO1xuICAgIGNvbnN0IGV4YWN0RW50cmllcyA9IHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpO1xuICAgIGlmIChleGFjdEVudHJpZXM/LnNvbWUoKGVudHJ5KSA9PiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgZm9yIChjb25zdCBbbG9ja2VkUGF0aCwgZW50cmllc10gb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aCkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBlbnRyeS5ibG9ja3NNdXRhdGlvbnMpICYmIGlzQ2hpbGQoeyBhcHAsIGNoaWxkUGF0aE9yRmlsZTogcGF0aCwgcGFyZW50UGF0aE9yRmlsZTogbG9ja2VkUGF0aCB9KSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHVibGljIGxvY2socGFyYW1zOiBNYW5hZ2VyTG9ja1BhcmFtcyk6IERpc3Bvc2FibGUge1xuICAgIGNvbnN0IHsgYXBwIH0gPSBwYXJhbXM7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXJhbXMucGF0aE9yRmlsZSk7XG4gICAgY29uc3QgZW50cnk6IExvY2tFbnRyeSA9IHtcbiAgICAgIGFib3J0Q29udHJvbGxlcjogcGFyYW1zLmFib3J0Q29udHJvbGxlciA/PyBudWxsLFxuICAgICAgYmxvY2tzTXV0YXRpb25zOiBwYXJhbXMuYmxvY2tzTXV0YXRpb25zID8/IGZhbHNlLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUgPz8gJ2ZpbGUnLFxuICAgICAgb25VbmxvY2tSZXF1ZXN0ZWQ6IHBhcmFtcy5vblVubG9ja1JlcXVlc3RlZCA/PyBudWxsLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoLFxuICAgICAgcGx1Z2luSWQ6IHBhcmFtcy5wbHVnaW5JZCxcbiAgICAgIHNob3VsZFJlbGVhc2VPbkFib3J0OiBwYXJhbXMuc2hvdWxkUmVsZWFzZU9uQWJvcnQgPz8gZmFsc2VcbiAgICB9O1xuICAgIGxldCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICBlbnRyaWVzID0gW107XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCBlbnRyaWVzKTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgICB0aGlzLmVuc3VyZVN1YnNjcmliZWQoYXBwKTtcbiAgICBpZiAoZW50cnkuYmxvY2tzTXV0YXRpb25zKSB7XG4gICAgICB0aGlzLmVuc3VyZUJsb2NrZXJJbnN0YWxsZWQoYXBwKTtcbiAgICB9XG4gICAgdGhpcy53aXJlUmVsZWFzZU9uQWJvcnQoYXBwLCBlbnRyeSk7XG4gICAgdGhpcy5yZWNvbmNpbGUoYXBwKTtcblxuICAgIHJldHVybiBuZXcgQ2FsbGJhY2tEaXNwb3NhYmxlKHtcbiAgICAgIGNhbGxiYWNrOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9LFxuICAgICAgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZVxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIEFib3J0cyBldmVyeSB7QGxpbmsgQWJvcnRDb250cm9sbGVyfSBjdXJyZW50bHkgcmVnaXN0ZXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGgsIHdoaWNoXG4gICAqIGNhbmNlbHMgdGhlIG9wZXJhdGlvbnMgaG9sZGluZyB0aGUgbG9jay4gRWFjaCBvcGVyYXRpb24gcmVsZWFzZXMgaXRzIG93biBsb2NrIGluIGl0cyBgZmluYWxseWBcbiAgICogd2hlbiBpdCBvYnNlcnZlcyB0aGUgYWJvcnQsIHNvIHRoaXMgZG9lcyBub3QgdW5sb2NrIHRoZSBwYXRoIGRpcmVjdGx5LiBBIG5vLW9wIHdoZW4gbm8gY29udHJvbGxlclxuICAgKiBpcyByZWdpc3RlcmVkIGZvciB0aGUgcGF0aC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gICAqL1xuICBwdWJsaWMgcmVxdWVzdFVubG9jayhhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChnZXRQYXRoKGFwcCwgcGF0aE9yRmlsZSkpO1xuICAgIGlmICghZW50cmllcykge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgdW5sb2NrKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlLCBwbHVnaW5JZDogc3RyaW5nKTogdm9pZCB7XG4gICAgY29uc3QgcGF0aCA9IGdldFBhdGgoYXBwLCBwYXRoT3JGaWxlKTtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5maW5kSW5kZXgoKGVudHJ5KSA9PiBlbnRyeS5wbHVnaW5JZCA9PT0gcGx1Z2luSWQpO1xuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIGlmIChlbnRyaWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUocGF0aCk7XG4gICAgfVxuICAgIHRoaXMucmVjb25jaWxlQW5kQ2xlYW51cChhcHApO1xuICB9XG5cbiAgcHVibGljIHVubG9ja0FsbEZvclBsdWdpbihhcHA6IEFwcCwgcGx1Z2luSWQ6IHN0cmluZyk6IHZvaWQge1xuICAgIGZvciAoY29uc3QgW3BhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IHJlbWFpbmluZyA9IGVudHJpZXMuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQgIT09IHBsdWdpbklkKTtcbiAgICAgIGlmIChyZW1haW5pbmcubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKHBhdGgpO1xuICAgICAgfSBlbHNlIGlmIChyZW1haW5pbmcubGVuZ3RoICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNldChwYXRoLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBBYm9ydHMgZXZlcnkge0BsaW5rIEFib3J0Q29udHJvbGxlcn0gb24gdGhlIGdpdmVuIChhbHJlYWR5LXJlc29sdmVkKSBvd25lciBwYXRoJ3MgbG9jayBlbnRyaWVzIFx1MjAxNFxuICAgKiBjYW5jZWxsaW5nIHRoZSBvd25pbmcgb3BlcmF0aW9ucyBcdTIwMTQgYW5kIHJlbW92ZXMgdGhvc2UgZW50cmllcywgcmVsZWFzaW5nIHRoZSBsb2NrLiBUaGUgZW50cmllc1xuICAgKiBzbmFwc2hvdCBpcyBjb3BpZWQgZmlyc3QgYmVjYXVzZSBhbiBlbnRyeSdzIGBzaG91bGRSZWxlYXNlT25BYm9ydGAgYWJvcnQgbGlzdGVuZXIgbXV0YXRlcyB0aGVcbiAgICogYXJyYXkgYXMgaXQgZmlyZXMuIEFsd2F5cyBsZWF2ZXMgdGhlIG93bmVyIHBhdGggd2l0aCBubyBlbnRyaWVzLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG93bmVyUGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgb3duZXIgcGF0aCB3aG9zZSBlbnRyaWVzIHRvIGFib3J0IGFuZCByZWxlYXNlLlxuICAgKi9cbiAgcHJpdmF0ZSBhYm9ydEFuZFJlbGVhc2VFbnRyaWVzKGFwcDogQXBwLCBvd25lclBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IGVudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChvd25lclBhdGgpO1xuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGZvciAoY29uc3QgZW50cnkgb2Ygc25hcHNob3QoZW50cmllcykpIHtcbiAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlcj8uYWJvcnQoKTtcbiAgICB9XG4gICAgdGhpcy5sb2NrRW50cmllc0J5UGF0aC5kZWxldGUob3duZXJQYXRoKTtcbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkVW5sb2NrTWVudUl0ZW0oYXBwOiBBcHAsIG1lbnU6IE1lbnUsIHBhdGg6IHN0cmluZyk6IHZvaWQge1xuICAgIG1lbnUuYWRkSXRlbSgoaXRlbSkgPT4ge1xuICAgICAgaXRlbVxuICAgICAgICAuc2V0VGl0bGUodCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tNZW51SXRlbSkpXG4gICAgICAgIC5zZXRJY29uKFVOTE9DS19JQ09OX0lEKVxuICAgICAgICAub25DbGljayhjb252ZXJ0QXN5bmNUb1N5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGlzQ29uZmlybWVkID0gYXdhaXQgY29uZmlybSh7XG4gICAgICAgICAgICBhcHAsXG4gICAgICAgICAgICBtZXNzYWdlOiB0aGlzLnVubG9ja0NvbmZpcm1NZXNzYWdlKGFwcCwgcGF0aCksXG4gICAgICAgICAgICB0aXRsZTogdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay51bmxvY2tDb25maXJtVGl0bGUpXG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGlzQ29uZmlybWVkKSB7XG4gICAgICAgICAgICAvLyBgcGF0aGAgaXMgdGhlIHJlc29sdmVkIG93bmVyIHBhdGgsIHNvIGNhbmNlbCBpdHMgb3BlcmF0aW9ucyBhbmQgcmVsZWFzZSB0aGUgbG9jayBvdXRyaWdodC5cbiAgICAgICAgICAgIHRoaXMuYWJvcnRBbmRSZWxlYXNlRW50cmllcyhhcHAsIHBhdGgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSkpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSBjcmVhdGVJbmRpY2F0b3JzKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcsIHRvb2x0aXA6IHN0cmluZyk6IExvY2tJbmRpY2F0b3JzIHtcbiAgICAvLyBUaGUgaW5kaWNhdG9ycyBvdXRsaXZlIGEgcmVuYW1lIG9mIHRoZSBub3RlIChvciBvZiBhbiBlbmNsb3NpbmcgbG9ja2VkIGZvbGRlciksIHNvIHRoZXkgcmVzb2x2ZVxuICAgIC8vIFRoZSBvd25lciBsb2NrIGF0IENMSUNLIHRpbWUgZnJvbSB0aGUgdmlldydzIGN1cnJlbnQgZmlsZSwgZXhhY3RseSBhcyB0aGUgc3RhdHVzLWJhciBpdGVtIGRvZXMuXG4gICAgLy8gQSBjYXB0dXJlZCBvd25lciBwYXRoIHdvdWxkIGdvIHN0YWxlIHRoZSBtb21lbnQgdGhlIGxvY2sgaXMgcmUta2V5ZWQuXG4gICAgY29uc3QgZ2V0T3duZXJQYXRoID0gKCk6IHN0cmluZyB8IHVuZGVmaW5lZCA9PiB0aGlzLnJlc29sdmVWaWV3T3duZXJQYXRoKGFwcCwgdmlldyk7XG5cbiAgICBjb25zdCBhY3Rpb25JY29uRWwgPSB2aWV3LmFkZEFjdGlvbihMT0NLX0lDT05fSUQsIHRvb2x0aXAsIG5vb3ApO1xuICAgIHRoaXMucmVnaXN0ZXJVbmxvY2tNZW51KGFwcCwgYWN0aW9uSWNvbkVsLCBnZXRPd25lclBhdGgpO1xuXG4gICAgbGV0IHRhYkljb25FbDogSFRNTEVsZW1lbnQgfCBudWxsID0gbnVsbDtcbiAgICBjb25zdCB0YWJTdGF0dXNDb250YWluZXJFbCA9IHZpZXcubGVhZi50YWJIZWFkZXJTdGF0dXNDb250YWluZXJFbDtcbiAgICBpZiAodGFiU3RhdHVzQ29udGFpbmVyRWwpIHtcbiAgICAgIHRhYkljb25FbCA9IHRhYlN0YXR1c0NvbnRhaW5lckVsLmNyZWF0ZVNwYW4oeyBjbHM6IExPQ0tfSU5ESUNBVE9SX0NTU19DTEFTUyB9KTtcbiAgICAgIHNldEljb24odGFiSWNvbkVsLCBMT0NLX0lDT05fSUQpO1xuICAgICAgc2V0VG9vbHRpcCh0YWJJY29uRWwsIHRvb2x0aXApO1xuICAgICAgdGhpcy5yZWdpc3RlclVubG9ja01lbnUoYXBwLCB0YWJJY29uRWwsIGdldE93bmVyUGF0aCk7XG4gICAgfVxuXG4gICAgLy8gQSBsb2NrZWQgdmlldyBpcyByZWFkLW9ubHkgYnV0IHN0aWxsIGVkaXRhYmxlLWZvY3VzYWJsZSwgc28gYSBrZXlzdHJva2UgZmlyZXMgYGJlZm9yZWlucHV0YC5cbiAgICAvLyBPbiB0aGF0IHJlamVjdGVkIGF0dGVtcHQsIGZsYXNoIHRoZSBpbmRpY2F0b3JzIGFuZCBiZWVwIHNvIGl0J3MgY2xlYXIgdGhlIG5vdGUgaXMgbG9ja2VkLlxuICAgIC8vIFRoZSBsaXN0ZW5lciBpcyByZW1vdmVkIG9uIHVubG9jay5cbiAgICBjb25zdCBvblR5cGVBdHRlbXB0ID0gKCk6IHZvaWQgPT4ge1xuICAgICAgdGhpcy5mbGFzaEluZGljYXRvcnModmlldyk7XG4gICAgICB0aGlzLmJlZXBlci5iZWVwKCk7XG4gICAgfTtcbiAgICB2aWV3LmNvbnRlbnRFbC5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVpbnB1dCcsIG9uVHlwZUF0dGVtcHQpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGFjdGlvbkljb25FbCxcbiAgICAgIGRpc3Bvc2VUeXBlTGlzdGVuZXI6ICgpOiB2b2lkID0+IHtcbiAgICAgICAgdmlldy5jb250ZW50RWwucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmVmb3JlaW5wdXQnLCBvblR5cGVBdHRlbXB0KTtcbiAgICAgIH0sXG4gICAgICB0YWJJY29uRWxcbiAgICB9O1xuICB9XG5cbiAgcHJpdmF0ZSBlbnN1cmVCbG9ja2VySW5zdGFsbGVkKGFwcDogQXBwKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMubXV0YXRpb25CbG9ja2VyQ29tcG9uZW50ID0gbmV3IFJlc291cmNlTG9ja011dGF0aW9uQmxvY2tlckNvbXBvbmVudCh7XG4gICAgICBzaG91bGRCbG9ja011dGF0aW9uOiAocGF0aCk6IGJvb2xlYW4gPT4gdGhpcy5zaG91bGRCbG9ja011dGF0aW9uKGFwcCwgcGF0aClcbiAgICB9KTtcbiAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudC5sb2FkKCk7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZVN1YnNjcmliZWQoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBpZiAodGhpcy5ldmVudHNDb21wb25lbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQgPSBuZXcgUmVzb3VyY2VMb2NrRXZlbnRzQ29tcG9uZW50KHtcbiAgICAgIGFwcCxcbiAgICAgIG9uQ2hhbmdlOiAoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gICAgICB9LFxuICAgICAgb25FeHRlcm5hbE11dGF0aW9uOiAocGF0aCk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUV4dGVybmFsTXV0YXRpb24oYXBwLCBwYXRoKTtcbiAgICAgIH0sXG4gICAgICBvbkZpbGVNZW51OiAobWVudSwgZmlsZSk6IHZvaWQgPT4ge1xuICAgICAgICB0aGlzLmhhbmRsZUZpbGVNZW51KGFwcCwgbWVudSwgZmlsZSk7XG4gICAgICB9LFxuICAgICAgb25SZW5hbWU6IChvbGRQYXRoLCBuZXdQYXRoKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuaGFuZGxlUmVuYW1lKGFwcCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5ldmVudHNDb21wb25lbnQubG9hZCgpO1xuICB9XG5cbiAgcHJpdmF0ZSBmbGFzaEVsZW1lbnQoZWxlbWVudDogSFRNTEVsZW1lbnQpOiB2b2lkIHtcbiAgICBlbGVtZW50LnJlbW92ZUNsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gICAgLy8gUmVhZCBsYXlvdXQgdG8gZm9yY2UgYSByZWZsb3cgc28gdGhlIGZsYXNoIGFuaW1hdGlvbiByZXN0YXJ0cyBvbiBldmVyeSByZWplY3RlZCBrZXlzdHJva2UuXG4gICAgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICBlbGVtZW50LmFkZENsYXNzKExPQ0tfSU5ESUNBVE9SX0ZMQVNIX0NTU19DTEFTUyk7XG4gIH1cblxuICBwcml2YXRlIGZsYXNoSW5kaWNhdG9ycyh2aWV3OiBNYXJrZG93blZpZXcpOiB2b2lkIHtcbiAgICBjb25zdCBpbmRpY2F0b3JzID0gdGhpcy5pbmRpY2F0b3JzQnlWaWV3LmdldCh2aWV3KTtcbiAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgW2luZGljYXRvcnM/LmFjdGlvbkljb25FbCwgaW5kaWNhdG9ycz8udGFiSWNvbkVsLCB0aGlzLnN0YXR1c0Jhckl0ZW1FbF0pIHtcbiAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgIHRoaXMuZmxhc2hFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZWFjdHMgdG8gYSB2YXVsdC9tZXRhZGF0YSBldmVudCBvbiBhIHBhdGguIElmIHRoZSBwYXRoIGlzIG11dGF0aW9uLWJsb2NrZWQgYW5kIE5PVCBjb3ZlcmVkIGJ5IGFuXG4gICAqIGFjdGl2ZSBieXBhc3Mgc2NvcGUsIHRoZSBjaGFuZ2UgYnlwYXNzZWQgdGhlIGJsb2NrZXIgcGF0Y2ggKHN5bmMgLyBmaWxlc3lzdGVtIC8gYSByYXctYWRhcHRlclxuICAgKiB3cml0ZSkgXHUyMDE0IGFuIGludHJ1ZGVyLiBBYm9ydCB0aGUgYGFib3J0Q29udHJvbGxlcmAgb2YgZXZlcnkgbXV0YXRpb24tYmxvY2tpbmcgbG9jayBjb3ZlcmluZyB0aGUgcGF0aFxuICAgKiBzbyB0aGUgb3duaW5nIG9wZXJhdGlvbiBjYW5jZWxzIGFuZCByb2xscyBiYWNrLiBBIG5vLW9wIGZvciB0aGUgb3duZXIncyBvd24gKGJ5cGFzc2VkKSBtdXRhdGlvbnMsXG4gICAqIGZvciB1bmJsb2NrZWQgcGF0aHMsIGFuZCBmb3IgYmxvY2tpbmcgbG9ja3Mgd2l0aCBubyBgYWJvcnRDb250cm9sbGVyYC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBwYXRoIC0gVGhlIHBhdGggdGhlIGV2ZW50IGZpcmVkIG9uLlxuICAgKi9cbiAgcHJpdmF0ZSBoYW5kbGVFeHRlcm5hbE11dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuaXNCeXBhc3NlZChhcHAsIHBhdGgpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICBpZiAoIWVudHJ5LmJsb2Nrc011dGF0aW9ucyB8fCAhZW50cnkuYWJvcnRDb250cm9sbGVyKSB7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZG9lc0NvdmVyUGF0aCA9IGxvY2tlZFBhdGggPT09IHBhdGggfHwgKGVudHJ5Lm1vZGUgPT09ICdzdWJ0cmVlJyAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkpO1xuICAgICAgICBpZiAoZG9lc0NvdmVyUGF0aCkge1xuICAgICAgICAgIGVudHJ5LmFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVGaWxlTWVudShhcHA6IEFwcCwgbWVudTogTWVudSwgZmlsZTogVEFic3RyYWN0RmlsZSk6IHZvaWQge1xuICAgIC8vIE9mZmVyIFwiVW5sb2NrXCIgZm9yIGEgZGlyZWN0bHktbG9ja2VkIGZpbGUvZm9sZGVyLCBvciBhbnl0aGluZyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuIFRoZSBtZW51IHRhcmdldHMgdGhlIG93bmVyIGxvY2sncyBwYXRoLlxuICAgIGNvbnN0IG93bmVyUGF0aCA9IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBmaWxlLnBhdGgpO1xuICAgIGlmIChvd25lclBhdGggPT09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGhpcy5hZGRVbmxvY2tNZW51SXRlbShhcHAsIG1lbnUsIG93bmVyUGF0aCk7XG4gIH1cblxuICAvKipcbiAgICogUmUta2V5cyB0aGUgcmVnaXN0cnkgb250byBhIHJlbmFtZWQgcGF0aCwgc28gYSBsb2NrIGZvbGxvd3MgdGhlIHJlc291cmNlIGl0IHdhcyB0YWtlbiBvbi4gTW92ZXNcbiAgICogdGhlIGVudHJpZXMgb2YgdGhlIHJlbmFtZWQgcGF0aCBBTkQgb2YgZXZlcnkgZGVzY2VuZGFudCBrZXkgKGEgZm9sZGVyIHJlbmFtZSBjaGFuZ2VzIGEgd2hvbGUgcGF0aFxuICAgKiBwcmVmaXgpLCBhbmQgcmViYXNlcyBldmVyeSBhY3RpdmUge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXIuYnlwYXNzfSBzY29wZSB0aGUgc2FtZSB3YXkgXHUyMDE0IHdpdGhvdXRcbiAgICogdGhhdCBzZWNvbmQgaGFsZiBhbiBvcGVyYXRpb24gdGhhdCByZW5hbWVzIGEgZm9sZGVyIGl0IGxvY2tlZCB3b3VsZCBoYXZlIGl0cyBPV04gbGF0ZXIgbXV0YXRpb25zXG4gICAqIHJlYWQgYXMgaW50cnVkZXJzLlxuICAgKlxuICAgKiBJZGVtcG90ZW50OiBhIHBhdGggdGhhdCBubyBsb25nZXIgbWF0Y2hlcyBpcyBsZWZ0IGFsb25lLCBzbyBpdCBkb2VzIG5vdCBtYXR0ZXIgd2hldGhlciBPYnNpZGlhblxuICAgKiBlbWl0cyB0aGUgZm9sZGVyJ3MgcmVuYW1lIGV2ZW50IGJlZm9yZSBvciBhZnRlciBpdHMgZGVzY2VuZGFudHMnLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIG9sZFBhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgZnJvbS5cbiAgICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gICAqL1xuICBwcml2YXRlIGhhbmRsZVJlbmFtZShhcHA6IEFwcCwgb2xkUGF0aDogc3RyaW5nLCBuZXdQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgICAvLyBDb2xsZWN0IGZpcnN0LCBhcHBseSBhZnRlcjogd3JpdGluZyBiYWNrIHdoaWxlIGl0ZXJhdGluZyB3b3VsZCByZS12aXNpdCB0aGUganVzdC1tb3ZlZCBrZXlzLlxuICAgIGNvbnN0IG1vdmVkRW50cmllc0J5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBMb2NrRW50cnlbXT4oKTtcbiAgICBmb3IgKGNvbnN0IFtsb2NrZWRQYXRoLCBlbnRyaWVzXSBvZiB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgobG9ja2VkUGF0aCwgb2xkUGF0aCwgbmV3UGF0aCk7XG4gICAgICBpZiAocmViYXNlZFBhdGggPT09IG51bGwpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcbiAgICAgICAgZW50cnkucGF0aCA9IHJlYmFzZWRQYXRoO1xuICAgICAgfVxuICAgICAgbW92ZWRFbnRyaWVzQnlQYXRoLnNldChyZWJhc2VkUGF0aCwgZW50cmllcyk7XG4gICAgICB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmRlbGV0ZShsb2NrZWRQYXRoKTtcbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IFtyZWJhc2VkUGF0aCwgZW50cmllc10gb2YgbW92ZWRFbnRyaWVzQnlQYXRoKSB7XG4gICAgICBjb25zdCBleGlzdGluZ0VudHJpZXMgPSB0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLmdldChyZWJhc2VkUGF0aCk7XG4gICAgICBpZiAoZXhpc3RpbmdFbnRyaWVzKSB7XG4gICAgICAgIC8vIEEgc3dhcCByZW5hbWVzIG9uZSBsb2NrZWQgcGF0aCBvbnRvIGFub3RoZXIsIHNvIHRoZSB0d28gZW50cnkgbGlzdHMgTUVSR0UgXHUyMDE0IG5laXRoZXIgaG9sZGVyIGxvc2VzIGl0cyBsb2NrLlxuICAgICAgICBleGlzdGluZ0VudHJpZXMucHVzaCguLi5lbnRyaWVzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguc2V0KHJlYmFzZWRQYXRoLCBlbnRyaWVzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgLy8gU2FtZSBjb2xsZWN0LXRoZW4tYXBwbHkgc2hhcGU6IHRoZSBzZXQgbWF5IG5vdCBiZSBtdXRhdGVkIHdoaWxlIGl0IGlzIGJlaW5nIGl0ZXJhdGVkLlxuICAgICAgY29uc3QgcmViYXNlZEJ5cGFzc2VkUGF0aHMgPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBjb25zdCByZWJhc2VkUGF0aCA9IHJlYmFzZVBhdGgoYnlwYXNzZWRQYXRoLCBvbGRQYXRoLCBuZXdQYXRoKTtcbiAgICAgICAgaWYgKHJlYmFzZWRQYXRoICE9PSBudWxsKSB7XG4gICAgICAgICAgcmViYXNlZEJ5cGFzc2VkUGF0aHMuc2V0KGJ5cGFzc2VkUGF0aCwgcmViYXNlZFBhdGgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtieXBhc3NlZFBhdGgsIHJlYmFzZWRQYXRoXSBvZiByZWJhc2VkQnlwYXNzZWRQYXRocykge1xuICAgICAgICBieXBhc3NlZFBhdGhzLmRlbGV0ZShieXBhc3NlZFBhdGgpO1xuICAgICAgICBieXBhc3NlZFBhdGhzLmFkZChyZWJhc2VkUGF0aCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVjb25jaWxlIHVuY29uZGl0aW9uYWxseTogYSByZW5hbWUgY2hhbmdlcyBjb3ZlcmFnZSBldmVuIHdoZW4gbm8ga2V5IG1vdmVkIFx1MjAxNCBhIG5vdGUgcmVuYW1lZCBJTlRPXG4gICAgLy8gQSBgc3VidHJlZWAtbG9ja2VkIGZvbGRlciBiZWNvbWVzIGNvdmVyZWQsIG9uZSByZW5hbWVkIE9VVCBvZiBpdCBzdG9wcyBiZWluZyBjb3ZlcmVkLlxuICAgIHRoaXMucmVjb25jaWxlKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIGhhc0Jsb2NraW5nTG9jaygpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGVudHJpZXMgb2YgdGhpcy5sb2NrRW50cmllc0J5UGF0aC52YWx1ZXMoKSkge1xuICAgICAgaWYgKGVudHJpZXMuc29tZSgoZW50cnkpID0+IGVudHJ5LmJsb2Nrc011dGF0aW9ucykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciB0aGUgcGF0aCBpcyBjb3ZlcmVkIGJ5IGFuIGFjdGl2ZSB7QGxpbmsgUmVzb3VyY2VMb2NrTWFuYWdlci5ieXBhc3N9IHNjb3BlIFx1MjAxNCB0aGVcbiAgICogb3duZXIgZGVjbGFyaW5nIHRoYXQgaXRzIG93biBtdXRhdGlvbnMgb2YgdGhlIHBhdGggKGFuZCwgZm9yIGEgZm9sZGVyLCBpdHMgc3VidHJlZSkgYXJlIHNhbmN0aW9uZWQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBzb21lIGFjdGl2ZSBieXBhc3Mgc2NvcGUgY292ZXJzIHRoZSBwYXRoLlxuICAgKi9cbiAgcHJpdmF0ZSBpc0J5cGFzc2VkKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBmb3IgKGNvbnN0IGJ5cGFzc2VkUGF0aHMgb2YgdGhpcy5ieXBhc3NQYXRoU2V0cykge1xuICAgICAgZm9yIChjb25zdCBieXBhc3NlZFBhdGggb2YgYnlwYXNzZWRQYXRocykge1xuICAgICAgICBpZiAoaXNDaGlsZE9yU2VsZih7IGFwcCwgY2hpbGRQYXRoT3JGaWxlOiBwYXRoLCBwYXJlbnRQYXRoT3JGaWxlOiBieXBhc3NlZFBhdGggfSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBwcml2YXRlIGlzUGF0aExvY2tlZChwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gKHRoaXMubG9ja0VudHJpZXNCeVBhdGguZ2V0KHBhdGgpPy5sZW5ndGggPz8gMCkgPiAwO1xuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyB0aGUgZGVkdXBsaWNhdGVkIGxpc3Qgb2YgYChwbHVnaW4gbmFtZSwgb3BlcmF0aW9uIG5hbWUpYCBwYWlycyBkZXNjcmliaW5nIHRoZSBsb2NrcyBvbiBhXG4gICAqIHBhdGggXHUyMDE0IG9uZSBwZXIgZGlzdGluY3QgcGx1Z2luK29wZXJhdGlvbi4gRHJpdmVzIHRoZSB1bmxvY2sgY29uZmlybWF0aW9uLCBzbyB0aGUgdXNlciBzZWVzIGV4YWN0bHlcbiAgICogd2hpY2ggb3BlcmF0aW9ucyBhbiB1bmxvY2sgd291bGQgY2FuY2VsLiBPbmx5IGV2ZXIgY2FsbGVkIGZvciBhIGxvY2tlZCBwYXRoLCBzbyBpdHMgZW50cmllcyBhcmVcbiAgICogYWx3YXlzIHByZXNlbnQuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBkaXJlY3RseS1sb2NrZWQgcGF0aCB3aG9zZSBsb2NrIGRlc2NyaXB0b3JzIHRvIGJ1aWxkLlxuICAgKiBAcmV0dXJucyBUaGUgZGlzdGluY3QgbG9jayBkZXNjcmlwdG9ycyBjb3ZlcmluZyB0aGUgcGF0aC5cbiAgICovXG4gIHByaXZhdGUgbG9ja0Rlc2NyaXB0b3JzKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBMb2NrRGVzY3JpcHRvcltdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgYXNzZXJ0Tm9uTnVsbGFibGUoZW50cmllcyk7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGNvbnN0IGRlc2NyaXB0b3JzOiBMb2NrRGVzY3JpcHRvcltdID0gW107XG4gICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7XG4gICAgICBjb25zdCBwbHVnaW5OYW1lID0gYXBwLnBsdWdpbnMubWFuaWZlc3RzW2VudHJ5LnBsdWdpbklkXT8ubmFtZSA/PyBlbnRyeS5wbHVnaW5JZDtcbiAgICAgIGNvbnN0IGtleSA9IGAke3BsdWdpbk5hbWV9XFxuJHtlbnRyeS5vcGVyYXRpb25OYW1lfWA7XG4gICAgICBpZiAoc2Vlbi5oYXMoa2V5KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHNlZW4uYWRkKGtleSk7XG4gICAgICBkZXNjcmlwdG9ycy5wdXNoKHsgb3BlcmF0aW9uTmFtZTogZW50cnkub3BlcmF0aW9uTmFtZSwgcGx1Z2luTmFtZSB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGRlc2NyaXB0b3JzO1xuICB9XG5cbiAgcHJpdmF0ZSBsb2NraW5nUGx1Z2luTmFtZXMoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQocGF0aCk7XG4gICAgLy8gYGxvY2tpbmdQbHVnaW5OYW1lc2AgaXMgb25seSBldmVyIGNhbGxlZCBmb3IgYSBsb2NrZWQgcGF0aCwgc28gaXRzIGVudHJpZXMgYXJlIGFsd2F5cyBwcmVzZW50LlxuICAgIGFzc2VydE5vbk51bGxhYmxlKGVudHJpZXMpO1xuICAgIGNvbnN0IHBsdWdpbklkcyA9IFsuLi5uZXcgU2V0KGVudHJpZXMubWFwKChlbnRyeSkgPT4gZW50cnkucGx1Z2luSWQpKV07XG4gICAgcmV0dXJuIHBsdWdpbklkcy5tYXAoKHBsdWdpbklkKSA9PiBhcHAucGx1Z2lucy5tYW5pZmVzdHNbcGx1Z2luSWRdPy5uYW1lID8/IHBsdWdpbklkKTtcbiAgfVxuXG4gIHByaXZhdGUgbG9ja1Rvb2x0aXAoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgY29uc3QgaGVhZGVyID0gdCgoJCkgPT4gJC5vYnNpZGlhbkRldlV0aWxzLnJlc291cmNlTG9jay5sb2NrZWRCeVRvb2x0aXApO1xuICAgIC8vIEEgcnVudGltZS1sZW5ndGggbGlzdCBvZiBwbHVnaW4gbmFtZXMsIG9uZSBwZXIgbGluZSB1bmRlciB0aGUgaGVhZGVyLlxuICAgIHJldHVybiBbaGVhZGVyLCAuLi50aGlzLmxvY2tpbmdQbHVnaW5OYW1lcyhhcHAsIHBhdGgpXS5qb2luKCdcXG4nKTtcbiAgfVxuXG4gIHByaXZhdGUgcmVjb25jaWxlKGFwcDogQXBwKTogdm9pZCB7XG4gICAgY29uc3Qgdmlld3NUb0xvY2sgPSBuZXcgU2V0PE1hcmtkb3duVmlldz4oKTtcbiAgICBmb3IgKGNvbnN0IGxlYWYgb2YgYXBwLndvcmtzcGFjZS5nZXRMZWF2ZXNPZlR5cGUoVmlld1R5cGUuTWFya2Rvd24pKSB7XG4gICAgICBjb25zdCB2aWV3ID0gbGVhZi52aWV3O1xuICAgICAgaWYgKCEodmlldyBpbnN0YW5jZW9mIE1hcmtkb3duVmlldykpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgICBpZiAocGF0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZXNvbHZlIHRoZSBsb2NrIGNvdmVyaW5nIHRoaXMgdmlldzogdGhlIGV4YWN0IHBhdGggd2hlbiBkaXJlY3RseSBsb2NrZWQsIG90aGVyd2lzZSB0aGUgZW5jbG9zaW5nIGBzdWJ0cmVlYC1sb2NrZWQgZm9sZGVyLiBJbmRpY2F0b3JzL3Rvb2x0aXAvdW5sb2NrIG1lbnUga2V5IG9mZiB0aGF0IG93bmVyIHBhdGguXG4gICAgICBjb25zdCBvd25lclBhdGggPSB0aGlzLnJlc29sdmVMb2NrT3duZXJQYXRoKGFwcCwgcGF0aCk7XG4gICAgICBpZiAob3duZXJQYXRoICE9PSBudWxsKSB7XG4gICAgICAgIHZpZXdzVG9Mb2NrLmFkZCh2aWV3KTtcbiAgICAgICAgY29uc3QgdG9vbHRpcCA9IHRoaXMubG9ja1Rvb2x0aXAoYXBwLCBvd25lclBhdGgpO1xuICAgICAgICAvLyBSZS1hcHBseSB0aGUgcmVhZC1vbmx5IHRvZ2dsZSBvbiBldmVyeSByZWNvbmNpbGUsIG5vdCBvbmx5IHRoZSBmaXJzdCB0aW1lIGEgdmlldyBpcyB0cmFja2VkLlxuICAgICAgICAvLyBUaGUgdG9nZ2xlIGlzIGlkZW1wb3RlbnQsIHNvIHJlLWFwcGx5aW5nIHRvIGFuIGFscmVhZHktbG9ja2VkIHZpZXcgaXMgY2hlYXAuXG4gICAgICAgIC8vIEEgdmlldyBvcGVuZWQgYWZ0ZXIgdGhlIGxvY2sgaXMgcmVjb25jaWxlZCBzeW5jaHJvbm91c2x5LCBiZWZvcmUgaXRzIENvZGVNaXJyb3IgaXMgcmVhZHkuXG4gICAgICAgIC8vIEl0cyBmaXJzdCB0b2dnbGUgaXMgdGhlcmVmb3JlIGEgbm8tb3A7IHJlLWFwcGx5aW5nIG1ha2VzIHRoZSBsb2NrIHRha2UgaG9sZCBvbmNlIGl0IHNldHRsZXMuXG4gICAgICAgIHRvZ2dsZUVkaXRvclJlYWRPbmx5KHZpZXcuZWRpdG9yLCB0cnVlKTtcbiAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMuaW5kaWNhdG9yc0J5Vmlldy5nZXQodmlldyk7XG4gICAgICAgIGlmIChpbmRpY2F0b3JzKSB7XG4gICAgICAgICAgdGhpcy51cGRhdGVJbmRpY2F0b3JUb29sdGlwcyhpbmRpY2F0b3JzLCB0b29sdGlwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuc2V0KHZpZXcsIHRoaXMuY3JlYXRlSW5kaWNhdG9ycyhhcHAsIHZpZXcsIHRvb2x0aXApKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGZvciAoY29uc3QgW3ZpZXcsIGluZGljYXRvcnNdIG9mIHRoaXMuaW5kaWNhdG9yc0J5Vmlldykge1xuICAgICAgaWYgKHZpZXdzVG9Mb2NrLmhhcyh2aWV3KSkge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cblxuICAgICAgdG9nZ2xlRWRpdG9yUmVhZE9ubHkodmlldy5lZGl0b3IsIGZhbHNlKTtcbiAgICAgIGluZGljYXRvcnMuZGlzcG9zZVR5cGVMaXN0ZW5lcigpO1xuICAgICAgaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwucmVtb3ZlKCk7XG4gICAgICBpbmRpY2F0b3JzLnRhYkljb25FbD8ucmVtb3ZlKCk7XG4gICAgICB0aGlzLmluZGljYXRvcnNCeVZpZXcuZGVsZXRlKHZpZXcpO1xuICAgIH1cblxuICAgIHRoaXMudXBkYXRlU3RhdHVzQmFyKGFwcCk7XG4gIH1cblxuICBwcml2YXRlIHJlY29uY2lsZUFuZENsZWFudXAoYXBwOiBBcHApOiB2b2lkIHtcbiAgICB0aGlzLnJlY29uY2lsZShhcHApO1xuICAgIGlmICh0aGlzLmxvY2tFbnRyaWVzQnlQYXRoLnNpemUgPT09IDApIHtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50Py51bmxvYWQoKTtcbiAgICAgIHRoaXMuZXZlbnRzQ29tcG9uZW50ID0gbnVsbDtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmhhc0Jsb2NraW5nTG9jaygpKSB7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudD8udW5sb2FkKCk7XG4gICAgICB0aGlzLm11dGF0aW9uQmxvY2tlckNvbXBvbmVudCA9IG51bGw7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZWdpc3RlclVubG9ja01lbnUoYXBwOiBBcHAsIGVsZW1lbnQ6IEhUTUxFbGVtZW50LCBnZXRDb250ZXh0UGF0aDogKCkgPT4gc3RyaW5nIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgLy8gQSBjbGljayBvZiBBTlkgbW91c2UgYnV0dG9uIG9uIGEgbG9jayBpbmRpY2F0b3Igb3BlbnMgdGhlIHNhbWUgdW5sb2NrIGNvbnRleHQgbWVudTpcbiAgICAvLyBgY2xpY2tgIGZpcmVzIG9ubHkgZm9yIHRoZSBwcmltYXJ5IChsZWZ0KSBidXR0b24sIGBjb250ZXh0bWVudWAgZm9yIHRoZSByaWdodCBidXR0b24sIGFuZFxuICAgIC8vIGBhdXhjbGlja2AgZm9yIHRoZSBtaWRkbGUgYnV0dG9uICh0aGUgYnJvd3NlciBmaXJlcyBubyBgY2xpY2tgIGZvciBpdCkuIGBhdXhjbGlja2AgYWxzbyBmaXJlcyBmb3JcbiAgICAvLyBUaGUgcmlnaHQgYnV0dG9uLCBzbyBpdCBpcyBndWFyZGVkIHRvIHRoZSBtaWRkbGUgYnV0dG9uIHRvIGF2b2lkIGRvdWJsZS1vcGVuaW5nIGFsb25nc2lkZSBgY29udGV4dG1lbnVgLlxuICAgIC8vIEEgcGxhaW4gbGlzdGVuZXIgZGllcyB3aXRoIHRoZSBlbGVtZW50IHdoZW4gaXQgaXMgYC5yZW1vdmUoKWBkIG9uIHVubG9jaywgc28gaXQgbmV2ZXIgbGVha3MuXG4gICAgY29uc3Qgb3BlblVubG9ja01lbnUgPSAoJGV2ZW50OiBNb3VzZUV2ZW50KTogdm9pZCA9PiB7XG4gICAgICAkZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb250ZXh0UGF0aCgpO1xuICAgICAgaWYgKHBhdGggPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBtZW51ID0gbmV3IE1lbnUoKTtcbiAgICAgIHRoaXMuYWRkVW5sb2NrTWVudUl0ZW0oYXBwLCBtZW51LCBwYXRoKTtcbiAgICAgIG1lbnUuc2hvd0F0TW91c2VFdmVudCgkZXZlbnQpO1xuICAgIH07XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG9wZW5VbmxvY2tNZW51KTtcbiAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51Jywgb3BlblVubG9ja01lbnUpO1xuICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYXV4Y2xpY2snLCAoJGV2ZW50KSA9PiB7XG4gICAgICBpZiAoJGV2ZW50LmJ1dHRvbiA9PT0gTUlERExFX01PVVNFX0JVVFRPTikge1xuICAgICAgICBvcGVuVW5sb2NrTWVudSgkZXZlbnQpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSByZW1vdmVFbnRyeShhcHA6IEFwcCwgZW50cnk6IExvY2tFbnRyeSk6IHZvaWQge1xuICAgIC8vIFJlYWQgdGhlIGVudHJ5J3MgQ1VSUkVOVCBwYXRoLCBub3Qgb25lIGNhcHR1cmVkIHdoZW4gdGhlIGxvY2sgd2FzIHRha2VuOiBhIHJlbmFtZSBtYXkgaGF2ZVxuICAgIC8vIFJlLWtleWVkIGl0IHNpbmNlLCBhbmQgbG9va2luZyBpdCB1cCB1bmRlciB0aGUgb2xkIHBhdGggd291bGQgc2lsZW50bHkgbGVhayB0aGUgbG9jay5cbiAgICBjb25zdCBlbnRyaWVzID0gdGhpcy5sb2NrRW50cmllc0J5UGF0aC5nZXQoZW50cnkucGF0aCk7XG4gICAgaWYgKCFlbnRyaWVzKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluZGV4ID0gZW50cmllcy5pbmRleE9mKGVudHJ5KTtcbiAgICBpZiAoaW5kZXggPT09IC0xKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGVudHJpZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICBpZiAoZW50cmllcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHRoaXMubG9ja0VudHJpZXNCeVBhdGguZGVsZXRlKGVudHJ5LnBhdGgpO1xuICAgIH1cbiAgICB0aGlzLnJlY29uY2lsZUFuZENsZWFudXAoYXBwKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXNvbHZlcyB3aGljaCBsb2NrZWQgcGF0aCAoaWYgYW55KSBjb3ZlcnMgdGhlIGdpdmVuIHBhdGg6IHRoZSBwYXRoIGl0c2VsZiB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBsb25nZXN0IGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyIHRoYXQgY29udGFpbnMgaXQgKGxvbmdlc3Qgc28gYSBuZXN0ZWRcbiAgICogc3VidHJlZSBsb2NrIHdpbnMgZGV0ZXJtaW5pc3RpY2FsbHkgb3ZlciBhbiBvdXRlciBvbmUpLlxuICAgKlxuICAgKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAgICogQHBhcmFtIHBhdGggLSBUaGUgcGF0aCB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGBudWxsYCB3aGVuIG5vdGhpbmcgY292ZXJzIGl0LlxuICAgKi9cbiAgcHJpdmF0ZSByZXNvbHZlTG9ja093bmVyUGF0aChhcHA6IEFwcCwgcGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gICAgaWYgKHRoaXMuaXNQYXRoTG9ja2VkKHBhdGgpKSB7XG4gICAgICByZXR1cm4gcGF0aDtcbiAgICB9XG4gICAgbGV0IGJlc3RPd25lclBhdGg6IG51bGwgfCBzdHJpbmcgPSBudWxsO1xuICAgIGZvciAoY29uc3QgW2xvY2tlZFBhdGgsIGVudHJpZXNdIG9mIHRoaXMubG9ja0VudHJpZXNCeVBhdGgpIHtcbiAgICAgIGNvbnN0IGhhc1N1YnRyZWVMb2NrID0gZW50cmllcy5zb21lKChlbnRyeSkgPT4gZW50cnkubW9kZSA9PT0gJ3N1YnRyZWUnKTtcbiAgICAgIGlmIChoYXNTdWJ0cmVlTG9jayAmJiBpc0NoaWxkKHsgYXBwLCBjaGlsZFBhdGhPckZpbGU6IHBhdGgsIHBhcmVudFBhdGhPckZpbGU6IGxvY2tlZFBhdGggfSkgJiYgKGJlc3RPd25lclBhdGggPT09IG51bGwgfHwgbG9ja2VkUGF0aC5sZW5ndGggPiBiZXN0T3duZXJQYXRoLmxlbmd0aCkpIHtcbiAgICAgICAgYmVzdE93bmVyUGF0aCA9IGxvY2tlZFBhdGg7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBiZXN0T3duZXJQYXRoO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlc29sdmVzIHRoZSBsb2NrIGNvdmVyaW5nIHRoZSBub3RlIGEgdmlldyBjdXJyZW50bHkgc2hvd3MgXHUyMDE0IGl0cyBvd24gcGF0aCB3aGVuIGRpcmVjdGx5IGxvY2tlZCxcbiAgICogb3RoZXJ3aXNlIHRoZSBlbmNsb3NpbmcgYHN1YnRyZWVgLWxvY2tlZCBmb2xkZXIuIFJlYWQgYXQgY2xpY2sgdGltZSBieSB0aGUgdmlldydzIGxvY2sgaW5kaWNhdG9ycyxcbiAgICogc28gaXQgcmVmbGVjdHMgcmVuYW1lcyBvZiB0aGUgbm90ZSBhbmQgb2YgdGhlIGxvY2tlZCBmb2xkZXIgYWxpa2UuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gdmlldyAtIFRoZSB2aWV3IHdob3NlIGN1cnJlbnQgZmlsZSB0byByZXNvbHZlIGFuIG93bmVyIGxvY2sgZm9yLlxuICAgKiBAcmV0dXJucyBUaGUgY292ZXJpbmcgbG9ja2VkIHBhdGgsIG9yIGB1bmRlZmluZWRgIHdoZW4gdGhlIHZpZXcgaGFzIG5vIGZpbGUgb3Igbm90aGluZyBjb3ZlcnMgaXQuXG4gICAqL1xuICBwcml2YXRlIHJlc29sdmVWaWV3T3duZXJQYXRoKGFwcDogQXBwLCB2aWV3OiBNYXJrZG93blZpZXcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IHBhdGggPSB2aWV3LmZpbGU/LnBhdGg7XG4gICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gIH1cblxuICAvKipcbiAgICogRGVjaWRlcyB3aGV0aGVyIGEgbXV0YXRpb24gb2YgdGhlIHBhdGggbXVzdCBiZSBibG9ja2VkOiBgdHJ1ZWAgd2hlbiB0aGUgcGF0aCBpcyBtdXRhdGlvbi1ibG9ja2VkXG4gICAqIGFuZCBub3QgY292ZXJlZCBieSBhbnkgYWN0aXZlIHtAbGluayBSZXNvdXJjZUxvY2tNYW5hZ2VyLmJ5cGFzc30gc2NvcGUuXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSBwYXRoIGJlaW5nIG11dGF0ZWQuXG4gICAqIEByZXR1cm5zIGB0cnVlYCB0byByZWplY3QgdGhlIG11dGF0aW9uLCBgZmFsc2VgIHRvIGFsbG93IGl0LlxuICAgKi9cbiAgcHJpdmF0ZSBzaG91bGRCbG9ja011dGF0aW9uKGFwcDogQXBwLCBwYXRoOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICBpZiAoIXRoaXMuaXNNdXRhdGlvbkJsb2NrZWRCeUFuY2VzdG9yKGFwcCwgcGF0aCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuICF0aGlzLmlzQnlwYXNzZWQoYXBwLCBwYXRoKTtcbiAgfVxuXG4gIHByaXZhdGUgdW5sb2NrQ29uZmlybU1lc3NhZ2UoYXBwOiBBcHAsIHBhdGg6IHN0cmluZyk6IERvY3VtZW50RnJhZ21lbnQge1xuICAgIGNvbnN0IGZyYWdtZW50ID0gY3JlYXRlRnJhZ21lbnQoKTtcbiAgICBmcmFnbWVudC5hcHBlbmRUZXh0KHQoKCQpID0+ICQub2JzaWRpYW5EZXZVdGlscy5yZXNvdXJjZUxvY2sudW5sb2NrQ29uZmlybU1lc3NhZ2UpKTtcbiAgICAvLyBBIHJ1bnRpbWUtbGVuZ3RoIGxpc3Qgb2YgdGhlIGxvY2tzIGN1cnJlbnRseSBoZWxkOiBlYWNoIHBsdWdpbiBuYW1lIGFzIGEgY29kZSBibG9jayBmb2xsb3dlZCBieVxuICAgIC8vIFRoZSBvcGVyYXRpb24gaXQgaXMgcnVubmluZywgb25lIHBlciBsaW5lLlxuICAgIGZvciAoY29uc3QgZGVzY3JpcHRvciBvZiB0aGlzLmxvY2tEZXNjcmlwdG9ycyhhcHAsIHBhdGgpKSB7XG4gICAgICBmcmFnbWVudC5jcmVhdGVFbCgnYnInKTtcbiAgICAgIGFwcGVuZENvZGVCbG9jayhmcmFnbWVudCwgZGVzY3JpcHRvci5wbHVnaW5OYW1lKTtcbiAgICAgIGZyYWdtZW50LmFwcGVuZFRleHQoYDogJHtkZXNjcmlwdG9yLm9wZXJhdGlvbk5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmcmFnbWVudDtcbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlSW5kaWNhdG9yVG9vbHRpcHMoaW5kaWNhdG9yczogTG9ja0luZGljYXRvcnMsIHRvb2x0aXA6IHN0cmluZyk6IHZvaWQge1xuICAgIHNldFRvb2x0aXAoaW5kaWNhdG9ycy5hY3Rpb25JY29uRWwsIHRvb2x0aXApO1xuICAgIGlmIChpbmRpY2F0b3JzLnRhYkljb25FbCkge1xuICAgICAgc2V0VG9vbHRpcChpbmRpY2F0b3JzLnRhYkljb25FbCwgdG9vbHRpcCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVTdGF0dXNCYXIoYXBwOiBBcHApOiB2b2lkIHtcbiAgICBjb25zdCBhY3RpdmVWaWV3ID0gYXBwLndvcmtzcGFjZS5nZXRBY3RpdmVWaWV3T2ZUeXBlKE1hcmtkb3duVmlldyk7XG4gICAgY29uc3QgYWN0aXZlUGF0aCA9IGFjdGl2ZVZpZXc/LmZpbGU/LnBhdGg7XG4gICAgY29uc3QgYWN0aXZlT3duZXJQYXRoID0gYWN0aXZlUGF0aCA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBhY3RpdmVQYXRoKTtcblxuICAgIGlmIChhY3RpdmVPd25lclBhdGggPT09IG51bGwgfHwgIWFjdGl2ZVZpZXcpIHtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsPy5yZW1vdmUoKTtcbiAgICAgIHRoaXMuc3RhdHVzQmFySXRlbUVsID0gbnVsbDtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoIXRoaXMuc3RhdHVzQmFySXRlbUVsKSB7XG4gICAgICBjb25zdCBzdGF0dXNCYXJFbCA9IGFjdGl2ZVZpZXcuY29udGFpbmVyRWwub3duZXJEb2N1bWVudC5ib2R5LnF1ZXJ5U2VsZWN0b3I8SFRNTEVsZW1lbnQ+KFNUQVRVU19CQVJfQ1NTX1NFTEVDVE9SKTtcbiAgICAgIGlmICghc3RhdHVzQmFyRWwpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5zdGF0dXNCYXJJdGVtRWwgPSBzdGF0dXNCYXJFbC5jcmVhdGVEaXYoeyBjbHM6IFtTVEFUVVNfQkFSX0lURU1fQ1NTX0NMQVNTLCBMT0NLX0lORElDQVRPUl9DU1NfQ0xBU1NdIH0pO1xuICAgICAgc2V0SWNvbih0aGlzLnN0YXR1c0Jhckl0ZW1FbCwgTE9DS19JQ09OX0lEKTtcbiAgICAgIC8vIFRoZSBzaW5nbGUgc3RhdHVzLWJhciBpdGVtIGlzIHJldXNlZCBhY3Jvc3MgYWN0aXZlLW5vdGUgc3dpdGNoZXMuXG4gICAgICAvLyBJdCBtdXN0IHJlc29sdmUgdGhlIGN1cnJlbnRseSBhY3RpdmUgbm90ZSdzIG93bmVyIGxvY2sgYXQgY2xpY2sgdGltZSByYXRoZXIgdGhhbiBjYXB0dXJpbmcgb25lIHBhdGguXG4gICAgICB0aGlzLnJlZ2lzdGVyVW5sb2NrTWVudShhcHAsIHRoaXMuc3RhdHVzQmFySXRlbUVsLCAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHBhdGggPSBhcHAud29ya3NwYWNlLmdldEFjdGl2ZVZpZXdPZlR5cGUoTWFya2Rvd25WaWV3KT8uZmlsZT8ucGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMucmVzb2x2ZUxvY2tPd25lclBhdGgoYXBwLCBwYXRoKSA/PyB1bmRlZmluZWQ7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzZXRUb29sdGlwKHRoaXMuc3RhdHVzQmFySXRlbUVsLCB0aGlzLmxvY2tUb29sdGlwKGFwcCwgYWN0aXZlT3duZXJQYXRoKSk7XG4gIH1cblxuICAvKipcbiAgICogV2lyZXMgYW4gb3B0LWluIGBhYm9ydGAgbGlzdGVuZXIgZm9yIGEgbG9jayBlbnRyeTogd2hlbiB0aGUgZW50cnkncyBjb250cm9sbGVyIGFib3J0cywgcmVsZWFzZXNcbiAgICogdGhlIGVudHJ5IChpZiB7QGxpbmsgTG9ja0VudHJ5LnNob3VsZFJlbGVhc2VPbkFib3J0fSkgYW5kL29yIGludm9rZXNcbiAgICoge0BsaW5rIExvY2tFbnRyeS5vblVubG9ja1JlcXVlc3RlZH0uIEEgbm8tb3Agd2hlbiB0aGUgZW50cnkgaGFzIG5vIGNvbnRyb2xsZXIgb3IgbmVpdGhlciBvcHQtaW4gaXNcbiAgICogc2V0LCBzbyB0cmFuc2FjdGlvbmFsIGxvY2tzIGtlZXAgcmVsZWFzaW5nIHZpYSB0aGVpciBvd24gY2xlYW51cC5cbiAgICpcbiAgICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gICAqIEBwYXJhbSBlbnRyeSAtIFRoZSBsb2NrIGVudHJ5IHdob3NlIGNvbnRyb2xsZXIgdG8gb2JzZXJ2ZS5cbiAgICovXG4gIHByaXZhdGUgd2lyZVJlbGVhc2VPbkFib3J0KGFwcDogQXBwLCBlbnRyeTogTG9ja0VudHJ5KTogdm9pZCB7XG4gICAgY29uc3QgeyBvblVubG9ja1JlcXVlc3RlZCwgc2hvdWxkUmVsZWFzZU9uQWJvcnQgfSA9IGVudHJ5O1xuICAgIGlmICghZW50cnkuYWJvcnRDb250cm9sbGVyIHx8ICghc2hvdWxkUmVsZWFzZU9uQWJvcnQgJiYgIW9uVW5sb2NrUmVxdWVzdGVkKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBlbnRyeS5hYm9ydENvbnRyb2xsZXIuc2lnbmFsLmFkZEV2ZW50TGlzdGVuZXIoJ2Fib3J0JywgKCkgPT4ge1xuICAgICAgaWYgKHNob3VsZFJlbGVhc2VPbkFib3J0KSB7XG4gICAgICAgIHRoaXMucmVtb3ZlRW50cnkoYXBwLCBlbnRyeSk7XG4gICAgICB9XG4gICAgICBvblVubG9ja1JlcXVlc3RlZD8uKCk7XG4gICAgfSwgeyBvbmNlOiB0cnVlIH0pO1xuICB9XG59XG5cbi8qKlxuICogTW9ua2V5LXBhdGNoZXMgdGhlIHZhdWx0LW11dGF0aW9uIGNob2tlIHBvaW50cyBvbiBgVmF1bHRgL2BGaWxlTWFuYWdlcmAgc28gdGhhdCBhbnkgZWRpdCwgZGVsZXRlLFxuICogcmVuYW1lLCBtb3ZlLCBvciAocmUpY3JlYXRlIG9mIGEgbXV0YXRpb24tYmxvY2tlZCBwYXRoIHRocm93cyBhIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAqIEluc3RhbGxlZCBsYXppbHkgYnkge0BsaW5rIFJlc291cmNlTG9ja01hbmFnZXJ9IG9uIHRoZSBmaXJzdCBgc2hvdWxkQmxvY2tNdXRhdGlvbnNgIGxvY2sgYW5kIHJlbW92ZWRcbiAqIHdoZW4gdGhlIGxhc3Qgb25lIGlzIHJlbGVhc2VkOyBiZWluZyBhIHtAbGluayBNb25rZXlBcm91bmRDb21wb25lbnR9LCBldmVyeSBwYXRjaCBpcyB0b3JuIGRvd24gb25cbiAqIGB1bmxvYWRgLiBSZW5hbWUvY29weSBjaGVjayBib3RoIHNvdXJjZSBhbmQgZGVzdGluYXRpb247IHRoZSBvdGhlciBtZXRob2RzIGNoZWNrIHRoZWlyIHNpbmdsZSBwYXRoLlxuICovXG5jbGFzcyBSZXNvdXJjZUxvY2tNdXRhdGlvbkJsb2NrZXJDb21wb25lbnQgZXh0ZW5kcyBNb25rZXlBcm91bmRDb21wb25lbnQge1xuICBwcml2YXRlIHJlYWRvbmx5IHNob3VsZEJsb2NrTXV0YXRpb246IChwYXRoOiBzdHJpbmcpID0+IGJvb2xlYW47XG5cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogUmVzb3VyY2VMb2NrTXV0YXRpb25CbG9ja2VyQ29tcG9uZW50Q29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMuc2hvdWxkQmxvY2tNdXRhdGlvbiA9IHBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uO1xuICB9XG5cbiAgcHVibGljIG92ZXJyaWRlIG9ubG9hZCgpOiB2b2lkIHtcbiAgICBzdXBlci5vbmxvYWQoKTtcblxuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2FwcGVuZCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdhcHBlbmQnLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtmaWxlXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbZmlsZS5wYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NvcHknPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY29weScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogWywgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW25ld1BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnY3JlYXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2NyZWF0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW3BhdGhdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtwYXRoXSk7XG4gICAgICAgIHJldHVybiBmYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0pO1xuICAgIHRoaXMucmVnaXN0ZXJNZXRob2RQYXRjaDxWYXVsdCwgJ2NyZWF0ZUJpbmFyeSc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdjcmVhdGVCaW5hcnknLFxuICAgICAgcGF0Y2hIYW5kbGVyOiAoeyBmYWxsYmFjaywgb3JpZ2luYWxBcmd1bWVudHM6IFtwYXRoXSB9KSA9PiB7XG4gICAgICAgIHRoaXMuYXNzZXJ0Tm90QmxvY2tlZChbcGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdjcmVhdGVGb2xkZXInPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAnY3JlYXRlRm9sZGVyJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbcGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW3BhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnZGVsZXRlJz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ2RlbGV0ZScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAnbW9kaWZ5QmluYXJ5Jz4oe1xuICAgICAgJG9iamVjdDogVmF1bHQucHJvdG90eXBlLFxuICAgICAgbWV0aG9kTmFtZTogJ21vZGlmeUJpbmFyeScsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPFZhdWx0LCAncHJvY2Vzcyc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdwcm9jZXNzJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICdyZW5hbWUnPih7XG4gICAgICAkb2JqZWN0OiBWYXVsdC5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAncmVuYW1lJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8VmF1bHQsICd0cmFzaCc+KHtcbiAgICAgICRvYmplY3Q6IFZhdWx0LnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICd0cmFzaCcsXG4gICAgICBwYXRjaEhhbmRsZXI6ICh7IGZhbGxiYWNrLCBvcmlnaW5hbEFyZ3VtZW50czogW2ZpbGVdIH0pID0+IHtcbiAgICAgICAgdGhpcy5hc3NlcnROb3RCbG9ja2VkKFtmaWxlLnBhdGhdKTtcbiAgICAgICAgcmV0dXJuIGZhbGxiYWNrKCk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgdGhpcy5yZWdpc3Rlck1ldGhvZFBhdGNoPEZpbGVNYW5hZ2VyLCAncmVuYW1lRmlsZSc+KHtcbiAgICAgICRvYmplY3Q6IEZpbGVNYW5hZ2VyLnByb3RvdHlwZSxcbiAgICAgIG1ldGhvZE5hbWU6ICdyZW5hbWVGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZSwgbmV3UGF0aF0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aCwgbmV3UGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICB0aGlzLnJlZ2lzdGVyTWV0aG9kUGF0Y2g8RmlsZU1hbmFnZXIsICd0cmFzaEZpbGUnPih7XG4gICAgICAkb2JqZWN0OiBGaWxlTWFuYWdlci5wcm90b3R5cGUsXG4gICAgICBtZXRob2ROYW1lOiAndHJhc2hGaWxlJyxcbiAgICAgIHBhdGNoSGFuZGxlcjogKHsgZmFsbGJhY2ssIG9yaWdpbmFsQXJndW1lbnRzOiBbZmlsZV0gfSkgPT4ge1xuICAgICAgICB0aGlzLmFzc2VydE5vdEJsb2NrZWQoW2ZpbGUucGF0aF0pO1xuICAgICAgICByZXR1cm4gZmFsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIHByaXZhdGUgYXNzZXJ0Tm90QmxvY2tlZChwYXRoczogc3RyaW5nW10pOiB2b2lkIHtcbiAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgIGlmICh0aGlzLnNob3VsZEJsb2NrTXV0YXRpb24ocGF0aCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IFJlc291cmNlTG9ja2VkRXJyb3IocGF0aCk7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSBwZXItcGx1Z2luIGhhbmRsZSBmb3IgcGF0aC1zY29wZWQgcmVzb3VyY2UgbG9ja2luZyAoZWRpdG9yIHJlYWQtb25seSwgb3B0aW9uYWwgdmF1bHQtbXV0YXRpb25cbiAqIGJsb2NraW5nLCBhbmQgZXh0ZXJuYWwtY2hhbmdlIGRldGVjdGlvbiBcdTIwMTQgc2VlIHRoZSBmaWxlIG92ZXJ2aWV3KS4gQWRkIGl0IGFzIGEgY2hpbGQgb2YgeW91ciBwbHVnaW5cbiAqIChgdGhpcy5hZGRDaGlsZChuZXcgUmVzb3VyY2VMb2NrQ29tcG9uZW50KHRoaXMuYXBwKSlgKSBzbyB0aGF0IGFueSBsb2NrcyBpdCBzdGlsbCBob2xkcyBhcmUgcmVsZWFzZWRcbiAqIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgcGx1Z2luIHVubG9hZHMgXHUyMDE0IGEgcmVzb3VyY2UgY2FuIG5ldmVyIGJlIGxlZnQgc3R1Y2sgbG9ja2VkIGJlY2F1c2UgdGhlIHBsdWdpblxuICogdGhhdCBsb2NrZWQgaXQgd2FzIGRpc2FibGVkIG9yIHJlbG9hZGVkIG1pZC1vcGVyYXRpb24uXG4gKlxuICogTG9ja3MgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGFuZCBhdHRyaWJ1dGVkIHRvIHRoaXMgcGx1Z2luLCBzbyB0aGUgbG9jayBpbmRpY2F0b3JzJyB0b29sdGlwIG5hbWVzIGl0XG4gKiBhbW9uZyB0aGUgcGx1Z2lucyBjdXJyZW50bHkgaG9sZGluZyBhIGxvY2suXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tDb21wb25lbnQgZXh0ZW5kcyBDb21wb25lbnRFeCB7XG4gIC8qKlxuICAgKiBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IGFwcDogQXBwO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0byBpdCBmb3JcbiAgICogcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHBsdWdpbklkOiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYW4gcmVzb3VyY2UtbG9jayBoYW5kbGUgb3duZWQgYnkgYSBwbHVnaW4uXG4gICAqXG4gICAqIEBwYXJhbSBhcHAgLSBUaGUgT2JzaWRpYW4gYXBwIGluc3RhbmNlLlxuICAgKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIG93bmluZyBwbHVnaW4gKGUuZy4gaXRzIGBtYW5pZmVzdC5pZGApLiBMb2NrcyBhcmUgYXR0cmlidXRlZCB0b1xuICAgKiBpdCBmb3IgcmVmZXJlbmNlLWNvdW50aW5nIGFuZCB0aGUgaW5kaWNhdG9ycycgXCJsb2NrZWQgYnlcIiB0b29sdGlwLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKGFwcDogQXBwLCBwbHVnaW5JZDogc3RyaW5nKSB7XG4gICAgc3VwZXIoKTtcbiAgICB0aGlzLmFwcCA9IGFwcDtcbiAgICB0aGlzLnBsdWdpbklkID0gcGx1Z2luSWQ7XG4gIH1cblxuICAvKipcbiAgICogT3BlbnMgYW4gKiphbWJpZW50IGJ5cGFzcyBzY29wZSoqOiB3aGlsZSB0aGUgcmV0dXJuZWQge0BsaW5rIERpc3Bvc2FibGV9IGlzIG5vdCBkaXNwb3NlZCwgdGhpc1xuICAgKiBwbHVnaW4ncyBvd24gbXV0YXRpb25zIG9mIHRoZSBnaXZlbiBwYXRocyAoYW5kLCBmb3IgYSBmb2xkZXIsIGl0cyB3aG9sZSBzdWJ0cmVlKSBwYXNzIHRocm91Z2ggdGhlXG4gICAqIG11dGF0aW9uIGJsb2NrZXIgaW5zdGVhZCBvZiB0aHJvd2luZyB7QGxpbmsgUmVzb3VyY2VMb2NrZWRFcnJvcn0uIEFueSBtdXRhdGlvbiBvZiBhIGJsb2NrZWQgcGF0aFxuICAgKiBOT1QgY292ZXJlZCBieSBhbiBhY3RpdmUgYnlwYXNzIHNjb3BlIGlzIHN0aWxsIHJlamVjdGVkLiBVc2UgaXQgd2l0aCBhIGB1c2luZ2AgZGVjbGFyYXRpb24gYXJvdW5kXG4gICAqIHRoZSBvcGVyYXRpb24gdGhhdCBsZWdpdGltYXRlbHkgbXV0YXRlcyByZXNvdXJjZXMgaXQgaGFzIGxvY2tlZCB3aXRoXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc306XG4gICAqXG4gICAqIGBgYHRzXG4gICAqIHVzaW5nIF9ieXBhc3MgPSBjb21wb25lbnQuYnlwYXNzQmxvY2tlZE11dGF0aW9ucyhbc291cmNlRmlsZSwgdGFyZ2V0RmlsZV0pO1xuICAgKiAvLyAuLi4gdGhlIG9wZXJhdGlvbidzIG93biB2YXVsdCBtdXRhdGlvbnMgb2YgdGhvc2UgcGF0aHMgYXJlIGFsbG93ZWQgLi4uXG4gICAqIC8vIHNjb3BlIGVuZDogdGhlIHBhdGhzIGFyZSBlbmZvcmNlZCBhZ2FpblxuICAgKiBgYGBcbiAgICpcbiAgICogQHBhcmFtIHBhdGhzT3JGaWxlcyAtIFRoZSBwYXRocyAob3IgZmlsZXMvZm9sZGVycykgd2hvc2UgbXV0YXRpb24gYnkgdGhpcyBvcGVyYXRpb24gaXMgc2FuY3Rpb25lZC5cbiAgICogQHJldHVybnMgQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBlbmRzIHRoZSBieXBhc3Mgc2NvcGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBieXBhc3NCbG9ja2VkTXV0YXRpb25zKHBhdGhzT3JGaWxlczogcmVhZG9ubHkgUGF0aE9yRmlsZVtdKTogRGlzcG9zYWJsZSB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5ieXBhc3ModGhpcy5hcHAsIHBhdGhzT3JGaWxlcyk7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgbG9ja2VkIGRpcmVjdGx5IG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHBhdGggaXMgaXRzZWxmIGxvY2tlZCBvciBpcyBjb3ZlcmVkIGJ5IGEgYHN1YnRyZWVgIGxvY2sgb24gYW4gYW5jZXN0b3IuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRCeUFuY2VzdG9yRm9yUGF0aChwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGdldE1hbmFnZXIoKS5pc0xvY2tlZEJ5QW5jZXN0b3IodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQgYnkgYW55IHBsdWdpbi5cbiAgICpcbiAgICogQHBhcmFtIHBhdGhPckZpbGUgLSBUaGUgcGF0aCBvciBmaWxlIG9mIHRoZSBub3RlIHRvIGNoZWNrLlxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gICAqL1xuICBwdWJsaWMgaXNMb2NrZWRGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKHRoaXMuYXBwLCBwYXRoT3JGaWxlKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3Mgd2hldGhlciBhIHZhdWx0IG11dGF0aW9uIG9mIHRoZSBwYXRoIGlzIGN1cnJlbnRseSBibG9ja2VkIGJ5IGEgYHNob3VsZEJsb2NrTXV0YXRpb25zYCBsb2NrXG4gICAqIG9uIHRoZSBwYXRoIGl0c2VsZiBvciBvbiBhIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgdG8gY2hlY2suXG4gICAqIEByZXR1cm5zIGB0cnVlYCBpZiBlZGl0aW5nL2RlbGV0aW5nL3JlbmFtaW5nL21vdmluZy9jcmVhdGluZyB0aGUgcGF0aCB3b3VsZCB0aHJvdyBhXG4gICAqIHtAbGluayBSZXNvdXJjZUxvY2tlZEVycm9yfS5cbiAgICovXG4gIHB1YmxpYyBpc011dGF0aW9uQmxvY2tlZEJ5QW5jZXN0b3JGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTXV0YXRpb25CbG9ja2VkQnlBbmNlc3Rvcih0aGlzLmFwcCwgcGF0aE9yRmlsZSk7XG4gIH1cblxuICAvKipcbiAgICogTG9ja3MgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggb24gYmVoYWxmIG9mIHRoaXMgcGx1Z2luLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnRcbiAgICogYW5kIGZ1dHVyZSB7QGxpbmsgTWFya2Rvd25WaWV3fSB1bnRpbCB0aGUgbG9jayBpcyByZWxlYXNlZC4gUmVmZXJlbmNlLWNvdW50ZWQ6IGJhbGFuY2UgZWFjaCBjYWxsXG4gICAqIHdpdGggYSBkaXNwb3NlIG9mIHRoZSByZXR1cm5lZCB7QGxpbmsgRGlzcG9zYWJsZX0gKGlkZWFsbHkgdmlhIGB1c2luZ2ApIG9yIHtAbGluayB1bmxvY2tGb3JQYXRofS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIExvY2tpbmcgcGFyYW1ldGVycy4gSXRzIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5wYXRoT3JGaWxlfVxuICAgKiBhbmQge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLm9wZXJhdGlvbk5hbWV9IGFyZSByZXF1aXJlZCAodGhlIGxhdHRlciBpcyBzaG93blxuICAgKiBpbiB0aGUgdW5sb2NrIGNvbmZpcm1hdGlvbikuIFBhc3MgYW4ge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn1cbiAgICogdG8gbWFrZSB0aGUgbG9jayBjYW5jZWxhYmxlIHZpYSBhIGxvY2sgaW5kaWNhdG9yJ3MgXCJ1bmxvY2tcIiBtZW51LCB0aGUgXCJVbmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kLFxuICAgKiBvciB7QGxpbmsgcmVxdWVzdFJlc291cmNlVW5sb2NrRm9yUGF0aH0uXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGV9IHRoYXQgcmVsZWFzZXMgdGhpcyBsb2NrIHdoZW4gZGlzcG9zZWQuIERpc3Bvc2luZyBtb3JlIHRoYW4gb25jZSBpcyBhIG5vLW9wLlxuICAgKi9cbiAgcHVibGljIGxvY2tGb3JQYXRoKHBhcmFtczogUmVzb3VyY2VMb2NrQ29tcG9uZW50TG9ja0ZvclBhdGhQYXJhbXMpOiBEaXNwb3NhYmxlIHtcbiAgICByZXR1cm4gZ2V0TWFuYWdlcigpLmxvY2soe1xuICAgICAgYWJvcnRDb250cm9sbGVyOiBwYXJhbXMuYWJvcnRDb250cm9sbGVyLFxuICAgICAgYXBwOiB0aGlzLmFwcCxcbiAgICAgIGJsb2Nrc011dGF0aW9uczogcGFyYW1zLnNob3VsZEJsb2NrTXV0YXRpb25zLFxuICAgICAgbW9kZTogcGFyYW1zLm1vZGUsXG4gICAgICBvblVubG9ja1JlcXVlc3RlZDogcGFyYW1zLm9uVW5sb2NrUmVxdWVzdGVkLFxuICAgICAgb3BlcmF0aW9uTmFtZTogcGFyYW1zLm9wZXJhdGlvbk5hbWUsXG4gICAgICBwYXRoT3JGaWxlOiBwYXJhbXMucGF0aE9yRmlsZSxcbiAgICAgIHBsdWdpbklkOiB0aGlzLnBsdWdpbklkLFxuICAgICAgc2hvdWxkUmVsZWFzZU9uQWJvcnQ6IHBhcmFtcy5zaG91bGRSZWxlYXNlT25BYm9ydFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIGV2ZXJ5IGxvY2sgc3RpbGwgaGVsZCBieSB0aGlzIHBsdWdpbiB3aGVuIHRoZSBjb21wb25lbnQgKGFuZCB0aHVzIHRoZSBwbHVnaW4pIHVubG9hZHMsXG4gICAqIHNvIG5vIG5vdGUgaXMgbGVmdCBzdHVjayByZWFkLW9ubHkgYnkgYW4gb3BlcmF0aW9uIHRoYXQgbmV2ZXIgY29tcGxldGVkLlxuICAgKi9cbiAgcHVibGljIG92ZXJyaWRlIG9udW5sb2FkKCk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2tBbGxGb3JQbHVnaW4odGhpcy5hcHAsIHRoaXMucGx1Z2luSWQpO1xuICAgIHN1cGVyLm9udW5sb2FkKCk7XG4gIH1cblxuICAvKipcbiAgICogRnVsbHkgdW5sb2NrcyB0aGUgbm90ZSBhdCB0aGUgZ2l2ZW4gcGF0aDogcmVzb2x2ZXMgdGhlIGxvY2sgY292ZXJpbmcgaXQgKHRoZSBwYXRoIGl0c2VsZiB3aGVuXG4gICAqIGRpcmVjdGx5IGxvY2tlZCwgb3RoZXJ3aXNlIGEgYHN1YnRyZWVgLWxvY2tlZCBhbmNlc3RvciBmb2xkZXIpLCBjYW5jZWxzIHRoZSBvcGVyYXRpb24ocykgdGhhdCB0b29rXG4gICAqIHRoZSBsb2NrIGJ5IGFib3J0aW5nIHRoZWlyIHtAbGluayBBYm9ydENvbnRyb2xsZXJ9cywgYW5kIHJlbGVhc2VzIHRoZSBsb2NrIHNvIHRoZSBub3RlIGJlY29tZXNcbiAgICogZWRpdGFibGUgXHUyMDE0IHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggcGx1Z2luIGhvbGRzIHRoZSBsb2NrLiBQb3dlcnMgdGhlIFwiVW5sb2NrIGFjdGl2ZSBub3RlXCIgY29tbWFuZC4gQVxuICAgKiBuby1vcCB3aGVuIG5vdGhpbmcgY292ZXJzIHRoZSBwYXRoLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHJlcXVlc3RVbmxvY2tGb3JQYXRoKHBhdGhPckZpbGU6IFBhdGhPckZpbGUpOiB2b2lkIHtcbiAgICBnZXRNYW5hZ2VyKCkuZm9yY2VVbmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbGVhc2VzIG9uZSBsb2NrIHByZXZpb3VzbHkgYWNxdWlyZWQgZm9yIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIHZpYSB7QGxpbmsgbG9ja0ZvclBhdGh9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gdW5sb2NrLlxuICAgKi9cbiAgcHVibGljIHVubG9ja0ZvclBhdGgocGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IHZvaWQge1xuICAgIGdldE1hbmFnZXIoKS51bmxvY2sodGhpcy5hcHAsIHBhdGhPckZpbGUsIHRoaXMucGx1Z2luSWQpO1xuICB9XG59XG5cbi8qKlxuICogVGhyb3duIGJ5IHRoZSB2YXVsdC1tdXRhdGlvbiBibG9ja2VyIHdoZW4gYSBwbHVnaW4gdHJpZXMgdG8gZWRpdCwgZGVsZXRlLCByZW5hbWUsIG1vdmUsIG9yIGNyZWF0ZSBhXG4gKiByZXNvdXJjZSB3aG9zZSBwYXRoIGlzIGNvdmVyZWQgYnkgYSBsb2NrIHRha2VuIHdpdGhcbiAqIHtAbGluayBSZXNvdXJjZUxvY2tDb21wb25lbnRMb2NrRm9yUGF0aFBhcmFtcy5zaG91bGRCbG9ja011dGF0aW9uc30uXG4gKi9cbmV4cG9ydCBjbGFzcyBSZXNvdXJjZUxvY2tlZEVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAvKipcbiAgICogVGhlIHZhdWx0IHBhdGggd2hvc2UgbXV0YXRpb24gd2FzIGJsb2NrZWQuXG4gICAqL1xuICBwdWJsaWMgcmVhZG9ubHkgcGF0aDogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEge0BsaW5rIFJlc291cmNlTG9ja2VkRXJyb3J9LlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCAtIFRoZSB2YXVsdCBwYXRoIHdob3NlIG11dGF0aW9uIHdhcyBibG9ja2VkLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhdGg6IHN0cmluZykge1xuICAgIHN1cGVyKGBUaGUgcmVzb3VyY2UgXCIke3BhdGh9XCIgaXMgbG9ja2VkIGFuZCBjYW5ub3QgYmUgbXV0YXRlZC5gKTtcbiAgICB0aGlzLm5hbWUgPSAnUmVzb3VyY2VMb2NrZWRFcnJvcic7XG4gICAgdGhpcy5wYXRoID0gcGF0aDtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyB3aGV0aGVyIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGlzIGN1cnJlbnRseSBsb2NrZWQuXG4gKlxuICogQHBhcmFtIGFwcCAtIFRoZSBPYnNpZGlhbiBhcHAgaW5zdGFuY2UuXG4gKiBAcGFyYW0gcGF0aE9yRmlsZSAtIFRoZSBwYXRoIG9yIGZpbGUgb2YgdGhlIG5vdGUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG5vdGUgaGFzIGF0IGxlYXN0IG9uZSBhY3RpdmUgbG9jaywgYGZhbHNlYCBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1Jlc291cmNlTG9ja2VkRm9yUGF0aChhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIHdoZXRoZXIgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggaXMgY3VycmVudGx5IGxvY2tlZCBkaXJlY3RseSBPUiBpcyBjb3ZlcmVkIGJ5IGFcbiAqIGBzdWJ0cmVlYC1sb2NrZWQgYW5jZXN0b3IgZm9sZGVyLlxuICpcbiAqIFVubGlrZSB7QGxpbmsgaXNSZXNvdXJjZUxvY2tlZEZvclBhdGh9LCB3aGljaCBvbmx5IHJlcG9ydHMgYW4gZXhhY3QtcGF0aCBsb2NrLCB0aGlzIGFsc28gcmVwb3J0cyBhXG4gKiBwYXRoIHRoYXQgbGllcyB1bmRlciBhIGZvbGRlciBsb2NrZWQgaW4gYHN1YnRyZWVgIG1vZGUuIFVzZSBpdCB0byBkZXRlY3QgdGhhdCBhIHJlbmFtZS9tb3ZlIGlzXG4gKiBoYXBwZW5pbmcgaW5zaWRlIGEgZm9yZWlnbiBwbHVnaW4ncyBpbi1mbGlnaHQgbG9ja2VkIHRyYW5zYWN0aW9uICh3aGljaCBsb2NrcyB0aGUgYWZmZWN0ZWQgZm9sZGVyXG4gKiBzdWJ0cmVlKSwgc28gdGhhdCBhIGJ5c3RhbmRlciAoZS5nLiB0aGUgcmVuYW1lL2RlbGV0ZSBoYW5kbGVyKSBjYW4gc3RheSBvdXQgb2YgdGhlIHdheSBhbmQgbGV0IHRoZVxuICogdHJhbnNhY3Rpb24ncyBvd25lciBrZWVwIGl0cyBvd24gbGlua3MgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byBjaGVjay5cbiAqIEByZXR1cm5zIGB0cnVlYCBpZiB0aGUgcGF0aCBpcyBpdHNlbGYgbG9ja2VkIG9yIGxpZXMgdW5kZXIgYSBgc3VidHJlZWAtbG9ja2VkIGFuY2VzdG9yIGZvbGRlci5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzUmVzb3VyY2VMb2NrZWRGb3JQYXRoQnlBbmNlc3RvcihhcHA6IEFwcCwgcGF0aE9yRmlsZTogUGF0aE9yRmlsZSk6IGJvb2xlYW4ge1xuICByZXR1cm4gZ2V0TWFuYWdlcigpLmlzTG9ja2VkQnlBbmNlc3RvcihhcHAsIHBhdGhPckZpbGUpO1xufVxuXG4vKipcbiAqIExvY2tzIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoLCBtYWtpbmcgaXQgcmVhZC1vbmx5IGluIGV2ZXJ5IGN1cnJlbnQgYW5kIGZ1dHVyZVxuICoge0BsaW5rIE1hcmtkb3duVmlld30gdW50aWwgdGhlIGxvY2sgaXMgcmVsZWFzZWQsIGFuZCBzaG93aW5nIGEgbG9jayBpbmRpY2F0b3IgaW4gdGhlIHRhYiBoZWFkZXIsXG4gKiB2aWV3IGFjdGlvbiBiYXIsIGFuZCAod2hpbGUgYWN0aXZlKSB0aGUgc3RhdHVzIGJhci4gVGhlIGluZGljYXRvcnMnIHRvb2x0aXAgbGlzdHMgdGhlIHBsdWdpbnNcbiAqIHRoYXQgY3VycmVudGx5IGhvbGQgYSBsb2NrIG9uIHRoZSBub3RlLlxuICpcbiAqIFRoZSBsb2NrIGlzIHJlZmVyZW5jZS1jb3VudGVkIHBlciBjYWxsaW5nIHBsdWdpbjogZWFjaCBjYWxsIG11c3QgYmUgYmFsYW5jZWQgYnkgZXhhY3RseSBvbmVcbiAqIHJlbGVhc2UgKGVpdGhlciBkaXNwb3NpbmcgdGhlIHJldHVybmVkIHtAbGluayBEaXNwb3NhYmxlfSBcdTIwMTQgaWRlYWxseSB2aWEgYSBgdXNpbmdgIGRlY2xhcmF0aW9uIFx1MjAxNCBvclxuICogYSBtYXRjaGluZyB7QGxpbmsgdW5sb2NrUmVzb3VyY2VGb3JQYXRofSBjYWxsKS5cbiAqXG4gKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMgZm9yIGxvY2tpbmcgdGhlIG5vdGUuXG4gKiBAcmV0dXJucyBBIHtAbGluayBEaXNwb3NhYmxlfSB0aGF0IHJlbGVhc2VzIHRoaXMgbG9jayB3aGVuIGRpc3Bvc2VkLiBEaXNwb3NpbmcgbW9yZSB0aGFuIG9uY2UgaXMgYSBuby1vcC5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxvY2tSZXNvdXJjZUZvclBhdGgocGFyYW1zOiBMb2NrUmVzb3VyY2VGb3JQYXRoUGFyYW1zKTogRGlzcG9zYWJsZSB7XG4gIHJldHVybiBnZXRNYW5hZ2VyKCkubG9jayh7XG4gICAgYXBwOiBwYXJhbXMuYXBwLFxuICAgIG9wZXJhdGlvbk5hbWU6IHBhcmFtcy5vcGVyYXRpb25OYW1lLFxuICAgIHBhdGhPckZpbGU6IHBhcmFtcy5wYXRoT3JGaWxlLFxuICAgIHBsdWdpbklkOiBwYXJhbXMucGx1Z2luSWRcbiAgfSk7XG59XG5cbi8qKlxuICogUmVxdWVzdHMgYW4gdW5sb2NrIG9mIHRoZSBub3RlIGF0IHRoZSBnaXZlbiBwYXRoIGJ5IGFib3J0aW5nIGV2ZXJ5IHtAbGluayBBYm9ydENvbnRyb2xsZXJ9IHRoYXQgd2FzXG4gKiBhc3NvY2lhdGVkIHdpdGggYSBsb2NrIG9uIGl0ICh2aWEge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudC5sb2NrRm9yUGF0aH0nc1xuICoge0BsaW5rIFJlc291cmNlTG9ja0NvbXBvbmVudExvY2tGb3JQYXRoUGFyYW1zLmFib3J0Q29udHJvbGxlcn0pLiBUaGUgb3BlcmF0aW9ucyBob2xkaW5nIHRoZSBsb2NrXG4gKiBvYnNlcnZlIHRoZSBhYm9ydCBhbmQgcmVsZWFzZSB0aGVpciBvd24gbG9ja3MuIEEgbm8tb3Agd2hlbiBubyBhYm9ydGFibGUgbG9jayBpcyByZWdpc3RlcmVkIGZvciB0aGVcbiAqIHBhdGguXG4gKlxuICogVGhpcyBsZXRzIGEgY29uc3VtaW5nIHBsdWdpbiB3aXJlIGl0cyBvd24gXCJ1bmxvY2sgYWN0aXZlIG5vdGVcIiBjb21tYW5kIHdpdGhvdXQgcmVhY2hpbmcgaW50byB0aGVcbiAqIGxvY2sgbWFuYWdlciBkaXJlY3RseS5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byByZXF1ZXN0IGFuIHVubG9jayBmb3IuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiByZXF1ZXN0UmVzb3VyY2VVbmxvY2tGb3JQYXRoKGFwcDogQXBwLCBwYXRoT3JGaWxlOiBQYXRoT3JGaWxlKTogdm9pZCB7XG4gIGdldE1hbmFnZXIoKS5yZXF1ZXN0VW5sb2NrKGFwcCwgcGF0aE9yRmlsZSk7XG59XG5cbi8qKlxuICogUmVsZWFzZXMgb25lIGxvY2sgcHJldmlvdXNseSBhY3F1aXJlZCBmb3IgdGhlIG5vdGUgYXQgdGhlIGdpdmVuIHBhdGggdmlhIHtAbGluayBsb2NrUmVzb3VyY2VGb3JQYXRofS5cbiAqXG4gKiBXaGVuIHRoZSBsYXN0IGxvY2sgaXMgcmVsZWFzZWQgdGhlIG5vdGUgYmVjb21lcyBmdWxseSBlZGl0YWJsZSBhZ2FpbiBhbmQgaXRzIGxvY2sgaW5kaWNhdG9ycyBhcmVcbiAqIHJlbW92ZWQuIENhbGxpbmcgdGhpcyB3aGVuIHRoZSBub3RlIGlzIG5vdCBsb2NrZWQgaXMgYSBuby1vcC5cbiAqXG4gKiBAcGFyYW0gYXBwIC0gVGhlIE9ic2lkaWFuIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSBwYXRoT3JGaWxlIC0gVGhlIHBhdGggb3IgZmlsZSBvZiB0aGUgbm90ZSB0byB1bmxvY2suXG4gKiBAcGFyYW0gcGx1Z2luSWQgLSBUaGUgaWQgb2YgdGhlIHBsdWdpbiB0aGF0IGhvbGRzIHRoZSBsb2NrIChlLmcuIGl0cyBgbWFuaWZlc3QuaWRgKTsgb25lIG9mIGl0c1xuICogbG9ja3Mgb24gdGhlIG5vdGUgaXMgcmVsZWFzZWQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB1bmxvY2tSZXNvdXJjZUZvclBhdGgoYXBwOiBBcHAsIHBhdGhPckZpbGU6IFBhdGhPckZpbGUsIHBsdWdpbklkOiBzdHJpbmcpOiB2b2lkIHtcbiAgZ2V0TWFuYWdlcigpLnVubG9jayhhcHAsIHBhdGhPckZpbGUsIHBsdWdpbklkKTtcbn1cblxuZnVuY3Rpb24gZ2V0TWFuYWdlcigpOiBSZXNvdXJjZUxvY2tNYW5hZ2VyIHtcbiAgcmV0dXJuIGdldE9ic2lkaWFuRGV2VXRpbHNTdGF0ZTxSZXNvdXJjZUxvY2tNYW5hZ2VyPihSRVNPVVJDRV9MT0NLX1NUQVRFX0tFWSwgbmV3IFJlc291cmNlTG9ja01hbmFnZXIoKSkudmFsdWU7XG59XG5cbi8qKlxuICogTWFwcyBhIHN0b3JlZCBwYXRoIHRocm91Z2ggYSByZW5hbWU6IHRoZSByZW5hbWVkIHBhdGggaXRzZWxmIGJlY29tZXMgdGhlIG5ldyBwYXRoLCBhbmQgYSBkZXNjZW5kYW50XG4gKiBvZiBpdCBrZWVwcyBpdHMgc3VmZml4IHVuZGVyIHRoZSBuZXcgcGF0aC4gU3BlbGxlZCBvdXQgcmF0aGVyIHRoYW4gcmV1c2luZyB7QGxpbmsgaXNDaGlsZE9yU2VsZn1cbiAqIGJlY2F1c2UgdGhlIHJlYmFzZWQgc3VmZml4IGhhcyB0byBiZSBjb21wdXRlZCBmcm9tIHRoZSBzYW1lIHByZWZpeCB0aGUgdGVzdCBtYXRjaGVkLCBhbmQgYSByZW5hbWVcbiAqIHNvdXJjZSBpcyBuZXZlciB0aGUgdmF1bHQgcm9vdCAodGhlIG9uZSBjYXNlIHRob3NlIGhlbHBlcnMgdHJlYXQgc3BlY2lhbGx5KS5cbiAqXG4gKiBAcGFyYW0gcGF0aCAtIFRoZSBzdG9yZWQgcGF0aCB0byBtYXAuXG4gKiBAcGFyYW0gb2xkUGF0aCAtIFRoZSBwYXRoIHRoZSByZXNvdXJjZSB3YXMgcmVuYW1lZCBmcm9tLlxuICogQHBhcmFtIG5ld1BhdGggLSBUaGUgcGF0aCB0aGUgcmVzb3VyY2Ugd2FzIHJlbmFtZWQgdG8uXG4gKiBAcmV0dXJucyBUaGUgcmViYXNlZCBwYXRoLCBvciBgbnVsbGAgd2hlbiB0aGUgcmVuYW1lIGRvZXMgbm90IGFmZmVjdCBpdC5cbiAqL1xuZnVuY3Rpb24gcmViYXNlUGF0aChwYXRoOiBzdHJpbmcsIG9sZFBhdGg6IHN0cmluZywgbmV3UGF0aDogc3RyaW5nKTogbnVsbCB8IHN0cmluZyB7XG4gIGlmIChwYXRoID09PSBvbGRQYXRoKSB7XG4gICAgcmV0dXJuIG5ld1BhdGg7XG4gIH1cbiAgaWYgKHBhdGguc3RhcnRzV2l0aChgJHtvbGRQYXRofS9gKSkge1xuICAgIHJldHVybiBuZXdQYXRoICsgcGF0aC5zbGljZShvbGRQYXRoLmxlbmd0aCk7XG4gIH1cbiAgcmV0dXJuIG51bGw7XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBMENBLFNBQVMsZ0JBQWdCO0FBQ3pCO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUlQLFNBQVMsZ0JBQWdCO0FBQ3pCLFNBQVMsMEJBQTBCO0FBQ25DLFNBQVMsY0FBYztBQUN2QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUNQLFNBQVMsWUFBWTtBQUNyQixTQUFTLGdDQUFnQztBQUN6QyxTQUFTLHlCQUF5QjtBQUNsQyxTQUFTLG1CQUFtQjtBQUM1QixTQUFTLDZCQUE2QjtBQUN0QyxTQUFTLDRCQUE0QjtBQUNyQyxTQUFTLGVBQWU7QUFDeEIsU0FBUyx1QkFBdUI7QUFDaEMsU0FBUyxTQUFTO0FBQ2xCLFNBQVMsZUFBZTtBQUN4QjtBQUFBLEVBQ0U7QUFBQSxFQUNBO0FBQUEsT0FDSztBQUVQLE1BQU0sMEJBQTBCO0FBQ2hDLE1BQU0sZUFBZTtBQUNyQixNQUFNLDJCQUEyQjtBQUNqQyxNQUFNLGlDQUFpQztBQUN2QyxNQUFNLDRCQUE0QjtBQUNsQyxNQUFNLDBCQUEwQjtBQUNoQyxNQUFNLGlCQUFpQjtBQUN2QixNQUFNLHNCQUFzQjtBQXVLNUIsTUFBTSxvQ0FBb0MsWUFBWTtBQUFBLEVBQ25DO0FBQUEsRUFDQTtBQUFBLEVBQ0E7QUFBQSxFQUNBO0FBQUEsRUFDQTtBQUFBLEVBRVYsWUFBWSxRQUFzRDtBQUN2RSxVQUFNO0FBQ04sU0FBSyxNQUFNLE9BQU87QUFDbEIsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSyxxQkFBcUIsT0FBTztBQUNqQyxTQUFLLGFBQWEsT0FBTztBQUN6QixTQUFLLFdBQVcsT0FBTztBQUFB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
|