networkwm-js 0.1.0 → 0.1.2-alpha.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 (73) hide show
  1. package/README.MD +3 -2
  2. package/dist/bytemanip.d.ts.map +1 -1
  3. package/dist/bytemanip.js +4 -0
  4. package/dist/cli/decrypt-mp3.d.ts +3 -0
  5. package/dist/cli/decrypt-mp3.d.ts.map +1 -0
  6. package/dist/cli/decrypt-mp3.js +59 -0
  7. package/dist/cli/decrypt-oma.d.ts +2 -0
  8. package/dist/cli/decrypt-oma.d.ts.map +1 -0
  9. package/dist/cli/decrypt-oma.js +25 -0
  10. package/dist/cli/sign-device.d.ts +2 -0
  11. package/dist/cli/sign-device.d.ts.map +1 -0
  12. package/dist/cli/sign-device.js +30 -0
  13. package/dist/cli/table-file-info.d.ts +2 -0
  14. package/dist/cli/table-file-info.d.ts.map +1 -0
  15. package/dist/cli/table-file-info.js +46 -0
  16. package/dist/cli/tagged-oma-info.d.ts +2 -0
  17. package/dist/cli/tagged-oma-info.d.ts.map +1 -0
  18. package/dist/cli/tagged-oma-info.js +192 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +50 -0
  22. package/dist/codecs.d.ts +13 -0
  23. package/dist/codecs.d.ts.map +1 -0
  24. package/dist/codecs.js +40 -0
  25. package/dist/database-abstraction.d.ts +11 -4
  26. package/dist/database-abstraction.d.ts.map +1 -1
  27. package/dist/database-abstraction.js +99 -32
  28. package/dist/databases.d.ts +10 -1
  29. package/dist/databases.d.ts.map +1 -1
  30. package/dist/databases.js +2 -1
  31. package/dist/derive-mp3-key.d.ts +12 -0
  32. package/dist/derive-mp3-key.d.ts.map +1 -0
  33. package/dist/derive-mp3-key.js +109 -0
  34. package/dist/devices.d.ts +9 -2
  35. package/dist/devices.d.ts.map +1 -1
  36. package/dist/devices.js +70 -2
  37. package/dist/encryption.d.ts +2 -2
  38. package/dist/encryption.d.ts.map +1 -1
  39. package/dist/encryption.js +25 -12
  40. package/dist/filesystem/usb-mass-storage-webusb-filesystem.d.ts +2 -0
  41. package/dist/filesystem/usb-mass-storage-webusb-filesystem.d.ts.map +1 -1
  42. package/dist/filesystem/usb-mass-storage-webusb-filesystem.js +8 -1
  43. package/dist/helpers.d.ts +6 -2
  44. package/dist/helpers.d.ts.map +1 -1
  45. package/dist/helpers.js +9 -8
  46. package/dist/id3.d.ts +17 -2
  47. package/dist/id3.d.ts.map +1 -1
  48. package/dist/id3.js +51 -3
  49. package/dist/index.d.ts +1 -0
  50. package/dist/index.d.ts.map +1 -1
  51. package/dist/index.js +1 -0
  52. package/dist/init-data.d.ts +25 -14
  53. package/dist/init-data.d.ts.map +1 -1
  54. package/dist/init-data.js +23 -15
  55. package/dist/initialization.d.ts +3 -2
  56. package/dist/initialization.d.ts.map +1 -1
  57. package/dist/initialization.js +14 -4
  58. package/dist/mp3.d.ts +11 -0
  59. package/dist/mp3.d.ts.map +1 -0
  60. package/dist/mp3.js +160 -0
  61. package/dist/tables.d.ts +1 -0
  62. package/dist/tables.d.ts.map +1 -1
  63. package/dist/tables.js +3 -0
  64. package/dist/tagged-oma.d.ts +3 -2
  65. package/dist/tagged-oma.d.ts.map +1 -1
  66. package/dist/tagged-oma.js +72 -33
  67. package/dist/utils.d.ts +6 -2
  68. package/dist/utils.d.ts.map +1 -1
  69. package/dist/utils.js +35 -12
  70. package/package.json +8 -4
  71. package/dist/functions.d.ts +0 -12
  72. package/dist/functions.d.ts.map +0 -1
  73. package/dist/functions.js +0 -73
package/dist/helpers.d.ts CHANGED
@@ -1,9 +1,13 @@
1
1
  import { WebUSBDevice } from "usb";
2
2
  import { UMSCNWJSFilesystem } from "./filesystem";
3
+ import { DeviceDefinition } from "./devices";
3
4
  export declare function resolvePathFromGlobalIndex(globalTrackIndex: number): string;
4
- export declare function createNWJSFS(webUsbDevice: WebUSBDevice, bypassCoherencyChecks: boolean): Promise<UMSCNWJSFilesystem>;
5
+ export declare function createNWJSFS(device: {
6
+ dev: WebUSBDevice;
7
+ definition: DeviceDefinition;
8
+ }): Promise<UMSCNWJSFilesystem>;
5
9
  export declare function openNewDeviceNode(): Promise<{
6
10
  dev: WebUSBDevice;
7
- name: string;
11
+ definition: DeviceDefinition;
8
12
  } | null>;
9
13
  //# sourceMappingURL=helpers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,KAAK,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAKlD,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,UAElE;AAED,wBAAsB,YAAY,CAAC,YAAY,EAAE,YAAY,EAAE,qBAAqB,EAAE,OAAO,+BAO5F;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAAC,CA2B7F"}
1
+ {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAkB,MAAM,KAAK,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAElD,OAAO,EAAE,gBAAgB,EAAa,MAAM,WAAW,CAAC;AAGxD,wBAAgB,0BAA0B,CAAC,gBAAgB,EAAE,MAAM,UAElE;AAED,wBAAsB,YAAY,CAAC,MAAM,EAAE;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,+BAO7F;AAED,wBAAsB,iBAAiB,IAAI,OAAO,CAAC;IAAE,GAAG,EAAE,YAAY,CAAC;IAAC,UAAU,EAAE,gBAAgB,CAAA;CAAE,GAAG,IAAI,CAAC,CA2B7G"}
package/dist/helpers.js CHANGED
@@ -7,27 +7,28 @@ const utils_1 = require("./utils");
7
7
  const devices_1 = require("./devices");
8
8
  const initialization_1 = require("./initialization");
9
9
  function resolvePathFromGlobalIndex(globalTrackIndex) {
10
- return (0, utils_1.join)('OMGAUDIO', '10F00', '1000' + globalTrackIndex.toString(16).padStart(4, '0').toUpperCase() + '.OMA');
10
+ return (0, utils_1.join)('OMGAUDIO', `10F${(globalTrackIndex >> 8).toString(16).padStart(2, '0')}`, '1000' + globalTrackIndex.toString(16).padStart(4, '0').toUpperCase() + '.OMA');
11
11
  }
12
12
  exports.resolvePathFromGlobalIndex = resolvePathFromGlobalIndex;
13
- async function createNWJSFS(webUsbDevice, bypassCoherencyChecks) {
13
+ async function createNWJSFS(device) {
14
+ var _a, _b;
14
15
  // Connect into the HiMD codebase
15
- const fs = new filesystem_1.UMSCNWJSFilesystem(webUsbDevice);
16
+ const fs = new filesystem_1.UMSCNWJSFilesystem(device.dev);
16
17
  await fs.init();
17
- await (0, initialization_1.initializeIfNeeded)(fs);
18
+ await (0, initialization_1.initializeIfNeeded)(fs, (_b = (_a = device.definition.databaseParameters) === null || _a === void 0 ? void 0 : _a.initLayers) !== null && _b !== void 0 ? _b : []);
18
19
  return fs;
19
20
  }
20
21
  exports.createNWJSFS = createNWJSFS;
21
22
  async function openNewDeviceNode() {
22
- let legacyDevice = undefined, devName = null;
23
+ let legacyDevice, definition = null;
23
24
  for (let dev of devices_1.DeviceIds) {
24
25
  legacyDevice = (0, usb_1.findByIds)(dev.vendorId, dev.productId);
25
26
  if (legacyDevice) {
26
- devName = dev.name;
27
+ definition = dev;
27
28
  break;
28
29
  }
29
30
  }
30
- if (!legacyDevice) {
31
+ if (!legacyDevice || !definition) {
31
32
  return null;
32
33
  }
33
34
  legacyDevice.open();
@@ -42,6 +43,6 @@ async function openNewDeviceNode() {
42
43
  }
43
44
  const webUsbDevice = (await usb_1.WebUSBDevice.createInstance(legacyDevice));
44
45
  await webUsbDevice.open();
45
- return { dev: webUsbDevice, name: devName };
46
+ return { dev: webUsbDevice, definition };
46
47
  }
47
48
  exports.openNewDeviceNode = openNewDeviceNode;
package/dist/id3.d.ts CHANGED
@@ -1,3 +1,4 @@
1
+ import { InboundTrackMetadata } from './databases';
1
2
  export interface ID3Tag {
2
3
  id: string;
3
4
  flags: number;
@@ -12,7 +13,21 @@ export interface ID3Tags {
12
13
  flags: number;
13
14
  }
14
15
  export declare function readSynchsafeInt32(data: DataView, offset: number): [number, number];
15
- export declare function parse(buffer: Uint8Array): ID3Tags;
16
- export declare function serialize(tags: ID3Tags): Uint8Array;
16
+ export declare function readInitialID3Header(buffer: Uint8Array): {
17
+ major: number;
18
+ minor: number;
19
+ flags: number;
20
+ size: number;
21
+ };
22
+ export declare function parse(buffer: Uint8Array): ID3Tags & {
23
+ size: number;
24
+ };
25
+ export declare function serialize(tags: ID3Tags, constSize?: number): Uint8Array;
17
26
  export declare function encodeUTF16BEStringEA3(source: string, includeType?: boolean): Uint8Array;
27
+ export declare function encodeSonyWeirdString(type: string, data: string): Uint8Array;
28
+ export declare function createCommonID3Tags(titleInfo: InboundTrackMetadata): {
29
+ id: string;
30
+ contents: Uint8Array;
31
+ flags: number;
32
+ }[];
18
33
  //# sourceMappingURL=id3.d.ts.map
package/dist/id3.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"id3.d.ts","sourceRoot":"","sources":["../src/id3.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACpB,OAAO,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYnF;AAKD,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CA+CjD;AAWD,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,UAAU,CAuCnD;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,UAAO,cAgCxE"}
1
+ {"version":3,"file":"id3.d.ts","sourceRoot":"","sources":["../src/id3.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAiB,MAAM,aAAa,CAAC;AAGlE,MAAM,WAAW,MAAM;IACnB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,UAAU,CAAC;CACxB;AAED,MAAM,WAAW,OAAO;IACpB,OAAO,EAAE;QACL,KAAK,EAAE,MAAM,CAAC;QACd,KAAK,EAAE,MAAM,CAAC;KACjB,CAAC;IACF,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAYnF;AAKD,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAiBtH;AAED,wBAAgB,KAAK,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAgDpE;AAWD,wBAAgB,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CA8CvE;AAED,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,EAAE,WAAW,UAAO,cAgCxE;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,cAM/D;AAED,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,oBAAoB;;;;IAYlE"}
package/dist/id3.js CHANGED
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.encodeUTF16BEStringEA3 = exports.serialize = exports.parse = exports.readSynchsafeInt32 = void 0;
3
+ exports.createCommonID3Tags = exports.encodeSonyWeirdString = exports.encodeUTF16BEStringEA3 = exports.serialize = exports.parse = exports.readInitialID3Header = exports.readSynchsafeInt32 = void 0;
4
4
  const bytemanip_1 = require("./bytemanip");
5
+ const utils_1 = require("./utils");
5
6
  function readSynchsafeInt32(data, offset) {
6
7
  let value = 0;
7
8
  let byte;
@@ -19,6 +20,23 @@ exports.readSynchsafeInt32 = readSynchsafeInt32;
19
20
  ;
20
21
  const textDecoder = new TextDecoder();
21
22
  const textEncoder = new TextEncoder();
23
+ function readInitialID3Header(buffer) {
24
+ const data = new DataView(buffer.buffer);
25
+ let offset = 0;
26
+ // Read header
27
+ let bytes;
28
+ [bytes, offset] = (0, bytemanip_1.readBytes)(data, offset, 3);
29
+ if (String.fromCharCode(...bytes) !== 'ea3') {
30
+ throw new Error("Not an ID3v2 tag");
31
+ }
32
+ let major, minor, flags, size;
33
+ [major, offset] = (0, bytemanip_1.readUint8)(data, offset);
34
+ [minor, offset] = (0, bytemanip_1.readUint8)(data, offset);
35
+ [flags, offset] = (0, bytemanip_1.readUint8)(data, offset);
36
+ [size, offset] = readSynchsafeInt32(data, offset);
37
+ return { major, minor, size, flags };
38
+ }
39
+ exports.readInitialID3Header = readInitialID3Header;
22
40
  function parse(buffer) {
23
41
  const data = new DataView(buffer.buffer);
24
42
  let offset = 0;
@@ -35,7 +53,7 @@ function parse(buffer) {
35
53
  [size, offset] = readSynchsafeInt32(data, offset);
36
54
  const tags = [];
37
55
  // Parse frames
38
- while ((offset + 10) < size + 10) {
56
+ while (offset < size) {
39
57
  let frameId, frameSize, frameFlags, frameContents;
40
58
  [frameId, offset] = (0, bytemanip_1.readBytes)(data, offset, 4);
41
59
  [frameSize, offset] = (0, bytemanip_1.readUint32)(data, offset);
@@ -58,6 +76,7 @@ function parse(buffer) {
58
76
  },
59
77
  tags,
60
78
  flags,
79
+ size,
61
80
  };
62
81
  }
63
82
  exports.parse = parse;
@@ -71,7 +90,7 @@ function writeSynchsafeInt32(value) {
71
90
  return array;
72
91
  }
73
92
  ;
74
- function serialize(tags) {
93
+ function serialize(tags, constSize) {
75
94
  const header = new Uint8Array(10);
76
95
  header.set(textEncoder.encode('ea3'));
77
96
  header.set((0, bytemanip_1.writeUint8)(tags.version.major), 3);
@@ -90,6 +109,12 @@ function serialize(tags) {
90
109
  frames.push(frame);
91
110
  size += frame.length;
92
111
  }
112
+ if (constSize !== undefined) {
113
+ if (size > constSize) {
114
+ throw new Error("Too much data to encode!");
115
+ }
116
+ size = constSize;
117
+ }
93
118
  if ((size + 10) % 16 !== 0) {
94
119
  const diff = 16 - ((size + 10) % 16);
95
120
  size += diff;
@@ -135,3 +160,26 @@ function encodeUTF16BEStringEA3(source, includeType = true) {
135
160
  return new Uint8Array(rawArr);
136
161
  }
137
162
  exports.encodeUTF16BEStringEA3 = encodeUTF16BEStringEA3;
163
+ function encodeSonyWeirdString(type, data) {
164
+ return (0, utils_1.concatUint8Arrays)([
165
+ encodeUTF16BEStringEA3(type),
166
+ new Uint8Array([0, 0]),
167
+ encodeUTF16BEStringEA3(data, false),
168
+ ]);
169
+ }
170
+ exports.encodeSonyWeirdString = encodeSonyWeirdString;
171
+ function createCommonID3Tags(titleInfo) {
172
+ var _a;
173
+ return [
174
+ { id: "TIT2", contents: encodeUTF16BEStringEA3(titleInfo.title), flags: 0 },
175
+ { id: "TPE1", contents: encodeUTF16BEStringEA3(titleInfo.artist), flags: 0 },
176
+ { id: "TALB", contents: encodeUTF16BEStringEA3(titleInfo.album), flags: 0 },
177
+ { id: "TALB", contents: encodeUTF16BEStringEA3(titleInfo.album), flags: 0 },
178
+ { id: "TCON", contents: encodeUTF16BEStringEA3(titleInfo.genre), flags: 0 },
179
+ { id: "TXXX", contents: encodeSonyWeirdString("OMG_TPE1S", titleInfo.artist), flags: 0 },
180
+ { id: "TXXX", contents: encodeSonyWeirdString("OMG_TRACK", ((_a = titleInfo.trackNumber) !== null && _a !== void 0 ? _a : 0) + ''), flags: 0 },
181
+ { id: "TXXX", contents: encodeSonyWeirdString("OMG_ALBMS", titleInfo.album), flags: 0 },
182
+ { id: "TXXX", contents: encodeSonyWeirdString("OMG_TIT2S", titleInfo.title), flags: 0 },
183
+ ];
184
+ }
185
+ exports.createCommonID3Tags = createCommonID3Tags;
package/dist/index.d.ts CHANGED
@@ -6,5 +6,6 @@ export * from './database-abstraction';
6
6
  export * from './sort';
7
7
  export * from './tagged-oma';
8
8
  export * from './devices';
9
+ export * from './derive-mp3-key';
9
10
  export { importKeys, initCrypto } from './encryption';
10
11
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,wBAAwB,CAAC;AACvC,cAAc,QAAQ,CAAC;AACvB,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC"}
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ __exportStar(require("./database-abstraction"), exports);
23
23
  __exportStar(require("./sort"), exports);
24
24
  __exportStar(require("./tagged-oma"), exports);
25
25
  __exportStar(require("./devices"), exports);
26
+ __exportStar(require("./derive-mp3-key"), exports);
26
27
  var encryption_1 = require("./encryption");
27
28
  Object.defineProperty(exports, "importKeys", { enumerable: true, get: function () { return encryption_1.importKeys; } });
28
29
  Object.defineProperty(exports, "initCrypto", { enumerable: true, get: function () { return encryption_1.initCrypto; } });
@@ -1,16 +1,27 @@
1
- export declare const INIT_FILE_CONTENTS: {
2
- "00010021.DAT": Uint8Array;
3
- "00GTRLST.DAT": Uint8Array;
4
- "01TREE01.DAT": Uint8Array;
5
- "01TREE02.DAT": Uint8Array;
6
- "01TREE03.DAT": Uint8Array;
7
- "01TREE04.DAT": Uint8Array;
8
- "02TREINF.DAT": Uint8Array;
9
- "03GINF01.DAT": Uint8Array;
10
- "03GINF02.DAT": Uint8Array;
11
- "03GINF03.DAT": Uint8Array;
12
- "03GINF04.DAT": Uint8Array;
13
- "04CNTINF.DAT": Uint8Array;
14
- "05CHINDC.DAT": Uint8Array;
1
+ export declare type InitializationLayer = {
2
+ [fileName: string]: Uint8Array;
3
+ };
4
+ export declare const LAYERS: {
5
+ root: {
6
+ "00010021.DAT": Uint8Array;
7
+ "00GTRLST.DAT": Uint8Array;
8
+ "01TREE01.DAT": Uint8Array;
9
+ "01TREE02.DAT": Uint8Array;
10
+ "01TREE03.DAT": Uint8Array;
11
+ "01TREE04.DAT": Uint8Array;
12
+ "02TREINF.DAT": Uint8Array;
13
+ "03GINF01.DAT": Uint8Array;
14
+ "03GINF02.DAT": Uint8Array;
15
+ "03GINF03.DAT": Uint8Array;
16
+ "03GINF04.DAT": Uint8Array;
17
+ "04CNTINF.DAT": Uint8Array;
18
+ "05CHINDC.DAT": Uint8Array;
19
+ };
20
+ stick_gtrlst: {
21
+ "00GTRLST.DAT": Uint8Array;
22
+ };
23
+ needs_cid: {
24
+ "05CIDLST.DAT": Uint8Array;
25
+ };
15
26
  };
16
27
  //# sourceMappingURL=init-data.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"init-data.d.ts","sourceRoot":"","sources":["../src/init-data.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;CAc9B,CAAC"}
1
+ {"version":3,"file":"init-data.d.ts","sourceRoot":"","sources":["../src/init-data.ts"],"names":[],"mappings":"AAAA,oBAAY,mBAAmB,GAAG;IAAE,CAAC,QAAQ,EAAE,MAAM,GAAG,UAAU,CAAA;CAAE,CAAC;AAErE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;CAsBlB,CAAC"}
package/dist/init-data.js CHANGED
@@ -1,18 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.INIT_FILE_CONTENTS = void 0;
4
- exports.INIT_FILE_CONTENTS = {
5
- "00010021.DAT": new Uint8Array([69, 75, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 33, 0, 0, 0, 0, 117, 235, 254, 220, 201, 194, 217, 63, 114, 198, 213, 235, 134, 217, 169, 116, 248, 95, 111, 33, 222, 191, 41, 17, 0, 0, 0, 12, 0, 0, 0, 32, 0, 0, 0, 52, 164, 146, 65, 95, 128, 0, 0, 0, 0, 0, 0, 0, 18, 163, 225, 187, 118, 162, 176, 132, 191, 20, 46, 122, 172, 121, 207, 233, 240, 92, 183, 254, 222, 60, 148, 1, 120, 74, 113, 141, 159, 247, 244, 177, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 0, 40, 49, 194, 220, 160, 49, 239, 65, 172, 233, 23, 239, 231, 77, 180, 222, 111, 60, 32, 165, 189, 50, 161, 207, 18, 140, 212, 9, 192, 107, 206, 87, 138, 206, 145, 95, 175, 136, 43, 92, 84]),
6
- "00GTRLST.DAT": new Uint8Array([71, 84, 76, 84, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 83, 89, 83, 66, 0, 0, 0, 48, 0, 0, 0, 112, 0, 0, 0, 0, 71, 84, 76, 66, 0, 0, 0, 160, 0, 0, 1, 80, 0, 0, 0, 0, 83, 89, 83, 66, 0, 1, 0, 80, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 84, 76, 66, 0, 4, 0, 80, 0, 0, 0, 4, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 69, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 65, 76, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 67, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
7
- "01TREE01.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
8
- "01TREE02.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
9
- "01TREE03.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
10
- "01TREE04.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
11
- "02TREINF.DAT": new Uint8Array([71, 84, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 84, 70, 66, 0, 0, 0, 32, 0, 0, 31, 0, 0, 0, 0, 0, 71, 84, 70, 66, 0, 4, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
12
- "03GINF01.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 0, 0]),
13
- "03GINF02.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
14
- "03GINF03.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
15
- "03GINF04.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
16
- "04CNTINF.DAT": new Uint8Array([67, 78, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 78, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 67, 78, 70, 66, 0, 0, 2, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
17
- "05CHINDC.DAT": new Uint8Array([67, 72, 73, 68, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 73, 68, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 67, 73, 68, 66, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0]),
3
+ exports.LAYERS = void 0;
4
+ exports.LAYERS = {
5
+ root: {
6
+ "00010021.DAT": new Uint8Array([69, 75, 66, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 33, 0, 0, 0, 0, 117, 235, 254, 220, 201, 194, 217, 63, 114, 198, 213, 235, 134, 217, 169, 116, 248, 95, 111, 33, 222, 191, 41, 17, 0, 0, 0, 12, 0, 0, 0, 32, 0, 0, 0, 52, 164, 146, 65, 95, 128, 0, 0, 0, 0, 0, 0, 0, 18, 163, 225, 187, 118, 162, 176, 132, 191, 20, 46, 122, 172, 121, 207, 233, 240, 92, 183, 254, 222, 60, 148, 1, 120, 74, 113, 141, 159, 247, 244, 177, 0, 0, 0, 5, 1, 0, 0, 0, 1, 0, 0, 40, 49, 194, 220, 160, 49, 239, 65, 172, 233, 23, 239, 231, 77, 180, 222, 111, 60, 32, 165, 189, 50, 161, 207, 18, 140, 212, 9, 192, 107, 206, 87, 138, 206, 145, 95, 175, 136, 43, 92, 84]),
7
+ "00GTRLST.DAT": new Uint8Array([71, 84, 76, 84, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 83, 89, 83, 66, 0, 0, 0, 48, 0, 0, 0, 112, 0, 0, 0, 0, 71, 84, 76, 66, 0, 0, 0, 160, 0, 0, 1, 80, 0, 0, 0, 0, 83, 89, 83, 66, 0, 1, 0, 80, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 84, 76, 66, 0, 4, 0, 80, 0, 0, 0, 4, 3, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 69, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 65, 76, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 67, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
8
+ "01TREE01.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
9
+ "01TREE02.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
10
+ "01TREE03.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
11
+ "01TREE04.DAT": new Uint8Array([84, 82, 69, 69, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 48, 0, 0, 0, 16, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 64, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 76, 66, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, 0, 0, 84, 80, 76, 66, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0]),
12
+ "02TREINF.DAT": new Uint8Array([71, 84, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 84, 70, 66, 0, 0, 0, 32, 0, 0, 31, 0, 0, 0, 0, 0, 71, 84, 70, 66, 0, 4, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 128, 84, 73, 84, 50, 0, 2, ...Array(7467).fill(0)]),
13
+ "03GINF01.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 3, 16, 0, 0, 0, 0, 0, 0, 0, 0]),
14
+ "03GINF02.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
15
+ "03GINF03.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
16
+ "03GINF04.DAT": new Uint8Array([71, 80, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 71, 80, 70, 66, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
17
+ "04CNTINF.DAT": new Uint8Array([67, 78, 73, 70, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 78, 70, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 67, 78, 70, 66, 0, 0, 2, 144, 0, 0, 0, 0, 0, 0, 0, 0]),
18
+ "05CHINDC.DAT": new Uint8Array([67, 72, 73, 68, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 73, 68, 66, 0, 0, 0, 32, 0, 0, 0, 16, 0, 0, 0, 0, 67, 73, 68, 66, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0]),
19
+ },
20
+ stick_gtrlst: {
21
+ "00GTRLST.DAT": new Uint8Array([71, 84, 76, 84, 1, 1, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 83, 89, 83, 66, 0, 0, 0, 48, 0, 0, 0, 112, 0, 0, 0, 0, 71, 84, 76, 66, 0, 0, 0, 160, 0, 0, 1, 240, 0, 0, 0, 0, 83, 89, 83, 66, 0, 1, 0, 80, 208, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 84, 76, 66, 0, 6, 0, 80, 0, 0, 0, 6, 4, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 84, 80, 69, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 84, 65, 76, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 84, 67, 79, 78, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 45, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 84, 80, 69, 49, 84, 65, 76, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, 82, 78, 79, 84, 84, 67, 67, 84, 84, 67, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]),
22
+ },
23
+ needs_cid: {
24
+ "05CIDLST.DAT": new Uint8Array([67, 73, 68, 76, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 67, 73, 76, 66, 0, 0, 0, 32, 0, 0, 39, 16, 0, 0, 0, 0, 67, 73, 76, 66, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0]),
25
+ },
18
26
  };
@@ -1,4 +1,5 @@
1
1
  import { HiMDFilesystem } from "himd-js";
2
- export declare function initializeNW(filesystem: HiMDFilesystem): Promise<void>;
3
- export declare function initializeIfNeeded(filesystem: HiMDFilesystem): Promise<void>;
2
+ import { LAYERS } from "./init-data";
3
+ export declare function initializeNW(filesystem: HiMDFilesystem, initLayers: (keyof typeof LAYERS)[]): Promise<void>;
4
+ export declare function initializeIfNeeded(filesystem: HiMDFilesystem, initLayers: (keyof typeof LAYERS)[]): Promise<void>;
4
5
  //# sourceMappingURL=initialization.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"initialization.d.ts","sourceRoot":"","sources":["../src/initialization.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzC,wBAAsB,YAAY,CAAC,UAAU,EAAE,cAAc,iBAgB5D;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,cAAc,iBAMlE"}
1
+ {"version":3,"file":"initialization.d.ts","sourceRoot":"","sources":["../src/initialization.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAuB,MAAM,EAAE,MAAM,aAAa,CAAC;AAY1D,wBAAsB,YAAY,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,iBAiBjG;AAED,wBAAsB,kBAAkB,CAAC,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,CAAC,MAAM,OAAO,MAAM,CAAC,EAAE,iBAMvG"}
@@ -4,11 +4,21 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.initializeIfNeeded = exports.initializeNW = void 0;
6
6
  const init_data_1 = require("./init-data");
7
- async function initializeNW(filesystem) {
7
+ function constructFinalContents(layerNames) {
8
+ const currentOverlayed = { ...init_data_1.LAYERS.root };
9
+ for (const layer of layerNames) {
10
+ for (const [name, value] of Object.entries(init_data_1.LAYERS[layer])) {
11
+ currentOverlayed[name] = value;
12
+ }
13
+ }
14
+ return currentOverlayed;
15
+ }
16
+ async function initializeNW(filesystem, initLayers) {
8
17
  // mkdir the root dir
9
18
  await filesystem.mkdir("/OMGAUDIO");
10
19
  console.log("Initializing the walkman...");
11
- for (let [name, contents] of Object.entries(init_data_1.INIT_FILE_CONTENTS)) {
20
+ const initData = constructFinalContents(initLayers);
21
+ for (let [name, contents] of Object.entries(initData)) {
12
22
  console.log(`Initializing ${name}...`);
13
23
  const file = await filesystem.open(`/OMGAUDIO/${name}`, 'rw');
14
24
  await file.write(contents);
@@ -22,11 +32,11 @@ async function initializeNW(filesystem) {
22
32
  console.log(`Initializing complete!`);
23
33
  }
24
34
  exports.initializeNW = initializeNW;
25
- async function initializeIfNeeded(filesystem) {
35
+ async function initializeIfNeeded(filesystem, initLayers) {
26
36
  const rootContents = await filesystem.list("/");
27
37
  if (!rootContents.find(e => e.type === 'directory' && e.name === '/OMGAUDIO')) {
28
38
  // This is an uninitialized NW.
29
- await initializeNW(filesystem);
39
+ await initializeNW(filesystem, initLayers);
30
40
  }
31
41
  }
32
42
  exports.initializeIfNeeded = initializeIfNeeded;
package/dist/mp3.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ import { NWCodecInfo } from './codecs';
2
+ import { InboundTrackMetadata, TrackMetadata } from './databases';
3
+ import { HiMDFile } from 'himd-js';
4
+ export declare function generateMP3CodecField(mp3Data: Uint8Array): {
5
+ codec: NWCodecInfo;
6
+ duration: number;
7
+ frames: number;
8
+ };
9
+ export declare function createMP3OMAFile(index: number, metadata: InboundTrackMetadata, rawFile: Uint8Array, deviceKey: number, codec: NWCodecInfo): Uint8Array;
10
+ export declare function updateMP3Metadata(file: HiMDFile, titleInfo: TrackMetadata): Promise<void>;
11
+ //# sourceMappingURL=mp3.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mp3.d.ts","sourceRoot":"","sources":["../src/mp3.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4B,WAAW,EAAE,MAAM,UAAU,CAAC;AACjE,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGlE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAiBnC,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,UAAU,GAAG;IAAE,KAAK,EAAE,WAAW,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAsFnH;AAID,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,EAAE,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,UAAU,CAqCtJ;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,iBAmB/E"}
package/dist/mp3.js ADDED
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.updateMP3Metadata = exports.createMP3OMAFile = exports.generateMP3CodecField = void 0;
4
+ const mp3_parser_1 = require("mp3-parser");
5
+ const bytemanip_1 = require("./bytemanip");
6
+ const codecs_1 = require("./codecs");
7
+ const id3_1 = require("./id3");
8
+ const encryption_1 = require("./encryption");
9
+ const HIMD_MP3_VAR_VERSION = 0x40;
10
+ const HIMD_MP3_VAR_LAYER = 0x20;
11
+ const HIMD_MP3_VAR_BITRATE = 0x10;
12
+ const HIMD_MP3_VAR_SRATE = 0x08;
13
+ const HIMD_MP3_VAR_CHMODE = 0x04;
14
+ const HIMD_MP3_VAR_PREEMPH = 0x02;
15
+ const MP3_SAMPLE_RATE_TABLE = [
16
+ [11.025, 12, 8],
17
+ [],
18
+ [22.05, 24, 16],
19
+ [44.1, 48, 32],
20
+ ];
21
+ const ONE_CHANNEL_SAMPLES_IN_FRAME = 576;
22
+ function generateMP3CodecField(mp3Data) {
23
+ // Generate flags:
24
+ const view = new DataView(mp3Data.buffer);
25
+ const findRootSection = (type) => (0, mp3_parser_1.readTags)(view).filter((e) => e._section.type === type)[0];
26
+ let frame = findRootSection('frame');
27
+ let mpegVers = 3, mpegLayer = 1, mpegBitrate = 9, mpegSampleRate = 0, mpegChMode = 0, mpegPreemph = 0, flags = 0x80, frameCount = 0, totalDuration = 0, firstTime = true;
28
+ for (;;) {
29
+ ++frameCount;
30
+ let blockMpegVersion = (view.getUint8(frame.header._section.offset + 1) >> 3) & 0x03, //binary(frame.header.mpegAudioVersionBits),
31
+ blockMpegLayer = (view.getUint8(frame.header._section.offset + 1) >> 1) & 0x03, //binary(frame.header.layerDescriptionBits),
32
+ blockMpegBitrate = (view.getUint8(frame.header._section.offset + 2) >> 4) & 0x0f, //binary(frame.header.bitrateBits),
33
+ blockMpegSampleRate = (view.getUint8(frame.header._section.offset + 2) >> 2) & 0x03, //binary(frame.header.samplingRateBits),
34
+ blockMpegChannelMode = (view.getUint8(frame.header._section.offset + 3) >> 6) & 0x03, //binary(frame.header.channelModeBits),
35
+ blockMpegPreemph = view.getUint8(frame.header._section.offset + 3) & 0x03;
36
+ if (firstTime) {
37
+ mpegVers = blockMpegVersion;
38
+ mpegLayer = blockMpegLayer;
39
+ mpegBitrate = blockMpegBitrate;
40
+ mpegSampleRate = blockMpegSampleRate;
41
+ mpegChMode = blockMpegChannelMode;
42
+ mpegPreemph = blockMpegPreemph;
43
+ firstTime = false;
44
+ }
45
+ else {
46
+ if (blockMpegVersion !== mpegVers) {
47
+ flags |= HIMD_MP3_VAR_VERSION;
48
+ mpegVers = Math.min(mpegVers, blockMpegVersion); /* smaller num -> higher version */
49
+ }
50
+ if (blockMpegLayer !== mpegLayer) {
51
+ flags |= HIMD_MP3_VAR_LAYER;
52
+ mpegLayer = Math.min(mpegLayer, blockMpegLayer); /* smaller num -> higher layer */
53
+ }
54
+ if (blockMpegBitrate !== mpegBitrate) {
55
+ /* TODO: check whether "free-form" streams need special handling */
56
+ flags |= HIMD_MP3_VAR_BITRATE;
57
+ mpegBitrate = Math.max(mpegBitrate, blockMpegBitrate);
58
+ }
59
+ if (blockMpegSampleRate !== mpegSampleRate) {
60
+ flags |= HIMD_MP3_VAR_SRATE;
61
+ /* "1" is highest (48), "0" is medium (44), "2" is lowest (32) */
62
+ if (mpegSampleRate !== 1) {
63
+ if (blockMpegSampleRate === 1)
64
+ mpegSampleRate = blockMpegSampleRate;
65
+ else
66
+ mpegSampleRate = Math.min(mpegSampleRate, blockMpegSampleRate);
67
+ }
68
+ }
69
+ if (blockMpegChannelMode !== mpegChMode) {
70
+ /* TODO: find out how to choose "maximal" mode */
71
+ flags |= HIMD_MP3_VAR_CHMODE;
72
+ }
73
+ if (blockMpegPreemph !== mpegPreemph) {
74
+ /* TODO: find out how to choose "maximal" preemphasis */
75
+ flags |= HIMD_MP3_VAR_PREEMPH;
76
+ }
77
+ }
78
+ const channelCount = (mpegChMode & 0b10) === 0 ? 2 : 1;
79
+ totalDuration += ONE_CHANNEL_SAMPLES_IN_FRAME * channelCount / MP3_SAMPLE_RATE_TABLE[blockMpegVersion][blockMpegSampleRate];
80
+ let nextFrameIndex = frame._section.nextFrameIndex;
81
+ if (!nextFrameIndex)
82
+ break;
83
+ frame = (0, mp3_parser_1.readFrame)(view, nextFrameIndex);
84
+ if (frame === null)
85
+ break;
86
+ }
87
+ const mp3CodecInfo = new Uint8Array(3 + 4 + 4);
88
+ mp3CodecInfo[0] = flags;
89
+ mp3CodecInfo[1] = (mpegVers << 6) | (mpegLayer << 4) | mpegBitrate;
90
+ mp3CodecInfo[2] = (mpegSampleRate << 6) | (mpegChMode << 4) | (mpegPreemph << 2);
91
+ mp3CodecInfo.set((0, bytemanip_1.writeUint32)(Math.floor(totalDuration)), 3);
92
+ mp3CodecInfo.set((0, bytemanip_1.writeUint32)(Math.floor(frameCount)), 7);
93
+ return {
94
+ codec: {
95
+ codecId: codecs_1.NWCodec.MP3, codecInfo: mp3CodecInfo, complete: true
96
+ },
97
+ duration: totalDuration,
98
+ frames: frameCount,
99
+ };
100
+ }
101
+ exports.generateMP3CodecField = generateMP3CodecField;
102
+ const METADATA_BLOCK_SIZE = 0x1000;
103
+ function createMP3OMAFile(index, metadata, rawFile, deviceKey, codec) {
104
+ // Strip all ID3 tags from the source MP3 file
105
+ let cursor = 0;
106
+ const rawDataView = new DataView(rawFile.buffer);
107
+ const ID3_MAGIC = new TextEncoder().encode("ID3");
108
+ while (ID3_MAGIC.every((e, i) => rawFile[cursor + i] === e)) {
109
+ // We're in an ID3 section
110
+ const length = (0, id3_1.readSynchsafeInt32)(rawDataView, cursor + 6)[0];
111
+ cursor += 10 + length;
112
+ }
113
+ // Cursor points to the start of the first MP3 frame in this file.
114
+ // Create the new and compliant ID3 tag set from metadata
115
+ // Reserve METADATA_BLOCK_SIZE bytes for metadata edits down the line
116
+ const rootID3 = (0, id3_1.serialize)({
117
+ version: { major: 3, minor: 0 },
118
+ flags: 0,
119
+ tags: [
120
+ ...(0, id3_1.createCommonID3Tags)(metadata),
121
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_FPRCA1", " ") },
122
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_FCRCA1", " ") },
123
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_TRLDA", "1982/01/01 00:00:00") },
124
+ ],
125
+ }, METADATA_BLOCK_SIZE);
126
+ const formatHeader = (0, codecs_1.createEA3Header)(codec, 0xFFFE, 2);
127
+ const finalFileBuffer = new Uint8Array(rootID3.length + formatHeader.length + rawFile.length - cursor);
128
+ finalFileBuffer.set(rootID3, 0);
129
+ finalFileBuffer.set(formatHeader, rootID3.length);
130
+ const finalDataView = new DataView(finalFileBuffer.buffer);
131
+ const key = (0, encryption_1.getMP3EncryptionKey)(deviceKey, index);
132
+ let finalBufferCursor = rootID3.length + formatHeader.length;
133
+ for (; cursor < rawFile.length - 7; cursor += 8, finalBufferCursor += 8) {
134
+ finalDataView.setUint32(finalBufferCursor, rawDataView.getUint32(cursor) ^ key);
135
+ finalDataView.setUint32(finalBufferCursor + 4, rawDataView.getUint32(cursor + 4) ^ key);
136
+ }
137
+ return finalFileBuffer;
138
+ }
139
+ exports.createMP3OMAFile = createMP3OMAFile;
140
+ async function updateMP3Metadata(file, titleInfo) {
141
+ // Check if this is a valid file.
142
+ await file.seek(0);
143
+ const initialBuffer = await file.read(10);
144
+ const { size: ea3Size } = (0, id3_1.readInitialID3Header)(initialBuffer);
145
+ // The new buffer has to fit within the space reserved by the old one.
146
+ // We cannot shift the audio data around.
147
+ const newEA3 = (0, id3_1.serialize)({
148
+ version: { major: 3, minor: 0 },
149
+ flags: 0,
150
+ tags: [
151
+ ...(0, id3_1.createCommonID3Tags)(titleInfo),
152
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_FPRCA1", " ") },
153
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_FCRCA1", " ") },
154
+ { id: 'TXXX', flags: 0, contents: (0, id3_1.encodeSonyWeirdString)("OMG_TRLDA", "1982/01/01 00:00:00") },
155
+ ],
156
+ }, ea3Size);
157
+ await file.seek(0);
158
+ await file.write(newEA3);
159
+ }
160
+ exports.updateMP3Metadata = updateMP3Metadata;