@cogeotiff/core 7.2.1 → 8.0.2

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 (147) hide show
  1. package/CHANGELOG.md +5 -502
  2. package/README.md +23 -11
  3. package/build/__benchmark__/cog.read.benchmark.d.ts +0 -1
  4. package/build/__benchmark__/cog.read.benchmark.js +6 -4
  5. package/build/__benchmark__/cog.read.benchmark.js.map +1 -0
  6. package/build/__benchmark__/source.file.d.ts +9 -0
  7. package/build/__benchmark__/source.file.js +29 -0
  8. package/build/__benchmark__/source.file.js.map +1 -0
  9. package/build/__benchmark__/source.memory.d.ts +9 -0
  10. package/build/__benchmark__/source.memory.js +32 -0
  11. package/build/__benchmark__/source.memory.js.map +1 -0
  12. package/build/__test__/cog.image.test.d.ts +1 -2
  13. package/build/__test__/cog.image.test.js +82 -90
  14. package/build/__test__/cog.image.test.js.map +1 -0
  15. package/build/__test__/cog.read.test.d.ts +1 -2
  16. package/build/__test__/cog.read.test.js +37 -55
  17. package/build/__test__/cog.read.test.js.map +1 -0
  18. package/build/__test__/example.d.ts +1 -0
  19. package/build/__test__/example.js +27 -0
  20. package/build/__test__/example.js.map +1 -0
  21. package/build/cog.tiff.d.ts +22 -28
  22. package/build/cog.tiff.image.d.ts +11 -23
  23. package/build/cog.tiff.image.js +108 -62
  24. package/build/cog.tiff.image.js.map +1 -0
  25. package/build/cog.tiff.js +141 -97
  26. package/build/cog.tiff.js.map +1 -0
  27. package/build/const/index.d.ts +1 -2
  28. package/build/const/index.js +2 -2
  29. package/build/const/index.js.map +1 -0
  30. package/build/const/tiff.endian.d.ts +0 -1
  31. package/build/const/tiff.endian.js +1 -1
  32. package/build/const/tiff.endian.js.map +1 -0
  33. package/build/const/tiff.mime.d.ts +10 -11
  34. package/build/const/tiff.mime.js +22 -22
  35. package/build/const/tiff.mime.js.map +1 -0
  36. package/build/const/tiff.tag.id.d.ts +3 -3
  37. package/build/const/tiff.tag.id.js +4 -3
  38. package/build/const/tiff.tag.id.js.map +1 -0
  39. package/build/const/tiff.tag.value.d.ts +15 -16
  40. package/build/const/tiff.tag.value.js +16 -16
  41. package/build/const/tiff.tag.value.js.map +1 -0
  42. package/build/const/tiff.version.d.ts +0 -1
  43. package/build/const/tiff.version.js +1 -1
  44. package/build/const/tiff.version.js.map +1 -0
  45. package/build/index.d.ts +11 -6
  46. package/build/index.js +9 -5
  47. package/build/index.js.map +1 -0
  48. package/build/read/data.view.offset.d.ts +15 -0
  49. package/build/read/data.view.offset.js +19 -0
  50. package/build/read/data.view.offset.js.map +1 -0
  51. package/build/read/tiff.gdal.d.ts +9 -12
  52. package/build/read/tiff.gdal.js +22 -17
  53. package/build/read/tiff.gdal.js.map +1 -0
  54. package/build/read/tiff.ifd.config.d.ts +6 -4
  55. package/build/read/tiff.ifd.config.js +2 -2
  56. package/build/read/tiff.ifd.config.js.map +1 -0
  57. package/build/read/tiff.tag.d.ts +40 -20
  58. package/build/read/tiff.tag.factory.d.ts +16 -0
  59. package/build/read/tiff.tag.factory.js +130 -0
  60. package/build/read/tiff.tag.factory.js.map +1 -0
  61. package/build/read/tiff.tag.js +2 -37
  62. package/build/read/tiff.tag.js.map +1 -0
  63. package/build/read/tiff.value.reader.d.ts +2 -6
  64. package/build/read/tiff.value.reader.js +16 -54
  65. package/build/read/tiff.value.reader.js.map +1 -0
  66. package/build/source.d.ts +5 -0
  67. package/build/source.js +2 -0
  68. package/build/source.js.map +1 -0
  69. package/build/util/bytes.d.ts +17 -0
  70. package/build/util/bytes.js +42 -0
  71. package/build/util/bytes.js.map +1 -0
  72. package/build/util/util.hex.d.ts +2 -3
  73. package/build/util/util.hex.js +4 -5
  74. package/build/util/util.hex.js.map +1 -0
  75. package/build/vector.d.ts +0 -1
  76. package/build/vector.js +1 -1
  77. package/build/vector.js.map +1 -0
  78. package/package.json +25 -30
  79. package/src/__benchmark__/cog.read.benchmark.ts +12 -10
  80. package/src/__benchmark__/source.file.ts +23 -0
  81. package/src/__benchmark__/source.memory.ts +23 -0
  82. package/src/__test__/cog.image.test.ts +188 -197
  83. package/src/__test__/cog.read.test.ts +50 -72
  84. package/src/__test__/example.ts +31 -0
  85. package/src/cog.tiff.image.ts +456 -447
  86. package/src/cog.tiff.ts +142 -145
  87. package/src/const/index.ts +1 -1
  88. package/src/const/tiff.endian.ts +2 -2
  89. package/src/const/tiff.mime.ts +21 -21
  90. package/src/const/tiff.tag.id.ts +157 -156
  91. package/src/const/tiff.tag.value.ts +16 -16
  92. package/src/const/tiff.version.ts +11 -11
  93. package/src/index.ts +11 -5
  94. package/src/read/data.view.offset.ts +23 -0
  95. package/src/read/tiff.gdal.ts +61 -63
  96. package/src/read/tiff.ifd.config.ts +35 -31
  97. package/src/read/tiff.tag.factory.ts +163 -0
  98. package/src/read/tiff.tag.ts +40 -38
  99. package/src/read/tiff.value.reader.ts +25 -73
  100. package/src/source.ts +5 -0
  101. package/src/util/bytes.ts +44 -0
  102. package/src/util/util.hex.ts +5 -7
  103. package/src/vector.ts +5 -5
  104. package/tsconfig.json +8 -8
  105. package/build/__benchmark__/cog.read.benchmark.d.ts.map +0 -1
  106. package/build/__test__/cog.image.test.d.ts.map +0 -1
  107. package/build/__test__/cog.read.test.d.ts.map +0 -1
  108. package/build/cog.tiff.d.ts.map +0 -1
  109. package/build/cog.tiff.image.d.ts.map +0 -1
  110. package/build/const/index.d.ts.map +0 -1
  111. package/build/const/tiff.endian.d.ts.map +0 -1
  112. package/build/const/tiff.mime.d.ts.map +0 -1
  113. package/build/const/tiff.tag.id.d.ts.map +0 -1
  114. package/build/const/tiff.tag.value.d.ts.map +0 -1
  115. package/build/const/tiff.version.d.ts.map +0 -1
  116. package/build/index.d.ts.map +0 -1
  117. package/build/read/tag/__test__/tag.test.d.ts +0 -2
  118. package/build/read/tag/__test__/tag.test.d.ts.map +0 -1
  119. package/build/read/tag/__test__/tag.test.js +0 -23
  120. package/build/read/tag/tiff.tag.base.d.ts +0 -55
  121. package/build/read/tag/tiff.tag.base.d.ts.map +0 -1
  122. package/build/read/tag/tiff.tag.base.js +0 -79
  123. package/build/read/tag/tiff.tag.lazy.d.ts +0 -7
  124. package/build/read/tag/tiff.tag.lazy.d.ts.map +0 -1
  125. package/build/read/tag/tiff.tag.lazy.js +0 -18
  126. package/build/read/tag/tiff.tag.offset.d.ts +0 -21
  127. package/build/read/tag/tiff.tag.offset.d.ts.map +0 -1
  128. package/build/read/tag/tiff.tag.offset.js +0 -54
  129. package/build/read/tag/tiff.tag.static.d.ts +0 -8
  130. package/build/read/tag/tiff.tag.static.d.ts.map +0 -1
  131. package/build/read/tag/tiff.tag.static.js +0 -17
  132. package/build/read/tiff.gdal.d.ts.map +0 -1
  133. package/build/read/tiff.ifd.config.d.ts.map +0 -1
  134. package/build/read/tiff.tag.d.ts.map +0 -1
  135. package/build/read/tiff.value.reader.d.ts.map +0 -1
  136. package/build/source/cog.source.view.d.ts +0 -33
  137. package/build/source/cog.source.view.d.ts.map +0 -1
  138. package/build/source/cog.source.view.js +0 -65
  139. package/build/util/util.hex.d.ts.map +0 -1
  140. package/build/vector.d.ts.map +0 -1
  141. package/src/@types/ieee754.d.ts +0 -18
  142. package/src/read/tag/__test__/tag.test.ts +0 -27
  143. package/src/read/tag/tiff.tag.base.ts +0 -126
  144. package/src/read/tag/tiff.tag.lazy.ts +0 -17
  145. package/src/read/tag/tiff.tag.offset.ts +0 -61
  146. package/src/read/tag/tiff.tag.static.ts +0 -15
  147. package/src/source/cog.source.view.ts +0 -77
@@ -1,52 +1,46 @@
1
- import { ChunkSource } from '@chunkd/core';
2
1
  import { CogTiffImage } from './cog.tiff.image.js';
3
2
  import { TiffVersion } from './const/tiff.version.js';
4
3
  import { CogTifGhostOptions } from './read/tiff.gdal.js';
5
4
  import { TiffIfdConfig } from './read/tiff.ifd.config.js';
5
+ import { Source } from './source.js';
6
6
  export declare class CogTiff {
7
- source: ChunkSource;
7
+ /** Read 16KB blocks at a time */
8
+ defaultReadSize: number;
9
+ /** Where this cog is fetching its data from */
10
+ source: Source;
11
+ /** Big or small Tiff */
8
12
  version: TiffVersion;
13
+ /** List of images, o is the base image */
9
14
  images: CogTiffImage[];
10
- options: CogTifGhostOptions;
11
- private cursor;
15
+ /** Ghost header options */
16
+ options?: CogTifGhostOptions;
17
+ /** Configuration for the size of the IFD */
12
18
  ifdConfig: TiffIfdConfig;
13
- constructor(source: ChunkSource);
14
- /** Create and initialize a CogTiff */
15
- static create(source: ChunkSource): Promise<CogTiff>;
19
+ /** Is the tiff being read is little Endian */
20
+ isLittleEndian: boolean;
16
21
  /** Has init() been called */
17
22
  isInitialized: boolean;
18
- _initPromise?: Promise<CogTiff>;
23
+ private _initPromise?;
24
+ constructor(source: Source);
25
+ /** Create a COG and initialize it by reading the COG headers */
26
+ static create(source: Source): Promise<CogTiff>;
19
27
  /**
20
28
  * Initialize the COG loading in the header and all image headers
21
- *
22
- * @param loadGeoKeys Whether to also initialize the GeoKeyDirectory
23
29
  */
24
- init(loadGeoKeys?: boolean): Promise<CogTiff>;
25
- private doInit;
26
- private fetchIfd;
27
- getImage(z: number): CogTiffImage;
30
+ init(): Promise<CogTiff>;
28
31
  /**
29
32
  * Find a image which has a resolution similar to the provided resolution
30
33
  *
31
34
  * @param resolution resolution to find
32
35
  */
33
36
  getImageByResolution(resolution: number): CogTiffImage;
37
+ /** Read the Starting header and all Image headers from the source */
38
+ private readHeader;
34
39
  /**
35
- * Get the raw bytes for a tile at a given x,y, index.
36
- *
37
- * This may return null if the tile does not exist eg Sparse cogs,
40
+ * Read a IFD at a the provided offset
38
41
  *
39
- * @param x tile x index
40
- * @param y tile y index
41
- * @param index image index
42
+ * @param offset file offset to read the header from
43
+ * @param view offset that contains the bytes for the header
42
44
  */
43
- getTile(x: number, y: number, index: number): Promise<{
44
- mimeType: string;
45
- bytes: Uint8Array;
46
- } | null>;
47
- private processIfd;
48
45
  private readIfd;
49
- /** Close the file source if it needs closing */
50
- close(): Promise<void>;
51
46
  }
52
- //# sourceMappingURL=cog.tiff.d.ts.map
@@ -1,10 +1,8 @@
1
1
  import { CogTiff } from './cog.tiff.js';
2
2
  import { TiffMimeType } from './const/tiff.mime.js';
3
3
  import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
4
- import { CogTiffTagBase } from './read/tag/tiff.tag.base.js';
5
- import { CogTiffTagOffset } from './read/tag/tiff.tag.offset.js';
4
+ import { Tag, TagOffset } from './read/tiff.tag.js';
6
5
  import { BoundingBox, Size } from './vector.js';
7
- /** Invalid EPSG code */
8
6
  export declare const InvalidProjectionCode = 32767;
9
7
  /**
10
8
  * Number of tiles used inside this image
@@ -15,6 +13,8 @@ export interface CogTiffImageTiledCount {
15
13
  /** Number of tiles on the y axis */
16
14
  y: number;
17
15
  }
16
+ /** Tags that are commonly accessed for geotiffs */
17
+ export declare const ImportantTags: Set<TiffTag>;
18
18
  /**
19
19
  * Size of a individual tile
20
20
  */
@@ -26,15 +26,15 @@ export interface CogTiffImageTileSize {
26
26
  }
27
27
  export declare class CogTiffImage {
28
28
  /** All IFD tags that have been read for the image */
29
- tags: Map<TiffTag, CogTiffTagBase>;
29
+ tags: Map<TiffTag, Tag>;
30
30
  /** Id of the tif image, generally the image index inside the tif */
31
31
  id: number;
32
- tif: CogTiff;
32
+ tiff: CogTiff;
33
33
  /** Has loadGeoTiffTags been called */
34
- private tagsGeoLoaded;
34
+ isGeoTagsLoaded: boolean;
35
35
  /** Sub tags stored in TiffTag.GeoKeyDirectory */
36
36
  tagsGeo: Map<TiffTagGeo, string | number>;
37
- constructor(tif: CogTiff, id: number, tags: Map<TiffTag, CogTiffTagBase>);
37
+ constructor(tiff: CogTiff, id: number, tags: Map<TiffTag, Tag>);
38
38
  /**
39
39
  * Force loading of important tags if they have not already been loaded
40
40
  *
@@ -98,10 +98,6 @@ export declare class CogTiffImage {
98
98
  * @returns Size in pixels
99
99
  */
100
100
  get size(): Size;
101
- /**
102
- * Get the list of IFD tags that were read
103
- */
104
- get tagList(): string[];
105
101
  /**
106
102
  * Determine if this image is tiled
107
103
  */
@@ -121,7 +117,7 @@ export declare class CogTiffImage {
121
117
  *
122
118
  * @returns file offset to where the tiffs are stored
123
119
  */
124
- get tileOffset(): CogTiffTagOffset;
120
+ get tileOffset(): TagOffset;
125
121
  /**
126
122
  * Get the number of strip's inside this tiff
127
123
  *
@@ -130,13 +126,6 @@ export declare class CogTiffImage {
130
126
  * @returns number of strips present
131
127
  */
132
128
  get stripCount(): number;
133
- /**
134
- * Get a pointer to a specific tile inside the tiff file
135
- *
136
- * @param index tile index
137
- * @returns file offset of the specified tile
138
- */
139
- protected getTileOffset(index: number): Promise<number>;
140
129
  getTileBounds(x: number, y: number): BoundingBox;
141
130
  /**
142
131
  * Read a strip into a uint8 array
@@ -145,7 +134,7 @@ export declare class CogTiffImage {
145
134
  */
146
135
  getStrip(index: number): Promise<{
147
136
  mimeType: TiffMimeType;
148
- bytes: Uint8Array;
137
+ bytes: ArrayBuffer;
149
138
  } | null>;
150
139
  /** The jpeg header is stored in the IFD, read the JPEG header and adjust the byte array to include it */
151
140
  private getJpegHeader;
@@ -161,7 +150,7 @@ export declare class CogTiffImage {
161
150
  */
162
151
  getTile(x: number, y: number): Promise<{
163
152
  mimeType: TiffMimeType;
164
- bytes: Uint8Array;
153
+ bytes: ArrayBuffer;
165
154
  } | null>;
166
155
  /**
167
156
  * Does this tile exist in the tiff and does it actually have a value
@@ -173,9 +162,8 @@ export declare class CogTiffImage {
173
162
  * @returns if the tile exists and has data
174
163
  */
175
164
  hasTile(x: number, y: number): Promise<boolean>;
176
- protected getTileSize(index: number): Promise<{
165
+ getTileSize(index: number): Promise<{
177
166
  offset: number;
178
167
  imageSize: number;
179
168
  }>;
180
169
  }
181
- //# sourceMappingURL=cog.tiff.image.d.ts.map
@@ -1,16 +1,61 @@
1
+ import { getUint } from './util/bytes.js';
1
2
  import { TiffCompression, TiffMimeType } from './const/tiff.mime.js';
2
3
  import { TiffTag, TiffTagGeo } from './const/tiff.tag.id.js';
3
- import { CogTiffTagLazy } from './read/tag/tiff.tag.lazy.js';
4
- import { CogTiffTag } from './read/tiff.tag.js';
5
- /** Invalid EPSG code */
4
+ import { fetchLazy, getValueAt } from './read/tiff.tag.factory.js';
5
+ // /** Invalid EPSG code */
6
6
  export const InvalidProjectionCode = 32767;
7
+ /** Tags that are commonly accessed for geotiffs */
8
+ export const ImportantTags = new Set([
9
+ TiffTag.Compression,
10
+ TiffTag.ImageHeight,
11
+ TiffTag.ImageWidth,
12
+ TiffTag.ModelPixelScale,
13
+ TiffTag.ModelTiePoint,
14
+ TiffTag.ModelTransformation,
15
+ TiffTag.TileHeight,
16
+ TiffTag.TileWidth,
17
+ TiffTag.GeoKeyDirectory,
18
+ TiffTag.GeoAsciiParams,
19
+ TiffTag.GeoDoubleParams,
20
+ TiffTag.TileOffsets,
21
+ ]);
7
22
  export class CogTiffImage {
8
- constructor(tif, id, tags) {
23
+ constructor(tiff, id, tags) {
24
+ /** All IFD tags that have been read for the image */
25
+ Object.defineProperty(this, "tags", {
26
+ enumerable: true,
27
+ configurable: true,
28
+ writable: true,
29
+ value: void 0
30
+ });
31
+ /** Id of the tif image, generally the image index inside the tif */
32
+ Object.defineProperty(this, "id", {
33
+ enumerable: true,
34
+ configurable: true,
35
+ writable: true,
36
+ value: void 0
37
+ });
38
+ Object.defineProperty(this, "tiff", {
39
+ enumerable: true,
40
+ configurable: true,
41
+ writable: true,
42
+ value: void 0
43
+ });
9
44
  /** Has loadGeoTiffTags been called */
10
- this.tagsGeoLoaded = false;
45
+ Object.defineProperty(this, "isGeoTagsLoaded", {
46
+ enumerable: true,
47
+ configurable: true,
48
+ writable: true,
49
+ value: false
50
+ });
11
51
  /** Sub tags stored in TiffTag.GeoKeyDirectory */
12
- this.tagsGeo = new Map();
13
- this.tif = tif;
52
+ Object.defineProperty(this, "tagsGeo", {
53
+ enumerable: true,
54
+ configurable: true,
55
+ writable: true,
56
+ value: new Map()
57
+ });
58
+ this.tiff = tiff;
14
59
  this.id = id;
15
60
  this.tags = tags;
16
61
  }
@@ -19,7 +64,7 @@ export class CogTiffImage {
19
64
  *
20
65
  * @param loadGeoTags Whether to load the GeoKeyDirectory and unpack it
21
66
  */
22
- async init(loadGeoTags = false) {
67
+ async init(loadGeoTags = true) {
23
68
  const requiredTags = [
24
69
  this.fetch(TiffTag.Compression),
25
70
  this.fetch(TiffTag.ImageHeight),
@@ -36,9 +81,8 @@ export class CogTiffImage {
36
81
  requiredTags.push(this.fetch(TiffTag.GeoDoubleParams));
37
82
  }
38
83
  await Promise.all(requiredTags);
39
- if (loadGeoTags) {
84
+ if (loadGeoTags)
40
85
  await this.loadGeoTiffTags();
41
- }
42
86
  }
43
87
  /**
44
88
  * Get the value of a TiffTag if it exists null otherwise
@@ -47,6 +91,8 @@ export class CogTiffImage {
47
91
  const sourceTag = this.tags.get(tag);
48
92
  if (sourceTag == null)
49
93
  return null;
94
+ if (sourceTag.type === 'offset' && sourceTag.isLoaded === false)
95
+ return null;
50
96
  return sourceTag.value;
51
97
  }
52
98
  /**
@@ -54,14 +100,14 @@ export class CogTiffImage {
54
100
  */
55
101
  async loadGeoTiffTags() {
56
102
  // Already loaded
57
- if (this.tagsGeoLoaded)
103
+ if (this.isGeoTagsLoaded)
58
104
  return;
59
105
  const sourceTag = this.tags.get(TiffTag.GeoKeyDirectory);
60
106
  if (sourceTag == null) {
61
- this.tagsGeoLoaded = true;
107
+ this.isGeoTagsLoaded = true;
62
108
  return;
63
109
  }
64
- if (!sourceTag.isReady && sourceTag instanceof CogTiffTagLazy) {
110
+ if (sourceTag.type === 'lazy' && sourceTag.value == null) {
65
111
  // Load all the required keys
66
112
  await Promise.all([
67
113
  this.fetch(TiffTag.GeoKeyDirectory),
@@ -69,11 +115,11 @@ export class CogTiffImage {
69
115
  this.fetch(TiffTag.GeoDoubleParams),
70
116
  ]);
71
117
  }
72
- this.tagsGeoLoaded = true;
118
+ this.isGeoTagsLoaded = true;
73
119
  if (sourceTag.value == null)
74
120
  return;
75
121
  const geoTags = sourceTag.value;
76
- if (!Array.isArray(geoTags))
122
+ if (typeof geoTags === 'number')
77
123
  throw new Error('Invalid geo tags found');
78
124
  for (let i = 4; i <= geoTags[3] * 4; i += 4) {
79
125
  const key = geoTags[i];
@@ -91,7 +137,7 @@ export class CogTiffImage {
91
137
  this.tagsGeo.set(key, tag.value[offset + count - 1]);
92
138
  }
93
139
  else if (typeof tag.value === 'string') {
94
- this.tagsGeo.set(key, tag.value.substr(offset, offset + count - 1).trim());
140
+ this.tagsGeo.set(key, tag.value.slice(offset, offset + count - 1).trim());
95
141
  }
96
142
  }
97
143
  }
@@ -99,7 +145,7 @@ export class CogTiffImage {
99
145
  * Get the associated GeoTiffTags
100
146
  */
101
147
  valueGeo(tag) {
102
- if (this.tagsGeoLoaded === false)
148
+ if (this.isGeoTagsLoaded === false)
103
149
  throw new Error('loadGeoTiffTags() has not been called');
104
150
  return this.tagsGeo.get(tag);
105
151
  }
@@ -111,9 +157,13 @@ export class CogTiffImage {
111
157
  const sourceTag = this.tags.get(tag);
112
158
  if (sourceTag == null)
113
159
  return null;
114
- if (CogTiffTag.isLazy(sourceTag))
115
- return sourceTag.fetch();
116
- return sourceTag.value;
160
+ if (sourceTag.type === 'inline')
161
+ return sourceTag.value;
162
+ if (sourceTag.type === 'lazy')
163
+ return fetchLazy(sourceTag, this.tiff);
164
+ if (sourceTag.isLoaded)
165
+ return sourceTag.value;
166
+ throw new Error('Cannot fetch:' + tag);
117
167
  }
118
168
  /**
119
169
  * Get the origin point for the image
@@ -131,7 +181,7 @@ export class CogTiffImage {
131
181
  }
132
182
  // If this is a sub image, use the origin from the top level image
133
183
  if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
134
- return this.tif.images[0].origin;
184
+ return this.tiff.images[0].origin;
135
185
  }
136
186
  throw new Error('Image does not have a geo transformation.');
137
187
  }
@@ -142,7 +192,7 @@ export class CogTiffImage {
142
192
  return true;
143
193
  // If this is a sub image, use the isGeoLocated from the top level image
144
194
  if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0)
145
- return this.tif.images[0].isGeoLocated;
195
+ return this.tiff.images[0].isGeoLocated;
146
196
  return false;
147
197
  }
148
198
  /**
@@ -161,7 +211,7 @@ export class CogTiffImage {
161
211
  }
162
212
  // If this is a sub image, use the resolution from the top level image
163
213
  if (this.value(TiffTag.NewSubFileType) === 1 && this.id !== 0) {
164
- const firstImg = this.tif.images[0];
214
+ const firstImg = this.tiff.images[0];
165
215
  const [resX, resY, resZ] = firstImg.resolution;
166
216
  const firstImgSize = firstImg.size;
167
217
  const imgSize = this.size;
@@ -197,9 +247,8 @@ export class CogTiffImage {
197
247
  */
198
248
  get compression() {
199
249
  const compression = this.value(TiffTag.Compression);
200
- if (compression == null || typeof compression !== 'number') {
250
+ if (compression == null || typeof compression !== 'number')
201
251
  return null;
202
- }
203
252
  return TiffCompression[compression];
204
253
  }
205
254
  /**
@@ -224,12 +273,6 @@ export class CogTiffImage {
224
273
  height: this.value(TiffTag.ImageHeight),
225
274
  };
226
275
  }
227
- /**
228
- * Get the list of IFD tags that were read
229
- */
230
- get tagList() {
231
- return [...this.tags.keys()].map((c) => TiffTag[c]);
232
- }
233
276
  /**
234
277
  * Determine if this image is tiled
235
278
  */
@@ -279,21 +322,7 @@ export class CogTiffImage {
279
322
  const tileOffset = this.tags.get(TiffTag.StripByteCounts);
280
323
  if (tileOffset == null)
281
324
  return 0;
282
- return tileOffset.dataCount;
283
- }
284
- /**
285
- * Get a pointer to a specific tile inside the tiff file
286
- *
287
- * @param index tile index
288
- * @returns file offset of the specified tile
289
- */
290
- async getTileOffset(index) {
291
- const tileOffset = this.tileOffset;
292
- if (index < 0 || index > tileOffset.dataCount) {
293
- throw new Error(`Tile offset: ${index} out of range: 0 -> ${tileOffset.dataCount}`);
294
- }
295
- // Fetch only the part of the offsets that are needed
296
- return tileOffset.getValueAt(index);
325
+ return tileOffset.count;
297
326
  }
298
327
  // Clamp the bounds of the output image to the size of the image, as sometimes the edge tiles are not full tiles
299
328
  getTileBounds(x, y) {
@@ -311,12 +340,15 @@ export class CogTiffImage {
311
340
  */
312
341
  async getStrip(index) {
313
342
  if (this.isTiled())
314
- throw new Error('Cannot read stripes, tiff is tiled');
343
+ throw new Error('Cannot read stripes, tiff is tiled: ' + index);
315
344
  const byteCounts = this.tags.get(TiffTag.StripByteCounts);
316
345
  const offsets = this.tags.get(TiffTag.StripOffsets);
317
- if (index >= byteCounts.dataCount)
346
+ if (index >= byteCounts.count)
318
347
  throw new Error('Cannot read strip, index out of bounds');
319
- const [byteCount, offset] = await Promise.all([offsets.getValueAt(index), byteCounts.getValueAt(index)]);
348
+ const [byteCount, offset] = await Promise.all([
349
+ getOffset(this.tiff, offsets, index),
350
+ getOffset(this.tiff, byteCounts, index),
351
+ ]);
320
352
  return this.getBytes(byteCount, offset);
321
353
  }
322
354
  /** The jpeg header is stored in the IFD, read the JPEG header and adjust the byte array to include it */
@@ -330,7 +362,7 @@ export class CogTiffImage {
330
362
  const tableData = tables.slice(0, tables.length - 2);
331
363
  const actualBytes = new Uint8Array(bytes.byteLength + tableData.length - 2);
332
364
  actualBytes.set(tableData, 0);
333
- actualBytes.set(bytes.slice(2), tableData.length);
365
+ actualBytes.set(new Uint8Array(bytes).slice(2), tableData.length);
334
366
  return actualBytes;
335
367
  }
336
368
  /** Read image bytes at the given offset */
@@ -340,11 +372,12 @@ export class CogTiffImage {
340
372
  throw new Error('Unsupported compression: ' + this.value(TiffTag.Compression));
341
373
  if (byteCount === 0)
342
374
  return null;
343
- await this.tif.source.loadBytes(offset, byteCount);
344
- const bytes = this.tif.source.bytes(offset, byteCount);
345
- if (this.compression === TiffMimeType.JPEG) {
346
- return { mimeType, bytes: this.getJpegHeader(bytes) };
375
+ const bytes = await this.tiff.source.fetch(offset, byteCount);
376
+ if (bytes.byteLength < byteCount) {
377
+ throw new Error(`Failed to fetch bytes from offset:${offset} wanted:${byteCount} got:${bytes.byteLength}`);
347
378
  }
379
+ if (this.compression === TiffMimeType.Jpeg)
380
+ return { mimeType, bytes: this.getJpegHeader(bytes) };
348
381
  return { mimeType, bytes };
349
382
  }
350
383
  /**
@@ -374,6 +407,7 @@ export class CogTiffImage {
374
407
  if (idx >= totalTiles)
375
408
  throw new Error(`Tile index is outside of tile range: ${idx} >= ${totalTiles}`);
376
409
  const { offset, imageSize } = await this.getTileSize(idx);
410
+ // console.log({ x, y, offset, imageSize });
377
411
  return this.getBytes(offset, imageSize);
378
412
  }
379
413
  /**
@@ -402,23 +436,35 @@ export class CogTiffImage {
402
436
  async getTileSize(index) {
403
437
  // GDAL optimizes tiles by storing the size of the tile in
404
438
  // the few bytes leading up to the tile
405
- const leaderBytes = this.tif.options.tileLeaderByteSize;
439
+ const leaderBytes = this.tiff.options?.tileLeaderByteSize;
406
440
  if (leaderBytes) {
407
- const offset = await this.getTileOffset(index);
441
+ const offset = await getOffset(this.tiff, this.tileOffset, index);
408
442
  // Sparse COG no data found
409
443
  if (offset === 0)
410
444
  return { offset: 0, imageSize: 0 };
411
445
  // This fetch will generally load in the bytes needed for the image too
412
446
  // provided the image size is less than the size of a chunk
413
- await this.tif.source.loadBytes(offset - leaderBytes, leaderBytes);
414
- return { offset, imageSize: this.tif.source.getUint(offset - leaderBytes, leaderBytes) };
447
+ const bytes = await this.tiff.source.fetch(offset - leaderBytes, leaderBytes);
448
+ return { offset, imageSize: getUint(new DataView(bytes), 0, leaderBytes, this.tiff.isLittleEndian) };
415
449
  }
416
450
  const byteCounts = this.tags.get(TiffTag.TileByteCounts);
417
- if (byteCounts == null) {
451
+ if (byteCounts == null)
418
452
  throw new Error('No tile byte counts found');
419
- }
420
- const [offset, imageSize] = await Promise.all([this.getTileOffset(index), byteCounts.getValueAt(index)]);
453
+ const [offset, imageSize] = await Promise.all([
454
+ getOffset(this.tiff, this.tileOffset, index),
455
+ getOffset(this.tiff, byteCounts, index),
456
+ ]);
421
457
  return { offset, imageSize };
422
458
  }
423
459
  }
424
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29nLnRpZmYuaW1hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY29nLnRpZmYuaW1hZ2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxZQUFZLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNyRSxPQUFPLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBRTdELE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUU3RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFHaEQsd0JBQXdCO0FBQ3hCLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLEtBQUssQ0FBQztBQXNCM0MsTUFBTSxPQUFPLFlBQVk7SUFjckIsWUFBWSxHQUFZLEVBQUUsRUFBVSxFQUFFLElBQWtDO1FBTHhFLHNDQUFzQztRQUM5QixrQkFBYSxHQUFHLEtBQUssQ0FBQztRQUM5QixpREFBaUQ7UUFDakQsWUFBTyxHQUFxQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBR2xELElBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO1FBQ2YsSUFBSSxDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUM7UUFDYixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNyQixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUs7UUFDMUIsTUFBTSxZQUFZLEdBQUc7WUFDakIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsV0FBVyxDQUFDO1lBQy9CLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFdBQVcsQ0FBQztZQUMvQixJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUM7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDO1lBQ25DLElBQUks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QyxrQkFBa0IsQ0FBQztRQUN4RCxJQUFJLFdBQVcsRUFBRTtZQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUMvQywyQkFBMkI7WUFDM0IsSUFBSSxNQUFNLEtBQUssQ0FBQztnQkFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxTQUFTLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFFckQsdUVBQXVFO1lBQ3ZFLDJEQUEyRDtZQUMzRCxNQUFNLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1lBQ25FLE9BQU8sRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7U0FDNUY7UUFFRCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFxQixDQUFDO1FBQzdFLElBQUksVUFBVSxJQUFJLElBQUksRUFBRTtZQUNwQixNQUFNLElBQUksS0FBSyxDQUFDLDJCQUEyQixDQUFDLENBQUM7U0FDaEQ7UUFDRCxNQUFNLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxDQUFDLEVBQUUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDekcsT0FBTyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNqQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb2dUaWZmIH0gZnJvbSAnLi9jb2cudGlmZi5qcyc7XG5pbXBvcnQgeyBUaWZmQ29tcHJlc3Npb24sIFRpZmZNaW1lVHlwZSB9IGZyb20gJy4vY29uc3QvdGlmZi5taW1lLmpzJztcbmltcG9ydCB7IFRpZmZUYWcsIFRpZmZUYWdHZW8gfSBmcm9tICcuL2NvbnN0L3RpZmYudGFnLmlkLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdCYXNlIH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5iYXNlLmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdMYXp5IH0gZnJvbSAnLi9yZWFkL3RhZy90aWZmLnRhZy5sYXp5LmpzJztcbmltcG9ydCB7IENvZ1RpZmZUYWdPZmZzZXQgfSBmcm9tICcuL3JlYWQvdGFnL3RpZmYudGFnLm9mZnNldC5qcyc7XG5pbXBvcnQgeyBDb2dUaWZmVGFnIH0gZnJvbSAnLi9yZWFkL3RpZmYudGFnLmpzJztcbmltcG9ydCB7IEJvdW5kaW5nQm94LCBTaXplIH0gZnJvbSAnLi92ZWN0b3IuanMnO1xuXG4vKiogSW52YWxpZCBFUFNHIGNvZGUgKi9cbmV4cG9ydCBjb25zdCBJbnZhbGlkUHJvamVjdGlvbkNvZGUgPSAzMjc2NztcblxuLyoqXG4gKiBOdW1iZXIgb2YgdGlsZXMgdXNlZCBpbnNpZGUgdGhpcyBpbWFnZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVkQ291bnQge1xuICAgIC8qKiBOdW1iZXIgb2YgdGlsZXMgb24gdGhlIHggYXhpcyAqL1xuICAgIHg6IG51bWJlcjtcbiAgICAvKiogTnVtYmVyIG9mIHRpbGVzIG9uIHRoZSB5IGF4aXMgKi9cbiAgICB5OiBudW1iZXI7XG59XG5cbi8qKlxuICogU2l6ZSBvZiBhIGluZGl2aWR1YWwgdGlsZVxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAvKiogVGlsZSB3aWR0aCAocGl4ZWxzKSAqL1xuICAgIHdpZHRoOiBudW1iZXI7XG4gICAgLyoqIFRpbGUgaGVpZ2h0IChwaXhlbHMpICovXG4gICAgaGVpZ2h0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBjbGFzcyBDb2dUaWZmSW1hZ2Uge1xuICAgIC8qKiBBbGwgSUZEIHRhZ3MgdGhhdCBoYXZlIGJlZW4gcmVhZCBmb3IgdGhlIGltYWdlICovXG4gICAgdGFnczogTWFwPFRpZmZUYWcsIENvZ1RpZmZUYWdCYXNlPjtcblxuICAgIC8qKiBJZCBvZiB0aGUgdGlmIGltYWdlLCBnZW5lcmFsbHkgdGhlIGltYWdlIGluZGV4IGluc2lkZSB0aGUgdGlmICovXG4gICAgaWQ6IG51bWJlcjtcblxuICAgIHRpZjogQ29nVGlmZjtcblxuICAgIC8qKiBIYXMgbG9hZEdlb1RpZmZUYWdzIGJlZW4gY2FsbGVkICovXG4gICAgcHJpdmF0ZSB0YWdzR2VvTG9hZGVkID0gZmFsc2U7XG4gICAgLyoqIFN1YiB0YWdzIHN0b3JlZCBpbiBUaWZmVGFnLkdlb0tleURpcmVjdG9yeSAqL1xuICAgIHRhZ3NHZW86IE1hcDxUaWZmVGFnR2VvLCBzdHJpbmcgfCBudW1iZXI+ID0gbmV3IE1hcCgpO1xuXG4gICAgY29uc3RydWN0b3IodGlmOiBDb2dUaWZmLCBpZDogbnVtYmVyLCB0YWdzOiBNYXA8VGlmZlRhZywgQ29nVGlmZlRhZ0Jhc2U+KSB7XG4gICAgICAgIHRoaXMudGlmID0gdGlmO1xuICAgICAgICB0aGlzLmlkID0gaWQ7XG4gICAgICAgIHRoaXMudGFncyA9IHRhZ3M7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRm9yY2UgbG9hZGluZyBvZiBpbXBvcnRhbnQgdGFncyBpZiB0aGV5IGhhdmUgbm90IGFscmVhZHkgYmVlbiBsb2FkZWRcbiAgICAgKlxuICAgICAqIEBwYXJhbSBsb2FkR2VvVGFncyBXaGV0aGVyIHRvIGxvYWQgdGhlIEdlb0tleURpcmVjdG9yeSBhbmQgdW5wYWNrIGl0XG4gICAgICovXG4gICAgYXN5bmMgaW5pdChsb2FkR2VvVGFncyA9IGZhbHNlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IHJlcXVpcmVkVGFncyA9IFtcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goVGlmZlRhZy5Db21wcmVzc2lvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuSW1hZ2VIZWlnaHQpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkltYWdlV2lkdGgpLFxuICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUaWVQb2ludCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbiksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZUhlaWdodCksXG4gICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuVGlsZVdpZHRoKSxcbiAgICAgICAgXTtcblxuICAgICAgICBpZiAobG9hZEdlb1RhZ3MpIHtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9LZXlEaXJlY3RvcnkpKTtcbiAgICAgICAgICAgIHJlcXVpcmVkVGFncy5wdXNoKHRoaXMuZmV0Y2goVGlmZlRhZy5HZW9Bc2NpaVBhcmFtcykpO1xuICAgICAgICAgICAgcmVxdWlyZWRUYWdzLnB1c2godGhpcy5mZXRjaChUaWZmVGFnLkdlb0RvdWJsZVBhcmFtcykpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXdhaXQgUHJvbWlzZS5hbGwocmVxdWlyZWRUYWdzKTtcbiAgICAgICAgaWYgKGxvYWRHZW9UYWdzKSB7XG4gICAgICAgICAgICBhd2FpdCB0aGlzLmxvYWRHZW9UaWZmVGFncygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSB2YWx1ZSBvZiBhIFRpZmZUYWcgaWYgaXQgZXhpc3RzIG51bGwgb3RoZXJ3aXNlXG4gICAgICovXG4gICAgdmFsdWU8VD4odGFnOiBUaWZmVGFnKTogVCB8IG51bGwge1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KHRhZyk7XG4gICAgICAgIGlmIChzb3VyY2VUYWcgPT0gbnVsbCkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBzb3VyY2VUYWcudmFsdWUgYXMgVDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIGFuZCB1bnBhY2sgdGhlIEdlb0tleURpcmVjdG9yeVxuICAgICAqL1xuICAgIGFzeW5jIGxvYWRHZW9UaWZmVGFncygpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgLy8gQWxyZWFkeSBsb2FkZWRcbiAgICAgICAgaWYgKHRoaXMudGFnc0dlb0xvYWRlZCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBzb3VyY2VUYWcgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuR2VvS2V5RGlyZWN0b3J5KTtcbiAgICAgICAgaWYgKHNvdXJjZVRhZyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLnRhZ3NHZW9Mb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc291cmNlVGFnLmlzUmVhZHkgJiYgc291cmNlVGFnIGluc3RhbmNlb2YgQ29nVGlmZlRhZ0xhenkpIHtcbiAgICAgICAgICAgIC8vIExvYWQgYWxsIHRoZSByZXF1aXJlZCBrZXlzXG4gICAgICAgICAgICBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0tleURpcmVjdG9yeSksXG4gICAgICAgICAgICAgICAgdGhpcy5mZXRjaChUaWZmVGFnLkdlb0FzY2lpUGFyYW1zKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKFRpZmZUYWcuR2VvRG91YmxlUGFyYW1zKSxcbiAgICAgICAgICAgIF0pO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudGFnc0dlb0xvYWRlZCA9IHRydWU7XG4gICAgICAgIGlmIChzb3VyY2VUYWcudmFsdWUgPT0gbnVsbCkgcmV0dXJuO1xuICAgICAgICBjb25zdCBnZW9UYWdzID0gc291cmNlVGFnLnZhbHVlO1xuICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoZ2VvVGFncykpIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBnZW8gdGFncyBmb3VuZCcpO1xuICAgICAgICBmb3IgKGxldCBpID0gNDsgaSA8PSBnZW9UYWdzWzNdICogNDsgaSArPSA0KSB7XG4gICAgICAgICAgICBjb25zdCBrZXkgPSBnZW9UYWdzW2ldIGFzIFRpZmZUYWdHZW87XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbiA9IGdlb1RhZ3NbaSArIDFdO1xuXG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBnZW9UYWdzW2kgKyAzXTtcblxuICAgICAgICAgICAgaWYgKGxvY2F0aW9uID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIG9mZnNldCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0YWcgPSB0aGlzLnRhZ3MuZ2V0KGxvY2F0aW9uKTtcbiAgICAgICAgICAgIGlmICh0YWcgPT0gbnVsbCB8fCB0YWcudmFsdWUgPT0gbnVsbCkgY29udGludWU7XG4gICAgICAgICAgICBjb25zdCBjb3VudCA9IGdlb1RhZ3NbaSArIDJdO1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGFnLnZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHRoaXMudGFnc0dlby5zZXQoa2V5LCB0YWcudmFsdWVbb2Zmc2V0ICsgY291bnQgLSAxXSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB0YWcudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdzR2VvLnNldChrZXksIHRhZy52YWx1ZS5zdWJzdHIob2Zmc2V0LCBvZmZzZXQgKyBjb3VudCAtIDEpLnRyaW0oKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgdGhlIGFzc29jaWF0ZWQgR2VvVGlmZlRhZ3NcbiAgICAgKi9cbiAgICB2YWx1ZUdlbyh0YWc6IFRpZmZUYWdHZW8pOiBzdHJpbmcgfCBudW1iZXIgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAodGhpcy50YWdzR2VvTG9hZGVkID09PSBmYWxzZSkgdGhyb3cgbmV3IEVycm9yKCdsb2FkR2VvVGlmZlRhZ3MoKSBoYXMgbm90IGJlZW4gY2FsbGVkJyk7XG4gICAgICAgIHJldHVybiB0aGlzLnRhZ3NHZW8uZ2V0KHRhZyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTG9hZCBhIHRhZywgaWYgaXQgaXMgbm90IGN1cnJlbnRseSBsb2FkZWQsIGZldGNoIHRoZSByZXF1aXJlZCBkYXRhIGZvciB0aGUgdGFnLlxuICAgICAqIEBwYXJhbSB0YWcgdGFnIHRvIGZldGNoXG4gICAgICovXG4gICAgcHVibGljIGFzeW5jIGZldGNoPFQ+KHRhZzogVGlmZlRhZyk6IFByb21pc2U8VCB8IG51bGw+IHtcbiAgICAgICAgY29uc3Qgc291cmNlVGFnID0gdGhpcy50YWdzLmdldCh0YWcpO1xuICAgICAgICBpZiAoc291cmNlVGFnID09IG51bGwpIHJldHVybiBudWxsO1xuICAgICAgICBpZiAoQ29nVGlmZlRhZy5pc0xhenkoc291cmNlVGFnKSkgcmV0dXJuIHNvdXJjZVRhZy5mZXRjaCgpIGFzIGFueTtcbiAgICAgICAgcmV0dXJuIHNvdXJjZVRhZy52YWx1ZSBhcyBUO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgb3JpZ2luIHBvaW50IGZvciB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG9yaWdpbiBwb2ludCBvZiB0aGUgaW1hZ2VcbiAgICAgKi9cbiAgICBnZXQgb3JpZ2luKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHRpZVBvaW50czogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRpZVBvaW50KTtcbiAgICAgICAgaWYgKHRpZVBvaW50cyAhPSBudWxsICYmIHRpZVBvaW50cy5sZW5ndGggPT09IDYpIHtcbiAgICAgICAgICAgIHJldHVybiBbdGllUG9pbnRzWzNdLCB0aWVQb2ludHNbNF0sIHRpZVBvaW50c1s1XV07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtb2RlbFRyYW5zZm9ybWF0aW9uID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5Nb2RlbFRyYW5zZm9ybWF0aW9uKTtcbiAgICAgICAgaWYgKG1vZGVsVHJhbnNmb3JtYXRpb24gIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFRyYW5zZm9ybWF0aW9uWzNdLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzddLCBtb2RlbFRyYW5zZm9ybWF0aW9uWzExXV07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiB0aGlzIGlzIGEgc3ViIGltYWdlLCB1c2UgdGhlIG9yaWdpbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudGlmLmltYWdlc1swXS5vcmlnaW47XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ltYWdlIGRvZXMgbm90IGhhdmUgYSBnZW8gdHJhbnNmb3JtYXRpb24uJyk7XG4gICAgfVxuXG4gICAgLyoqIElzIHRoZXJlIGVub3VnaCBnZW8gaW5mb3JtYXRpb24gb24gdGhpcyBpbWFnZSB0byBmaWd1cmUgb3V0IHdoZXJlIGl0cyBhY3R1YWxseSBsb2NhdGVkICovXG4gICAgZ2V0IGlzR2VvTG9jYXRlZCgpOiBib29sZWFuIHtcbiAgICAgICAgY29uc3QgaXNJbWFnZUxvY2F0ZWQgPVxuICAgICAgICAgICAgdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSkgIT0gbnVsbCB8fCB0aGlzLnZhbHVlKFRpZmZUYWcuTW9kZWxUcmFuc2Zvcm1hdGlvbikgIT0gbnVsbDtcbiAgICAgICAgaWYgKGlzSW1hZ2VMb2NhdGVkKSByZXR1cm4gdHJ1ZTtcbiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIHN1YiBpbWFnZSwgdXNlIHRoZSBpc0dlb0xvY2F0ZWQgZnJvbSB0aGUgdG9wIGxldmVsIGltYWdlXG4gICAgICAgIGlmICh0aGlzLnZhbHVlKFRpZmZUYWcuTmV3U3ViRmlsZVR5cGUpID09PSAxICYmIHRoaXMuaWQgIT09IDApIHJldHVybiB0aGlzLnRpZi5pbWFnZXNbMF0uaXNHZW9Mb2NhdGVkO1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSByZXNvbHV0aW9uIG9mIHRoZSBpbWFnZVxuICAgICAqXG4gICAgICogQHJldHVybnMgW3gseSx6XSBwaXhlbCBzY2FsZVxuICAgICAqL1xuICAgIGdldCByZXNvbHV0aW9uKCk6IFtudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IG1vZGVsUGl4ZWxTY2FsZTogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsUGl4ZWxTY2FsZSk7XG4gICAgICAgIGlmIChtb2RlbFBpeGVsU2NhbGUgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIFttb2RlbFBpeGVsU2NhbGVbMF0sIC1tb2RlbFBpeGVsU2NhbGVbMV0sIG1vZGVsUGl4ZWxTY2FsZVsyXV07XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWxUcmFuc2Zvcm1hdGlvbjogbnVtYmVyW10gfCBudWxsID0gdGhpcy52YWx1ZShUaWZmVGFnLk1vZGVsVHJhbnNmb3JtYXRpb24pO1xuICAgICAgICBpZiAobW9kZWxUcmFuc2Zvcm1hdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gW21vZGVsVHJhbnNmb3JtYXRpb25bMF0sIG1vZGVsVHJhbnNmb3JtYXRpb25bNV0sIG1vZGVsVHJhbnNmb3JtYXRpb25bMTBdXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoaXMgaXMgYSBzdWIgaW1hZ2UsIHVzZSB0aGUgcmVzb2x1dGlvbiBmcm9tIHRoZSB0b3AgbGV2ZWwgaW1hZ2VcbiAgICAgICAgaWYgKHRoaXMudmFsdWUoVGlmZlRhZy5OZXdTdWJGaWxlVHlwZSkgPT09IDEgJiYgdGhpcy5pZCAhPT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWcgPSB0aGlzLnRpZi5pbWFnZXNbMF07XG4gICAgICAgICAgICBjb25zdCBbcmVzWCwgcmVzWSwgcmVzWl0gPSBmaXJzdEltZy5yZXNvbHV0aW9uO1xuICAgICAgICAgICAgY29uc3QgZmlyc3RJbWdTaXplID0gZmlyc3RJbWcuc2l6ZTtcbiAgICAgICAgICAgIGNvbnN0IGltZ1NpemUgPSB0aGlzLnNpemU7XG4gICAgICAgICAgICAvLyBzY2FsZSByZXNvbHV0aW9uIGJhc2VkIG9uIHRoZSBzaXplIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGltYWdlc1xuICAgICAgICAgICAgcmV0dXJuIFsocmVzWCAqIGZpcnN0SW1nU2l6ZS53aWR0aCkgLyBpbWdTaXplLndpZHRoLCAocmVzWSAqIGZpcnN0SW1nU2l6ZS5oZWlnaHQpIC8gaW1nU2l6ZS5oZWlnaHQsIHJlc1pdO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbWFnZSBkb2VzIG5vdCBoYXZlIGEgZ2VvIHRyYW5zZm9ybWF0aW9uLicpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEJvdW5kaW5nIGJveCBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFttaW5YLCBtaW5ZLCBtYXhYLCBtYXhZXSBib3VuZGluZyBib3hcbiAgICAgKi9cbiAgICBnZXQgYmJveCgpOiBbbnVtYmVyLCBudW1iZXIsIG51bWJlciwgbnVtYmVyXSB7XG4gICAgICAgIGNvbnN0IHNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMub3JpZ2luO1xuICAgICAgICBjb25zdCByZXNvbHV0aW9uID0gdGhpcy5yZXNvbHV0aW9uO1xuXG4gICAgICAgIGlmIChvcmlnaW4gPT0gbnVsbCB8fCBzaXplID09IG51bGwgfHwgcmVzb2x1dGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBjYWxjdWxhdGUgYm91bmRpbmcgYm94Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB4MSA9IG9yaWdpblswXTtcbiAgICAgICAgY29uc3QgeTEgPSBvcmlnaW5bMV07XG5cbiAgICAgICAgY29uc3QgeDIgPSB4MSArIHJlc29sdXRpb25bMF0gKiBzaXplLndpZHRoO1xuICAgICAgICBjb25zdCB5MiA9IHkxICsgcmVzb2x1dGlvblsxXSAqIHNpemUuaGVpZ2h0O1xuXG4gICAgICAgIHJldHVybiBbTWF0aC5taW4oeDEsIHgyKSwgTWF0aC5taW4oeTEsIHkyKSwgTWF0aC5tYXgoeDEsIHgyKSwgTWF0aC5tYXgoeTEsIHkyKV07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBjb21wcmVzc2lvbiB1c2VkIGJ5IHRoZSB0aWxlXG4gICAgICpcbiAgICAgKiBAc2VlIFRpZmZDb21wcmVzc2lvblxuICAgICAqXG4gICAgICogQHJldHVybnMgQ29tcHJlc3Npb24gdHlwZSBlZyB3ZWJwXG4gICAgICovXG4gICAgZ2V0IGNvbXByZXNzaW9uKCk6IFRpZmZNaW1lVHlwZSB8IG51bGwge1xuICAgICAgICBjb25zdCBjb21wcmVzc2lvbiA9IHRoaXMudmFsdWUoVGlmZlRhZy5Db21wcmVzc2lvbik7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PSBudWxsIHx8IHR5cGVvZiBjb21wcmVzc2lvbiAhPT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBUaWZmQ29tcHJlc3Npb25bY29tcHJlc3Npb25dO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEF0dGVtcHQgdG8gcmVhZCB0aGUgRVBTRyBDb2RlIGZyb20gVGlmZkdlb1RhZ3NcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIEVQU0cgQ29kZSBpZiBpdCBleGlzdHNcbiAgICAgKi9cbiAgICBnZXQgZXBzZygpOiBudW1iZXIgfCBudWxsIHtcbiAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRoaXMudmFsdWVHZW8oVGlmZlRhZ0dlby5Qcm9qZWN0ZWRDU1R5cGVHZW9LZXkpIGFzIG51bWJlcjtcbiAgICAgICAgaWYgKHByb2plY3Rpb24gPT09IEludmFsaWRQcm9qZWN0aW9uQ29kZSkgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBwcm9qZWN0aW9uO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgc2l6ZSBvZiB0aGUgaW1hZ2VcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIFNpemUgaW4gcGl4ZWxzXG4gICAgICovXG4gICAgZ2V0IHNpemUoKTogU2l6ZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB3aWR0aDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuSW1hZ2VXaWR0aCkgYXMgbnVtYmVyLFxuICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5JbWFnZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbGlzdCBvZiBJRkQgdGFncyB0aGF0IHdlcmUgcmVhZFxuICAgICAqL1xuICAgIGdldCB0YWdMaXN0KCk6IHN0cmluZ1tdIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLnRhZ3Mua2V5cygpXS5tYXAoKGMpID0+IFRpZmZUYWdbY10pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIERldGVybWluZSBpZiB0aGlzIGltYWdlIGlzIHRpbGVkXG4gICAgICovXG4gICAgcHVibGljIGlzVGlsZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLnZhbHVlKFRpZmZUYWcuVGlsZVdpZHRoKSAhPT0gbnVsbDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBHZXQgc2l6ZSBvZiBpbmRpdmlkdWFsIHRpbGVzXG4gICAgICovXG4gICAgZ2V0IHRpbGVTaXplKCk6IENvZ1RpZmZJbWFnZVRpbGVTaXplIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHdpZHRoOiB0aGlzLnZhbHVlPG51bWJlcj4oVGlmZlRhZy5UaWxlV2lkdGgpIGFzIG51bWJlcixcbiAgICAgICAgICAgIGhlaWdodDogdGhpcy52YWx1ZTxudW1iZXI+KFRpZmZUYWcuVGlsZUhlaWdodCkgYXMgbnVtYmVyLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE51bWJlciBvZiB0aWxlcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIGltYWdlXG4gICAgICovXG4gICAgZ2V0IHRpbGVDb3VudCgpOiBDb2dUaWZmSW1hZ2VUaWxlZENvdW50IHtcbiAgICAgICAgY29uc3Qgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgICAgICAgY29uc3QgdGlsZVNpemUgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCB4ID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlU2l6ZS53aWR0aCk7XG4gICAgICAgIGNvbnN0IHkgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlU2l6ZS5oZWlnaHQpO1xuICAgICAgICByZXR1cm4geyB4LCB5IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBwb2ludGVyIHRvIHdoZXJlIHRoZSB0aWxlcyBzdGFydCBpbiB0aGUgVGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcmVtYXJrcyBVc2VkIHRvIHJlYWQgdGlsZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IHRvIHdoZXJlIHRoZSB0aWZmcyBhcmUgc3RvcmVkXG4gICAgICovXG4gICAgZ2V0IHRpbGVPZmZzZXQoKTogQ29nVGlmZlRhZ09mZnNldCB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuVGlsZU9mZnNldHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGlmICh0aWxlT2Zmc2V0ID09IG51bGwpIHRocm93IG5ldyBFcnJvcignTm8gdGlsZSBvZmZzZXRzIGZvdW5kJyk7XG4gICAgICAgIHJldHVybiB0aWxlT2Zmc2V0O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbnVtYmVyIG9mIHN0cmlwJ3MgaW5zaWRlIHRoaXMgdGlmZlxuICAgICAqXG4gICAgICogQHJlbWFya3MgVXNlZCB0byByZWFkIHN0cmlwZWQgdGlmZnNcbiAgICAgKlxuICAgICAqIEByZXR1cm5zIG51bWJlciBvZiBzdHJpcHMgcHJlc2VudFxuICAgICAqL1xuICAgIGdldCBzdHJpcENvdW50KCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHRpbGVPZmZzZXQgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAodGlsZU9mZnNldCA9PSBudWxsKSByZXR1cm4gMDtcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZGF0YUNvdW50O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEdldCBhIHBvaW50ZXIgdG8gYSBzcGVjaWZpYyB0aWxlIGluc2lkZSB0aGUgdGlmZiBmaWxlXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaW5kZXggdGlsZSBpbmRleFxuICAgICAqIEByZXR1cm5zIGZpbGUgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgdGlsZVxuICAgICAqL1xuICAgIHByb3RlY3RlZCBhc3luYyBnZXRUaWxlT2Zmc2V0KGluZGV4OiBudW1iZXIpOiBQcm9taXNlPG51bWJlcj4ge1xuICAgICAgICBjb25zdCB0aWxlT2Zmc2V0ID0gdGhpcy50aWxlT2Zmc2V0O1xuICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gdGlsZU9mZnNldC5kYXRhQ291bnQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGlsZSBvZmZzZXQ6ICR7aW5kZXh9IG91dCBvZiByYW5nZTogMCAtPiAke3RpbGVPZmZzZXQuZGF0YUNvdW50fWApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmV0Y2ggb25seSB0aGUgcGFydCBvZiB0aGUgb2Zmc2V0cyB0aGF0IGFyZSBuZWVkZWRcbiAgICAgICAgcmV0dXJuIHRpbGVPZmZzZXQuZ2V0VmFsdWVBdChpbmRleCk7XG4gICAgfVxuXG4gICAgLy8gQ2xhbXAgdGhlIGJvdW5kcyBvZiB0aGUgb3V0cHV0IGltYWdlIHRvIHRoZSBzaXplIG9mIHRoZSBpbWFnZSwgYXMgc29tZXRpbWVzIHRoZSBlZGdlIHRpbGVzIGFyZSBub3QgZnVsbCB0aWxlc1xuICAgIGdldFRpbGVCb3VuZHMoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBCb3VuZGluZ0JveCB7XG4gICAgICAgIGNvbnN0IHsgc2l6ZSwgdGlsZVNpemUgfSA9IHRoaXM7XG4gICAgICAgIGNvbnN0IHRvcCA9IHkgKiB0aWxlU2l6ZS5oZWlnaHQ7XG4gICAgICAgIGNvbnN0IGxlZnQgPSB4ICogdGlsZVNpemUud2lkdGg7XG4gICAgICAgIGNvbnN0IHdpZHRoID0gbGVmdCArIHRpbGVTaXplLndpZHRoID49IHNpemUud2lkdGggPyBzaXplLndpZHRoIC0gbGVmdCA6IHRpbGVTaXplLndpZHRoO1xuICAgICAgICBjb25zdCBoZWlnaHQgPSB0b3AgKyB0aWxlU2l6ZS5oZWlnaHQgPj0gc2l6ZS5oZWlnaHQgPyBzaXplLmhlaWdodCAtIHRvcCA6IHRpbGVTaXplLmhlaWdodDtcbiAgICAgICAgcmV0dXJuIHsgeDogbGVmdCwgeTogdG9wLCB3aWR0aCwgaGVpZ2h0IH07XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHN0cmlwIGludG8gYSB1aW50OCBhcnJheVxuICAgICAqXG4gICAgICogQHBhcmFtIGluZGV4IFN0cmlwIGluZGV4IHRvIHJlYWRcbiAgICAgKi9cbiAgICBhc3luYyBnZXRTdHJpcChpbmRleDogbnVtYmVyKTogUHJvbWlzZTx7IG1pbWVUeXBlOiBUaWZmTWltZVR5cGU7IGJ5dGVzOiBVaW50OEFycmF5IH0gfCBudWxsPiB7XG4gICAgICAgIGlmICh0aGlzLmlzVGlsZWQoKSkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcGVzLCB0aWZmIGlzIHRpbGVkJyk7XG5cbiAgICAgICAgY29uc3QgYnl0ZUNvdW50cyA9IHRoaXMudGFncy5nZXQoVGlmZlRhZy5TdHJpcEJ5dGVDb3VudHMpIGFzIENvZ1RpZmZUYWdPZmZzZXQ7XG4gICAgICAgIGNvbnN0IG9mZnNldHMgPSB0aGlzLnRhZ3MuZ2V0KFRpZmZUYWcuU3RyaXBPZmZzZXRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuXG4gICAgICAgIGlmIChpbmRleCA+PSBieXRlQ291bnRzLmRhdGFDb3VudCkgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgcmVhZCBzdHJpcCwgaW5kZXggb3V0IG9mIGJvdW5kcycpO1xuXG4gICAgICAgIGNvbnN0IFtieXRlQ291bnQsIG9mZnNldF0gPSBhd2FpdCBQcm9taXNlLmFsbChbb2Zmc2V0cy5nZXRWYWx1ZUF0KGluZGV4KSwgYnl0ZUNvdW50cy5nZXRWYWx1ZUF0KGluZGV4KV0pO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhieXRlQ291bnQsIG9mZnNldCk7XG4gICAgfVxuXG4gICAgLyoqIFRoZSBqcGVnIGhlYWRlciBpcyBzdG9yZWQgaW4gdGhlIElGRCwgcmVhZCB0aGUgSlBFRyBoZWFkZXIgYW5kIGFkanVzdCB0aGUgYnl0ZSBhcnJheSB0byBpbmNsdWRlIGl0ICovXG4gICAgcHJpdmF0ZSBnZXRKcGVnSGVhZGVyKGJ5dGVzOiBVaW50OEFycmF5KTogVWludDhBcnJheSB7XG4gICAgICAgIC8vIEJvdGggdGhlIEpQRUdUYWJsZSBhbmQgdGhlIEJ5dGVzIHdpdGggaGF2ZSB0aGUgc3RhcnQgb2YgaW1hZ2UgYW5kIGVuZCBvZiBpbWFnZSBtYXJrZXJzXG4gICAgICAgIC8vIFN0YXJ0T2ZJbWFnZSAweGZmZDggRW5kT2ZJbWFnZSAweGZmZDlcbiAgICAgICAgY29uc3QgdGFibGVzID0gdGhpcy52YWx1ZTxudW1iZXJbXT4oVGlmZlRhZy5KUEVHVGFibGVzKTtcbiAgICAgICAgaWYgKHRhYmxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBmaW5kIEpwZWcgaGVhZGVyJyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIEVuZE9mSW1hZ2UgbWFya2VyXG4gICAgICAgIGNvbnN0IHRhYmxlRGF0YSA9IHRhYmxlcy5zbGljZSgwLCB0YWJsZXMubGVuZ3RoIC0gMik7XG4gICAgICAgIGNvbnN0IGFjdHVhbEJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMuYnl0ZUxlbmd0aCArIHRhYmxlRGF0YS5sZW5ndGggLSAyKTtcbiAgICAgICAgYWN0dWFsQnl0ZXMuc2V0KHRhYmxlRGF0YSwgMCk7XG4gICAgICAgIGFjdHVhbEJ5dGVzLnNldChieXRlcy5zbGljZSgyKSwgdGFibGVEYXRhLmxlbmd0aCk7XG4gICAgICAgIHJldHVybiBhY3R1YWxCeXRlcztcbiAgICB9XG5cbiAgICAvKiogUmVhZCBpbWFnZSBieXRlcyBhdCB0aGUgZ2l2ZW4gb2Zmc2V0ICovXG4gICAgcHJpdmF0ZSBhc3luYyBnZXRCeXRlcyhcbiAgICAgICAgb2Zmc2V0OiBudW1iZXIsXG4gICAgICAgIGJ5dGVDb3VudDogbnVtYmVyLFxuICAgICk6IFByb21pc2U8eyBtaW1lVHlwZTogVGlmZk1pbWVUeXBlOyBieXRlczogVWludDhBcnJheSB9IHwgbnVsbD4ge1xuICAgICAgICBjb25zdCBtaW1lVHlwZSA9IHRoaXMuY29tcHJlc3Npb247XG4gICAgICAgIGlmIChtaW1lVHlwZSA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1Vuc3VwcG9ydGVkIGNvbXByZXNzaW9uOiAnICsgdGhpcy52YWx1ZShUaWZmVGFnLkNvbXByZXNzaW9uKSk7XG4gICAgICAgIGlmIChieXRlQ291bnQgPT09IDApIHJldHVybiBudWxsO1xuXG4gICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0LCBieXRlQ291bnQpO1xuICAgICAgICBjb25zdCBieXRlcyA9IHRoaXMudGlmLnNvdXJjZS5ieXRlcyhvZmZzZXQsIGJ5dGVDb3VudCk7XG5cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3Npb24gPT09IFRpZmZNaW1lVHlwZS5KUEVHKSB7XG4gICAgICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXM6IHRoaXMuZ2V0SnBlZ0hlYWRlcihieXRlcykgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBtaW1lVHlwZSwgYnl0ZXMgfTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb2FkIHRoZSB0aWxlIGJ1ZmZlciwgdGhpcyB3b3JrcyBiZXN0IHdpdGggd2VicFxuICAgICAqXG4gICAgICogVGhpcyB3aWxsIGFsc28gYXBwbHkgdGhlIEpQRUcgY29tcHJlc3Npb24gdGFibGVzXG4gICAgICpcbiAgICAgKiBAcGFyYW0geCBUaWxlIHggb2Zmc2V0XG4gICAgICogQHBhcmFtIHkgVGlsZSB5IG9mZnNldFxuICAgICAqL1xuICAgIGFzeW5jIGdldFRpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPHsgbWltZVR5cGU6IFRpZmZNaW1lVHlwZTsgYnl0ZXM6IFVpbnQ4QXJyYXkgfSB8IG51bGw+IHtcbiAgICAgICAgY29uc3QgbWltZVR5cGUgPSB0aGlzLmNvbXByZXNzaW9uO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuICAgICAgICBjb25zdCB0aWxlcyA9IHRoaXMudGlsZVNpemU7XG5cbiAgICAgICAgaWYgKHRpbGVzID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVGlmZiBpcyBub3QgdGlsZWQnKTtcbiAgICAgICAgaWYgKG1pbWVUeXBlID09IG51bGwpIHRocm93IG5ldyBFcnJvcignVW5zdXBwb3J0ZWQgY29tcHJlc3Npb246ICcgKyB0aGlzLnZhbHVlKFRpZmZUYWcuQ29tcHJlc3Npb24pKTtcblxuICAgICAgICAvLyBUT0RPIHN1cHBvcnQgR2hvc3RPcHRpb25UaWxlT3JkZXJcbiAgICAgICAgY29uc3QgbnlUaWxlcyA9IE1hdGguY2VpbChzaXplLmhlaWdodCAvIHRpbGVzLmhlaWdodCk7XG4gICAgICAgIGNvbnN0IG54VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS53aWR0aCAvIHRpbGVzLndpZHRoKTtcblxuICAgICAgICBpZiAoeCA+PSBueFRpbGVzIHx8IHkgPj0gbnlUaWxlcykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaWxlIGluZGV4IGlzIG91dHNpZGUgb2YgcmFuZ2UgeDoke3h9ID49ICR7bnhUaWxlc30gb3IgeToke3l9ID49ICR7bnlUaWxlc31gKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgdG90YWxUaWxlcyA9IG54VGlsZXMgKiBueVRpbGVzO1xuICAgICAgICBpZiAoaWR4ID49IHRvdGFsVGlsZXMpIHRocm93IG5ldyBFcnJvcihgVGlsZSBpbmRleCBpcyBvdXRzaWRlIG9mIHRpbGUgcmFuZ2U6ICR7aWR4fSA+PSAke3RvdGFsVGlsZXN9YCk7XG5cbiAgICAgICAgY29uc3QgeyBvZmZzZXQsIGltYWdlU2l6ZSB9ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRCeXRlcyhvZmZzZXQsIGltYWdlU2l6ZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogRG9lcyB0aGlzIHRpbGUgZXhpc3QgaW4gdGhlIHRpZmYgYW5kIGRvZXMgaXQgYWN0dWFsbHkgaGF2ZSBhIHZhbHVlXG4gICAgICpcbiAgICAgKiBTcGFyc2UgdGlmZnMgY2FuIGhhdmUgYSBsb3Qgb2YgZW1wdHkgdGlsZXMsIHRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdGlsZSBhY3R1YWxseSBoYXMgZGF0YS5cbiAgICAgKlxuICAgICAqIEBwYXJhbSB4IFRpbGUgeCBvZmZzZXRcbiAgICAgKiBAcGFyYW0geSBUaWxlIHkgb2Zmc2V0XG4gICAgICogQHJldHVybnMgaWYgdGhlIHRpbGUgZXhpc3RzIGFuZCBoYXMgZGF0YVxuICAgICAqL1xuICAgIGFzeW5jIGhhc1RpbGUoeDogbnVtYmVyLCB5OiBudW1iZXIpOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICAgICAgY29uc3QgdGlsZXMgPSB0aGlzLnRpbGVTaXplO1xuICAgICAgICBjb25zdCBzaXplID0gdGhpcy5zaXplO1xuXG4gICAgICAgIGlmICh0aWxlcyA9PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ1RpZmYgaXMgbm90IHRpbGVkJyk7XG5cbiAgICAgICAgLy8gVE9ETyBzdXBwb3J0IEdob3N0T3B0aW9uVGlsZU9yZGVyXG4gICAgICAgIGNvbnN0IG55VGlsZXMgPSBNYXRoLmNlaWwoc2l6ZS5oZWlnaHQgLyB0aWxlcy5oZWlnaHQpO1xuICAgICAgICBjb25zdCBueFRpbGVzID0gTWF0aC5jZWlsKHNpemUud2lkdGggLyB0aWxlcy53aWR0aCk7XG4gICAgICAgIGlmICh4ID49IG54VGlsZXMgfHwgeSA+PSBueVRpbGVzKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGNvbnN0IGlkeCA9IHkgKiBueFRpbGVzICsgeDtcbiAgICAgICAgY29uc3QgcmV0ID0gYXdhaXQgdGhpcy5nZXRUaWxlU2l6ZShpZHgpO1xuICAgICAgICByZXR1cm4gcmV0Lm9mZnNldCA+IDA7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGFzeW5jIGdldFRpbGVTaXplKGluZGV4OiBudW1iZXIpOiBQcm9taXNlPHsgb2Zmc2V0OiBudW1iZXI7IGltYWdlU2l6ZTogbnVtYmVyIH0+IHtcbiAgICAgICAgLy8gR0RBTCBvcHRpbWl6ZXMgdGlsZXMgYnkgc3RvcmluZyB0aGUgc2l6ZSBvZiB0aGUgdGlsZSBpblxuICAgICAgICAvLyB0aGUgZmV3IGJ5dGVzIGxlYWRpbmcgdXAgdG8gdGhlIHRpbGVcbiAgICAgICAgY29uc3QgbGVhZGVyQnl0ZXMgPSB0aGlzLnRpZi5vcHRpb25zLnRpbGVMZWFkZXJCeXRlU2l6ZTtcbiAgICAgICAgaWYgKGxlYWRlckJ5dGVzKSB7XG4gICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBhd2FpdCB0aGlzLmdldFRpbGVPZmZzZXQoaW5kZXgpO1xuICAgICAgICAgICAgLy8gU3BhcnNlIENPRyBubyBkYXRhIGZvdW5kXG4gICAgICAgICAgICBpZiAob2Zmc2V0ID09PSAwKSByZXR1cm4geyBvZmZzZXQ6IDAsIGltYWdlU2l6ZTogMCB9O1xuXG4gICAgICAgICAgICAvLyBUaGlzIGZldGNoIHdpbGwgZ2VuZXJhbGx5IGxvYWQgaW4gdGhlIGJ5dGVzIG5lZWRlZCBmb3IgdGhlIGltYWdlIHRvb1xuICAgICAgICAgICAgLy8gcHJvdmlkZWQgdGhlIGltYWdlIHNpemUgaXMgbGVzcyB0aGFuIHRoZSBzaXplIG9mIGEgY2h1bmtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMudGlmLnNvdXJjZS5sb2FkQnl0ZXMob2Zmc2V0IC0gbGVhZGVyQnl0ZXMsIGxlYWRlckJ5dGVzKTtcbiAgICAgICAgICAgIHJldHVybiB7IG9mZnNldCwgaW1hZ2VTaXplOiB0aGlzLnRpZi5zb3VyY2UuZ2V0VWludChvZmZzZXQgLSBsZWFkZXJCeXRlcywgbGVhZGVyQnl0ZXMpIH07XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBieXRlQ291bnRzID0gdGhpcy50YWdzLmdldChUaWZmVGFnLlRpbGVCeXRlQ291bnRzKSBhcyBDb2dUaWZmVGFnT2Zmc2V0O1xuICAgICAgICBpZiAoYnl0ZUNvdW50cyA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHRpbGUgYnl0ZSBjb3VudHMgZm91bmQnKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBbb2Zmc2V0LCBpbWFnZVNpemVdID0gYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuZ2V0VGlsZU9mZnNldChpbmRleCksIGJ5dGVDb3VudHMuZ2V0VmFsdWVBdChpbmRleCldKTtcbiAgICAgICAgcmV0dXJuIHsgb2Zmc2V0LCBpbWFnZVNpemUgfTtcbiAgICB9XG59XG4iXX0=
460
+ function getOffset(tiff, x, index) {
461
+ if (index > x.count || index < 0)
462
+ throw new Error('TagIndex: out of bounds ' + x.id + ' @ ' + index);
463
+ if (x.type === 'inline') {
464
+ if (Array.isArray(x.value))
465
+ return x.value[index];
466
+ return x.value;
467
+ }
468
+ return getValueAt(tiff, x, index);
469
+ }
470
+ //# sourceMappingURL=cog.tiff.image.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cog.tiff.image.js","sourceRoot":"","sources":["../src/cog.tiff.image.ts"],"names":[],"mappings":"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"}