sliftutils 1.7.57 → 1.7.59
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +16 -3
- package/package.json +1 -1
- package/storage/backblaze.ts +5 -3
- package/storage/dist/IArchives.ts.cache +2 -2
- package/storage/dist/backblaze.ts.cache +6 -5
- package/storage/remoteStorage/createArchives.d.ts +3 -0
- package/storage/remoteStorage/createArchives.ts +30 -18
- package/storage/remoteStorage/dist/blobStore.ts.cache +2 -2
- package/storage/remoteStorage/dist/createArchives.ts.cache +33 -25
- package/storage/remoteStorage/dist/storageController.ts.cache +3 -2
- package/storage/remoteStorage/dist/storageServerState.ts.cache +52 -13
- package/storage/remoteStorage/storageController.ts +1 -0
- package/storage/remoteStorage/storageServerState.d.ts +13 -3
- package/storage/remoteStorage/storageServerState.ts +64 -13
package/index.d.ts
CHANGED
|
@@ -3185,6 +3185,7 @@ declare module "sliftutils/storage/remoteStorage/createArchives" {
|
|
|
3185
3185
|
private configured;
|
|
3186
3186
|
private activeConfig;
|
|
3187
3187
|
private statePromise;
|
|
3188
|
+
private latestState;
|
|
3188
3189
|
private initRetryDelay;
|
|
3189
3190
|
private initRetryTimer;
|
|
3190
3191
|
private pollTimer;
|
|
@@ -3259,6 +3260,8 @@ declare module "sliftutils/storage/remoteStorage/createArchives" {
|
|
|
3259
3260
|
getURL(path: string): Promise<string>;
|
|
3260
3261
|
/** Every URL that could serve this path: public sources matching both the path's route and the current valid window. The first is the write node's (first matching source in config order, see runWrite - the one guaranteed current); the rest are ranked fastest-first by measured latency. Empty when none qualify. */
|
|
3261
3262
|
getURLs(path: string): Promise<string[]>;
|
|
3263
|
+
/** getURLs, but after the one await (initialization) the returned function is synchronous: everything underneath - route hashing, window checks, latencies, URL building - is synchronous, and the closure always reads the newest adopted config, so it stays correct across config refreshes. */
|
|
3264
|
+
getGetURLs(): Promise<(path: string) => string[]>;
|
|
3262
3265
|
dispose(): void;
|
|
3263
3266
|
}
|
|
3264
3267
|
export declare function createArchives(config: RemoteConfig | RemoteConfigBase, options?: ArchivesChainOptions): ArchivesChain;
|
|
@@ -3645,7 +3648,7 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
|
|
|
3645
3648
|
routing: RemoteConfig;
|
|
3646
3649
|
routingJSON: string;
|
|
3647
3650
|
selfEntries: HostedConfig[];
|
|
3648
|
-
self:
|
|
3651
|
+
self: SelfSummary | undefined;
|
|
3649
3652
|
store: IBucketStore;
|
|
3650
3653
|
structureKey: string;
|
|
3651
3654
|
};
|
|
@@ -3653,6 +3656,16 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
|
|
|
3653
3656
|
export declare function removeExtraListenPort(port: number): void;
|
|
3654
3657
|
/** A cached IArchives for a persisted source identity: a routing URL (hosted/backblaze) or a disk folder path - the form BlobStore's sources list stores. Configuration (valid windows, routes) decides WHEN a source should be used; for reading bytes the index says a source holds, the URL alone is enough - even for sources no longer in any config. */
|
|
3655
3658
|
export declare function resolveSourceArchives(url: string): IArchives;
|
|
3659
|
+
/** Our role in a bucket's routing config, summarized across ALL currently-valid self entries. Stored instead of a single representative HostedConfig, so nothing can accidentally use one entry's route or flags where the union is required - the standard config has the same URL twice: a routed write-shard entry plus an unrouted read-everything entry. */
|
|
3660
|
+
export type SelfSummary = {
|
|
3661
|
+
/** The union of the current entries' routes, with overlapping/adjacent ranges combined - which commonly collapses to a single full range, making matching trivial. */
|
|
3662
|
+
routes: [number, number][];
|
|
3663
|
+
public: boolean;
|
|
3664
|
+
immutable: boolean;
|
|
3665
|
+
noFullSync: boolean;
|
|
3666
|
+
rawDisk: boolean;
|
|
3667
|
+
readerDiskLimit?: number;
|
|
3668
|
+
};
|
|
3656
3669
|
export declare function getLoadedBucket(account: string, bucketName: string): Promise<LoadedBucket | undefined>;
|
|
3657
3670
|
export declare function assertMutable(bucket: LoadedBucket, filePath: string, writeTime: number): Promise<void>;
|
|
3658
3671
|
export declare function writeBucketFile(account: string, bucketName: string, filePath: string, data: Buffer, config?: {
|
|
@@ -3693,9 +3706,9 @@ declare module "sliftutils/storage/remoteStorage/storageServerState" {
|
|
|
3693
3706
|
folder: string;
|
|
3694
3707
|
/** The routing config the bucket is RUNNING on, straight from memory - including switchover windows written since it loaded */
|
|
3695
3708
|
routing: RemoteConfig;
|
|
3696
|
-
/** Our own entries in that config, and
|
|
3709
|
+
/** Our own entries in that config, and their summarized current role (routes union + flags) */
|
|
3697
3710
|
selfEntries: HostedConfig[];
|
|
3698
|
-
self?:
|
|
3711
|
+
self?: SelfSummary;
|
|
3699
3712
|
config: ArchivesConfig;
|
|
3700
3713
|
};
|
|
3701
3714
|
/** The live in-memory state of ONE bucket, answered without touching the disk (no routing file read, no statfs, no stored write stats). Returns an error string when the bucket is not loaded here, which is the normal state for a bucket nothing has accessed since startup. */
|
package/package.json
CHANGED
package/storage/backblaze.ts
CHANGED
|
@@ -25,6 +25,9 @@ let backblazeCreds = lazy(async (): Promise<BackblazeCreds> => {
|
|
|
25
25
|
applicationKey: key,
|
|
26
26
|
};
|
|
27
27
|
});
|
|
28
|
+
// B2's minimum maxAgeSeconds is 60 - anything lower gets bumped to 60 server-side, so a smaller default would never match what the bucket actually stores and we would rewrite its settings on every startup
|
|
29
|
+
const MIN_BUCKET_CACHE_TIME = 60 * 1000;
|
|
30
|
+
|
|
28
31
|
// A B2 download/HEAD response's headers carry the file's metadata. content-range's total wins over content-length for ranged responses (which only report the slice's length).
|
|
29
32
|
function parseFileMetadataHeaders(response: HttpsResponseInfo): { size: number; uploadTimestamp: number } {
|
|
30
33
|
let size = Number(response.headers["content-length"] || 0);
|
|
@@ -439,7 +442,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
439
442
|
private getBucketAPI = lazy(async () => {
|
|
440
443
|
let api = await getAPI();
|
|
441
444
|
|
|
442
|
-
let cacheTime = this.config.cacheTime ?? 0;
|
|
445
|
+
let cacheTime = Math.max(this.config.cacheTime ?? 0, MIN_BUCKET_CACHE_TIME);
|
|
443
446
|
if (this.config.immutable) {
|
|
444
447
|
cacheTime = IMMUTABLE_CACHE_TIME;
|
|
445
448
|
}
|
|
@@ -451,8 +454,7 @@ export class ArchivesBackblaze implements IArchives {
|
|
|
451
454
|
allowedOperations: ["b2_download_file_by_id", "b2_download_file_by_name"],
|
|
452
455
|
allowedHeaders: ["range"],
|
|
453
456
|
exposeHeaders: ["x-bz-content-sha1"],
|
|
454
|
-
|
|
455
|
-
maxAgeSeconds: Math.max(60, cacheTime / 1000),
|
|
457
|
+
maxAgeSeconds: cacheTime / 1000,
|
|
456
458
|
}];
|
|
457
459
|
let bucketInfo: Record<string, unknown> = {};
|
|
458
460
|
if (cacheTime) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";
|
|
1
|
+
"use strict";
|
|
2
2
|
// The important operations of an archive bucket (extracted from ArchivesBackblaze), so other backends (e.g. our own remote storage server) can be used interchangeably.
|
|
3
3
|
Object.defineProperty(exports, "__esModule", { value: true , configurable: true});
|
|
4
4
|
//exports.copyArchiveFile = exports.windowAcceptsWrites = exports.VARIABLE_SHARD = exports.FULL_ROUTE = exports.STORAGE_WRONG_ROUTE = exports.STORAGE_WRONG_VALID_WINDOW = exports.FULL_VALID_WINDOW = exports.assertValidLastModified = exports.IMMUTABLE_CACHE_TIME = exports.MAX_LAST_MODIFIED_FUTURE = void 0;
|
|
@@ -73,4 +73,4 @@ async function copyArchiveFile(config) {
|
|
|
73
73
|
}
|
|
74
74
|
exports.copyArchiveFile = copyArchiveFile;
|
|
75
75
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSUFyY2hpdmVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiSUFyY2hpdmVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSx3S0FBd0s7OztBQUV4SyxzSkFBc0o7QUFDekksUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUV2RCx5TEFBeUw7QUFDNUssUUFBQSxvQkFBb0IsR0FBRyxLQUFLLEdBQUcsSUFBSSxDQUFDO0FBQ2pELFNBQWdCLHVCQUF1QixDQUFDLFlBQW9CO0lBQ3hELElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxnQ0FBd0IsQ0FBQztJQUNoRCxJQUFJLFlBQVksR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLDBDQUEwQyxZQUFZLE1BQU0sR0FBRyxxQkFBcUIsQ0FBQyxDQUFDO0lBQzFHLENBQUM7QUFDTCxDQUFDO0FBTEQsMERBS0M7QUF1RVksUUFBQSxpQkFBaUIsR0FBcUIsQ0FBQyxDQUFDLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUF3RWhGLHdYQUF3WDtBQUMzVyxRQUFBLDBCQUEwQixHQUFHLDRDQUE0QyxDQUFDO0FBRXZGLDhMQUE4TDtBQUNqTCxRQUFBLG1CQUFtQixHQUFHLHFDQUFxQyxDQUFDO0FBRTVELFFBQUEsVUFBVSxHQUFxQixDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztBQUVuRCwyUkFBMlI7QUFDOVEsUUFBQSxjQUFjLEdBQUcsNkNBQTZDLENBQUM7QUFDNUUsb0xBQW9MO0FBQ3BMLDhKQUE4SjtBQUM5SixTQUFnQixtQkFBbUIsQ0FBQyxXQUF5QztJQUN6RSxJQUFJLENBQUMsV0FBVztRQUFFLE9BQU8sSUFBSSxDQUFDO0lBQzlCLE9BQU8sV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztBQUN2QyxDQUFDO0FBSEQsa0RBR0M7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QUM7QUEzQ0QsMENBMkNDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gVGhlIGltcG9ydGFudCBvcGVyYXRpb25zIG9mIGFuIGFyY2hpdmUgYnVja2V0IChleHRyYWN0ZWQgZnJvbSBBcmNoaXZlc0JhY2tibGF6ZSksIHNvIG90aGVyIGJhY2tlbmRzIChlLmcuIG91ciBvd24gcmVtb3RlIHN0b3JhZ2Ugc2VydmVyKSBjYW4gYmUgdXNlZCBpbnRlcmNoYW5nZWFibHkuXG5cbi8vIEEgd3JpdGUgbWF5IG5vdCBiZSBzdGFtcGVkIG1vcmUgdGhhbiB0aGlzIGZhciBpbiB0aGUgZnV0dXJlLCBvciBjbG9jayBza2V3IGJldHdlZW4gbWFjaGluZXMgd291bGQgbGV0IGEgYmFkIHRpbWVzdGFtcCBibG9jayB3cml0ZXMgZm9yIGEgbG9uZyB0aW1lLlxuZXhwb3J0IGNvbnN0IE1BWF9MQVNUX01PRElGSUVEX0ZVVFVSRSA9IDE1ICogNjAgKiAxMDAwO1xuXG4vLyBIb3cgbG9uZyBicm93c2VycyBtYXkgY2FjaGUgZmlsZXMgZnJvbSBpbW11dGFibGUgYnVja2V0cyAodGhlIENhY2hlLUNvbnRyb2wgbWF4LWFnZSksIHNoYXJlZCBieSBldmVyeSBob3N0aW5nIHBhdGggKGJhY2tibGF6ZSBidWNrZXQgc2V0dGluZ3MgYW5kIG91ciBvd24gc3RvcmFnZSBzZXJ2ZXIncyBIVFRQIHJvdXRlKVxuZXhwb3J0IGNvbnN0IElNTVVUQUJMRV9DQUNIRV9USU1FID0gODY0MDAgKiAxMDAwO1xuZXhwb3J0IGZ1bmN0aW9uIGFzc2VydFZhbGlkTGFzdE1vZGlmaWVkKGxhc3RNb2RpZmllZDogbnVtYmVyKTogdm9pZCB7XG4gICAgbGV0IG1heCA9IERhdGUubm93KCkgKyBNQVhfTEFTVF9NT0RJRklFRF9GVVRVUkU7XG4gICAgaWYgKGxhc3RNb2RpZmllZCA+IG1heCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGxhc3RNb2RpZmllZCBpcyB0b28gZmFyIGluIHRoZSBmdXR1cmU6ICR7bGFzdE1vZGlmaWVkfSA+ICR7bWF4fSAobm93ICsgMTUgbWludXRlcylgKTtcbiAgICB9XG59XG5cblxuZXhwb3J0IHR5cGUgUmVtb3RlQ29uZmlnID0ge1xuICAgIC8vIE5PVEU6IFZlcnNpb24gaXMgdXNlZCB3aGVuIHVwZGF0aW5nIHRoZSBjb25maWd1cmF0aW9uLiBUaGUgbmV3ZXIgdmVyc2lvbiBpcyBhbHdheXMgdGFrZW4uIEEgbWlzc2luZyB2ZXJzaW9uIGNvdW50cyBhcyB2ZXJzaW9uIC0xLlxuICAgIHZlcnNpb24/OiBudW1iZXI7XG4gICAgc291cmNlczogUmVtb3RlQ29uZmlnQmFzZVtdO1xufTtcblxuLyoqXG4gICAgc3RyaW5nIGFyZ3VtZW50cyB3aWxsIGJlIGEgdXJsLCBsb29raW5nIGxpa2U6XG4gICAgICAgIGh0dHBzOi8vc3RvcmFnZTIudmlkZ3JpZHdlYi5jb206NDQ0NS9maWxlL2V4YW1wbGVhY2NvdW50L2V4YW1wbGVidWNrZXQvc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXG4gICAgICAgIGh0dHBzOi8vZjAwMi5iYWNrYmxhemViMi5jb20vZmlsZS9xdWVyeXN1YnRlc3QtY29tLXB1YmxpYy1pbW11dGFibGUvc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXG4gICAgICAgIC0gVGhlc2UgbWFwIHRvIHsgdXJsIH0sIHdpdGggdGhlIHR5cGUgaW5mZXJyZWQgZnJvbSB0aGUgdXJsXG4gICAgICAgIC0gSG9zdGVkIHVybHMgYXJlIC9maWxlLzxhY2NvdW50Pi88YnVja2V0TmFtZT4vLi4uLCBiYWNrYmxhemUgdXJscyBhcmUgL2ZpbGUvPGJ1Y2tldE5hbWU+Ly4uLlxuXG4gICAgTk9URTogSWYgd2UgZG8gbm90IGhhdmUgcmlnaHQgYWNjZXNzIHRvIHRoZXNlLCB0aGVuIGl0IGJlY29tZXMgYSByZWFkLW9ubHkgSUFyY2hpdmVzLCB3aGVyZSB3ZSBzb2xlbHkgcmVhZCB1c2luZyB0aGUgdXJsIGZvcm0gKHdoaWNoIG1pZ2h0IHRocm93IGR1ZSB0byBub3QgaGF2aW5nIGFjY2VzcyBhcyB3ZWxsKS4gVU5MRVNTIE91ciBjb25maWd1cmF0aW9uIGV4cGxpY2l0bHkgaGFzIHB1YmxpYzogZmFsc2UsIGluIHdoaWNoIGNhc2UsIHdlIGRvbid0IGV2ZW4gaGl0IHRoZSBVUkwgYW5kIHdlIHRocm93IG9uIGFjY2Vzcy5cblxuICAgIE5PVEU6IElmIHdlJ3JlIGluIHRoZSBicm93c2VyLCB3ZSBzaG91bGQgYWxsb3cgZG93bmxvYWRpbmcgdGhlIGZpbGVzIHZpYSB0aGUgVVJMIGZvcm0gKGlmIGl0J3MgYSBwdWJsaWMgYnVja2V0KSwgaG93ZXZlciwgd2Ugd29uJ3QgYWxsb3cgd3JpdGluZywgYmVjYXVzZSB0aGVpciBzZXJ2ZXJzIGRvIG5vdCBhbGxvdyBzZWN1cmUgYnJvd3NlciB3cml0ZXMuXG4qL1xuZXhwb3J0IHR5cGUgUmVtb3RlQ29uZmlnQmFzZSA9IHN0cmluZyB8IEhvc3RlZENvbmZpZyB8IEJhY2tibGF6ZUNvbmZpZztcblxuZXhwb3J0IHR5cGUgQ29tbW9uQ29uZmlnID0ge1xuICAgIC8qKiBCeSBkZWZhdWx0IGEgc2VydmVyIGhvc3RpbmcgdGhpcyBidWNrZXQgZWFnZXJseSBjb3BpZXMgdGhpcyBzb3VyY2UncyBmdWxsIGNvbnRlbnRzIG9udG8gaXRzIG93biBkaXNrIChvbiB0b3Agb2YgdGhlIGxhenkgcmVhZC10aHJvdWdoIGNhY2hpbmcpLiBTZXQgdGhpcyB0byBiZSBhIGZyb250IGVuZCBmb3IgYSB2ZXJ5IGxhcmdlIGRhdGFiYXNlIHdpdGhvdXQgY29weWluZyB0aGUgZnVsbCBkYXRhYmFzZSAtIHJlYWRzIHN0aWxsIGRvd24tY2FjaGUgaW5kaXZpZHVhbCBmaWxlcyBvbiBkZW1hbmQuICovXG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgLyoqIEJ5dGVzIG9mIHJlYWQtY2FjaGUgdGhpcyBzZXJ2ZXIncyBkaXNrIG1heSBob2xkOyBsZWFzdC1yZWNlbnRseS11c2VkIGZpbGVzIGFyZSBkZWxldGVkIGZyb20gZGlzayB0byBzdGF5IHVuZGVyIGl0IChvbmx5IGV2ZXIgd2hlbiBhbm90aGVyIHNvdXJjZSB2ZXJpZmlhYmx5IGhvbGRzIHRoZSBmaWxlIC0gdGhlIG9ubHkgY29weSBpcyBuZXZlciBkZWxldGVkKS4gUmVxdWlyZXMgbm9GdWxsU3luYyAoYSBmdWxsIGNvcHkgY2FuJ3QgYmUgYm91bmRlZCkuICovXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8qKiBUaGUgd3JpdGUgdGltZXMgKFtzdGFydE1zLCBlbmRNc10pIHRoaXMgc291cmNlIGlzIHZhbGlkIGZvciAoc2VlIEFyY2hpdmVzU291cmNlLnZhbGlkV2luZG93IGZvciB0aGUgc3luY2hyb25pemF0aW9uIHNlbWFudGljcykuIFJlcXVpcmVkIG9uIG9iamVjdCBjb25maWdzOiBjb25maWd1cmF0aW9uIGNoYW5nZXMgbXVzdCBiZSBTQ0hFRFVMRUQgKGEgbmV3IHNvdXJjZSBiZWNvbWVzIHZhbGlkIGF0IGEgZnV0dXJlIHRpbWUgd2hpbGUgdGhlIG9sZCBvbmUncyB3aW5kb3cgZW5kcyksIG5vdCBmbGlwcGVkIGluc3RhbnRseS4gUGxhaW4gVVJMLXN0cmluZyBzb3VyY2VzIGRlZmF1bHQgdG8gRlVMTF9WQUxJRF9XSU5ET1cgLSBvbmNlIHlvdSdyZSB3cml0aW5nIG9iamVjdCBjb25maWdzLCB5b3UncmUgZG9pbmcgc29tZXRoaW5nIGNvbXBsaWNhdGVkIGVub3VnaCB0byB0aGluayBhYm91dCB3aGVuIHRoaW5ncyBjaGFuZ2UuICovXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLyoqIFNoYXJkaW5nOiB0aGUgZnJhY3Rpb24gb2YgdGhlIGtleSBzcGFjZSB0aGlzIHNvdXJjZSBoYW5kbGVzLCBhcyBbc3RhcnQsIGVuZCkgb3ZlciBbMCwgMSkgKGtleXMgYXJlIHJvdXRlZCBieSBnZXRSb3V0ZSBpbiByZW1vdGVDb25maWcudHMpLiBEZWZhdWx0cyB0byBGVUxMX1JPVVRFICh1bnNoYXJkZWQpLiBBdCBldmVyeSBwb2ludCBpbiB0aW1lIHRoZSBzb3VyY2VzJyByb3V0ZXMgbXVzdCBmdWxseSBjb3ZlciBbMCwgMSksIG9yIHNvbWUga2V5cyBjb3VsZCBuZXZlciBiZSByZWFkLiAqL1xuICAgIHJvdXRlPzogW251bWJlciwgbnVtYmVyXTtcbiAgICAvKiogU2V0IG9uIGVudHJpZXMgaW5qZWN0ZWQgaW50byB0aGUgaW4tbWVtb3J5IGNvbmZpZyBieSBhbiBvdmVybGF5IChhIGRlcGxveSBzd2l0Y2hvdmVyJ3MgYWx0ZXJuYXRlLXBvcnQgd2luZG93KS4gTmV2ZXIgd3JpdHRlbiB0byBkaXNrOiByZXNvbHZlSW50ZXJtZWRpYXRlU291cmNlcyBzdHJpcHMgdGhlc2UgYW5kIHJlam9pbnMgdGhlIHdpbmRvd3MgYXJvdW5kIHRoZW0sIHdoaWNoIGlzIGFsc28gaG93IGEgY2xpZW50IHRlbGxzIHdoZXRoZXIgYW4gdXBkYXRlIGlzIGEgcmVhbCBjb25maWd1cmF0aW9uIGNoYW5nZSBvciBqdXN0IGFuIG92ZXJsYXkuICovXG4gICAgaW50ZXJtZWRpYXRlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEhvc3RlZENvbmZpZyA9IENvbW1vbkNvbmZpZyAmIHtcbiAgICB0eXBlOiBcInJlbW90ZVwiO1xuXG4gICAgLy8gRXg6IGh0dHBzOi8vOTktMjUwLTEyNC05MS5xdWVyeXN1YnRlc3QuY29tOjUyMzMvZmlsZS9yb290L3VuaXF1ZWJ1Y2tldG5hbWUvc3RvcmFnZS9zdG9yYWdlcm91dGluZy5qc29uXG4gICAgLy8gTk9URTogVGhlIGFjY291bnQgYW5kIGJ1Y2tldCBuYW1lIGFyZSBvYnRhaW5lZCBmcm9tIHRoZSBVUkwuXG4gICAgdXJsOiBzdHJpbmc7XG5cbiAgICAvLyBOT1RFOiBBdXRoZW50aWNhdGlvbiBpcyBoYW5kbGVkIGJ5IGNlcnQudHMsIHZpYSBoYXZpbmcgeW91ciBtYWNoaW5lIHRydXN0ZWQgdG8gYWNjZXNzIHRoaXMgYWNjb3VudC4gXG5cbiAgICBwdWJsaWM/OiBib29sZWFuO1xuICAgIC8vIEZhc3QgbW9kZTogdGhlIHNlcnZlciBhY2tub3dsZWRnZXMgd3JpdGVzIG9uY2UgdGhleSBhcmUgaW4gbWVtb3J5LCBmbHVzaGluZyB0byBkaXNrIGFmdGVyIHdyaXRlRGVsYXkgKGRlZmF1bHQgNSBtaW51dGVzKSBhbmQgY29hbGVzY2luZyB3cml0ZXMgdG8gdGhlIHNhbWUgZmlsZS4gQSBzZXJ2ZXIgY3Jhc2ggbG9zZXMgd3JpdGVzIHRoYXQgaGF2ZW4ndCBmbHVzaGVkIHlldC5cbiAgICBmYXN0PzogYm9vbGVhbjtcbiAgICB3cml0ZURlbGF5PzogbnVtYmVyO1xuICAgIC8vIFRoZSBidWNrZXQgaXMgc2VydmVkIHN0cmFpZ2h0IGZyb20gdGhlIHNlcnZlcidzIGRpc2ssIHdpdGggbm8gaW5kZXgg4oCUIHNvIG5vIGZhc3Qgd3JpdGVzLCBubyBnZXRTeW5jU3RhdHVzLCBhbmQgZ2V0Q2hhbmdlc0FmdGVyMiBmYWxscyBiYWNrIHRvIGEgZnVsbCBsaXN0aW5nLlxuICAgIHJhd0Rpc2s/OiBib29sZWFuO1xuICAgIC8vIFdyaXRlcyB0byBwYXRocyB0aGF0IGFscmVhZHkgZXhpc3QgYXJlIGRpc2FsbG93ZWQgKGRlbGV0ZXMgc3RpbGwgd29yaykuXG4gICAgaW1tdXRhYmxlPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIEJhY2tibGF6ZUNvbmZpZyA9IENvbW1vbkNvbmZpZyAmIHtcbiAgICB0eXBlOiBcImJhY2tibGF6ZVwiO1xuICAgIC8vIEV4OiBodHRwczovL2YwMDIuYmFja2JsYXplYjIuY29tL2ZpbGUvcXVlcnlzdWJ0ZXN0LWNvbS1wdWJsaWMtaW1tdXRhYmxlL3N0b3JhZ2Uvc3RvcmFnZXJvdXRpbmcuanNvblxuICAgIC8vIE5PVEU6IFRoZSBidWNrZXQgbmFtZSBpcyBvYnRhaW5lZCBmcm9tIHRoZSBVUkwuXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gUHVibGljIGJ1Y2tldHMgYXJlIHNlcnZlZCBvdmVyIHBsYWluIEhUVFBTIEdFVHMgKGdldFVSTCkuIFByaXZhdGUgYnVja2V0cyBhcmUgQVBJLWFjY2VzcyBvbmx5LlxuICAgIHB1YmxpYz86IGJvb2xlYW47XG4gICAgLy8gTk9URTogVGhpcyBpc24ndCBlbmZvcmNlZCBvbiB0aGUgYmFja2JsYXplIGxldmVsLCBzbyB0aGlzIGlzIGp1c3QgYSBjbGllbnQtc2lkZSBndWFyYW50ZWUuIFRoaXMgY2FuIGNoYW5nZSBob3cgd2UgY2FjaGUgZmlsZXMuXG4gICAgLy8gIC0gQmFja2JsYXplIGRvZXMgc3VwcG9ydCBpbW11dGFiaWxpdHkuIEhvd2V2ZXIsIGFwcGFyZW50bHksIG9uY2Ugd2UgZW5hYmxlIGl0IG9uIGEgYnVja2V0LCB3ZSBjYW4ndCBkaXNhYmxlIGl0LCB3aGljaCBpcyByZWFsbHkgYmFkLCBhcyBpdCBtZWFucyBpZiBvdXIgY29kZSBjb3VsZCBldmVyIGVuYWJsZSBpdCBhbmQgd2UgYWNjaWRlbnRhbGx5IGVuYWJsZSBpdCBvbiBhbiBpbXBvcnRhbnQgYnVja2V0LCB3ZSBlc3NlbnRpYWxseSBqdXN0IGJyaWNrZWQgdGhhdCBidWNrZXQuIFNvIHdlIHNob3VsZCBuZXZlciB3cml0ZSBhbnkgY29kZSB0aGF0IGV2ZXIgdHJpZXMgdG8gdXNlIGJhY2tibGF6ZSB0byBtYWtlIHRoaW5ncyBpbW11dGFibGUuIFxuICAgIGltbXV0YWJsZT86IGJvb2xlYW47XG4gICAgLy8gQ09SUyBvcmlnaW5zIGFsbG93ZWQgdG8gY29uc3VtZSB0aGUgYnVja2V0J3MgZmlsZXMgaW4gYSBicm93c2VyLiBOb3QgYSBzZWN1cml0eSBib3VuZGFyeSAoYWNjZXNzIGlzIGdhdGVkIGJ5IHRoZSBBUEkga2V5IC8gc2lnbmVkIFVSTHMsIG5laXRoZXIgb2Ygd2hpY2ggcmlkZXMgaW4gY29va2llcykgLSBpdCBvbmx5IGNvbnRyb2xzIHdoaWNoIHNpdGVzJyBpbi1wYWdlIEphdmFTY3JpcHQgY2FuIHJlYWQgcmVzcG9uc2VzLiBEZWZhdWx0cyB0byBhbnkgSFRUUFMgb3JpZ2luLlxuICAgIGFsbG93ZWRPcmlnaW5zPzogc3RyaW5nW107XG5cbiAgICAvLyBOT1RFOiBXZSB3aWxsIGFjY2VzcyB0aGUgYXBpIGtleSBmcm9tIGdldFNlY3JldCwgc2VlIGJhY2tibGF6ZS50cyBmb3IgdGhlIHNwZWNpZmljIGtleXMuXG59O1xuXG5cbmV4cG9ydCBjb25zdCBGVUxMX1ZBTElEX1dJTkRPVzogW251bWJlciwgbnVtYmVyXSA9IFswLCBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUl07XG5cblxuXG5cbmV4cG9ydCB0eXBlIEdldENvbmZpZyA9IHtcbiAgICByYW5nZT86IHsgc3RhcnQ6IG51bWJlcjsgZW5kOiBudW1iZXIgfTtcbiAgICAvKiogUmVhZCBPTkxZIGZyb20gdGhlIHByaW1hcnkgc291cmNlIC0gdGhlIG9uZSB3cml0ZXMgd291bGQgdGFyZ2V0IC0gaW5zdGVhZCBvZiBmYWxsaW5nIGJhY2sgYWNyb3NzIHRoZSByZWR1bmRhbnQgc291cmNlcy4gVXNlIHRoaXMgd2hlbiB5b3Ugd2FudCB5b3VyIHJlYWRzIGFuZCB3cml0ZXMgdG8gYmUgc29tZXdoYXQgYXRvbWljOiB0aGVyZSB3aWxsIHN0aWxsIGJlIGlzc3VlcyB3aXRoIHRoZSByb3VuZCB0cmlwLCBidXQgd2l0aG91dCBpdCB5b3UgY291bGQgdGFsayB0byBhIGNvbXBsZXRlbHkgZGlmZmVyZW50IG5vZGUgYW5kIGdldCBhIG11Y2ggb2xkZXIgdmFsdWUuIE1vc3QgcmVhZHMgYXJlbid0IGZvbGxvd2VkIGJ5IGEgd3JpdGUgdGhvdWdoLCBzbyBmb3IgbW9zdCBjYXNlcyBpdCdzIGJldHRlciB0byBnZXQgYSB2YWx1ZSB0aGFuIHRvIGhhdmUgdG8gd2FpdCAob3IgZXZlbiB0aHJvdykgd2hlbiB0aGUgcHJpbWFyeSBub2RlIGlzIG5vdCBhdmFpbGFibGUuICovXG4gICAgbm9GYWxsYmFja3M/OiBib29sZWFuO1xufTtcblxuZXhwb3J0IHR5cGUgQ2hhbmdlc0FmdGVyQ29uZmlnID0ge1xuICAgIHRpbWU6IG51bWJlcjtcbiAgICAvKiogT25seSBrZXlzIHJvdXRpbmcgaW50byBvbmUgb2YgdGhlc2UgW3N0YXJ0LCBlbmQpIHJhbmdlcy4gT25seSBzY2FubmluZyBwYXNzZXMgdGhpcyAtIGl0IGxldHMgYSBzdG9yZSBzeW5jaW5nIGEgcGFydGlhbCBzaGFyZCBhc2sgZm9yIGp1c3QgaXRzIHNsaWNlLiAqL1xuICAgIHJvdXRlcz86IFtudW1iZXIsIG51bWJlcl1bXTtcbn07XG5cbmV4cG9ydCB0eXBlIFNldENvbmZpZyA9IHtcbiAgICBsYXN0TW9kaWZpZWQ/OiBudW1iZXI7XG4gICAgLyoqIE1ha2VzIHRoZSB3cml0ZSBhY2NlcHRhYmxlIG9uIGltbXV0YWJsZSB0YXJnZXRzOiBhbiBleGlzdGluZyBwYXRoIGlzIHNpbXBseSBrZXB0IChpbW11dGFiaWxpdHkgd2lucyAtIG5vdGhpbmcgaXMgb3ZlcndyaXR0ZW4pIGluc3RlYWQgb2YgdGhlIHdyaXRlIHRocm93aW5nLiBSZXF1aXJlcyBsYXN0TW9kaWZpZWQuIFN5bmNocm9uaXphdGlvbiBNVVNUIHBhc3MgdGhpcyBvbiBldmVyeSBwdXNoIC0gYSBwbGFpbiBzZXQgdGhyb3dzIG9uIGltbXV0YWJsZSB0YXJnZXRzLCB3aGljaCB3b3VsZCBhYm9ydCByZWNvbmNpbGlhdGlvbiB3aGVuZXZlciBvbmUgc291cmNlIGluIGEgY2hhaW4gaXMgaW1tdXRhYmxlLiAqL1xuICAgIGZvcmNlU2V0SW1tdXRhYmxlPzogYm9vbGVhbjtcbiAgICAvKiogU2tpcHMgdGhlIHRhcmdldC1zaWRlIHNhZmV0eSByZWFkcyBhcm91bmQgdGhlIHdyaXRlIChiYWNrYmxhemU6IHRoZSBwcmUtd3JpdGUgZ2V0SW5mbyBjb21wYXJpc29uIGFuZCB0aGUgcG9zdC11cGxvYWQgZXhpc3RlbmNlIHBvbGwpLiBGb3Igd3JpdGVycyB3aG9zZSBvd24gYm9va2tlZXBpbmcgYWxyZWFkeSBkZWNpZGVzIHdoYXQgdG8gd3JpdGUgYW5kIG9yZGVycyBpdCBieSB3cml0ZSB0aW1lIChCbG9iU3RvcmUncyBpbmRleC1kcml2ZW4gd3JpdGVzIGFuZCBzeW5jaHJvbml6YXRpb24pLCB0aG9zZSByZWFkcyBhcmUgcHVyZSBleHRyYSBBUEkgY2FsbHMgLSBidXQgdGhlIGRlZmF1bHQgc3RheXMgY2hlY2tlZCwgYmVjYXVzZSBvdGhlciB1c2VycyBvZiB0aGUgcmF3IGJhY2tlbmRzIHJlbHkgb24gdGhlIGNoZWNrcy4gKi9cbiAgICBub0NoZWNrcz86IGJvb2xlYW47XG59O1xuXG4vLyBjcmVhdGVUaW1lIGlzIGEgbWlzbm9tZXIga2VwdCBmb3IgY29tcGF0aWJpbGl0eSDigJQgaXQgaXMgcmVhbGx5IHRoZSBMQVNULVdSSVRFIHRpbWUsIHNhbWUgYXMgZ2V0SW5mbydzIHdyaXRlVGltZS4gTmVpdGhlciBCYWNrYmxhemUgbm9yIG91ciByZW1vdGUgc3RvcmFnZSB0cmFja3MgYSBkaXN0aW5jdCBjcmVhdGlvbiBkYXRlOiBlYWNoIHdyaXRlIHN0YW1wcyBhIGZyZXNoIHRpbWVzdGFtcCBvbiB0aGUgY3VycmVudCB2ZXJzaW9uLCBzbyBib3RoIGZpZWxkcyBhcmUganVzdCBcIndoZW4gdGhlIGJ5dGVzIHNlcnZlZCBieSBnZXQoKSB3ZXJlIG1vc3QgcmVjZW50bHkgd3JpdHRlblwiLlxuZXhwb3J0IHR5cGUgQXJjaGl2ZUZpbGVJbmZvID0geyBwYXRoOiBzdHJpbmc7IGNyZWF0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyIH07XG5cbi8vIEFuIGluLXByb2dyZXNzIGJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIHRhc2sgKHNlZSBBcmNoaXZlc0NvbmZpZy5zeW5jaW5nKVxuZXhwb3J0IHR5cGUgU3luY0FjdGl2aXR5ID0ge1xuICAgIC8vIEEgbWV0YWRhdGEgc2NhbiBpcyBhIHNpbmdsZSBsaXN0aW5nIGNhbGwsIHNvIGl0IGhhcyBubyBpbmNyZW1lbnRhbCBwcm9ncmVzcyAtIGp1c3QgdGhhdCBpdCdzIHJ1bm5pbmcgYW5kIHNpbmNlIHdoZW4uIEEgZnVsbCBzeW5jIGtub3dzIGl0cyBleGFjdCBmaWxlL2J5dGUgcHJvZ3Jlc3MuXG4gICAgdHlwZTogXCJtZXRhZGF0YVNjYW5cIiB8IFwiZnVsbFN5bmNcIjtcbiAgICBzb3VyY2VEZWJ1Z05hbWU6IHN0cmluZztcbiAgICBzdGFydFRpbWU6IG51bWJlcjtcbiAgICBkb25lRmlsZXM/OiBudW1iZXI7XG4gICAgdG90YWxGaWxlcz86IG51bWJlcjtcbiAgICBkb25lQnl0ZXM/OiBudW1iZXI7XG4gICAgdG90YWxCeXRlcz86IG51bWJlcjtcbn07XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzQ29uZmlnID0ge1xuICAgIC8vIFdoZXRoZXIgZ2V0Q2hhbmdlc0FmdGVyMiBpcyBuYXRpdmVseSBpbmRleC1iYWNrZWQgKGZhc3QgY2hhbmdlIHBvbGxpbmc7IGV2ZXJ5IGJhY2tlbmQgc3RpbGwgc2VydmVzIGl0LCBidXQgdGhlIG90aGVycyBlbXVsYXRlIGl0IHdpdGggYSBmdWxsIGxpc3RpbmcpXG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI/OiBib29sZWFuO1xuICAgIC8vIFRoZSBidWNrZXQncyBmdWxsIHJvdXRpbmcgY29uZmlnIChST1VUSU5HX0ZJTEUpLiBBYnNlbnQgZm9yIHNvdXJjZXMgdGhhdCBkb24ndCBoYXZlIG9uZSAoYSBiYXJlIGRpc2sgc291cmNlLCBvciBhIGJ1Y2tldCB0aGF0IGRvZXNuJ3QgZXhpc3QgeWV0KS5cbiAgICByZW1vdGVDb25maWc/OiBSZW1vdGVDb25maWc7XG4gICAgLy8gTGl2ZSBpbmRleCB0b3RhbHMgKHRvbWJzdG9uZXMgZXhjbHVkZWQpLCBrZXB0IHVwIHRvIGRhdGUgaW4gbWVtb3J5IG9uIGV2ZXJ5IG11dGF0aW9uIGFuZCByZWNvbXB1dGVkIG9uIGxvYWQgLSBzbyBhbnkgZHJpZnQgaGVhbHMgb24gcmVzdGFydFxuICAgIGluZGV4PzogeyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfTtcbiAgICAvLyBUaGUgc2FtZSB0b3RhbHMgYnJva2VuIGRvd24gYnkgd2hpY2ggc291cmNlIGN1cnJlbnRseSBob2xkcyBlYWNoIGZpbGUncyBieXRlcyAodGhlIGZpcnN0IGVudHJ5IGlzIHRoZSBzZXJ2ZXIncyBvd24gZGlzaylcbiAgICBpbmRleFNvdXJjZXM/OiB7IGRlYnVnTmFtZTogc3RyaW5nOyBmaWxlQ291bnQ6IG51bWJlcjsgYnl0ZUNvdW50OiBudW1iZXIgfVtdO1xuICAgIC8vIFRoZSBzZXJ2ZXIncyBjb25maWd1cmVkIHJlYWRlckRpc2tMaW1pdCwgd2hlbiBpdCBydW5zIGFzIGEgYm91bmRlZCByZWFkIGNhY2hlXG4gICAgcmVhZGVyRGlza0xpbWl0PzogbnVtYmVyO1xuICAgIC8vIEJhY2tncm91bmQgc3luY2hyb25pemF0aW9uIGN1cnJlbnRseSBpbiBwcm9ncmVzcyAoZW1wdHkgd2hlbiBpZGxlKVxuICAgIHN5bmNpbmc/OiBTeW5jQWN0aXZpdHlbXTtcbn07XG5cbi8vIEEgc3luY2hyb25pemF0aW9uIHNvdXJjZSBvZiBhIEJsb2JTdG9yZSAod2hpY2ggc3luY2hyb25pemVzIGFuIGluZGV4ICsgbG9jYWwgY2FjaGUgZnJvbSB0aGVtKVxuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTb3VyY2UgPSB7XG4gICAgc291cmNlOiBJQXJjaGl2ZXM7XG4gICAgLyoqIFRoZSBwZXJzaXN0ZW50IGlkZW50aXR5IG9mIHRoZSBlbmRwb2ludDogaXRzIHJvdXRpbmcgVVJMIChob3N0ZWQvYmFja2JsYXplKSwgb3IgdGhlIGRpc2sgZm9sZGVyIHBhdGggZm9yIHRoZSBiYXNlIGRpc2sgc291cmNlLiBUaGUgc3RvcmUgcGVyc2lzdHMgdGhpcyAodmlhIGl0cyBhcHBlbmQtb25seSBzb3VyY2VzIGxpc3QpIGFzIEluZGV4RW50cnkuc291cmNlc0xpc3RJbmRleCwgc28gaXQgbXVzdCBtZWFuIHRoZSBzYW1lIGVuZHBvaW50IGZvcmV2ZXIuICovXG4gICAgdXJsOiBzdHJpbmc7XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnLiBUaGUgd2luZG93IHJvdXRlcyBXUklURVM6IG9uY2UgaXRzIGVuZCBpcyBwYXN0IChzZWUgd2luZG93QWNjZXB0c1dyaXRlcykgdGhlIHNvdXJjZSBzdG9wcyByZWNlaXZpbmcgd3JpdGVzIGVudGlyZWx5IC0gaXQganVzdCBzdG9wcyBncm93aW5nLiBJdCBkb2VzIE5PVCBmaWx0ZXIgc2Nhbm5pbmc6IGEgc2NhbiBpcyB1cyBhc2tpbmcgdGhlIHNvdXJjZSB3aGF0IGl0IGFscmVhZHkgaG9sZHMsIGFuZCBleGlzdGluZyB2YWx1ZXMgc3luY2hyb25pemUgcmVnYXJkbGVzcyBvZiB0aGVpciB3cml0ZSB0aW1lcyAodGhlIHNhbWUgcmVhc29uaW5nIHRoYXQgbGV0cyBzeW5jaHJvbml6YXRpb24gaWdub3JlIHRoZSBpbW11dGFibGUgZmxhZykuXG4gICAgdmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl07XG4gICAgLy8gRnJvbSB0aGUgc291cmNlJ3MgQ29tbW9uQ29uZmlnIChpbnRlcnNlY3RlZCB3aXRoIHRoZSBvd25pbmcgc3RvcmUncyBvd24gcm91dGUpOiBvbmx5IGtleXMgcm91dGluZyBpbnRvIFtzdGFydCwgZW5kKSBhcmUgYWNjZXB0ZWQgZnJvbSB0aGlzIHNvdXJjZSdzIHNjYW5zIGFuZCBzZW50IHRvIGl0IGluIHdyaXRlcy9yZWNvbmNpbGlhdGlvbi4gVGhlIHJvdXRpbmcgZmlsZSBpcyBleGVtcHQgLSBjb25maWcgZmxvd3MgZXZlcnl3aGVyZS4gQWJzZW50ID0gYWxsIGtleXMuXG4gICAgcm91dGU/OiBbbnVtYmVyLCBudW1iZXJdO1xuICAgIC8vIEZyb20gdGhlIHNvdXJjZSdzIENvbW1vbkNvbmZpZzsgc2VlIHRoZXJlLlxuICAgIG5vRnVsbFN5bmM/OiBib29sZWFuO1xuICAgIC8vIEZyb20gdGhlIHNvdXJjZSdzIENvbW1vbkNvbmZpZzogYSBkZXBsb3kgc3dpdGNob3ZlcidzIHRlbXBvcmFyeSBhbHRlcm5hdGUtcG9ydCBlbnRyeS4gT25jZSBpdHMgd2luZG93IGlzIHBhc3QsIHRoZSBwb3J0IGl0IHBvaW50cyBhdCBpcyBnb25lIGZvciBnb29kIC0gc28gaXQgaXMgbmV2ZXIgc2Nhbm5lZCB0aGVuLCBhbmQgc2NhbiBmYWlsdXJlcyBhcmUgbmV2ZXIgcmV0cmllZC5cbiAgICBpbnRlcm1lZGlhdGU/OiBib29sZWFuO1xuICAgIC8vIFN0YWJsZSBpZGVudGl0eSBvZiB0aGUgdW5kZXJseWluZyBlbmRwb2ludCAoaXRzIGNvbmZpZyB3aXRoIHdpbmRvd3Mvcm91dGVzIHN0cmlwcGVkKSAtIGhvdyBCbG9iU3RvcmUudXBkYXRlU291cmNlcyByZWNvZ25pemVzIGEgc291cmNlIGFjcm9zcyBjb25maWcgY2hhbmdlcyBzbyBpdCBjYW4gdXBkYXRlIGl0IGluIHBsYWNlIGluc3RlYWQgb2YgcmVtb3ZpbmcgYW5kIHJlLWFkZGluZyBpdFxuICAgIGlkZW50aXR5Pzogc3RyaW5nO1xufTtcblxuLy8gRXJyb3IgbWFya2VyIGEgc2VydmVyIGluY2x1ZGVzIHdoZW4gYSBmcmVzaGx5LXN0YW1wZWQgd3JpdGUgcmVhY2hlcyBpdCBvdXRzaWRlIGl0cyB2YWxpZCB3aW5kb3dzICh0aGUgY2xpZW50IHJlc29sdmVkIGl0cyB0YXJnZXQsIHRoZW4gdGltZSBjcm9zc2VkIGEgd2luZG93IGJvdW5kYXJ5IGJlZm9yZSB0aGUgd3JpdGUgbGFuZGVkKS4gQ2xpZW50cyBkZXRlY3QgdGhpcyBtYXJrZXIgYW5kIHJlLXJlc29sdmUgdGhlIGN1cnJlbnRseS12YWxpZCBzb3VyY2UsIHJldHJ5aW5nIE9OQ0UgLSBib3VuZGFyaWVzIGFyZSBmYXIgYXBhcnQsIHNvIGhpdHRpbmcgaXQgdHdpY2UgaW4gb25lIGF0dGVtcHQgbWVhbnMgc29tZXRoaW5nIGlzIGFjdHVhbGx5IHdyb25nLlxuZXhwb3J0IGNvbnN0IFNUT1JBR0VfV1JPTkdfVkFMSURfV0lORE9XID0gXCJSRU1PVEVfU1RPUkFHRV9XUk9OR19WQUxJRF9XSU5ET1dfYTdjMWYwNGVcIjtcblxuLy8gRXJyb3IgbWFya2VyIGEgc2VydmVyIGluY2x1ZGVzIHdoZW4gYSBmcmVzaGx5LXN0YW1wZWQgd3JpdGUncyBrZXkgcm91dGVzIG91dHNpZGUgdGhlIHNoYXJkcyB0aGlzIHNlcnZlciBoYW5kbGVzICh0aGUgY2xpZW50J3MgY29uZmlnIGRpc2FncmVlcyB3aXRoIHRoZSBzZXJ2ZXIncyAtIGNsaWVudHMgcmUtcmVzb2x2ZSBvbmNlKVxuZXhwb3J0IGNvbnN0IFNUT1JBR0VfV1JPTkdfUk9VVEUgPSBcIlJFTU9URV9TVE9SQUdFX1dST05HX1JPVVRFX2M5NGQyZTE3XCI7XG5cbmV4cG9ydCBjb25zdCBGVUxMX1JPVVRFOiBbbnVtYmVyLCBudW1iZXJdID0gWzAsIDFdO1xuXG4vLyBBIGtleSBjb250YWluaW5nIHRoaXMgc2VudGluZWwgZG9lc24ndCBoYXZlIGEgZml4ZWQgc2hhcmQ6IHNldFZhcmlhYmxlU2hhcmQgcGlja3MgdGhlIChsb3dlc3QgbGF0ZW5jeSwgdXApIHdyaXRlIHNoYXJkLCBhcHBlbmRzIFwiXzx2YWx1ZSBpbiB0aGUgc2hhcmQncyByb3V0ZT5cIiBkaXJlY3RseSBhZnRlciB0aGUgc2VudGluZWwsIGFuZCByZXR1cm5zIHRoZSBtYXRlcmlhbGl6ZWQga2V5LiBnZXRSb3V0ZSB0cmVhdHMgdGhhdCBzdWZmaXggYXMgYSBjb21wbGV0ZSByb3V0ZSBvdmVycmlkZS5cbmV4cG9ydCBjb25zdCBWQVJJQUJMRV9TSEFSRCA9IFwiVkFSSUFCTEVfU0hBUkRfZjAyMzRqZmFoMDhmZ3loZmd5c3NkZHM4M25tcFwiO1xuLy8gTm8gZ3JhY2UgcGFzdCB0aGUgZW5kOiBhIHdpbmRvdyBib3VuZGFyeSBpcyBhIGhhcmQgaGFuZG9mZiAoY2xpZW50cyByZXRyeSBhIHJlamVjdGVkIHdyaXRlIGFnYWluc3QgdGhlIG5ld2x5LXZhbGlkIHNvdXJjZSwgc28gbGVuaWVuY3kgaGVyZSB3b3VsZCBvbmx5IGRlc3luY2hyb25pemUgdGhlIGhhbmRvZmYpXG4vLyAgLSBXcml0aW5nIHRvIG9sZGVyIHZhbGlkIHN0YXRlIHdpbmRvd3MgaXMgZmluZSwgdGhvdWdoLiBXZSBuZWVkIHRoaXMgdG8gaW5nZXN0IHRoZSBvbGQgZGF0YSB3aGVuIHdlJ3JlIHN5bmNocm9uaXppbmcgbm9kZXMgdG8gZ2V0IHRoZW0gdXAgdG8gZGF0ZSBhbnl3YXkuIFxuZXhwb3J0IGZ1bmN0aW9uIHdpbmRvd0FjY2VwdHNXcml0ZXModmFsaWRXaW5kb3c6IFtudW1iZXIsIG51bWJlcl0gfCB1bmRlZmluZWQpOiBib29sZWFuIHtcbiAgICBpZiAoIXZhbGlkV2luZG93KSByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gdmFsaWRXaW5kb3dbMV0gPiBEYXRlLm5vdygpO1xufVxuXG5jb25zdCBMQVJHRV9DT1BZX1RIUkVTSE9MRCA9IDY0ICogMTAyNCAqIDEwMjQ7XG5jb25zdCBMQVJHRV9DT1BZX0NIVU5LID0gMzIgKiAxMDI0ICogMTAyNDtcblxuLyoqIENvcGllcyBvbmUgZmlsZSBiZXR3ZWVuIHR3byBhcmNoaXZlcy4gU21hbGwgZmlsZXMgZ28gYXMgYSBzaW5nbGUgZ2V0MitzZXQ7IHBhc3QgTEFSR0VfQ09QWV9USFJFU0hPTEQgdGhlIGNvcHkgc3RyZWFtcyB0aHJvdWdoIHNldExhcmdlRmlsZSBpbiBMQVJHRV9DT1BZX0NIVU5LIHJhbmdlZCByZWFkcywgc28gdGhlIHdob2xlIGZpbGUgaXMgbmV2ZXIgaW4gbWVtb3J5LiBzaXplL3dyaXRlVGltZSB1c3VhbGx5IGNvbWUgZnJvbSB0aGUgY2FsbGVyJ3MgbWV0YWRhdGEgc2Nhbjsgd2hlbiBlaXRoZXIgaXMgb21pdHRlZCwgZ2V0SW5mbyBmaWxscyB0aGVtIGluLiBSZXR1cm5zIHRoZSBjb3BpZWQgZmlsZSdzIGluZm8sIG9yIHVuZGVmaW5lZCB3aGVuIHRoZSBzb3VyY2UgZG9lc24ndCBoYXZlIHRoZSBmaWxlLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvcHlBcmNoaXZlRmlsZShjb25maWc6IHtcbiAgICBmcm9tOiBJQXJjaGl2ZXM7XG4gICAgdG86IElBcmNoaXZlcztcbiAgICBwYXRoOiBzdHJpbmc7XG4gICAgc2l6ZT86IG51bWJlcjtcbiAgICB3cml0ZVRpbWU/OiBudW1iZXI7XG4gICAgZm9yY2VTZXRJbW11dGFibGU/OiBib29sZWFuO1xuICAgIG5vQ2hlY2tzPzogYm9vbGVhbjtcbn0pOiBQcm9taXNlPHsgd3JpdGVUaW1lOiBudW1iZXI7IHNpemU6IG51bWJlciB9IHwgdW5kZWZpbmVkPiB7XG4gICAgbGV0IHsgZnJvbSwgdG8sIHBhdGggfSA9IGNvbmZpZztcbiAgICBsZXQgc2l6ZSA9IGNvbmZpZy5zaXplO1xuICAgIGxldCB3cml0ZVRpbWUgPSBjb25maWcud3JpdGVUaW1lO1xuICAgIGlmIChzaXplID09PSB1bmRlZmluZWQgfHwgd3JpdGVUaW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGV0IGluZm8gPSBhd2FpdCBmcm9tLmdldEluZm8ocGF0aCk7XG4gICAgICAgIGlmICghaW5mbykgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgc2l6ZSA9IGluZm8uc2l6ZTtcbiAgICAgICAgd3JpdGVUaW1lID0gaW5mby53cml0ZVRpbWU7XG4gICAgfVxuICAgIGlmIChzaXplIDw9IExBUkdFX0NPUFlfVEhSRVNIT0xEKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSBhd2FpdCBmcm9tLmdldDIocGF0aCk7XG4gICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCB0by5zZXQocGF0aCwgcmVzdWx0LmRhdGEsIHsgbGFzdE1vZGlmaWVkOiByZXN1bHQud3JpdGVUaW1lLCBmb3JjZVNldEltbXV0YWJsZTogY29uZmlnLmZvcmNlU2V0SW1tdXRhYmxlLCBub0NoZWNrczogY29uZmlnLm5vQ2hlY2tzIH0pO1xuICAgICAgICByZXR1cm4geyB3cml0ZVRpbWU6IHJlc3VsdC53cml0ZVRpbWUsIHNpemU6IHJlc3VsdC5kYXRhLmxlbmd0aCB9O1xuICAgIH1cbiAgICAvLyBDb25zdHMgc28gdGhlIGNsb3N1cmUga2VlcHMgdGhlIG5hcnJvd2VkIHR5cGVzXG4gICAgY29uc3QgdG90YWxTaXplID0gc2l6ZTtcbiAgICBjb25zdCBmaW5hbFdyaXRlVGltZSA9IHdyaXRlVGltZTtcbiAgICBsZXQgb2Zmc2V0ID0gMDtcbiAgICBhd2FpdCB0by5zZXRMYXJnZUZpbGUoe1xuICAgICAgICBwYXRoLFxuICAgICAgICBsYXN0TW9kaWZpZWQ6IGZpbmFsV3JpdGVUaW1lLFxuICAgICAgICBnZXROZXh0RGF0YTogYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKG9mZnNldCA+PSB0b3RhbFNpemUpIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBsZXQgZW5kID0gTWF0aC5taW4ob2Zmc2V0ICsgTEFSR0VfQ09QWV9DSFVOSywgdG90YWxTaXplKTtcbiAgICAgICAgICAgIGxldCBkYXRhID0gYXdhaXQgZnJvbS5nZXQocGF0aCwgeyByYW5nZTogeyBzdGFydDogb2Zmc2V0LCBlbmQgfSB9KTtcbiAgICAgICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlZCByZWFkIG9mICR7SlNPTi5zdHJpbmdpZnkocGF0aCl9IGZyb20gJHtmcm9tLmdldERlYnVnTmFtZSgpfSByZXR1cm5lZCAke2RhdGEgJiYgZGF0YS5sZW5ndGggfHwgXCJub3RoaW5nXCJ9IGF0ICR7b2Zmc2V0fS0ke2VuZH0gKGV4cGVjdGVkICR7ZW5kIC0gb2Zmc2V0fSBieXRlcyBvZiBhICR7dG90YWxTaXplfSBieXRlIGZpbGUgLSBpdCBjaGFuZ2VkIG9yIHZhbmlzaGVkIG1pZC1jb3B5KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgb2Zmc2V0ICs9IGRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHsgd3JpdGVUaW1lOiBmaW5hbFdyaXRlVGltZSwgc2l6ZTogdG90YWxTaXplIH07XG59XG5cbmV4cG9ydCB0eXBlIEFyY2hpdmVzU3luY1NvdXJjZVN0YXR1cyA9IHtcbiAgICBkZWJ1Z05hbWU6IHN0cmluZztcbiAgICB2YWxpZFdpbmRvdzogW251bWJlciwgbnVtYmVyXTtcbiAgICByb3V0ZT86IFtudW1iZXIsIG51bWJlcl07XG4gICAgbm9GdWxsU3luYz86IGJvb2xlYW47XG4gICAgc3VwcG9ydHNDaGFuZ2VzQWZ0ZXI6IGJvb2xlYW47XG4gICAgaW5pdGlhbFNjYW5Db21wbGV0ZTogYm9vbGVhbjtcbiAgICAvLyBGaWxlcyBzZWVuIGluIHRoaXMgc291cmNlJ3Mgc2NhbnMgLyBjaGFuZ2UgcG9sbHMgc28gZmFyXG4gICAgc2Nhbm5lZENvdW50OiBudW1iZXI7XG59O1xuZXhwb3J0IHR5cGUgQXJjaGl2ZXNTeW5jU3RhdHVzID0ge1xuICAgIGFsbFNjYW5zQ29tcGxldGU6IGJvb2xlYW47XG4gICAgLy8gTnVtYmVyIG9mIGZpbGVzIGluIHRoZSBpbmRleFxuICAgIGluZGV4U2l6ZTogbnVtYmVyO1xuICAgIHNvdXJjZXM6IEFyY2hpdmVzU3luY1NvdXJjZVN0YXR1c1tdO1xufTtcblxuZXhwb3J0IGludGVyZmFjZSBJQXJjaGl2ZXMge1xuICAgIGdldERlYnVnTmFtZSgpOiBzdHJpbmc7XG4gICAgLyoqIFdoZXRoZXIgd3JpdGVzIHdvdWxkIGJlIGFjY2VwdGVkIChjcmVkZW50aWFscyBleGlzdCwgdGhlIGFjY291bnQgdHJ1c3RzIHRoaXMgbWFjaGluZSwgZXRjKS4gQ2hlY2tlZCB3aXRob3V0IHdyaXRpbmcgYW55dGhpbmcuICovXG4gICAgaGFzV3JpdGVBY2Nlc3MoKTogUHJvbWlzZTxib29sZWFuPjtcbiAgICAvKipcbiAgICAgKiBSZWFkcyBhdXRvbWF0aWNhbGx5IGZhbGwgYmFjayBhY3Jvc3MgdGhlIHJlZHVuZGFudCBzb3VyY2VzIHVubGVzcyBjb25maWcubm9GYWxsYmFja3MgaXMgc2V0LlxuICAgICAqIEEgZmFsbGJhY2sgY29weSBjYW4gbGFnIHRoZSB3cml0ZSB0YXJnZXQsIHNvIGEgY2FsbGVyIHJlYWRpbmcgc3RhdGUgaW4gb3JkZXIgdG8gbXV0YXRlIGl0XG4gICAgICogKGUuZy4geCsrKSwgd2hlcmUgYWN0aW5nIG9uIHByZXZpb3VzIHN0YXRlIHdvdWxkIGNhdXNlIGJpZyBpc3N1ZXMsIHNob3VsZCBwYXNzIG5vRmFsbGJhY2tzIC1cbiAgICAgKiBhbmQgdHJ5L2NhdGNoIHRoZSByZWFkLCBoYW5kbGluZyB0aGUgY2F0Y2ggY2FzZSAoYSBkb3duIHByaW1hcnkgaXMgcmV0cmllZCBmb3IgYSB3aGlsZSwgdGhlblxuICAgICAqIHRocm93cyBpbnN0ZWFkIG9mIGRlZ3JhZGluZyB0byBhIHN0YWxlIGNvcHkpLlxuICAgICAqL1xuICAgIGdldChmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPEJ1ZmZlciB8IHVuZGVmaW5lZD47XG4gICAgLyoqIFNlZSBnZXQgZm9yIHRoZSBmYWxsYmFjayBzZW1hbnRpY3MgKGFuZCB3aGVuIHRvIHBhc3Mgbm9GYWxsYmFja3MpLiB1cmwgaXMgdGhlIGNvbmZpZyBVUkwgb2YgdGhlIHNvdXJjZSB0aGF0IHNlcnZlZCB0aGUgdmFsdWUgLSBzZXQgYnkgbXVsdGktc291cmNlIGltcGxlbWVudGF0aW9ucyAoQXJjaGl2ZXNDaGFpbiksIGFic2VudCBmcm9tIHNpbmdsZS1zb3VyY2UgYmFja2VuZHMuICovXG4gICAgZ2V0MihmaWxlTmFtZTogc3RyaW5nLCBjb25maWc/OiBHZXRDb25maWcpOiBQcm9taXNlPHsgZGF0YTogQnVmZmVyOyB3cml0ZVRpbWU6IG51bWJlcjsgc2l6ZTogbnVtYmVyOyB1cmw/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZD47XG4gICAgLyoqXG4gICAgICogbGFzdE1vZGlmaWVkIHN0YW1wcyB0aGUgd3JpdGUgd2l0aCB0aGF0IGxhc3Qtd3JpdGUgdGltZSBpbnN0ZWFkIG9mIG5vdy4gSWYgaXQgaXMgT0xERVIgdGhhblxuICAgICAqIHRoZSBmaWxlJ3MgY3VycmVudCBsYXN0LXdyaXRlIHRpbWUgdGhlIHdyaXRlIG5vLW9wcyAoc28gZGVsYXllZCAvIHN5bmNocm9uaXplZCB3cml0ZXMgY2FuXG4gICAgICogbmV2ZXIgY2xvYmJlciBuZXdlciBkYXRhKS4gVGltZXMgbW9yZSB0aGFuIDE1IG1pbnV0ZXMgaW4gdGhlIGZ1dHVyZSBhcmUgcmVqZWN0ZWQuXG4gICAgICpcbiAgICAgKiBSZXR1cm5zIHRoZSBmdWxsIGtleSBhY3R1YWxseSB3cml0dGVuIC0gaWRlbnRpY2FsIHRvIGZpbGVOYW1lLCBFWENFUFQgZm9yIGtleXMgY29udGFpbmluZ1xuICAgICAqIFZBUklBQkxFX1NIQVJELCB3aGVyZSB0aGUgc2hhcmQgdmFsdWUgaXMgbWF0ZXJpYWxpemVkIGludG8gdGhlIGtleSAocGlja2VkIGJ5IHNoYXJkIGxhdGVuY3ksXG4gICAgICogc2VlIEFyY2hpdmVzQ2hhaW4pIGFuZCB0aGUgY2FsbGVyIG5lZWRzIHRoZSByZXR1cm5lZCBrZXkgdG8gZXZlciByZWFkIHRoZSB2YWx1ZSBiYWNrLlxuICAgICAqL1xuICAgIHNldChmaWxlTmFtZTogc3RyaW5nLCBkYXRhOiBCdWZmZXIsIGNvbmZpZz86IFNldENvbmZpZyk6IFByb21pc2U8c3RyaW5nPjtcbiAgICBkZWwoZmlsZU5hbWU6IHN0cmluZyk6IFByb21pc2U8dm9pZD47XG4gICAgLyoqIFN0cmVhbXMgYSBmaWxlIHRvbyBsYXJnZSB0byBob2xkIGluIG1lbW9yeS4gZ2V0TmV4dERhdGEgcmV0dXJucyB1bmRlZmluZWQgd2hlbiBkb25lLiBsYXN0TW9kaWZpZWQgc3RhbXBzIHRoZSBmaW5pc2hlZCBmaWxlIGxpa2Ugc2V0J3MgKHN5bmNocm9uaXplZCBjb3BpZXMgbmVlZCBpdCB0byBrZWVwIHdyaXRlIG9yZGVyaW5nKTsgYmFja2VuZHMgdGhhdCBzdGFtcCB0aGVpciBvd24gdGltZXMgKGJhY2tibGF6ZSkgYWNjZXB0IGFuZCBpZ25vcmUgaXQuICovXG4gICAgc2V0TGFyZ2VGaWxlKGNvbmZpZzogeyBwYXRoOiBzdHJpbmc7IGxhc3RNb2RpZmllZD86IG51bWJlcjsgZ2V0TmV4dERhdGEoKTogUHJvbWlzZTxCdWZmZXIgfCB1bmRlZmluZWQ+IH0pOiBQcm9taXNlPHZvaWQ+O1xuICAgIC8qKiB3cml0ZVRpbWUgaXMgdGhlIGxhc3Qtd3JpdGUgdGltZSDigJQgc2VlIEFyY2hpdmVGaWxlSW5mby5jcmVhdGVUaW1lLCB3aGljaCBpcyB0aGUgc2FtZSB2YWx1ZS4gdXJsIGFzIGluIGdldDIuICovXG4gICAgZ2V0SW5mbyhmaWxlTmFtZTogc3RyaW5nKTogUHJvbWlzZTx7IHdyaXRlVGltZTogbnVtYmVyOyBzaXplOiBudW1iZXI7IHVybD86IHN0cmluZyB9IHwgdW5kZWZpbmVkPjtcbiAgICBmaW5kKHByZWZpeDogc3RyaW5nLCBjb25maWc/OiB7IHNoYWxsb3c/OiBib29sZWFuOyB0eXBlOiBcImZpbGVzXCIgfCBcImZvbGRlcnNcIiB9KTogUHJvbWlzZTxzdHJpbmdbXT47XG4gICAgZmluZEluZm8ocHJlZml4OiBzdHJpbmcsIGNvbmZpZz86IHsgc2hhbGxvdz86IGJvb2xlYW47IHR5cGU6IFwiZmlsZXNcIiB8IFwiZm9sZGVyc1wiIH0pOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICAvKiogT25seSB3b3JrcyBmb3IgcHVibGljIGJ1Y2tldHMgKHByaXZhdGUgYnVja2V0cyBhcmUgQVBJLWFjY2VzcyBvbmx5KS4gKi9cbiAgICBnZXRVUkwocGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+O1xuICAgIC8qKiBUaGUgYnVja2V0J3MgY29uZmlndXJhdGlvbiwgd2hpY2ggdGVsbHMgd2hldGhlciB0aGUgb3B0aW9uYWwgZnVuY3Rpb25zIGFyZSBzdXBwb3J0ZWQuICovXG4gICAgZ2V0Q29uZmlnKCk6IFByb21pc2U8QXJjaGl2ZXNDb25maWc+O1xuICAgIC8qKlxuICAgICAqIEFsbCBmaWxlcyBjaGFuZ2VkIGFmdGVyIGNvbmZpZy50aW1lLCBvcHRpb25hbGx5IHJlc3RyaWN0ZWQgdG8ga2V5cyByb3V0aW5nIGludG8gb25lIG9mXG4gICAgICogY29uZmlnLnJvdXRlcyAodXNlZCBieSBzY2FubmluZywgc28gcGFydGlhbGx5LW92ZXJsYXBwaW5nIHNoYXJkcyBvbmx5IHJlY2VpdmUgdGhlaXIgc2xpY2UpLlxuICAgICAqIFdoZW4gZ2V0Q29uZmlnKCkuc3VwcG9ydHNDaGFuZ2VzQWZ0ZXIsIHRoaXMgaXMgYmFja2VkIGJ5IGFuIGluZGV4IChmYXN0LCBhbmQgZGVsZXRpb25zIEFSRVxuICAgICAqIHJlcG9ydGVkLCBhcyBzaXplLTAgdG9tYnN0b25lIGVudHJpZXMpLiBFdmVyeSBvdGhlciBiYWNrZW5kIGVtdWxhdGVzIGl0OiBhIGZ1bGwgZmluZEluZm9cbiAgICAgKiBsaXN0aW5nIGZpbHRlcmVkIGluIG1lbW9yeSAtIGNvcnJlY3QsIGJ1dCBubyBjaGVhcGVyIHRoYW4gdGhlIGxpc3RpbmcgaXRzZWxmLlxuICAgICAqL1xuICAgIGdldENoYW5nZXNBZnRlcjIoY29uZmlnOiBDaGFuZ2VzQWZ0ZXJDb25maWcpOiBQcm9taXNlPEFyY2hpdmVGaWxlSW5mb1tdPjtcbiAgICAvKiogU3luY2hyb25pemF0aW9uIGludHJvc3BlY3Rpb24sIGZvciBiYWNrZW5kcyB0aGF0IHN5bmNocm9uaXplIGZyb20gc291cmNlcyAoc2VlIEJsb2JTdG9yZSkuICovXG4gICAgZ2V0U3luY1N0YXR1cz8oKTogUHJvbWlzZTxBcmNoaXZlc1N5bmNTdGF0dXM+O1xufVxuIl19
|
|
76
|
-
/* _JS_SOURCE_HASH = "
|
|
76
|
+
/* _JS_SOURCE_HASH = "67a51ea2056f67fec44ef235644e1851c362c370dd07441f25fe9d8af7dfd9c9"; */
|