@resolveio/client-lib-core 16.0.0 → 21.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (217) hide show
  1. package/fesm2022/resolveio-client-lib-core.min.mjs +1 -0
  2. package/package.json +10 -8
  3. package/types/resolveio-client-lib-core.d.ts +1904 -0
  4. package/esm2022/lib/account-manager.service.mjs +0 -229
  5. package/esm2022/lib/auth/auth-guard.service.mjs +0 -174
  6. package/esm2022/lib/auth/auth-permissions.service.mjs +0 -23
  7. package/esm2022/lib/auth/auth.service.mjs +0 -251
  8. package/esm2022/lib/auth/auth365.component.mjs +0 -51
  9. package/esm2022/lib/auth/can-deactivate-guard.service.mjs +0 -13
  10. package/esm2022/lib/auth/enroll.component.mjs +0 -88
  11. package/esm2022/lib/auth/forgot-password.component.mjs +0 -89
  12. package/esm2022/lib/core.component.mjs +0 -404
  13. package/esm2022/lib/core.module.mjs +0 -176
  14. package/esm2022/lib/core.service.mjs +0 -88
  15. package/esm2022/lib/directive/focus.mjs +0 -24
  16. package/esm2022/lib/directive/scroll.mjs +0 -54
  17. package/esm2022/lib/home/home.component.mjs +0 -84
  18. package/esm2022/lib/logger/logger.component.mjs +0 -229
  19. package/esm2022/lib/models/app-status.model.mjs +0 -2
  20. package/esm2022/lib/models/collection-document.model.mjs +0 -2
  21. package/esm2022/lib/models/cron-job.model.mjs +0 -2
  22. package/esm2022/lib/models/dialog.model.mjs +0 -2
  23. package/esm2022/lib/models/file.model.mjs +0 -2
  24. package/esm2022/lib/models/log-method-latency.model.mjs +0 -2
  25. package/esm2022/lib/models/navbar-main-tab.model.mjs +0 -2
  26. package/esm2022/lib/models/pagination.model.mjs +0 -2
  27. package/esm2022/lib/models/permission.model.mjs +0 -2
  28. package/esm2022/lib/models/select-data-label.model.mjs +0 -2
  29. package/esm2022/lib/models/subscription.model.mjs +0 -2
  30. package/esm2022/lib/models/support-ticket.model.mjs +0 -2
  31. package/esm2022/lib/models/user-group.model.mjs +0 -2
  32. package/esm2022/lib/models/user.model.mjs +0 -2
  33. package/esm2022/lib/offline-db.mjs +0 -519
  34. package/esm2022/lib/offline-manager.service.mjs +0 -109
  35. package/esm2022/lib/pipes/domsanitizor.pipe.mjs +0 -29
  36. package/esm2022/lib/pipes/filter.pipe.mjs +0 -36
  37. package/esm2022/lib/pipes/json-parse.pipe.mjs +0 -29
  38. package/esm2022/lib/pipes/minus-currency.pipe.mjs +0 -16
  39. package/esm2022/lib/pipes/phone.pipe.mjs +0 -47
  40. package/esm2022/lib/pipes/pipe.module.mjs +0 -54
  41. package/esm2022/lib/pipes/reverse-list.pipe.mjs +0 -17
  42. package/esm2022/lib/pipes/titlecase.pipe.mjs +0 -22
  43. package/esm2022/lib/report-builder.permission.mjs +0 -13
  44. package/esm2022/lib/resolveio-class.mjs +0 -50
  45. package/esm2022/lib/shared/shared.module.mjs +0 -96
  46. package/esm2022/lib/socket-manager.service.mjs +0 -340
  47. package/esm2022/lib/socket.service.mjs +0 -200
  48. package/esm2022/lib/super-admin.permission.mjs +0 -9
  49. package/esm2022/lib/support-ticket/detail/support-ticket-detail.component.mjs +0 -211
  50. package/esm2022/lib/support-ticket/edit/support-ticket-edit.component.mjs +0 -131
  51. package/esm2022/lib/support-ticket/list/support-ticket-list.component.mjs +0 -142
  52. package/esm2022/lib/support-ticket/new/support-ticket-new.component.mjs +0 -121
  53. package/esm2022/lib/support-ticket/support-ticket.component.mjs +0 -67
  54. package/esm2022/lib/support-ticket/support-ticket.module.mjs +0 -50
  55. package/esm2022/lib/support-ticket/support-ticket.routing.mjs +0 -20
  56. package/esm2022/lib/support-ticket/support-ticket.service.mjs +0 -16
  57. package/esm2022/lib/token-manager.service.mjs +0 -25
  58. package/esm2022/lib/user-settings/settings/users-settings.component.mjs +0 -302
  59. package/esm2022/lib/user-settings/user-settings.component.mjs +0 -61
  60. package/esm2022/lib/user-settings/user-settings.module.mjs +0 -41
  61. package/esm2022/lib/user-settings/user-settings.permission.mjs +0 -10
  62. package/esm2022/lib/user-settings/user-settings.routing.mjs +0 -14
  63. package/esm2022/lib/user-settings/user-settings.service.mjs +0 -16
  64. package/esm2022/lib/util/action-name.helper.mjs +0 -9
  65. package/esm2022/lib/util/aws.service.mjs +0 -80
  66. package/esm2022/lib/util/common.helper.mjs +0 -133
  67. package/esm2022/lib/util/validation.service.mjs +0 -185
  68. package/esm2022/lib/util/window-resize.service.mjs +0 -38
  69. package/esm2022/lib/util/window.service.mjs +0 -16
  70. package/esm2022/lib/widgets/alert/alert.model.mjs +0 -2
  71. package/esm2022/lib/widgets/alert/alert.service.mjs +0 -79
  72. package/esm2022/lib/widgets/collapse-table/collapse-table.component.mjs +0 -83
  73. package/esm2022/lib/widgets/collapse-table/collapse-table.module.mjs +0 -34
  74. package/esm2022/lib/widgets/data-table/data-table.component.mjs +0 -84
  75. package/esm2022/lib/widgets/data-table/data-table.model.mjs +0 -2
  76. package/esm2022/lib/widgets/data-table/data-table.module.mjs +0 -41
  77. package/esm2022/lib/widgets/date-shortcut/date-shortcut.component.mjs +0 -198
  78. package/esm2022/lib/widgets/date-shortcut/date-shortcut.module.mjs +0 -32
  79. package/esm2022/lib/widgets/dialog/dialog.confirm.content.mjs +0 -67
  80. package/esm2022/lib/widgets/dialog/dialog.error.content.mjs +0 -60
  81. package/esm2022/lib/widgets/dialog/dialog.input.content.mjs +0 -200
  82. package/esm2022/lib/widgets/dialog/dialog.login.content.mjs +0 -354
  83. package/esm2022/lib/widgets/dialog/dialog.notify.content.mjs +0 -60
  84. package/esm2022/lib/widgets/dialog/dialog.register.content.mjs +0 -333
  85. package/esm2022/lib/widgets/dialog/dialog.select-array-objs.content.mjs +0 -203
  86. package/esm2022/lib/widgets/dialog/dialog.select-array.content.mjs +0 -310
  87. package/esm2022/lib/widgets/dialog/dialog.select-data-labels.content.mjs +0 -196
  88. package/esm2022/lib/widgets/dialog/dialog.select-datetime.content.mjs +0 -191
  89. package/esm2022/lib/widgets/dialog/dialog.select-with-buttons-url.content.mjs +0 -166
  90. package/esm2022/lib/widgets/dialog/dialog.service.mjs +0 -98
  91. package/esm2022/lib/widgets/file/file-upload.component.mjs +0 -433
  92. package/esm2022/lib/widgets/file/file-upload.module.mjs +0 -48
  93. package/esm2022/lib/widgets/form-button/form-button.component.mjs +0 -97
  94. package/esm2022/lib/widgets/form-button/form-button.module.mjs +0 -28
  95. package/esm2022/lib/widgets/navbar-main/navbar-main.component.mjs +0 -222
  96. package/esm2022/lib/widgets/navbar-module/navbar-module.component.mjs +0 -108
  97. package/esm2022/lib/widgets/navbar-module/navbar-module.model.mjs +0 -2
  98. package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.component.mjs +0 -41
  99. package/esm2022/lib/widgets/responsive-button-group/responsive-button-group.module.mjs +0 -24
  100. package/esm2022/lib/widgets/scheduler/scheduler.component.mjs +0 -186
  101. package/esm2022/lib/widgets/scheduler/scheduler.module.mjs +0 -37
  102. package/esm2022/lib/widgets/sort-table/sort-table-header.component.mjs +0 -72
  103. package/esm2022/lib/widgets/sort-table/sort-table-ngfor.component.mjs +0 -49
  104. package/esm2022/lib/widgets/sort-table/sort-table.directive.mjs +0 -177
  105. package/esm2022/lib/widgets/sort-table/sort-table.module.mjs +0 -38
  106. package/esm2022/lib/widgets/user-role/user-role.component.mjs +0 -29
  107. package/esm2022/lib/widgets/user-role/user-role.module.mjs +0 -24
  108. package/esm2022/public_api.mjs +0 -91
  109. package/esm2022/resolveio-client-lib-core.mjs +0 -5
  110. package/fesm2022/resolveio-client-lib-core.mjs +0 -9019
  111. package/fesm2022/resolveio-client-lib-core.mjs.map +0 -1
  112. package/index.d.ts +0 -5
  113. package/lib/account-manager.service.d.ts +0 -41
  114. package/lib/auth/auth-guard.service.d.ts +0 -26
  115. package/lib/auth/auth-permissions.service.d.ts +0 -10
  116. package/lib/auth/auth.service.d.ts +0 -30
  117. package/lib/auth/auth365.component.d.ts +0 -20
  118. package/lib/auth/can-deactivate-guard.service.d.ts +0 -10
  119. package/lib/auth/enroll.component.d.ts +0 -28
  120. package/lib/auth/forgot-password.component.d.ts +0 -28
  121. package/lib/core.component.d.ts +0 -63
  122. package/lib/core.module.d.ts +0 -34
  123. package/lib/core.service.d.ts +0 -49
  124. package/lib/directive/focus.d.ts +0 -10
  125. package/lib/directive/scroll.d.ts +0 -20
  126. package/lib/home/home.component.d.ts +0 -28
  127. package/lib/logger/logger.component.d.ts +0 -37
  128. package/lib/models/app-status.model.d.ts +0 -4
  129. package/lib/models/collection-document.model.d.ts +0 -6
  130. package/lib/models/cron-job.model.d.ts +0 -13
  131. package/lib/models/dialog.model.d.ts +0 -23
  132. package/lib/models/file.model.d.ts +0 -9
  133. package/lib/models/log-method-latency.model.d.ts +0 -7
  134. package/lib/models/navbar-main-tab.model.d.ts +0 -14
  135. package/lib/models/pagination.model.d.ts +0 -17
  136. package/lib/models/permission.model.d.ts +0 -14
  137. package/lib/models/select-data-label.model.d.ts +0 -9
  138. package/lib/models/subscription.model.d.ts +0 -19
  139. package/lib/models/support-ticket.model.d.ts +0 -71
  140. package/lib/models/user-group.model.d.ts +0 -19
  141. package/lib/models/user.model.d.ts +0 -70
  142. package/lib/offline-db.d.ts +0 -28
  143. package/lib/offline-manager.service.d.ts +0 -23
  144. package/lib/pipes/domsanitizor.pipe.d.ts +0 -10
  145. package/lib/pipes/filter.pipe.d.ts +0 -12
  146. package/lib/pipes/json-parse.pipe.d.ts +0 -7
  147. package/lib/pipes/minus-currency.pipe.d.ts +0 -7
  148. package/lib/pipes/phone.pipe.d.ts +0 -7
  149. package/lib/pipes/pipe.module.d.ts +0 -13
  150. package/lib/pipes/reverse-list.pipe.d.ts +0 -6
  151. package/lib/pipes/titlecase.pipe.d.ts +0 -7
  152. package/lib/report-builder.permission.d.ts +0 -2
  153. package/lib/resolveio-class.d.ts +0 -26
  154. package/lib/shared/shared.module.d.ts +0 -17
  155. package/lib/socket-manager.service.d.ts +0 -36
  156. package/lib/socket.service.d.ts +0 -38
  157. package/lib/super-admin.permission.d.ts +0 -2
  158. package/lib/support-ticket/detail/support-ticket-detail.component.d.ts +0 -32
  159. package/lib/support-ticket/edit/support-ticket-edit.component.d.ts +0 -30
  160. package/lib/support-ticket/list/support-ticket-list.component.d.ts +0 -26
  161. package/lib/support-ticket/new/support-ticket-new.component.d.ts +0 -26
  162. package/lib/support-ticket/support-ticket.component.d.ts +0 -20
  163. package/lib/support-ticket/support-ticket.module.d.ts +0 -15
  164. package/lib/support-ticket/support-ticket.routing.d.ts +0 -3
  165. package/lib/support-ticket/support-ticket.service.d.ts +0 -9
  166. package/lib/token-manager.service.d.ts +0 -11
  167. package/lib/user-settings/settings/users-settings.component.d.ts +0 -54
  168. package/lib/user-settings/user-settings.component.d.ts +0 -20
  169. package/lib/user-settings/user-settings.module.d.ts +0 -12
  170. package/lib/user-settings/user-settings.permission.d.ts +0 -2
  171. package/lib/user-settings/user-settings.routing.d.ts +0 -3
  172. package/lib/user-settings/user-settings.service.d.ts +0 -9
  173. package/lib/util/action-name.helper.d.ts +0 -1
  174. package/lib/util/aws.service.d.ts +0 -16
  175. package/lib/util/common.helper.d.ts +0 -12
  176. package/lib/util/validation.service.d.ts +0 -88
  177. package/lib/util/window-resize.service.d.ts +0 -13
  178. package/lib/util/window.service.d.ts +0 -6
  179. package/lib/widgets/alert/alert.model.d.ts +0 -1
  180. package/lib/widgets/alert/alert.service.d.ts +0 -11
  181. package/lib/widgets/collapse-table/collapse-table.component.d.ts +0 -23
  182. package/lib/widgets/collapse-table/collapse-table.module.d.ts +0 -9
  183. package/lib/widgets/data-table/data-table.component.d.ts +0 -23
  184. package/lib/widgets/data-table/data-table.model.d.ts +0 -13
  185. package/lib/widgets/data-table/data-table.module.d.ts +0 -12
  186. package/lib/widgets/date-shortcut/date-shortcut.component.d.ts +0 -20
  187. package/lib/widgets/date-shortcut/date-shortcut.module.d.ts +0 -10
  188. package/lib/widgets/dialog/dialog.confirm.content.d.ts +0 -12
  189. package/lib/widgets/dialog/dialog.error.content.d.ts +0 -11
  190. package/lib/widgets/dialog/dialog.input.content.d.ts +0 -18
  191. package/lib/widgets/dialog/dialog.login.content.d.ts +0 -17
  192. package/lib/widgets/dialog/dialog.notify.content.d.ts +0 -11
  193. package/lib/widgets/dialog/dialog.register.content.d.ts +0 -13
  194. package/lib/widgets/dialog/dialog.select-array-objs.content.d.ts +0 -23
  195. package/lib/widgets/dialog/dialog.select-array.content.d.ts +0 -31
  196. package/lib/widgets/dialog/dialog.select-data-labels.content.d.ts +0 -22
  197. package/lib/widgets/dialog/dialog.select-datetime.content.d.ts +0 -21
  198. package/lib/widgets/dialog/dialog.select-with-buttons-url.content.d.ts +0 -25
  199. package/lib/widgets/dialog/dialog.service.d.ts +0 -21
  200. package/lib/widgets/file/file-upload.component.d.ts +0 -49
  201. package/lib/widgets/file/file-upload.module.d.ts +0 -14
  202. package/lib/widgets/form-button/form-button.component.d.ts +0 -15
  203. package/lib/widgets/form-button/form-button.module.d.ts +0 -9
  204. package/lib/widgets/navbar-main/navbar-main.component.d.ts +0 -52
  205. package/lib/widgets/navbar-module/navbar-module.component.d.ts +0 -24
  206. package/lib/widgets/navbar-module/navbar-module.model.d.ts +0 -13
  207. package/lib/widgets/responsive-button-group/responsive-button-group.component.d.ts +0 -17
  208. package/lib/widgets/responsive-button-group/responsive-button-group.module.d.ts +0 -8
  209. package/lib/widgets/scheduler/scheduler.component.d.ts +0 -50
  210. package/lib/widgets/scheduler/scheduler.module.d.ts +0 -11
  211. package/lib/widgets/sort-table/sort-table-header.component.d.ts +0 -23
  212. package/lib/widgets/sort-table/sort-table-ngfor.component.d.ts +0 -17
  213. package/lib/widgets/sort-table/sort-table.directive.d.ts +0 -48
  214. package/lib/widgets/sort-table/sort-table.module.d.ts +0 -11
  215. package/lib/widgets/user-role/user-role.component.d.ts +0 -10
  216. package/lib/widgets/user-role/user-role.module.d.ts +0 -8
  217. package/public_api.d.ts +0 -87
@@ -1,519 +0,0 @@
1
- import { dateReviver } from './util/common.helper';
2
- export class StorageDB {
3
- storage = null;
4
- database = null;
5
- primaryKey = null;
6
- sep = '';
7
- constructor(opts) {
8
- opts = opts || {};
9
- this.storage = opts.storage || window && window.localStorage;
10
- this.database = opts.database || 'db';
11
- this.primaryKey = opts.primaryKey || '_id';
12
- this.sep = opts.sep || ':';
13
- if (!isSupported(this.storage)) {
14
- this.storage = null;
15
- }
16
- }
17
- get(name, opts) {
18
- return new Collection(this, name, opts);
19
- }
20
- getCollections() {
21
- let collections = [];
22
- Object.keys(this.storage).filter(a => a.split(':').length > 2).forEach(key => {
23
- if (!collections.some(b => b === key.split(':')[1])) {
24
- collections.push(key.split(':')[1]);
25
- }
26
- });
27
- return collections;
28
- }
29
- collection(name, opts) {
30
- return this.get(name, opts);
31
- }
32
- }
33
- class Collection {
34
- name = '';
35
- storage = null;
36
- path = '';
37
- primaryKey = '';
38
- cache = {};
39
- cacheable = false;
40
- constructor(db, name, opts) {
41
- opts = opts || {};
42
- this.name = name;
43
- this.storage = db.storage || new MockStorage();
44
- this.path = db.database + db.sep + name + db.sep;
45
- this.primaryKey = opts.primaryKey || db.primaryKey;
46
- this.cache = {};
47
- this.cacheable = !db.storage;
48
- }
49
- _initCache() {
50
- let cache = {};
51
- let filterExp = new RegExp('^' + this.path);
52
- for (let key of Object.keys(this.storage)) {
53
- if (filterExp.test(key)) {
54
- cache[key] = JSON.parse(this.storage.getItem(key), dateReviver);
55
- }
56
- }
57
- this.cache = cache;
58
- this.cacheable = true;
59
- }
60
- _filter(filter, opts) {
61
- opts.type = opts.type || 'data'; // data, id;
62
- opts.multi = opts.multi || false;
63
- if (!this.cacheable) {
64
- this._initCache();
65
- }
66
- let res = [];
67
- let isFnFilter;
68
- let isTypeId = opts.type === 'id';
69
- if (typeof filter === 'string') {
70
- filter = new RegExp(filter);
71
- }
72
- else if (typeof filter === 'function') {
73
- isFnFilter = true;
74
- }
75
- else if (!filter) {
76
- let ret = isTypeId ? Object.keys(this.cache) : Object.values(this.cache);
77
- if (opts.multi) {
78
- return ret;
79
- }
80
- else {
81
- return ret[0] || null;
82
- }
83
- }
84
- for (let key of Object.keys(this.cache)) {
85
- let val = this.cache[key];
86
- if (isFnFilter) {
87
- if (filter(key, val['data'])) {
88
- let ret = isTypeId ? key : val;
89
- if (opts.multi) {
90
- res.push(ret);
91
- }
92
- else {
93
- return ret;
94
- }
95
- }
96
- }
97
- else {
98
- if (filter.test(key)) {
99
- let ret = isTypeId ? key : val;
100
- if (opts.multi) {
101
- res.push(ret);
102
- }
103
- else {
104
- return ret;
105
- }
106
- }
107
- }
108
- }
109
- return opts.multi ? res : null;
110
- }
111
- insert(data, expiresDate, opts) {
112
- let arrayInsert = data instanceof Array;
113
- if (arrayInsert) {
114
- if (data.length === 0) {
115
- return [];
116
- }
117
- }
118
- else {
119
- data = [data];
120
- }
121
- let pk = this.primaryKey;
122
- let cacheable = this.cacheable;
123
- for (let row of data) {
124
- if (!isObject(row)) {
125
- throw new Error('TypeError: insert data must be an object or an object array');
126
- }
127
- if (typeof row[pk] === 'undefined') {
128
- row[pk] = new ID().toString();
129
- }
130
- let now = new Date();
131
- if (cacheable) {
132
- this.cache[this.path + row[pk]] = {
133
- offlineDate: now,
134
- offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
135
- data: row
136
- };
137
- }
138
- this.storage.setItem(this.path + row[pk], JSON.stringify({
139
- offlineDate: now,
140
- offlineDateExpires: expiresDate ? expiresDate : new Date(now.getTime() + 604800000),
141
- data: row
142
- }));
143
- }
144
- return arrayInsert ? data.map(a => a._id) : data[0]._id;
145
- }
146
- find(query, opts, total) {
147
- query = query || {};
148
- opts = opts || {};
149
- opts.skip = opts.skip || 0;
150
- opts.limit = opts.limit;
151
- opts.sort = opts.sort;
152
- if (opts.sort instanceof Array) {
153
- opts.sort = opts.sort.reduce((res, item) => {
154
- if (typeof item === 'string') {
155
- res[item] = 1;
156
- }
157
- else if (item instanceof Array && item.length) {
158
- res[item[0]] = item[1] || 1;
159
- }
160
- return res;
161
- }, {});
162
- }
163
- let data;
164
- let ids = isObject(query) ? null : (query instanceof Array ? query : [query]);
165
- let filterOpts = {
166
- type: opts._filterType || 'data',
167
- multi: true
168
- };
169
- if (ids) {
170
- // by id array
171
- let filterRegExp = new RegExp('^' + this.path + '(' + ids.join('|') + ')$');
172
- data = this._filter(filterRegExp, filterOpts);
173
- }
174
- else if (Object.keys(query).length) {
175
- // by query
176
- data = this._filter((key, val) => {
177
- return queryMatch(query, val);
178
- }, filterOpts);
179
- }
180
- else {
181
- data = this._filter(null, filterOpts);
182
- }
183
- if (!total) {
184
- data = data.map(a => a.data);
185
- }
186
- // sort
187
- if (opts.sort) {
188
- data.sort((a, b) => {
189
- return sortCompare(opts.sort, a, b);
190
- });
191
- }
192
- if (opts.limit) {
193
- data = data.slice(opts.skip, opts.skip + opts.limit);
194
- }
195
- else if (opts.skip) {
196
- data = data.slice(opts.skip);
197
- }
198
- return data;
199
- }
200
- findOne(query, opts) {
201
- query = query || {};
202
- opts = opts || {};
203
- let data;
204
- let id = isObject(query) ? null : query;
205
- let queryFields = isObject(query) ? Object.keys(query) : [];
206
- let quickTarget = false;
207
- let needsSort = !!opts.sort;
208
- let filterOpts = {
209
- type: opts._filterType || 'data',
210
- multi: false
211
- };
212
- if (queryFields.length && queryFields.includes(this.primaryKey)) {
213
- id = query[this.primaryKey];
214
- quickTarget = true;
215
- }
216
- if (id) {
217
- // by id
218
- data = this.storage.getItem(this.path + id);
219
- data = data ? JSON.parse(data, dateReviver).data : null;
220
- if (data && quickTarget && !queryMatch(query, data)) {
221
- return null;
222
- }
223
- }
224
- else if (queryFields.length) {
225
- // by query
226
- if (needsSort) {
227
- data = this.find(query, opts);
228
- }
229
- else {
230
- data = this._filter((key, val) => {
231
- return queryMatch(query, val);
232
- }, filterOpts);
233
- if (Array.isArray(data)) {
234
- data = data.map(a => a.data);
235
- }
236
- else if (data) {
237
- data = data.data;
238
- }
239
- }
240
- }
241
- else {
242
- if (needsSort) {
243
- data = this.find(query, opts);
244
- }
245
- else {
246
- data = this._filter(null, filterOpts);
247
- }
248
- }
249
- if (!id && needsSort && data) {
250
- data = data[0].data || null;
251
- }
252
- if (data && filterOpts.type === 'id') {
253
- data = this.path + data[this.primaryKey];
254
- }
255
- return data;
256
- }
257
- remove(query, opts) {
258
- if (!query) {
259
- throw new Error('remove needs a query');
260
- }
261
- opts = opts || {};
262
- opts.multi = (typeof opts.multi === 'undefined') ? true : opts.multi;
263
- let findMethod = opts.multi ? 'find' : 'findOne';
264
- let ids = null;
265
- if (findMethod === 'find') {
266
- ids = this[findMethod](query, {
267
- _filterType: 'id'
268
- }, true);
269
- }
270
- else {
271
- ids = this[findMethod](query, {
272
- _filterType: 'id'
273
- });
274
- }
275
- let cacheable = this.cacheable;
276
- if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
277
- return 0;
278
- }
279
- if (!opts.multi) {
280
- ids = [ids];
281
- }
282
- for (let id of ids) {
283
- if (cacheable) {
284
- delete this.cache[id];
285
- }
286
- this.storage.removeItem(id);
287
- }
288
- return ids.length;
289
- }
290
- update(query, values, opts) {
291
- if (!query) {
292
- throw new Error('update needs a query');
293
- }
294
- if (!values || !isObject(values)) {
295
- throw new Error('update needs an object');
296
- }
297
- opts = opts || {};
298
- opts.multi = (typeof opts.multi === 'undefined') ? false : opts.multi;
299
- let findMethod = opts.multi ? 'find' : 'findOne';
300
- let ids = this[findMethod](query, {
301
- _filterType: 'id'
302
- });
303
- let pk = this.primaryKey;
304
- let cacheable = this.cacheable;
305
- if ((opts.multi && !ids.length) || (!opts.multi && !ids)) {
306
- return 0;
307
- }
308
- if (!opts.multi) {
309
- let id = ids;
310
- let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
311
- let isIdUpdated = values[pk] && values[pk] !== row.data[pk];
312
- let newId = isIdUpdated ? this.path + values[pk] : id;
313
- // check exist
314
- if (isIdUpdated && this.findOne(values[pk])) {
315
- throw new Error('Duplicate value \'' + values[pk] + '\' for unique field \'' + pk + '\'');
316
- }
317
- let data = Object.assign({}, row.data, values);
318
- if (cacheable) {
319
- this.cache[newId] = {
320
- offlineDate: row.offlineDate,
321
- offlineDateExpires: row.offlineDateExpires,
322
- data: data
323
- };
324
- if (isIdUpdated) {
325
- delete this.cache[id];
326
- }
327
- }
328
- this.storage.setItem(newId, JSON.stringify({
329
- offlineDate: row.offlineDate,
330
- offlineDateExpires: row.offlineDateExpires,
331
- data: data
332
- }));
333
- if (isIdUpdated) {
334
- this.storage.removeItem(id);
335
- }
336
- return data;
337
- }
338
- else {
339
- delete values[pk];
340
- if (!Object.keys(values).length) {
341
- return 0;
342
- }
343
- for (let id of ids) {
344
- let row = cacheable ? this.cache[id] : JSON.parse(this.storage.getItem(id), dateReviver);
345
- let data = Object.assign({}, row.data, values);
346
- if (cacheable) {
347
- this.cache[id] = {
348
- offlineDate: row.offlineDate,
349
- offlineDateExpires: row.offlineDateExpires,
350
- data: data
351
- };
352
- }
353
- this.storage.setItem(id, JSON.stringify({
354
- offlineDate: row.offlineDate,
355
- offlineDateExpires: row.offlineDateExpires,
356
- data: data
357
- }));
358
- }
359
- return ids.length;
360
- }
361
- }
362
- drop() {
363
- this.remove({});
364
- return true;
365
- }
366
- }
367
- class ID {
368
- constructor() {
369
- }
370
- toString() {
371
- return (new Date().getTime() / 1000).toString(16).substr(-4) + Math.random().toString(16).substr(2, 12);
372
- }
373
- }
374
- class MockStorage {
375
- length = 0;
376
- constructor() {
377
- this.length = 0;
378
- }
379
- key() { }
380
- setItem() { }
381
- getItem() { }
382
- removeItem() { }
383
- }
384
- const isSupported = (storage) => {
385
- if (!storage || !(storage instanceof Object)) {
386
- return false;
387
- }
388
- try {
389
- storage.setItem('_supported', '1');
390
- storage.removeItem('_supported');
391
- return true;
392
- }
393
- catch (e) {
394
- return false;
395
- }
396
- };
397
- const isObject = (object) => {
398
- return object instanceof Object && object.constructor.name === 'Object';
399
- };
400
- const queryMatch = (query, target) => {
401
- if (!query || !Object.keys(query).length) {
402
- return true;
403
- }
404
- for (let field of Object.keys(query)) {
405
- let val = query[field];
406
- let tar = target[field];
407
- if (!tar) {
408
- field.split('.').forEach(path => {
409
- if (!tar) {
410
- tar = target[path];
411
- }
412
- else {
413
- tar = tar[path];
414
- }
415
- });
416
- }
417
- if (val instanceof RegExp) {
418
- if (!val.test(tar)) {
419
- return false;
420
- }
421
- }
422
- else if (isObject(val)) {
423
- for (let op of Object.keys(val)) {
424
- if (Operator._checkExist(op) && !Operator[op](val[op], tar)) {
425
- return false;
426
- }
427
- }
428
- }
429
- else if (val !== tar) {
430
- return false;
431
- }
432
- }
433
- return true;
434
- };
435
- const sortCompare = (sort, a, b, i, fields) => {
436
- i = i || 0;
437
- fields = fields || Object.keys(sort);
438
- let field = fields[i];
439
- if (!field) {
440
- return 0;
441
- }
442
- if (a[field] === b[field]) {
443
- i++;
444
- return sortCompare(sort, a, b, i, fields);
445
- }
446
- if (sort[field] === 1) {
447
- return a[field] - b[field];
448
- }
449
- if (sort[field] === -1) {
450
- return b[field] - a[field];
451
- }
452
- };
453
- /*
454
- Query Selectors
455
-
456
- $eq Matches vals that are equal to a specified val.
457
- $gt Matches vals that are greater than a specified val.
458
- $gte Matches vals that are greater than or equal to a specified val.
459
- $in Matches any of the vals specified in an array.
460
- $lt Matches vals that are less than a specified val.
461
- $lte Matches vals that are less than or equal to a specified val.
462
- $ne Matches all vals that are not equal to a specified val.
463
- $nin Matches none of the vals specified in an array.
464
- */
465
- const ops = ['$eq', '$gt', '$gte', '$in', '$lt', '$lte', '$ne', '$nin'];
466
- const isNotNumber = (val) => {
467
- return typeof val !== 'number';
468
- };
469
- class Operator {
470
- static $eq(val, tar) {
471
- return tar === val;
472
- }
473
- static $gt(val, tar) {
474
- if (isNotNumber(val)) {
475
- throw new Error('\'$gt\' value must be a number');
476
- }
477
- return tar > val;
478
- }
479
- static $gte(val, tar) {
480
- if (isNotNumber(val)) {
481
- throw new Error('\'$gte\' value must be a number');
482
- }
483
- return tar >= val;
484
- }
485
- static $in(val, tar) {
486
- if (!(val instanceof Array)) {
487
- throw new Error('\'$in\' value must be an array');
488
- }
489
- return val.includes(tar);
490
- }
491
- static $lt(val, tar) {
492
- if (isNotNumber(val)) {
493
- throw new Error('\'$lt\' value must be a number');
494
- }
495
- return tar < val;
496
- }
497
- static $lte(val, tar) {
498
- if (isNotNumber(val)) {
499
- throw new Error('\'$lte\' value must be a number');
500
- }
501
- return tar <= val;
502
- }
503
- static $ne(val, tar) {
504
- return tar !== val;
505
- }
506
- static $nin(val, tar) {
507
- if (!(val instanceof Array)) {
508
- throw new Error('\'$nin\' value must be an array');
509
- }
510
- return !val.includes(tar);
511
- }
512
- static _checkExist(op) {
513
- if (ops.includes(op)) {
514
- return true;
515
- }
516
- throw new Error('unknown operator: \'' + op + '\'');
517
- }
518
- }
519
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2ZmbGluZS1kYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL2xpYi9vZmZsaW5lLWRiLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUVuRCxNQUFNLE9BQU8sU0FBUztJQUVyQixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsUUFBUSxHQUFHLElBQUksQ0FBQztJQUNoQixVQUFVLEdBQUcsSUFBSSxDQUFDO0lBQ2xCLEdBQUcsR0FBRyxFQUFFLENBQUM7SUFFVCxZQUFhLElBQUk7UUFDaEIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sSUFBSSxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQzdELElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEtBQUssQ0FBQztRQUMzQyxJQUFJLENBQUMsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksR0FBRyxDQUFDO1FBRTNCLElBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxFQUFFO1lBQy9CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDO1NBQ3BCO0lBQ0YsQ0FBQztJQUVELEdBQUcsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUNiLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsY0FBYztRQUNiLElBQUksV0FBVyxHQUFHLEVBQUUsQ0FBQztRQUVyQixNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFO2dCQUNwRCxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUNwQztRQUNGLENBQUMsQ0FBQyxDQUFDO1FBRUgsT0FBTyxXQUFXLENBQUM7SUFDcEIsQ0FBQztJQUVELFVBQVUsQ0FBQyxJQUFJLEVBQUUsSUFBSTtRQUNwQixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7Q0FDRDtBQUVELE1BQU0sVUFBVTtJQUVmLElBQUksR0FBRyxFQUFFLENBQUM7SUFDVixPQUFPLEdBQUcsSUFBSSxDQUFDO0lBQ2YsSUFBSSxHQUFHLEVBQUUsQ0FBQztJQUNWLFVBQVUsR0FBRyxFQUFFLENBQUM7SUFDaEIsS0FBSyxHQUFHLEVBQUUsQ0FBQztJQUNYLFNBQVMsR0FBRyxLQUFLLENBQUM7SUFFbEIsWUFBYSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUk7UUFDMUIsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFbEIsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUM7UUFDakIsSUFBSSxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUMsT0FBTyxJQUFJLElBQUksV0FBVyxFQUFFLENBQUM7UUFDL0MsSUFBSSxDQUFDLElBQUksR0FBRyxFQUFFLENBQUMsUUFBUSxHQUFHLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUM7UUFDakQsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLEVBQUUsQ0FBQyxVQUFVLENBQUM7UUFDbkQsSUFBSSxDQUFDLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUM7SUFDOUIsQ0FBQztJQUdELFVBQVU7UUFDVCxJQUFJLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDZixJQUFJLFNBQVMsR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBRTVDLEtBQUssSUFBSSxHQUFHLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDMUMsSUFBSSxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUN4QixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQzthQUNoRTtTQUNEO1FBRUQsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFDbkIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUM7SUFDdkIsQ0FBQztJQUdELE9BQU8sQ0FBRSxNQUFNLEVBQUUsSUFBSTtRQUNwQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLElBQUksTUFBTSxDQUFDLENBQUMsWUFBWTtRQUM3QyxJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksS0FBSyxDQUFDO1FBRWpDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ3BCLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztTQUNsQjtRQUVELElBQUksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNiLElBQUksVUFBVSxDQUFDO1FBQ2YsSUFBSSxRQUFRLEdBQUcsSUFBSSxDQUFDLElBQUksS0FBSyxJQUFJLENBQUM7UUFFbEMsSUFBSSxPQUFPLE1BQU0sS0FBSyxRQUFRLEVBQUU7WUFDL0IsTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1NBQzVCO2FBQU0sSUFBSSxPQUFPLE1BQU0sS0FBSyxVQUFVLEVBQUU7WUFDeEMsVUFBVSxHQUFHLElBQUksQ0FBQztTQUNsQjthQUFNLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDbkIsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFekUsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO2dCQUNmLE9BQU8sR0FBRyxDQUFDO2FBQ1g7aUJBQU07Z0JBQ04sT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO2FBQ3RCO1NBQ0Q7UUFFRCxLQUFLLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ3hDLElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFMUIsSUFBSSxVQUFVLEVBQUU7Z0JBQ2YsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFO29CQUM3QixJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO29CQUUvQixJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUU7d0JBQ2YsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDZDt5QkFBTTt3QkFDTixPQUFPLEdBQUcsQ0FBQztxQkFDWDtpQkFDRDthQUNEO2lCQUFNO2dCQUNOLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtvQkFDckIsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztvQkFFL0IsSUFBSSxJQUFJLENBQUMsS0FBSyxFQUFFO3dCQUNmLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ2Q7eUJBQU07d0JBQ04sT0FBTyxHQUFHLENBQUM7cUJBQ1g7aUJBQ0Q7YUFDRDtTQUNEO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQztJQUNoQyxDQUFDO0lBR0QsTUFBTSxDQUFDLElBQUksRUFBRSxXQUFZLEVBQUUsSUFBSztRQUMvQixJQUFJLFdBQVcsR0FBRyxJQUFJLFlBQVksS0FBSyxDQUFDO1FBRXhDLElBQUksV0FBVyxFQUFFO1lBQ2hCLElBQUksSUFBSSxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3RCLE9BQU8sRUFBRSxDQUFDO2FBQ1Y7U0FDRDthQUFNO1lBQ04sSUFBSSxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDZDtRQUVELElBQUksRUFBRSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDekIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQztRQUUvQixLQUFLLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtZQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO2dCQUNuQixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7YUFDL0U7WUFFRCxJQUFJLE9BQU8sR0FBRyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFdBQVcsRUFBRTtnQkFDbkMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLElBQUksRUFBRSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7YUFDOUI7WUFFRCxJQUFJLEdBQUcsR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1lBRXJCLElBQUksU0FBUyxFQUFFO2dCQUNkLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRztvQkFDakMsV0FBVyxFQUFFLEdBQUc7b0JBQ2hCLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLEdBQUcsU0FBUyxDQUFDO29CQUNuRixJQUFJLEVBQUUsR0FBRztpQkFDVCxDQUFDO2FBQ0Y7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO2dCQUN4RCxXQUFXLEVBQUUsR0FBRztnQkFDaEIsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsR0FBRyxTQUFTLENBQUM7Z0JBQ25GLElBQUksRUFBRSxHQUFHO2FBQ1QsQ0FBQyxDQUFDLENBQUM7U0FDSjtRQUVELE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ3pELENBQUM7SUFHRCxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUssRUFBRSxLQUFNO1FBQ3hCLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7UUFDM0IsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztRQUV0QixJQUFJLElBQUksQ0FBQyxJQUFJLFlBQVksS0FBSyxFQUFFO1lBQy9CLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFHLEVBQUUsSUFBSSxFQUFFLEVBQUU7Z0JBQzFDLElBQUksT0FBTyxJQUFJLEtBQUssUUFBUSxFQUFFO29CQUM3QixHQUFHLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2lCQUNkO3FCQUFNLElBQUksSUFBSSxZQUFZLEtBQUssSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFO29CQUNoRCxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDNUI7Z0JBQ0QsT0FBTyxHQUFHLENBQUM7WUFDWixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7U0FDUDtRQUVELElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7UUFDOUUsSUFBSSxVQUFVLEdBQUc7WUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTTtZQUNoQyxLQUFLLEVBQUUsSUFBSTtTQUNYLENBQUM7UUFFRixJQUFJLEdBQUcsRUFBRTtZQUNSLGNBQWM7WUFDZCxJQUFJLFlBQVksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztZQUM1RSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxZQUFZLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FFOUM7YUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsTUFBTSxFQUFFO1lBQ3JDLFdBQVc7WUFDWCxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxHQUFHLEVBQUUsRUFBRTtnQkFDaEMsT0FBTyxVQUFVLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1lBQy9CLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztTQUNmO2FBQU07WUFDTixJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDLENBQUM7U0FDdEM7UUFFRCxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1gsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDN0I7UUFFRCxPQUFPO1FBQ1AsSUFBSSxJQUFJLENBQUMsSUFBSSxFQUFFO1lBQ2QsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTtnQkFDbEIsT0FBTyxXQUFXLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDckMsQ0FBQyxDQUFDLENBQUM7U0FDSDtRQUVELElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtZQUNmLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7U0FDckQ7YUFBTSxJQUFJLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDckIsSUFBSSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQzdCO1FBRUQsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0lBR0QsT0FBTyxDQUFDLEtBQUssRUFBRSxJQUFLO1FBQ25CLEtBQUssR0FBRyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQ3BCLElBQUksR0FBRyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRWxCLElBQUksSUFBSSxDQUFDO1FBQ1QsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztRQUN4QyxJQUFJLFdBQVcsR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUM1RCxJQUFJLFdBQVcsR0FBRyxLQUFLLENBQUM7UUFDeEIsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUM7UUFDNUIsSUFBSSxVQUFVLEdBQUc7WUFDaEIsSUFBSSxFQUFFLElBQUksQ0FBQyxXQUFXLElBQUksTUFBTTtZQUNoQyxLQUFLLEVBQUUsS0FBSztTQUNaLENBQUM7UUFFRixJQUFJLFdBQVcsQ0FBQyxNQUFNLElBQUksV0FBVyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDaEUsRUFBRSxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7WUFDNUIsV0FBVyxHQUFHLElBQUksQ0FBQztTQUNuQjtRQUVELElBQUksRUFBRSxFQUFFO1lBQ1AsUUFBUTtZQUNSLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1lBQzVDLElBQUksR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBRXhELElBQUksSUFBSSxJQUFJLFdBQVcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLEVBQUU7Z0JBQ3BELE9BQU8sSUFBSSxDQUFDO2FBQ1o7U0FDRDthQUFNLElBQUksV0FBVyxDQUFDLE1BQU0sRUFBRTtZQUM5QixXQUFXO1lBQ1gsSUFBSSxTQUFTLEVBQUU7Z0JBQ2QsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO2FBQzlCO2lCQUFNO2dCQUNOLElBQUksR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUNoQyxPQUFPLFVBQVUsQ0FBQyxLQUFLLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0JBQy9CLENBQUMsRUFBRSxVQUFVLENBQUMsQ0FBQztnQkFFZixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7b0JBQ3hCLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUM3QjtxQkFDSSxJQUFJLElBQUksRUFBRTtvQkFDZCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDakI7YUFDRDtTQUNEO2FBQU07WUFDTixJQUFJLFNBQVMsRUFBRTtnQkFDZCxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDOUI7aUJBQU07Z0JBQ04sSUFBSSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFVBQVUsQ0FBQyxDQUFDO2FBQ3RDO1NBQ0Q7UUFFRCxJQUFJLENBQUMsRUFBRSxJQUFJLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDN0IsSUFBSSxHQUFHLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksSUFBSSxDQUFDO1NBQzVCO1FBRUQsSUFBSSxJQUFJLElBQUksVUFBVSxDQUFDLElBQUksS0FBSyxJQUFJLEVBQUU7WUFDckMsSUFBSSxHQUFHLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUN6QztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2IsQ0FBQztJQUdELE1BQU0sQ0FBQyxLQUFLLEVBQUUsSUFBSztRQUNsQixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hDO1FBRUQsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFDbEIsSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLE9BQU8sSUFBSSxDQUFDLEtBQUssS0FBSyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDO1FBRXJFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO1FBQ2pELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQztRQUNmLElBQUksVUFBVSxLQUFLLE1BQU0sRUFBRTtZQUMxQixHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDN0IsV0FBVyxFQUFFLElBQUk7YUFDakIsRUFBRSxJQUFJLENBQUMsQ0FBQztTQUNUO2FBQ0k7WUFDSixHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRTtnQkFDN0IsV0FBVyxFQUFFLElBQUk7YUFDakIsQ0FBQyxDQUFDO1NBQ0g7UUFDRCxJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBRS9CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDekQsT0FBTyxDQUFDLENBQUM7U0FDVDtRQUVELElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ2hCLEdBQUcsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ1o7UUFFRCxLQUFLLElBQUksRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNuQixJQUFJLFNBQVMsRUFBRTtnQkFDZCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7YUFDdEI7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztTQUM1QjtRQUVELE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQztJQUNuQixDQUFDO0lBR0QsTUFBTSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsSUFBSztRQUMxQixJQUFJLENBQUMsS0FBSyxFQUFFO1lBQ1gsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1NBQ3hDO1FBQ0QsSUFBSSxDQUFDLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUNqQyxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7U0FDMUM7UUFFRCxJQUFJLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNsQixJQUFJLENBQUMsS0FBSyxHQUFHLENBQUMsT0FBTyxJQUFJLENBQUMsS0FBSyxLQUFLLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUM7UUFFdEUsSUFBSSxVQUFVLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7UUFDakQsSUFBSSxHQUFHLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRTtZQUNqQyxXQUFXLEVBQUUsSUFBSTtTQUNqQixDQUFDLENBQUM7UUFDSCxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ3pCLElBQUksU0FBUyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUM7UUFFL0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUN6RCxPQUFPLENBQUMsQ0FBQztTQUNUO1FBRUQsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDaEIsSUFBSSxFQUFFLEdBQUcsR0FBRyxDQUFDO1lBQ2IsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ3pGLElBQUksV0FBVyxHQUFHLE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDLEtBQUssR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztZQUM1RCxJQUFJLEtBQUssR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFFdEQsY0FBYztZQUNkLElBQUksV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUU7Z0JBQzVDLE1BQU0sSUFBSSxLQUFLLENBQUMsb0JBQW9CLEdBQUcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxHQUFHLHdCQUF3QixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQzthQUMxRjtZQUVELElBQUksSUFBSSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFFL0MsSUFBSSxTQUFTLEVBQUU7Z0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsR0FBRztvQkFDbkIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO29CQUM1QixrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO29CQUMxQyxJQUFJLEVBQUUsSUFBSTtpQkFDVixDQUFDO2dCQUNGLElBQUksV0FBVyxFQUFFO29CQUNoQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLENBQUM7aUJBQ3RCO2FBQ0Q7WUFFRCxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQztnQkFDMUMsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO2dCQUM1QixrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO2dCQUMxQyxJQUFJLEVBQUUsSUFBSTthQUNWLENBQUMsQ0FBQyxDQUFDO1lBRUosSUFBSSxXQUFXLEVBQUU7Z0JBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQyxDQUFDO2FBQzVCO1lBRUQsT0FBTyxJQUFJLENBQUM7U0FFWjthQUFNO1lBQ04sT0FBTyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7WUFFbEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFO2dCQUNoQyxPQUFPLENBQUMsQ0FBQzthQUNUO1lBRUQsS0FBSyxJQUFJLEVBQUUsSUFBSSxHQUFHLEVBQUU7Z0JBQ25CLElBQUksR0FBRyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxXQUFXLENBQUMsQ0FBQztnQkFFekYsSUFBSSxJQUFJLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsR0FBRyxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsQ0FBQztnQkFFL0MsSUFBSSxTQUFTLEVBQUU7b0JBQ2QsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsR0FBRzt3QkFDaEIsV0FBVyxFQUFFLEdBQUcsQ0FBQyxXQUFXO3dCQUM1QixrQkFBa0IsRUFBRSxHQUFHLENBQUMsa0JBQWtCO3dCQUMxQyxJQUFJLEVBQUUsSUFBSTtxQkFDVixDQUFDO2lCQUNGO2dCQUVELElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDO29CQUN2QyxXQUFXLEVBQUUsR0FBRyxDQUFDLFdBQVc7b0JBQzVCLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxrQkFBa0I7b0JBQzFDLElBQUksRUFBRSxJQUFJO2lCQUNWLENBQUMsQ0FBQyxDQUFDO2FBQ0o7WUFFRCxPQUFPLEdBQUcsQ0FBQyxNQUFNLENBQUM7U0FDbEI7SUFDRixDQUFDO0lBRUQsSUFBSTtRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDaEIsT0FBTyxJQUFJLENBQUM7SUFDYixDQUFDO0NBQ0Q7QUFFRCxNQUFNLEVBQUU7SUFDUDtJQUNBLENBQUM7SUFFRCxRQUFRO1FBQ1AsT0FBTyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLEdBQUcsSUFBSSxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztJQUN6RyxDQUFDO0NBQ0Q7QUFFRCxNQUFNLFdBQVc7SUFDaEIsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVYO1FBQ0MsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakIsQ0FBQztJQUVELEdBQUcsS0FBSSxDQUFDO0lBQ1IsT0FBTyxLQUFJLENBQUM7SUFDWixPQUFPLEtBQUksQ0FBQztJQUNaLFVBQVUsS0FBSSxDQUFDO0NBQ2Y7QUFFRCxNQUFNLFdBQVcsR0FBRyxDQUFDLE9BQU8sRUFBRSxFQUFFO0lBQy9CLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxDQUFDLE9BQU8sWUFBWSxNQUFNLENBQUMsRUFBRTtRQUM3QyxPQUFPLEtBQUssQ0FBQztLQUNiO0lBRUQsSUFBSTtRQUNILE9BQU8sQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxVQUFVLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUFDLE9BQU8sQ0FBQyxFQUFFO1FBQ1gsT0FBTyxLQUFLLENBQUM7S0FDYjtBQUNGLENBQUMsQ0FBQztBQUVGLE1BQU0sUUFBUSxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUU7SUFDM0IsT0FBTyxNQUFNLFlBQVksTUFBTSxJQUFJLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQztBQUN6RSxDQUFDLENBQUM7QUFFRixNQUFNLFVBQVUsR0FBRyxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsRUFBRTtJQUNwQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxNQUFNLEVBQUU7UUFDekMsT0FBTyxJQUFJLENBQUM7S0FDWjtJQUVELEtBQUssSUFBSSxLQUFLLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRTtRQUNyQyxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDdkIsSUFBSSxHQUFHLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDO1FBRXhCLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDVCxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsRUFBRTtnQkFDL0IsSUFBSSxDQUFDLEdBQUcsRUFBRTtvQkFDVCxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuQjtxQkFDSTtvQkFDSixHQUFHLEdBQUcsR0FBRyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNoQjtZQUNGLENBQUMsQ0FBQyxDQUFDO1NBQ0g7UUFFRCxJQUFJLEdBQUcsWUFBWSxNQUFNLEVBQUU7WUFDMUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0JBQ25CLE9BQU8sS0FBSyxDQUFDO2FBQ2I7U0FDRDthQUFNLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3pCLEtBQUssSUFBSSxFQUFFLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRTtnQkFDaEMsSUFBSSxRQUFRLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLENBQUMsRUFBRTtvQkFDNUQsT0FBTyxLQUFLLENBQUM7aUJBQ2I7YUFDRDtTQUNEO2FBQU0sSUFBSSxHQUFHLEtBQUssR0FBRyxFQUFFO1lBQ3ZCLE9BQU8sS0FBSyxDQUFDO1NBQ2I7S0FDRDtJQUVELE9BQU8sSUFBSSxDQUFDO0FBQ2IsQ0FBQyxDQUFDO0FBRUYsTUFBTSxXQUFXLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFFLEVBQUUsTUFBTyxFQUFFLEVBQUU7SUFDL0MsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDWCxNQUFNLEdBQUcsTUFBTSxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFFckMsSUFBSSxLQUFLLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBRXRCLElBQUksQ0FBQyxLQUFLLEVBQUU7UUFDWCxPQUFPLENBQUMsQ0FBQztLQUNUO0lBRUQsSUFBSSxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQzFCLENBQUMsRUFBRSxDQUFDO1FBQ0osT0FBTyxXQUFXLENBQUMsSUFBSSxFQUFFLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0tBQzFDO0lBRUQsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxFQUFFO1FBQ3RCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtJQUVELElBQUksSUFBSSxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO1FBQ3ZCLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUMzQjtBQUNGLENBQUMsQ0FBQztBQUVGOzs7Ozs7Ozs7OztFQVdFO0FBRUYsTUFBTSxHQUFHLEdBQUcsQ0FBQyxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFeEUsTUFBTSxXQUFXLEdBQUcsQ0FBQyxHQUFHLEVBQUUsRUFBRTtJQUMzQixPQUFPLE9BQU8sR0FBRyxLQUFLLFFBQVEsQ0FBQztBQUNoQyxDQUFDLENBQUM7QUFFRixNQUFNLFFBQVE7SUFDYixNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLE9BQU8sR0FBRyxLQUFLLEdBQUcsQ0FBQztJQUNwQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRztRQUNsQixJQUFJLFdBQVcsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLEdBQUcsR0FBRyxHQUFHLENBQUM7SUFDbEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDbkIsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1NBQ25EO1FBQ0QsT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDO0lBQ25CLENBQUM7SUFFRCxNQUFNLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxHQUFHO1FBQ2xCLElBQUksQ0FBQyxDQUFDLEdBQUcsWUFBWSxLQUFLLENBQUMsRUFBRTtZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLGdDQUFnQyxDQUFDLENBQUM7U0FDbEQ7UUFDRCxPQUFPLEdBQUcsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDbEIsSUFBSSxXQUFXLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDckIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnQ0FBZ0MsQ0FBQyxDQUFDO1NBQ2xEO1FBQ0QsT0FBTyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQ2xCLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHO1FBQ25CLElBQUksV0FBVyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNuRDtRQUNELE9BQU8sR0FBRyxJQUFJLEdBQUcsQ0FBQztJQUNuQixDQUFDO0lBRUQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRztRQUNsQixPQUFPLEdBQUcsS0FBSyxHQUFHLENBQUM7SUFDcEIsQ0FBQztJQUVELE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLEdBQUc7UUFDbkIsSUFBSSxDQUFDLENBQUMsR0FBRyxZQUFZLEtBQUssQ0FBQyxFQUFFO1lBQzVCLE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztTQUNuRDtRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQzNCLENBQUM7SUFFRCxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUU7UUFDcEIsSUFBSSxHQUFHLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxFQUFFO1lBQ3JCLE9BQU8sSUFBSSxDQUFDO1NBQ1o7UUFDRCxNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsQ0FBQztJQUNyRCxDQUFDO0NBQ0QiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkYXRlUmV2aXZlciB9IGZyb20gJy4vdXRpbC9jb21tb24uaGVscGVyJztcblxuZXhwb3J0IGNsYXNzIFN0b3JhZ2VEQiB7XG5cblx0c3RvcmFnZSA9IG51bGw7XG5cdGRhdGFiYXNlID0gbnVsbDtcblx0cHJpbWFyeUtleSA9IG51bGw7XG5cdHNlcCA9ICcnO1xuXG5cdGNvbnN0cnVjdG9yIChvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLnN0b3JhZ2UgPSBvcHRzLnN0b3JhZ2UgfHwgd2luZG93ICYmIHdpbmRvdy5sb2NhbFN0b3JhZ2U7XG5cdFx0dGhpcy5kYXRhYmFzZSA9IG9wdHMuZGF0YWJhc2UgfHwgJ2RiJztcblx0XHR0aGlzLnByaW1hcnlLZXkgPSBvcHRzLnByaW1hcnlLZXkgfHwgJ19pZCc7XG5cdFx0dGhpcy5zZXAgPSBvcHRzLnNlcCB8fCAnOic7XG5cblx0XHRpZiAoIWlzU3VwcG9ydGVkKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdHRoaXMuc3RvcmFnZSA9IG51bGw7XG5cdFx0fVxuXHR9XG5cblx0Z2V0KG5hbWUsIG9wdHMpIHtcblx0XHRyZXR1cm4gbmV3IENvbGxlY3Rpb24odGhpcywgbmFtZSwgb3B0cyk7XG5cdH1cblxuXHRnZXRDb2xsZWN0aW9ucygpIHtcblx0XHRsZXQgY29sbGVjdGlvbnMgPSBbXTtcblxuXHRcdE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkuZmlsdGVyKGEgPT4gYS5zcGxpdCgnOicpLmxlbmd0aCA+IDIpLmZvckVhY2goa2V5ID0+IHtcblx0XHRcdGlmICghY29sbGVjdGlvbnMuc29tZShiID0+IGIgPT09IGtleS5zcGxpdCgnOicpWzFdKSkge1xuXHRcdFx0XHRjb2xsZWN0aW9ucy5wdXNoKGtleS5zcGxpdCgnOicpWzFdKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiBjb2xsZWN0aW9ucztcblx0fVxuXG5cdGNvbGxlY3Rpb24obmFtZSwgb3B0cykge1xuXHRcdHJldHVybiB0aGlzLmdldChuYW1lLCBvcHRzKTtcblx0fVxufVxuXG5jbGFzcyBDb2xsZWN0aW9uIHtcblxuXHRuYW1lID0gJyc7XG5cdHN0b3JhZ2UgPSBudWxsO1xuXHRwYXRoID0gJyc7XG5cdHByaW1hcnlLZXkgPSAnJztcblx0Y2FjaGUgPSB7fTtcblx0Y2FjaGVhYmxlID0gZmFsc2U7XG5cblx0Y29uc3RydWN0b3IgKGRiLCBuYW1lLCBvcHRzKSB7XG5cdFx0b3B0cyA9IG9wdHMgfHwge307XG5cblx0XHR0aGlzLm5hbWUgPSBuYW1lO1xuXHRcdHRoaXMuc3RvcmFnZSA9IGRiLnN0b3JhZ2UgfHwgbmV3IE1vY2tTdG9yYWdlKCk7XG5cdFx0dGhpcy5wYXRoID0gZGIuZGF0YWJhc2UgKyBkYi5zZXAgKyBuYW1lICsgZGIuc2VwO1xuXHRcdHRoaXMucHJpbWFyeUtleSA9IG9wdHMucHJpbWFyeUtleSB8fCBkYi5wcmltYXJ5S2V5O1xuXHRcdHRoaXMuY2FjaGUgPSB7fTtcblx0XHR0aGlzLmNhY2hlYWJsZSA9ICFkYi5zdG9yYWdlO1xuXHR9XG5cblxuXHRfaW5pdENhY2hlICgpIHtcblx0XHRsZXQgY2FjaGUgPSB7fTtcblx0XHRsZXQgZmlsdGVyRXhwID0gbmV3IFJlZ0V4cCgnXicgKyB0aGlzLnBhdGgpO1xuXG5cdFx0Zm9yIChsZXQga2V5IG9mIE9iamVjdC5rZXlzKHRoaXMuc3RvcmFnZSkpIHtcblx0XHRcdGlmIChmaWx0ZXJFeHAudGVzdChrZXkpKSB7XG5cdFx0XHRcdGNhY2hlW2tleV0gPSBKU09OLnBhcnNlKHRoaXMuc3RvcmFnZS5nZXRJdGVtKGtleSksIGRhdGVSZXZpdmVyKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLmNhY2hlID0gY2FjaGU7XG5cdFx0dGhpcy5jYWNoZWFibGUgPSB0cnVlO1xuXHR9XG5cblxuXHRfZmlsdGVyIChmaWx0ZXIsIG9wdHMpIHtcblx0XHRvcHRzLnR5cGUgPSBvcHRzLnR5cGUgfHwgJ2RhdGEnOyAvLyBkYXRhLCBpZDtcblx0XHRvcHRzLm11bHRpID0gb3B0cy5tdWx0aSB8fCBmYWxzZTtcblxuXHRcdGlmICghdGhpcy5jYWNoZWFibGUpIHtcblx0XHRcdHRoaXMuX2luaXRDYWNoZSgpO1xuXHRcdH1cblxuXHRcdGxldCByZXMgPSBbXTtcblx0XHRsZXQgaXNGbkZpbHRlcjtcblx0XHRsZXQgaXNUeXBlSWQgPSBvcHRzLnR5cGUgPT09ICdpZCc7XG5cblx0XHRpZiAodHlwZW9mIGZpbHRlciA9PT0gJ3N0cmluZycpIHtcblx0XHRcdGZpbHRlciA9IG5ldyBSZWdFeHAoZmlsdGVyKTtcblx0XHR9IGVsc2UgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdGlzRm5GaWx0ZXIgPSB0cnVlO1xuXHRcdH0gZWxzZSBpZiAoIWZpbHRlcikge1xuXHRcdFx0bGV0IHJldCA9IGlzVHlwZUlkID8gT2JqZWN0LmtleXModGhpcy5jYWNoZSkgOiBPYmplY3QudmFsdWVzKHRoaXMuY2FjaGUpO1xuXG5cdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0cmV0dXJuIHJldFswXSB8fCBudWxsO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGZvciAobGV0IGtleSBvZiBPYmplY3Qua2V5cyh0aGlzLmNhY2hlKSkge1xuXHRcdFx0bGV0IHZhbCA9IHRoaXMuY2FjaGVba2V5XTtcblxuXHRcdFx0aWYgKGlzRm5GaWx0ZXIpIHtcblx0XHRcdFx0aWYgKGZpbHRlcihrZXksIHZhbFsnZGF0YSddKSkge1xuXHRcdFx0XHRcdGxldCByZXQgPSBpc1R5cGVJZCA/IGtleSA6IHZhbDtcblxuXHRcdFx0XHRcdGlmIChvcHRzLm11bHRpKSB7XG5cdFx0XHRcdFx0XHRyZXMucHVzaChyZXQpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aWYgKGZpbHRlci50ZXN0KGtleSkpIHtcblx0XHRcdFx0XHRsZXQgcmV0ID0gaXNUeXBlSWQgPyBrZXkgOiB2YWw7XG5cblx0XHRcdFx0XHRpZiAob3B0cy5tdWx0aSkge1xuXHRcdFx0XHRcdFx0cmVzLnB1c2gocmV0KTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb3B0cy5tdWx0aSA/IHJlcyA6IG51bGw7XG5cdH1cblxuXG5cdGluc2VydChkYXRhLCBleHBpcmVzRGF0ZT8sIG9wdHM/KSB7XG5cdFx0bGV0IGFycmF5SW5zZXJ0ID0gZGF0YSBpbnN0YW5jZW9mIEFycmF5O1xuXG5cdFx0aWYgKGFycmF5SW5zZXJ0KSB7XG5cdFx0XHRpZiAoZGF0YS5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0cmV0dXJuIFtdO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRkYXRhID0gW2RhdGFdO1xuXHRcdH1cblxuXHRcdGxldCBwayA9IHRoaXMucHJpbWFyeUtleTtcblx0XHRsZXQgY2FjaGVhYmxlID0gdGhpcy5jYWNoZWFibGU7XG5cblx0XHRmb3IgKGxldCByb3cgb2YgZGF0YSkge1xuXHRcdFx0aWYgKCFpc09iamVjdChyb3cpKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcignVHlwZUVycm9yOiBpbnNlcnQgZGF0YSBtdXN0IGJlIGFuIG9iamVjdCBvciBhbiBvYmplY3QgYXJyYXknKTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKHR5cGVvZiByb3dbcGtdID09PSAndW5kZWZpbmVkJykge1xuXHRcdFx0XHRyb3dbcGtdID0gbmV3IElEKCkudG9TdHJpbmcoKTtcblx0XHRcdH1cblxuXHRcdFx0bGV0IG5vdyA9IG5ldyBEYXRlKCk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVt0aGlzLnBhdGggKyByb3dbcGtdXSA9IHtcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZTogbm93LFxuXHRcdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRcdGRhdGE6IHJvd1xuXHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHR0aGlzLnN0b3JhZ2Uuc2V0SXRlbSh0aGlzLnBhdGggKyByb3dbcGtdLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdG9mZmxpbmVEYXRlOiBub3csXG5cdFx0XHRcdG9mZmxpbmVEYXRlRXhwaXJlczogZXhwaXJlc0RhdGUgPyBleHBpcmVzRGF0ZSA6IG5ldyBEYXRlKG5vdy5nZXRUaW1lKCkgKyA2MDQ4MDAwMDApLFxuXHRcdFx0XHRkYXRhOiByb3dcblx0XHRcdH0pKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gYXJyYXlJbnNlcnQgPyBkYXRhLm1hcChhID0+IGEuX2lkKSA6IGRhdGFbMF0uX2lkO1xuXHR9XG5cblxuXHRmaW5kKHF1ZXJ5LCBvcHRzPywgdG90YWw/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLnNraXAgPSBvcHRzLnNraXAgfHwgMDtcblx0XHRvcHRzLmxpbWl0ID0gb3B0cy5saW1pdDtcblx0XHRvcHRzLnNvcnQgPSBvcHRzLnNvcnQ7XG5cblx0XHRpZiAob3B0cy5zb3J0IGluc3RhbmNlb2YgQXJyYXkpIHtcblx0XHRcdG9wdHMuc29ydCA9IG9wdHMuc29ydC5yZWR1Y2UoKHJlcywgaXRlbSkgPT4ge1xuXHRcdFx0XHRpZiAodHlwZW9mIGl0ZW0gPT09ICdzdHJpbmcnKSB7XG5cdFx0XHRcdFx0cmVzW2l0ZW1dID0gMTtcblx0XHRcdFx0fSBlbHNlIGlmIChpdGVtIGluc3RhbmNlb2YgQXJyYXkgJiYgaXRlbS5sZW5ndGgpIHtcblx0XHRcdFx0XHRyZXNbaXRlbVswXV0gPSBpdGVtWzFdIHx8IDE7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHJlcztcblx0XHRcdH0sIHt9KTtcblx0XHR9XG5cblx0XHRsZXQgZGF0YTtcblx0XHRsZXQgaWRzID0gaXNPYmplY3QocXVlcnkpID8gbnVsbCA6IChxdWVyeSBpbnN0YW5jZW9mIEFycmF5ID8gcXVlcnkgOiBbcXVlcnldKTtcblx0XHRsZXQgZmlsdGVyT3B0cyA9IHtcblx0XHRcdHR5cGU6IG9wdHMuX2ZpbHRlclR5cGUgfHwgJ2RhdGEnLFxuXHRcdFx0bXVsdGk6IHRydWVcblx0XHR9O1xuXG5cdFx0aWYgKGlkcykge1xuXHRcdFx0Ly8gYnkgaWQgYXJyYXlcblx0XHRcdGxldCBmaWx0ZXJSZWdFeHAgPSBuZXcgUmVnRXhwKCdeJyArIHRoaXMucGF0aCArICcoJyArIGlkcy5qb2luKCd8JykgKyAnKSQnKTtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoZmlsdGVyUmVnRXhwLCBmaWx0ZXJPcHRzKTtcblxuXHRcdH0gZWxzZSBpZiAoT2JqZWN0LmtleXMocXVlcnkpLmxlbmd0aCkge1xuXHRcdFx0Ly8gYnkgcXVlcnlcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdHJldHVybiBxdWVyeU1hdGNoKHF1ZXJ5LCB2YWwpO1xuXHRcdFx0fSwgZmlsdGVyT3B0cyk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIobnVsbCwgZmlsdGVyT3B0cyk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0b3RhbCkge1xuXHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHR9XG5cblx0XHQvLyBzb3J0XG5cdFx0aWYgKG9wdHMuc29ydCkge1xuXHRcdFx0ZGF0YS5zb3J0KChhLCBiKSA9PiB7XG5cdFx0XHRcdHJldHVybiBzb3J0Q29tcGFyZShvcHRzLnNvcnQsIGEsIGIpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKG9wdHMubGltaXQpIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCwgb3B0cy5za2lwICsgb3B0cy5saW1pdCk7XG5cdFx0fSBlbHNlIGlmIChvcHRzLnNraXApIHtcblx0XHRcdGRhdGEgPSBkYXRhLnNsaWNlKG9wdHMuc2tpcCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGE7XG5cdH1cblxuXG5cdGZpbmRPbmUocXVlcnksIG9wdHM/KSB7XG5cdFx0cXVlcnkgPSBxdWVyeSB8fCB7fTtcblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblxuXHRcdGxldCBkYXRhO1xuXHRcdGxldCBpZCA9IGlzT2JqZWN0KHF1ZXJ5KSA/IG51bGwgOiBxdWVyeTtcblx0XHRsZXQgcXVlcnlGaWVsZHMgPSBpc09iamVjdChxdWVyeSkgPyBPYmplY3Qua2V5cyhxdWVyeSkgOiBbXTtcblx0XHRsZXQgcXVpY2tUYXJnZXQgPSBmYWxzZTtcblx0XHRsZXQgbmVlZHNTb3J0ID0gISFvcHRzLnNvcnQ7XG5cdFx0bGV0IGZpbHRlck9wdHMgPSB7XG5cdFx0XHR0eXBlOiBvcHRzLl9maWx0ZXJUeXBlIHx8ICdkYXRhJyxcblx0XHRcdG11bHRpOiBmYWxzZVxuXHRcdH07XG5cblx0XHRpZiAocXVlcnlGaWVsZHMubGVuZ3RoICYmIHF1ZXJ5RmllbGRzLmluY2x1ZGVzKHRoaXMucHJpbWFyeUtleSkpIHtcblx0XHRcdGlkID0gcXVlcnlbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHRcdHF1aWNrVGFyZ2V0ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoaWQpIHtcblx0XHRcdC8vIGJ5IGlkXG5cdFx0XHRkYXRhID0gdGhpcy5zdG9yYWdlLmdldEl0ZW0odGhpcy5wYXRoICsgaWQpO1xuXHRcdFx0ZGF0YSA9IGRhdGEgPyBKU09OLnBhcnNlKGRhdGEsIGRhdGVSZXZpdmVyKS5kYXRhIDogbnVsbDtcblxuXHRcdFx0aWYgKGRhdGEgJiYgcXVpY2tUYXJnZXQgJiYgIXF1ZXJ5TWF0Y2gocXVlcnksIGRhdGEpKSB7XG5cdFx0XHRcdHJldHVybiBudWxsO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSBpZiAocXVlcnlGaWVsZHMubGVuZ3RoKSB7XG5cdFx0XHQvLyBieSBxdWVyeVxuXHRcdFx0aWYgKG5lZWRzU29ydCkge1xuXHRcdFx0XHRkYXRhID0gdGhpcy5maW5kKHF1ZXJ5LCBvcHRzKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLl9maWx0ZXIoKGtleSwgdmFsKSA9PiB7XG5cdFx0XHRcdFx0cmV0dXJuIHF1ZXJ5TWF0Y2gocXVlcnksIHZhbCk7XG5cdFx0XHRcdH0sIGZpbHRlck9wdHMpO1xuXG5cdFx0XHRcdGlmIChBcnJheS5pc0FycmF5KGRhdGEpKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEubWFwKGEgPT4gYS5kYXRhKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmIChkYXRhKSB7XG5cdFx0XHRcdFx0ZGF0YSA9IGRhdGEuZGF0YTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRpZiAobmVlZHNTb3J0KSB7XG5cdFx0XHRcdGRhdGEgPSB0aGlzLmZpbmQocXVlcnksIG9wdHMpO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGF0YSA9IHRoaXMuX2ZpbHRlcihudWxsLCBmaWx0ZXJPcHRzKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0XG5cdFx0aWYgKCFpZCAmJiBuZWVkc1NvcnQgJiYgZGF0YSkge1xuXHRcdFx0ZGF0YSA9IGRhdGFbMF0uZGF0YSB8fCBudWxsO1xuXHRcdH1cblxuXHRcdGlmIChkYXRhICYmIGZpbHRlck9wdHMudHlwZSA9PT0gJ2lkJykge1xuXHRcdFx0ZGF0YSA9IHRoaXMucGF0aCArIGRhdGFbdGhpcy5wcmltYXJ5S2V5XTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGF0YTtcblx0fVxuXG5cblx0cmVtb3ZlKHF1ZXJ5LCBvcHRzPykge1xuXHRcdGlmICghcXVlcnkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcigncmVtb3ZlIG5lZWRzIGEgcXVlcnknKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyB0cnVlIDogb3B0cy5tdWx0aTtcblxuXHRcdGxldCBmaW5kTWV0aG9kID0gb3B0cy5tdWx0aSA/ICdmaW5kJyA6ICdmaW5kT25lJztcblx0XHRsZXQgaWRzID0gbnVsbDtcblx0XHRpZiAoZmluZE1ldGhvZCA9PT0gJ2ZpbmQnKSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9LCB0cnVlKTtcblx0XHR9XG5cdFx0ZWxzZSB7XG5cdFx0XHRpZHMgPSB0aGlzW2ZpbmRNZXRob2RdKHF1ZXJ5LCB7XG5cdFx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0XHR9KTtcblx0XHR9XG5cdFx0bGV0IGNhY2hlYWJsZSA9IHRoaXMuY2FjaGVhYmxlO1xuXG5cdFx0aWYgKChvcHRzLm11bHRpICYmICFpZHMubGVuZ3RoKSB8fCAoIW9wdHMubXVsdGkgJiYgIWlkcykpIHtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdGlmICghb3B0cy5tdWx0aSkge1xuXHRcdFx0aWRzID0gW2lkc107XG5cdFx0fVxuXG5cdFx0Zm9yIChsZXQgaWQgb2YgaWRzKSB7XG5cdFx0XHRpZiAoY2FjaGVhYmxlKSB7XG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmNhY2hlW2lkXTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnJlbW92ZUl0ZW0oaWQpO1xuXHRcdH1cblxuXHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHR9XG5cblxuXHR1cGRhdGUocXVlcnksIHZhbHVlcywgb3B0cz8pIHtcblx0XHRpZiAoIXF1ZXJ5KSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhIHF1ZXJ5Jyk7XG5cdFx0fVxuXHRcdGlmICghdmFsdWVzIHx8ICFpc09iamVjdCh2YWx1ZXMpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ3VwZGF0ZSBuZWVkcyBhbiBvYmplY3QnKTtcblx0XHR9XG5cblx0XHRvcHRzID0gb3B0cyB8fCB7fTtcblx0XHRvcHRzLm11bHRpID0gKHR5cGVvZiBvcHRzLm11bHRpID09PSAndW5kZWZpbmVkJykgPyBmYWxzZSA6IG9wdHMubXVsdGk7XG5cblx0XHRsZXQgZmluZE1ldGhvZCA9IG9wdHMubXVsdGkgPyAnZmluZCcgOiAnZmluZE9uZSc7XG5cdFx0bGV0IGlkcyA9IHRoaXNbZmluZE1ldGhvZF0ocXVlcnksIHtcblx0XHRcdF9maWx0ZXJUeXBlOiAnaWQnXG5cdFx0fSk7XG5cdFx0bGV0IHBrID0gdGhpcy5wcmltYXJ5S2V5O1xuXHRcdGxldCBjYWNoZWFibGUgPSB0aGlzLmNhY2hlYWJsZTtcblxuXHRcdGlmICgob3B0cy5tdWx0aSAmJiAhaWRzLmxlbmd0aCkgfHwgKCFvcHRzLm11bHRpICYmICFpZHMpKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRpZiAoIW9wdHMubXVsdGkpIHtcblx0XHRcdGxldCBpZCA9IGlkcztcblx0XHRcdGxldCByb3cgPSBjYWNoZWFibGUgPyB0aGlzLmNhY2hlW2lkXSA6IEpTT04ucGFyc2UodGhpcy5zdG9yYWdlLmdldEl0ZW0oaWQpLCBkYXRlUmV2aXZlcik7XG5cdFx0XHRsZXQgaXNJZFVwZGF0ZWQgPSB2YWx1ZXNbcGtdICYmIHZhbHVlc1twa10gIT09IHJvdy5kYXRhW3BrXTtcblx0XHRcdGxldCBuZXdJZCA9IGlzSWRVcGRhdGVkID8gdGhpcy5wYXRoICsgdmFsdWVzW3BrXSA6IGlkO1xuXG5cdFx0XHQvLyBjaGVjayBleGlzdFxuXHRcdFx0aWYgKGlzSWRVcGRhdGVkICYmIHRoaXMuZmluZE9uZSh2YWx1ZXNbcGtdKSkge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ0R1cGxpY2F0ZSB2YWx1ZSBcXCcnICsgdmFsdWVzW3BrXSArICdcXCcgZm9yIHVuaXF1ZSBmaWVsZCBcXCcnICsgcGsgKyAnXFwnJyk7XG5cdFx0XHR9XG5cblx0XHRcdGxldCBkYXRhID0gT2JqZWN0LmFzc2lnbih7fSwgcm93LmRhdGEsIHZhbHVlcyk7XG5cblx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0dGhpcy5jYWNoZVtuZXdJZF0gPSB7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9O1xuXHRcdFx0XHRpZiAoaXNJZFVwZGF0ZWQpIHtcblx0XHRcdFx0XHRkZWxldGUgdGhpcy5jYWNoZVtpZF07XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy5zdG9yYWdlLnNldEl0ZW0obmV3SWQsIEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0b2ZmbGluZURhdGVFeHBpcmVzOiByb3cub2ZmbGluZURhdGVFeHBpcmVzLFxuXHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHR9KSk7XG5cblx0XHRcdGlmIChpc0lkVXBkYXRlZCkge1xuXHRcdFx0XHR0aGlzLnN0b3JhZ2UucmVtb3ZlSXRlbShpZCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBkYXRhO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGRlbGV0ZSB2YWx1ZXNbcGtdO1xuXG5cdFx0XHRpZiAoIU9iamVjdC5rZXlzKHZhbHVlcykubGVuZ3RoKSB7XG5cdFx0XHRcdHJldHVybiAwO1xuXHRcdFx0fVxuXG5cdFx0XHRmb3IgKGxldCBpZCBvZiBpZHMpIHtcblx0XHRcdFx0bGV0IHJvdyA9IGNhY2hlYWJsZSA/IHRoaXMuY2FjaGVbaWRdIDogSlNPTi5wYXJzZSh0aGlzLnN0b3JhZ2UuZ2V0SXRlbShpZCksIGRhdGVSZXZpdmVyKTtcblxuXHRcdFx0XHRsZXQgZGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHJvdy5kYXRhLCB2YWx1ZXMpO1xuXG5cdFx0XHRcdGlmIChjYWNoZWFibGUpIHtcblx0XHRcdFx0XHR0aGlzLmNhY2hlW2lkXSA9IHtcblx0XHRcdFx0XHRcdG9mZmxpbmVEYXRlOiByb3cub2ZmbGluZURhdGUsXG5cdFx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0XHRkYXRhOiBkYXRhXG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHRoaXMuc3RvcmFnZS5zZXRJdGVtKGlkLCBKU09OLnN0cmluZ2lmeSh7XG5cdFx0XHRcdFx0b2ZmbGluZURhdGU6IHJvdy5vZmZsaW5lRGF0ZSxcblx0XHRcdFx0XHRvZmZsaW5lRGF0ZUV4cGlyZXM6IHJvdy5vZmZsaW5lRGF0ZUV4cGlyZXMsXG5cdFx0XHRcdFx0ZGF0YTogZGF0YVxuXHRcdFx0XHR9KSk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBpZHMubGVuZ3RoO1xuXHRcdH1cblx0fVxuXG5cdGRyb3AoKSB7XG5cdFx0dGhpcy5yZW1vdmUoe30pO1xuXHRcdHJldHVybiB0cnVlO1xuXHR9XG59XG5cbmNsYXNzIElEIHtcblx0Y29uc3RydWN0b3IoKSB7XG5cdH1cblxuXHR0b1N0cmluZygpIHtcblx0XHRyZXR1cm4gKG5ldyBEYXRlKCkuZ2V0VGltZSgpIC8gMTAwMCkudG9TdHJpbmcoMTYpLnN1YnN0cigtNCkgKyBNYXRoLnJhbmRvbSgpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMiwgMTIpO1xuXHR9XG59XG5cbmNsYXNzIE1vY2tTdG9yYWdlIHtcblx0bGVuZ3RoID0gMDtcblxuXHRjb25zdHJ1Y3RvciAoKSB7XG5cdFx0dGhpcy5sZW5ndGggPSAwO1xuXHR9XG5cblx0a2V5KCkge31cblx0c2V0SXRlbSgpIHt9XG5cdGdldEl0ZW0oKSB7fVxuXHRyZW1vdmVJdGVtKCkge31cbn1cblxuY29uc3QgaXNTdXBwb3J0ZWQgPSAoc3RvcmFnZSkgPT4ge1xuXHRpZiAoIXN0b3JhZ2UgfHwgIShzdG9yYWdlIGluc3RhbmNlb2YgT2JqZWN0KSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHRyeSB7XG5cdFx0c3RvcmFnZS5zZXRJdGVtKCdfc3VwcG9ydGVkJywgJzEnKTtcblx0XHRzdG9yYWdlLnJlbW92ZUl0ZW0oJ19zdXBwb3J0ZWQnKTtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZSkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufTtcblxuY29uc3QgaXNPYmplY3QgPSAob2JqZWN0KSA9PiB7XG5cdHJldHVybiBvYmplY3QgaW5zdGFuY2VvZiBPYmplY3QgJiYgb2JqZWN0LmNvbnN0cnVjdG9yLm5hbWUgPT09ICdPYmplY3QnO1xufTtcblxuY29uc3QgcXVlcnlNYXRjaCA9IChxdWVyeSwgdGFyZ2V0KSA9PiB7XG5cdGlmICghcXVlcnkgfHwgIU9iamVjdC5rZXlzKHF1ZXJ5KS5sZW5ndGgpIHtcblx0XHRyZXR1cm4gdHJ1ZTtcblx0fVxuXG5cdGZvciAobGV0IGZpZWxkIG9mIE9iamVjdC5rZXlzKHF1ZXJ5KSkge1xuXHRcdGxldCB2YWwgPSBxdWVyeVtmaWVsZF07XG5cdFx0bGV0IHRhciA9IHRhcmdldFtmaWVsZF07XG5cblx0XHRpZiAoIXRhcikge1xuXHRcdFx0ZmllbGQuc3BsaXQoJy4nKS5mb3JFYWNoKHBhdGggPT4ge1xuXHRcdFx0XHRpZiAoIXRhcikge1xuXHRcdFx0XHRcdHRhciA9IHRhcmdldFtwYXRoXTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIHtcblx0XHRcdFx0XHR0YXIgPSB0YXJbcGF0aF07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHtcblx0XHRcdGlmICghdmFsLnRlc3QodGFyKSkge1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmIChpc09iamVjdCh2YWwpKSB7XG5cdFx0XHRmb3IgKGxldCBvcCBvZiBPYmplY3Qua2V5cyh2YWwpKSB7XG5cdFx0XHRcdGlmIChPcGVyYXRvci5fY2hlY2tFeGlzdChvcCkgJiYgIU9wZXJhdG9yW29wXSh2YWxbb3BdLCB0YXIpKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSBlbHNlIGlmICh2YWwgIT09IHRhcikge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiB0cnVlO1xufTtcblxuY29uc3Qgc29ydENvbXBhcmUgPSAoc29ydCwgYSwgYiwgaT8sIGZpZWxkcz8pID0+IHtcblx0aSA9IGkgfHwgMDtcblx0ZmllbGRzID0gZmllbGRzIHx8IE9iamVjdC5rZXlzKHNvcnQpO1xuXG5cdGxldCBmaWVsZCA9IGZpZWxkc1tpXTtcblxuXHRpZiAoIWZpZWxkKSB7XG5cdFx0cmV0dXJuIDA7XG5cdH1cblxuXHRpZiAoYVtmaWVsZF0gPT09IGJbZmllbGRdKSB7XG5cdFx0aSsrO1xuXHRcdHJldHVybiBzb3J0Q29tcGFyZShzb3J0LCBhLCBiLCBpLCBmaWVsZHMpO1xuXHR9XG5cblx0aWYgKHNvcnRbZmllbGRdID09PSAxKSB7XG5cdFx0cmV0dXJuIGFbZmllbGRdIC0gYltmaWVsZF07XG5cdH1cblxuXHRpZiAoc29ydFtmaWVsZF0gPT09IC0xKSB7XG5cdFx0cmV0dXJuIGJbZmllbGRdIC0gYVtmaWVsZF07XG5cdH1cbn07XG5cbi8qXG5cdFF1ZXJ5IFNlbGVjdG9yc1xuXG5cdCRlcVx0XHRNYXRjaGVzIHZhbHMgdGhhdCBhcmUgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkZ3RcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGdyZWF0ZXIgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRndGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkaW5cdFx0TWF0Y2hlcyBhbnkgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuXHQkbHRcdFx0TWF0Y2hlcyB2YWxzIHRoYXQgYXJlIGxlc3MgdGhhbiBhIHNwZWNpZmllZCB2YWwuXG5cdCRsdGVcdE1hdGNoZXMgdmFscyB0aGF0IGFyZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmVcdFx0TWF0Y2hlcyBhbGwgdmFscyB0aGF0IGFyZSBub3QgZXF1YWwgdG8gYSBzcGVjaWZpZWQgdmFsLlxuXHQkbmluXHRNYXRjaGVzIG5vbmUgb2YgdGhlIHZhbHMgc3BlY2lmaWVkIGluIGFuIGFycmF5LlxuKi9cblxuY29uc3Qgb3BzID0gWyckZXEnLCAnJGd0JywgJyRndGUnLCAnJGluJywgJyRsdCcsICckbHRlJywgJyRuZScsICckbmluJ107XG5cbmNvbnN0IGlzTm90TnVtYmVyID0gKHZhbCkgPT4ge1xuXHRyZXR1cm4gdHlwZW9mIHZhbCAhPT0gJ251bWJlcic7XG59O1xuXG5jbGFzcyBPcGVyYXRvciB7XG5cdHN0YXRpYyAkZXEodmFsLCB0YXIpIHtcblx0XHRyZXR1cm4gdGFyID09PSB2YWw7XG5cdH1cblxuXHRzdGF0aWMgJGd0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA+IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkZ3RlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGd0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPj0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRpbih2YWwsIHRhcikge1xuXHRcdGlmICghKHZhbCBpbnN0YW5jZW9mIEFycmF5KSkge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdcXCckaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gdmFsLmluY2x1ZGVzKHRhcik7XG5cdH1cblxuXHRzdGF0aWMgJGx0KHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0XFwnIHZhbHVlIG11c3QgYmUgYSBudW1iZXInKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRhciA8IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbHRlKHZhbCwgdGFyKSB7XG5cdFx0aWYgKGlzTm90TnVtYmVyKHZhbCkpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcignXFwnJGx0ZVxcJyB2YWx1ZSBtdXN0IGJlIGEgbnVtYmVyJyk7XG5cdFx0fVxuXHRcdHJldHVybiB0YXIgPD0gdmFsO1xuXHR9XG5cblx0c3RhdGljICRuZSh2YWwsIHRhcikge1xuXHRcdHJldHVybiB0YXIgIT09IHZhbDtcblx0fVxuXG5cdHN0YXRpYyAkbmluKHZhbCwgdGFyKSB7XG5cdFx0aWYgKCEodmFsIGluc3RhbmNlb2YgQXJyYXkpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1xcJyRuaW5cXCcgdmFsdWUgbXVzdCBiZSBhbiBhcnJheScpO1xuXHRcdH1cblx0XHRyZXR1cm4gIXZhbC5pbmNsdWRlcyh0YXIpO1xuXHR9XG5cblx0c3RhdGljIF9jaGVja0V4aXN0KG9wKSB7XG5cdFx0aWYgKG9wcy5pbmNsdWRlcyhvcCkpIHtcblx0XHRcdHJldHVybiB0cnVlO1xuXHRcdH1cblx0XHR0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gb3BlcmF0b3I6IFxcJycgKyBvcCArICdcXCcnKTtcblx0fVxufSJdfQ==