ravcredit-lib 0.0.4 → 0.0.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/ravcredit-lib.mjs +666 -2
- package/fesm2022/ravcredit-lib.mjs.map +1 -1
- package/index.d.ts +1598 -4
- package/package.json +3 -4
- package/esm2022/lib/ravcredit-lib.component.mjs +0 -19
- package/esm2022/lib/ravcredit-lib.service.mjs +0 -14
- package/esm2022/lib/v1/objects/oAddress.mjs +0 -10
- package/esm2022/lib/v1/objects/oBusiness.mjs +0 -2
- package/esm2022/lib/v1/objects/oClient.mjs +0 -2
- package/esm2022/lib/v1/objects/oConekta.mjs +0 -85
- package/esm2022/lib/v1/objects/oContract.mjs +0 -2
- package/esm2022/lib/v1/objects/oContractAll.mjs +0 -2
- package/esm2022/lib/v1/objects/oCustomer.mjs +0 -18
- package/esm2022/lib/v1/objects/oDevice.mjs +0 -2
- package/esm2022/lib/v1/objects/oFinancial.mjs +0 -2
- package/esm2022/lib/v1/objects/oGlobal.mjs +0 -86
- package/esm2022/lib/v1/objects/oLogIn.mjs +0 -17
- package/esm2022/lib/v1/objects/oNewPayment.mjs +0 -2
- package/esm2022/lib/v1/objects/oNotification.mjs +0 -17
- package/esm2022/lib/v1/objects/oPassport.mjs +0 -7
- package/esm2022/lib/v1/objects/oUser.mjs +0 -2
- package/esm2022/lib/v1/util/UtilBusiness.mjs +0 -171
- package/esm2022/lib/v1/util/UtilClient.mjs +0 -221
- package/esm2022/lib/v1/util/UtilContract.mjs +0 -331
- package/esm2022/lib/v1/util/UtilDynamiCore.mjs +0 -292
- package/esm2022/public-api.mjs +0 -25
- package/esm2022/ravcredit-lib.mjs +0 -5
- package/lib/ravcredit-lib.component.d.ts +0 -5
- package/lib/ravcredit-lib.service.d.ts +0 -6
- package/lib/v1/objects/oAddress.d.ts +0 -10
- package/lib/v1/objects/oBusiness.d.ts +0 -101
- package/lib/v1/objects/oClient.d.ts +0 -43
- package/lib/v1/objects/oConekta.d.ts +0 -305
- package/lib/v1/objects/oContract.d.ts +0 -23
- package/lib/v1/objects/oContractAll.d.ts +0 -21
- package/lib/v1/objects/oCustomer.d.ts +0 -17
- package/lib/v1/objects/oDevice.d.ts +0 -5
- package/lib/v1/objects/oFinancial.d.ts +0 -30
- package/lib/v1/objects/oGlobal.d.ts +0 -149
- package/lib/v1/objects/oLogIn.d.ts +0 -30
- package/lib/v1/objects/oNewPayment.d.ts +0 -11
- package/lib/v1/objects/oNotification.d.ts +0 -25
- package/lib/v1/objects/oPassport.d.ts +0 -55
- package/lib/v1/objects/oUser.d.ts +0 -25
- package/lib/v1/util/UtilBusiness.d.ts +0 -52
- package/lib/v1/util/UtilClient.d.ts +0 -34
- package/lib/v1/util/UtilContract.d.ts +0 -70
- package/lib/v1/util/UtilDynamiCore.d.ts +0 -453
- package/public-api.d.ts +0 -21
|
@@ -1,331 +0,0 @@
|
|
|
1
|
-
import { UntypedFormArray, UntypedFormControl, Validators } from "@angular/forms";
|
|
2
|
-
import { cClient, cUserReference } from "./UtilClient";
|
|
3
|
-
// import {TaskState} from "firebase/storage";
|
|
4
|
-
import { cBusinessDeadlines } from "./UtilBusiness";
|
|
5
|
-
import { cAddress } from '../objects/oAddress';
|
|
6
|
-
export var eProvider;
|
|
7
|
-
(function (eProvider) {
|
|
8
|
-
eProvider["none"] = "";
|
|
9
|
-
eProvider["Conekta"] = "Conekta";
|
|
10
|
-
eProvider["Passport"] = "Passport";
|
|
11
|
-
eProvider["DynamiCore"] = "DynamiCore";
|
|
12
|
-
})(eProvider || (eProvider = {}));
|
|
13
|
-
// export type ProgressTaskStatus = TaskState | "uploading" | "idle" | "generating" | "unauthorized"
|
|
14
|
-
export const cDevice = {
|
|
15
|
-
device: "",
|
|
16
|
-
IMEI: ""
|
|
17
|
-
};
|
|
18
|
-
export const cFinancial = {
|
|
19
|
-
total: 0,
|
|
20
|
-
initial: 0,
|
|
21
|
-
deadlines: cBusinessDeadlines,
|
|
22
|
-
initDate: 0,
|
|
23
|
-
weeklyPayment: 0,
|
|
24
|
-
pendingOf: [],
|
|
25
|
-
progress: [],
|
|
26
|
-
interest: 0,
|
|
27
|
-
provider: eProvider.DynamiCore,
|
|
28
|
-
financed: 0,
|
|
29
|
-
nextPayment: 0,
|
|
30
|
-
amount_commission_opening: 0,
|
|
31
|
-
principal_disbursed: 0,
|
|
32
|
-
expected_disbursed: 0, // ---------
|
|
33
|
-
credit_type: 'Arrendamiento',
|
|
34
|
-
interest_rate: 0,
|
|
35
|
-
commission_opening: 0,
|
|
36
|
-
interest_arrears: 0,
|
|
37
|
-
};
|
|
38
|
-
export const cContract = {
|
|
39
|
-
id: "",
|
|
40
|
-
client: "",
|
|
41
|
-
address: cAddress,
|
|
42
|
-
device: cDevice,
|
|
43
|
-
financial: cFinancial,
|
|
44
|
-
by: "",
|
|
45
|
-
active: true
|
|
46
|
-
};
|
|
47
|
-
export class FactoryContract {
|
|
48
|
-
static FormClient(client) {
|
|
49
|
-
let data = cClient;
|
|
50
|
-
if (client)
|
|
51
|
-
data = client;
|
|
52
|
-
return {
|
|
53
|
-
name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
|
|
54
|
-
email: new UntypedFormControl(data.username, [Validators.required, Validators.email]),
|
|
55
|
-
phone: new UntypedFormControl(data.phone, [Validators.required, Validators.min(10)]),
|
|
56
|
-
curp: new UntypedFormControl(data.curp, [Validators.required, Validators.minLength(16)]),
|
|
57
|
-
userReferences: new UntypedFormArray([])
|
|
58
|
-
};
|
|
59
|
-
}
|
|
60
|
-
static CreateUserReferenceFormObj(user) {
|
|
61
|
-
let data = cUserReference;
|
|
62
|
-
if (user.name != "")
|
|
63
|
-
data = user;
|
|
64
|
-
return {
|
|
65
|
-
name: new UntypedFormControl(data.name, [Validators.required, Validators.minLength(10)]),
|
|
66
|
-
phone: new UntypedFormControl(data.phone, [Validators.required]),
|
|
67
|
-
relationship: new UntypedFormControl(data.relationship, [Validators.required]),
|
|
68
|
-
};
|
|
69
|
-
}
|
|
70
|
-
static FormAddress(address) {
|
|
71
|
-
let data = cAddress;
|
|
72
|
-
if (address)
|
|
73
|
-
data = address;
|
|
74
|
-
return {
|
|
75
|
-
street: new UntypedFormControl(data.street, Validators.required),
|
|
76
|
-
neighbor: new UntypedFormControl(data.neighbor, Validators.required),
|
|
77
|
-
cp: new UntypedFormControl(data.zip, Validators.required),
|
|
78
|
-
ext: new UntypedFormControl(data.ext, Validators.required),
|
|
79
|
-
int: new UntypedFormControl(data.int),
|
|
80
|
-
city: new UntypedFormControl(data.city, Validators.required),
|
|
81
|
-
state: new UntypedFormControl(data.state, Validators.required),
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
static FormDevice(device) {
|
|
85
|
-
let data = cDevice;
|
|
86
|
-
if (device)
|
|
87
|
-
data = device;
|
|
88
|
-
return {
|
|
89
|
-
model: new UntypedFormControl(data.device, Validators.required),
|
|
90
|
-
IMEI: new UntypedFormControl(data.IMEI, Validators.required),
|
|
91
|
-
ID: new UntypedFormControl(data.id),
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
static FormFinancial(financial) {
|
|
95
|
-
let data = cFinancial;
|
|
96
|
-
if (financial)
|
|
97
|
-
data = financial;
|
|
98
|
-
data.credit_type = "Arrendamiento";
|
|
99
|
-
// data.deadlines.weeks = cBusinessDeadlines
|
|
100
|
-
return {
|
|
101
|
-
total: new UntypedFormControl(data.total, [Validators.required, Validators.min(1)]),
|
|
102
|
-
initial: new UntypedFormControl(data.initial, [Validators.required]),
|
|
103
|
-
financed: new UntypedFormControl(data.financed, Validators.min(1)),
|
|
104
|
-
weeklyPayment: new UntypedFormControl(data.weeklyPayment, [Validators.required, Validators.min(1)]),
|
|
105
|
-
deadlines: new UntypedFormControl(data.deadlines, [Validators.required]),
|
|
106
|
-
initDate: new UntypedFormControl(data.initDate),
|
|
107
|
-
provider: new UntypedFormControl(data.provider),
|
|
108
|
-
credit_type: new UntypedFormControl(data.credit_type ? data.credit_type : 0),
|
|
109
|
-
interest_rate: new UntypedFormControl(data.interest_rate ? data.interest_rate : 0), // interes credit dynamic
|
|
110
|
-
commission_opening: new UntypedFormControl(data.commission_opening ? data.commission_opening : 0),
|
|
111
|
-
interest_arrears: new UntypedFormControl(data.interest_arrears ? data.interest_arrears : 0), // intereses moratorios dynamic
|
|
112
|
-
amount_commission_opening: new UntypedFormControl(data.amount_commission_opening), // comision por apertura dynamic
|
|
113
|
-
principal_disbursed: new UntypedFormControl(data.principal_disbursed),
|
|
114
|
-
expected_disbursed: new UntypedFormControl(data.expected_disbursed)
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
static CreateContractFromFormObj(data, finalPay) {
|
|
118
|
-
const date = new Date();
|
|
119
|
-
const device = {
|
|
120
|
-
device: data["device"][0].model,
|
|
121
|
-
id: data["device"][0].ID,
|
|
122
|
-
IMEI: data["device"][0].IMEI
|
|
123
|
-
};
|
|
124
|
-
const address = {
|
|
125
|
-
street: data["address"][0].street,
|
|
126
|
-
city: data["address"][0].city,
|
|
127
|
-
neighbor: data["address"][0].neighbor,
|
|
128
|
-
zip: data["address"][0].cp,
|
|
129
|
-
ext: data["address"][0].ext,
|
|
130
|
-
int: data["address"][0].int,
|
|
131
|
-
state: data["address"][0].state
|
|
132
|
-
};
|
|
133
|
-
const financial = {
|
|
134
|
-
total: Number(data["financial"][0].total),
|
|
135
|
-
initial: data["financial"][0].initial,
|
|
136
|
-
deadlines: data["financial"][0].deadlines,
|
|
137
|
-
progress: [],
|
|
138
|
-
pendingOf: [],
|
|
139
|
-
weeklyPayment: data["financial"][0].weeklyPayment,
|
|
140
|
-
interest: data["financial"][0].interest_rate,
|
|
141
|
-
finalDate: date.getTime() + (data["financial"][0].deadlines.weeks * (604800 * 1000)),
|
|
142
|
-
initDate: date.getDate(),
|
|
143
|
-
dayCut: date.getDate(),
|
|
144
|
-
provider: data["financial"][0].provider,
|
|
145
|
-
finalPayment: finalPay,
|
|
146
|
-
financed: data["financial"][0].financed,
|
|
147
|
-
nextPayment: data["financial"][0].nextPayment
|
|
148
|
-
};
|
|
149
|
-
if (data["financial"][0].provider == eProvider.DynamiCore) {
|
|
150
|
-
financial.initial = data["financial"][0].amount_commission_opening ? Number(data["financial"][0].amount_commission_opening) : 0;
|
|
151
|
-
financial.expected_disbursed = data["financial"][0].expected_disbursed ? Number(data["financial"][0].expected_disbursed) : 0;
|
|
152
|
-
financial.principal_disbursed = data["financial"][0].principal_disbursed ? Number(data["financial"][0].principal_disbursed) : 0;
|
|
153
|
-
financial.interest_arrears = data["financial"][0].interest_rate ? Number(data["financial"][0].interest_rate) : 0;
|
|
154
|
-
financial.commission_opening = data["financial"][0].commission_opening ? Number(data["financial"][0].commission_opening) : 0;
|
|
155
|
-
financial.credit_type = data["financial"][0].credit_type ? data["financial"][0].credit_type : "";
|
|
156
|
-
financial.clabe = data["financial"][0].clabe ? data["financial"][0].clabe : "";
|
|
157
|
-
}
|
|
158
|
-
if (data["financial"][0].amount_commission_opening != undefined) {
|
|
159
|
-
if (Number(data["financial"][0].amount_commission_opening) > 0)
|
|
160
|
-
financial.initial = Number(data["financial"][0].amount_commission_opening);
|
|
161
|
-
else
|
|
162
|
-
financial.initial = Number(data["financial"][0].initial);
|
|
163
|
-
}
|
|
164
|
-
if (Number(data["financial"][0].amount_commission_opening) > 0)
|
|
165
|
-
financial.amount_commission_opening = Number(data["financial"][0].amount_commission_opening);
|
|
166
|
-
else
|
|
167
|
-
financial.amount_commission_opening = financial.initial;
|
|
168
|
-
if (financial.nextPayment == undefined)
|
|
169
|
-
financial.nextPayment = 0;
|
|
170
|
-
const contract = {
|
|
171
|
-
id: "",
|
|
172
|
-
client: "",
|
|
173
|
-
address: address,
|
|
174
|
-
device: device,
|
|
175
|
-
financial: financial,
|
|
176
|
-
by: "",
|
|
177
|
-
active: true,
|
|
178
|
-
lastPayment: date.getTime(),
|
|
179
|
-
createdAt: date.getTime()
|
|
180
|
-
};
|
|
181
|
-
return contract;
|
|
182
|
-
}
|
|
183
|
-
static CreateContractToConektaObj(data, monthlyPay, finalPay) {
|
|
184
|
-
const o = {};
|
|
185
|
-
const device = {
|
|
186
|
-
device: data.device.device,
|
|
187
|
-
id: data.device.id,
|
|
188
|
-
IMEI: data.device.IMEI
|
|
189
|
-
};
|
|
190
|
-
const address = {
|
|
191
|
-
street: data.address.street,
|
|
192
|
-
city: data.address.city,
|
|
193
|
-
neighbor: data.address.neighbor,
|
|
194
|
-
zip: data.address.zip,
|
|
195
|
-
ext: data.address.ext,
|
|
196
|
-
int: data.address.int,
|
|
197
|
-
state: data.address.state
|
|
198
|
-
};
|
|
199
|
-
const financial = {
|
|
200
|
-
total: data.financial.total,
|
|
201
|
-
initial: data.financial.initial,
|
|
202
|
-
deadlines: data.financial.deadlines,
|
|
203
|
-
progress: data.financial.progress,
|
|
204
|
-
pendingOf: data.financial.pendingOf,
|
|
205
|
-
weeklyPayment: data.financial.weeklyPayment,
|
|
206
|
-
interest: data.financial.interest,
|
|
207
|
-
finalDate: data.financial.finalDate,
|
|
208
|
-
initDate: data.financial.initDate,
|
|
209
|
-
dayCut: data.financial.dayCut,
|
|
210
|
-
provider: data.financial.provider,
|
|
211
|
-
finalPayment: data.financial.finalPayment,
|
|
212
|
-
financed: data.financial.financed,
|
|
213
|
-
nextPayment: data.financial.nextPayment
|
|
214
|
-
};
|
|
215
|
-
const contract = {
|
|
216
|
-
id: "",
|
|
217
|
-
client: "",
|
|
218
|
-
address: address,
|
|
219
|
-
device: device,
|
|
220
|
-
financial: financial,
|
|
221
|
-
by: "",
|
|
222
|
-
active: true
|
|
223
|
-
};
|
|
224
|
-
return contract;
|
|
225
|
-
}
|
|
226
|
-
static CreateAuthForm(username, curp) {
|
|
227
|
-
const password = this.createPassword(curp);
|
|
228
|
-
return {
|
|
229
|
-
username: new UntypedFormControl(username, Validators.required),
|
|
230
|
-
password: new UntypedFormControl(password, Validators.required),
|
|
231
|
-
};
|
|
232
|
-
}
|
|
233
|
-
static createPassword(curp) {
|
|
234
|
-
const _curp = curp.split("");
|
|
235
|
-
let password = "";
|
|
236
|
-
const limit = 7;
|
|
237
|
-
if (_curp.length < 16)
|
|
238
|
-
return "";
|
|
239
|
-
password += _curp[0].toLowerCase();
|
|
240
|
-
for (let i = 1; i <= limit; i++)
|
|
241
|
-
password += _curp[i].toUpperCase();
|
|
242
|
-
password += `*`;
|
|
243
|
-
return password;
|
|
244
|
-
}
|
|
245
|
-
static MapperTypeContCli_Contract(_contract) {
|
|
246
|
-
const contract = {
|
|
247
|
-
id: _contract.contract,
|
|
248
|
-
client: _contract.client,
|
|
249
|
-
address: _contract.address,
|
|
250
|
-
device: _contract.device,
|
|
251
|
-
financial: _contract.financial,
|
|
252
|
-
by: _contract.by,
|
|
253
|
-
active: _contract.active,
|
|
254
|
-
lastPayment: _contract.lastPayment,
|
|
255
|
-
createdAt: _contract.createdAt,
|
|
256
|
-
dynamicAccount: _contract.dynamicAccount,
|
|
257
|
-
};
|
|
258
|
-
return contract;
|
|
259
|
-
}
|
|
260
|
-
static MapperSyncContractDynamic(base, account) {
|
|
261
|
-
let nContract = base;
|
|
262
|
-
let _financial = base.financial;
|
|
263
|
-
let _device = base.device;
|
|
264
|
-
const financial = {
|
|
265
|
-
total: _financial.total,
|
|
266
|
-
initial: account.properties.amount_commission_opening ? account.properties.amount_commission_opening : _financial.initial,
|
|
267
|
-
deadlines: _financial.deadlines,
|
|
268
|
-
progress: _financial.progress ? _financial.progress : [],
|
|
269
|
-
pendingOf: _financial.pendingOf ? _financial.pendingOf : [],
|
|
270
|
-
weeklyPayment: _financial.weeklyPayment,
|
|
271
|
-
interest: _financial.interest,
|
|
272
|
-
finalDate: _financial.finalDate,
|
|
273
|
-
initDate: _financial.initDate,
|
|
274
|
-
dayCut: _financial.dayCut,
|
|
275
|
-
provider: _financial.provider,
|
|
276
|
-
finalPayment: _financial.finalPayment,
|
|
277
|
-
financed: _financial.financed,
|
|
278
|
-
nextPayment: _financial.nextPayment ? _financial.nextPayment : 0,
|
|
279
|
-
amount_commission_opening: account.properties.amount_commission_opening,
|
|
280
|
-
expected_disbursed: account.properties.expected_disbursed ?
|
|
281
|
-
Number(account.properties.expected_disbursed) :
|
|
282
|
-
Number(_financial.expected_disbursed),
|
|
283
|
-
principal_disbursed: account.properties.principal_disbursed ?
|
|
284
|
-
account.properties.principal_disbursed :
|
|
285
|
-
_financial.principal_disbursed,
|
|
286
|
-
commission_opening: account.config.commission_opening ?
|
|
287
|
-
Number(account.config.commission_opening) :
|
|
288
|
-
Number(_financial.commission_opening),
|
|
289
|
-
credit_type: account.config.credit_type ? account.config.credit_type : _financial.credit_type,
|
|
290
|
-
clabe: String(account.properties.clabe ? account.properties.clabe : _financial.clabe)
|
|
291
|
-
};
|
|
292
|
-
const interestArrears = account.config.interest_arrears;
|
|
293
|
-
const prevInterestArrears = _financial.interest_arrears;
|
|
294
|
-
if (interestArrears != undefined) {
|
|
295
|
-
financial.interest_arrears = interestArrears;
|
|
296
|
-
}
|
|
297
|
-
else if (prevInterestArrears != undefined) {
|
|
298
|
-
financial.interest_arrears = prevInterestArrears;
|
|
299
|
-
}
|
|
300
|
-
else {
|
|
301
|
-
financial.interest_arrears = 0;
|
|
302
|
-
}
|
|
303
|
-
const interest = account.config.interest_rate;
|
|
304
|
-
const prevInterest = _financial.interest;
|
|
305
|
-
if (interest != undefined) {
|
|
306
|
-
financial.interest = interest;
|
|
307
|
-
}
|
|
308
|
-
else if (prevInterest != undefined) {
|
|
309
|
-
financial.interest = prevInterest;
|
|
310
|
-
}
|
|
311
|
-
else {
|
|
312
|
-
financial.interest = 0;
|
|
313
|
-
}
|
|
314
|
-
if (account.properties.amount_commission_opening != undefined) {
|
|
315
|
-
if (Number(account.properties.amount_commission_opening) > 0) {
|
|
316
|
-
financial.initial = Number(account.properties.amount_commission_opening);
|
|
317
|
-
financial.amount_commission_opening = Number(account.properties.amount_commission_opening);
|
|
318
|
-
}
|
|
319
|
-
else {
|
|
320
|
-
financial.initial = Number(_financial.initial);
|
|
321
|
-
financial.amount_commission_opening = financial.initial;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
const seller = account.properties.seller_name;
|
|
325
|
-
nContract.by = seller != null ? seller : "";
|
|
326
|
-
nContract.device.id = _device.id ? _device.id : "";
|
|
327
|
-
nContract.financial = financial;
|
|
328
|
-
return nContract;
|
|
329
|
-
}
|
|
330
|
-
}
|
|
331
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiVXRpbENvbnRyYWN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvcmF2Y3JlZGl0LWxpYi9zcmMvbGliL3YxL3V0aWwvVXRpbENvbnRyYWN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxVQUFVLEVBQUMsTUFBTSxnQkFBZ0IsQ0FBQztBQUNoRixPQUFPLEVBQUMsT0FBTyxFQUFFLGNBQWMsRUFBQyxNQUFNLGNBQWMsQ0FBQztBQUNyRCw4Q0FBOEM7QUFDOUMsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFJbEQsT0FBTyxFQUFDLFFBQVEsRUFBVyxNQUFNLHFCQUFxQixDQUFDO0FBS3ZELE1BQU0sQ0FBTixJQUFZLFNBS1g7QUFMRCxXQUFZLFNBQVM7SUFDbkIsc0JBQVMsQ0FBQTtJQUNULGdDQUFtQixDQUFBO0lBQ25CLGtDQUFxQixDQUFBO0lBQ3JCLHNDQUF5QixDQUFBO0FBQzNCLENBQUMsRUFMVyxTQUFTLEtBQVQsU0FBUyxRQUtwQjtBQUVELG9HQUFvRztBQUVwRyxNQUFNLENBQUMsTUFBTSxPQUFPLEdBQVk7SUFDOUIsTUFBTSxFQUFFLEVBQUU7SUFDVixJQUFJLEVBQUUsRUFBRTtDQUNULENBQUE7QUFFRCxNQUFNLENBQUMsTUFBTSxVQUFVLEdBQWU7SUFDcEMsS0FBSyxFQUFFLENBQUM7SUFDUixPQUFPLEVBQUUsQ0FBQztJQUNWLFNBQVMsRUFBRSxrQkFBa0I7SUFDN0IsUUFBUSxFQUFFLENBQUM7SUFDWCxhQUFhLEVBQUUsQ0FBQztJQUNoQixTQUFTLEVBQUUsRUFBRTtJQUNiLFFBQVEsRUFBRSxFQUFFO0lBQ1osUUFBUSxFQUFFLENBQUM7SUFDWCxRQUFRLEVBQUUsU0FBUyxDQUFDLFVBQVU7SUFDOUIsUUFBUSxFQUFFLENBQUM7SUFDWCxXQUFXLEVBQUUsQ0FBQztJQUNkLHlCQUF5QixFQUFFLENBQUM7SUFDNUIsbUJBQW1CLEVBQUUsQ0FBQztJQUN0QixrQkFBa0IsRUFBRSxDQUFDLEVBQUUsWUFBWTtJQUNuQyxXQUFXLEVBQUUsZUFBZTtJQUM1QixhQUFhLEVBQUUsQ0FBQztJQUNoQixrQkFBa0IsRUFBRSxDQUFDO0lBQ3JCLGdCQUFnQixFQUFFLENBQUM7Q0FDcEIsQ0FBQTtBQUVELE1BQU0sQ0FBQyxNQUFNLFNBQVMsR0FBYztJQUNsQyxFQUFFLEVBQUUsRUFBRTtJQUNOLE1BQU0sRUFBRSxFQUFFO0lBQ1YsT0FBTyxFQUFFLFFBQVE7SUFDakIsTUFBTSxFQUFFLE9BQU87SUFDZixTQUFTLEVBQUUsVUFBVTtJQUNyQixFQUFFLEVBQUUsRUFBRTtJQUNOLE1BQU0sRUFBRSxJQUFJO0NBQ2IsQ0FBQTtBQUVELE1BQU0sT0FBTyxlQUFlO0lBRW5CLE1BQU0sQ0FBQyxVQUFVLENBQUMsTUFBZ0I7UUFDdkMsSUFBSSxJQUFJLEdBQUcsT0FBTyxDQUFBO1FBRWxCLElBQUksTUFBTTtZQUFFLElBQUksR0FBRyxNQUFNLENBQUE7UUFFekIsT0FBTztZQUNMLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDckYsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3BGLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUN4RixjQUFjLEVBQUUsSUFBSSxnQkFBZ0IsQ0FBQyxFQUFFLENBQUM7U0FDekMsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsSUFBb0I7UUFDM0QsSUFBSSxJQUFJLEdBQUcsY0FBYyxDQUFBO1FBRXpCLElBQUksSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFO1lBQUUsSUFBSSxHQUFHLElBQUksQ0FBQTtRQUVoQyxPQUFPO1lBQ0wsSUFBSSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ3hGLEtBQUssRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDaEUsWUFBWSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUMvRSxDQUFBO0lBQ0gsQ0FBQztJQUVNLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBa0I7UUFDMUMsSUFBSSxJQUFJLEdBQUcsUUFBUSxDQUFBO1FBRW5CLElBQUksT0FBTztZQUFFLElBQUksR0FBRyxPQUFPLENBQUE7UUFFM0IsT0FBTztZQUNMLE1BQU0sRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUNoRSxRQUFRLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDcEUsRUFBRSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQ3pELEdBQUcsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUMxRCxHQUFHLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDO1lBQ3JDLElBQUksRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLFFBQVEsQ0FBQztZQUM1RCxLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDL0QsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsVUFBVSxDQUFDLE1BQWdCO1FBQ3ZDLElBQUksSUFBSSxHQUFHLE9BQU8sQ0FBQTtRQUVsQixJQUFJLE1BQU07WUFBRSxJQUFJLEdBQUcsTUFBTSxDQUFBO1FBRXpCLE9BQU87WUFDTCxLQUFLLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0QsSUFBSSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDO1lBQzVELEVBQUUsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7U0FDcEMsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsYUFBYSxDQUFDLFNBQXNCO1FBQ2hELElBQUksSUFBSSxHQUFHLFVBQVUsQ0FBQTtRQUVyQixJQUFJLFNBQVM7WUFBRSxJQUFJLEdBQUcsU0FBUyxDQUFBO1FBRS9CLElBQUksQ0FBQyxXQUFXLEdBQUcsZUFBZSxDQUFBO1FBQ2xDLDRDQUE0QztRQUU1QyxPQUFPO1lBQ0wsS0FBSyxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ25GLE9BQU8sRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDcEUsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ2xFLGFBQWEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNuRyxTQUFTLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1lBQ3hFLFFBQVEsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDL0MsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUUvQyxXQUFXLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDNUUsYUFBYSxFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUseUJBQXlCO1lBQzdHLGtCQUFrQixFQUFFLElBQUksa0JBQWtCLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUNqRyxnQkFBZ0IsRUFBRSxJQUFJLGtCQUFrQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSwrQkFBK0I7WUFFNUgseUJBQXlCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMseUJBQXlCLENBQUMsRUFBRSxnQ0FBZ0M7WUFDbkgsbUJBQW1CLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDckUsa0JBQWtCLEVBQUUsSUFBSSxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsa0JBQWtCLENBQUM7U0FDcEUsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMseUJBQXlCLENBQUMsSUFBUyxFQUFFLFFBQWdCO1FBQ2pFLE1BQU0sSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUE7UUFFdkIsTUFBTSxNQUFNLEdBQVk7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLO1lBQy9CLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUN4QixJQUFJLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7U0FDN0IsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFhO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTTtZQUNqQyxJQUFJLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUk7WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRO1lBQ3JDLEdBQUcsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMxQixHQUFHLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUc7WUFDM0IsR0FBRyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHO1lBQzNCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztTQUNoQyxDQUFBO1FBRUQsTUFBTSxTQUFTLEdBQWU7WUFDNUIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO1lBQ3pDLE9BQU8sRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTztZQUNyQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVM7WUFDekMsUUFBUSxFQUFFLEVBQUU7WUFDWixTQUFTLEVBQUUsRUFBRTtZQUNiLGFBQWEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYTtZQUNqRCxRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWE7WUFDNUMsU0FBUyxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxDQUFDO1lBQ3BGLFFBQVEsRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxFQUFFO1lBQ3RCLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUTtZQUN2QyxZQUFZLEVBQUUsUUFBUTtZQUN0QixRQUFRLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVE7WUFDdkMsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXO1NBQzlDLENBQUE7UUFDRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLElBQUksU0FBUyxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzFELFNBQVMsQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMvSCxTQUFTLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUM1SCxTQUFTLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTtZQUMvSCxTQUFTLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQ2hILFNBQVMsQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFBO1lBQzVILFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ2hHLFNBQVMsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBQ2hGLENBQUM7UUFFRCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNoRSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDO2dCQUM1RCxTQUFTLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMseUJBQXlCLENBQUMsQ0FBQTs7Z0JBRTFFLFNBQVMsQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUM1RCxDQUFDO1FBRUQsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHlCQUF5QixDQUFDLEdBQUcsQ0FBQztZQUM1RCxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBOztZQUU1RixTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtRQUV6RCxJQUFJLFNBQVMsQ0FBQyxXQUFXLElBQUksU0FBUztZQUFFLFNBQVMsQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFBO1FBRWpFLE1BQU0sUUFBUSxHQUFjO1lBQzFCLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLEVBQUU7WUFDVixPQUFPLEVBQUUsT0FBTztZQUNoQixNQUFNLEVBQUUsTUFBTTtZQUNkLFNBQVMsRUFBRSxTQUFTO1lBQ3BCLEVBQUUsRUFBRSxFQUFFO1lBQ04sTUFBTSxFQUFFLElBQUk7WUFDWixXQUFXLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtZQUMzQixTQUFTLEVBQUUsSUFBSSxDQUFDLE9BQU8sRUFBRTtTQUMxQixDQUFBO1FBQ0QsT0FBTyxRQUFRLENBQUE7SUFDakIsQ0FBQztJQUVNLE1BQU0sQ0FBQywwQkFBMEIsQ0FBQyxJQUFlLEVBQUUsVUFBa0IsRUFBRSxRQUFnQjtRQUM1RixNQUFNLENBQUMsR0FBUSxFQUFFLENBQUE7UUFFakIsTUFBTSxNQUFNLEdBQVk7WUFDdEIsTUFBTSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTtZQUMxQixFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ2xCLElBQUksRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUk7U0FDdkIsQ0FBQTtRQUNELE1BQU0sT0FBTyxHQUFhO1lBQ3hCLE1BQU0sRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFDM0IsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSTtZQUN2QixRQUFRLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRO1lBQy9CLEdBQUcsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUc7WUFDckIsR0FBRyxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRztZQUNyQixHQUFHLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHO1lBQ3JCLEtBQUssRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUs7U0FDMUIsQ0FBQTtRQUNELE1BQU0sU0FBUyxHQUFlO1lBQzVCLEtBQUssRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUs7WUFDM0IsT0FBTyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztZQUMvQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTO1lBQ25DLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUNuQyxhQUFhLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhO1lBQzNDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUztZQUNuQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRO1lBQ2pDLE1BQU0sRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU07WUFDN0IsUUFBUSxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUTtZQUNqQyxZQUFZLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxZQUFZO1lBQ3pDLFFBQVEsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLFFBQVE7WUFDakMsV0FBVyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVztTQUN4QyxDQUFBO1FBQ0QsTUFBTSxRQUFRLEdBQWM7WUFDMUIsRUFBRSxFQUFFLEVBQUU7WUFDTixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxPQUFPO1lBQ2hCLE1BQU0sRUFBRSxNQUFNO1lBQ2QsU0FBUyxFQUFFLFNBQVM7WUFDcEIsRUFBRSxFQUFFLEVBQUU7WUFDTixNQUFNLEVBQUUsSUFBSTtTQUNiLENBQUE7UUFDRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFDLGNBQWMsQ0FBQyxRQUFnQixFQUFFLElBQVk7UUFDekQsTUFBTSxRQUFRLEdBQVcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtRQUNsRCxPQUFPO1lBQ0wsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7WUFDL0QsUUFBUSxFQUFFLElBQUksa0JBQWtCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUM7U0FDaEUsQ0FBQTtJQUNILENBQUM7SUFFTSxNQUFNLENBQUMsY0FBYyxDQUFDLElBQVk7UUFDdkMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUM1QixJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUE7UUFDakIsTUFBTSxLQUFLLEdBQUcsQ0FBQyxDQUFBO1FBRWYsSUFBSSxLQUFLLENBQUMsTUFBTSxHQUFHLEVBQUU7WUFBRSxPQUFPLEVBQUUsQ0FBQTtRQUVoQyxRQUFRLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO1FBRWxDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsSUFBSSxLQUFLLEVBQUUsQ0FBQyxFQUFFO1lBQzdCLFFBQVEsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUE7UUFFcEMsUUFBUSxJQUFJLEdBQUcsQ0FBQTtRQUNmLE9BQU8sUUFBUSxDQUFBO0lBQ2pCLENBQUM7SUFFTSxNQUFNLENBQUMsMEJBQTBCLENBQUMsU0FBMkI7UUFDbEUsTUFBTSxRQUFRLEdBQWM7WUFDMUIsRUFBRSxFQUFFLFNBQVMsQ0FBQyxRQUFTO1lBQ3ZCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTTtZQUN4QixPQUFPLEVBQUUsU0FBUyxDQUFDLE9BQU87WUFDMUIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hCLFNBQVMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUM5QixFQUFFLEVBQUUsU0FBUyxDQUFDLEVBQUU7WUFDaEIsTUFBTSxFQUFFLFNBQVMsQ0FBQyxNQUFNO1lBQ3hCLFdBQVcsRUFBRSxTQUFTLENBQUMsV0FBVztZQUNsQyxTQUFTLEVBQUUsU0FBUyxDQUFDLFNBQVM7WUFDOUIsY0FBYyxFQUFFLFNBQVMsQ0FBQyxjQUFjO1NBQ3pDLENBQUE7UUFFRCxPQUFPLFFBQVEsQ0FBQTtJQUNqQixDQUFDO0lBRU0sTUFBTSxDQUFDLHlCQUF5QixDQUFDLElBQWUsRUFBRSxPQUFtQjtRQUMxRSxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDcEIsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQTtRQUMvQixJQUFJLE9BQU8sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFBO1FBR3pCLE1BQU0sU0FBUyxHQUFlO1lBQzVCLEtBQUssRUFBRSxVQUFVLENBQUMsS0FBSztZQUN2QixPQUFPLEVBQUUsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLE9BQU87WUFDekgsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ3hELFNBQVMsRUFBRSxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQzNELGFBQWEsRUFBRSxVQUFVLENBQUMsYUFBYTtZQUN2QyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsU0FBUyxFQUFFLFVBQVUsQ0FBQyxTQUFTO1lBQy9CLFFBQVEsRUFBRSxVQUFVLENBQUMsUUFBUTtZQUM3QixNQUFNLEVBQUUsVUFBVSxDQUFDLE1BQU07WUFDekIsUUFBUSxFQUFFLFVBQVUsQ0FBQyxRQUFRO1lBQzdCLFlBQVksRUFBRSxVQUFVLENBQUMsWUFBWTtZQUNyQyxRQUFRLEVBQUUsVUFBVSxDQUFDLFFBQVE7WUFDN0IsV0FBVyxFQUFFLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFaEUseUJBQXlCLEVBQ3pCLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCO1lBRTVDLGtCQUFrQixFQUNoQixPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JDLE1BQU0sQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDLENBQUMsQ0FBQztnQkFDL0MsTUFBTSxDQUFDLFVBQVUsQ0FBQyxrQkFBa0IsQ0FBQztZQUV6QyxtQkFBbUIsRUFDakIsT0FBTyxDQUFDLFVBQVUsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO2dCQUN0QyxPQUFPLENBQUMsVUFBVSxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQ3hDLFVBQVUsQ0FBQyxtQkFBbUI7WUFFbEMsa0JBQWtCLEVBQ2hCLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDakMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxNQUFNLENBQUMsVUFBVSxDQUFDLGtCQUFrQixDQUFDO1lBRXpDLFdBQVcsRUFDVCxPQUFPLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxXQUFXO1lBRWxGLEtBQUssRUFDSCxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsS0FBSyxDQUFDO1NBQ2pGLENBQUE7UUFFRCxNQUFNLGVBQWUsR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFBO1FBQ3ZELE1BQU0sbUJBQW1CLEdBQUcsVUFBVSxDQUFDLGdCQUFnQixDQUFBO1FBQ3ZELElBQUksZUFBZSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2pDLFNBQVMsQ0FBQyxnQkFBZ0IsR0FBRyxlQUFlLENBQUE7UUFDOUMsQ0FBQzthQUFNLElBQUksbUJBQW1CLElBQUksU0FBUyxFQUFFLENBQUM7WUFDNUMsU0FBUyxDQUFDLGdCQUFnQixHQUFHLG1CQUFtQixDQUFBO1FBQ2xELENBQUM7YUFBTSxDQUFDO1lBQ04sU0FBUyxDQUFDLGdCQUFnQixHQUFHLENBQUMsQ0FBQTtRQUNoQyxDQUFDO1FBRUQsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxhQUFhLENBQUE7UUFDN0MsTUFBTSxZQUFZLEdBQUcsVUFBVSxDQUFDLFFBQVEsQ0FBQTtRQUN4QyxJQUFJLFFBQVEsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUMxQixTQUFTLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtRQUMvQixDQUFDO2FBQU0sSUFBSSxZQUFZLElBQUksU0FBUyxFQUFFLENBQUM7WUFDckMsU0FBUyxDQUFDLFFBQVEsR0FBRyxZQUFZLENBQUE7UUFDbkMsQ0FBQzthQUFNLENBQUM7WUFDTixTQUFTLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQTtRQUN4QixDQUFDO1FBRUQsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLHlCQUF5QixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzlELElBQUksTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztnQkFDN0QsU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFBO2dCQUN4RSxTQUFTLENBQUMseUJBQXlCLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMseUJBQXlCLENBQUMsQ0FBQTtZQUM1RixDQUFDO2lCQUFNLENBQUM7Z0JBQ04sU0FBUyxDQUFDLE9BQU8sR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFBO2dCQUM5QyxTQUFTLENBQUMseUJBQXlCLEdBQUcsU0FBUyxDQUFDLE9BQU8sQ0FBQTtZQUN6RCxDQUFDO1FBQ0gsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUF1QixPQUFPLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQTtRQUNqRSxTQUFTLENBQUMsRUFBRSxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1FBRTNDLFNBQVMsQ0FBQyxNQUFNLENBQUMsRUFBRSxHQUFHLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQTtRQUVsRCxTQUFTLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQTtRQUMvQixPQUFPLFNBQVMsQ0FBQTtJQUNsQixDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1VudHlwZWRGb3JtQXJyYXksIFVudHlwZWRGb3JtQ29udHJvbCwgVmFsaWRhdG9yc30gZnJvbSBcIkBhbmd1bGFyL2Zvcm1zXCI7XG5pbXBvcnQge2NDbGllbnQsIGNVc2VyUmVmZXJlbmNlfSBmcm9tIFwiLi9VdGlsQ2xpZW50XCI7XG4vLyBpbXBvcnQge1Rhc2tTdGF0ZX0gZnJvbSBcImZpcmViYXNlL3N0b3JhZ2VcIjtcbmltcG9ydCB7Y0J1c2luZXNzRGVhZGxpbmVzfSBmcm9tIFwiLi9VdGlsQnVzaW5lc3NcIjtcbmltcG9ydCB7SURDQWNjb3VudH0gZnJvbSBcIi4vVXRpbER5bmFtaUNvcmVcIjtcbmltcG9ydCB7b0RldmljZX0gZnJvbSAnLi4vb2JqZWN0cy9vRGV2aWNlJztcbmltcG9ydCB7b0ZpbmFuY2lhbH0gZnJvbSAnLi4vb2JqZWN0cy9vRmluYW5jaWFsJztcbmltcG9ydCB7Y0FkZHJlc3MsIG9BZGRyZXNzfSBmcm9tICcuLi9vYmplY3RzL29BZGRyZXNzJztcbmltcG9ydCB7b0NvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29Db250cmFjdCc7XG5pbXBvcnQge29DbGllbnQsIG9Vc2VyUmVmZXJlbmNlfSBmcm9tICcuLi9vYmplY3RzL29DbGllbnQnO1xuaW1wb3J0IHt0eUNsaWVudENvbnRyYWN0fSBmcm9tICcuLi9vYmplY3RzL29HbG9iYWwnO1xuXG5leHBvcnQgZW51bSBlUHJvdmlkZXIge1xuICBub25lID0gXCJcIixcbiAgQ29uZWt0YSA9IFwiQ29uZWt0YVwiLFxuICBQYXNzcG9ydCA9IFwiUGFzc3BvcnRcIixcbiAgRHluYW1pQ29yZSA9IFwiRHluYW1pQ29yZVwiLFxufVxuXG4vLyBleHBvcnQgdHlwZSBQcm9ncmVzc1Rhc2tTdGF0dXMgPSBUYXNrU3RhdGUgfCBcInVwbG9hZGluZ1wiIHwgXCJpZGxlXCIgfCBcImdlbmVyYXRpbmdcIiB8IFwidW5hdXRob3JpemVkXCJcblxuZXhwb3J0IGNvbnN0IGNEZXZpY2U6IG9EZXZpY2UgPSB7XG4gIGRldmljZTogXCJcIixcbiAgSU1FSTogXCJcIlxufVxuXG5leHBvcnQgY29uc3QgY0ZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgdG90YWw6IDAsXG4gIGluaXRpYWw6IDAsXG4gIGRlYWRsaW5lczogY0J1c2luZXNzRGVhZGxpbmVzLFxuICBpbml0RGF0ZTogMCxcbiAgd2Vla2x5UGF5bWVudDogMCxcbiAgcGVuZGluZ09mOiBbXSxcbiAgcHJvZ3Jlc3M6IFtdLFxuICBpbnRlcmVzdDogMCxcbiAgcHJvdmlkZXI6IGVQcm92aWRlci5EeW5hbWlDb3JlLFxuICBmaW5hbmNlZDogMCxcbiAgbmV4dFBheW1lbnQ6IDAsXG4gIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IDAsXG4gIHByaW5jaXBhbF9kaXNidXJzZWQ6IDAsXG4gIGV4cGVjdGVkX2Rpc2J1cnNlZDogMCwgLy8gLS0tLS0tLS0tXG4gIGNyZWRpdF90eXBlOiAnQXJyZW5kYW1pZW50bycsXG4gIGludGVyZXN0X3JhdGU6IDAsXG4gIGNvbW1pc3Npb25fb3BlbmluZzogMCxcbiAgaW50ZXJlc3RfYXJyZWFyczogMCxcbn1cblxuZXhwb3J0IGNvbnN0IGNDb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICBpZDogXCJcIixcbiAgY2xpZW50OiBcIlwiLFxuICBhZGRyZXNzOiBjQWRkcmVzcyxcbiAgZGV2aWNlOiBjRGV2aWNlLFxuICBmaW5hbmNpYWw6IGNGaW5hbmNpYWwsXG4gIGJ5OiBcIlwiLFxuICBhY3RpdmU6IHRydWVcbn1cblxuZXhwb3J0IGNsYXNzIEZhY3RvcnlDb250cmFjdCB7XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtQ2xpZW50KGNsaWVudD86IG9DbGllbnQpIHtcbiAgICBsZXQgZGF0YSA9IGNDbGllbnRcblxuICAgIGlmIChjbGllbnQpIGRhdGEgPSBjbGllbnRcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgZW1haWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS51c2VybmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMuZW1haWxdKSxcbiAgICAgIHBob25lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEucGhvbmUsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxMCldKSxcbiAgICAgIGN1cnA6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jdXJwLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMTYpXSksXG4gICAgICB1c2VyUmVmZXJlbmNlczogbmV3IFVudHlwZWRGb3JtQXJyYXkoW10pXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBDcmVhdGVVc2VyUmVmZXJlbmNlRm9ybU9iaih1c2VyOiBvVXNlclJlZmVyZW5jZSkge1xuICAgIGxldCBkYXRhID0gY1VzZXJSZWZlcmVuY2VcblxuICAgIGlmICh1c2VyLm5hbWUgIT0gXCJcIikgZGF0YSA9IHVzZXJcblxuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEubmFtZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWQsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDEwKV0pLFxuICAgICAgcGhvbmU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5waG9uZSwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICAgIHJlbGF0aW9uc2hpcDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnJlbGF0aW9uc2hpcCwgW1ZhbGlkYXRvcnMucmVxdWlyZWRdKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1BZGRyZXNzKGFkZHJlc3M/OiBvQWRkcmVzcykge1xuICAgIGxldCBkYXRhID0gY0FkZHJlc3NcblxuICAgIGlmIChhZGRyZXNzKSBkYXRhID0gYWRkcmVzc1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIHN0cmVldDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnN0cmVldCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBuZWlnaGJvcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLm5laWdoYm9yLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGNwOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuemlwLCBWYWxpZGF0b3JzLnJlcXVpcmVkKSxcbiAgICAgIGV4dDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4dCwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBpbnQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnQpLFxuICAgICAgY2l0eTogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNpdHksIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgc3RhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5zdGF0ZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgfVxuICB9XG5cbiAgcHVibGljIHN0YXRpYyBGb3JtRGV2aWNlKGRldmljZT86IG9EZXZpY2UpIHtcbiAgICBsZXQgZGF0YSA9IGNEZXZpY2VcblxuICAgIGlmIChkZXZpY2UpIGRhdGEgPSBkZXZpY2VcblxuICAgIHJldHVybiB7XG4gICAgICBtb2RlbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmRldmljZSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJTUVJOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuSU1FSSwgVmFsaWRhdG9ycy5yZXF1aXJlZCksXG4gICAgICBJRDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmlkKSxcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIEZvcm1GaW5hbmNpYWwoZmluYW5jaWFsPzogb0ZpbmFuY2lhbCkge1xuICAgIGxldCBkYXRhID0gY0ZpbmFuY2lhbFxuXG4gICAgaWYgKGZpbmFuY2lhbCkgZGF0YSA9IGZpbmFuY2lhbFxuXG4gICAgZGF0YS5jcmVkaXRfdHlwZSA9IFwiQXJyZW5kYW1pZW50b1wiXG4gICAgLy8gZGF0YS5kZWFkbGluZXMud2Vla3MgPSBjQnVzaW5lc3NEZWFkbGluZXNcblxuICAgIHJldHVybiB7XG4gICAgICB0b3RhbDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnRvdGFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW4oMSldKSxcbiAgICAgIGluaXRpYWw6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0aWFsLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgZmluYW5jZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5maW5hbmNlZCwgVmFsaWRhdG9ycy5taW4oMSkpLFxuICAgICAgd2Vla2x5UGF5bWVudDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLndlZWtseVBheW1lbnQsIFtWYWxpZGF0b3JzLnJlcXVpcmVkLCBWYWxpZGF0b3JzLm1pbigxKV0pLFxuICAgICAgZGVhZGxpbmVzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuZGVhZGxpbmVzLCBbVmFsaWRhdG9ycy5yZXF1aXJlZF0pLFxuICAgICAgaW5pdERhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbml0RGF0ZSksXG4gICAgICBwcm92aWRlcjogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLnByb3ZpZGVyKSxcblxuICAgICAgY3JlZGl0X3R5cGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5jcmVkaXRfdHlwZSA/IGRhdGEuY3JlZGl0X3R5cGUgOiAwKSxcbiAgICAgIGludGVyZXN0X3JhdGU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5pbnRlcmVzdF9yYXRlID8gZGF0YS5pbnRlcmVzdF9yYXRlIDogMCksIC8vIGludGVyZXMgY3JlZGl0IGR5bmFtaWNcbiAgICAgIGNvbW1pc3Npb25fb3BlbmluZzogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmNvbW1pc3Npb25fb3BlbmluZyA/IGRhdGEuY29tbWlzc2lvbl9vcGVuaW5nIDogMCksXG4gICAgICBpbnRlcmVzdF9hcnJlYXJzOiBuZXcgVW50eXBlZEZvcm1Db250cm9sKGRhdGEuaW50ZXJlc3RfYXJyZWFycyA/IGRhdGEuaW50ZXJlc3RfYXJyZWFycyA6IDApLCAvLyBpbnRlcmVzZXMgbW9yYXRvcmlvcyBkeW5hbWljXG5cbiAgICAgIGFtb3VudF9jb21taXNzaW9uX29wZW5pbmc6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSwgLy8gY29taXNpb24gcG9yIGFwZXJ0dXJhIGR5bmFtaWNcbiAgICAgIHByaW5jaXBhbF9kaXNidXJzZWQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2woZGF0YS5wcmluY2lwYWxfZGlzYnVyc2VkKSxcbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDogbmV3IFVudHlwZWRGb3JtQ29udHJvbChkYXRhLmV4cGVjdGVkX2Rpc2J1cnNlZClcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIENyZWF0ZUNvbnRyYWN0RnJvbUZvcm1PYmooZGF0YTogYW55LCBmaW5hbFBheTogbnVtYmVyKSB7XG4gICAgY29uc3QgZGF0ZSA9IG5ldyBEYXRlKClcblxuICAgIGNvbnN0IGRldmljZTogb0RldmljZSA9IHtcbiAgICAgIGRldmljZTogZGF0YVtcImRldmljZVwiXVswXS5tb2RlbCxcbiAgICAgIGlkOiBkYXRhW1wiZGV2aWNlXCJdWzBdLklELFxuICAgICAgSU1FSTogZGF0YVtcImRldmljZVwiXVswXS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5zdHJlZXQsXG4gICAgICBjaXR5OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jaXR5LFxuICAgICAgbmVpZ2hib3I6IGRhdGFbXCJhZGRyZXNzXCJdWzBdLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhW1wiYWRkcmVzc1wiXVswXS5jcCxcbiAgICAgIGV4dDogZGF0YVtcImFkZHJlc3NcIl1bMF0uZXh0LFxuICAgICAgaW50OiBkYXRhW1wiYWRkcmVzc1wiXVswXS5pbnQsXG4gICAgICBzdGF0ZTogZGF0YVtcImFkZHJlc3NcIl1bMF0uc3RhdGVcbiAgICB9XG5cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0udG90YWwpLFxuICAgICAgaW5pdGlhbDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcyxcbiAgICAgIHByb2dyZXNzOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogW10sXG4gICAgICB3ZWVrbHlQYXltZW50OiBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlLFxuICAgICAgZmluYWxEYXRlOiBkYXRlLmdldFRpbWUoKSArIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmRlYWRsaW5lcy53ZWVrcyAqICg2MDQ4MDAgKiAxMDAwKSksXG4gICAgICBpbml0RGF0ZTogZGF0ZS5nZXREYXRlKCksXG4gICAgICBkYXlDdXQ6IGRhdGUuZ2V0RGF0ZSgpLFxuICAgICAgcHJvdmlkZXI6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IGZpbmFsUGF5LFxuICAgICAgZmluYW5jZWQ6IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YVtcImZpbmFuY2lhbFwiXVswXS5uZXh0UGF5bWVudFxuICAgIH1cbiAgICBpZiAoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5wcm92aWRlciA9PSBlUHJvdmlkZXIuRHluYW1pQ29yZSkge1xuICAgICAgZmluYW5jaWFsLmluaXRpYWwgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmV4cGVjdGVkX2Rpc2J1cnNlZCkgOiAwXG4gICAgICBmaW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0ucHJpbmNpcGFsX2Rpc2J1cnNlZCA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLnByaW5jaXBhbF9kaXNidXJzZWQpIDogMFxuICAgICAgZmluYW5jaWFsLmludGVyZXN0X2FycmVhcnMgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmludGVyZXN0X3JhdGUgPyBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5pbnRlcmVzdF9yYXRlKSA6IDBcbiAgICAgIGZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZyA/IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNvbW1pc3Npb25fb3BlbmluZykgOiAwXG4gICAgICBmaW5hbmNpYWwuY3JlZGl0X3R5cGUgPSBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNyZWRpdF90eXBlID8gZGF0YVtcImZpbmFuY2lhbFwiXVswXS5jcmVkaXRfdHlwZSA6IFwiXCJcbiAgICAgIGZpbmFuY2lhbC5jbGFiZSA9IGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uY2xhYmUgPyBkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmNsYWJlIDogXCJcIlxuICAgIH1cblxuICAgIGlmIChkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgICBmaW5hbmNpYWwuaW5pdGlhbCA9IE51bWJlcihkYXRhW1wiZmluYW5jaWFsXCJdWzBdLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcpXG4gICAgICBlbHNlXG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uaW5pdGlhbClcbiAgICB9XG5cbiAgICBpZiAoTnVtYmVyKGRhdGFbXCJmaW5hbmNpYWxcIl1bMF0uYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKVxuICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBOdW1iZXIoZGF0YVtcImZpbmFuY2lhbFwiXVswXS5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgIGVsc2VcbiAgICAgIGZpbmFuY2lhbC5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nID0gZmluYW5jaWFsLmluaXRpYWxcblxuICAgIGlmIChmaW5hbmNpYWwubmV4dFBheW1lbnQgPT0gdW5kZWZpbmVkKSBmaW5hbmNpYWwubmV4dFBheW1lbnQgPSAwXG5cbiAgICBjb25zdCBjb250cmFjdDogb0NvbnRyYWN0ID0ge1xuICAgICAgaWQ6IFwiXCIsXG4gICAgICBjbGllbnQ6IFwiXCIsXG4gICAgICBhZGRyZXNzOiBhZGRyZXNzLFxuICAgICAgZGV2aWNlOiBkZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IGZpbmFuY2lhbCxcbiAgICAgIGJ5OiBcIlwiLFxuICAgICAgYWN0aXZlOiB0cnVlLFxuICAgICAgbGFzdFBheW1lbnQ6IGRhdGUuZ2V0VGltZSgpLFxuICAgICAgY3JlYXRlZEF0OiBkYXRlLmdldFRpbWUoKVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQ29udHJhY3RUb0NvbmVrdGFPYmooZGF0YTogb0NvbnRyYWN0LCBtb250aGx5UGF5OiBudW1iZXIsIGZpbmFsUGF5OiBudW1iZXIpIHtcbiAgICBjb25zdCBvOiBhbnkgPSB7fVxuXG4gICAgY29uc3QgZGV2aWNlOiBvRGV2aWNlID0ge1xuICAgICAgZGV2aWNlOiBkYXRhLmRldmljZS5kZXZpY2UsXG4gICAgICBpZDogZGF0YS5kZXZpY2UuaWQsXG4gICAgICBJTUVJOiBkYXRhLmRldmljZS5JTUVJXG4gICAgfVxuICAgIGNvbnN0IGFkZHJlc3M6IG9BZGRyZXNzID0ge1xuICAgICAgc3RyZWV0OiBkYXRhLmFkZHJlc3Muc3RyZWV0LFxuICAgICAgY2l0eTogZGF0YS5hZGRyZXNzLmNpdHksXG4gICAgICBuZWlnaGJvcjogZGF0YS5hZGRyZXNzLm5laWdoYm9yLFxuICAgICAgemlwOiBkYXRhLmFkZHJlc3MuemlwLFxuICAgICAgZXh0OiBkYXRhLmFkZHJlc3MuZXh0LFxuICAgICAgaW50OiBkYXRhLmFkZHJlc3MuaW50LFxuICAgICAgc3RhdGU6IGRhdGEuYWRkcmVzcy5zdGF0ZVxuICAgIH1cbiAgICBjb25zdCBmaW5hbmNpYWw6IG9GaW5hbmNpYWwgPSB7XG4gICAgICB0b3RhbDogZGF0YS5maW5hbmNpYWwudG90YWwsXG4gICAgICBpbml0aWFsOiBkYXRhLmZpbmFuY2lhbC5pbml0aWFsLFxuICAgICAgZGVhZGxpbmVzOiBkYXRhLmZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogZGF0YS5maW5hbmNpYWwucHJvZ3Jlc3MsXG4gICAgICBwZW5kaW5nT2Y6IGRhdGEuZmluYW5jaWFsLnBlbmRpbmdPZixcbiAgICAgIHdlZWtseVBheW1lbnQ6IGRhdGEuZmluYW5jaWFsLndlZWtseVBheW1lbnQsXG4gICAgICBpbnRlcmVzdDogZGF0YS5maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IGRhdGEuZmluYW5jaWFsLmZpbmFsRGF0ZSxcbiAgICAgIGluaXREYXRlOiBkYXRhLmZpbmFuY2lhbC5pbml0RGF0ZSxcbiAgICAgIGRheUN1dDogZGF0YS5maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IGRhdGEuZmluYW5jaWFsLnByb3ZpZGVyLFxuICAgICAgZmluYWxQYXltZW50OiBkYXRhLmZpbmFuY2lhbC5maW5hbFBheW1lbnQsXG4gICAgICBmaW5hbmNlZDogZGF0YS5maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogZGF0YS5maW5hbmNpYWwubmV4dFBheW1lbnRcbiAgICB9XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBcIlwiLFxuICAgICAgY2xpZW50OiBcIlwiLFxuICAgICAgYWRkcmVzczogYWRkcmVzcyxcbiAgICAgIGRldmljZTogZGV2aWNlLFxuICAgICAgZmluYW5jaWFsOiBmaW5hbmNpYWwsXG4gICAgICBieTogXCJcIixcbiAgICAgIGFjdGl2ZTogdHJ1ZVxuICAgIH1cbiAgICByZXR1cm4gY29udHJhY3RcbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgQ3JlYXRlQXV0aEZvcm0odXNlcm5hbWU6IHN0cmluZywgY3VycDogc3RyaW5nKSB7XG4gICAgY29uc3QgcGFzc3dvcmQ6IHN0cmluZyA9IHRoaXMuY3JlYXRlUGFzc3dvcmQoY3VycClcbiAgICByZXR1cm4ge1xuICAgICAgdXNlcm5hbWU6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wodXNlcm5hbWUsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgICAgcGFzc3dvcmQ6IG5ldyBVbnR5cGVkRm9ybUNvbnRyb2wocGFzc3dvcmQsIFZhbGlkYXRvcnMucmVxdWlyZWQpLFxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzdGF0aWMgY3JlYXRlUGFzc3dvcmQoY3VycDogc3RyaW5nKTogc3RyaW5nIHtcbiAgICBjb25zdCBfY3VycCA9IGN1cnAuc3BsaXQoXCJcIilcbiAgICBsZXQgcGFzc3dvcmQgPSBcIlwiXG4gICAgY29uc3QgbGltaXQgPSA3XG5cbiAgICBpZiAoX2N1cnAubGVuZ3RoIDwgMTYpIHJldHVybiBcIlwiXG5cbiAgICBwYXNzd29yZCArPSBfY3VycFswXS50b0xvd2VyQ2FzZSgpXG5cbiAgICBmb3IgKGxldCBpID0gMTsgaSA8PSBsaW1pdDsgaSsrKVxuICAgICAgcGFzc3dvcmQgKz0gX2N1cnBbaV0udG9VcHBlckNhc2UoKVxuXG4gICAgcGFzc3dvcmQgKz0gYCpgXG4gICAgcmV0dXJuIHBhc3N3b3JkXG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclR5cGVDb250Q2xpX0NvbnRyYWN0KF9jb250cmFjdDogdHlDbGllbnRDb250cmFjdCk6IG9Db250cmFjdCB7XG4gICAgY29uc3QgY29udHJhY3Q6IG9Db250cmFjdCA9IHtcbiAgICAgIGlkOiBfY29udHJhY3QuY29udHJhY3QhLFxuICAgICAgY2xpZW50OiBfY29udHJhY3QuY2xpZW50LFxuICAgICAgYWRkcmVzczogX2NvbnRyYWN0LmFkZHJlc3MsXG4gICAgICBkZXZpY2U6IF9jb250cmFjdC5kZXZpY2UsXG4gICAgICBmaW5hbmNpYWw6IF9jb250cmFjdC5maW5hbmNpYWwsXG4gICAgICBieTogX2NvbnRyYWN0LmJ5LFxuICAgICAgYWN0aXZlOiBfY29udHJhY3QuYWN0aXZlLFxuICAgICAgbGFzdFBheW1lbnQ6IF9jb250cmFjdC5sYXN0UGF5bWVudCxcbiAgICAgIGNyZWF0ZWRBdDogX2NvbnRyYWN0LmNyZWF0ZWRBdCxcbiAgICAgIGR5bmFtaWNBY2NvdW50OiBfY29udHJhY3QuZHluYW1pY0FjY291bnQsXG4gICAgfVxuXG4gICAgcmV0dXJuIGNvbnRyYWN0XG4gIH1cblxuICBwdWJsaWMgc3RhdGljIE1hcHBlclN5bmNDb250cmFjdER5bmFtaWMoYmFzZTogb0NvbnRyYWN0LCBhY2NvdW50OiBJRENBY2NvdW50KTogb0NvbnRyYWN0IHtcbiAgICBsZXQgbkNvbnRyYWN0ID0gYmFzZVxuICAgIGxldCBfZmluYW5jaWFsID0gYmFzZS5maW5hbmNpYWxcbiAgICBsZXQgX2RldmljZSA9IGJhc2UuZGV2aWNlXG5cblxuICAgIGNvbnN0IGZpbmFuY2lhbDogb0ZpbmFuY2lhbCA9IHtcbiAgICAgIHRvdGFsOiBfZmluYW5jaWFsLnRvdGFsLFxuICAgICAgaW5pdGlhbDogYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPyBhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA6IF9maW5hbmNpYWwuaW5pdGlhbCxcbiAgICAgIGRlYWRsaW5lczogX2ZpbmFuY2lhbC5kZWFkbGluZXMsXG4gICAgICBwcm9ncmVzczogX2ZpbmFuY2lhbC5wcm9ncmVzcyA/IF9maW5hbmNpYWwucHJvZ3Jlc3MgOiBbXSxcbiAgICAgIHBlbmRpbmdPZjogX2ZpbmFuY2lhbC5wZW5kaW5nT2YgPyBfZmluYW5jaWFsLnBlbmRpbmdPZiA6IFtdLFxuICAgICAgd2Vla2x5UGF5bWVudDogX2ZpbmFuY2lhbC53ZWVrbHlQYXltZW50LFxuICAgICAgaW50ZXJlc3Q6IF9maW5hbmNpYWwuaW50ZXJlc3QsXG4gICAgICBmaW5hbERhdGU6IF9maW5hbmNpYWwuZmluYWxEYXRlLFxuICAgICAgaW5pdERhdGU6IF9maW5hbmNpYWwuaW5pdERhdGUsXG4gICAgICBkYXlDdXQ6IF9maW5hbmNpYWwuZGF5Q3V0LFxuICAgICAgcHJvdmlkZXI6IF9maW5hbmNpYWwucHJvdmlkZXIsXG4gICAgICBmaW5hbFBheW1lbnQ6IF9maW5hbmNpYWwuZmluYWxQYXltZW50LFxuICAgICAgZmluYW5jZWQ6IF9maW5hbmNpYWwuZmluYW5jZWQsXG4gICAgICBuZXh0UGF5bWVudDogX2ZpbmFuY2lhbC5uZXh0UGF5bWVudCA/IF9maW5hbmNpYWwubmV4dFBheW1lbnQgOiAwLFxuXG4gICAgICBhbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcsXG5cbiAgICAgIGV4cGVjdGVkX2Rpc2J1cnNlZDpcbiAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLmV4cGVjdGVkX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5leHBlY3RlZF9kaXNidXJzZWQpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5leHBlY3RlZF9kaXNidXJzZWQpLFxuXG4gICAgICBwcmluY2lwYWxfZGlzYnVyc2VkOlxuICAgICAgICBhY2NvdW50LnByb3BlcnRpZXMucHJpbmNpcGFsX2Rpc2J1cnNlZCA/XG4gICAgICAgICAgYWNjb3VudC5wcm9wZXJ0aWVzLnByaW5jaXBhbF9kaXNidXJzZWQgOlxuICAgICAgICAgIF9maW5hbmNpYWwucHJpbmNpcGFsX2Rpc2J1cnNlZCxcblxuICAgICAgY29tbWlzc2lvbl9vcGVuaW5nOlxuICAgICAgICBhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcgP1xuICAgICAgICAgIE51bWJlcihhY2NvdW50LmNvbmZpZy5jb21taXNzaW9uX29wZW5pbmcpIDpcbiAgICAgICAgICBOdW1iZXIoX2ZpbmFuY2lhbC5jb21taXNzaW9uX29wZW5pbmcpLFxuXG4gICAgICBjcmVkaXRfdHlwZTpcbiAgICAgICAgYWNjb3VudC5jb25maWcuY3JlZGl0X3R5cGUgPyBhY2NvdW50LmNvbmZpZy5jcmVkaXRfdHlwZSA6IF9maW5hbmNpYWwuY3JlZGl0X3R5cGUsXG5cbiAgICAgIGNsYWJlOlxuICAgICAgICBTdHJpbmcoYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlID8gYWNjb3VudC5wcm9wZXJ0aWVzLmNsYWJlIDogX2ZpbmFuY2lhbC5jbGFiZSlcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdEFycmVhcnMgPSBhY2NvdW50LmNvbmZpZy5pbnRlcmVzdF9hcnJlYXJzXG4gICAgY29uc3QgcHJldkludGVyZXN0QXJyZWFycyA9IF9maW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFyc1xuICAgIGlmIChpbnRlcmVzdEFycmVhcnMgIT0gdW5kZWZpbmVkKSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IGludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSBpZiAocHJldkludGVyZXN0QXJyZWFycyAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdF9hcnJlYXJzID0gcHJldkludGVyZXN0QXJyZWFyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3RfYXJyZWFycyA9IDBcbiAgICB9XG5cbiAgICBjb25zdCBpbnRlcmVzdCA9IGFjY291bnQuY29uZmlnLmludGVyZXN0X3JhdGVcbiAgICBjb25zdCBwcmV2SW50ZXJlc3QgPSBfZmluYW5jaWFsLmludGVyZXN0XG4gICAgaWYgKGludGVyZXN0ICE9IHVuZGVmaW5lZCkge1xuICAgICAgZmluYW5jaWFsLmludGVyZXN0ID0gaW50ZXJlc3RcbiAgICB9IGVsc2UgaWYgKHByZXZJbnRlcmVzdCAhPSB1bmRlZmluZWQpIHtcbiAgICAgIGZpbmFuY2lhbC5pbnRlcmVzdCA9IHByZXZJbnRlcmVzdFxuICAgIH0gZWxzZSB7XG4gICAgICBmaW5hbmNpYWwuaW50ZXJlc3QgPSAwXG4gICAgfVxuXG4gICAgaWYgKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nICE9IHVuZGVmaW5lZCkge1xuICAgICAgaWYgKE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZykgPiAwKSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKGFjY291bnQucHJvcGVydGllcy5hbW91bnRfY29tbWlzc2lvbl9vcGVuaW5nKVxuICAgICAgICBmaW5hbmNpYWwuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZyA9IE51bWJlcihhY2NvdW50LnByb3BlcnRpZXMuYW1vdW50X2NvbW1pc3Npb25fb3BlbmluZylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZpbmFuY2lhbC5pbml0aWFsID0gTnVtYmVyKF9maW5hbmNpYWwuaW5pdGlhbClcbiAgICAgICAgZmluYW5jaWFsLmFtb3VudF9jb21taXNzaW9uX29wZW5pbmcgPSBmaW5hbmNpYWwuaW5pdGlhbFxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHNlbGxlcjogc3RyaW5nIHwgdW5kZWZpbmVkID0gYWNjb3VudC5wcm9wZXJ0aWVzLnNlbGxlcl9uYW1lXG4gICAgbkNvbnRyYWN0LmJ5ID0gc2VsbGVyICE9IG51bGwgPyBzZWxsZXIgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZGV2aWNlLmlkID0gX2RldmljZS5pZCA/IF9kZXZpY2UuaWQgOiBcIlwiXG5cbiAgICBuQ29udHJhY3QuZmluYW5jaWFsID0gZmluYW5jaWFsXG4gICAgcmV0dXJuIG5Db250cmFjdFxuICB9XG59XG5cbiJdfQ==
|