UNPKG

20.6 kBJavaScriptView Raw
1import { Injectable, Optional, Inject } from '@angular/core';
2import { ApolloClient } from '@apollo/client/core';
3import { from } from 'rxjs';
4import { QueryRef } from './query-ref';
5import { APOLLO_OPTIONS, APOLLO_NAMED_OPTIONS, APOLLO_FLAGS } from './tokens';
6import { fromPromise, useMutationLoading, wrapWithZone, fixObservable, pickFlag, } from './utils';
7import * as i0 from "@angular/core";
8export class ApolloBase {
9 constructor(ngZone, flags, _client) {
10 this.ngZone = ngZone;
11 this.flags = flags;
12 this._client = _client;
13 this.useInitialLoading = pickFlag(flags, 'useInitialLoading', false);
14 this.useMutationLoading = pickFlag(flags, 'useMutationLoading', false);
15 }
16 watchQuery(options) {
17 return new QueryRef(this.ensureClient().watchQuery({
18 ...options,
19 }), this.ngZone, {
20 useInitialLoading: this.useInitialLoading,
21 ...options,
22 });
23 }
24 query(options) {
25 return fromPromise(() => this.ensureClient().query({ ...options }));
26 }
27 mutate(options) {
28 return useMutationLoading(fromPromise(() => this.ensureClient().mutate({ ...options })), options.useMutationLoading ?? this.useMutationLoading);
29 }
30 subscribe(options, extra) {
31 const obs = from(fixObservable(this.ensureClient().subscribe({ ...options })));
32 return extra && extra.useZone !== true
33 ? obs
34 : wrapWithZone(obs, this.ngZone);
35 }
36 /**
37 * Get an access to an instance of ApolloClient
38 * @deprecated use `apollo.client` instead
39 */
40 getClient() {
41 return this.client;
42 }
43 /**
44 * Set a new instance of ApolloClient
45 * Remember to clean up the store before setting a new client.
46 * @deprecated use `apollo.client = client` instead
47 *
48 * @param client ApolloClient instance
49 */
50 setClient(client) {
51 this.client = client;
52 }
53 /**
54 * Get an access to an instance of ApolloClient
55 */
56 get client() {
57 return this._client;
58 }
59 /**
60 * Set a new instance of ApolloClient
61 * Remember to clean up the store before setting a new client.
62 *
63 * @param client ApolloClient instance
64 */
65 set client(client) {
66 if (this._client) {
67 throw new Error('Client has been already defined');
68 }
69 this._client = client;
70 }
71 ensureClient() {
72 this.checkInstance();
73 return this._client;
74 }
75 checkInstance() {
76 if (!this._client) {
77 throw new Error('Client has not been defined yet');
78 }
79 }
80}
81export class Apollo extends ApolloBase {
82 constructor(_ngZone, apolloOptions, apolloNamedOptions, flags) {
83 super(_ngZone, flags);
84 this._ngZone = _ngZone;
85 this.map = new Map();
86 if (apolloOptions) {
87 this.createDefault(apolloOptions);
88 }
89 if (apolloNamedOptions && typeof apolloNamedOptions === 'object') {
90 for (let name in apolloNamedOptions) {
91 if (apolloNamedOptions.hasOwnProperty(name)) {
92 const options = apolloNamedOptions[name];
93 this.createNamed(name, options);
94 }
95 }
96 }
97 }
98 /**
99 * Create an instance of ApolloClient
100 * @param options Options required to create ApolloClient
101 * @param name client's name
102 */
103 create(options, name) {
104 if (isDefault(name)) {
105 this.createDefault(options);
106 }
107 else {
108 this.createNamed(name, options);
109 }
110 }
111 /**
112 * Use a default ApolloClient
113 */
114 default() {
115 return this;
116 }
117 /**
118 * Use a named ApolloClient
119 * @param name client's name
120 */
121 use(name) {
122 if (isDefault(name)) {
123 return this.default();
124 }
125 return this.map.get(name);
126 }
127 /**
128 * Create a default ApolloClient, same as `apollo.create(options)`
129 * @param options ApolloClient's options
130 */
131 createDefault(options) {
132 if (this.getClient()) {
133 throw new Error('Apollo has been already created.');
134 }
135 return this.setClient(new ApolloClient(options));
136 }
137 /**
138 * Create a named ApolloClient, same as `apollo.create(options, name)`
139 * @param name client's name
140 * @param options ApolloClient's options
141 */
142 createNamed(name, options) {
143 if (this.map.has(name)) {
144 throw new Error(`Client ${name} has been already created`);
145 }
146 this.map.set(name, new ApolloBase(this._ngZone, this.flags, new ApolloClient(options)));
147 }
148 /**
149 * Remember to clean up the store before removing a client
150 * @param name client's name
151 */
152 removeClient(name) {
153 if (isDefault(name)) {
154 this._client = undefined;
155 }
156 else {
157 this.map.delete(name);
158 }
159 }
160}
161Apollo.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: Apollo, deps: [{ token: i0.NgZone }, { token: APOLLO_OPTIONS, optional: true }, { token: APOLLO_NAMED_OPTIONS, optional: true }, { token: APOLLO_FLAGS, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
162Apollo.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: Apollo });
163i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.0.6", ngImport: i0, type: Apollo, decorators: [{
164 type: Injectable
165 }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: undefined, decorators: [{
166 type: Optional
167 }, {
168 type: Inject,
169 args: [APOLLO_OPTIONS]
170 }] }, { type: undefined, decorators: [{
171 type: Optional
172 }, {
173 type: Inject,
174 args: [APOLLO_NAMED_OPTIONS]
175 }] }, { type: undefined, decorators: [{
176 type: Optional
177 }, {
178 type: Inject,
179 args: [APOLLO_FLAGS]
180 }] }]; } });
181function isDefault(name) {
182 return !name || name === 'default';
183}
184//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBvbGxvLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2Fwb2xsby50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUMsVUFBVSxFQUFFLFFBQVEsRUFBRSxNQUFNLEVBQVMsTUFBTSxlQUFlLENBQUM7QUFTbkUsT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLHFCQUFxQixDQUFDO0FBQ2pELE9BQU8sRUFBYSxJQUFJLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFFdEMsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLGFBQWEsQ0FBQztBQVVyQyxPQUFPLEVBQUMsY0FBYyxFQUFFLG9CQUFvQixFQUFFLFlBQVksRUFBQyxNQUFNLFVBQVUsQ0FBQztBQUM1RSxPQUFPLEVBQ0wsV0FBVyxFQUNYLGtCQUFrQixFQUNsQixZQUFZLEVBQ1osYUFBYSxFQUNiLFFBQVEsR0FDVCxNQUFNLFNBQVMsQ0FBQzs7QUFFakIsTUFBTSxPQUFPLFVBQVU7SUFJckIsWUFDWSxNQUFjLEVBQ2QsS0FBYSxFQUNiLE9BQW1DO1FBRm5DLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ2IsWUFBTyxHQUFQLE9BQU8sQ0FBNEI7UUFFN0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsbUJBQW1CLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDckUsSUFBSSxDQUFDLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxLQUFLLEVBQUUsb0JBQW9CLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDekUsQ0FBQztJQUVNLFVBQVUsQ0FDZixPQUE2QztRQUU3QyxPQUFPLElBQUksUUFBUSxDQUNqQixJQUFJLENBQUMsWUFBWSxFQUFFLENBQUMsVUFBVSxDQUFvQjtZQUNoRCxHQUFHLE9BQU87U0FDWCxDQUF1QyxFQUN4QyxJQUFJLENBQUMsTUFBTSxFQUNYO1lBQ0UsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlC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T0FHRztJQUNJLFlBQVksQ0FBQyxJQUFhO1FBQy9CLElBQUksU0FBUyxDQUFDLElBQUksQ0FBQyxFQUFFO1lBQ25CLElBQUksQ0FBQyxPQUFPLEdBQUcsU0FBUyxDQUFDO1NBQzFCO2FBQU07WUFDTCxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUN2QjtJQUNILENBQUM7O21HQWhIVSxNQUFNLHdDQVNQLGNBQWMsNkJBR2Qsb0JBQW9CLDZCQUVSLFlBQVk7dUdBZHZCLE1BQU07MkZBQU4sTUFBTTtrQkFEbEIsVUFBVTs7MEJBU04sUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxjQUFjOzswQkFFckIsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxvQkFBb0I7OzBCQUUzQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLFlBQVk7O0FBcUdwQyxTQUFTLFNBQVMsQ0FBQyxJQUFhO0lBQzlCLE9BQU8sQ0FBQyxJQUFJLElBQUksSUFBSSxLQUFLLFNBQVMsQ0FBQztBQUNyQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtJbmplY3RhYmxlLCBPcHRpb25hbCwgSW5qZWN0LCBOZ1pvbmV9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHR5cGUge1xuICBRdWVyeU9wdGlvbnMsXG4gIEFwb2xsb1F1ZXJ5UmVzdWx0LFxuICBTdWJzY3JpcHRpb25PcHRpb25zLFxuICBBcG9sbG9DbGllbnRPcHRpb25zLFxuICBPYnNlcnZhYmxlUXVlcnksXG4gIEZldGNoUmVzdWx0LFxufSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7QXBvbGxvQ2xpZW50fSBmcm9tICdAYXBvbGxvL2NsaWVudC9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgZnJvbX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7UXVlcnlSZWZ9IGZyb20gJy4vcXVlcnktcmVmJztcbmltcG9ydCB7XG4gIFdhdGNoUXVlcnlPcHRpb25zLFxuICBFeHRyYVN1YnNjcmlwdGlvbk9wdGlvbnMsXG4gIEVtcHR5T2JqZWN0LFxuICBOYW1lZE9wdGlvbnMsXG4gIEZsYWdzLFxuICBNdXRhdGlvblJlc3VsdCxcbiAgTXV0YXRpb25PcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7QVBPTExPX09QVElPTlMsIEFQT0xMT19OQU1FRF9PUFRJT05TLCBBUE9MTE9fRkxBR1N9IGZyb20gJy4vdG9rZW5zJztcbmltcG9ydCB7XG4gIGZyb21Qcm9taXNlLFxuICB1c2VNdXRhdGlvbkxvYWRpbmcsXG4gIHdyYXBXaXRoWm9uZSxcbiAgZml4T2JzZXJ2YWJsZSxcbiAgcGlja0ZsYWcsXG59IGZyb20gJy4vdXRpbHMnO1xuXG5leHBvcnQgY2xhc3MgQXBvbGxvQmFzZTxUQ2FjaGVTaGFwZSA9IGFueT4ge1xuICBwcml2YXRlIHVzZUluaXRpYWxMb2FkaW5nOiBib29sZWFuO1xuICBwcml2YXRlIHVzZU11dGF0aW9uTG9hZGluZzogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbmdab25lOiBOZ1pvbmUsXG4gICAgcHJvdGVjdGVkIGZsYWdzPzogRmxhZ3MsXG4gICAgcHJvdGVjdGVkIF9jbGllbnQ/OiBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+LFxuICApIHtcbiAgICB0aGlzLnVzZUluaXRpYWxMb2FkaW5nID0gcGlja0ZsYWcoZmxhZ3MsICd1c2VJbml0aWFsTG9hZGluZycsIGZhbHNlKTtcbiAgICB0aGlzLnVzZU11dGF0aW9uTG9hZGluZyA9IHBpY2tGbGFnKGZsYWdzLCAndXNlTXV0YXRpb25Mb2FkaW5nJywgZmFsc2UpO1xuICB9XG5cbiAgcHVibGljIHdhdGNoUXVlcnk8VERhdGEsIFRWYXJpYWJsZXMgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0aW9uczogV2F0Y2hRdWVyeU9wdGlvbnM8VFZhcmlhYmxlcywgVERhdGE+LFxuICApOiBRdWVyeVJlZjxURGF0YSwgVFZhcmlhYmxlcz4ge1xuICAgIHJldHVybiBuZXcgUXVlcnlSZWY8VERhdGEsIFRWYXJpYWJsZXM+KFxuICAgICAgdGhpcy5lbnN1cmVDbGllbnQoKS53YXRjaFF1ZXJ5PFREYXRhLCBUVmFyaWFibGVzPih7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB9KSBhcyBPYnNlcnZhYmxlUXVlcnk8VERhdGEsIFRWYXJpYWJsZXM+LFxuICAgICAgdGhpcy5uZ1pvbmUsXG4gICAgICB7XG4gICAgICAgIHVzZUluaXRpYWxMb2FkaW5nOiB0aGlzLnVzZUluaXRpYWxMb2FkaW5nLFxuICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgfSxcbiAgICApO1xuICB9XG5cbiAgcHVibGljIHF1ZXJ5PFQsIFYgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0aW9uczogUXVlcnlPcHRpb25zPFYsIFQ+LFxuICApOiBPYnNlcnZhYmxlPEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIGZyb21Qcm9taXNlPEFwb2xsb1F1ZXJ5UmVzdWx0PFQ+PigoKSA9PlxuICAgICAgdGhpcy5lbnN1cmVDbGllbnQoKS5xdWVyeTxULCBWPih7Li4ub3B0aW9uc30pLFxuICAgICk7XG4gIH1cblxuICBwdWJsaWMgbXV0YXRlPFQsIFYgPSBFbXB0eU9iamVjdD4oXG4gICAgb3B0aW9uczogTXV0YXRpb25PcHRpb25zPFQsIFY+LFxuICApOiBPYnNlcnZhYmxlPE11dGF0aW9uUmVzdWx0PFQ+PiB7XG4gICAgcmV0dXJuIHVzZU11dGF0aW9uTG9hZGluZyhcbiAgICAgIGZyb21Qcm9taXNlKCgpID0+IHRoaXMuZW5zdXJlQ2xpZW50KCkubXV0YXRlPFQsIFY+KHsuLi5vcHRpb25zfSkpLFxuICAgICAgb3B0aW9ucy51c2VNdXRhdGlvbkxvYWRpbmcgPz8gdGhpcy51c2VNdXRhdGlvbkxvYWRpbmcsXG4gICAgKTtcbiAgfVxuXG4gIHB1YmxpYyBzdWJzY3JpYmU8VCwgViA9IEVtcHR5T2JqZWN0PihcbiAgICBvcHRpb25zOiBTdWJzY3JpcHRpb25PcHRpb25zPFYsIFQ+LFxuICAgIGV4dHJhPzogRXh0cmFTdWJzY3JpcHRpb25PcHRpb25zLFxuICApOiBPYnNlcnZhYmxlPEZldGNoUmVzdWx0PFQ+PiB7XG4gICAgY29uc3Qgb2JzID0gZnJvbShcbiAgICAgIGZpeE9ic2VydmFibGUodGhpcy5lbnN1cmVDbGllbnQoKS5zdWJzY3JpYmU8VCwgVj4oey4uLm9wdGlvbnN9KSksXG4gICAgKTtcblxuICAgIHJldHVybiBleHRyYSAmJiBleHRyYS51c2Vab25lICE9PSB0cnVlXG4gICAgICA/IG9ic1xuICAgICAgOiB3cmFwV2l0aFpvbmUob2JzLCB0aGlzLm5nWm9uZSk7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGFuIGFjY2VzcyB0byBhbiBpbnN0YW5jZSBvZiBBcG9sbG9DbGllbnRcbiAgICogQGRlcHJlY2F0ZWQgdXNlIGBhcG9sbG8uY2xpZW50YCBpbnN0ZWFkXG4gICAqL1xuICBwdWJsaWMgZ2V0Q2xpZW50KCkge1xuICAgIHJldHVybiB0aGlzLmNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBuZXcgaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBhIG5ldyBjbGllbnQuXG4gICAqIEBkZXByZWNhdGVkIHVzZSBgYXBvbGxvLmNsaWVudCA9IGNsaWVudGAgaW5zdGVhZFxuICAgKlxuICAgKiBAcGFyYW0gY2xpZW50IEFwb2xsb0NsaWVudCBpbnN0YW5jZVxuICAgKi9cbiAgcHVibGljIHNldENsaWVudChjbGllbnQ6IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4pIHtcbiAgICB0aGlzLmNsaWVudCA9IGNsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYW4gYWNjZXNzIHRvIGFuIGluc3RhbmNlIG9mIEFwb2xsb0NsaWVudFxuICAgKi9cbiAgcHVibGljIGdldCBjbGllbnQoKTogQXBvbGxvQ2xpZW50PFRDYWNoZVNoYXBlPiB7XG4gICAgcmV0dXJuIHRoaXMuX2NsaWVudDtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgYSBuZXcgaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgc2V0dGluZyBhIG5ldyBjbGllbnQuXG4gICAqXG4gICAqIEBwYXJhbSBjbGllbnQgQXBvbGxvQ2xpZW50IGluc3RhbmNlXG4gICAqL1xuICBwdWJsaWMgc2V0IGNsaWVudChjbGllbnQ6IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4pIHtcbiAgICBpZiAodGhpcy5fY2xpZW50KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NsaWVudCBoYXMgYmVlbiBhbHJlYWR5IGRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB0aGlzLl9jbGllbnQgPSBjbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGVuc3VyZUNsaWVudCgpIHtcbiAgICB0aGlzLmNoZWNrSW5zdGFuY2UoKTtcblxuICAgIHJldHVybiB0aGlzLl9jbGllbnQ7XG4gIH1cblxuICBwcml2YXRlIGNoZWNrSW5zdGFuY2UoKTogdm9pZCB7XG4gICAgaWYgKCF0aGlzLl9jbGllbnQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQ2xpZW50IGhhcyBub3QgYmVlbiBkZWZpbmVkIHlldCcpO1xuICAgIH1cbiAgfVxufVxuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgQXBvbGxvIGV4dGVuZHMgQXBvbGxvQmFzZTxhbnk+IHtcbiAgcHJpdmF0ZSBtYXA6IE1hcDxzdHJpbmcsIEFwb2xsb0Jhc2U8YW55Pj4gPSBuZXcgTWFwPFxuICAgIHN0cmluZyxcbiAgICBBcG9sbG9CYXNlPGFueT5cbiAgPigpO1xuXG4gIGNvbnN0cnVjdG9yKFxuICAgIHByaXZhdGUgX25nWm9uZTogTmdab25lLFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChBUE9MTE9fT1BUSU9OUylcbiAgICBhcG9sbG9PcHRpb25zPzogQXBvbGxvQ2xpZW50T3B0aW9uczxhbnk+LFxuICAgIEBPcHRpb25hbCgpXG4gICAgQEluamVjdChBUE9MTE9fTkFNRURfT1BUSU9OUylcbiAgICBhcG9sbG9OYW1lZE9wdGlvbnM/OiBOYW1lZE9wdGlvbnMsXG4gICAgQE9wdGlvbmFsKCkgQEluamVjdChBUE9MTE9fRkxBR1MpIGZsYWdzPzogRmxhZ3MsXG4gICkge1xuICAgIHN1cGVyKF9uZ1pvbmUsIGZsYWdzKTtcblxuICAgIGlmIChhcG9sbG9PcHRpb25zKSB7XG4gICAgICB0aGlzLmNyZWF0ZURlZmF1bHQoYXBvbGxvT3B0aW9ucyk7XG4gICAgfVxuXG4gICAgaWYgKGFwb2xsb05hbWVkT3B0aW9ucyAmJiB0eXBlb2YgYXBvbGxvTmFtZWRPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yIChsZXQgbmFtZSBpbiBhcG9sbG9OYW1lZE9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGFwb2xsb05hbWVkT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBhcG9sbG9OYW1lZE9wdGlvbnNbbmFtZV07XG4gICAgICAgICAgdGhpcy5jcmVhdGVOYW1lZChuYW1lLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXBvbGxvQ2xpZW50XG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgcmVxdWlyZWQgdG8gY3JlYXRlIEFwb2xsb0NsaWVudFxuICAgKiBAcGFyYW0gbmFtZSBjbGllbnQncyBuYW1lXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlPFRDYWNoZVNoYXBlPihcbiAgICBvcHRpb25zOiBBcG9sbG9DbGllbnRPcHRpb25zPFRDYWNoZVNoYXBlPixcbiAgICBuYW1lPzogc3RyaW5nLFxuICApOiB2b2lkIHtcbiAgICBpZiAoaXNEZWZhdWx0KG5hbWUpKSB7XG4gICAgICB0aGlzLmNyZWF0ZURlZmF1bHQ8VENhY2hlU2hhcGU+KG9wdGlvbnMpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmNyZWF0ZU5hbWVkPFRDYWNoZVNoYXBlPihuYW1lLCBvcHRpb25zKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgZGVmYXVsdCBBcG9sbG9DbGllbnRcbiAgICovXG4gIHB1YmxpYyBkZWZhdWx0KCk6IEFwb2xsb0Jhc2U8YW55PiB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogVXNlIGEgbmFtZWQgQXBvbGxvQ2xpZW50XG4gICAqIEBwYXJhbSBuYW1lIGNsaWVudCdzIG5hbWVcbiAgICovXG4gIHB1YmxpYyB1c2UobmFtZTogc3RyaW5nKTogQXBvbGxvQmFzZTxhbnk+IHtcbiAgICBpZiAoaXNEZWZhdWx0KG5hbWUpKSB7XG4gICAgICByZXR1cm4gdGhpcy5kZWZhdWx0KCk7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm1hcC5nZXQobmFtZSk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgZGVmYXVsdCBBcG9sbG9DbGllbnQsIHNhbWUgYXMgYGFwb2xsby5jcmVhdGUob3B0aW9ucylgXG4gICAqIEBwYXJhbSBvcHRpb25zIEFwb2xsb0NsaWVudCdzIG9wdGlvbnNcbiAgICovXG4gIHB1YmxpYyBjcmVhdGVEZWZhdWx0PFRDYWNoZVNoYXBlPihcbiAgICBvcHRpb25zOiBBcG9sbG9DbGllbnRPcHRpb25zPFRDYWNoZVNoYXBlPixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuZ2V0Q2xpZW50KCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQXBvbGxvIGhhcyBiZWVuIGFscmVhZHkgY3JlYXRlZC4nKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zZXRDbGllbnQobmV3IEFwb2xsb0NsaWVudDxUQ2FjaGVTaGFwZT4ob3B0aW9ucykpO1xuICB9XG5cbiAgLyoqXG4gICAqIENyZWF0ZSBhIG5hbWVkIEFwb2xsb0NsaWVudCwgc2FtZSBhcyBgYXBvbGxvLmNyZWF0ZShvcHRpb25zLCBuYW1lKWBcbiAgICogQHBhcmFtIG5hbWUgY2xpZW50J3MgbmFtZVxuICAgKiBAcGFyYW0gb3B0aW9ucyBBcG9sbG9DbGllbnQncyBvcHRpb25zXG4gICAqL1xuICBwdWJsaWMgY3JlYXRlTmFtZWQ8VENhY2hlU2hhcGU+KFxuICAgIG5hbWU6IHN0cmluZyxcbiAgICBvcHRpb25zOiBBcG9sbG9DbGllbnRPcHRpb25zPFRDYWNoZVNoYXBlPixcbiAgKTogdm9pZCB7XG4gICAgaWYgKHRoaXMubWFwLmhhcyhuYW1lKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDbGllbnQgJHtuYW1lfSBoYXMgYmVlbiBhbHJlYWR5IGNyZWF0ZWRgKTtcbiAgICB9XG4gICAgdGhpcy5tYXAuc2V0KFxuICAgICAgbmFtZSxcbiAgICAgIG5ldyBBcG9sbG9CYXNlKFxuICAgICAgICB0aGlzLl9uZ1pvbmUsXG4gICAgICAgIHRoaXMuZmxhZ3MsXG4gICAgICAgIG5ldyBBcG9sbG9DbGllbnQ8VENhY2hlU2hhcGU+KG9wdGlvbnMpLFxuICAgICAgKSxcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbWVtYmVyIHRvIGNsZWFuIHVwIHRoZSBzdG9yZSBiZWZvcmUgcmVtb3ZpbmcgYSBjbGllbnRcbiAgICogQHBhcmFtIG5hbWUgY2xpZW50J3MgbmFtZVxuICAgKi9cbiAgcHVibGljIHJlbW92ZUNsaWVudChuYW1lPzogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzRGVmYXVsdChuYW1lKSkge1xuICAgICAgdGhpcy5fY2xpZW50ID0gdW5kZWZpbmVkO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm1hcC5kZWxldGUobmFtZSk7XG4gICAgfVxuICB9XG59XG5cbmZ1bmN0aW9uIGlzRGVmYXVsdChuYW1lPzogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAhbmFtZSB8fCBuYW1lID09PSAnZGVmYXVsdCc7XG59XG4iXX0=
\No newline at end of file