@dcl/sdk 7.29.1-35901015152.commit-d1b7b96 → 7.29.1-35917671376.commit-046b268
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/explorer-ui/index.d.ts +118 -0
- package/explorer-ui/index.js +235 -0
- package/internal/language-events.d.ts +1 -0
- package/internal/language-events.js +8 -0
- package/observables.d.ts +4 -0
- package/observables.js +6 -1
- package/package.json +6 -6
- package/platform/index.d.ts +16 -0
- package/platform/index.js +42 -1
- package/players/index.d.ts +0 -1
- package/players/index.js +6 -4
- package/src/explorer-ui/index.ts +398 -0
- package/src/internal/language-events.ts +8 -0
- package/src/observables.ts +10 -0
- package/src/platform/index.ts +47 -0
- package/src/players/index.ts +5 -4
- package/src/testing/runtime.ts +3 -0
- package/testing/runtime.js +4 -1
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/// <reference types="@dcl/js-runtime" />
|
|
2
|
+
import { ExplorerUi, GrowOnlyValueSetComponentDefinition, PBExplorerItemPurchaseResult, PBExplorerUiEventsResult } from '@dcl/ecs';
|
|
3
|
+
import { OpenExplorerUiResult } from '~system/RestrictedActions';
|
|
4
|
+
export { ExplorerUi, OpenExplorerUiResult };
|
|
5
|
+
/** @public */
|
|
6
|
+
export type CorrelatedEvent = {
|
|
7
|
+
timestamp: number;
|
|
8
|
+
requestId: number;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* A named stream of events that this helper can collect and stop on.
|
|
12
|
+
* @public
|
|
13
|
+
*/
|
|
14
|
+
export type Channel<N extends string = string, T extends CorrelatedEvent = CorrelatedEvent> = {
|
|
15
|
+
readonly name: N;
|
|
16
|
+
readonly component: GrowOnlyValueSetComponentDefinition<T>;
|
|
17
|
+
};
|
|
18
|
+
/** @public */
|
|
19
|
+
export type AnyChannel = Channel<string, any>;
|
|
20
|
+
/**
|
|
21
|
+
* Wraps a grow-only result component as a {@link Channel}. The name must be unique within a scene.
|
|
22
|
+
* @public
|
|
23
|
+
*/
|
|
24
|
+
export declare function channel<N extends string, T extends CorrelatedEvent>(name: N, component: GrowOnlyValueSetComponentDefinition<T>): Channel<N, T>;
|
|
25
|
+
/** Panel lifecycle events: opened and closed. @public */
|
|
26
|
+
export declare const ExplorerUiEvents: Channel<'explorerUi', PBExplorerUiEventsResult>;
|
|
27
|
+
/** Outcome of an `EU_ITEM_PURCHASE` flow: purchased, dismissed or failed. @public */
|
|
28
|
+
export declare const ItemPurchase: Channel<'itemPurchase', PBExplorerItemPurchaseResult>;
|
|
29
|
+
/**
|
|
30
|
+
* The `$case` names of a channel's event union.
|
|
31
|
+
* @public
|
|
32
|
+
*/
|
|
33
|
+
export type CaseOf<C extends AnyChannel> = C extends Channel<any, infer T> ? Extract<T[keyof T], {
|
|
34
|
+
$case: string;
|
|
35
|
+
}>['$case'] : never;
|
|
36
|
+
/** @public */
|
|
37
|
+
export type Variant<C extends AnyChannel = AnyChannel, K extends string = string> = {
|
|
38
|
+
readonly channel: C;
|
|
39
|
+
readonly $case: K;
|
|
40
|
+
};
|
|
41
|
+
/** @public */
|
|
42
|
+
export declare function variant<C extends AnyChannel, K extends CaseOf<C>>(ch: C, $case: K): Variant<C, K>;
|
|
43
|
+
/**
|
|
44
|
+
* What ends the wait before the panel closes: any event on a channel, or one `$case` of it.
|
|
45
|
+
* @public
|
|
46
|
+
*/
|
|
47
|
+
export type StopCondition = AnyChannel | Variant;
|
|
48
|
+
/** @public */
|
|
49
|
+
export type Collected<C> = C extends Channel<infer N, infer T> ? {
|
|
50
|
+
channel: N;
|
|
51
|
+
event: T;
|
|
52
|
+
} : never;
|
|
53
|
+
/**
|
|
54
|
+
* How the wait ended.
|
|
55
|
+
* - `closed`: the panel this call opened was closed.
|
|
56
|
+
* - `matched`: `until` fired first, so the panel may still be on screen.
|
|
57
|
+
* - `notOpened`: this call did not open anything. `openResult` says why.
|
|
58
|
+
* - `timedOut`: `timeoutMs` elapsed first.
|
|
59
|
+
*
|
|
60
|
+
* `events` always holds everything collected, the event that stopped the wait included.
|
|
61
|
+
* @public
|
|
62
|
+
*/
|
|
63
|
+
export type WaitOutcome<C extends readonly AnyChannel[]> = {
|
|
64
|
+
$case: 'closed';
|
|
65
|
+
events: readonly Collected<C[number]>[];
|
|
66
|
+
} | {
|
|
67
|
+
$case: 'matched';
|
|
68
|
+
events: readonly Collected<C[number]>[];
|
|
69
|
+
} | {
|
|
70
|
+
$case: 'notOpened';
|
|
71
|
+
openResult: OpenExplorerUiResult;
|
|
72
|
+
} | {
|
|
73
|
+
$case: 'timedOut';
|
|
74
|
+
events: readonly Collected<C[number]>[];
|
|
75
|
+
};
|
|
76
|
+
/** @public */
|
|
77
|
+
export type WaitOptions<C extends readonly AnyChannel[]> = {
|
|
78
|
+
/** Channels whose events land in `events`. Defaults to none. */
|
|
79
|
+
collect?: C;
|
|
80
|
+
/** Stops the wait early. The panel closing always stops it regardless. */
|
|
81
|
+
until?: StopCondition;
|
|
82
|
+
/**
|
|
83
|
+
* Bounds the wait, in milliseconds. On expiry the promise resolves with `$case: 'timedOut'`.
|
|
84
|
+
* No default, because a panel can stay open for minutes. Without it, an explorer that opens
|
|
85
|
+
* a panel and then emits no `closed` leaves the promise pending for the scene's whole life.
|
|
86
|
+
*/
|
|
87
|
+
timeoutMs?: number;
|
|
88
|
+
};
|
|
89
|
+
/** @public */
|
|
90
|
+
export type OpenExplorerUiRequest = {
|
|
91
|
+
ui: Exclude<ExplorerUi, ExplorerUi.EU_ITEM_PURCHASE>;
|
|
92
|
+
itemPurchase?: undefined;
|
|
93
|
+
} | {
|
|
94
|
+
ui: ExplorerUi.EU_ITEM_PURCHASE;
|
|
95
|
+
itemPurchase: {
|
|
96
|
+
urn: string;
|
|
97
|
+
};
|
|
98
|
+
};
|
|
99
|
+
/**
|
|
100
|
+
* Signature of {@link openExplorerUiAndWait}. The second overload takes a bare `ui`, so a
|
|
101
|
+
* computed panel value needs no narrowing.
|
|
102
|
+
* @public
|
|
103
|
+
*/
|
|
104
|
+
export interface OpenExplorerUiAndWait {
|
|
105
|
+
<const C extends readonly AnyChannel[] = []>(request: OpenExplorerUiRequest, options?: WaitOptions<C>): Promise<WaitOutcome<C>>;
|
|
106
|
+
(ui: Exclude<ExplorerUi, ExplorerUi.EU_ITEM_PURCHASE>): Promise<WaitOutcome<[]>>;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Opens an explorer panel and waits for the session it started. The wait ends when the panel
|
|
110
|
+
* closes. See {@link WaitOptions} to collect events, to stop earlier or to bound the wait.
|
|
111
|
+
*
|
|
112
|
+
* Every lifecycle outcome resolves, see {@link WaitOutcome}. The promise rejects only when an
|
|
113
|
+
* event cannot be attributed to a call at all: an explorer too old to echo `request_id`
|
|
114
|
+
* paired with a panel that can coexist with another one.
|
|
115
|
+
*
|
|
116
|
+
* @public
|
|
117
|
+
*/
|
|
118
|
+
export declare const openExplorerUiAndWait: OpenExplorerUiAndWait;
|
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
import { engine, ExplorerItemPurchaseResult, ExplorerUi, ExplorerUiEventsResult } from '@dcl/ecs';
|
|
2
|
+
import { openExplorerUi, OpenExplorerUiResult } from '~system/RestrictedActions';
|
|
3
|
+
export { ExplorerUi, OpenExplorerUiResult };
|
|
4
|
+
// What an explorer that does not echo request_id, or a user-initiated action, leaves on the wire.
|
|
5
|
+
const UNCORRELATED = 0;
|
|
6
|
+
// Panels that can be on screen next to another panel. The `ui` field alone cannot attribute
|
|
7
|
+
// their events, so an event on one of these panels must carry a request_id.
|
|
8
|
+
const CONCURRENT_PANELS = [7 /* ExplorerUi.EU_ITEM_PURCHASE */];
|
|
9
|
+
/**
|
|
10
|
+
* Wraps a grow-only result component as a {@link Channel}. The name must be unique within a scene.
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export function channel(name, component) {
|
|
14
|
+
return { name, component };
|
|
15
|
+
}
|
|
16
|
+
/** Panel lifecycle events: opened and closed. @public */
|
|
17
|
+
export const ExplorerUiEvents = /* @__PURE__ */ channel('explorerUi', ExplorerUiEventsResult);
|
|
18
|
+
/** Outcome of an `EU_ITEM_PURCHASE` flow: purchased, dismissed or failed. @public */
|
|
19
|
+
export const ItemPurchase = /* @__PURE__ */ channel('itemPurchase', ExplorerItemPurchaseResult);
|
|
20
|
+
/** @public */
|
|
21
|
+
export function variant(ch, $case) {
|
|
22
|
+
return { channel: ch, $case };
|
|
23
|
+
}
|
|
24
|
+
/** @internal exposed for tests */
|
|
25
|
+
export const EXPLORER_UI_WAIT_TIMEOUT_SYSTEM = 'explorer-ui-wait-timeout';
|
|
26
|
+
// Lowest priority sorts this system last, so when it removes itself mid-tick it splices the
|
|
27
|
+
// last element of the array the engine is iterating and skips no other system.
|
|
28
|
+
const TIMEOUT_SYSTEM_PRIORITY = Number.MIN_SAFE_INTEGER;
|
|
29
|
+
// ts-proto renders a `oneof` as one wrapper property `{ $case, [$case]: value }`. Finding that
|
|
30
|
+
// property by shape keeps the helper independent of the name each message gave it: `event` on
|
|
31
|
+
// one message, `status` on another.
|
|
32
|
+
function caseOf(event) {
|
|
33
|
+
for (const key of Object.keys(event)) {
|
|
34
|
+
const value = event[key];
|
|
35
|
+
if (value && typeof value === 'object' && typeof value.$case === 'string') {
|
|
36
|
+
return value.$case;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
function normalizeStop(stop) {
|
|
42
|
+
return '$case' in stop ? { channel: stop.channel, $case: stop.$case } : { channel: stop, $case: undefined };
|
|
43
|
+
}
|
|
44
|
+
/** @internal test seam. The production instance is {@link openExplorerUiAndWait}. */
|
|
45
|
+
export function create(deps) {
|
|
46
|
+
const { engine: engineInstance, openExplorerUi: openExplorerUiFn, explorerUiEvents } = deps;
|
|
47
|
+
const root = engineInstance.RootEntity;
|
|
48
|
+
const sessions = new Map();
|
|
49
|
+
// Keyed by name, so two wrappers around the same component arm one listener, not two.
|
|
50
|
+
const armed = new Map();
|
|
51
|
+
// Starts at 1 so a minted id never collides with UNCORRELATED.
|
|
52
|
+
let nextRequestId = 1;
|
|
53
|
+
let timeoutSystemAdded = false;
|
|
54
|
+
function arm(ch) {
|
|
55
|
+
const bound = armed.get(ch.name);
|
|
56
|
+
if (bound) {
|
|
57
|
+
if (bound !== ch.component) {
|
|
58
|
+
throw new Error(`openExplorerUiAndWait: channel name '${ch.name}' is already bound to a different component. ` +
|
|
59
|
+
`Channel names identify a stream, so they have to be unique within a scene.`);
|
|
60
|
+
}
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
armed.set(ch.name, ch.component);
|
|
64
|
+
const name = ch.name;
|
|
65
|
+
// onChange has no unsubscribe, so one listener per channel lives for the engine's lifetime.
|
|
66
|
+
ch.component.onChange(root, (value) => {
|
|
67
|
+
// `undefined` arrives on DELETE_ENTITY. Otherwise `value` is one appended element,
|
|
68
|
+
// not the whole set.
|
|
69
|
+
if (value)
|
|
70
|
+
deliver(name, value);
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function attribute(session, name, event) {
|
|
74
|
+
if (event.requestId === session.requestId)
|
|
75
|
+
return 'yes';
|
|
76
|
+
if (event.requestId !== UNCORRELATED)
|
|
77
|
+
return 'no';
|
|
78
|
+
// Only the lifecycle channel carries a second discriminator, `ui`, and it identifies a
|
|
79
|
+
// session only while panels cannot coexist. A second call for the same panel is answered
|
|
80
|
+
// WAS_ALREADY_OPEN, so at most one session per non-concurrent panel is ever live.
|
|
81
|
+
if (session.correlationRequired || name !== explorerUiEvents.name)
|
|
82
|
+
return 'ambiguous';
|
|
83
|
+
return event.ui === session.ui ? 'yes' : 'no';
|
|
84
|
+
}
|
|
85
|
+
function deliver(name, event) {
|
|
86
|
+
// Settling deletes from `sessions` mid-iteration, which a Map tolerates. Nothing adds.
|
|
87
|
+
for (const session of sessions.values()) {
|
|
88
|
+
if (!session.watched.has(name))
|
|
89
|
+
continue;
|
|
90
|
+
const attribution = attribute(session, name, event);
|
|
91
|
+
if (attribution === 'no')
|
|
92
|
+
continue;
|
|
93
|
+
if (attribution === 'ambiguous') {
|
|
94
|
+
failSession(session, new Error(`openExplorerUiAndWait: got a '${name}' event with no request_id, and nothing else identifies ` +
|
|
95
|
+
`the call it belongs to. This explorer does not echo OpenExplorerUiRequest.request_id.`));
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
accept(session, name, event);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
function accept(session, name, event) {
|
|
102
|
+
if (session.collect.has(name))
|
|
103
|
+
session.events.push({ channel: name, event });
|
|
104
|
+
// The close is terminal and wins over `until`, because `matched` would tell the caller
|
|
105
|
+
// that the panel is still on screen.
|
|
106
|
+
if (name === explorerUiEvents.name && caseOf(event) === 'closed') {
|
|
107
|
+
settleSession(session, { $case: 'closed', events: session.events });
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
const until = session.until;
|
|
111
|
+
if (!until || until.channel !== name)
|
|
112
|
+
return;
|
|
113
|
+
if (until.$case === undefined || until.$case === caseOf(event)) {
|
|
114
|
+
settleSession(session, { $case: 'matched', events: session.events });
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
function settleSession(session, outcome) {
|
|
118
|
+
if (session.settled)
|
|
119
|
+
return;
|
|
120
|
+
session.settled = true;
|
|
121
|
+
sessions.delete(session.requestId);
|
|
122
|
+
session.settle(outcome);
|
|
123
|
+
maybeRemoveTimeoutSystem();
|
|
124
|
+
}
|
|
125
|
+
function failSession(session, error) {
|
|
126
|
+
if (session.settled)
|
|
127
|
+
return;
|
|
128
|
+
session.settled = true;
|
|
129
|
+
sessions.delete(session.requestId);
|
|
130
|
+
session.fail(error);
|
|
131
|
+
maybeRemoveTimeoutSystem();
|
|
132
|
+
}
|
|
133
|
+
function hasTimedSession() {
|
|
134
|
+
for (const session of sessions.values()) {
|
|
135
|
+
if (session.timeoutMs !== undefined)
|
|
136
|
+
return true;
|
|
137
|
+
}
|
|
138
|
+
return false;
|
|
139
|
+
}
|
|
140
|
+
function maybeRemoveTimeoutSystem() {
|
|
141
|
+
if (!timeoutSystemAdded || hasTimedSession())
|
|
142
|
+
return;
|
|
143
|
+
timeoutSystemAdded = false;
|
|
144
|
+
engineInstance.removeSystem(EXPLORER_UI_WAIT_TIMEOUT_SYSTEM);
|
|
145
|
+
}
|
|
146
|
+
function ensureTimeoutSystem() {
|
|
147
|
+
if (timeoutSystemAdded)
|
|
148
|
+
return;
|
|
149
|
+
timeoutSystemAdded = true;
|
|
150
|
+
// The scene runtime has no timers, so elapsed time is accumulated from the engine's dt.
|
|
151
|
+
engineInstance.addSystem((dt) => {
|
|
152
|
+
for (const session of sessions.values()) {
|
|
153
|
+
if (session.timeoutMs === undefined)
|
|
154
|
+
continue;
|
|
155
|
+
session.elapsedMs += dt * 1000;
|
|
156
|
+
if (session.elapsedMs >= session.timeoutMs) {
|
|
157
|
+
settleSession(session, { $case: 'timedOut', events: session.events });
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
maybeRemoveTimeoutSystem();
|
|
161
|
+
}, TIMEOUT_SYSTEM_PRIORITY, EXPLORER_UI_WAIT_TIMEOUT_SYSTEM);
|
|
162
|
+
}
|
|
163
|
+
async function openExplorerUiAndWait(request, options) {
|
|
164
|
+
const { ui, itemPurchase } = typeof request === 'number' ? { ui: request, itemPurchase: undefined } : request;
|
|
165
|
+
const requestId = nextRequestId++;
|
|
166
|
+
const collect = options?.collect ?? [];
|
|
167
|
+
const collectNames = new Set();
|
|
168
|
+
for (const ch of collect)
|
|
169
|
+
collectNames.add(ch.name);
|
|
170
|
+
const stop = options?.until ? normalizeStop(options.until) : undefined;
|
|
171
|
+
const watched = new Set(collectNames);
|
|
172
|
+
watched.add(explorerUiEvents.name);
|
|
173
|
+
if (stop)
|
|
174
|
+
watched.add(stop.channel.name);
|
|
175
|
+
// Armed before the RPC, because events can land while the RPC is in flight. A listener
|
|
176
|
+
// that is already up is what makes replaying the accumulated set unnecessary.
|
|
177
|
+
arm(explorerUiEvents);
|
|
178
|
+
for (const ch of collect)
|
|
179
|
+
arm(ch);
|
|
180
|
+
if (stop)
|
|
181
|
+
arm(stop.channel);
|
|
182
|
+
let settle;
|
|
183
|
+
let fail;
|
|
184
|
+
const outcome = new Promise((resolve, reject) => {
|
|
185
|
+
settle = resolve;
|
|
186
|
+
fail = reject;
|
|
187
|
+
});
|
|
188
|
+
const session = {
|
|
189
|
+
requestId,
|
|
190
|
+
ui,
|
|
191
|
+
correlationRequired: CONCURRENT_PANELS.includes(ui),
|
|
192
|
+
collect: collectNames,
|
|
193
|
+
watched,
|
|
194
|
+
until: stop ? { channel: stop.channel.name, $case: stop.$case } : undefined,
|
|
195
|
+
events: [],
|
|
196
|
+
timeoutMs: options?.timeoutMs,
|
|
197
|
+
elapsedMs: 0,
|
|
198
|
+
settled: false,
|
|
199
|
+
settle,
|
|
200
|
+
fail
|
|
201
|
+
};
|
|
202
|
+
sessions.set(requestId, session);
|
|
203
|
+
if (session.timeoutMs !== undefined)
|
|
204
|
+
ensureTimeoutSystem();
|
|
205
|
+
try {
|
|
206
|
+
const { openResult } = await openExplorerUiFn({ ui, requestId, itemPurchase });
|
|
207
|
+
// This call opened nothing, so no event carrying this request id is coming.
|
|
208
|
+
if (openResult !== OpenExplorerUiResult.OPENED) {
|
|
209
|
+
settleSession(session, { $case: 'notOpened', openResult });
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
catch (error) {
|
|
213
|
+
// Routed through the session rather than rethrown, so that `outcome` is never left
|
|
214
|
+
// pending and unobserved.
|
|
215
|
+
failSession(session, error);
|
|
216
|
+
}
|
|
217
|
+
return outcome;
|
|
218
|
+
}
|
|
219
|
+
// The implementation takes both argument forms and is blind to `collect`. The cast is what
|
|
220
|
+
// gives callers the two overloads that relate them.
|
|
221
|
+
return { openExplorerUiAndWait: openExplorerUiAndWait };
|
|
222
|
+
}
|
|
223
|
+
const helper = /* @__PURE__ */ create({ engine, openExplorerUi, explorerUiEvents: ExplorerUiEvents });
|
|
224
|
+
/**
|
|
225
|
+
* Opens an explorer panel and waits for the session it started. The wait ends when the panel
|
|
226
|
+
* closes. See {@link WaitOptions} to collect events, to stop earlier or to bound the wait.
|
|
227
|
+
*
|
|
228
|
+
* Every lifecycle outcome resolves, see {@link WaitOutcome}. The promise rejects only when an
|
|
229
|
+
* event cannot be attributed to a call at all: an explorer too old to echo `request_id`
|
|
230
|
+
* paired with a panel that can coexist with another one.
|
|
231
|
+
*
|
|
232
|
+
* @public
|
|
233
|
+
*/
|
|
234
|
+
export const openExplorerUiAndWait = helper.openExplorerUiAndWait;
|
|
235
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZXhwbG9yZXItdWkvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLE1BQU0sRUFDTiwwQkFBMEIsRUFDMUIsVUFBVSxFQUNWLHNCQUFzQixFQUt2QixNQUFNLFVBQVUsQ0FBQTtBQUNqQixPQUFPLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sMkJBQTJCLENBQUE7QUFFaEYsT0FBTyxFQUFFLFVBQVUsRUFBRSxvQkFBb0IsRUFBRSxDQUFBO0FBRTNDLGtHQUFrRztBQUNsRyxNQUFNLFlBQVksR0FBRyxDQUFDLENBQUE7QUFFdEIsNEZBQTRGO0FBQzVGLDRFQUE0RTtBQUM1RSxNQUFNLGlCQUFpQixHQUEwQixxQ0FBNkIsQ0FBQTtBQW9COUU7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLE9BQU8sQ0FDckIsSUFBTyxFQUNQLFNBQWlEO0lBRWpELE9BQU8sRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDNUIsQ0FBQztBQUVELHlEQUF5RDtBQUN6RCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBb0QsZUFBZSxDQUFDLE9BQU8sQ0FDdEcsWUFBWSxFQUNaLHNCQUFzQixDQUN2QixDQUFBO0FBRUQscUZBQXFGO0FBQ3JGLE1BQU0sQ0FBQyxNQUFNLFlBQVksR0FBMEQsZUFBZSxDQUFDLE9BQU8sQ0FDeEcsY0FBYyxFQUNkLDBCQUEwQixDQUMzQixDQUFBO0FBZUQsY0FBYztBQUNkLE1BQU0sVUFBVSxPQUFPLENBQTRDLEVBQUssRUFBRSxLQUFRO0lBQ2hGLE9BQU8sRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLEtBQUssRUFBRSxDQUFBO0FBQy9CLENBQUM7QUEyREQsa0NBQWtDO0FBQ2xDLE1BQU0sQ0FBQyxNQUFNLCtCQUErQixHQUFHLDBCQUEwQixDQUFBO0FBRXpFLDRGQUE0RjtBQUM1RiwrRUFBK0U7QUFDL0UsTUFBTSx1QkFB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QUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsRUFBRSxNQUFNLEVBQUUsY0FBYyxFQUFFLGdCQUFnQixFQUFFLGdCQUFnQixFQUFFLENBQUMsQ0FBQTtBQUVyRzs7Ozs7Ozs7O0dBU0c7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBMEIsTUFBTSxDQUFDLHFCQUFxQixDQUFBIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgZW5naW5lLFxuICBFeHBsb3Jlckl0ZW1QdXJjaGFzZVJlc3VsdCxcbiAgRXhwbG9yZXJVaSxcbiAgRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdCxcbiAgR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb24sXG4gIElFbmdpbmUsXG4gIFBCRXhwbG9yZXJJdGVtUHVyY2hhc2VSZXN1bHQsXG4gIFBCRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdFxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IG9wZW5FeHBsb3JlclVpLCBPcGVuRXhwbG9yZXJVaVJlc3VsdCB9IGZyb20gJ35zeXN0ZW0vUmVzdHJpY3RlZEFjdGlvbnMnXG5cbmV4cG9ydCB7IEV4cGxvcmVyVWksIE9wZW5FeHBsb3JlclVpUmVzdWx0IH1cblxuLy8gV2hhdCBhbiBleHBsb3JlciB0aGF0IGRvZXMgbm90IGVjaG8gcmVxdWVzdF9pZCwgb3IgYSB1c2VyLWluaXRpYXRlZCBhY3Rpb24sIGxlYXZlcyBvbiB0aGUgd2lyZS5cbmNvbnN0IFVOQ09SUkVMQVRFRCA9IDBcblxuLy8gUGFuZWxzIHRoYXQgY2FuIGJlIG9uIHNjcmVlbiBuZXh0IHRvIGFub3RoZXIgcGFuZWwuIFRoZSBgdWlgIGZpZWxkIGFsb25lIGNhbm5vdCBhdHRyaWJ1dGVcbi8vIHRoZWlyIGV2ZW50cywgc28gYW4gZXZlbnQgb24gb25lIG9mIHRoZXNlIHBhbmVscyBtdXN0IGNhcnJ5IGEgcmVxdWVzdF9pZC5cbmNvbnN0IENPTkNVUlJFTlRfUEFORUxTOiByZWFkb25seSBFeHBsb3JlclVpW10gPSBbRXhwbG9yZXJVaS5FVV9JVEVNX1BVUkNIQVNFXVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgQ29ycmVsYXRlZEV2ZW50ID0ge1xuICB0aW1lc3RhbXA6IG51bWJlclxuICByZXF1ZXN0SWQ6IG51bWJlclxufVxuXG4vKipcbiAqIEEgbmFtZWQgc3RyZWFtIG9mIGV2ZW50cyB0aGF0IHRoaXMgaGVscGVyIGNhbiBjb2xsZWN0IGFuZCBzdG9wIG9uLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBDaGFubmVsPE4gZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsIFQgZXh0ZW5kcyBDb3JyZWxhdGVkRXZlbnQgPSBDb3JyZWxhdGVkRXZlbnQ+ID0ge1xuICByZWFkb25seSBuYW1lOiBOXG4gIHJlYWRvbmx5IGNvbXBvbmVudDogR3Jvd09ubHlWYWx1ZVNldENvbXBvbmVudERlZmluaXRpb248VD5cbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIEFueUNoYW5uZWwgPSBDaGFubmVsPHN0cmluZywgYW55PlxuXG4vKipcbiAqIFdyYXBzIGEgZ3Jvdy1vbmx5IHJlc3VsdCBjb21wb25lbnQgYXMgYSB7QGxpbmsgQ2hhbm5lbH0uIFRoZSBuYW1lIG11c3QgYmUgdW5pcXVlIHdpdGhpbiBhIHNjZW5lLlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgZnVuY3Rpb24gY2hhbm5lbDxOIGV4dGVuZHMgc3RyaW5nLCBUIGV4dGVuZHMgQ29ycmVsYXRlZEV2ZW50PihcbiAgbmFtZTogTixcbiAgY29tcG9uZW50OiBHcm93T25seVZhbHVlU2V0Q29tcG9uZW50RGVmaW5pdGlvbjxUPlxuKTogQ2hhbm5lbDxOLCBUPiB7XG4gIHJldHVybiB7IG5hbWUsIGNvbXBvbmVudCB9XG59XG5cbi8qKiBQYW5lbCBsaWZlY3ljbGUgZXZlbnRzOiBvcGVuZWQgYW5kIGNsb3NlZC4gQHB1YmxpYyAqL1xuZXhwb3J0IGNvbnN0IEV4cGxvcmVyVWlFdmVudHM6IENoYW5uZWw8J2V4cGxvcmVyVWknLCBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQ+ID0gLyogQF9fUFVSRV9fICovIGNoYW5uZWwoXG4gICdleHBsb3JlclVpJyxcbiAgRXhwbG9yZXJVaUV2ZW50c1Jlc3VsdFxuKVxuXG4vKiogT3V0Y29tZSBvZiBhbiBgRVVfSVRFTV9QVVJDSEFTRWAgZmxvdzogcHVyY2hhc2VkLCBkaXNtaXNzZWQgb3IgZmFpbGVkLiBAcHVibGljICovXG5leHBvcnQgY29uc3QgSXRlbVB1cmNoYXNlOiBDaGFubmVsPCdpdGVtUHVyY2hhc2UnLCBQQkV4cGxvcmVySXRlbVB1cmNoYXNlUmVzdWx0PiA9IC8qIEBfX1BVUkVfXyAqLyBjaGFubmVsKFxuICAnaXRlbVB1cmNoYXNlJyxcbiAgRXhwbG9yZXJJdGVtUHVyY2hhc2VSZXN1bHRcbilcblxuLyoqXG4gKiBUaGUgYCRjYXNlYCBuYW1lcyBvZiBhIGNoYW5uZWwncyBldmVudCB1bmlvbi5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgQ2FzZU9mPEMgZXh0ZW5kcyBBbnlDaGFubmVsPiA9XG4gIEMgZXh0ZW5kcyBDaGFubmVsPGFueSwgaW5mZXIgVD4gPyBFeHRyYWN0PFRba2V5b2YgVF0sIHsgJGNhc2U6IHN0cmluZyB9PlsnJGNhc2UnXSA6IG5ldmVyXG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBWYXJpYW50PEMgZXh0ZW5kcyBBbnlDaGFubmVsID0gQW55Q2hhbm5lbCwgSyBleHRlbmRzIHN0cmluZyA9IHN0cmluZz4gPSB7XG4gIHJlYWRvbmx5IGNoYW5uZWw6IENcbiAgcmVhZG9ubHkgJGNhc2U6IEtcbn1cblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCBmdW5jdGlvbiB2YXJpYW50PEMgZXh0ZW5kcyBBbnlDaGFubmVsLCBLIGV4dGVuZHMgQ2FzZU9mPEM+PihjaDogQywgJGNhc2U6IEspOiBWYXJpYW50PEMsIEs+IHtcbiAgcmV0dXJuIHsgY2hhbm5lbDogY2gsICRjYXNlIH1cbn1cblxuLyoqXG4gKiBXaGF0IGVuZHMgdGhlIHdhaXQgYmVmb3JlIHRoZSBwYW5lbCBjbG9zZXM6IGFueSBldmVudCBvbiBhIGNoYW5uZWwsIG9yIG9uZSBgJGNhc2VgIG9mIGl0LlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgdHlwZSBTdG9wQ29uZGl0aW9uID0gQW55Q2hhbm5lbCB8IFZhcmlhbnRcblxuLyoqIEBwdWJsaWMgKi9cbmV4cG9ydCB0eXBlIENvbGxlY3RlZDxDPiA9IEMgZXh0ZW5kcyBDaGFubmVsPGluZmVyIE4sIGluZmVyIFQ+ID8geyBjaGFubmVsOiBOOyBldmVudDogVCB9IDogbmV2ZXJcblxuLyoqXG4gKiBIb3cgdGhlIHdhaXQgZW5kZWQuXG4gKiAtIGBjbG9zZWRgOiB0aGUgcGFuZWwgdGhpcyBjYWxsIG9wZW5lZCB3YXMgY2xvc2VkLlxuICogLSBgbWF0Y2hlZGA6IGB1bnRpbGAgZmlyZWQgZmlyc3QsIHNvIHRoZSBwYW5lbCBtYXkgc3RpbGwgYmUgb24gc2NyZWVuLlxuICogLSBgbm90T3BlbmVkYDogdGhpcyBjYWxsIGRpZCBub3Qgb3BlbiBhbnl0aGluZy4gYG9wZW5SZXN1bHRgIHNheXMgd2h5LlxuICogLSBgdGltZWRPdXRgOiBgdGltZW91dE1zYCBlbGFwc2VkIGZpcnN0LlxuICpcbiAqIGBldmVudHNgIGFsd2F5cyBob2xkcyBldmVyeXRoaW5nIGNvbGxlY3RlZCwgdGhlIGV2ZW50IHRoYXQgc3RvcHBlZCB0aGUgd2FpdCBpbmNsdWRlZC5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IHR5cGUgV2FpdE91dGNvbWU8QyBleHRlbmRzIHJlYWRvbmx5IEFueUNoYW5uZWxbXT4gPVxuICB8IHsgJGNhc2U6ICdjbG9zZWQnOyBldmVudHM6IHJlYWRvbmx5IENvbGxlY3RlZDxDW251bWJlcl0+W10gfVxuICB8IHsgJGNhc2U6ICdtYXRjaGVkJzsgZXZlbnRzOiByZWFkb25seSBDb2xsZWN0ZWQ8Q1tudW1iZXJdPltdIH1cbiAgfCB7ICRjYXNlOiAnbm90T3BlbmVkJzsgb3BlblJlc3VsdDogT3BlbkV4cGxvcmVyVWlSZXN1bHQgfVxuICB8IHsgJGNhc2U6ICd0aW1lZE91dCc7IGV2ZW50czogcmVhZG9ubHkgQ29sbGVjdGVkPENbbnVtYmVyXT5bXSB9XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBXYWl0T3B0aW9uczxDIGV4dGVuZHMgcmVhZG9ubHkgQW55Q2hhbm5lbFtdPiA9IHtcbiAgLyoqIENoYW5uZWxzIHdob3NlIGV2ZW50cyBsYW5kIGluIGBldmVudHNgLiBEZWZhdWx0cyB0byBub25lLiAqL1xuICBjb2xsZWN0PzogQ1xuICAvKiogU3RvcHMgdGhlIHdhaXQgZWFybHkuIFRoZSBwYW5lbCBjbG9zaW5nIGFsd2F5cyBzdG9wcyBpdCByZWdhcmRsZXNzLiAqL1xuICB1bnRpbD86IFN0b3BDb25kaXRpb25cbiAgLyoqXG4gICAqIEJvdW5kcyB0aGUgd2FpdCwgaW4gbWlsbGlzZWNvbmRzLiBPbiBleHBpcnkgdGhlIHByb21pc2UgcmVzb2x2ZXMgd2l0aCBgJGNhc2U6ICd0aW1lZE91dCdgLlxuICAgKiBObyBkZWZhdWx0LCBiZWNhdXNlIGEgcGFuZWwgY2FuIHN0YXkgb3BlbiBmb3IgbWludXRlcy4gV2l0aG91dCBpdCwgYW4gZXhwbG9yZXIgdGhhdCBvcGVuc1xuICAgKiBhIHBhbmVsIGFuZCB0aGVuIGVtaXRzIG5vIGBjbG9zZWRgIGxlYXZlcyB0aGUgcHJvbWlzZSBwZW5kaW5nIGZvciB0aGUgc2NlbmUncyB3aG9sZSBsaWZlLlxuICAgKi9cbiAgdGltZW91dE1zPzogbnVtYmVyXG59XG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBPcGVuRXhwbG9yZXJVaVJlcXVlc3QgPVxuICB8IHsgdWk6IEV4Y2x1ZGU8RXhwbG9yZXJVaSwgRXhwbG9yZXJVaS5FVV9JVEVNX1BVUkNIQVNFPjsgaXRlbVB1cmNoYXNlPzogdW5kZWZpbmVkIH1cbiAgfCB7IHVpOiBFeHBsb3JlclVpLkVVX0lURU1fUFVSQ0hBU0U7IGl0ZW1QdXJjaGFzZTogeyB1cm46IHN0cmluZyB9IH1cblxuLyoqXG4gKiBTaWduYXR1cmUgb2Yge0BsaW5rIG9wZW5FeHBsb3JlclVpQW5kV2FpdH0uIFRoZSBzZWNvbmQgb3ZlcmxvYWQgdGFrZXMgYSBiYXJlIGB1aWAsIHNvIGFcbiAqIGNvbXB1dGVkIHBhbmVsIHZhbHVlIG5lZWRzIG5vIG5hcnJvd2luZy5cbiAqIEBwdWJsaWNcbiAqL1xuZXhwb3J0IGludGVyZmFjZSBPcGVuRXhwbG9yZXJVaUFuZFdhaXQge1xuICA8Y29uc3QgQyBleHRlbmRzIHJlYWRvbmx5IEFueUNoYW5uZWxbXSA9IFtdPihcbiAgICByZXF1ZXN0OiBPcGVuRXhwbG9yZXJVaVJlcXVlc3QsXG4gICAgb3B0aW9ucz86IFdhaXRPcHRpb25zPEM+XG4gICk6IFByb21pc2U8V2FpdE91dGNvbWU8Qz4+XG4gICh1aTogRXhjbHVkZTxFeHBsb3JlclVpLCBFeHBsb3JlclVpLkVVX0lURU1fUFVSQ0hBU0U+KTogUHJvbWlzZTxXYWl0T3V0Y29tZTxbXT4+XG59XG5cbi8qKiBAaW50ZXJuYWwgZXhwb3NlZCBmb3IgdGVzdHMgKi9cbmV4cG9ydCBjb25zdCBFWFBMT1JFUl9VSV9XQUlUX1RJTUVPVVRfU1lTVEVNID0gJ2V4cGxvcmVyLXVpLXdhaXQtdGltZW91dCdcblxuLy8gTG93ZXN0IHByaW9yaXR5IHNvcnRzIHRoaXMgc3lzdGVtIGxhc3QsIHNvIHdoZW4gaXQgcmVtb3ZlcyBpdHNlbGYgbWlkLXRpY2sgaXQgc3BsaWNlcyB0aGVcbi8vIGxhc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhlIGVuZ2luZSBpcyBpdGVyYXRpbmcgYW5kIHNraXBzIG5vIG90aGVyIHN5c3RlbS5cbmNvbnN0IFRJTUVPVVRfU1lTVEVNX1BSSU9SSVRZID0gTnVtYmVyLk1JTl9TQUZFX0lOVEVHRVJcblxudHlwZSBPcGVuRXhwbG9yZXJVaUZuID0gKGJvZHk6IHtcbiAgdWk6IEV4cGxvcmVyVWlcbiAgcmVxdWVzdElkPzogbnVtYmVyXG4gIGl0ZW1QdXJjaGFzZT86IHsgdXJuOiBzdHJpbmcgfVxufSkgPT4gUHJvbWlzZTx7IG9wZW5SZXN1bHQ6IE9wZW5FeHBsb3JlclVpUmVzdWx0IH0+XG5cbnR5cGUgQ29sbGVjdGVkRXZlbnQgPSB7IGNoYW5uZWw6IHN0cmluZzsgZXZlbnQ6IENvcnJlbGF0ZWRFdmVudCB9XG5cbnR5cGUgU2Vzc2lvbiA9IHtcbiAgcmVxdWVzdElkOiBudW1iZXJcbiAgdWk6IEV4cGxvcmVyVWlcbiAgY29ycmVsYXRpb25SZXF1aXJlZDogYm9vbGVhblxuICBjb2xsZWN0OiBSZWFkb25seVNldDxzdHJpbmc+XG4gIHdhdGNoZWQ6IFJlYWRvbmx5U2V0PHN0cmluZz5cbiAgdW50aWw6IHsgY2hhbm5lbDogc3RyaW5nOyAkY2FzZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0gfCB1bmRlZmluZWRcbiAgZXZlbnRzOiBDb2xsZWN0ZWRFdmVudFtdXG4gIHRpbWVvdXRNczogbnVtYmVyIHwgdW5kZWZpbmVkXG4gIGVsYXBzZWRNczogbnVtYmVyXG4gIHNldHRsZWQ6IGJvb2xlYW5cbiAgc2V0dGxlOiAob3V0Y29tZTogV2FpdE91dGNvbWU8bmV2ZXJbXT4pID0+IHZvaWRcbiAgZmFpbDogKGVycm9yOiBFcnJvcikgPT4gdm9pZFxufVxuXG50eXBlIEF0dHJpYnV0aW9uID0gJ3llcycgfCAnbm8nIHwgJ2FtYmlndW91cydcblxuLy8gdHMtcHJvdG8gcmVuZGVycyBhIGBvbmVvZmAgYXMgb25lIHdyYXBwZXIgcHJvcGVydHkgYHsgJGNhc2UsIFskY2FzZV06IHZhbHVlIH1gLiBGaW5kaW5nIHRoYXRcbi8vIHByb3BlcnR5IGJ5IHNoYXBlIGtlZXBzIHRoZSBoZWxwZXIgaW5kZXBlbmRlbnQgb2YgdGhlIG5hbWUgZWFjaCBtZXNzYWdlIGdhdmUgaXQ6IGBldmVudGAgb25cbi8vIG9uZSBtZXNzYWdlLCBgc3RhdHVzYCBvbiBhbm90aGVyLlxuZnVuY3Rpb24gY2FzZU9mKGV2ZW50OiBDb3JyZWxhdGVkRXZlbnQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICBmb3IgKGNvbnN0IGtleSBvZiBPYmplY3Qua2V5cyhldmVudCkpIHtcbiAgICBjb25zdCB2YWx1ZSA9IChldmVudCBhcyB1bmtub3duIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+KVtrZXldXG4gICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mICh2YWx1ZSBhcyB7ICRjYXNlPzogdW5rbm93biB9KS4kY2FzZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiAodmFsdWUgYXMgeyAkY2FzZTogc3RyaW5nIH0pLiRjYXNlXG4gICAgfVxuICB9XG4gIHJldHVybiB1bmRlZmluZWRcbn1cblxuZnVuY3Rpb24gbm9ybWFsaXplU3RvcChzdG9wOiBTdG9wQ29uZGl0aW9uKTogeyBjaGFubmVsOiBBbnlDaGFubmVsOyAkY2FzZTogc3RyaW5nIHwgdW5kZWZpbmVkIH0ge1xuICByZXR1cm4gJyRjYXNlJyBpbiBzdG9wID8geyBjaGFubmVsOiBzdG9wLmNoYW5uZWwsICRjYXNlOiBzdG9wLiRjYXNlIH0gOiB7IGNoYW5uZWw6IHN0b3AsICRjYXNlOiB1bmRlZmluZWQgfVxufVxuXG4vKiogQGludGVybmFsIHRlc3Qgc2VhbS4gVGhlIHByb2R1Y3Rpb24gaW5zdGFuY2UgaXMge0BsaW5rIG9wZW5FeHBsb3JlclVpQW5kV2FpdH0uICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlKGRlcHM6IHtcbiAgZW5naW5lOiBJRW5naW5lXG4gIG9wZW5FeHBsb3JlclVpOiBPcGVuRXhwbG9yZXJVaUZuXG4gIGV4cGxvcmVyVWlFdmVudHM6IENoYW5uZWw8J2V4cGxvcmVyVWknLCBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQ+XG59KSB7XG4gIGNvbnN0IHsgZW5naW5lOiBlbmdpbmVJbnN0YW5jZSwgb3BlbkV4cGxvcmVyVWk6IG9wZW5FeHBsb3JlclVpRm4sIGV4cGxvcmVyVWlFdmVudHMgfSA9IGRlcHNcbiAgY29uc3Qgcm9vdCA9IGVuZ2luZUluc3RhbmNlLlJvb3RFbnRpdHlcblxuICBjb25zdCBzZXNzaW9ucyA9IG5ldyBNYXA8bnVtYmVyLCBTZXNzaW9uPigpXG4gIC8vIEtleWVkIGJ5IG5hbWUsIHNvIHR3byB3cmFwcGVycyBhcm91bmQgdGhlIHNhbWUgY29tcG9uZW50IGFybSBvbmUgbGlzdGVuZXIsIG5vdCB0d28uXG4gIGNvbnN0IGFybWVkID0gbmV3IE1hcDxzdHJpbmcsIEdyb3dPbmx5VmFsdWVTZXRDb21wb25lbnREZWZpbml0aW9uPGFueT4+KClcbiAgLy8gU3RhcnRzIGF0IDEgc28gYSBtaW50ZWQgaWQgbmV2ZXIgY29sbGlkZXMgd2l0aCBVTkNPUlJFTEFURUQuXG4gIGxldCBuZXh0UmVxdWVzdElkID0gMVxuICBsZXQgdGltZW91dFN5c3RlbUFkZGVkID0gZmFsc2VcblxuICBmdW5jdGlvbiBhcm0oY2g6IEFueUNoYW5uZWwpIHtcbiAgICBjb25zdCBib3VuZCA9IGFybWVkLmdldChjaC5uYW1lKVxuICAgIGlmIChib3VuZCkge1xuICAgICAgaWYgKGJvdW5kICE9PSBjaC5jb21wb25lbnQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBvcGVuRXhwbG9yZXJVaUFuZFdhaXQ6IGNoYW5uZWwgbmFtZSAnJHtjaC5uYW1lfScgaXMgYWxyZWFkeSBib3VuZCB0byBhIGRpZmZlcmVudCBjb21wb25lbnQuIGAgK1xuICAgICAgICAgICAgYENoYW5uZWwgbmFtZXMgaWRlbnRpZnkgYSBzdHJlYW0sIHNvIHRoZXkgaGF2ZSB0byBiZSB1bmlxdWUgd2l0aGluIGEgc2NlbmUuYFxuICAgICAgICApXG4gICAgICB9XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgYXJtZWQuc2V0KGNoLm5hbWUsIGNoLmNvbXBvbmVudClcbiAgICBjb25zdCBuYW1lID0gY2gubmFtZVxuICAgIC8vIG9uQ2hhbmdlIGhhcyBubyB1bnN1YnNjcmliZSwgc28gb25lIGxpc3RlbmVyIHBlciBjaGFubmVsIGxpdmVzIGZvciB0aGUgZW5naW5lJ3MgbGlmZXRpbWUuXG4gICAgY2guY29tcG9uZW50Lm9uQ2hhbmdlKHJvb3QsICh2YWx1ZTogQ29ycmVsYXRlZEV2ZW50IHwgdW5kZWZpbmVkKSA9PiB7XG4gICAgICAvLyBgdW5kZWZpbmVkYCBhcnJpdmVzIG9uIERFTEVURV9FTlRJVFkuIE90aGVyd2lzZSBgdmFsdWVgIGlzIG9uZSBhcHBlbmRlZCBlbGVtZW50LFxuICAgICAgLy8gbm90IHRoZSB3aG9sZSBzZXQuXG4gICAgICBpZiAodmFsdWUpIGRlbGl2ZXIobmFtZSwgdmFsdWUpXG4gICAgfSlcbiAgfVxuXG4gIGZ1bmN0aW9uIGF0dHJpYnV0ZShzZXNzaW9uOiBTZXNzaW9uLCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBDb3JyZWxhdGVkRXZlbnQpOiBBdHRyaWJ1dGlvbiB7XG4gICAgaWYgKGV2ZW50LnJlcXVlc3RJZCA9PT0gc2Vzc2lvbi5yZXF1ZXN0SWQpIHJldHVybiAneWVzJ1xuICAgIGlmIChldmVudC5yZXF1ZXN0SWQgIT09IFVOQ09SUkVMQVRFRCkgcmV0dXJuICdubydcbiAgICAvLyBPbmx5IHRoZSBsaWZlY3ljbGUgY2hhbm5lbCBjYXJyaWVzIGEgc2Vjb25kIGRpc2NyaW1pbmF0b3IsIGB1aWAsIGFuZCBpdCBpZGVudGlmaWVzIGFcbiAgICAvLyBzZXNzaW9uIG9ubHkgd2hpbGUgcGFuZWxzIGNhbm5vdCBjb2V4aXN0LiBBIHNlY29uZCBjYWxsIGZvciB0aGUgc2FtZSBwYW5lbCBpcyBhbnN3ZXJlZFxuICAgIC8vIFdBU19BTFJFQURZX09QRU4sIHNvIGF0IG1vc3Qgb25lIHNlc3Npb24gcGVyIG5vbi1jb25jdXJyZW50IHBhbmVsIGlzIGV2ZXIgbGl2ZS5cbiAgICBpZiAoc2Vzc2lvbi5jb3JyZWxhdGlvblJlcXVpcmVkIHx8IG5hbWUgIT09IGV4cGxvcmVyVWlFdmVudHMubmFtZSkgcmV0dXJuICdhbWJpZ3VvdXMnXG4gICAgcmV0dXJuIChldmVudCBhcyBQQkV4cGxvcmVyVWlFdmVudHNSZXN1bHQpLnVpID09PSBzZXNzaW9uLnVpID8gJ3llcycgOiAnbm8nXG4gIH1cblxuICBmdW5jdGlvbiBkZWxpdmVyKG5hbWU6IHN0cmluZywgZXZlbnQ6IENvcnJlbGF0ZWRFdmVudCkge1xuICAgIC8vIFNldHRsaW5nIGRlbGV0ZXMgZnJvbSBgc2Vzc2lvbnNgIG1pZC1pdGVyYXRpb24sIHdoaWNoIGEgTWFwIHRvbGVyYXRlcy4gTm90aGluZyBhZGRzLlxuICAgIGZvciAoY29uc3Qgc2Vzc2lvbiBvZiBzZXNzaW9ucy52YWx1ZXMoKSkge1xuICAgICAgaWYgKCFzZXNzaW9uLndhdGNoZWQuaGFzKG5hbWUpKSBjb250aW51ZVxuICAgICAgY29uc3QgYXR0cmlidXRpb24gPSBhdHRyaWJ1dGUoc2Vzc2lvbiwgbmFtZSwgZXZlbnQpXG4gICAgICBpZiAoYXR0cmlidXRpb24gPT09ICdubycpIGNvbnRpbnVlXG4gICAgICBpZiAoYXR0cmlidXRpb24gPT09ICdhbWJpZ3VvdXMnKSB7XG4gICAgICAgIGZhaWxTZXNzaW9uKFxuICAgICAgICAgIHNlc3Npb24sXG4gICAgICAgICAgbmV3IEVycm9yKFxuICAgICAgICAgICAgYG9wZW5FeHBsb3JlclVpQW5kV2FpdDogZ290IGEgJyR7bmFtZX0nIGV2ZW50IHdpdGggbm8gcmVxdWVzdF9pZCwgYW5kIG5vdGhpbmcgZWxzZSBpZGVudGlmaWVzIGAgK1xuICAgICAgICAgICAgICBgdGhlIGNhbGwgaXQgYmVsb25ncyB0by4gVGhpcyBleHBsb3JlciBkb2VzIG5vdCBlY2hvIE9wZW5FeHBsb3JlclVpUmVxdWVzdC5yZXF1ZXN0X2lkLmBcbiAgICAgICAgICApXG4gICAgICAgIClcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cbiAgICAgIGFjY2VwdChzZXNzaW9uLCBuYW1lLCBldmVudClcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBhY2NlcHQoc2Vzc2lvbjogU2Vzc2lvbiwgbmFtZTogc3RyaW5nLCBldmVudDogQ29ycmVsYXRlZEV2ZW50KSB7XG4gICAgaWYgKHNlc3Npb24uY29sbGVjdC5oYXMobmFtZSkpIHNlc3Npb24uZXZlbnRzLnB1c2goeyBjaGFubmVsOiBuYW1lLCBldmVudCB9KVxuXG4gICAgLy8gVGhlIGNsb3NlIGlzIHRlcm1pbmFsIGFuZCB3aW5zIG92ZXIgYHVudGlsYCwgYmVjYXVzZSBgbWF0Y2hlZGAgd291bGQgdGVsbCB0aGUgY2FsbGVyXG4gICAgLy8gdGhhdCB0aGUgcGFuZWwgaXMgc3RpbGwgb24gc2NyZWVuLlxuICAgIGlmIChuYW1lID09PSBleHBsb3JlclVpRXZlbnRzLm5hbWUgJiYgY2FzZU9mKGV2ZW50KSA9PT0gJ2Nsb3NlZCcpIHtcbiAgICAgIHNldHRsZVNlc3Npb24oc2Vzc2lvbiwgeyAkY2FzZTogJ2Nsb3NlZCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgY29uc3QgdW50aWwgPSBzZXNzaW9uLnVudGlsXG4gICAgaWYgKCF1bnRpbCB8fCB1bnRpbC5jaGFubmVsICE9PSBuYW1lKSByZXR1cm5cbiAgICBpZiAodW50aWwuJGNhc2UgPT09IHVuZGVmaW5lZCB8fCB1bnRpbC4kY2FzZSA9PT0gY2FzZU9mKGV2ZW50KSkge1xuICAgICAgc2V0dGxlU2Vzc2lvbihzZXNzaW9uLCB7ICRjYXNlOiAnbWF0Y2hlZCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHNldHRsZVNlc3Npb24oc2Vzc2lvbjogU2Vzc2lvbiwgb3V0Y29tZTogV2FpdE91dGNvbWU8bmV2ZXJbXT4pIHtcbiAgICBpZiAoc2Vzc2lvbi5zZXR0bGVkKSByZXR1cm5cbiAgICBzZXNzaW9uLnNldHRsZWQgPSB0cnVlXG4gICAgc2Vzc2lvbnMuZGVsZXRlKHNlc3Npb24ucmVxdWVzdElkKVxuICAgIHNlc3Npb24uc2V0dGxlKG91dGNvbWUpXG4gICAgbWF5YmVSZW1vdmVUaW1lb3V0U3lzdGVtKClcbiAgfVxuXG4gIGZ1bmN0aW9uIGZhaWxTZXNzaW9uKHNlc3Npb246IFNlc3Npb24sIGVycm9yOiBFcnJvcikge1xuICAgIGlmIChzZXNzaW9uLnNldHRsZWQpIHJldHVyblxuICAgIHNlc3Npb24uc2V0dGxlZCA9IHRydWVcbiAgICBzZXNzaW9ucy5kZWxldGUoc2Vzc2lvbi5yZXF1ZXN0SWQpXG4gICAgc2Vzc2lvbi5mYWlsKGVycm9yKVxuICAgIG1heWJlUmVtb3ZlVGltZW91dFN5c3RlbSgpXG4gIH1cblxuICBmdW5jdGlvbiBoYXNUaW1lZFNlc3Npb24oKTogYm9vbGVhbiB7XG4gICAgZm9yIChjb25zdCBzZXNzaW9uIG9mIHNlc3Npb25zLnZhbHVlcygpKSB7XG4gICAgICBpZiAoc2Vzc2lvbi50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRydWVcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICBmdW5jdGlvbiBtYXliZVJlbW92ZVRpbWVvdXRTeXN0ZW0oKSB7XG4gICAgaWYgKCF0aW1lb3V0U3lzdGVtQWRkZWQgfHwgaGFzVGltZWRTZXNzaW9uKCkpIHJldHVyblxuICAgIHRpbWVvdXRTeXN0ZW1BZGRlZCA9IGZhbHNlXG4gICAgZW5naW5lSW5zdGFuY2UucmVtb3ZlU3lzdGVtKEVYUExPUkVSX1VJX1dBSVRfVElNRU9VVF9TWVNURU0pXG4gIH1cblxuICBmdW5jdGlvbiBlbnN1cmVUaW1lb3V0U3lzdGVtKCkge1xuICAgIGlmICh0aW1lb3V0U3lzdGVtQWRkZWQpIHJldHVyblxuICAgIHRpbWVvdXRTeXN0ZW1BZGRlZCA9IHRydWVcbiAgICAvLyBUaGUgc2NlbmUgcnVudGltZSBoYXMgbm8gdGltZXJzLCBzbyBlbGFwc2VkIHRpbWUgaXMgYWNjdW11bGF0ZWQgZnJvbSB0aGUgZW5naW5lJ3MgZHQuXG4gICAgZW5naW5lSW5zdGFuY2UuYWRkU3lzdGVtKFxuICAgICAgKGR0OiBudW1iZXIpID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBzZXNzaW9uIG9mIHNlc3Npb25zLnZhbHVlcygpKSB7XG4gICAgICAgICAgaWYgKHNlc3Npb24udGltZW91dE1zID09PSB1bmRlZmluZWQpIGNvbnRpbnVlXG4gICAgICAgICAgc2Vzc2lvbi5lbGFwc2VkTXMgKz0gZHQgKiAxMDAwXG4gICAgICAgICAgaWYgKHNlc3Npb24uZWxhcHNlZE1zID49IHNlc3Npb24udGltZW91dE1zKSB7XG4gICAgICAgICAgICBzZXR0bGVTZXNzaW9uKHNlc3Npb24sIHsgJGNhc2U6ICd0aW1lZE91dCcsIGV2ZW50czogc2Vzc2lvbi5ldmVudHMgYXMgbmV2ZXJbXSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBtYXliZVJlbW92ZVRpbWVvdXRTeXN0ZW0oKVxuICAgICAgfSxcbiAgICAgIFRJTUVPVVRfU1lTVEVNX1BSSU9SSVRZLFxuICAgICAgRVhQTE9SRVJfVUlfV0FJVF9USU1FT1VUX1NZU1RFTVxuICAgIClcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIG9wZW5FeHBsb3JlclVpQW5kV2FpdChcbiAgICByZXF1ZXN0OiBPcGVuRXhwbG9yZXJVaVJlcXVlc3QgfCBFeGNsdWRlPEV4cGxvcmVyVWksIEV4cGxvcmVyVWkuRVVfSVRFTV9QVVJDSEFTRT4sXG4gICAgb3B0aW9ucz86IFdhaXRPcHRpb25zPHJlYWRvbmx5IEFueUNoYW5uZWxbXT5cbiAgKTogUHJvbWlzZTxXYWl0T3V0Y29tZTxuZXZlcltdPj4ge1xuICAgIGNvbnN0IHsgdWksIGl0ZW1QdXJjaGFzZSB9ID0gdHlwZW9mIHJlcXVlc3QgPT09ICdudW1iZXInID8geyB1aTogcmVxdWVzdCwgaXRlbVB1cmNoYXNlOiB1bmRlZmluZWQgfSA6IHJlcXVlc3RcbiAgICBjb25zdCByZXF1ZXN0SWQgPSBuZXh0UmVxdWVzdElkKytcblxuICAgIGNvbnN0IGNvbGxlY3QgPSBvcHRpb25zPy5jb2xsZWN0ID8/IFtdXG4gICAgY29uc3QgY29sbGVjdE5hbWVzID0gbmV3IFNldDxzdHJpbmc+KClcbiAgICBmb3IgKGNvbnN0IGNoIG9mIGNvbGxlY3QpIGNvbGxlY3ROYW1lcy5hZGQoY2gubmFtZSlcblxuICAgIGNvbnN0IHN0b3AgPSBvcHRpb25zPy51bnRpbCA/IG5vcm1hbGl6ZVN0b3Aob3B0aW9ucy51bnRpbCkgOiB1bmRlZmluZWRcbiAgICBjb25zdCB3YXRjaGVkID0gbmV3IFNldDxzdHJpbmc+KGNvbGxlY3ROYW1lcylcbiAgICB3YXRjaGVkLmFkZChleHBsb3JlclVpRXZlbnRzLm5hbWUpXG4gICAgaWYgKHN0b3ApIHdhdGNoZWQuYWRkKHN0b3AuY2hhbm5lbC5uYW1lKVxuXG4gICAgLy8gQXJtZWQgYmVmb3JlIHRoZSBSUEMsIGJlY2F1c2UgZXZlbnRzIGNhbiBsYW5kIHdoaWxlIHRoZSBSUEMgaXMgaW4gZmxpZ2h0LiBBIGxpc3RlbmVyXG4gICAgLy8gdGhhdCBpcyBhbHJlYWR5IHVwIGlzIHdoYXQgbWFrZXMgcmVwbGF5aW5nIHRoZSBhY2N1bXVsYXRlZCBzZXQgdW5uZWNlc3NhcnkuXG4gICAgYXJtKGV4cGxvcmVyVWlFdmVudHMpXG4gICAgZm9yIChjb25zdCBjaCBvZiBjb2xsZWN0KSBhcm0oY2gpXG4gICAgaWYgKHN0b3ApIGFybShzdG9wLmNoYW5uZWwpXG5cbiAgICBsZXQgc2V0dGxlITogKG91dGNvbWU6IFdhaXRPdXRjb21lPG5ldmVyW10+KSA9PiB2b2lkXG4gICAgbGV0IGZhaWwhOiAoZXJyb3I6IEVycm9yKSA9PiB2b2lkXG4gICAgY29uc3Qgb3V0Y29tZSA9IG5ldyBQcm9taXNlPFdhaXRPdXRjb21lPG5ldmVyW10+PigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBzZXR0bGUgPSByZXNvbHZlXG4gICAgICBmYWlsID0gcmVqZWN0XG4gICAgfSlcblxuICAgIGNvbnN0IHNlc3Npb246IFNlc3Npb24gPSB7XG4gICAgICByZXF1ZXN0SWQsXG4gICAgICB1aSxcbiAgICAgIGNvcnJlbGF0aW9uUmVxdWlyZWQ6IENPTkNVUlJFTlRfUEFORUxTLmluY2x1ZGVzKHVpKSxcbiAgICAgIGNvbGxlY3Q6IGNvbGxlY3ROYW1lcyxcbiAgICAgIHdhdGNoZWQsXG4gICAgICB1bnRpbDogc3RvcCA/IHsgY2hhbm5lbDogc3RvcC5jaGFubmVsLm5hbWUsICRjYXNlOiBzdG9wLiRjYXNlIH0gOiB1bmRlZmluZWQsXG4gICAgICBldmVudHM6IFtdLFxuICAgICAgdGltZW91dE1zOiBvcHRpb25zPy50aW1lb3V0TXMsXG4gICAgICBlbGFwc2VkTXM6IDAsXG4gICAgICBzZXR0bGVkOiBmYWxzZSxcbiAgICAgIHNldHRsZSxcbiAgICAgIGZhaWxcbiAgICB9XG4gICAgc2Vzc2lvbnMuc2V0KHJlcXVlc3RJZCwgc2Vzc2lvbilcbiAgICBpZiAoc2Vzc2lvbi50aW1lb3V0TXMgIT09IHVuZGVmaW5lZCkgZW5zdXJlVGltZW91dFN5c3RlbSgpXG5cbiAgICB0cnkge1xuICAgICAgY29uc3QgeyBvcGVuUmVzdWx0IH0gPSBhd2FpdCBvcGVuRXhwbG9yZXJVaUZuKHsgdWksIHJlcXVlc3RJZCwgaXRlbVB1cmNoYXNlIH0pXG4gICAgICAvLyBUaGlzIGNhbGwgb3BlbmVkIG5vdGhpbmcsIHNvIG5vIGV2ZW50IGNhcnJ5aW5nIHRoaXMgcmVxdWVzdCBpZCBpcyBjb21pbmcuXG4gICAgICBpZiAob3BlblJlc3VsdCAhPT0gT3BlbkV4cGxvcmVyVWlSZXN1bHQuT1BFTkVEKSB7XG4gICAgICAgIHNldHRsZVNlc3Npb24oc2Vzc2lvbiwgeyAkY2FzZTogJ25vdE9wZW5lZCcsIG9wZW5SZXN1bHQgfSlcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgLy8gUm91dGVkIHRocm91Z2ggdGhlIHNlc3Npb24gcmF0aGVyIHRoYW4gcmV0aHJvd24sIHNvIHRoYXQgYG91dGNvbWVgIGlzIG5ldmVyIGxlZnRcbiAgICAgIC8vIHBlbmRpbmcgYW5kIHVub2JzZXJ2ZWQuXG4gICAgICBmYWlsU2Vzc2lvbihzZXNzaW9uLCBlcnJvciBhcyBFcnJvcilcbiAgICB9XG5cbiAgICByZXR1cm4gb3V0Y29tZVxuICB9XG5cbiAgLy8gVGhlIGltcGxlbWVudGF0aW9uIHRha2VzIGJvdGggYXJndW1lbnQgZm9ybXMgYW5kIGlzIGJsaW5kIHRvIGBjb2xsZWN0YC4gVGhlIGNhc3QgaXMgd2hhdFxuICAvLyBnaXZlcyBjYWxsZXJzIHRoZSB0d28gb3ZlcmxvYWRzIHRoYXQgcmVsYXRlIHRoZW0uXG4gIHJldHVybiB7IG9wZW5FeHBsb3JlclVpQW5kV2FpdDogb3BlbkV4cGxvcmVyVWlBbmRXYWl0IGFzIE9wZW5FeHBsb3JlclVpQW5kV2FpdCB9XG59XG5cbmNvbnN0IGhlbHBlciA9IC8qIEBfX1BVUkVfXyAqLyBjcmVhdGUoeyBlbmdpbmUsIG9wZW5FeHBsb3JlclVpLCBleHBsb3JlclVpRXZlbnRzOiBFeHBsb3JlclVpRXZlbnRzIH0pXG5cbi8qKlxuICogT3BlbnMgYW4gZXhwbG9yZXIgcGFuZWwgYW5kIHdhaXRzIGZvciB0aGUgc2Vzc2lvbiBpdCBzdGFydGVkLiBUaGUgd2FpdCBlbmRzIHdoZW4gdGhlIHBhbmVsXG4gKiBjbG9zZXMuIFNlZSB7QGxpbmsgV2FpdE9wdGlvbnN9IHRvIGNvbGxlY3QgZXZlbnRzLCB0byBzdG9wIGVhcmxpZXIgb3IgdG8gYm91bmQgdGhlIHdhaXQuXG4gKlxuICogRXZlcnkgbGlmZWN5Y2xlIG91dGNvbWUgcmVzb2x2ZXMsIHNlZSB7QGxpbmsgV2FpdE91dGNvbWV9LiBUaGUgcHJvbWlzZSByZWplY3RzIG9ubHkgd2hlbiBhblxuICogZXZlbnQgY2Fubm90IGJlIGF0dHJpYnV0ZWQgdG8gYSBjYWxsIGF0IGFsbDogYW4gZXhwbG9yZXIgdG9vIG9sZCB0byBlY2hvIGByZXF1ZXN0X2lkYFxuICogcGFpcmVkIHdpdGggYSBwYW5lbCB0aGF0IGNhbiBjb2V4aXN0IHdpdGggYW5vdGhlciBvbmUuXG4gKlxuICogQHB1YmxpY1xuICovXG5leHBvcnQgY29uc3Qgb3BlbkV4cGxvcmVyVWlBbmRXYWl0OiBPcGVuRXhwbG9yZXJVaUFuZFdhaXQgPSBoZWxwZXIub3BlbkV4cGxvcmVyVWlBbmRXYWl0XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { Observable } from './Observable';
|
|
2
|
+
/**
|
|
3
|
+
* @internal
|
|
4
|
+
* Raw `localeChanged` events drained from the renderer by `pollEvents`.
|
|
5
|
+
* Kept side-effect free so `observables` doesn't load `platform` for every scene.
|
|
6
|
+
*/
|
|
7
|
+
export const localeChangedEvents = new Observable();
|
|
8
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFuZ3VhZ2UtZXZlbnRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2ludGVybmFsL2xhbmd1YWdlLWV2ZW50cy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBRXpDOzs7O0dBSUc7QUFDSCxNQUFNLENBQUMsTUFBTSxtQkFBbUIsR0FBRyxJQUFJLFVBQVUsRUFBc0IsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL09ic2VydmFibGUnXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBSYXcgYGxvY2FsZUNoYW5nZWRgIGV2ZW50cyBkcmFpbmVkIGZyb20gdGhlIHJlbmRlcmVyIGJ5IGBwb2xsRXZlbnRzYC5cbiAqIEtlcHQgc2lkZS1lZmZlY3QgZnJlZSBzbyBgb2JzZXJ2YWJsZXNgIGRvZXNuJ3QgbG9hZCBgcGxhdGZvcm1gIGZvciBldmVyeSBzY2VuZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvY2FsZUNoYW5nZWRFdmVudHMgPSBuZXcgT2JzZXJ2YWJsZTx7IGxvY2FsZTogc3RyaW5nIH0+KClcbiJdfQ==
|
package/observables.d.ts
CHANGED
|
@@ -29,6 +29,10 @@ export interface IEvents {
|
|
|
29
29
|
sender: string;
|
|
30
30
|
message: string;
|
|
31
31
|
};
|
|
32
|
+
/** Triggered when the player switches the client language. `locale` is a BCP-47 tag */
|
|
33
|
+
localeChanged: {
|
|
34
|
+
locale: string;
|
|
35
|
+
};
|
|
32
36
|
/**
|
|
33
37
|
* This is triggered once the scene should start.
|
|
34
38
|
*/
|
package/observables.js
CHANGED
|
@@ -2,6 +2,7 @@ import { Observable } from './internal/Observable';
|
|
|
2
2
|
import { AvatarBase, AvatarEmoteCommand, AvatarEquippedData, PlayerIdentityData, PointerEventsResult, RealmInfo, engine } from '@dcl/ecs';
|
|
3
3
|
import { subscribe } from '~system/EngineApi';
|
|
4
4
|
import players from './players';
|
|
5
|
+
import { localeChangedEvents } from './internal/language-events';
|
|
5
6
|
/**
|
|
6
7
|
* @internal
|
|
7
8
|
* This function generates a callback that is passed to the Observable
|
|
@@ -98,6 +99,10 @@ export async function pollEvents(sendBatch) {
|
|
|
98
99
|
onCommsMessage.notifyObservers(data);
|
|
99
100
|
break;
|
|
100
101
|
}
|
|
102
|
+
case 'localeChanged': {
|
|
103
|
+
localeChangedEvents.notifyObservers(data);
|
|
104
|
+
break;
|
|
105
|
+
}
|
|
101
106
|
}
|
|
102
107
|
}
|
|
103
108
|
}
|
|
@@ -245,4 +250,4 @@ function processObservables() {
|
|
|
245
250
|
engine.addSystem(observableSystem);
|
|
246
251
|
return { subscribe };
|
|
247
252
|
}
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2xELE9BQU8sRUFDTCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUVsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFNBQVMsRUFFVCxNQUFNLEVBQ1AsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRixPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUE7QUEwRi9COzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQXdCO0lBQ2hELE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdkQ7YUFBTTtZQUNMLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxVQUFVLENBQTBCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDL0c7OzhNQUU4TTtBQUM5TSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUE7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUEwQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBRS9HOzs4TUFFOE07QUFDOU0sTUFBTSxDQUFDLE1BQU0sWUFBWSxHQUFHLHNCQUFzQixD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QUU7WUFDZixVQUFVLEdBQUcsSUFBSSxDQUFBO1lBQ2pCLHNCQUFzQixDQUFDLGVBQWUsQ0FBQyxFQUFFLENBQUMsQ0FBQTtTQUMzQztRQUNELElBQUksY0FBYztZQUFFLE9BQU07UUFDMUIsY0FBYyxHQUFHLGtCQUFrQixDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEVBQUUsT0FBTyxDQUFBO0lBQzdFLENBQUM7SUFFRCxNQUFNLENBQUMsU0FBUyxDQUFDLGdCQUFnQixDQUFDLENBQUE7SUFFbEMsT0FBTyxFQUFFLFNBQVMsRUFBRSxDQUFBO0FBQ3RCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBPYnNlcnZhYmxlIH0gZnJvbSAnLi9pbnRlcm5hbC9PYnNlcnZhYmxlJ1xuaW1wb3J0IHtcbiAgQXZhdGFyQmFzZSxcbiAgQXZhdGFyRW1vdGVDb21tYW5kLFxuICBBdmF0YXJFcXVpcHBlZERhdGEsXG4gIEVudGl0eSxcbiAgUGxheWVySWRlbnRpdHlEYXRhLFxuICBQb2ludGVyRXZlbnRzUmVzdWx0LFxuICBSZWFsbUluZm8sXG4gIFZlY3RvcjNUeXBlLFxuICBlbmdpbmVcbn0gZnJvbSAnQGRjbC9lY3MnXG5pbXBvcnQgeyBNYW55RW50aXR5QWN0aW9uLCBTZW5kQmF0Y2hSZXNwb25zZSwgc3Vic2NyaWJlIH0gZnJvbSAnfnN5c3RlbS9FbmdpbmVBcGknXG5pbXBvcnQgcGxheWVycyBmcm9tICcuL3BsYXllcnMnXG5cbi8vLyAtLS0gRVZFTlRTIC0tLVxuXG4vKiogQHB1YmxpYyAqL1xuZXhwb3J0IHR5cGUgSUV2ZW50TmFtZXMgPSBrZXlvZiBJRXZlbnRzXG5cbi8qKlxuICogQHB1YmxpY1xuICogTm90ZTogRG9uJ3QgdXNlIGBvbmAgcHJlZml4IGZvciBJRXZlbnRzIHRvIGF2b2lkIHJlZHVuZGFuY3kgd2l0aCBgZXZlbnQub24oXCJvbkV2ZW50TmFtZVwiKWAgc3ludGF4LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIElFdmVudHMge1xuICBwbGF5ZXJFeHByZXNzaW9uOiB7XG4gICAgZXhwcmVzc2lvbklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgZW50ZXJzIHRoZSBzY2VuZVxuICAgKi9cbiAgb25FbnRlclNjZW5lOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIHdoZW4gdGhlIHVzZXIgbGVhdmVzIHRoZSBzY2VuZVxuICAgKi9cbiAgb25MZWF2ZVNjZW5lOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGV2ZW50IGdldHMgdHJpZ2dlcmVkIGFmdGVyIHJlY2VpdmluZyBhIGNvbW1zIG1lc3NhZ2UuXG4gICAqL1xuICBjb21tczoge1xuICAgIHNlbmRlcjogc3RyaW5nXG4gICAgbWVzc2FnZTogc3RyaW5nXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBpcyB0cmlnZ2VyZWQgb25jZSB0aGUgc2NlbmUgc2hvdWxkIHN0YXJ0LlxuICAgKi9cbiAgc2NlbmVTdGFydDogdW5rbm93blxuXG4gIC8qKiBUaGlzIGlzIHRyaWdnZXJlZCBhdCBsZWFzdCBmb3IgZWFjaCB2aWRlb1N0YXR1cyBjaGFuZ2UgKi9cbiAgdmlkZW9FdmVudDoge1xuICAgIGNvbXBvbmVudElkOiBzdHJpbmdcbiAgICB2aWRlb0NsaXBJZDogc3RyaW5nXG4gICAgLyoqIFN0YXR1cywgY2FuIGJlIE5PTkUgPSAwLCBFUlJPUiA9IDEsIExPQURJTkcgPSAyLCBSRUFEWSA9IDMsIFBMQVlJTkcgPSA0LEJVRkZFUklORyA9IDUgKi9cbiAgICB2aWRlb1N0YXR1czogbnVtYmVyXG4gICAgLyoqIEN1cnJlbnQgb2Zmc2V0IHBvc2l0aW9uIGluIHNlY29uZHMgKi9cbiAgICBjdXJyZW50T2Zmc2V0OiBudW1iZXJcbiAgICAvKiogVmlkZW8gbGVuZ3RoIGluIHNlY29uZHMuIENhbiBiZSAtMSAqL1xuICAgIHRvdGFsVmlkZW9MZW5ndGg6IG51bWJlclxuICB9XG5cbiAgLyoqIFRoaXMgaXMgdHJpZ2dlciBldmVyeXRpbWUgYSBwcm9maWxlIGlzIGNoYW5nZWQgKi9cbiAgcHJvZmlsZUNoYW5nZWQ6IHtcbiAgICBldGhBZGRyZXNzOiBzdHJpbmdcbiAgICB2ZXJzaW9uOiBudW1iZXJcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBwZWVyJ3MgYXZhdGFyIGlzIGNvbm5lY3RlZCBhbmQgdmlzaWJsZSAqL1xuICBwbGF5ZXJDb25uZWN0ZWQ6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIHBlZXIgZGlzY29ubmVjdCBhbmQvb3IgaXQgYXZhdGFyIGlzIHNldCBpbnZpc2libGUgYnkgY29tbXMgKi9cbiAgcGxheWVyRGlzY29ubmVjdGVkOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBjdXJyZW50IHJlYWxtIG9yIGlzbGFuZCBjaGFuZ2VzICovXG4gIG9uUmVhbG1DaGFuZ2VkOiB7XG4gICAgZG9tYWluOiBzdHJpbmdcbiAgICByb29tOiBzdHJpbmdcbiAgICBzZXJ2ZXJOYW1lOiBzdHJpbmdcbiAgICBkaXNwbGF5TmFtZTogc3RyaW5nXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gb3RoZXIgcGxheWVyJ3MgYXZhdGFyIGlzIGNsaWNrZWQgKi9cbiAgcGxheWVyQ2xpY2tlZDoge1xuICAgIHVzZXJJZDogc3RyaW5nXG4gICAgcmF5OiB7XG4gICAgICBvcmlnaW46IFZlY3RvcjNUeXBlXG4gICAgICBkaXJlY3Rpb246IFZlY3RvcjNUeXBlXG4gICAgICBkaXN0YW5jZTogbnVtYmVyXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQGludGVybmFsXG4gKiBUaGlzIGZ1bmN0aW9uIGdlbmVyYXRlcyBhIGNhbGxiYWNrIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSBPYnNlcnZhYmxlXG4gKiBjb25zdHJ1Y3RvciB0byBzdWJzY3JpYmUgdG8gdGhlIGV2ZW50cyBvZiB0aGUgRGVjZW50cmFsYW5kSW50ZXJmYWNlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZVN1YnNjcmliZXIoZXZlbnROYW1lOiBrZXlvZiBJRXZlbnRzKSB7XG4gIHJldHVybiAoKSA9PiB7XG4gICAgaWYgKGV2ZW50TmFtZSA9PT0gJ2NvbW1zJykge1xuICAgICAgc3Vic2NyaWJlKHsgZXZlbnRJZDogZXZlbnROYW1lIH0pLmNhdGNoKGNvbnNvbGUuZXJyb3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIFNESzdDb21wb25lbnRzT2JzZXJ2YWJsZT8uc3Vic2NyaWJlKGV2ZW50TmFtZSlcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBUaGVzZSBldmVudHMgYXJlIHRyaWdnZXJlZCBhZnRlciB5b3VyIGNoYXJhY3RlciBlbnRlcnMgdGhlIHNjZW5lLlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uRW50ZXJTY2VuZU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydvbkVudGVyU2NlbmUnXT4oY3JlYXRlU3Vic2NyaWJlcignb25FbnRlclNjZW5lJykpXG4vKiogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuIFVzZSBvbkVudGVyU2NlbmVPYnNlcnZhYmxlIGluc3RlYWQuICovXG5leHBvcnQgY29uc3Qgb25FbnRlclNjZW5lID0gb25FbnRlclNjZW5lT2JzZXJ2YWJsZVxuXG4vKipcbiAqIFRoZXNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGFmdGVyIHlvdXIgY2hhcmFjdGVyIGxlYXZlcyB0aGUgc2NlbmUuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ29uTGVhdmVTY2VuZSddPihjcmVhdGVTdWJzY3JpYmVyKCdvbkxlYXZlU2NlbmUnKSlcblxuLyoqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLiBVc2Ugb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZSBpbnN0ZWFkLiAqL1xuZXhwb3J0IGNvbnN0IG9uTGVhdmVTY2VuZSA9IG9uTGVhdmVTY2VuZU9ic2VydmFibGVcblxuLyoqXG4gKiBUaGlzIGV2ZW50IGlzIHRyaWdnZXJlZCBhZnRlciBhbGwgdGhlIHJlc291cmNlcyBvZiB0aGUgc2NlbmUgd2VyZSBsb2FkZWQgKG1vZGVscywgdGV4dHVyZXMsIGV0Yy4uLilcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblNjZW5lUmVhZHlPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snc2NlbmVTdGFydCddPihjcmVhdGVTdWJzY3JpYmVyKCdzY2VuZVN0YXJ0JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRXhwcmVzc2lvbk9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJFeHByZXNzaW9uJ10+KFxuICBjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJFeHByZXNzaW9uJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25WaWRlb0V2ZW50ID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sndmlkZW9FdmVudCddPihjcmVhdGVTdWJzY3JpYmVyKCd2aWRlb0V2ZW50JykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUHJvZmlsZUNoYW5nZWQgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwcm9maWxlQ2hhbmdlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdwcm9maWxlQ2hhbmdlZCcpKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydwbGF5ZXJDb25uZWN0ZWQnXT4oXG4gIGNyZWF0ZVN1YnNjcmliZXIoJ3BsYXllckNvbm5lY3RlZCcpXG4pXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyRGlzY29ubmVjdGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckRpc2Nvbm5lY3RlZCddPihcbiAgY3JlYXRlU3Vic2NyaWJlcigncGxheWVyRGlzY29ubmVjdGVkJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snb25SZWFsbUNoYW5nZWQnXT4oY3JlYXRlU3Vic2NyaWJlcignb25SZWFsbUNoYW5nZWQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJDbGlja2VkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckNsaWNrZWQnXT4oY3JlYXRlU3Vic2NyaWJlcigncGxheWVyQ2xpY2tlZCcpKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uQ29tbXNNZXNzYWdlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snY29tbXMnXT4oY3JlYXRlU3Vic2NyaWJlcignY29tbXMnKSlcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBkZXByZWNhdGVkIHRoaXMgaXMgYW4gT0xEIEFQSS5cbiAqIFRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgU0RLNiBzZW5kQmF0Y2ggdG8gcG9sbCBldmVudHMgZnJvbSB0aGUgcmVuZGVyZXJcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHBvbGxFdmVudHMoc2VuZEJhdGNoOiAoYm9keTogTWFueUVudGl0eUFjdGlvbikgPT4gUHJvbWlzZTxTZW5kQmF0Y2hSZXNwb25zZT4pIHtcbiAgY29uc3QgeyBldmVudHMgfSA9IGF3YWl0IHNlbmRCYXRjaCh7IGFjdGlvbnM6IFtdIH0pXG4gIGZvciAoY29uc3QgZSBvZiBldmVudHMpIHtcbiAgICBpZiAoZS5nZW5lcmljKSB7XG4gICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShlLmdlbmVyaWMuZXZlbnREYXRhKVxuICAgICAgc3dpdGNoIChlLmdlbmVyaWMuZXZlbnRJZCkge1xuICAgICAgICBjYXNlICdjb21tcyc6IHtcbiAgICAgICAgICBvbkNvbW1zTWVzc2FnZS5ub3RpZnlPYnNlcnZlcnMoZGF0YSBhcyBJRXZlbnRzWydjb21tcyddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlID0gcHJvY2Vzc09ic2VydmFibGVzKClcbmZ1bmN0aW9uIHByb2Nlc3NPYnNlcnZhYmxlcygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQ8a2V5b2YgSUV2ZW50cz4oKVxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9ucy5oYXMoZXZlbnROYW1lKSkgcmV0dXJuXG4gICAgc3dpdGNoIChldmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BsYXllckNsaWNrZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZVBsYXllckNsaWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uRW50ZXJTY2VuZSc6XG4gICAgICBjYXNlICdwbGF5ZXJDb25uZWN0ZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZUVudGVyU2NlbmUoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnb25MZWF2ZVNjZW5lJzpcbiAgICAgIGNhc2UgJ3BsYXllckRpc2Nvbm5lY3RlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlTGVhdmVTY2VuZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdvblJlYWxtQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUmVhbG1DaGFuZ2UoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAncGxheWVyRXhwcmVzc2lvbic6IHtcbiAgICAgICAgc3Vic2NyaWJlUGxheWVyRXhwcmVzc2lvbigpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdwcm9maWxlQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50TmFtZSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIEVOVEVSL0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVFbnRlclNjZW5lKCkge1xuICAgIHBsYXllcnMub25FbnRlclNjZW5lKChwbGF5ZXIpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25FbnRlclNjZW5lJykpIHtcbiAgICAgICAgb25FbnRlclNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQ6IHBsYXllci51c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJDb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkOiBwbGF5ZXIudXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIExFQVZFL0RJU0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVMZWF2ZVNjZW5lKCkge1xuICAgIHBsYXllcnMub25MZWF2ZVNjZW5lKCh1c2VySWQpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25MZWF2ZVNjZW5lJykpIHtcbiAgICAgICAgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckRpc2Nvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUkVBTE0gQ0hBTkdFIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVJlYWxtQ2hhbmdlKCkge1xuICAgIFJlYWxtSW5mby5vbkNoYW5nZShlbmdpbmUuUm9vdEVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgZG9tYWluOiB2YWx1ZS5iYXNlVXJsLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB2YWx1ZS5yZWFsbU5hbWUsXG4gICAgICAgICAgcm9vbTogdmFsdWUucm9vbSA/PyAnJyxcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiB2YWx1ZS5yZWFsbU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBQTEFZRVIvQVZBVEFSIENMSUNLRUQgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUGxheWVyQ2xpY2soKSB7XG4gICAgY29uc3QgcGxheWVyRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpIHtcbiAgICAgICAgaWYgKHBsYXllckVudGl0aWVzLmhhcyhlbnRpdHkpKSBjb250aW51ZVxuICAgICAgICBwbGF5ZXJFbnRpdGllcy5hZGQoZW50aXR5KVxuXG4gICAgICAgIFBvaW50ZXJFdmVudHNSZXN1bHQub25DaGFuZ2UoZW50aXR5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhPy5oaXQpIHtcbiAgICAgICAgICAgIG9uUGxheWVyQ2xpY2tlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgdXNlcklkOiBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVudGl0eSk/LmFkZHJlc3MgPz8gJycsXG4gICAgICAgICAgICAgIHJheToge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGF0YS5oaXQuZGlyZWN0aW9uISxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGF0YS5oaXQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogZGF0YS5oaXQuZ2xvYmFsT3JpZ2luIVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXllciBleHByZXNzaW9uIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVBsYXllckV4cHJlc3Npb24oKSB7XG4gICAgQXZhdGFyRW1vdGVDb21tYW5kLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyBleHByZXNzaW9uSWQ6IHZhbHVlPy5lbW90ZVVybiA/PyAnJyB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUFJPRklMRSBDSEFOR0Ugb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpIHtcbiAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICgpID0+IHtcbiAgICAgIGlmICghcHJvZmlsZUFkZHJlc3MpIHJldHVyblxuICAgICAgb25Qcm9maWxlQ2hhbmdlZC5ub3RpZnlPYnNlcnZlcnMoeyBldGhBZGRyZXNzOiBwcm9maWxlQWRkcmVzcywgdmVyc2lvbjogMCB9KVxuICAgIH0pXG5cbiAgICBBdmF0YXJFcXVpcHBlZERhdGEub25DaGFuZ2UoZW5naW5lLlBsYXllckVudGl0eSwgKCkgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgICBvblByb2ZpbGVDaGFuZ2VkLm5vdGlmeU9ic2VydmVycyh7IGV0aEFkZHJlc3M6IHByb2ZpbGVBZGRyZXNzLCB2ZXJzaW9uOiAwIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIEZsYWcgdG8gY2FsbCBvbmNlIHRoZSBzY2VuZSBpcyBpbml0YWxpemVkLlxuICBsZXQgc2NlbmVSZWFkeSA9IGZhbHNlXG4gIGxldCBwcm9maWxlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZVN5c3RlbSgpIHtcbiAgICBpZiAoc2NlbmVSZWFkeSAmJiBwcm9maWxlQWRkcmVzcykge1xuICAgICAgcmV0dXJuIGVuZ2luZS5yZW1vdmVTeXN0ZW0ob2JzZXJ2YWJsZVN5c3RlbSlcbiAgICB9XG4gICAgaWYgKCFzY2VuZVJlYWR5KSB7XG4gICAgICBzY2VuZVJlYWR5ID0gdHJ1ZVxuICAgICAgb25TY2VuZVJlYWR5T2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoe30pXG4gICAgfVxuICAgIGlmIChwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgcHJvZmlsZUFkZHJlc3MgPSBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVuZ2luZS5QbGF5ZXJFbnRpdHkpPy5hZGRyZXNzXG4gIH1cblxuICBlbmdpbmUuYWRkU3lzdGVtKG9ic2VydmFibGVTeXN0ZW0pXG5cbiAgcmV0dXJuIHsgc3Vic2NyaWJlIH1cbn1cbiJdfQ==
|
|
253
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2JzZXJ2YWJsZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJzcmMvb2JzZXJ2YWJsZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHVCQUF1QixDQUFBO0FBQ2xELE9BQU8sRUFDTCxVQUFVLEVBQ1Ysa0JBQWtCLEVBQ2xCLGtCQUFrQixFQUVsQixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ25CLFNBQVMsRUFFVCxNQUFNLEVBQ1AsTUFBTSxVQUFVLENBQUE7QUFDakIsT0FBTyxFQUF1QyxTQUFTLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQTtBQUNsRixPQUFPLE9BQU8sTUFBTSxXQUFXLENBQUE7QUFDL0IsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sNEJBQTRCLENBQUE7QUErRmhFOzs7O0dBSUc7QUFDSCxTQUFTLGdCQUFnQixDQUFDLFNBQXdCO0lBQ2hELE9BQU8sR0FBRyxFQUFFO1FBQ1YsSUFBSSxTQUFTLEtBQUssT0FBTyxFQUFFO1lBQ3pCLFNBQVMsQ0FBQyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUE7U0FDdkQ7YUFBTTtZQUNMLHdCQUF3QixFQUFFLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQTtTQUMvQztJQUNILENBQUMsQ0FBQTtBQUNILENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxVQUFVLENBQTBCLGdCQUFnQixDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUE7QUFDL0c7OzhNQUU4TTtBQUM5TSxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsc0JBQXNCLENBQUE7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLHNCQUFzQixHQUFHLElBQUksVUFBVSxDQUEwQixnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFBO0FBRS9HOzs4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QWtDLENBQUE7SUFFdEMsU0FBUyxnQkFBZ0I7UUFDdkIsSUFBSSxVQUFVLElBQUksY0FBYyxFQUFFO1lBQ2hDLE9BQU8sTUFBTSxDQUFDLFlBQVksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1NBQzdDO1FBQ0QsSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNmLFVBQVUsR0FBRyxJQUFJLENBQUE7WUFDakIsc0JBQXNCLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1NBQzNDO1FBQ0QsSUFBSSxjQUFjO1lBQUUsT0FBTTtRQUMxQixjQUFjLEdBQUcsa0JBQWtCLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxZQUFZLENBQUMsRUFBRSxPQUFPLENBQUE7SUFDN0UsQ0FBQztJQUVELE1BQU0sQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtJQUVsQyxPQUFPLEVBQUUsU0FBUyxFQUFFLENBQUE7QUFDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICcuL2ludGVybmFsL09ic2VydmFibGUnXG5pbXBvcnQge1xuICBBdmF0YXJCYXNlLFxuICBBdmF0YXJFbW90ZUNvbW1hbmQsXG4gIEF2YXRhckVxdWlwcGVkRGF0YSxcbiAgRW50aXR5LFxuICBQbGF5ZXJJZGVudGl0eURhdGEsXG4gIFBvaW50ZXJFdmVudHNSZXN1bHQsXG4gIFJlYWxtSW5mbyxcbiAgVmVjdG9yM1R5cGUsXG4gIGVuZ2luZVxufSBmcm9tICdAZGNsL2VjcydcbmltcG9ydCB7IE1hbnlFbnRpdHlBY3Rpb24sIFNlbmRCYXRjaFJlc3BvbnNlLCBzdWJzY3JpYmUgfSBmcm9tICd+c3lzdGVtL0VuZ2luZUFwaSdcbmltcG9ydCBwbGF5ZXJzIGZyb20gJy4vcGxheWVycydcbmltcG9ydCB7IGxvY2FsZUNoYW5nZWRFdmVudHMgfSBmcm9tICcuL2ludGVybmFsL2xhbmd1YWdlLWV2ZW50cydcblxuLy8vIC0tLSBFVkVOVFMgLS0tXG5cbi8qKiBAcHVibGljICovXG5leHBvcnQgdHlwZSBJRXZlbnROYW1lcyA9IGtleW9mIElFdmVudHNcblxuLyoqXG4gKiBAcHVibGljXG4gKiBOb3RlOiBEb24ndCB1c2UgYG9uYCBwcmVmaXggZm9yIElFdmVudHMgdG8gYXZvaWQgcmVkdW5kYW5jeSB3aXRoIGBldmVudC5vbihcIm9uRXZlbnROYW1lXCIpYCBzeW50YXguXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgSUV2ZW50cyB7XG4gIHBsYXllckV4cHJlc3Npb246IHtcbiAgICBleHByZXNzaW9uSWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBlbnRlcnMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkVudGVyU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgd2hlbiB0aGUgdXNlciBsZWF2ZXMgdGhlIHNjZW5lXG4gICAqL1xuICBvbkxlYXZlU2NlbmU6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqXG4gICAqIFRoaXMgZXZlbnQgZ2V0cyB0cmlnZ2VyZWQgYWZ0ZXIgcmVjZWl2aW5nIGEgY29tbXMgbWVzc2FnZS5cbiAgICovXG4gIGNvbW1zOiB7XG4gICAgc2VuZGVyOiBzdHJpbmdcbiAgICBtZXNzYWdlOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiB0aGUgcGxheWVyIHN3aXRjaGVzIHRoZSBjbGllbnQgbGFuZ3VhZ2UuIGBsb2NhbGVgIGlzIGEgQkNQLTQ3IHRhZyAqL1xuICBsb2NhbGVDaGFuZ2VkOiB7XG4gICAgbG9jYWxlOiBzdHJpbmdcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGlzIGlzIHRyaWdnZXJlZCBvbmNlIHRoZSBzY2VuZSBzaG91bGQgc3RhcnQuXG4gICAqL1xuICBzY2VuZVN0YXJ0OiB1bmtub3duXG5cbiAgLyoqIFRoaXMgaXMgdHJpZ2dlcmVkIGF0IGxlYXN0IGZvciBlYWNoIHZpZGVvU3RhdHVzIGNoYW5nZSAqL1xuICB2aWRlb0V2ZW50OiB7XG4gICAgY29tcG9uZW50SWQ6IHN0cmluZ1xuICAgIHZpZGVvQ2xpcElkOiBzdHJpbmdcbiAgICAvKiogU3RhdHVzLCBjYW4gYmUgTk9ORSA9IDAsIEVSUk9SID0gMSwgTE9BRElORyA9IDIsIFJFQURZID0gMywgUExBWUlORyA9IDQsQlVGRkVSSU5HID0gNSAqL1xuICAgIHZpZGVvU3RhdHVzOiBudW1iZXJcbiAgICAvKiogQ3VycmVudCBvZmZzZXQgcG9zaXRpb24gaW4gc2Vjb25kcyAqL1xuICAgIGN1cnJlbnRPZmZzZXQ6IG51bWJlclxuICAgIC8qKiBWaWRlbyBsZW5ndGggaW4gc2Vjb25kcy4gQ2FuIGJlIC0xICovXG4gICAgdG90YWxWaWRlb0xlbmd0aDogbnVtYmVyXG4gIH1cblxuICAvKiogVGhpcyBpcyB0cmlnZ2VyIGV2ZXJ5dGltZSBhIHByb2ZpbGUgaXMgY2hhbmdlZCAqL1xuICBwcm9maWxlQ2hhbmdlZDoge1xuICAgIGV0aEFkZHJlc3M6IHN0cmluZ1xuICAgIHZlcnNpb246IG51bWJlclxuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIHBlZXIncyBhdmF0YXIgaXMgY29ubmVjdGVkIGFuZCB2aXNpYmxlICovXG4gIHBsYXllckNvbm5lY3RlZDoge1xuICAgIHVzZXJJZDogc3RyaW5nXG4gIH1cblxuICAvKiogVHJpZ2dlcmVkIHdoZW4gcGVlciBkaXNjb25uZWN0IGFuZC9vciBpdCBhdmF0YXIgaXMgc2V0IGludmlzaWJsZSBieSBjb21tcyAqL1xuICBwbGF5ZXJEaXNjb25uZWN0ZWQ6IHtcbiAgICB1c2VySWQ6IHN0cmluZ1xuICB9XG5cbiAgLyoqIFRyaWdnZXJlZCB3aGVuIGN1cnJlbnQgcmVhbG0gb3IgaXNsYW5kIGNoYW5nZXMgKi9cbiAgb25SZWFsbUNoYW5nZWQ6IHtcbiAgICBkb21haW46IHN0cmluZ1xuICAgIHJvb206IHN0cmluZ1xuICAgIHNlcnZlck5hbWU6IHN0cmluZ1xuICAgIGRpc3BsYXlOYW1lOiBzdHJpbmdcbiAgfVxuXG4gIC8qKiBUcmlnZ2VyZWQgd2hlbiBvdGhlciBwbGF5ZXIncyBhdmF0YXIgaXMgY2xpY2tlZCAqL1xuICBwbGF5ZXJDbGlja2VkOiB7XG4gICAgdXNlcklkOiBzdHJpbmdcbiAgICByYXk6IHtcbiAgICAgIG9yaWdpbjogVmVjdG9yM1R5cGVcbiAgICAgIGRpcmVjdGlvbjogVmVjdG9yM1R5cGVcbiAgICAgIGRpc3RhbmNlOiBudW1iZXJcbiAgICB9XG4gIH1cbn1cblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2FsbGJhY2sgdGhhdCBpcyBwYXNzZWQgdG8gdGhlIE9ic2VydmFibGVcbiAqIGNvbnN0cnVjdG9yIHRvIHN1YnNjcmliZSB0byB0aGUgZXZlbnRzIG9mIHRoZSBEZWNlbnRyYWxhbmRJbnRlcmZhY2VcbiAqL1xuZnVuY3Rpb24gY3JlYXRlU3Vic2NyaWJlcihldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgcmV0dXJuICgpID0+IHtcbiAgICBpZiAoZXZlbnROYW1lID09PSAnY29tbXMnKSB7XG4gICAgICBzdWJzY3JpYmUoeyBldmVudElkOiBldmVudE5hbWUgfSkuY2F0Y2goY29uc29sZS5lcnJvcilcbiAgICB9IGVsc2Uge1xuICAgICAgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlPy5zdWJzY3JpYmUoZXZlbnROYW1lKVxuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFRoZXNlIGV2ZW50cyBhcmUgdHJpZ2dlcmVkIGFmdGVyIHlvdXIgY2hhcmFjdGVyIGVudGVycyB0aGUgc2NlbmUuXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25FbnRlclNjZW5lT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ29uRW50ZXJTY2VuZSddPihjcmVhdGVTdWJzY3JpYmVyKCdvbkVudGVyU2NlbmUnKSlcbi8qKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC4gVXNlIG9uRW50ZXJTY2VuZU9ic2VydmFibGUgaW5zdGVhZC4gKi9cbmV4cG9ydCBjb25zdCBvbkVudGVyU2NlbmUgPSBvbkVudGVyU2NlbmVPYnNlcnZhYmxlXG5cbi8qKlxuICogVGhlc2UgZXZlbnRzIGFyZSB0cmlnZ2VyZWQgYWZ0ZXIgeW91ciBjaGFyYWN0ZXIgbGVhdmVzIHRoZSBzY2VuZS5cbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvbkxlYXZlU2NlbmVPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1snb25MZWF2ZVNjZW5lJ10+KGNyZWF0ZVN1YnNjcmliZXIoJ29uTGVhdmVTY2VuZScpKVxuXG4vKiogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuIFVzZSBvbkxlYXZlU2NlbmVPYnNlcnZhYmxlIGluc3RlYWQuICovXG5leHBvcnQgY29uc3Qgb25MZWF2ZVNjZW5lID0gb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZVxuXG4vKipcbiAqIFRoaXMgZXZlbnQgaXMgdHJpZ2dlcmVkIGFmdGVyIGFsbCB0aGUgcmVzb3VyY2VzIG9mIHRoZSBzY2VuZSB3ZXJlIGxvYWRlZCAobW9kZWxzLCB0ZXh0dXJlcywgZXRjLi4uKVxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uU2NlbmVSZWFkeU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydzY2VuZVN0YXJ0J10+KGNyZWF0ZVN1YnNjcmliZXIoJ3NjZW5lU3RhcnQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckV4cHJlc3Npb24nXT4oXG4gIGNyZWF0ZVN1YnNjcmliZXIoJ3BsYXllckV4cHJlc3Npb24nKVxuKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblZpZGVvRXZlbnQgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWyd2aWRlb0V2ZW50J10+KGNyZWF0ZVN1YnNjcmliZXIoJ3ZpZGVvRXZlbnQnKSlcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25Qcm9maWxlQ2hhbmdlZCA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3Byb2ZpbGVDaGFuZ2VkJ10+KGNyZWF0ZVN1YnNjcmliZXIoJ3Byb2ZpbGVDaGFuZ2VkJykpXG5cbi8qKlxuICogQHB1YmxpY1xuICogQGRlcHJlY2F0ZWQgVGhpcyBmdW5jdGlvbiBpcyBhbiBpbmhlcml0YW5jZSBvZiBFQ1M2LCBpdCdzIGhlcmUgdGVtcG9yYXJ5IGZvciB0aGUgZmVhdHVyZSBwYXJpdHksIHBsZWFzZSByZWFkIHRoZSBuZXdzIGFuZCBkb2NzIHRvIGtub3cgaG93IGhhbmRsZSB3aGVuIGl0J3MgcmVtb3ZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG9uUGxheWVyQ29ubmVjdGVkT2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlPElFdmVudHNbJ3BsYXllckNvbm5lY3RlZCddPihcbiAgY3JlYXRlU3Vic2NyaWJlcigncGxheWVyQ29ubmVjdGVkJylcbilcblxuLyoqXG4gKiBAcHVibGljXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25QbGF5ZXJEaXNjb25uZWN0ZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sncGxheWVyRGlzY29ubmVjdGVkJ10+KFxuICBjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKVxuKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblJlYWxtQ2hhbmdlZE9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydvblJlYWxtQ2hhbmdlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdvblJlYWxtQ2hhbmdlZCcpKVxuXG4vKipcbiAqIEBwdWJsaWNcbiAqIEBkZXByZWNhdGVkIFRoaXMgZnVuY3Rpb24gaXMgYW4gaW5oZXJpdGFuY2Ugb2YgRUNTNiwgaXQncyBoZXJlIHRlbXBvcmFyeSBmb3IgdGhlIGZlYXR1cmUgcGFyaXR5LCBwbGVhc2UgcmVhZCB0aGUgbmV3cyBhbmQgZG9jcyB0byBrbm93IGhvdyBoYW5kbGUgd2hlbiBpdCdzIHJlbW92ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBvblBsYXllckNsaWNrZWRPYnNlcnZhYmxlID0gbmV3IE9ic2VydmFibGU8SUV2ZW50c1sncGxheWVyQ2xpY2tlZCddPihjcmVhdGVTdWJzY3JpYmVyKCdwbGF5ZXJDbGlja2VkJykpXG5cbi8qKlxuICogQGludGVybmFsXG4gKiBAZGVwcmVjYXRlZCBUaGlzIGZ1bmN0aW9uIGlzIGFuIGluaGVyaXRhbmNlIG9mIEVDUzYsIGl0J3MgaGVyZSB0ZW1wb3JhcnkgZm9yIHRoZSBmZWF0dXJlIHBhcml0eSwgcGxlYXNlIHJlYWQgdGhlIG5ld3MgYW5kIGRvY3MgdG8ga25vdyBob3cgaGFuZGxlIHdoZW4gaXQncyByZW1vdmVkLlxuICovXG5leHBvcnQgY29uc3Qgb25Db21tc01lc3NhZ2UgPSBuZXcgT2JzZXJ2YWJsZTxJRXZlbnRzWydjb21tcyddPihjcmVhdGVTdWJzY3JpYmVyKCdjb21tcycpKVxuXG4vKipcbiAqIEBpbnRlcm5hbFxuICogQGRlcHJlY2F0ZWQgdGhpcyBpcyBhbiBPTEQgQVBJLlxuICogVGhpcyBmdW5jdGlvbiB1c2VzIHRoZSBTREs2IHNlbmRCYXRjaCB0byBwb2xsIGV2ZW50cyBmcm9tIHRoZSByZW5kZXJlclxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcG9sbEV2ZW50cyhzZW5kQmF0Y2g6IChib2R5OiBNYW55RW50aXR5QWN0aW9uKSA9PiBQcm9taXNlPFNlbmRCYXRjaFJlc3BvbnNlPikge1xuICBjb25zdCB7IGV2ZW50cyB9ID0gYXdhaXQgc2VuZEJhdGNoKHsgYWN0aW9uczogW10gfSlcbiAgZm9yIChjb25zdCBlIG9mIGV2ZW50cykge1xuICAgIGlmIChlLmdlbmVyaWMpIHtcbiAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKGUuZ2VuZXJpYy5ldmVudERhdGEpXG4gICAgICBzd2l0Y2ggKGUuZ2VuZXJpYy5ldmVudElkKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1zJzoge1xuICAgICAgICAgIG9uQ29tbXNNZXNzYWdlLm5vdGlmeU9ic2VydmVycyhkYXRhIGFzIElFdmVudHNbJ2NvbW1zJ10pXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdsb2NhbGVDaGFuZ2VkJzoge1xuICAgICAgICAgIGxvY2FsZUNoYW5nZWRFdmVudHMubm90aWZ5T2JzZXJ2ZXJzKGRhdGEgYXMgSUV2ZW50c1snbG9jYWxlQ2hhbmdlZCddKVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbn1cblxuY29uc3QgU0RLN0NvbXBvbmVudHNPYnNlcnZhYmxlID0gcHJvY2Vzc09ic2VydmFibGVzKClcbmZ1bmN0aW9uIHByb2Nlc3NPYnNlcnZhYmxlcygpIHtcbiAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IG5ldyBTZXQ8a2V5b2YgSUV2ZW50cz4oKVxuXG4gIGZ1bmN0aW9uIHN1YnNjcmliZShldmVudE5hbWU6IGtleW9mIElFdmVudHMpIHtcbiAgICBpZiAoc3Vic2NyaXB0aW9ucy5oYXMoZXZlbnROYW1lKSkgcmV0dXJuXG4gICAgc3dpdGNoIChldmVudE5hbWUpIHtcbiAgICAgIGNhc2UgJ3BsYXllckNsaWNrZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZVBsYXllckNsaWNrKClcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ29uRW50ZXJTY2VuZSc6XG4gICAgICBjYXNlICdwbGF5ZXJDb25uZWN0ZWQnOiB7XG4gICAgICAgIHN1YnNjcmliZUVudGVyU2NlbmUoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAnb25MZWF2ZVNjZW5lJzpcbiAgICAgIGNhc2UgJ3BsYXllckRpc2Nvbm5lY3RlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlTGVhdmVTY2VuZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdvblJlYWxtQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUmVhbG1DaGFuZ2UoKVxuICAgICAgICBicmVha1xuICAgICAgfVxuICAgICAgY2FzZSAncGxheWVyRXhwcmVzc2lvbic6IHtcbiAgICAgICAgc3Vic2NyaWJlUGxheWVyRXhwcmVzc2lvbigpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgICBjYXNlICdwcm9maWxlQ2hhbmdlZCc6IHtcbiAgICAgICAgc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpXG4gICAgICAgIGJyZWFrXG4gICAgICB9XG4gICAgfVxuICAgIHN1YnNjcmlwdGlvbnMuYWRkKGV2ZW50TmFtZSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIEVOVEVSL0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVFbnRlclNjZW5lKCkge1xuICAgIHBsYXllcnMub25FbnRlclNjZW5lKChwbGF5ZXIpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25FbnRlclNjZW5lJykpIHtcbiAgICAgICAgb25FbnRlclNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQ6IHBsYXllci51c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJDb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckNvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkOiBwbGF5ZXIudXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUExBWUVSIExFQVZFL0RJU0NPTk5FQ1RFRCBvYnNlcnZhYmxlXG4gICAqL1xuICBmdW5jdGlvbiBzdWJzY3JpYmVMZWF2ZVNjZW5lKCkge1xuICAgIHBsYXllcnMub25MZWF2ZVNjZW5lKCh1c2VySWQpID0+IHtcbiAgICAgIGlmIChzdWJzY3JpcHRpb25zLmhhcygnb25MZWF2ZVNjZW5lJykpIHtcbiAgICAgICAgb25MZWF2ZVNjZW5lT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyB1c2VySWQgfSlcbiAgICAgIH1cblxuICAgICAgaWYgKHN1YnNjcmlwdGlvbnMuaGFzKCdwbGF5ZXJEaXNjb25uZWN0ZWQnKSkge1xuICAgICAgICBvblBsYXllckRpc2Nvbm5lY3RlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHsgdXNlcklkIH0pXG4gICAgICB9XG4gICAgfSlcbiAgfVxuICAvKipcbiAgICogUkVBTE0gQ0hBTkdFIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVJlYWxtQ2hhbmdlKCkge1xuICAgIFJlYWxtSW5mby5vbkNoYW5nZShlbmdpbmUuUm9vdEVudGl0eSwgKHZhbHVlKSA9PiB7XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgb25SZWFsbUNoYW5nZWRPYnNlcnZhYmxlLm5vdGlmeU9ic2VydmVycyh7XG4gICAgICAgICAgZG9tYWluOiB2YWx1ZS5iYXNlVXJsLFxuICAgICAgICAgIGRpc3BsYXlOYW1lOiB2YWx1ZS5yZWFsbU5hbWUsXG4gICAgICAgICAgcm9vbTogdmFsdWUucm9vbSA/PyAnJyxcbiAgICAgICAgICBzZXJ2ZXJOYW1lOiB2YWx1ZS5yZWFsbU5hbWVcbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG4gIC8qKlxuICAgKiBQTEFZRVIvQVZBVEFSIENMSUNLRUQgb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUGxheWVyQ2xpY2soKSB7XG4gICAgY29uc3QgcGxheWVyRW50aXRpZXMgPSBuZXcgU2V0PEVudGl0eT4oKVxuICAgIGVuZ2luZS5hZGRTeXN0ZW0oKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBbZW50aXR5XSBvZiBlbmdpbmUuZ2V0RW50aXRpZXNXaXRoKFBsYXllcklkZW50aXR5RGF0YSkpIHtcbiAgICAgICAgaWYgKHBsYXllckVudGl0aWVzLmhhcyhlbnRpdHkpKSBjb250aW51ZVxuICAgICAgICBwbGF5ZXJFbnRpdGllcy5hZGQoZW50aXR5KVxuXG4gICAgICAgIFBvaW50ZXJFdmVudHNSZXN1bHQub25DaGFuZ2UoZW50aXR5LCAoZGF0YSkgPT4ge1xuICAgICAgICAgIGlmIChkYXRhPy5oaXQpIHtcbiAgICAgICAgICAgIG9uUGxheWVyQ2xpY2tlZE9ic2VydmFibGUubm90aWZ5T2JzZXJ2ZXJzKHtcbiAgICAgICAgICAgICAgdXNlcklkOiBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVudGl0eSk/LmFkZHJlc3MgPz8gJycsXG4gICAgICAgICAgICAgIHJheToge1xuICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGF0YS5oaXQuZGlyZWN0aW9uISxcbiAgICAgICAgICAgICAgICBkaXN0YW5jZTogZGF0YS5oaXQubGVuZ3RoLFxuICAgICAgICAgICAgICAgIG9yaWdpbjogZGF0YS5oaXQuZ2xvYmFsT3JpZ2luIVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIFBsYXllciBleHByZXNzaW9uIG9ic2VydmFibGVcbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVBsYXllckV4cHJlc3Npb24oKSB7XG4gICAgQXZhdGFyRW1vdGVDb21tYW5kLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICh2YWx1ZSkgPT4ge1xuICAgICAgb25QbGF5ZXJFeHByZXNzaW9uT2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoeyBleHByZXNzaW9uSWQ6IHZhbHVlPy5lbW90ZVVybiA/PyAnJyB9KVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUFJPRklMRSBDSEFOR0Ugb2JzZXJ2YWJsZVxuICAgKi9cbiAgZnVuY3Rpb24gc3Vic2NyaWJlUHJvZmlsZUNoYW5nZSgpIHtcbiAgICBBdmF0YXJCYXNlLm9uQ2hhbmdlKGVuZ2luZS5QbGF5ZXJFbnRpdHksICgpID0+IHtcbiAgICAgIGlmICghcHJvZmlsZUFkZHJlc3MpIHJldHVyblxuICAgICAgb25Qcm9maWxlQ2hhbmdlZC5ub3RpZnlPYnNlcnZlcnMoeyBldGhBZGRyZXNzOiBwcm9maWxlQWRkcmVzcywgdmVyc2lvbjogMCB9KVxuICAgIH0pXG5cbiAgICBBdmF0YXJFcXVpcHBlZERhdGEub25DaGFuZ2UoZW5naW5lLlBsYXllckVudGl0eSwgKCkgPT4ge1xuICAgICAgaWYgKCFwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgICBvblByb2ZpbGVDaGFuZ2VkLm5vdGlmeU9ic2VydmVycyh7IGV0aEFkZHJlc3M6IHByb2ZpbGVBZGRyZXNzLCB2ZXJzaW9uOiAwIH0pXG4gICAgfSlcbiAgfVxuXG4gIC8vIEZsYWcgdG8gY2FsbCBvbmNlIHRoZSBzY2VuZSBpcyBpbml0YWxpemVkLlxuICBsZXQgc2NlbmVSZWFkeSA9IGZhbHNlXG4gIGxldCBwcm9maWxlQWRkcmVzczogc3RyaW5nIHwgdW5kZWZpbmVkXG5cbiAgZnVuY3Rpb24gb2JzZXJ2YWJsZVN5c3RlbSgpIHtcbiAgICBpZiAoc2NlbmVSZWFkeSAmJiBwcm9maWxlQWRkcmVzcykge1xuICAgICAgcmV0dXJuIGVuZ2luZS5yZW1vdmVTeXN0ZW0ob2JzZXJ2YWJsZVN5c3RlbSlcbiAgICB9XG4gICAgaWYgKCFzY2VuZVJlYWR5KSB7XG4gICAgICBzY2VuZVJlYWR5ID0gdHJ1ZVxuICAgICAgb25TY2VuZVJlYWR5T2JzZXJ2YWJsZS5ub3RpZnlPYnNlcnZlcnMoe30pXG4gICAgfVxuICAgIGlmIChwcm9maWxlQWRkcmVzcykgcmV0dXJuXG4gICAgcHJvZmlsZUFkZHJlc3MgPSBQbGF5ZXJJZGVudGl0eURhdGEuZ2V0T3JOdWxsKGVuZ2luZS5QbGF5ZXJFbnRpdHkpPy5hZGRyZXNzXG4gIH1cblxuICBlbmdpbmUuYWRkU3lzdGVtKG9ic2VydmFibGVTeXN0ZW0pXG5cbiAgcmV0dXJuIHsgc3Vic2NyaWJlIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dcl/sdk",
|
|
3
3
|
"description": "",
|
|
4
|
-
"version": "7.29.1-
|
|
4
|
+
"version": "7.29.1-35917671376.commit-046b268",
|
|
5
5
|
"author": "Decentraland",
|
|
6
6
|
"dependencies": {
|
|
7
|
-
"@dcl/ecs": "7.29.1-
|
|
7
|
+
"@dcl/ecs": "7.29.1-35917671376.commit-046b268",
|
|
8
8
|
"@dcl/ecs-math": "2.1.0",
|
|
9
|
-
"@dcl/js-runtime": "7.29.1-
|
|
10
|
-
"@dcl/react-ecs": "7.29.1-
|
|
11
|
-
"@dcl/sdk-commands": "7.29.1-
|
|
9
|
+
"@dcl/js-runtime": "7.29.1-35917671376.commit-046b268",
|
|
10
|
+
"@dcl/react-ecs": "7.29.1-35917671376.commit-046b268",
|
|
11
|
+
"@dcl/sdk-commands": "7.29.1-35917671376.commit-046b268"
|
|
12
12
|
},
|
|
13
13
|
"keywords": [],
|
|
14
14
|
"license": "Apache-2.0",
|
|
@@ -33,5 +33,5 @@
|
|
|
33
33
|
},
|
|
34
34
|
"types": "./index.d.ts",
|
|
35
35
|
"typings": "./index.d.ts",
|
|
36
|
-
"commit": "
|
|
36
|
+
"commit": "046b268beee66a9d2d67dda7834087a8052f4f9c"
|
|
37
37
|
}
|
package/platform/index.d.ts
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
|
+
import { Observable } from '../internal/Observable';
|
|
1
2
|
export type Platform = 'mobile' | 'desktop' | 'web';
|
|
3
|
+
/**
|
|
4
|
+
* Triggered when the player switches the client language mid-session.
|
|
5
|
+
* Older clients never emit it.
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare const onPlayerLanguageChanged: Observable<{
|
|
9
|
+
language: string;
|
|
10
|
+
}>;
|
|
2
11
|
export declare function getPlatform(): Platform | null;
|
|
3
12
|
export declare function isMobile(): boolean;
|
|
4
13
|
export declare function isDesktop(): boolean;
|
|
5
14
|
export declare function isWeb(): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Player's client language as a BCP-47 tag (e.g. `'es'`, `'pt-BR'`).
|
|
17
|
+
* Returns `'en'` until the explorer responds, and on clients that don't report a locale.
|
|
18
|
+
* Use `onPlayerLanguageChanged` to react to mid-session changes.
|
|
19
|
+
* @public
|
|
20
|
+
*/
|
|
21
|
+
export declare function getPlayerLanguage(): string;
|