ngx-reactify 0.0.2 → 0.1.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.
@@ -2,99 +2,245 @@ import { createComponent, EventEmitter } from '@angular/core';
2
2
  import { createApplication } from '@angular/platform-browser';
3
3
  import * as React from 'react';
4
4
  import { firstValueFrom } from 'rxjs';
5
- // declare const Zone;
6
- // const zone = Zone ? new Zone(Zone.current, { name: "@dotglitch_menu", properties: {} }) : null;
7
5
  /**
8
- * Wrap an angular component inside of a React memo object.
6
+ * Wrap an Angular component inside of a React memo object.
9
7
  * Will attempt to bind @Input and @Output properties if provided,
10
8
  * and will bind the react arguments directly as @Input properties.
11
9
  *
12
- * @experimental
13
- * @param componentClass Angular component
14
- * @param envInjector An `EnvironmentInjector` instance to be used for the component
15
- * @param injector An `ElementInjector` instance
16
- * @param _inputs
17
- * @param _outputs
18
- * @returns
10
+ * Usage: An Angular top-level application with a ReactifyNgComponent react implementation
11
+ * that needs to embed Angular components as children of the react-wrapped component.
12
+ *
13
+ * This is replaced by `WrapAngularComponentInReact`.
14
+ * @deprecated
19
15
  */
20
- export const ReactifyReactComponent = ({ component, appRef, injector, ngZone, staticInputs, staticOutputs, preSiblings, postSiblings, additionalChildren, rootElementName, containerElementName }) => React.memo((args) => {
21
- const id = Math.random().toString();
22
- React.useEffect(() => {
23
- try {
24
- const componentInstance = createComponent(component, {
25
- environmentInjector: appRef.injector,
26
- elementInjector: injector,
27
- hostElement: document.getElementById(id)
28
- });
29
- appRef.attachView(componentInstance.hostView);
30
- // @ts-ignore
31
- // component.hostView = hostView;
32
- Object.assign(staticInputs, args);
33
- const { inputs, outputs } = component['ɵcmp'];
34
- // Returns a list of entries that need to be set
35
- // This makes it so that unnecessary setters are not invoked.
36
- const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
37
- return componentInstance.instance[childKey] != staticInputs[parentKey];
38
- });
39
- updated.forEach(([parentKey, childKey]) => {
40
- if (staticInputs.hasOwnProperty(parentKey))
41
- componentInstance.instance[childKey] = staticInputs[parentKey];
42
- });
43
- const outputSubscriptions = {};
44
- // Get a list of unregistered outputs
45
- const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
46
- return !outputSubscriptions[parentKey];
47
- });
48
- // Reverse bind via subscription
49
- newOutputs.forEach(([parentKey, childKey]) => {
50
- if (!staticOutputs.hasOwnProperty(parentKey))
51
- return;
52
- const target = componentInstance.instance[childKey];
53
- const outputs = staticOutputs;
54
- const sub = target.subscribe((...args) => {
55
- // Run the callback in the provided zone
56
- ngZone.run(() => {
57
- outputs[parentKey](...args);
58
- });
59
- }); // Subscription
60
- outputSubscriptions[parentKey] = sub;
61
- });
62
- // Wrap the destroy method to safely release the subscriptions
63
- const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
64
- componentInstance.onDestroy = (cb) => {
16
+ export const ReactifyAngularComponent = ({ component, appRef, injector, ngZone, staticInputs = {}, staticOutputs = {}, preSiblings = [], postSiblings = [], additionalChildren = [], rootElementName = '', containerElementName = '' }) => React.memo((args) => {
17
+ return ngZone.runOutsideAngular(() => {
18
+ let outputSubscriptions;
19
+ let componentInstance;
20
+ const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
21
+ // These attributes will trigger change detection when they fire from
22
+ // the underlying React element.
23
+ // ... This will break things. FUCK.
24
+ const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
25
+ const attrObj = {};
26
+ attributes.forEach(a => attrObj[a] = tripChangeDetection);
27
+ React.useEffect(() => {
28
+ return () => {
29
+ // Code to run when the component unmounts
30
+ appRef?.detachView(componentInstance.hostView);
65
31
  Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
66
- originalDestroy?.(cb);
32
+ componentInstance?.destroy();
67
33
  };
68
- componentInstance.changeDetectorRef.detectChanges();
34
+ }, []);
35
+ const elements = [
36
+ ...(preSiblings || []),
37
+ React.createElement(containerElementName || "div", {
38
+ ...attrObj,
39
+ ref: node => {
40
+ const { inputs, outputs } = component['ɵcmp'];
41
+ if (componentInstance)
42
+ return;
43
+ ngZone.run(() => {
44
+ componentInstance = createComponent(component, {
45
+ environmentInjector: appRef.injector,
46
+ elementInjector: injector,
47
+ hostElement: node
48
+ });
49
+ Object.assign(staticInputs, args);
50
+ appRef.attachView(componentInstance.hostView);
51
+ });
52
+ // Returns a list of entries that need to be set
53
+ // This makes it so that unnecessary setters are not invoked.
54
+ const updated = Object.entries(inputs).filter(([parentKey, childKey]) => {
55
+ return componentInstance.instance[childKey] != staticInputs[parentKey];
56
+ });
57
+ updated.forEach(([parentKey, childKey]) => {
58
+ if (staticInputs.hasOwnProperty(parentKey))
59
+ componentInstance.instance[childKey] = staticInputs[parentKey];
60
+ });
61
+ outputSubscriptions = {};
62
+ // Get a list of unregistered outputs
63
+ const newOutputs = Object.entries(outputs).filter(([parentKey, childKey]) => {
64
+ return !outputSubscriptions[parentKey];
65
+ });
66
+ // Reverse bind via subscription
67
+ newOutputs.forEach(([parentKey, childKey]) => {
68
+ if (!staticOutputs.hasOwnProperty(parentKey))
69
+ return;
70
+ const target = componentInstance.instance[childKey];
71
+ const outputs = staticOutputs;
72
+ const sub = target.subscribe((...args) => {
73
+ // Run the callback in the provided zone
74
+ ngZone.run(() => {
75
+ outputs[parentKey](...args);
76
+ });
77
+ }); // Subscription
78
+ outputSubscriptions[parentKey] = sub;
79
+ });
80
+ // Wrap the destroy method to safely release the subscriptions
81
+ const originalDestroy = componentInstance.onDestroy?.bind(componentInstance);
82
+ componentInstance.onDestroy = (cb) => {
83
+ Object.values(outputSubscriptions).forEach(s => s.unsubscribe());
84
+ originalDestroy?.(cb);
85
+ };
86
+ componentInstance.changeDetectorRef.detectChanges();
87
+ }
88
+ }),
89
+ ...(postSiblings || []),
90
+ ...(additionalChildren || [])
91
+ ].filter(e => e);
92
+ return React.createElement(rootElementName || "div", {}, ...elements);
93
+ });
94
+ });
95
+ /**
96
+ * Do not use this.
97
+ * @hidden
98
+ * @experimental
99
+ */
100
+ export const ng2ReactProps = (obj = {}) => {
101
+ const props = {};
102
+ Object.entries(obj).forEach(([k, v]) => {
103
+ // Omit things prefixed with an underscore
104
+ if (k.startsWith('_'))
105
+ return;
106
+ // Omit output event emitters
107
+ if (v instanceof EventEmitter) {
108
+ props[k] = (...args) => v.emit([args]);
69
109
  }
70
- catch (err) {
71
- console.error(err);
110
+ else {
111
+ props[k] = v;
72
112
  }
73
- }, []);
74
- const elements = [
75
- ...(preSiblings || []),
76
- React.createElement(containerElementName || "div", { id }),
77
- ...(postSiblings || []),
78
- ...(additionalChildren || [])
79
- ].filter(e => e);
80
- return React.createElement(rootElementName || "div", {}, ...elements);
81
- });
82
- export const ReactifyAngularComponent2 = (component, props) => {
83
- const inputRef = React.useRef(null);
113
+ });
114
+ return props;
115
+ };
116
+ /**
117
+ * This method will create a React component that
118
+ * wraps an Angular component.
119
+ * @returns React.NamedExoticComponent
120
+ *
121
+ * @hidden
122
+ * @experimental
123
+ */
124
+ export function WrapAngularComponentInReact({ component, ngZone, appRef, injector, props, containerTag, reactTemplate, projectableNodes }) {
125
+ props ??= {};
126
+ containerTag ??= 'div';
84
127
  const ctx = this;
85
- React.useEffect(() => {
128
+ const createWrappedElement = () => {
86
129
  // Is there a better way to do this?
87
130
  let subscriptions;
88
- let app;
89
- (async () => {
90
- // Code to run when the component mounts
91
- app = await createApplication({ providers: [] });
92
- const base = app.bootstrap(component, inputRef.current);
131
+ let componentInstance;
132
+ reactTemplate ??= (el) => el;
133
+ return React.memo((args) => {
134
+ Object.assign(props, args);
135
+ React.useEffect(() => {
136
+ return () => {
137
+ // Cleanup and dispose leftover Angular objects
138
+ appRef?.detachView(componentInstance.hostView);
139
+ subscriptions?.forEach(s => s?.unsubscribe());
140
+ componentInstance?.destroy();
141
+ };
142
+ }, []);
143
+ const tripChangeDetection = () => componentInstance?.changeDetectorRef?.detectChanges();
144
+ // These attributes will trigger change detection when they fire from
145
+ // the underlying React element.
146
+ // ... This will break things. FUCK.
147
+ const attributes = ['onCopy', 'onCut', 'onPaste', 'onAbort', 'onBlur', 'onFocus', 'onCanPlay', 'onCanPlayThrough', 'onChange', 'onClick', 'onContextMenu', 'onDoubleClick', 'onDrag', 'onDragEnd', 'onDragEnter', 'onDragLeave', 'onDragOver', 'onDragStart', 'onDrop', 'onDurationChange', 'onEmptied', 'onEnded', 'onInput', 'onInvalid', 'onKeyDown', 'onKeyPress', 'onKeyUp', 'onLoad', 'onLoadedData', 'onLoadedMetadata', 'onLoadStart', 'onMouseDown', 'onMouseEnter', 'onMouseLeave', 'onMouseMove', 'onMouseOut', 'onMouseOver', 'onMouseUp', 'onPause', 'onPlay', 'onPlaying', 'onProgress', 'onRateChange', 'onReset', 'onScroll', 'onSeeked', 'onSeeking', 'onSelect', 'onStalled', 'onSubmit', 'onSuspend', 'onTimeUpdate', 'onVolumeChange', 'onWaiting', 'onError'];
148
+ const attrObj = {};
149
+ attributes.forEach(a => attrObj[a] = tripChangeDetection);
150
+ return reactTemplate(React.createElement(containerTag, {
151
+ ...attrObj,
152
+ ref: async (node) => {
153
+ if (componentInstance)
154
+ return;
155
+ // Not sure if this ever actually happens, added as a preventative measure
156
+ // to memory leaks.
157
+ subscriptions?.forEach(s => s?.unsubscribe());
158
+ const bootstrap = () => {
159
+ // Init the Angular component with the context of the root Angular app.
160
+ componentInstance = createComponent(component, {
161
+ environmentInjector: appRef.injector,
162
+ elementInjector: injector,
163
+ hostElement: node,
164
+ projectableNodes: projectableNodes
165
+ });
166
+ appRef.attachView(componentInstance.hostView);
167
+ };
168
+ ngZone?.runTask
169
+ ? ngZone?.runTask(bootstrap)
170
+ : bootstrap();
171
+ // Now that everything has settled, bind inputs and outputs.
172
+ subscriptions = [];
173
+ Object.entries(props).filter(([k, v]) => {
174
+ // @Outputs are always Event Emitters (I think)
175
+ if (v instanceof EventEmitter) {
176
+ subscriptions.push(componentInstance.instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
177
+ }
178
+ else {
179
+ componentInstance.instance[k] = props[k];
180
+ }
181
+ });
182
+ componentInstance.changeDetectorRef.detectChanges();
183
+ }
184
+ }));
185
+ });
186
+ };
187
+ return ngZone?.runOutsideAngular
188
+ ? ngZone?.runOutsideAngular(createWrappedElement)
189
+ : createWrappedElement();
190
+ }
191
+ /**
192
+ * This method will automatically wrap an Angular
193
+ * Component or Directive into a React object.
194
+ * @Outputs (EventEmitters) will be automatically
195
+ * linked into the input properties along with
196
+ * all of the @Inputs.
197
+ * @returns React.NamedExoticComponent
198
+ * @experimental
199
+ */
200
+ export const AutoWrapAngularObject = ({ component, appRef, ngZone, instance, injector, containerTag, reactTemplate, }) => {
201
+ const props = ng2ReactProps(instance);
202
+ return WrapAngularComponentInReact({
203
+ component,
204
+ ngZone,
205
+ appRef,
206
+ injector,
207
+ containerTag,
208
+ props,
209
+ reactTemplate
210
+ });
211
+ };
212
+ /**
213
+ * Bootstrap an Angular component with `createApplication` and export it under a
214
+ * react Element.
215
+ * Usage: React top-level application embedding an Angular component.
216
+ */
217
+ export function ReactifyStandaloneAngularComponent(component, props = {}, providers = [], containerTag = 'div') {
218
+ const ctx = this;
219
+ // Is there a better way to do this?
220
+ let subscriptions;
221
+ let app;
222
+ React.useEffect(() => {
223
+ return () => {
224
+ // Code to run when the component unmounts
225
+ subscriptions?.forEach(s => s?.unsubscribe());
226
+ app?.destroy();
227
+ };
228
+ }, []);
229
+ return React.createElement(containerTag, {
230
+ ref: async (node) => {
231
+ // Not sure if this ever actually happens, added as a preventative measure
232
+ // to memory leaks.
233
+ subscriptions?.forEach(s => s?.unsubscribe());
234
+ app?.destroy();
235
+ // Init an Angular application root & bootstrap it to a DOM element.
236
+ app = await createApplication({ providers });
237
+ const base = app.bootstrap(component, node);
93
238
  const { instance } = base;
239
+ // Wait for the JS to finish rendering and initing.
94
240
  await firstValueFrom(app.isStable);
95
- // App has now bootstrapped fully.
241
+ // Now that everything has settled, bind inputs and outputs.
96
242
  subscriptions = [];
97
- Object.entries(instance).filter(([k, v]) => {
243
+ Object.entries(props).filter(([k, v]) => {
98
244
  // @Outputs are always Event Emitters (I think)
99
245
  if (v instanceof EventEmitter) {
100
246
  subscriptions.push(instance[k]?.subscribe(evt => props[k].call(ctx, evt)));
@@ -103,14 +249,12 @@ export const ReactifyAngularComponent2 = (component, props) => {
103
249
  instance[k] = props[k];
104
250
  }
105
251
  });
106
- })();
107
- return () => {
108
- // Code to run when the component unmounts
109
- subscriptions?.forEach(s => s?.unsubscribe());
110
- app?.destroy();
111
- };
112
- }, []); // Empty dependency array ensures this effect runs only once on mount and cleanup on unmount
113
- const obj = {};
114
- return React.createElement("div");
115
- };
116
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3RHLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBQzlELE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxjQUFjLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBR3BELHNCQUFzQjtBQUN0QixrR0FBa0c7QUFFbEc7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxFQUNuQyxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxFQUNaLGFBQWEsRUFDYixXQUFXLEVBQ1gsWUFBWSxFQUNaLGtCQUFrQixFQUNsQixlQUFlLEVBQ2Ysb0JBQW9CLEVBYXZCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUV0QixNQUFNLEVBQUUsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDcEMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUU7UUFDakIsSUFBSSxDQUFDO1lBRUQsTUFBTSxpQkFBaUIsR0FBRyxlQUFlLENBQUMsU0FBUyxFQUFFO2dCQUNqRCxtQkFBbUIsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDcEMsZUFBZSxFQUFFLFFBQVE7Z0JBQ3pCLFdBQVcsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFDLEVBQUUsQ0FBQzthQUMzQyxDQUFDLENBQUM7WUFFSCxNQUFNLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQzlDLGFBQWE7WUFDYixpQ0FBaUM7WUFFakMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFFbEMsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUMsTUFBTSxDQUFDLENBQUM7WUFFOUMsZ0RBQWdEO1lBQ2hELDZEQUE2RDtZQUM3RCxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxFQUFFLFFBQVEsQ0FBbUIsRUFBRSxFQUFFO2dCQUN0RixPQUFPLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsSUFBSSxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDM0UsQ0FBQyxDQUFDLENBQUM7WUFFSCxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFtQixFQUFFLEVBQUU7Z0JBQ3hELElBQUksWUFBWSxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUM7b0JBQ3RDLGlCQUFpQixDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsR0FBRyxZQUFZLENBQUMsU0FBUyxDQUFDLENBQUM7WUFDdkUsQ0FBQyxDQUFDLENBQUM7WUFFSCxNQUFNLG1CQUFtQixHQUFxQyxFQUFFLENBQUM7WUFDakUscUNBQXFDO1lBQ3JDLE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFtQixFQUFFLEVBQUU7Z0JBQzFGLE9BQU8sQ0FBQyxtQkFBbUIsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUMzQyxDQUFDLENBQUMsQ0FBQztZQUVILGdDQUFnQztZQUNoQyxVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFtQixFQUFFLEVBQUU7Z0JBQzNELElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQztvQkFBRSxPQUFPO2dCQUVyRCxNQUFNLE1BQU0sR0FBMEIsaUJBQWlCLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDO2dCQUMzRSxNQUFNLE9BQU8sR0FBRyxhQUFhLENBQUM7Z0JBRTlCLE1BQU0sR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFO29CQUNyQyx3Q0FBd0M7b0JBQ3hDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFO3dCQUNaLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO29CQUNoQyxDQUFDLENBQUMsQ0FBQztnQkFDUCxDQUFDLENBQUMsQ0FBQyxDQUFDLGVBQWU7Z0JBRW5CLG1CQUFtQixDQUFDLFNBQVMsQ0FBQyxHQUFHLEdBQUcsQ0FBQztZQUN6QyxDQUFDLENBQUMsQ0FBQztZQUVILDhEQUE4RDtZQUM5RCxNQUFNLGVBQWUsR0FBRyxpQkFBaUIsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUM7WUFDN0UsaUJBQWlCLENBQUMsU0FBUyxHQUFHLENBQUMsRUFBRSxFQUFFLEVBQUU7Z0JBQ2pDLE1BQU0sQ0FBQyxNQUFNLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDakUsZUFBZSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDMUIsQ0FBQyxDQUFDO1lBRUYsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDeEQsQ0FBQztRQUNELE9BQU8sR0FBRyxFQUFFLENBQUM7WUFDVCxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZCLENBQUM7SUFDTCxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFUCxNQUFNLFFBQVEsR0FBRztRQUNiLEdBQUcsQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDO1FBQ3RCLEtBQUssQ0FBQyxhQUFhLENBQUMsb0JBQW9CLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUM7UUFDMUQsR0FBRyxDQUFDLFlBQVksSUFBSSxFQUFFLENBQUM7UUFDdkIsR0FBRyxDQUFDLGtCQUFrQixJQUFJLEVBQUUsQ0FBQztLQUNoQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRWpCLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxlQUFlLElBQUksS0FBSyxFQUFFLEVBQUUsRUFBRSxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDO0FBR0gsTUFBTSxDQUFDLE1BQU0seUJBQXlCLEdBQUcsQ0FDckMsU0FBb0IsRUFDcEIsS0FBVSxFQUNaLEVBQUU7SUFDQSxNQUFNLFFBQVEsR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3BDLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQztJQUVqQixLQUFLLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRTtRQUNqQixvQ0FBb0M7UUFDcEMsSUFBSSxhQUE2QixDQUFDO1FBQ2xDLElBQUksR0FBbUIsQ0FBQztRQUN4QixDQUFDLEtBQUssSUFBSSxFQUFFO1lBQ1Isd0NBQXdDO1lBQ3hDLEdBQUcsR0FBRyxNQUFNLGlCQUFpQixDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDakQsTUFBTSxJQUFJLEdBQUcsR0FBRyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEVBQUUsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1lBQ3hELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUM7WUFFMUIsTUFBTSxjQUFjLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBRW5DLGtDQUFrQztZQUNsQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1lBQ25CLE1BQU0sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDdkMsK0NBQStDO2dCQUMvQyxJQUFJLENBQUMsWUFBWSxZQUFZLEVBQUUsQ0FBQztvQkFDNUIsYUFBYSxDQUFDLElBQUksQ0FDZCxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FDekQsQ0FBQztnQkFDTixDQUFDO3FCQUNJLENBQUM7b0JBQ0YsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDM0IsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFBO1FBQ04sQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVKLE9BQU8sR0FBRyxFQUFFO1lBQ1IsMENBQTBDO1lBQzFDLGFBQWEsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsV0FBVyxFQUFFLENBQUMsQ0FBQztZQUM5QyxHQUFHLEVBQUUsT0FBTyxFQUFFLENBQUM7UUFDbkIsQ0FBQyxDQUFDO0lBQ04sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQUMsNEZBQTRGO0lBRXBHLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztJQUVmLE9BQU8sS0FBSyxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUNyQyxDQUFDLENBQUEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGNyZWF0ZUFwcGxpY2F0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlcic7XG5pbXBvcnQgKiBhcyBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBmaXJzdFZhbHVlRnJvbSwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5cblxuLy8gZGVjbGFyZSBjb25zdCBab25lO1xuLy8gY29uc3Qgem9uZSA9IFpvbmUgPyBuZXcgWm9uZShab25lLmN1cnJlbnQsIHsgbmFtZTogXCJAZG90Z2xpdGNoX21lbnVcIiwgcHJvcGVydGllczoge30gfSkgOiBudWxsO1xuXG4vKipcbiAqIFdyYXAgYW4gYW5ndWxhciBjb21wb25lbnQgaW5zaWRlIG9mIGEgUmVhY3QgbWVtbyBvYmplY3QuXG4gKiBXaWxsIGF0dGVtcHQgdG8gYmluZCBASW5wdXQgYW5kIEBPdXRwdXQgcHJvcGVydGllcyBpZiBwcm92aWRlZCxcbiAqIGFuZCB3aWxsIGJpbmQgdGhlIHJlYWN0IGFyZ3VtZW50cyBkaXJlY3RseSBhcyBASW5wdXQgcHJvcGVydGllcy5cbiAqXG4gKiBAZXhwZXJpbWVudGFsXG4gKiBAcGFyYW0gY29tcG9uZW50Q2xhc3MgQW5ndWxhciBjb21wb25lbnRcbiAqIEBwYXJhbSBlbnZJbmplY3RvciAgICBBbiBgRW52aXJvbm1lbnRJbmplY3RvcmAgaW5zdGFuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIGNvbXBvbmVudFxuICogQHBhcmFtIGluamVjdG9yICAgICAgIEFuIGBFbGVtZW50SW5qZWN0b3JgIGluc3RhbmNlXG4gKiBAcGFyYW0gX2lucHV0c1xuICogQHBhcmFtIF9vdXRwdXRzXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgY29uc3QgUmVhY3RpZnlSZWFjdENvbXBvbmVudCA9ICh7XG4gICAgY29tcG9uZW50LFxuICAgIGFwcFJlZixcbiAgICBpbmplY3RvcixcbiAgICBuZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzLFxuICAgIHN0YXRpY091dHB1dHMsXG4gICAgcHJlU2libGluZ3MsXG4gICAgcG9zdFNpYmxpbmdzLFxuICAgIGFkZGl0aW9uYWxDaGlsZHJlbixcbiAgICByb290RWxlbWVudE5hbWUsXG4gICAgY29udGFpbmVyRWxlbWVudE5hbWVcbn06IHtcbiAgICBjb21wb25lbnQ6IFR5cGU8YW55PixcbiAgICBhcHBSZWY6IE9taXQ8QXBwbGljYXRpb25SZWYsICdfcnVubmluZ1RpY2snPixcbiAgICBpbmplY3RvcjogSW5qZWN0b3IsXG4gICAgbmdab25lOiBOZ1pvbmUsXG4gICAgc3RhdGljSW5wdXRzPzogeyBba2V5OiBzdHJpbmddOiBhbnk7IH0sXG4gICAgc3RhdGljT3V0cHV0cz86IHsgW2tleTogc3RyaW5nXTogRnVuY3Rpb247IH0sXG4gICAgcHJlU2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBwb3N0U2libGluZ3M/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4/OiBSZWFjdC5SZWFjdE5vZGVbXSxcbiAgICByb290RWxlbWVudE5hbWU/OiBQYXJhbWV0ZXJzPHR5cGVvZiBSZWFjdC5jcmVhdGVFbGVtZW50PlswXSxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZT86IHN0cmluZztcbn0pID0+IFJlYWN0Lm1lbW8oKGFyZ3MpID0+IHtcblxuICAgIGNvbnN0IGlkID0gTWF0aC5yYW5kb20oKS50b1N0cmluZygpO1xuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG5cbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEluc3RhbmNlID0gY3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudCwge1xuICAgICAgICAgICAgICAgIGVudmlyb25tZW50SW5qZWN0b3I6IGFwcFJlZi5pbmplY3RvcixcbiAgICAgICAgICAgICAgICBlbGVtZW50SW5qZWN0b3I6IGluamVjdG9yLFxuICAgICAgICAgICAgICAgIGhvc3RFbGVtZW50OiBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZClcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICAvLyBjb21wb25lbnQuaG9zdFZpZXcgPSBob3N0VmlldztcblxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0aWNJbnB1dHMsIGFyZ3MpO1xuXG4gICAgICAgICAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cyB9ID0gY29tcG9uZW50WyfJtWNtcCddO1xuXG4gICAgICAgICAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiBlbnRyaWVzIHRoYXQgbmVlZCB0byBiZSBzZXRcbiAgICAgICAgICAgIC8vIFRoaXMgbWFrZXMgaXQgc28gdGhhdCB1bm5lY2Vzc2FyeSBzZXR0ZXJzIGFyZSBub3QgaW52b2tlZC5cbiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XSAhPSBzdGF0aWNJbnB1dHNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB1cGRhdGVkLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0aWNJbnB1dHMuaGFzT3duUHJvcGVydHkocGFyZW50S2V5KSlcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldID0gc3RhdGljSW5wdXRzW3BhcmVudEtleV07XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgY29uc3Qgb3V0cHV0U3Vic2NyaXB0aW9uczogeyBba2V5OiBzdHJpbmddOiBTdWJzY3JpcHRpb247IH0gPSB7fTtcbiAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgIGNvbnN0IG5ld091dHB1dHMgPSBPYmplY3QuZW50cmllcyhvdXRwdXRzKS5maWx0ZXIoKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiAhb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgYmluZCB2aWEgc3Vic2NyaXB0aW9uXG4gICAgICAgICAgICBuZXdPdXRwdXRzLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQ6IEV2ZW50RW1pdHRlcjx1bmtub3duPiA9IGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XTtcbiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRzID0gc3RhdGljT3V0cHV0cztcblxuICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gUnVuIHRoZSBjYWxsYmFjayBpbiB0aGUgcHJvdmlkZWQgem9uZVxuICAgICAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7IC8vIFN1YnNjcmlwdGlvblxuXG4gICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIFdyYXAgdGhlIGRlc3Ryb3kgbWV0aG9kIHRvIHNhZmVseSByZWxlYXNlIHRoZSBzdWJzY3JpcHRpb25zXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2Uub25EZXN0cm95ID0gKGNiKSA9PiB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvdXRwdXRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICB9XG4gICAgfSwgW10pO1xuXG4gICAgY29uc3QgZWxlbWVudHMgPSBbXG4gICAgICAgIC4uLihwcmVTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgIFJlYWN0LmNyZWF0ZUVsZW1lbnQoY29udGFpbmVyRWxlbWVudE5hbWUgfHwgXCJkaXZcIiwgeyBpZCB9KSxcbiAgICAgICAgLi4uKHBvc3RTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgIC4uLihhZGRpdGlvbmFsQ2hpbGRyZW4gfHwgW10pXG4gICAgXS5maWx0ZXIoZSA9PiBlKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7fSwgLi4uZWxlbWVudHMpO1xufSk7XG5cblxuZXhwb3J0IGNvbnN0IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDIgPSAoXG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgcHJvcHM6IGFueVxuKSA9PiB7XG4gICAgY29uc3QgaW5wdXRSZWYgPSBSZWFjdC51c2VSZWYobnVsbCk7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuICAgICAgICBsZXQgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9uW107XG4gICAgICAgIGxldCBhcHA6IEFwcGxpY2F0aW9uUmVmO1xuICAgICAgICAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ29kZSB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IG1vdW50c1xuICAgICAgICAgICAgYXBwID0gYXdhaXQgY3JlYXRlQXBwbGljYXRpb24oeyBwcm92aWRlcnM6IFtdIH0pO1xuICAgICAgICAgICAgY29uc3QgYmFzZSA9IGFwcC5ib290c3RyYXAoY29tcG9uZW50LCBpbnB1dFJlZi5jdXJyZW50KTtcbiAgICAgICAgICAgIGNvbnN0IHsgaW5zdGFuY2UgfSA9IGJhc2U7XG5cbiAgICAgICAgICAgIGF3YWl0IGZpcnN0VmFsdWVGcm9tKGFwcC5pc1N0YWJsZSk7XG5cbiAgICAgICAgICAgIC8vIEFwcCBoYXMgbm93IGJvb3RzdHJhcHBlZCBmdWxseS5cbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKGluc3RhbmNlKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIEBPdXRwdXRzIGFyZSBhbHdheXMgRXZlbnQgRW1pdHRlcnMgKEkgdGhpbmspXG4gICAgICAgICAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba10/LnN1YnNjcmliZShldnQgPT4gcHJvcHNba10uY2FsbChjdHgsIGV2dCkpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZVtrXSA9IHByb3BzW2tdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0pKClcblxuICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgLy8gQ29kZSB0byBydW4gd2hlbiB0aGUgY29tcG9uZW50IHVubW91bnRzXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICBhcHA/LmRlc3Ryb3koKTtcbiAgICAgICAgfTtcbiAgICB9LCBbXSk7IC8vIEVtcHR5IGRlcGVuZGVuY3kgYXJyYXkgZW5zdXJlcyB0aGlzIGVmZmVjdCBydW5zIG9ubHkgb25jZSBvbiBtb3VudCBhbmQgY2xlYW51cCBvbiB1bm1vdW50XG5cbiAgICBjb25zdCBvYmogPSB7fTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpXG59XG4iXX0=
252
+ base.changeDetectorRef.detectChanges();
253
+ }
254
+ });
255
+ }
256
+ // These exports exist to attempt to make the API have minimal breaking changes.
257
+ export const ReactifyReactComponent = ReactifyAngularComponent;
258
+ export const ReactifyAngularComponent3 = WrapAngularComponentInReact;
259
+ ;
260
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5ndWxhci10by1yZWFjdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2FuZ3VsYXItdG8tcmVhY3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUEwQyxlQUFlLEVBQUUsWUFBWSxFQUFnRCxNQUFNLGVBQWUsQ0FBQztBQUNwSixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwyQkFBMkIsQ0FBQztBQUM5RCxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFnQixNQUFNLE1BQU0sQ0FBQztBQUdwRDs7Ozs7Ozs7OztHQVVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsQ0FBQyxFQUNyQyxTQUFTLEVBQ1QsTUFBTSxFQUNOLFFBQVEsRUFDUixNQUFNLEVBQ04sWUFBWSxHQUFHLEVBQUUsRUFDakIsYUFBYSxHQUFHLEVBQUUsRUFDbEIsV0FBVyxHQUFHLEVBQUUsRUFDaEIsWUFBWSxHQUFHLEVBQUUsRUFDakIsa0JBQWtCLEdBQUcsRUFBRSxFQUN2QixlQUFlLEdBQUcsRUFBRSxFQUNwQixvQkFBb0IsR0FBRyxFQUFFLEVBYTVCLEVBQUUsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtJQUV0QixPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7UUFDakMsSUFBSSxtQkFBcUQsQ0FBQztRQUMxRCxJQUFJLGlCQUFvQyxDQUFDO1FBRXpDLE1BQU0sbUJBQW1CLEdBQUcsR0FBRyxFQUFFLENBQzdCLGlCQUFpQixFQUFFLGlCQUFpQixFQUFFLGFBQWEsRUFBRSxDQUFDO1FBRTFELHFFQUFxRTtRQUNyRSxnQ0FBZ0M7UUFDaEMsb0NBQW9DO1FBQ3BDLE1BQU0sVUFBVSxHQUEwQyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVB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Q0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQ3pELENBQUM7Z0JBQ04sQ0FBQztxQkFDSSxDQUFDO29CQUNGLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNCLENBQUM7WUFDTCxDQUFDLENBQUMsQ0FBQztZQUVILElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUMzQyxDQUFDO0tBQ0osQ0FBQyxDQUFDO0FBQ1AsQ0FBQztBQUlELGdGQUFnRjtBQUNoRixNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FBRyx3QkFBd0IsQ0FBQztBQUMvRCxNQUFNLENBQUMsTUFBTSx5QkFBeUIsR0FBRywyQkFBMkIsQ0FBQztBQUFBLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUeXBlLCBBcHBsaWNhdGlvblJlZiwgSW5qZWN0b3IsIE5nWm9uZSwgY3JlYXRlQ29tcG9uZW50LCBFdmVudEVtaXR0ZXIsIFByb3ZpZGVyLCBFbnZpcm9ubWVudFByb3ZpZGVycywgQ29tcG9uZW50UmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVBcHBsaWNhdGlvbiB9IGZyb20gJ0Bhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXInO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgZmlyc3RWYWx1ZUZyb20sIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuXG5cbi8qKlxuICogV3JhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCBpbnNpZGUgb2YgYSBSZWFjdCBtZW1vIG9iamVjdC5cbiAqIFdpbGwgYXR0ZW1wdCB0byBiaW5kIEBJbnB1dCBhbmQgQE91dHB1dCBwcm9wZXJ0aWVzIGlmIHByb3ZpZGVkLFxuICogYW5kIHdpbGwgYmluZCB0aGUgcmVhY3QgYXJndW1lbnRzIGRpcmVjdGx5IGFzIEBJbnB1dCBwcm9wZXJ0aWVzLlxuICpcbiAqIFVzYWdlOiBBbiBBbmd1bGFyIHRvcC1sZXZlbCBhcHBsaWNhdGlvbiB3aXRoIGEgUmVhY3RpZnlOZ0NvbXBvbmVudCByZWFjdCBpbXBsZW1lbnRhdGlvblxuICogdGhhdCBuZWVkcyB0byBlbWJlZCBBbmd1bGFyIGNvbXBvbmVudHMgYXMgY2hpbGRyZW4gb2YgdGhlIHJlYWN0LXdyYXBwZWQgY29tcG9uZW50LlxuICpcbiAqIFRoaXMgaXMgcmVwbGFjZWQgYnkgYFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdGAuXG4gKiBAZGVwcmVjYXRlZFxuICovXG5leHBvcnQgY29uc3QgUmVhY3RpZnlBbmd1bGFyQ29tcG9uZW50ID0gKHtcbiAgICBjb21wb25lbnQsXG4gICAgYXBwUmVmLFxuICAgIGluamVjdG9yLFxuICAgIG5nWm9uZSxcbiAgICBzdGF0aWNJbnB1dHMgPSB7fSxcbiAgICBzdGF0aWNPdXRwdXRzID0ge30sXG4gICAgcHJlU2libGluZ3MgPSBbXSxcbiAgICBwb3N0U2libGluZ3MgPSBbXSxcbiAgICBhZGRpdGlvbmFsQ2hpbGRyZW4gPSBbXSxcbiAgICByb290RWxlbWVudE5hbWUgPSAnJyxcbiAgICBjb250YWluZXJFbGVtZW50TmFtZSA9ICcnXG59OiB7XG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgYXBwUmVmOiBPbWl0PEFwcGxpY2F0aW9uUmVmLCAnX3J1bm5pbmdUaWNrJz4sXG4gICAgaW5qZWN0b3I6IEluamVjdG9yLFxuICAgIG5nWm9uZTogTmdab25lLFxuICAgIHN0YXRpY0lucHV0cz86IHsgW2tleTogc3RyaW5nXTogYW55OyB9LFxuICAgIHN0YXRpY091dHB1dHM/OiB7IFtrZXk6IHN0cmluZ106IEZ1bmN0aW9uOyB9LFxuICAgIHByZVNpYmxpbmdzPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgcG9zdFNpYmxpbmdzPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgYWRkaXRpb25hbENoaWxkcmVuPzogUmVhY3QuUmVhY3ROb2RlW10sXG4gICAgcm9vdEVsZW1lbnROYW1lPzogUGFyYW1ldGVyczx0eXBlb2YgUmVhY3QuY3JlYXRlRWxlbWVudD5bMF0sXG4gICAgY29udGFpbmVyRWxlbWVudE5hbWU/OiBzdHJpbmc7XG59KSA9PiBSZWFjdC5tZW1vKChhcmdzKSA9PiB7XG5cbiAgICByZXR1cm4gbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgbGV0IG91dHB1dFN1YnNjcmlwdGlvbnM6IHsgW2tleTogc3RyaW5nXTogU3Vic2NyaXB0aW9uOyB9O1xuICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gICAgICAgIGNvbnN0IHRyaXBDaGFuZ2VEZXRlY3Rpb24gPSAoKSA9PlxuICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmNoYW5nZURldGVjdG9yUmVmPy5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgLy8gVGhlc2UgYXR0cmlidXRlcyB3aWxsIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbiB3aGVuIHRoZXkgZmlyZSBmcm9tXG4gICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIFJlYWN0IGVsZW1lbnQuXG4gICAgICAgIC8vIC4uLiBUaGlzIHdpbGwgYnJlYWsgdGhpbmdzLiBGVUNLLlxuICAgICAgICBjb25zdCBhdHRyaWJ1dGVzOiBBcnJheTxrZXlvZiBSZWFjdC5ET01BdHRyaWJ1dGVzPGFueT4+ID0gWydvbkNvcHknLCAnb25DdXQnLCAnb25QYXN0ZScsICdvbkFib3J0JywgJ29uQmx1cicsICdvbkZvY3VzJywgJ29uQ2FuUGxheScsICdvbkNhblBsYXlUaHJvdWdoJywgJ29uQ2hhbmdlJywgJ29uQ2xpY2snLCAnb25Db250ZXh0TWVudScsICdvbkRvdWJsZUNsaWNrJywgJ29uRHJhZycsICdvbkRyYWdFbmQnLCAnb25EcmFnRW50ZXInLCAnb25EcmFnTGVhdmUnLCAnb25EcmFnT3ZlcicsICdvbkRyYWdTdGFydCcsICdvbkRyb3AnLCAnb25EdXJhdGlvbkNoYW5nZScsICdvbkVtcHRpZWQnLCAnb25FbmRlZCcsICdvbklucHV0JywgJ29uSW52YWxpZCcsICdvbktleURvd24nLCAnb25LZXlQcmVzcycsICdvbktleVVwJywgJ29uTG9hZCcsICdvbkxvYWRlZERhdGEnLCAnb25Mb2FkZWRNZXRhZGF0YScsICdvbkxvYWRTdGFydCcsICdvbk1vdXNlRG93bicsICdvbk1vdXNlRW50ZXInLCAnb25Nb3VzZUxlYXZlJywgJ29uTW91c2VNb3ZlJywgJ29uTW91c2VPdXQnLCAnb25Nb3VzZU92ZXInLCAnb25Nb3VzZVVwJywgJ29uUGF1c2UnLCAnb25QbGF5JywgJ29uUGxheWluZycsICdvblByb2dyZXNzJywgJ29uUmF0ZUNoYW5nZScsICdvblJlc2V0JywgJ29uU2Nyb2xsJywgJ29uU2Vla2VkJywgJ29uU2Vla2luZycsICdvblNlbGVjdCcsICdvblN0YWxsZWQnLCAnb25TdWJtaXQnLCAnb25TdXNwZW5kJywgJ29uVGltZVVwZGF0ZScsICdvblZvbHVtZUNoYW5nZScsICdvbldhaXRpbmcnLCAnb25FcnJvciddO1xuXG4gICAgICAgIGNvbnN0IGF0dHJPYmogPSB7fTtcbiAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGEgPT4gYXR0ck9ialthXSA9IHRyaXBDaGFuZ2VEZXRlY3Rpb24pO1xuXG4gICAgICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvZGUgdG8gcnVuIHdoZW4gdGhlIGNvbXBvbmVudCB1bm1vdW50c1xuICAgICAgICAgICAgICAgIGFwcFJlZj8uZGV0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyhvdXRwdXRTdWJzY3JpcHRpb25zKS5mb3JFYWNoKHMgPT4gcy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZT8uZGVzdHJveSgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSwgW10pO1xuXG5cbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSBbXG4gICAgICAgICAgICAuLi4ocHJlU2libGluZ3MgfHwgW10pLFxuICAgICAgICAgICAgUmVhY3QuY3JlYXRlRWxlbWVudChjb250YWluZXJFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7XG4gICAgICAgICAgICAgICAgLi4uYXR0ck9iaixcbiAgICAgICAgICAgICAgICByZWY6IG5vZGUgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGlucHV0cywgb3V0cHV0cyB9ID0gY29tcG9uZW50WyfJtWNtcCddO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRJbnN0YW5jZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IG5vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKHN0YXRpY0lucHV0cywgYXJncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIGVudHJpZXMgdGhhdCBuZWVkIHRvIGJlIHNldFxuICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG1ha2VzIGl0IHNvIHRoYXQgdW5uZWNlc3Nhcnkgc2V0dGVycyBhcmUgbm90IGludm9rZWQuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0ZWQgPSBPYmplY3QuZW50cmllcyhpbnB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldICE9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB1cGRhdGVkLmZvckVhY2goKFtwYXJlbnRLZXksIGNoaWxkS2V5XTogW3N0cmluZywgc3RyaW5nXSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRpY0lucHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlLmluc3RhbmNlW2NoaWxkS2V5XSA9IHN0YXRpY0lucHV0c1twYXJlbnRLZXldO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdWJzY3JpcHRpb25zID0ge307XG4gICAgICAgICAgICAgICAgICAgIC8vIEdldCBhIGxpc3Qgb2YgdW5yZWdpc3RlcmVkIG91dHB1dHNcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T3V0cHV0cyA9IE9iamVjdC5lbnRyaWVzKG91dHB1dHMpLmZpbHRlcigoW3BhcmVudEtleSwgY2hpbGRLZXldOiBbc3RyaW5nLCBzdHJpbmddKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIW91dHB1dFN1YnNjcmlwdGlvbnNbcGFyZW50S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmV2ZXJzZSBiaW5kIHZpYSBzdWJzY3JpcHRpb25cbiAgICAgICAgICAgICAgICAgICAgbmV3T3V0cHV0cy5mb3JFYWNoKChbcGFyZW50S2V5LCBjaGlsZEtleV06IFtzdHJpbmcsIHN0cmluZ10pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhdGljT3V0cHV0cy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRLZXkpKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldDogRXZlbnRFbWl0dGVyPHVua25vd24+ID0gY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2VbY2hpbGRLZXldO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0cyA9IHN0YXRpY091dHB1dHM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YiA9IHRhcmdldC5zdWJzY3JpYmUoKC4uLmFyZ3MpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSdW4gdGhlIGNhbGxiYWNrIGluIHRoZSBwcm92aWRlZCB6b25lXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdab25lLnJ1bigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dHNbcGFyZW50S2V5XSguLi5hcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pOyAvLyBTdWJzY3JpcHRpb25cblxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3Vic2NyaXB0aW9uc1twYXJlbnRLZXldID0gc3ViO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBkZXN0cm95IG1ldGhvZCB0byBzYWZlbHkgcmVsZWFzZSB0aGUgc3Vic2NyaXB0aW9uc1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBvcmlnaW5hbERlc3Ryb3kgPSBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3k/LmJpbmQoY29tcG9uZW50SW5zdGFuY2UpO1xuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5vbkRlc3Ryb3kgPSAoY2IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC52YWx1ZXMob3V0cHV0U3Vic2NyaXB0aW9ucykuZm9yRWFjaChzID0+IHMudW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbERlc3Ryb3k/LihjYik7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLi4uKHBvc3RTaWJsaW5ncyB8fCBbXSksXG4gICAgICAgICAgICAuLi4oYWRkaXRpb25hbENoaWxkcmVuIHx8IFtdKVxuICAgICAgICBdLmZpbHRlcihlID0+IGUpO1xuXG4gICAgICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KHJvb3RFbGVtZW50TmFtZSB8fCBcImRpdlwiLCB7fSwgLi4uZWxlbWVudHMpO1xuICAgIH0pO1xufSk7XG5cblxuLyoqXG4gKiBEbyBub3QgdXNlIHRoaXMuXG4gKiBAaGlkZGVuXG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjb25zdCBuZzJSZWFjdFByb3BzID0gKG9iaiA9IHt9KSA9PiB7XG4gICAgY29uc3QgcHJvcHMgPSB7fTtcbiAgICBPYmplY3QuZW50cmllcyhvYmopLmZvckVhY2goKFtrLCB2XSkgPT4ge1xuICAgICAgICAvLyBPbWl0IHRoaW5ncyBwcmVmaXhlZCB3aXRoIGFuIHVuZGVyc2NvcmVcbiAgICAgICAgaWYgKGsuc3RhcnRzV2l0aCgnXycpKSByZXR1cm47XG5cbiAgICAgICAgLy8gT21pdCBvdXRwdXQgZXZlbnQgZW1pdHRlcnNcbiAgICAgICAgaWYgKHYgaW5zdGFuY2VvZiBFdmVudEVtaXR0ZXIpIHtcbiAgICAgICAgICAgIHByb3BzW2tdID0gKC4uLmFyZ3MpID0+IHYuZW1pdChbYXJnc10pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJvcHNba10gPSB2O1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIHByb3BzO1xufTtcblxuLyoqXG4gKiBUaGlzIG1ldGhvZCB3aWxsIGNyZWF0ZSBhIFJlYWN0IGNvbXBvbmVudCB0aGF0XG4gKiB3cmFwcyBhbiBBbmd1bGFyIGNvbXBvbmVudC5cbiAqIEByZXR1cm5zIFJlYWN0Lk5hbWVkRXhvdGljQ29tcG9uZW50XG4gKlxuICogQGhpZGRlblxuICogQGV4cGVyaW1lbnRhbFxuICovXG5leHBvcnQgZnVuY3Rpb24gV3JhcEFuZ3VsYXJDb21wb25lbnRJblJlYWN0KHtcbiAgICBjb21wb25lbnQsXG4gICAgbmdab25lLFxuICAgIGFwcFJlZixcbiAgICBpbmplY3RvcixcbiAgICBwcm9wcyxcbiAgICBjb250YWluZXJUYWcsXG4gICAgcmVhY3RUZW1wbGF0ZSxcbiAgICBwcm9qZWN0YWJsZU5vZGVzXG59OiB7XG4gICAgLyoqXG4gICAgICogQW5ndWxhciBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQgd2l0aGluIFJlYWN0XG4gICAgICovXG4gICAgY29tcG9uZW50OiBUeXBlPGFueT4sXG4gICAgLyoqXG4gICAgICogQW5ndWxhciBBcHBsaWNhdGlvbiBSZWZlcmVuY2UuIFVzZWQgZm9yIGJvb3RzdHJhcHBpbmdcbiAgICAgKiBhbmQgY2hhbmdlIGRldGVjdGlvbiBoaWVyYXJjaHkuXG4gICAgICovXG4gICAgYXBwUmVmOiBPbWl0PEFwcGxpY2F0aW9uUmVmLCAnX3J1bm5pbmdUaWNrJz4sXG4gICAgLyoqXG4gICAgICogSW5zdGFuY2Ugb2YgTmdab25lIGNsYXNzLlxuICAgICAqIFZlcnkgaW1wb3J0YW50IHRvIHByZXZlbnQgWm9uZS5qcyBldmVudCBwZXJmb3JtYW5jZSBpc3N1ZXMuXG4gICAgICogRG8gbm90IHNldCBpZiBydW5uaW5nIFpvbmVsZXNzIENELlxuICAgICAqL1xuICAgIG5nWm9uZT86IE5nWm9uZSxcbiAgICAvKipcbiAgICAgKiBTdGF0aWMgcHJvcGVydGllcyB0byBiZSBwYXNzZWQgaW50byB0aGUgQW5ndWxhciBpbnN0YW5jZS5cbiAgICAgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyBldmVudCBwcm94aWVzIGZvciBBbmd1bGFyIEV2ZW50RW1pdHRlcnMuXG4gICAgICovXG4gICAgcHJvcHM/OiBSZWNvcmQ8c3RyaW5nLCBhbnk+LFxuICAgIC8qKlxuICAgICAqIExvY2FsIEVsZW1lbnQgSW5qZWN0b3IgcHJvdmlkZWQgdG8gdGhlIEFuZ3VsYXIgb2JqZWN0XG4gICAgICovXG4gICAgaW5qZWN0b3I/OiBJbmplY3RvcixcbiAgICAvKipcbiAgICAgKiBIVE1MIFRhZyBmb3IgdGhlIGNyZWF0ZWQgRE9NIHdyYXBwZXIuIERlZmF1bHRzIHRvIGBkaXZgLlxuICAgICAqL1xuICAgIGNvbnRhaW5lclRhZz86IHN0cmluZyxcbiAgICAvKipcbiAgICAgKiBSZWFjdCBGdW5jdGlvbiB0ZW1wbGF0ZVxuICAgICAqL1xuICAgIHJlYWN0VGVtcGxhdGU/OiAoZWw6IFJlYWN0LlJlYWN0RWxlbWVudCkgPT4gUmVhY3QuUmVhY3RFbGVtZW50O1xuICAgIC8qKlxuICAgICAqIE5vZGVzIHRvIGJlIHBhc3NlZCB0byB0aGUgYG5nLWNvbnRlbnRgIG9mIHRoZSBjaGlsZCBBbmd1bGFyIGNvbXBvbmVudC5cbiAgICAgKi9cbiAgICBwcm9qZWN0YWJsZU5vZGVzPzogTm9kZVtdW107XG59KSB7XG4gICAgcHJvcHMgPz89IHt9O1xuICAgIGNvbnRhaW5lclRhZyA/Pz0gJ2Rpdic7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIGNvbnN0IGNyZWF0ZVdyYXBwZWRFbGVtZW50ID0gKCkgPT4ge1xuICAgICAgICAvLyBJcyB0aGVyZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpcz9cbiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbltdO1xuICAgICAgICBsZXQgY29tcG9uZW50SW5zdGFuY2U6IENvbXBvbmVudFJlZjxhbnk+O1xuXG4gICAgICAgIHJlYWN0VGVtcGxhdGUgPz89IChlbCkgPT4gZWw7XG4gICAgICAgIHJldHVybiBSZWFjdC5tZW1vKChhcmdzKSA9PiB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHByb3BzLCBhcmdzKTtcblxuICAgICAgICAgICAgUmVhY3QudXNlRWZmZWN0KCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIGFuZCBkaXNwb3NlIGxlZnRvdmVyIEFuZ3VsYXIgb2JqZWN0c1xuICAgICAgICAgICAgICAgICAgICBhcHBSZWY/LmRldGFjaFZpZXcoY29tcG9uZW50SW5zdGFuY2UuaG9zdFZpZXcpO1xuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zPy5mb3JFYWNoKHMgPT4gcz8udW5zdWJzY3JpYmUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudEluc3RhbmNlPy5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH0sIFtdKTtcblxuICAgICAgICAgICAgY29uc3QgdHJpcENoYW5nZURldGVjdGlvbiA9ICgpID0+XG4gICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2U/LmNoYW5nZURldGVjdG9yUmVmPy5kZXRlY3RDaGFuZ2VzKCk7XG5cbiAgICAgICAgICAgIC8vIFRoZXNlIGF0dHJpYnV0ZXMgd2lsbCB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24gd2hlbiB0aGV5IGZpcmUgZnJvbVxuICAgICAgICAgICAgLy8gdGhlIHVuZGVybHlpbmcgUmVhY3QgZWxlbWVudC5cbiAgICAgICAgICAgIC8vIC4uLiBUaGlzIHdpbGwgYnJlYWsgdGhpbmdzLiBGVUNLLlxuICAgICAgICAgICAgY29uc3QgYXR0cmlidXRlczogQXJyYXk8a2V5b2YgUmVhY3QuRE9NQXR0cmlidXRlczxhbnk+PiA9IFsnb25Db3B5JywgJ29uQ3V0JywgJ29uUGFzdGUnLCAnb25BYm9ydCcsICdvbkJsdXInLCAnb25Gb2N1cycsICdvbkNhblBsYXknLCAnb25DYW5QbGF5VGhyb3VnaCcsICdvbkNoYW5nZScsICdvbkNsaWNrJywgJ29uQ29udGV4dE1lbnUnLCAnb25Eb3VibGVDbGljaycsICdvbkRyYWcnLCAnb25EcmFnRW5kJywgJ29uRHJhZ0VudGVyJywgJ29uRHJhZ0xlYXZlJywgJ29uRHJhZ092ZXInLCAnb25EcmFnU3RhcnQnLCAnb25Ecm9wJywgJ29uRHVyYXRpb25DaGFuZ2UnLCAnb25FbXB0aWVkJywgJ29uRW5kZWQnLCAnb25JbnB1dCcsICdvbkludmFsaWQnLCAnb25LZXlEb3duJywgJ29uS2V5UHJlc3MnLCAnb25LZXlVcCcsICdvbkxvYWQnLCAnb25Mb2FkZWREYXRhJywgJ29uTG9hZGVkTWV0YWRhdGEnLCAnb25Mb2FkU3RhcnQnLCAnb25Nb3VzZURvd24nLCAnb25Nb3VzZUVudGVyJywgJ29uTW91c2VMZWF2ZScsICdvbk1vdXNlTW92ZScsICdvbk1vdXNlT3V0JywgJ29uTW91c2VPdmVyJywgJ29uTW91c2VVcCcsICdvblBhdXNlJywgJ29uUGxheScsICdvblBsYXlpbmcnLCAnb25Qcm9ncmVzcycsICdvblJhdGVDaGFuZ2UnLCAnb25SZXNldCcsICdvblNjcm9sbCcsICdvblNlZWtlZCcsICdvblNlZWtpbmcnLCAnb25TZWxlY3QnLCAnb25TdGFsbGVkJywgJ29uU3VibWl0JywgJ29uU3VzcGVuZCcsICdvblRpbWVVcGRhdGUnLCAnb25Wb2x1bWVDaGFuZ2UnLCAnb25XYWl0aW5nJywgJ29uRXJyb3InXTtcblxuICAgICAgICAgICAgY29uc3QgYXR0ck9iaiA9IHt9O1xuICAgICAgICAgICAgYXR0cmlidXRlcy5mb3JFYWNoKGEgPT4gYXR0ck9ialthXSA9IHRyaXBDaGFuZ2VEZXRlY3Rpb24pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVhY3RUZW1wbGF0ZShSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lclRhZywge1xuICAgICAgICAgICAgICAgIC4uLmF0dHJPYmosXG4gICAgICAgICAgICAgICAgcmVmOiBhc3luYyAobm9kZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50SW5zdGFuY2UpIHJldHVybjtcblxuICAgICAgICAgICAgICAgICAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGV2ZXIgYWN0dWFsbHkgaGFwcGVucywgYWRkZWQgYXMgYSBwcmV2ZW50YXRpdmUgbWVhc3VyZVxuICAgICAgICAgICAgICAgICAgICAvLyB0byBtZW1vcnkgbGVha3MuXG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBib290c3RyYXAgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0IHRoZSBBbmd1bGFyIGNvbXBvbmVudCB3aXRoIHRoZSBjb250ZXh0IG9mIHRoZSByb290IEFuZ3VsYXIgYXBwLlxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UgPSBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW52aXJvbm1lbnRJbmplY3RvcjogYXBwUmVmLmluamVjdG9yLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRJbmplY3RvcjogaW5qZWN0b3IsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaG9zdEVsZW1lbnQ6IG5vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGFibGVOb2RlczogcHJvamVjdGFibGVOb2Rlc1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBSZWYuYXR0YWNoVmlldyhjb21wb25lbnRJbnN0YW5jZS5ob3N0Vmlldyk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgbmdab25lPy5ydW5UYXNrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5nWm9uZT8ucnVuVGFzayhib290c3RyYXApXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvb3RzdHJhcCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IGV2ZXJ5dGhpbmcgaGFzIHNldHRsZWQsIGJpbmQgaW5wdXRzIGFuZCBvdXRwdXRzLlxuICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHByb3BzKS5maWx0ZXIoKFtrLCB2XSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gQE91dHB1dHMgYXJlIGFsd2F5cyBFdmVudCBFbWl0dGVycyAoSSB0aGluaylcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9ucy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRJbnN0YW5jZS5pbnN0YW5jZVtrXT8uc3Vic2NyaWJlKGV2dCA9PiBwcm9wc1trXS5jYWxsKGN0eCwgZXZ0KSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50SW5zdGFuY2UuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIHJldHVybiBuZ1pvbmU/LnJ1bk91dHNpZGVBbmd1bGFyXG4gICAgICAgID8gbmdab25lPy5ydW5PdXRzaWRlQW5ndWxhcihjcmVhdGVXcmFwcGVkRWxlbWVudClcbiAgICAgICAgOiBjcmVhdGVXcmFwcGVkRWxlbWVudCgpO1xufVxuXG4vKipcbiAqIFRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSB3cmFwIGFuIEFuZ3VsYXJcbiAqIENvbXBvbmVudCBvciBEaXJlY3RpdmUgaW50byBhIFJlYWN0IG9iamVjdC5cbiAqIEBPdXRwdXRzIChFdmVudEVtaXR0ZXJzKSB3aWxsIGJlIGF1dG9tYXRpY2FsbHlcbiAqIGxpbmtlZCBpbnRvIHRoZSBpbnB1dCBwcm9wZXJ0aWVzIGFsb25nIHdpdGhcbiAqIGFsbCBvZiB0aGUgQElucHV0cy5cbiAqIEByZXR1cm5zIFJlYWN0Lk5hbWVkRXhvdGljQ29tcG9uZW50XG4gKiBAZXhwZXJpbWVudGFsXG4gKi9cbmV4cG9ydCBjb25zdCBBdXRvV3JhcEFuZ3VsYXJPYmplY3QgPSAoe1xuICAgIGNvbXBvbmVudCxcbiAgICBhcHBSZWYsXG4gICAgbmdab25lLFxuICAgIGluc3RhbmNlLFxuICAgIGluamVjdG9yLFxuICAgIGNvbnRhaW5lclRhZyxcbiAgICByZWFjdFRlbXBsYXRlLFxufTogKFBhcmFtZXRlcnM8dHlwZW9mIFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdD5bMF0gJiB7XG4gICAgLyoqXG4gICAgICogQW5ndWxhciBDb21wb25lbnQvRGlyZWN0aXZlIGluc3RhbmNlIHRoYXQgd2lsbCBoYXZlIHByb3BlcnRpZXMgYm91bmQgdG8gdGhlIGNyZWF0ZWRcbiAgICAgKi9cbiAgICBpbnN0YW5jZT86IEluc3RhbmNlVHlwZTxUeXBlPGFueT4+IHwgUmVjb3JkPHN0cmluZywgYW55PixcblxufSkpID0+IHtcbiAgICBjb25zdCBwcm9wcyA9IG5nMlJlYWN0UHJvcHMoaW5zdGFuY2UpO1xuXG4gICAgcmV0dXJuIFdyYXBBbmd1bGFyQ29tcG9uZW50SW5SZWFjdCh7XG4gICAgICAgIGNvbXBvbmVudCxcbiAgICAgICAgbmdab25lLFxuICAgICAgICBhcHBSZWYsXG4gICAgICAgIGluamVjdG9yLFxuICAgICAgICBjb250YWluZXJUYWcsXG4gICAgICAgIHByb3BzLFxuICAgICAgICByZWFjdFRlbXBsYXRlXG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEJvb3RzdHJhcCBhbiBBbmd1bGFyIGNvbXBvbmVudCB3aXRoIGBjcmVhdGVBcHBsaWNhdGlvbmAgYW5kIGV4cG9ydCBpdCB1bmRlciBhXG4gKiByZWFjdCBFbGVtZW50LlxuICogVXNhZ2U6IFJlYWN0IHRvcC1sZXZlbCBhcHBsaWNhdGlvbiBlbWJlZGRpbmcgYW4gQW5ndWxhciBjb21wb25lbnQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBSZWFjdGlmeVN0YW5kYWxvbmVBbmd1bGFyQ29tcG9uZW50KFxuICAgIGNvbXBvbmVudDogVHlwZTxhbnk+LFxuICAgIHByb3BzOiBhbnkgPSB7fSxcbiAgICBwcm92aWRlcnM6IChQcm92aWRlciB8IEVudmlyb25tZW50UHJvdmlkZXJzKVtdID0gW10sXG4gICAgY29udGFpbmVyVGFnOiBzdHJpbmcgPSAnZGl2J1xuKSB7XG4gICAgY29uc3QgY3R4ID0gdGhpcztcblxuICAgIC8vIElzIHRoZXJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzP1xuICAgIGxldCBzdWJzY3JpcHRpb25zOiBTdWJzY3JpcHRpb25bXTtcbiAgICBsZXQgYXBwOiBBcHBsaWNhdGlvblJlZjtcblxuICAgIFJlYWN0LnVzZUVmZmVjdCgoKSA9PiB7XG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgICAvLyBDb2RlIHRvIHJ1biB3aGVuIHRoZSBjb21wb25lbnQgdW5tb3VudHNcbiAgICAgICAgICAgIHN1YnNjcmlwdGlvbnM/LmZvckVhY2gocyA9PiBzPy51bnN1YnNjcmliZSgpKTtcbiAgICAgICAgICAgIGFwcD8uZGVzdHJveSgpO1xuICAgICAgICB9O1xuICAgIH0sIFtdKTtcblxuICAgIHJldHVybiBSZWFjdC5jcmVhdGVFbGVtZW50KGNvbnRhaW5lclRhZywge1xuICAgICAgICByZWY6IGFzeW5jIChub2RlKSA9PiB7XG4gICAgICAgICAgICAvLyBOb3Qgc3VyZSBpZiB0aGlzIGV2ZXIgYWN0dWFsbHkgaGFwcGVucywgYWRkZWQgYXMgYSBwcmV2ZW50YXRpdmUgbWVhc3VyZVxuICAgICAgICAgICAgLy8gdG8gbWVtb3J5IGxlYWtzLlxuICAgICAgICAgICAgc3Vic2NyaXB0aW9ucz8uZm9yRWFjaChzID0+IHM/LnVuc3Vic2NyaWJlKCkpO1xuICAgICAgICAgICAgYXBwPy5kZXN0cm95KCk7XG5cbiAgICAgICAgICAgIC8vIEluaXQgYW4gQW5ndWxhciBhcHBsaWNhdGlvbiByb290ICYgYm9vdHN0cmFwIGl0IHRvIGEgRE9NIGVsZW1lbnQuXG4gICAgICAgICAgICBhcHAgPSBhd2FpdCBjcmVhdGVBcHBsaWNhdGlvbih7IHByb3ZpZGVycyB9KTtcbiAgICAgICAgICAgIGNvbnN0IGJhc2UgPSBhcHAuYm9vdHN0cmFwKGNvbXBvbmVudCwgbm9kZSk7XG4gICAgICAgICAgICBjb25zdCB7IGluc3RhbmNlIH0gPSBiYXNlO1xuXG5cbiAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBKUyB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCBpbml0aW5nLlxuICAgICAgICAgICAgYXdhaXQgZmlyc3RWYWx1ZUZyb20oYXBwLmlzU3RhYmxlKTtcblxuICAgICAgICAgICAgLy8gTm93IHRoYXQgZXZlcnl0aGluZyBoYXMgc2V0dGxlZCwgYmluZCBpbnB1dHMgYW5kIG91dHB1dHMuXG4gICAgICAgICAgICBzdWJzY3JpcHRpb25zID0gW107XG4gICAgICAgICAgICBPYmplY3QuZW50cmllcyhwcm9wcykuZmlsdGVyKChbaywgdl0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBAT3V0cHV0cyBhcmUgYWx3YXlzIEV2ZW50IEVtaXR0ZXJzIChJIHRoaW5rKVxuICAgICAgICAgICAgICAgIGlmICh2IGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbnMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlW2tdPy5zdWJzY3JpYmUoZXZ0ID0+IHByb3BzW2tdLmNhbGwoY3R4LCBldnQpKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2Vba10gPSBwcm9wc1trXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgYmFzZS5jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn1cblxuXG5cbi8vIFRoZXNlIGV4cG9ydHMgZXhpc3QgdG8gYXR0ZW1wdCB0byBtYWtlIHRoZSBBUEkgaGF2ZSBtaW5pbWFsIGJyZWFraW5nIGNoYW5nZXMuXG5leHBvcnQgY29uc3QgUmVhY3RpZnlSZWFjdENvbXBvbmVudCA9IFJlYWN0aWZ5QW5ndWxhckNvbXBvbmVudDtcbmV4cG9ydCBjb25zdCBSZWFjdGlmeUFuZ3VsYXJDb21wb25lbnQzID0gV3JhcEFuZ3VsYXJDb21wb25lbnRJblJlYWN0OztcbiJdfQ==
@@ -1,23 +1,48 @@
1
- import { Component } from '@angular/core';
1
+ import { Component, EventEmitter } from '@angular/core';
2
2
  import * as React from 'react';
3
3
  import { createRoot } from 'react-dom/client';
4
4
  import * as i0 from "@angular/core";
5
5
  /**
6
- * Extend this component to automatically generate
7
- * bindings to a React component.
6
+ * This component can be used to automatically wrap a React
7
+ * component into Angular bindings with functional change detection.
8
+ * All you need to provide is the @Input and @Output interface
9
+ * for the component in order to tell Angular which keys correspond to what.
10
+ *
11
+ * ### You _must_ override the property `ngReactComponent`.
8
12
  *
9
- * ! You _must_ override the property `ngReactComponent`
10
13
  * Failure to do so will result in errors
11
- * `override readonly ngReactComponent = ReactFlowWrappableComponent;`
14
+ *
15
+ * `override readonly ngReactComponent = SomeReactFunction;`
16
+ *
17
+ * Example:
18
+ *
19
+ * ```ts
20
+ * @Component({
21
+ * selector: "app-react-wrapped",
22
+ * standalone: true
23
+ * })
24
+ * export class MyReactWrappedComponent extends ReactifyNgComponent {
25
+ *
26
+ * @Input() data: any;
27
+ * @Input() options: any;
28
+ * @Input() version: any;
29
+ *
30
+ * // Notice how we wrap the result in an array, this is important because
31
+ * // React can pass multiple properties to a callback and Angular can't.
32
+ * @Output() onClick = new EventEmitter<[any]>();
33
+ *
34
+ * }
35
+ * ```
12
36
  */
13
37
  export class ReactifyNgComponent {
14
38
  constructor(ngContainer, ngZone) {
15
39
  this.ngContainer = ngContainer;
16
40
  this.ngZone = ngZone;
41
+ this._props = {};
17
42
  }
18
43
  ngOnInit() {
19
44
  if (!this.ngReactComponent) {
20
- throw new Error("ReactMagicWrapperComponent cannot start without a provided ngReactComponent!");
45
+ throw new Error("ReactifyNgComponent cannot be inherited without a provided ngReactComponent!");
21
46
  }
22
47
  }
23
48
  ngOnChanges(changes) {
@@ -41,35 +66,35 @@ export class ReactifyNgComponent {
41
66
  // List all keys that do not start with `_` nor `ng`
42
67
  const keys = Object.keys(this).filter(k => !/^(?:_|ng)/.test(k));
43
68
  // Get all property keys from the class
44
- const propKeys = keys.filter(k => !k.startsWith("on"));
69
+ const propKeys = keys.filter(k => !(this[k] instanceof EventEmitter));
45
70
  // Get all event handler keys from the class
46
- const evtKeys = keys.filter(k => k.startsWith("on"));
47
- const props = {};
71
+ const evtKeys = keys.filter(k => this[k] instanceof EventEmitter);
48
72
  // Project all key properties onto `props`
49
- propKeys.forEach(k => props[k] = this[k]);
73
+ propKeys.forEach(k => this._props[k] = this[k]);
50
74
  // Attempt to ensure no zone is lost during the event emitter fires
51
75
  this.ngZone.runGuarded(() => {
52
76
  // Bind all event handlers.
53
77
  // ! important Angular uses EventEmitter, React uses
54
78
  // a different method of event binding
55
- evtKeys.forEach(k => props[k] = (...args) => this[k].next(args));
79
+ evtKeys.forEach(k => this._props[k] = (...args) => this[k].next(args));
56
80
  });
57
- this._root.render(React.createElement(this.ngReactComponent, { props: props }));
81
+ this._reactElement = React.createElement(this.ngReactComponent, { props: this._props });
82
+ this._root.render(this._reactElement);
58
83
  }
59
84
  catch (err) {
60
85
  console.error(err);
61
86
  }
62
87
  });
63
88
  }
64
- static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
65
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: ReactifyNgComponent, isStandalone: true, selector: "app-react-magic-wrapper", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
89
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, deps: [{ token: i0.ViewContainerRef }, { token: i0.NgZone }], target: i0.ɵɵFactoryTarget.Component }); }
90
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ReactifyNgComponent, isStandalone: true, selector: "ngx-reactify", usesOnChanges: true, ngImport: i0, template: ``, isInline: true }); }
66
91
  }
67
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: ReactifyNgComponent, decorators: [{
92
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ReactifyNgComponent, decorators: [{
68
93
  type: Component,
69
94
  args: [{
70
- selector: 'app-react-magic-wrapper',
95
+ selector: 'ngx-reactify',
71
96
  template: ``,
72
97
  standalone: true
73
98
  }]
74
99
  }], ctorParameters: () => [{ type: i0.ViewContainerRef }, { type: i0.NgZone }] });
75
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQyxTQUFTLEVBQXdLLE1BQU0sZUFBZSxDQUFDO0FBQy9PLE9BQU8sS0FBSyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQy9CLE9BQU8sRUFBRSxVQUFVLEVBQVEsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHcEQ7Ozs7Ozs7R0FPRztBQU1ILE1BQU0sT0FBTyxtQkFBbUI7SUFVNUIsWUFDcUIsV0FBNkIsRUFDN0IsTUFBYztRQURkLGdCQUFXLEdBQVgsV0FBVyxDQUFrQjtRQUM3QixXQUFNLEdBQU4sTUFBTSxDQUFRO0lBRW5DLENBQUM7SUFFRCxRQUFRO1FBQ0osSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE1BQU0sSUFBSSxLQUFLLENBQUMsOEVBQThFLENBQUMsQ0FBQztRQUNwRyxDQUFDO0lBQ0wsQ0FBQztJQUVELFdBQVcsQ0FBQyxPQUF1QjtRQUMvQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELGVBQWU7UUFDWCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVc7UUFDUCxJQUFJLENBQUMsS0FBSyxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxPQUFPO1FBQ1gsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3pCLE9BQU8sQ0FBQyxHQUFHLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtZQUN4RCxPQUFNO1FBQ1YsQ0FBQztRQUFBLENBQUM7UUFFRixJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEdBQUcsRUFBRTtZQUMvQixJQUFJLENBQUM7Z0JBQ0QsSUFBSSxDQUFDLEtBQUssS0FBSyxVQUFVLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBRWxFLG9EQUFvRDtnQkFDcEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFFakUsdUNBQXVDO2dCQUN2QyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZELDRDQUE0QztnQkFDNUMsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFFckQsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO2dCQUNqQiwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRTFDLG1FQUFtRTtnQkFDbkUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFO29CQUN4QiwyQkFBMkI7b0JBQzNCLG9EQUFvRDtvQkFDcEQsc0NBQXNDO29CQUN0QyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckUsQ0FBQyxDQUFDLENBQUE7Z0JBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQzNGLENBQUM7WUFDRCxPQUFNLEdBQUcsRUFBRSxDQUFDO2dCQUNSLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUE7WUFDdEIsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFBO0lBQ04sQ0FBQzs4R0F0RVEsbUJBQW1CO2tHQUFuQixtQkFBbUIsd0dBSGxCLEVBQUU7OzJGQUdILG1CQUFtQjtrQkFML0IsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUseUJBQXlCO29CQUNuQyxRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBBcHBsaWNhdGlvblJlZiwgQ29tcG9uZW50LCBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIEVudmlyb25tZW50SW5qZWN0b3IsIEV2ZW50RW1pdHRlciwgSW5qZWN0b3IsIE5nWm9uZSwgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIFNpbXBsZUNoYW5nZXMsIFR5cGUsIFZpZXdDb250YWluZXJSZWYsIFZpZXdSZWYsIGNyZWF0ZUNvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5cbi8qKlxuICogRXh0ZW5kIHRoaXMgY29tcG9uZW50IHRvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVcbiAqIGJpbmRpbmdzIHRvIGEgUmVhY3QgY29tcG9uZW50LlxuICpcbiAqICEgWW91IF9tdXN0XyBvdmVycmlkZSB0aGUgcHJvcGVydHkgYG5nUmVhY3RDb21wb25lbnRgXG4gKiBGYWlsdXJlIHRvIGRvIHNvIHdpbGwgcmVzdWx0IGluIGVycm9yc1xuICogYG92ZXJyaWRlIHJlYWRvbmx5IG5nUmVhY3RDb21wb25lbnQgPSBSZWFjdEZsb3dXcmFwcGFibGVDb21wb25lbnQ7YFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2FwcC1yZWFjdC1tYWdpYy13cmFwcGVyJyxcbiAgICB0ZW1wbGF0ZTogYGAsXG4gICAgc3RhbmRhbG9uZTogdHJ1ZVxufSlcbmV4cG9ydCBjbGFzcyBSZWFjdGlmeU5nQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkRlc3Ryb3ksIEFmdGVyVmlld0luaXQge1xuXG4gICAgLyoqXG4gICAgICogVGhlIHJlYWN0IGNvbXBvbmVudCB0byBiZSB3cmFwcGVkLlxuICAgICAqICEgTXVzdCBiZSBvdmVycmlkZGVuIGZvciB0aGlzIHdyYXBwZXIgdG8gd29ya1xuICAgICAqL1xuICAgIG5nUmVhY3RDb21wb25lbnQ6IFJlYWN0LkZ1bmN0aW9uQ29tcG9uZW50PGFueT4gfCBSZWFjdC5Db21wb25lbnRDbGFzczxhbnk+O1xuXG4gICAgcHJpdmF0ZSBfcm9vdDogUm9vdDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nQ29udGFpbmVyOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICBwcml2YXRlIHJlYWRvbmx5IG5nWm9uZTogTmdab25lXG4gICAgKSB7XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJSZWFjdE1hZ2ljV3JhcHBlckNvbXBvbmVudCBjYW5ub3Qgc3RhcnQgd2l0aG91dCBhIHByb3ZpZGVkIG5nUmVhY3RDb21wb25lbnQhXCIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlcz86IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBuZ09uRGVzdHJveSgpIHtcbiAgICAgICAgdGhpcy5fcm9vdD8udW5tb3VudCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgX3JlbmRlcigpIHtcbiAgICAgICAgaWYgKCF0aGlzLm5nUmVhY3RDb21wb25lbnQpIHtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiUmVuZGVyIG5vIGNvbXBvbmVudC4gTWF5IGJlIGNvbnRleHQgaXNzdWVcIilcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdCA/Pz0gY3JlYXRlUm9vdCh0aGlzLm5nQ29udGFpbmVyLmVsZW1lbnQubmF0aXZlRWxlbWVudCk7XG5cbiAgICAgICAgICAgICAgICAvLyBMaXN0IGFsbCBrZXlzIHRoYXQgZG8gbm90IHN0YXJ0IHdpdGggYF9gIG5vciBgbmdgXG4gICAgICAgICAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHRoaXMpLmZpbHRlcihrID0+ICEvXig/Ol98bmcpLy50ZXN0KGspKTtcblxuICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgcHJvcGVydHkga2V5cyBmcm9tIHRoZSBjbGFzc1xuICAgICAgICAgICAgICAgIGNvbnN0IHByb3BLZXlzID0ga2V5cy5maWx0ZXIoayA9PiAhay5zdGFydHNXaXRoKFwib25cIikpO1xuICAgICAgICAgICAgICAgIC8vIEdldCBhbGwgZXZlbnQgaGFuZGxlciBrZXlzIGZyb20gdGhlIGNsYXNzXG4gICAgICAgICAgICAgICAgY29uc3QgZXZ0S2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gay5zdGFydHNXaXRoKFwib25cIikpO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgcHJvcHMgPSB7fTtcbiAgICAgICAgICAgICAgICAvLyBQcm9qZWN0IGFsbCBrZXkgcHJvcGVydGllcyBvbnRvIGBwcm9wc2BcbiAgICAgICAgICAgICAgICBwcm9wS2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSB0aGlzW2tdKTtcblxuICAgICAgICAgICAgICAgIC8vIEF0dGVtcHQgdG8gZW5zdXJlIG5vIHpvbmUgaXMgbG9zdCBkdXJpbmcgdGhlIGV2ZW50IGVtaXR0ZXIgZmlyZXNcbiAgICAgICAgICAgICAgICB0aGlzLm5nWm9uZS5ydW5HdWFyZGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQmluZCBhbGwgZXZlbnQgaGFuZGxlcnMuXG4gICAgICAgICAgICAgICAgICAgIC8vICEgaW1wb3J0YW50IEFuZ3VsYXIgdXNlcyBFdmVudEVtaXR0ZXIsIFJlYWN0IHVzZXNcbiAgICAgICAgICAgICAgICAgICAgLy8gYSBkaWZmZXJlbnQgbWV0aG9kIG9mIGV2ZW50IGJpbmRpbmdcbiAgICAgICAgICAgICAgICAgICAgZXZ0S2V5cy5mb3JFYWNoKGsgPT4gcHJvcHNba10gPSAoLi4uYXJncykgPT4gdGhpc1trXS5uZXh0KGFyZ3MpKTtcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgdGhpcy5fcm9vdC5yZW5kZXIoUmVhY3QuY3JlYXRlRWxlbWVudCh0aGlzLm5nUmVhY3RDb21wb25lbnQsIHsgcHJvcHM6IHByb3BzIGFzIGFueSB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhY3QtdG8tYW5ndWxhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3JlYWN0LXRvLWFuZ3VsYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFpQixTQUFTLEVBQUUsWUFBWSxFQUFpRSxNQUFNLGVBQWUsQ0FBQztBQUN0SSxPQUFPLEtBQUssS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMvQixPQUFPLEVBQUUsVUFBVSxFQUFRLE1BQU0sa0JBQWtCLENBQUM7O0FBR3BEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JHO0FBTUgsTUFBTSxPQUFPLG1CQUFtQjtJQWM1QixZQUN1QixXQUE2QixFQUM3QixNQUFjO1FBRGQsZ0JBQVcsR0FBWCxXQUFXLENBQWtCO1FBQzdCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFKN0IsV0FBTSxHQUFXLEVBQUUsQ0FBQztJQU01QixDQUFDO0lBRUQsUUFBUTtRQUNKLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDhFQUE4RSxDQUFDLENBQUM7UUFDcEcsQ0FBQztJQUNMLENBQUM7SUFFRCxXQUFXLENBQUMsT0FBdUI7UUFDL0IsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxlQUFlO1FBQ1gsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDO0lBQ25CLENBQUM7SUFFRCxXQUFXO1FBQ1AsSUFBSSxDQUFDLEtBQUssRUFBRSxPQUFPLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sT0FBTztRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUN6QixPQUFPLENBQUMsR0FBRyxDQUFDLDJDQUEyQyxDQUFDLENBQUE7WUFDeEQsT0FBTTtRQUNWLENBQUM7UUFBQSxDQUFDO1FBRUYsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLEVBQUU7WUFDL0IsSUFBSSxDQUFDO2dCQUNELElBQUksQ0FBQyxLQUFLLEtBQUssVUFBVSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDO2dCQUVsRSxvREFBb0Q7Z0JBQ3BELE1BQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBRWpFLHVDQUF1QztnQkFDdkMsTUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLFlBQVksWUFBWSxDQUFDLENBQUMsQ0FBQztnQkFDdEUsNENBQTRDO2dCQUM1QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxZQUFZLFlBQVksQ0FBQyxDQUFDO2dCQUVsRSwwQ0FBMEM7Z0JBQzFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUVoRCxtRUFBbUU7Z0JBQ25FLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRTtvQkFDeEIsMkJBQTJCO29CQUMzQixvREFBb0Q7b0JBQ3BELHNDQUFzQztvQkFDdEMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO2dCQUMzRSxDQUFDLENBQUMsQ0FBQTtnQkFFRixJQUFJLENBQUMsYUFBYSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLEVBQUUsS0FBSyxFQUFFLElBQUksQ0FBQyxNQUFhLEVBQUUsQ0FBQyxDQUFDO2dCQUMvRixJQUFJLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7WUFDMUMsQ0FBQztZQUNELE9BQU0sR0FBRyxFQUFFLENBQUM7Z0JBQ1IsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUN0QixDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDOytHQTFFUSxtQkFBbUI7bUdBQW5CLG1CQUFtQiw2RkFIbEIsRUFBRTs7NEZBR0gsbUJBQW1CO2tCQUwvQixTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSxjQUFjO29CQUN4QixRQUFRLEVBQUUsRUFBRTtvQkFDWixVQUFVLEVBQUUsSUFBSTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlclZpZXdJbml0LCBDb21wb25lbnQsIEV2ZW50RW1pdHRlciwgTmdab25lLCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgU2ltcGxlQ2hhbmdlcywgVmlld0NvbnRhaW5lclJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0ICogYXMgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgY3JlYXRlUm9vdCwgUm9vdCB9IGZyb20gJ3JlYWN0LWRvbS9jbGllbnQnO1xuXG5cbi8qKlxuICogVGhpcyBjb21wb25lbnQgY2FuIGJlIHVzZWQgdG8gYXV0b21hdGljYWxseSB3cmFwIGEgUmVhY3RcbiAqIGNvbXBvbmVudCBpbnRvIEFuZ3VsYXIgYmluZGluZ3Mgd2l0aCBmdW5jdGlvbmFsIGNoYW5nZSBkZXRlY3Rpb24uXG4gKiBBbGwgeW91IG5lZWQgdG8gcHJvdmlkZSBpcyB0aGUgQElucHV0IGFuZCBAT3V0cHV0IGludGVyZmFjZVxuICogZm9yIHRoZSBjb21wb25lbnQgaW4gb3JkZXIgdG8gdGVsbCBBbmd1bGFyIHdoaWNoIGtleXMgY29ycmVzcG9uZCB0byB3aGF0LlxuICpcbiAqICMjIyBZb3UgX211c3RfIG92ZXJyaWRlIHRoZSBwcm9wZXJ0eSBgbmdSZWFjdENvbXBvbmVudGAuXG4gKlxuICogRmFpbHVyZSB0byBkbyBzbyB3aWxsIHJlc3VsdCBpbiBlcnJvcnNcbiAqXG4gKiBgb3ZlcnJpZGUgcmVhZG9ubHkgbmdSZWFjdENvbXBvbmVudCA9IFNvbWVSZWFjdEZ1bmN0aW9uO2BcbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYHRzXG4gKiAgQENvbXBvbmVudCh7XG4gKiAgICAgIHNlbGVjdG9yOiBcImFwcC1yZWFjdC13cmFwcGVkXCIsXG4gKiAgICAgIHN0YW5kYWxvbmU6IHRydWVcbiAqICB9KVxuICogIGV4cG9ydCBjbGFzcyBNeVJlYWN0V3JhcHBlZENvbXBvbmVudCBleHRlbmRzIFJlYWN0aWZ5TmdDb21wb25lbnQge1xuICpcbiAqICAgICAgQElucHV0KCkgZGF0YTogYW55O1xuICogICAgICBASW5wdXQoKSBvcHRpb25zOiBhbnk7XG4gKiAgICAgIEBJbnB1dCgpIHZlcnNpb246IGFueTtcbiAqXG4gKiAgICAgIC8vIE5vdGljZSBob3cgd2Ugd3JhcCB0aGUgcmVzdWx0IGluIGFuIGFycmF5LCB0aGlzIGlzIGltcG9ydGFudCBiZWNhdXNlXG4gKiAgICAgIC8vIFJlYWN0IGNhbiBwYXNzIG11bHRpcGxlIHByb3BlcnRpZXMgdG8gYSBjYWxsYmFjayBhbmQgQW5ndWxhciBjYW4ndC5cbiAqICAgICAgQE91dHB1dCgpIG9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPFthbnldPigpO1xuICpcbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ25neC1yZWFjdGlmeScsXG4gICAgdGVtcGxhdGU6IGBgLFxuICAgIHN0YW5kYWxvbmU6IHRydWVcbn0pXG5leHBvcnQgY2xhc3MgUmVhY3RpZnlOZ0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25EZXN0cm95LCBBZnRlclZpZXdJbml0IHtcblxuICAgIC8qKlxuICAgICAqIFRoZSByZWFjdCBjb21wb25lbnQgdG8gYmUgd3JhcHBlZC5cbiAgICAgKiAhIE11c3QgYmUgb3ZlcnJpZGRlbiBmb3IgdGhpcyB3cmFwcGVyIHRvIHdvcmtcbiAgICAgKi9cbiAgICBuZ1JlYWN0Q29tcG9uZW50OiBSZWFjdC5GdW5jdGlvbkNvbXBvbmVudDxhbnk+IHwgUmVhY3QuQ29tcG9uZW50Q2xhc3M8YW55PjtcblxuICAgIHByaXZhdGUgX3Jvb3Q6IFJvb3Q7XG5cbiAgICBwcml2YXRlIF9yZWFjdEVsZW1lbnQ6IFJlYWN0LlJlYWN0RWxlbWVudDtcblxuICAgIHByaXZhdGUgX3Byb3BzOiBPYmplY3QgPSB7fTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgbmdDb250YWluZXI6IFZpZXdDb250YWluZXJSZWYsXG4gICAgICAgIHByb3RlY3RlZCByZWFkb25seSBuZ1pvbmU6IE5nWm9uZVxuICAgICkge1xuICAgIH1cblxuICAgIG5nT25Jbml0KCkge1xuICAgICAgICBpZiAoIXRoaXMubmdSZWFjdENvbXBvbmVudCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiUmVhY3RpZnlOZ0NvbXBvbmVudCBjYW5ub3QgYmUgaW5oZXJpdGVkIHdpdGhvdXQgYSBwcm92aWRlZCBuZ1JlYWN0Q29tcG9uZW50IVwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM/OiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3JlbmRlcigpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3Jvb3Q/LnVubW91bnQoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9yZW5kZXIoKSB7XG4gICAgICAgIGlmICghdGhpcy5uZ1JlYWN0Q29tcG9uZW50KSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZyhcIlJlbmRlciBubyBjb21wb25lbnQuIE1heSBiZSBjb250ZXh0IGlzc3VlXCIpXG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoKSA9PiB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QgPz89IGNyZWF0ZVJvb3QodGhpcy5uZ0NvbnRhaW5lci5lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpO1xuXG4gICAgICAgICAgICAgICAgLy8gTGlzdCBhbGwga2V5cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGBfYCBub3IgYG5nYFxuICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzKS5maWx0ZXIoayA9PiAhL14oPzpffG5nKS8udGVzdChrKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBHZXQgYWxsIHByb3BlcnR5IGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wS2V5cyA9IGtleXMuZmlsdGVyKGsgPT4gISh0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKSk7XG4gICAgICAgICAgICAgICAgLy8gR2V0IGFsbCBldmVudCBoYW5kbGVyIGtleXMgZnJvbSB0aGUgY2xhc3NcbiAgICAgICAgICAgICAgICBjb25zdCBldnRLZXlzID0ga2V5cy5maWx0ZXIoayA9PiB0aGlzW2tdIGluc3RhbmNlb2YgRXZlbnRFbWl0dGVyKTtcblxuICAgICAgICAgICAgICAgIC8vIFByb2plY3QgYWxsIGtleSBwcm9wZXJ0aWVzIG9udG8gYHByb3BzYFxuICAgICAgICAgICAgICAgIHByb3BLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9IHRoaXNba10pO1xuXG4gICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byBlbnN1cmUgbm8gem9uZSBpcyBsb3N0IGR1cmluZyB0aGUgZXZlbnQgZW1pdHRlciBmaXJlc1xuICAgICAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bkd1YXJkZWQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBCaW5kIGFsbCBldmVudCBoYW5kbGVycy5cbiAgICAgICAgICAgICAgICAgICAgLy8gISBpbXBvcnRhbnQgQW5ndWxhciB1c2VzIEV2ZW50RW1pdHRlciwgUmVhY3QgdXNlc1xuICAgICAgICAgICAgICAgICAgICAvLyBhIGRpZmZlcmVudCBtZXRob2Qgb2YgZXZlbnQgYmluZGluZ1xuICAgICAgICAgICAgICAgICAgICBldnRLZXlzLmZvckVhY2goayA9PiB0aGlzLl9wcm9wc1trXSA9ICguLi5hcmdzKSA9PiB0aGlzW2tdLm5leHQoYXJncykpO1xuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICB0aGlzLl9yZWFjdEVsZW1lbnQgPSBSZWFjdC5jcmVhdGVFbGVtZW50KHRoaXMubmdSZWFjdENvbXBvbmVudCwgeyBwcm9wczogdGhpcy5fcHJvcHMgYXMgYW55IH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3QucmVuZGVyKHRoaXMuX3JlYWN0RWxlbWVudCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG59XG4iXX0=