diff --git a/README.md b/README.md index 2f5819d91..66b66d6bd 100644 --- a/README.md +++ b/README.md @@ -211,11 +211,13 @@ calling their respective binaries outside of projects defining the Download the selected package managers and store them inside a tarball suitable for use with `corepack install -g`. -### `corepack use ]>` +### `corepack use ]> [--from-npm]` When run, this command will retrieve the latest release matching the provided descriptor, assign it to the project's package.json file, and automatically perform an install. +When passing the `--from-npm` flag, Corepack will use the latest version of the +package with the corresponding name from the npm registry. ### `corepack up` diff --git a/sources/commands/Base.ts b/sources/commands/Base.ts index 54c815c14..c1dfff0cc 100644 --- a/sources/commands/Base.ts +++ b/sources/commands/Base.ts @@ -39,14 +39,21 @@ export abstract class BaseCommand extends Command { const {data, indent} = nodeUtils.readPackageJson(content); const previousPackageManager = data.packageManager ?? `unknown`; - data.packageManager = `${info.locator.name}@${info.locator.reference}+${info.hash}`; + data.packageManager = `${info.locator.name}@${info.locator.reference}${URL.canParse(info.locator.reference) ? `#` : `+`}${info.hash}`; const newContent = nodeUtils.normalizeLineEndings(content, `${JSON.stringify(data, null, indent)}\n`); await fs.promises.writeFile(lookup.target, newContent, `utf8`); - const command = this.context.engine.getPackageManagerSpecFor(info.locator).commands?.use ?? null; - if (command === null) + let command: Array; + try { + const _command = this.context.engine.getPackageManagerSpecFor(info.locator).commands?.use; + if (_command == null) + return 0; + + command = _command; + } catch { return 0; + } // Adding it into the environment avoids breaking package managers that // don't expect those options. diff --git a/sources/commands/Use.ts b/sources/commands/Use.ts index 0ac4dd3f4..fb6060081 100644 --- a/sources/commands/Use.ts +++ b/sources/commands/Use.ts @@ -1,12 +1,20 @@ import {Command, Option, UsageError} from 'clipanion'; + +import {fetchLatestStableVersion} from '../corepackUtils'; + import {BaseCommand} from './Base'; + export class UseCommand extends BaseCommand { static paths = [ [`use`], ]; + fromNpm = Option.Boolean(`--from-npm`, false, { + description: `If true, the package manager will be installed from the npm registry`, + }); + static usage = Command.Usage({ description: `Define the package manager to use for the current project`, details: ` @@ -17,23 +25,51 @@ export class UseCommand extends BaseCommand { examples: [[ `Configure the project to use the latest Yarn release`, `corepack use yarn`, + ], [ + `Configure the project to use the latest Yarn release available from the "yarn" package on the npm registry`, + `corepack use yarn --from-npm`, ]], }); pattern = Option.String(); async execute() { - const [descriptor] = await this.resolvePatternsToDescriptors({ - patterns: [this.pattern], - }); + let packageManagerInfo: Parameters[0]; + if (this.fromNpm) { + const registry = { + type: `npm` as const, + package: this.pattern, + }; + const versionWithHash = await fetchLatestStableVersion(registry); + const [version, hash] = versionWithHash.split(`+`); + const location = `https://registry.npmjs.com/${this.pattern}/-/${this.pattern}-${version}.tgz`; + packageManagerInfo = { + locator: { + name: this.pattern, + reference: location, + }, + spec: { + bin: {}, + registry, + url: location, + }, + hash, + location, + bin: undefined, + }; + } else { + const [descriptor] = await this.resolvePatternsToDescriptors({ + patterns: [this.pattern], + }); - const resolved = await this.context.engine.resolveDescriptor(descriptor, {allowTags: true, useCache: false}); - if (resolved === null) - throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`); + const resolved = await this.context.engine.resolveDescriptor(descriptor, {allowTags: true, useCache: false}); + if (resolved === null) + throw new UsageError(`Failed to successfully resolve '${descriptor.range}' to a valid ${descriptor.name} release`); - this.context.stdout.write(`Installing ${resolved.name}@${resolved.reference} in the project...\n`); + this.context.stdout.write(`Installing ${resolved.name}@${resolved.reference} in the project...\n`); - const packageManagerInfo = await this.context.engine.ensurePackageManager(resolved); + packageManagerInfo = await this.context.engine.ensurePackageManager(resolved); + } await this.setLocalPackageManager(packageManagerInfo); } } diff --git a/sources/specUtils.ts b/sources/specUtils.ts index 9d366675a..0770a6eac 100644 --- a/sources/specUtils.ts +++ b/sources/specUtils.ts @@ -20,7 +20,7 @@ export function parseSpec(raw: unknown, source: string, {enforceExactVersion = t const name = atIndex === -1 ? raw : raw.slice(0, -1); if (!isSupportedPackageManager(name)) - throw new UsageError(`Unsupported package manager specification (${name})`); + throw new UsageError(`Unsupported package manager specification (${name}). Consider using the \`--from-npm\` flag if you meant to use the npm package \`${name}\` as your package manager`); return { name, range: `*`, @@ -33,7 +33,7 @@ export function parseSpec(raw: unknown, source: string, {enforceExactVersion = t const isURL = URL.canParse(range); if (!isURL) { if (enforceExactVersion && !semver.valid(range)) - throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version${enforceExactVersion ? `` : `, range, or tag`}`); + throw new UsageError(`Invalid package manager specification in ${source} (${raw}); expected a semver version`); if (!isSupportedPackageManager(name)) { throw new UsageError(`Unsupported package manager specification (${raw})`); diff --git a/tests/Use.test.ts b/tests/Use.test.ts index 8c91fa217..3d12dae91 100644 --- a/tests/Use.test.ts +++ b/tests/Use.test.ts @@ -64,4 +64,23 @@ describe(`UseCommand`, () => { }); }); }); + + it(`should accept --from-npm CLI flag`, async () => { + await xfs.mktempPromise(async cwd => { + await expect(runCli(cwd, [`use`, `test`])).resolves.toMatchObject({ + exitCode: 1, + stdout: /Invalid package manager specification in CLI arguments. Consider adding the `--from-npm` flag if you meant to use the npm package `test` as your package manager/, + stderr: ``, + }); + + await expect(runCli(cwd, [`use`, `test`, `--from-npm`])).resolves.toMatchObject({ + exitCode: 0, + stderr: ``, + }); + + await expect(xfs.readJsonPromise(ppath.join(cwd, `package.json`))).resolves.toMatchObject({ + packageManager: `test@https://registry.npmjs.com/test/-/test-3.3.0.tgz#sha1.a2b56c6aa386c5732065793e8d9d92074a9cdd41`, + }); + }); + }); }); diff --git a/tests/nock/fsYZFJKYLkFfDv-Jyd3j2w-2.dat b/tests/nock/fsYZFJKYLkFfDv-Jyd3j2w-2.dat new file mode 100644 index 000000000..406b28f5c --- /dev/null +++ b/tests/nock/fsYZFJKYLkFfDv-Jyd3j2w-2.dat @@ -0,0 +1 @@ +;"https://registry.npmjs.org/testo"body"eyJuYW1lIjoidGVzdCIsImRpc3QtdGFncyI6eyJsYXRlc3QiOiIzLjMuMCJ9LCJ2ZXJzaW9ucyI6eyIwLjAuMiI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjAuMiIsImRpcmVjdG9yaWVzIjp7ImRvYyI6Ii4vZG9jIiwibWFuIjoiLi9tYW4iLCJsaWIiOiIuL2xpYiIsInRlc3QiOiIuL3Rlc3QifSwiZGlzdCI6eyJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4wLjIudGd6Iiwic2hhc3VtIjoiNjdkMDYxMDMxOWQ0MzA4YTM5ZDFiMjViMGEwNzRlNzA5YzRkYzBiZSIsImludGVncml0eSI6InNoYTUxMi0xVXFVbFo0Q1JNdVlQVXVNR1RMbFVVR0R3QUpsSWVHM3czbnp2T0RIdVZBWXlYQ0NFM3RVUlhsVXMveW8rTDZoRG5Xb3dmcThFQkxSUnV4T2ZwamMwUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FVUNJUURyTVg4Y012c2xocm9ITGhwOEJ2NXptQmZsTW9ETVYydWNBUk1adFZuU2hBSWdMVVdPa2Zzb0JJa1hRTVl5RzljTXFOTUVTYzZ2UEkzTm04aW1vNUZxZURJPSJ9XX0sImVuZ2luZXMiOnsibm9kZSI6Ij49MC4xLjEwMyJ9fSwiMC4wLjMiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4wLjMiLCJkaXJlY3RvcmllcyI6eyJkb2MiOiIuL2RvYyIsIm1hbiI6Ii4vbWFuIiwibGliIjoiLi9saWIiLCJ0ZXN0IjoiLi90ZXN0In0sImRpc3QiOnsidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuMC4zLnRneiIsInNoYXN1bSI6Ijg3YmQyMDQ4MDdmOTk3MmNkOTA5NjIwMmE0MGNkN2VlZDRlYWQ1ZTAiLCJpbnRlZ3JpdHkiOiJzaGE1MTItS0xCNzR6SFBkMllYL1Q3NlU1YkhBd01nOHdzVkJPUUpqblhmUHRQNFhMbllBSXVVVlFKaWRpNTJ1Smx2OWZ2VE5xOUFscDMxSlMzV3pPUFBpaGRxRkE9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSUdteVZhdnVaQ0kyaUk1dWVKZjI0clEwcjJzTnloK1EvZGIvRXR2aE9xRkNBaUVBaFg4NkVTWlFKaHgwdjVsRzlMYjlKTVZHbSszWldKYVNyWUs3T1RnT3ByVT0ifV19LCJlbmdpbmVzIjp7Im5vZGUiOiI+PTAuMS4xMDMifX0sIjAuMC40Ijp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjAuMC40IiwiZGlyZWN0b3JpZXMiOnsiZG9jIjoiLi9kb2MiLCJtYW4iOiIuL21hbiIsImxpYiI6Ii4vbGliIiwidGVzdCI6Ii4vdGVzdCJ9LCJkaXN0Ijp7InRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0wLjAuNC50Z3oiLCJzaGFzdW0iOiJkYzY1MzZmZTQ3YTk0MzdhMGYzYzU4NmMwYjNjMDU2NTllZDViZTlhIiwiaW50ZWdyaXR5Ijoic2hhNTEyLUJ2Ni9SdVUySm14N1hBaWx4N2hERnQxRU9tSURNSWloSjNrNnVxZUJFMVhYQk02aktocG1zYzUySGR5c2dKTUdGbUl0b2VScmFiRlBXUWRxNVZuVFJnPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lGd29LVWgweFRhYWZLMGZtMWNqUXgrM29FRTF6blZGcDN4VzhSc0JIbDVqQWlFQXplb2EzV0ZEeDNxb3JxaXZPdFI1NDVzRHBNNEhrcFY3SHB6cVZOSUJ0bEE9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjEuMTAzIn19LCIwLjAuNSI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjAuNSIsImRpcmVjdG9yaWVzIjp7ImRvYyI6Ii4vZG9jIiwibWFuIjoiLi9tYW4iLCJsaWIiOiIuL2xpYiIsInRlc3QiOiIuL3Rlc3QifSwiZGlzdCI6eyJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4wLjUudGd6Iiwic2hhc3VtIjoiMDU2NWM2MmRlOTA0MmQ0MDRjN2FmOTQ4ODg0Y2E0NGUyNzdhOGY0YyIsImludGVncml0eSI6InNoYTUxMi1DUTFiR2pPMC9XNGtodzloSTBFRDBUSWF6bGtrSFg0bUwxV1BzaGRVSk9XcDlJd3ZmYjJWTWJmaVJubWE2a2htVkZlanBlYkVFYzhsTmJXaG85SjlQdz09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FWUNJUUN1VDUwcEY5SE9KVTFRejVNNGxXMUxCb1l3SjFWa0RiTlRWM1NXS0tobERBSWhBTFhPUjd3dWV1NXUwUGkxVW1OVWRTTGR0b09zSjFRcmJVbVl3akUzQmJTMSJ9XX0sImVuZ2luZXMiOnsibm9kZSI6Ij49MC4xLjEwMyJ9fSwiMC4wLjYiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4wLjYiLCJkaXJlY3RvcmllcyI6eyJkb2MiOiIuL2RvYyIsIm1hbiI6Ii4vbWFuIiwibGliIjoiLi9saWIiLCJ0ZXN0IjoiLi90ZXN0In0sImRpc3QiOnsidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuMC42LnRneiIsInNoYXN1bSI6ImY3NGMwOTVlNzg5NTY4ZTljOGEwMDQ2MDJkNjk1ZDg1Y2Y4ZjIzMzQiLCJpbnRlZ3JpdHkiOiJzaGE1MTItUERUcUdLN3ZUZE1yVUc1cldDYlg4WEtwRkNBTUV2VHk4YUxLSkdteGpWRzRXWmxjeHEwTFk1cEZFUXpLTmtyUStwTkZ5c0hsNGFrVU5IQ0dEaEJQNEE9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVlDSVFEYjY3SXNwNnJ3ZFFEK0FnUHEwZlRacEFPWVl6Y3huc0VKeGVHU3FXZGU4UUloQUxXTGZNQnZUdnhJL2lDZnNidnlFaWI4SlNpby9HTkZFdnFSK1BKSlZvZlgifV19LCJlbmdpbmVzIjp7Im5vZGUiOiI+PTAuMS4xMDMifX0sIjAuMC43Ijp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjAuMC43IiwiZGlyZWN0b3JpZXMiOnsiZG9jIjoiLi9kb2MiLCJtYW4iOiIuL21hbiIsImxpYiI6Ii4vbGliIiwidGVzdCI6Ii4vdGVzdCJ9LCJkaXN0Ijp7InRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0wLjAuNy50Z3oiLCJzaGFzdW0iOiJmM2NmZmYzNTAwZmRlZDJmMDYwZDIwMGI5YTg5YTQ2YjQ4MTQzMWE3IiwiaW50ZWdyaXR5Ijoic2hhNTEyLVI2d0QzS1JjV3RHNUI2cys0YjBZaml2cFNUcmUvdnJ5czVHNVlBTDI5ZHRGY01GekpDdHN3eEpjaVVYNlpocEcxbE1jRy9YUHdjWFVmamRUZzdISTl3PT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lIRm5ldmQwRVJJOUk2TDJnS3dLSHVLdTRLZFo5dmppUTAxTTErS2FjTXlPQWlFQTl5S2V1Wmo2WnI4aGtwZnB6MVBTdHBJZGxoRzFxNkwzMXlJWk1HREljS0E9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjEuMTAzIn19LCIwLjAuOCI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjAuOCIsImRpcmVjdG9yaWVzIjp7ImRvYyI6Ii4vZG9jIiwibWFuIjoiLi9tYW4iLCJsaWIiOiIuL2xpYiIsInRlc3QiOiIuL3Rlc3QifSwiZGlzdCI6eyJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4wLjgudGd6Iiwic2hhc3VtIjoiYWRiOWY0NTVjNjIxY2Q1ZWU1YmFlMTBkY2I4OGEyNDE0NjhlMWFiYyIsImludGVncml0eSI6InNoYTUxMi1nSjZOU3JnUHB5N2lXY1Y2YW9KdC9zbTJ4V1hGL2JGVUh2Q1ZaVFJjWDFBaEJ5OHo5WDJleFEraWtIdFZmZTJENnVmdkdHSHNRL1JiWmd0eFFPc2tWQT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FVUNJQ1llVTZBc3dpQzdNSGJqNDVMVGJYRURaSDJQdllJY1ErSWxvQTh3c1FyMkFpRUF4ZmFMTFU5MFVqSkpJYm14dG1CK1ljVkJDbGl2NXh6NThpR0I5RWlUZFhRPSJ9XX0sImVuZ2luZXMiOnsibm9kZSI6Ij49MC4xLjEwMyJ9fSwiMC4wLjkiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4wLjkiLCJkaXJlY3RvcmllcyI6eyJkb2MiOiIuL2RvYyIsIm1hbiI6Ii4vbWFuIiwibGliIjoiLi9saWIiLCJ0ZXN0IjoiLi90ZXN0In0sImRpc3QiOnsidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuMC45LnRneiIsInNoYXN1bSI6IjIyYjQyOTg5ZmIzYmFmZjUyN2YzNzVkZGE4MzhkMzgxYjhhMDc0ZjEiLCJpbnRlZ3JpdHkiOiJzaGE1MTItVUFOa1d3RXc2aTlxZ2Q4a2M0Zmh0UXVTUXB6RS9waCtqTFBNU0lHL2NMOWk1WUJVZHRQVjBvdVJ1TW0vOUFydGx6TjJtOGRpM1RvV1lUVTRKeE9VZWc9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSUdnN1FYUy83NWFIV1lwTXFyUldhTmN4VHVHb3JtYk1WZUJURTFLK2hUSEpBaUVBcnQzT0VnckRFNTMwaHhSdldzaERuRHVUc1VhdHYrRTQ2TGtVSXkvRE9OND0ifV19LCJlbmdpbmVzIjp7Im5vZGUiOiI+PTAuMS4xMDMifX0sIjAuMC4xMCI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjAuMTAiLCJkaXJlY3RvcmllcyI6eyJkb2MiOiIuL2RvYyIsIm1hbiI6Ii4vbWFuIiwibGliIjoiLi9saWIiLCJ0ZXN0IjoiLi90ZXN0In0sImRpc3QiOnsidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuMC4xMC50Z3oiLCJzaGFzdW0iOiJmNzk1ZjNiNTNjMWNjYzdhYjMyZGJiZDA4ZDcwMTc1NDAzZTMyN2Y2IiwiaW50ZWdyaXR5Ijoic2hhNTEyLWRWYjgyczdzdmhhN0t2WW8zMUtEc3dXdzJzUmJvczFlb0o0YmViTVg1SXRyRE1kQ1JxVC9jMlNIMG16R3dJYVg2bjlDRURvOENBbWxENGVDZDhsMU9BPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lRREFXQ1QrRUx6T0xUMy9lU3FQczhjYTJFNmp2WlVrVk1BYnJFNDNhcTBIcVFJZ2NFd3U2VFJPeTR6eUlXVVhWT0tvRFhLcEs0N05MYTFqRFR0Y0dHTENZMEk9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjEuMTAzIn19LCIwLjAuMTEiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4wLjExIiwiZGlyZWN0b3JpZXMiOnsiZG9jIjoiLi9kb2MiLCJtYW4iOiIuL21hbiIsImxpYiI6Ii4vbGliIiwidGVzdCI6Ii4vdGVzdCJ9LCJkaXN0Ijp7InNoYXN1bSI6IjA4OTI5NDFjNmEwODQ1MmNmMmRiNjM5NjA0ZjRlMzFlNGE3YTRjNWUiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4wLjExLnRneiIsImludGVncml0eSI6InNoYTUxMi1jcHB3WUdDTjJvL1JoSGRFbWR5QU4xNmQyYmdsUG93bmlTbFhFbXZ3UzFFbFdaMC9YL1R0Z1lwNjhFSmQ3OVg2ZGc2ejVqTmpYR3JXZUp5RTdNYjRidz09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FVUNJRyt0c1J3Mk1NWEZRMk4xNWI5K0N1Y045cWNBQllaRnArbDA5WXRqM3gvZUFpRUFxVk12azBXeDdNejlISElRMjFrR1U1T2t2QVpuT0pYUUtOcXI1UndtQ0tNPSJ9XX0sImVuZ2luZXMiOnsibm9kZSI6Ij49MC4xLjEwMyJ9fSwiMC4xLjAiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4xLjAiLCJkaXJlY3RvcmllcyI6eyJkb2MiOiIuL2RvYyIsIm1hbiI6Ii4vbWFuIiwibGliIjoiLi9saWIiLCJ0ZXN0IjoiLi90ZXN0In0sImRpc3QiOnsic2hhc3VtIjoiMTc2YjRmOTQxODhhNGU4ZWEzMzk1MGQ5ZjI5NThiOTViZWE3NDc4ZiIsInRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0wLjEuMC50Z3oiLCJpbnRlZ3JpdHkiOiJzaGE1MTItd3ZvOGZpOEROTVowc3dEODhaL0w1MitGREZ4dit3eE5WYm1KUmd0WHg2OE1zVFlSTW16VHZTSklCQVVBdDY2Mm5FYXNaNFMzUjlENXJzV09VbEdXOXc9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSVFEMzZ5MEI3VWhTaGdmRFNmN0JrdHRKSlBaY3YzdGJBbkNrU1pHZlRVWGdId0lnVjVBajhxSmJGbWpmaXpKZGlIKzREdCtjQW1QaFJuOE5lTzZCSU9obTNpRT0ifV19LCJlbmdpbmVzIjp7Im5vZGUiOiI+PTAuMS4xMDMifX0sIjAuMS4xIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjAuMS4xIiwiZGlyZWN0b3JpZXMiOnsiZG9jIjoiLi9kb2MiLCJtYW4iOiIuL21hbiIsImxpYiI6Ii4vbGliIiwidGVzdCI6Ii4vdGVzdCJ9LCJkaXN0Ijp7InNoYXN1bSI6IjAyZmRlMWQxNWEwZTIzYjc0YzI3NDE0NmIwNjYzMTg0MjRiNGYwMzMiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4xLjEudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLWVKeS81cHpsbkl6aFJ1VVMyZlpWOTJrZFNQcGlpQk91L29qSTk5NzhmMXJ0emVjSnQxL0FBdDlvTlRDWkF2ZGFTOTN1anZTaE82eHRkcU1zVFVZRmtBPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVZQ0lRQ3hJSDRRZ1dDcllyVlF4MEUzL085OUc1cXJRZ01Ydnk4cVJEWmpueUZUTlFJaEFLWkV3aHByWWQwWWZrMHppWUY3Q0lyZk9hejdoYm9SVUVhUEs2bW1nS0RwIn1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjEuMTAzIn19LCIwLjIuMCI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjIuMCIsImRpc3QiOnsic2hhc3VtIjoiOWUwODI5OTU4NTlkOGU5Yzc3MTZkYjliMzA2YmM3ZDVlMTVmMDI4ZSIsInRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0wLjIuMC50Z3oiLCJpbnRlZ3JpdHkiOiJzaGE1MTItM2ZHK0IzRHgvR2QyYmx5MUlNZ1hXRkd4RTVpb2lZNmE5allpQ0l2VVJOY0RoclNKdEtlY1BOcDIyQmpMUkRGRlZ5MkgyLzY3M0NidlhKZWdiNkdGWGc9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVlDSVFEQVoyZUVJQlhxR3I0aGZNSGpkSTFlbXlhZGdiYnh0akhTRmZrUXkvUmVpZ0loQUo2U1hDME1KTHJsY2dMaUlOSXpDU3RBcGdsQXlzL2hoZWhxeGozd0V1a3QifV19LCJlbmdpbmVzIjp7Im5vZGUiOiI+PTAuMS4xMDMifX0sIjAuMi4xIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjAuMi4xIiwiZGlzdCI6eyJzaGFzdW0iOiI4OGFhMTRiOGI4ODIwYTNiNjM5NTk3NTY1YjUwN2I2ZGU0NzFjZGRkIiwidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuMi4xLnRneiIsImludGVncml0eSI6InNoYTUxMi1kY1puejNNVEpDSFlzRUplUmJIZlBUREdwdFJ1bTJEZVg4QnJONEdaNVQ1NXBCK0s1VnltTUpiWWpsLzRtUHBzSUNXUkgwTW5PMzRnUTJjMWpnSm5Mdz09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FWUNJUURQeDFCWXR0Rk5pRGVvYnVWZ1haNCtIZERtejZ1Qkk2M0VqQzNwb1Z5WUV3SWhBUG16enlEQm1sUzJmejcvOFo2dU85Nmdmai9URzRudlgzVHVSY05Vd3lFQiJ9XX0sImVuZ2luZXMiOnsibm9kZSI6Ij49MC4xLjEwMyJ9fSwiMC4zLjAiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC4zLjAiLCJkaXN0Ijp7InNoYXN1bSI6ImI3Y2E2ZTU4OTEwOTBhZDNjNzQ3NWJkMzI1YjFmZmY0ZDU2ZTVhYTIiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC4zLjAudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLXJOeEs3b25nYytGaysreXdjb2JMMG5keERFY2tHamVjSmVQZXB2L0xBOVltazYyR3F2Z1hMRlk2QUh3d3hiNTNrRlZKRlJneVorYndaVlYyb0NXem53PT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lCdmFWcFdZM2VOTlZQQWkzVVU3N0I5akxEYVhTa2U1cEltL092ZERpc0RxQWlFQWhIQU5nVmt1cDZ4VGI0RmlhR0l4MzdoMytyb0J2SXVrdXhKVHN5WjBtR3c9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC40LjAiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC40LjAiLCJkaXN0Ijp7InNoYXN1bSI6Ijg1ZThkYjI5MjkxYWQyZTY2ZDM5YTAzMDEzYjliYjRhMWZkOGExMzUiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC40LjAudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLVdJMStmVjJJdFdIeWxjVnV1RW5hMThqR2JNcmhKU0RvVGN3ZVV4M0FSQUhlKzdEWUxuZUdVeHBBVzVvdy92eTZIQ3FrV3pMQngvcFR1OS83dURSZGVnPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVRQ0lFZEI3SC9ubFVoWnFQeHZ2VU5VS2JsbGEvS0ltSVZqc21jYVNxSXZQdmt2QWlBU0xWbkF5RXQrOG4xRER4c0tvQjF4Mmo0QUQxMXdscTJrZEhXdTl5L2syQT09In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC40LjEiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC40LjEiLCJkaXN0Ijp7InNoYXN1bSI6ImZiYTNjM2M3MzZiZDc4MjI5ZjQ2MmI1MjVjNDFhMzJhYTdjOWNjYWQiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC40LjEudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLUpFa3gyTnhzVFpSYUlqdVViNjhJeHlvQkJvMUpxRlV6NkU3Mys2OFFTaFlLS3VxaGJMbGpSOVhnaEV0SStjMTBEWERkeXJHNy8xVzRkdmhVbVRidDFBPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lCN0N5eVBPOUp6enFMMEdPc0ViUU5Lc2JJRGZWYWxxZ0QybFVFbjB6RDc5QWlFQW9ac1ZyZFc2VjZFbEQwanNrbmxYM3VnZmRPZWlhTmpJSWxNWFVQT1NnaFU9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC40LjIiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC40LjIiLCJkaXN0Ijp7InNoYXN1bSI6ImU0ZjU1ZWIxODA3MWYyYTJhM2M3OTMxMTFhNDg0Y2NiMzNhNGNiNWQiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC40LjIudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLVNtWVNXQkJTRWtlS2hYUlN1M2t5RVFkaklmUnZHQ3RYUjhzTzlvc2Vqb2ZLallvL2tjT01rUTkwZ2RNZDI4UVVxY3dTYUZoQnRrVGJnNW02SzM2bjlRPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVZQ0lRQ2NjS2JWbmhycVJEdmQ5L3RxN0RROUc1YkttaitPT1kzUzlPWkgzZVNXSndJaEFLQW5xY0x5UTN4aVBHcmNLbXBHSzhYWFd6bkh2WDVXckN5NGJ2cXhhUHN4In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC40LjMiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC40LjMiLCJkaXN0Ijp7InNoYXN1bSI6ImJmMDJlMzhiZGVlYTAwMDE2OWUzZjAzOTcyNmU2ODY4ODI3Y2UyMmIiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC40LjMudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLVE0NjJIVkIrQ3YxeUR0d2dQbzlTdVdUZ25hbmphT24raEpCWVE4ejgwYzJZRlJxeVR6RC93TUVHQkFCUTRKUnZVcUh6TzhYc3VxN1E3cXlmaXQrTEZnPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVVQ0lRRDJzeHduSjBOdkp3VHExazVpNzQrMitOTnFpelY3K0MxUlk1aWd2ZFJabHdJZ2JxeU9hZ0o3ZUxQM3RQT1lFdVNXM0NzREhLYTNGQjhJckRxNlAxSDBnMTQ9In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC40LjQiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC40LjQiLCJkaXN0Ijp7InNoYXN1bSI6Ijc1OGZjMzIzNzU3MWFiN2I2YmE2YWMxYmVmZGUxMGYxOWI5ZWRhNDciLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC40LjQudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLVZGSU5QV1VQeFJZSkZPU3AzM2p4WGl5YW1ENWVMaWl2akl4L3VybDBZUTA4S044N1paRTlXS21HUVFiODV6c1ZaVlQ2bExLcmFkc1pneVluS2pUd0dRPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVRQ0lIcEdrendzcXM1OTNFbStUOXE1S1hGLzhvbjdHV09xVzAzR0tBVC9IaStMQWlBREx5WjhaZGFKZUZkeFZnMUhpaEh5UDZKdEJsRVdBOVlvMHNqMjkvM1g1UT09In1dfSwiZW5naW5lcyI6eyJub2RlIjoiPj0wLjQueCJ9fSwiMC41LjEiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMC41LjEiLCJkZXBlbmRlbmNpZXMiOnsiYW5zaS1mb250IjoiMC4wLjIifSwiZGlzdCI6eyJzaGFzdW0iOiI3OGM2NDA5ODJiYzE1ZDlmNDFhMTlkNWJhZjRhM2FmMTI4NTI4MmYwIiwidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTAuNS4xLnRneiIsImludGVncml0eSI6InNoYTUxMi11KzVTUzJTL2hMWHZLTUVYeWE4TS9ROTlUUktDREplM2VDVWFXZGgzTlMyKy9pZWo2T1ZjY0s1NXhXVmIzN3Y3VVFPUG0wQy9mN3RXNXRtQmVTUCtwUT09Iiwic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FWUNJUUNnME5udWRzUHJSdjFDaGFmb085N0QwNkJaVWF0TFpLY3czVDFBSWsraWNBSWhBUHgvTkk5WG5tdnN0SitSdTZNVWlQWkZNQ2FOQlI4SDA2RHdwK3NIQXV2SiJ9XX19LCIwLjUuMiI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIwLjUuMiIsImRlcGVuZGVuY2llcyI6eyJhbnNpLWZvbnQiOiIwLjAuMiJ9LCJkZXZEZXBlbmRlbmNpZXMiOnsicGhhbnRvbWlmeSI6In4wLnguMCJ9LCJkaXN0Ijp7InNoYXN1bSI6IjBkNzI2ODMxYTdkOTg1MmQyNWU0NmU2YjgyNjVmZWEyMTZjYmQ4YWQiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMC41LjIudGd6IiwiaW50ZWdyaXR5Ijoic2hhNTEyLWlQV2dUT0VOczNTQ09ScXByL3ljMnZITThjT1VFZU9kTVBhK0FrVHQxekhEemRLdm1HWFo4V1RWUVVCSUd1RFdCZDRTUHo1TlNZMHhFVldhbDNBeU9nPT0iLCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVRQ0lGYUdhbDhHc2ZsdDRmNXFkRkhqeVRFamVUOFNORDNneUZjYklBTW16dys3QWlBWFY2aUFWNTh1YTgyRlJUYjVYRGFQb3RyY0NYazErMXVjc1ZDZDJjVVEwdz09In1dfX0sIjAuNi4wIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjAuNi4wIiwiZGVwZW5kZW5jaWVzIjp7ImFuc2ktZm9udCI6IjAuMC4yIn0sImRldkRlcGVuZGVuY2llcyI6eyJwaGFudG9taWZ5IjoifjAueC4wIn0sImRpc3QiOnsic2hhc3VtIjoiNTk4NmFjNDQ1ZWMxNzc1NDMyMjUxMmQxMDRiYTMyYzhhNjNlOTM4ZSIsInRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0wLjYuMC50Z3oiLCJpbnRlZ3JpdHkiOiJzaGE1MTItZGZiemVBSTA5dGpKTTBUQ3h4ekx6UG5IQU84Z1hITjZLYVo2Tjl6QmRlMllPRlh1bkhPNjl0ZXR6L2FpOTNYUnNPT2tFbThxNElFM01KQi9SbHN6eEE9PSIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSVFENmtnR1JZNzhIcmlaK1hxREI4dUFlckVDMXVhcDRXUHhyMEtzeWIweXVSUUlnZGZqczQvYlllK0F1RUJ4ZDNlcnNzZU5acE9ONEpGcy94dC8vNzV6bUtmQT0ifV19fSwiMy4wLjAiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMy4wLjAiLCJkZXBlbmRlbmNpZXMiOnsibWluaW1pc3QiOiJeMS4yLjYiLCJzdHJpbmcucHJvdG90eXBlLnJlcGxhY2VhbGwiOiJeMS4wLjYifSwiZGV2RGVwZW5kZW5jaWVzIjp7InN0YW5kYXJkIjoiXjE3LjAuMCIsInR5cGVzY3JpcHQiOiJeNC42LjMifSwiYmluIjp7Im5vZGUtLXRlc3QiOiJiaW4vbm9kZS0tdGVzdC5qcyIsIm5vZGUtLXRlc3Qtb25seSI6ImJpbi9ub2RlLS10ZXN0LW9ubHkuanMiLCJ0ZXN0IjoiYmluL25vZGUtY29yZS10ZXN0LmpzIn0sImRpc3QiOnsiaW50ZWdyaXR5Ijoic2hhNTEyLU1tS1NIUmo2SzVhVnU4S244SGN0UUl4d1pxamVvOU0yQXppcm56SnY0ZjBKZWFneUZvU040VDJFR0ZBTG90YTRWdzJscnZjdnQ4M1RrUjhJTk1OSGFRPT0iLCJzaGFzdW0iOiJmZGZhMDkwYzNlMGI3N2EyMjgzZTJlNmMwZDY5YzU4NWZkODI2ZWUzIiwidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTMuMC4wLnRneiIsImZpbGVDb3VudCI6NTUsInVucGFja2VkU2l6ZSI6OTEzNTAsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSVFET3oxRk1HNEg5b0xHS0FjS1F3SkdXWXlWVFY2SE1QTzlUUS9GY0l2bFFvQUlnTUlBdUJjWkZQNitiYXhISWtrY2VWVmZiN1VEVzZjVC9uVGpNMElKWHFaQT0ifV0sIm5wbS1zaWduYXR1cmUiOiItLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG5WZXJzaW9uOiBPcGVuUEdQLmpzIHY0LjEwLjEwXHJcbkNvbW1lbnQ6IGh0dHBzOi8vb3BlbnBncGpzLm9yZ1xyXG5cclxud3NGekJBRUJDQUFHQlFKaW1NQWtBQ0VKRUQxTld4SUNkbFpxRmlFRUNXTVlBb29yV01oSktkamhQVTFiXHJcbkVnSjJWbW96YVEvK0xOOWlVL1FtWlpESCtCemlXekJkWnJvclBlNm9iclUyWkxFTGZUUndRNW4wZHFQdVxyXG5ibVp3SWJINDI0VWZpVjRwL09yV0UxcloxR3NUb2N0Qys0aU5mMURBL09RSlNvK24zeDI4elR5YzFtelZcclxuSjFGNHp1VTJ6ZVpSanU5OXpZZmU4WUJlUzFoZDk3MzhTWS9rTUJmRCtraVgwNlZNNEZnNkQxcW1YcXBDXHJcbm1OeEhxRGdqeE41MWJ0aVp1NUdLRzAvL2d0L3gybFduN2tDR1M0eVpQQ3NiNkRwRjdkbFQ2elpzUGFFT1xyXG5lYjhTN1hxSHAvSEUzYVJBS3Y4VDlLRTRoZ1NiZGhNRFcvRldWaTJuM1hmUkQvLzRTWjMwSC9QRXNQeW1cclxucU5SaDRQL1Rqd2c2NVVzZG8yVXNmbEFEVUJKWTdVdnRtb1hWeDZXL21ZNFJDYmpUTVpHUWNKRDNYNllVXHJcbmxaYUhnQVNQSHpZQXh2cEdaeHU1MEZGYTF4RmlvVG1ERUQrWFRmUk00a0lZUGRpSkRVWVJ3emxiQ3QzV1xyXG5nUzRJV0s5T1I2ZjFTQjA4bDdwSUN5ZG5tY2NYTExqWHNPeGw2bXdEbUFobEJGS0dQS3hHNEFZTUs5Q1hcclxudHRseU5HOElOM2xzYmg2QXlIUHpJdU5tTGVPMjJsWGwvdVlzUjJ0V2x5bGJ1Z0hxWGdJRmJXQmNhd1pqXHJcbm1kWk5TMm1JUndZWmhpRjE5Q3ltVEQrZEc4STA0VXZIc0xGRW1RWktwQ2pxTkdWVklXbmlQalJIek5aVlxyXG5XTHlWUWxrelBUSExEczRiWVZUM2JmQVovMWhYbTdKZnQ1dmlLMmQ1MTN1bEE4TXdnTG5tYVhCUzNSWVZcclxuMndRTnErdFdjOHFILzAwdExVWWJramIwWlN5LzdtMG45OGc9XHJcbj1oZHJsXHJcbi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG4ifX0sIjMuMC4xIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjMuMC4xIiwiZGVwZW5kZW5jaWVzIjp7Im1pbmltaXN0IjoiXjEuMi42Iiwic3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYWxsIjoiXjEuMC42In0sImRldkRlcGVuZGVuY2llcyI6eyJzdGFuZGFyZCI6Il4xNy4wLjAifSwiYmluIjp7Im5vZGUtLXRlc3QiOiJiaW4vbm9kZS0tdGVzdC5qcyIsIm5vZGUtLXRlc3Qtb25seSI6ImJpbi9ub2RlLS10ZXN0LW9ubHkuanMiLCJ0ZXN0IjoiYmluL25vZGUtY29yZS10ZXN0LmpzIn0sImRpc3QiOnsiaW50ZWdyaXR5Ijoic2hhNTEyLTR3T0pHbGVvamQraHdSOWEvbDAyZGFtWElmNkVENFpQSjFNWUZLZ0JVZklEQzRmQ01aTEVydFdUNENwdXlFc0k1QU9heFg2dmxBVFBSNHFldFV4Zi9BPT0iLCJzaGFzdW0iOiJkNWNmYmVjMjkxZjQ4ZDQyN2VhOWZlODA5YWVmMDcyZmM3ZjI1YmU3IiwidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTMuMC4xLnRneiIsImZpbGVDb3VudCI6NTUsInVucGFja2VkU2l6ZSI6OTEzNDgsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVlDSVFDN1Y3YjNlajNRZ3dKUDFOa2JjL1ZQTVYrSmNYa3YrbG40MXVlVElZLys0d0loQUpwbi9QWVg1ZndFUEhMMHJHNlZlRld4clhKNmFHd1BrV0JwUUtZN3FRNlgifV0sIm5wbS1zaWduYXR1cmUiOiItLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG5WZXJzaW9uOiBPcGVuUEdQLmpzIHY0LjEwLjEwXHJcbkNvbW1lbnQ6IGh0dHBzOi8vb3BlbnBncGpzLm9yZ1xyXG5cclxud3NGekJBRUJDQUFHQlFKaXFadTFBQ0VKRUQxTld4SUNkbFpxRmlFRUNXTVlBb29yV01oSktkamhQVTFiXHJcbkVnSjJWbXBhaFEvK0xKUlJnajIybm0ySndvMEpuQ1QwM2ZmM01lNCtVNWE1R2VNTVJKV0pBcVQzeEtpUlxyXG5TMk9CNFZaUEttS2JudXBFNVNxbTBQbDFXRUZlVUFUVzFNc0ZsYUNHVE54bEdqVGU1Q213b3I1Z3JFU21cclxuaHFiUVM0UU9HWDYxZkZqU2FkN3YvTGdxWHV3cGNRRktWREdSdWVKSktIM1RveGZqNzZxc2dlQUdpSUYwXHJcblZxTVhzZ1pYeGJKcElTelJUL2V6QUVONlBkWlY2SVQyZlpHRUcrR3F5YWdRRm5QOEsvMm4rV1BVZnVPcFxyXG5LU2daN1JCeUxuRzMwNWhBNUM5UlZyQkFDNll1d2JBdExFa2ZjckZpcmlXSmVLSWUxcitTT3V5ME5yZFZcclxuMUZKQ3VCMGg2VDdZY3BvSDlCMWpZZVJqZ1pacW9CZWxFVmZObjg4SHJZQmw3M3I0dGJWM0pDZHdyZVhvXHJcbjNQaldrZnVmS1RqWWpzZkhrQlRiWm5rZ3BMTURPdld3bjhyaFByanNNUWNUUmI5Tnp6M2ZaSG9ncFIrOVxyXG5XZDJJL0FzOEI3aktUT3ZDc0hHQ29HWDh6R3ZhcmY1WnhoQTdaZlY0WUVuYlBNRGVROXF0U2p2a0lSem1cclxuMmlMSTJVdzk0K1lVeGE1aU5sMHlCSnBFb0hmN1VMWi9Bam9PUk8zbFdnVUlOY29zVExhWjNEVVEwdWNDXHJcblphU0lPOGxNUkl4MVk0NXBTTHhRaHBSamprTVJiOU5paUhzNng1WndzeU1sRzVWRTdQQzBZdlpmMnV0UlxyXG5XN01FaVpOc1lZdVVEblNuMUxacURSRjJWSW9tRFVTZ1hFTUhSYUhnVFdTZ1RRN0xob1NRbmJUZHlKTVRcclxuRG1SOG12T1dCZDhDaEdNRnA2QTZUUmVyczN1YWp1akV1elE9XHJcbj1DQ0FCXHJcbi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG4ifX0sIjMuMS4wIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjMuMS4wIiwiZGVwZW5kZW5jaWVzIjp7Im1pbmltaXN0IjoiXjEuMi42Iiwic3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYWxsIjoiXjEuMC42In0sImRldkRlcGVuZGVuY2llcyI6eyJzdGFuZGFyZCI6Il4xNy4wLjAifSwiYmluIjp7Im5vZGUtLXRlc3QiOiJiaW4vbm9kZS0tdGVzdC5qcyIsIm5vZGUtLXRlc3Qtb25seSI6ImJpbi9ub2RlLS10ZXN0LW9ubHkuanMiLCJ0ZXN0IjoiYmluL25vZGUtY29yZS10ZXN0LmpzIn0sImRpc3QiOnsiaW50ZWdyaXR5Ijoic2hhNTEyLTNsTzVNMzNZNEpvV1lOemhKZUtCU2FaQ2N5RmYyTEpTNUVzUndJNUovL2tlVklOUUFXQnliTFpYb1haTkhtOGZGZTJrY0FTYjJFZmpFb2REWTRrcVJnPT0iLCJzaGFzdW0iOiIzNjA1YjYyMDQ1NjFhMGU0OWQ4NWE4ZWQ2MTkyZWQ2YjI3MGRmODFlIiwidGFyYmFsbCI6Imh0dHBzOi8vcmVnaXN0cnkubnBtanMub3JnL3Rlc3QvLS90ZXN0LTMuMS4wLnRneiIsImZpbGVDb3VudCI6NjIsInVucGFja2VkU2l6ZSI6MTQ4MDg1LCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVRQ0lDdm5nbXZ3MjI5UjRqeHpQaGtGZkpSOFhUU0RIT2thLzZsQlZETVdmQjc3QWlCZk1pMTZkOThNaVg5a0ZZaWZ4bS9KOUtRSlhUN0d2Q1dVQXVnbVVvSVFZUT09In1dLCJucG0tc2lnbmF0dXJlIjoiLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS1cclxuVmVyc2lvbjogT3BlblBHUC5qcyB2NC4xMC4xMFxyXG5Db21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmdcclxuXHJcbndzRnpCQUVCQ0FBR0JRSmkyRWlHQUNFSkVEMU5XeElDZGxacUZpRUVDV01ZQW9vcldNaEpLZGpoUFUxYlxyXG5FZ0oyVm1vNmVBLy9iOXlpSTh6Z2d2SElDaFNQYkZ3a0llNC9VbUZzUnU4MHp5aVJZVkZHRjhnMGljemZcclxucnp5SldRMDdWc05uVFdBK0ZCWDR0alk5eVFQQWtBSGcvcGptRnlMcXZicEs1NHpnaVpOcVd1anMxVDFQXHJcbnhiUERYQk5mdzN4alA3cWh2T0tkcXI1Vi9mQkZLSUJXOVNFdzJyTitJUWwxOHc1c2NDUlBNYXVlVkxIQlxyXG5tdjc0MEtmV3VueDBZVEV6b3FNLzNMeXAzTGY3UWRmczhtVXRnYXdoVGt4enQyaUY3bFEzYit6bE5MdTBcclxuNkJIZWZYd1dGQ3BNeU5rMnNwWDQxaGEyWno4dStuOGVBOEpYakdhcWZ4c1VXdFZ0VmdjQ0ZqT3ZoMWpxXHJcbldSTm8wakJya1Q1OWgyeWFQSXN4V1g1TWtMcXhBNTFOVTJnbjM5ZjJaMHlZMFdqS3p3WVVYRklQbWdCT1xyXG5NS3JGMUkzWTJvaWlETTN4a3RKWFpJcWM0Tloxbi91a1FmWlh2WWs3Qkt2ekxwbTEvN3dKa0NscklXYURcclxuV2JuWFNTemljc2NnUk5tNWtJcTkvTGZ5eFpSS280Ynd3UDRwUWNLMS9zS1NXRG9SNy9RdUNydUFaaGZiXHJcbjRSMEFLZmh6VDJ2T0Q0bkZNUVp5akRkU1B0eXo0TnRYVjgvN3Q1cWFSLzdtRkl1K3BLSG9TRm1BZXRLRlxyXG50aUsrQUttU3hlUys5VXY0ekgwT0VESTVhSGwzMFE2TWRWcnprSWloMm03SUtldW1zczVtUG9YK0dxMy9cclxubzZXUXdPZ3E0WFJYbFd5SXlQYm1nMGVsS0JHQVppQzVXN1ZYSWtqMHgrdmtOVmFhcGVxL1NIc1ZXcTBYXHJcbjJmb3VuUGNuNWZhQ2g2ekxwSDJwY1JRcHp4emJWUzR3RzdFPVxyXG49QlVjUVxyXG4tLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS1cclxuIn19LCIzLjIuMCI6eyJuYW1lIjoidGVzdCIsInZlcnNpb24iOiIzLjIuMCIsImRlcGVuZGVuY2llcyI6eyJtaW5pbWlzdCI6Il4xLjIuNiIsInN0cmluZy5wcm90b3R5cGUucmVwbGFjZWFsbCI6Il4xLjAuNiJ9LCJkZXZEZXBlbmRlbmNpZXMiOnsic3RhbmRhcmQiOiJeMTcuMC4wIn0sImJpbiI6eyJub2RlLS10ZXN0IjoiYmluL25vZGUtLXRlc3QuanMiLCJub2RlLS10ZXN0LW9ubHkiOiJiaW4vbm9kZS0tdGVzdC1vbmx5LmpzIiwidGVzdCI6ImJpbi9ub2RlLWNvcmUtdGVzdC5qcyJ9LCJkaXN0Ijp7ImludGVncml0eSI6InNoYTUxMi1jMDlXeDIrUWtYNGFIc0dWL0xDSkdJRW5RV1poZFhpeER0Rm1IdmNWTFpiSXRWWkpJRU91RnYwVnYrR2RLUHNNa3VaOERlQXVHaHg2Z1QreEJOOEUzZz09Iiwic2hhc3VtIjoiZjM3NWRjYzE4M2QyOGE0ODNjZmU3YmQwNTU2MTIzNmY1OWRkMGQ3NCIsInRhcmJhbGwiOiJodHRwczovL3JlZ2lzdHJ5Lm5wbWpzLm9yZy90ZXN0Ly0vdGVzdC0zLjIuMC50Z3oiLCJmaWxlQ291bnQiOjc3LCJ1bnBhY2tlZFNpemUiOjE5MzUxNywic2lnbmF0dXJlcyI6W3sia2V5aWQiOiJTSEEyNTY6amwzYndzd3U4MFBqam9rQ2doMG8ydzVjMlU0TGhRQUU1N2dqOWN6MWt6QSIsInNpZyI6Ik1FUUNJRWI5UkNFQXRMV3R1M3M1bGhmTFB0OHl4M3d3clBZMTB4dlRhejFaYUExcEFpQXRadWdPS0xRUGp3Y1krT3RPTXZkOU9VOVZqUFlUMWFHVUg0dG5uelMxQkE9PSJ9XSwibnBtLXNpZ25hdHVyZSI6Ii0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tXHJcblZlcnNpb246IE9wZW5QR1AuanMgdjQuMTAuMTBcclxuQ29tbWVudDogaHR0cHM6Ly9vcGVucGdwanMub3JnXHJcblxyXG53c0Z6QkFFQkNBQUdCUUppNTVLb0FDRUpFRDFOV3hJQ2RsWnFGaUVFQ1dNWUFvb3JXTWhKS2RqaFBVMWJcclxuRWdKMlZtb01Hdy8vUnBvRG9rVEtmSVZsdE5FV0FzY2twbXdLQURKR0p5YWNsVE95SmtWVGd6WjBUeG5HXHJcbmFadFgvanZHVUdWQmVZWUlVd0dvN01HcHIydFFOU2ZCbzNBU0dCQTh0UjkxNVdkTnphS1pKRDgwY3V4blxyXG5YN0pjS1dCZEJvdXAwZ0dMLzhjOWlTMGdQNk1PQTBQc2dLOW9QdkJneGxaR3dLZngwR0NrVTY2SHZjZjhcclxuemx4RU5LSVhQWU9rcFAxbysxR2h1ekxUUVdYMVNsMkd2ZjZUSytRaEdMaXNhWmVobDlDZGZmY2prT242XHJcblk4VHptWGQwcnR0MXpTS0pPM2pyUDB3eXhVc2ZPV0MxbmwxSC85YkFQMk9odmpSeDZVQUFKandTVkdDclxyXG5EekV5ODFQQlJ0aE44OWhFcStRMzNBbzR3amsvNTMxZis3OHI1M1VOZmErOHJESDlScFAvWHJWSmVSUkxcclxuQnFmalpkSFdIc1liYVJvbzllTTVZMmpwL3ZwZ3RNUXo3eDhXRlBWY1pKOWd4emkrSzNJcURhd0NJV0hSXHJcbmhaODU3S2UwRkhxUUwzUWlzU0NVMjhUUXpReHZ2T1JDU2NLeERtdVc0MjdudGFqdlo3bCs3MndhOVkyYVxyXG52U3hCdC9Pc2VCTjhkV0pYdUVtaG5UeGFvYmp3dE1UOS9Cckh2dHdHWXBuUnJ2aU51NGNyWGFVdk9sdjhcclxuZXh4N1JaWGhUNW9EQ3RRME9ta3EzbS84V1JTK2lFRmd0SHAvTWx4aUFwU3dnVzFCcnVHVmQxdHBZRlNUXHJcbjRUaHZqTEwzOVN1M3ZRL0l1bHNaaVRtZ3VydG9KekVGL3lUV0NTL09Dd09FbGZKSVV5MExOcklMZjNaRFxyXG5qcVA1L0pMOUFiT2xoL2xaVkVBYlRad2FjRlpzZUsrcW1tcz1cclxuPUpkMjNcclxuLS0tLS1FTkQgUEdQIFNJR05BVFVSRS0tLS0tXHJcbiJ9fSwiMy4yLjEiOnsibmFtZSI6InRlc3QiLCJ2ZXJzaW9uIjoiMy4yLjEiLCJkZXBlbmRlbmNpZXMiOnsibWluaW1pc3QiOiJeMS4yLjYiLCJzdHJpbmcucHJvdG90eXBlLnJlcGxhY2VhbGwiOiJeMS4wLjYifSwiZGV2RGVwZW5kZW5jaWVzIjp7InN0YW5kYXJkIjoiXjE3LjAuMCJ9LCJiaW4iOnsibm9kZS0tdGVzdCI6ImJpbi9ub2RlLS10ZXN0LmpzIiwibm9kZS0tdGVzdC1vbmx5IjoiYmluL25vZGUtLXRlc3Qtb25seS5qcyIsInRlc3QiOiJiaW4vbm9kZS1jb3JlLXRlc3QuanMifSwiZGlzdCI6eyJpbnRlZ3JpdHkiOiJzaGE1MTItRDllTjRPeGRoeVlTM3hIU3NBaDVBMGUrVWhhT1B4ZVJFd0JIVGtuWkhvVkZkNFRxblB0a1ZyUTdsSVVBVFBncE85dnZHZzFEK1R5TWNrVm1VeWFFaWc9PSIsInNoYXN1bSI6Ijg4NzZhZGFlMzVlODZjNGJjY2JjZmRmNWIwMTg0OTNiMWM5NTAxYmUiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMy4yLjEudGd6IiwiZmlsZUNvdW50Ijo3NywidW5wYWNrZWRTaXplIjoxOTUzNjIsInNpZ25hdHVyZXMiOlt7ImtleWlkIjoiU0hBMjU2OmpsM2J3c3d1ODBQampva0NnaDBvMnc1YzJVNExoUUFFNTdnajljejFrekEiLCJzaWciOiJNRVVDSUhIZmMvSU90TGlFd2NPd2pGbnl1U0pIL2toUEllRVNpNlBqcldXNmlReTFBaUVBMEs1OTRhcmhTSXp4REkxTjdPU0dUUE5Bb2w3blVWT3JKRlhoT3ZtODNlND0ifV0sIm5wbS1zaWduYXR1cmUiOiItLS0tLUJFR0lOIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG5WZXJzaW9uOiBPcGVuUEdQLmpzIHY0LjEwLjEwXHJcbkNvbW1lbnQ6IGh0dHBzOi8vb3BlbnBncGpzLm9yZ1xyXG5cclxud3NGekJBRUJDQUFHQlFKaTZsdGxBQ0VKRUQxTld4SUNkbFpxRmlFRUNXTVlBb29yV01oSktkamhQVTFiXHJcbkVnSjJWbXI5V1EvNkF3M1BvOTl4UHZrc1h4YWZiQTFPT3dpZlBpZU1FdHM1cFMxVTVtWFIwZWZkU2hFaVxyXG5XYzVCTk1PakFIeVhSbkpoWm9TVlV6WEFiRlNLTzNmV1Y4U09hVHRlbzBsUDlBVGMybUNDZWY0QzNHaStcclxudmNIREtpZ2Y1UGF6ODdJcGxNZW50YVFQTE1ZWmtzckJ6MHJQd2JpZGZKT0dsbUNNUFo3TnR2MVV1S080XHJcblIySVVlSSt6M2VQY214UVZ2dzdlYWNJeTFzSFhBV0dHQUVaRFMxTUxOQjkvamk0U0FFbi85dzdFKzc1M1xyXG5jUVhkT3p4M08vMUNrWVd1eElPMkU0NFY5MVZDQXROd1lHVklyNWxWSGdmVU9ONW10NTg2UER6OFJTanJcclxua1Zub09MYThtQ2JVN2wraFVIMW9IK0cyVXZ4S1V0NmtVQm95WkZ5dFpqTlI5SzkvdUpiWkd6UDNsL2VYXHJcblB1ZGJmTEZCOExhcTJ0NzlSVFZFYjVIeU5ab25Pektvenp5OHcwNkpnK1VvcVIyMGd5NVZwN3M1R0JIMFxyXG5YcTFhSE1aVFk4SUxvYXZxaThZVG1tckF2L0FiMXRhUWJXUmFzeGJ6bG9LRVQzODdpTEZXKzFhRTAxQ1JcclxueUV1TFlENElKOTN5ekV6U3lKTHNhS1QvSldFUTRacCtFMWZDUWdEeitqWnRXTjEvblJ2OEdwS1ErUGVBXHJcblZhYnFZczNVdmd3cm9LSlA5SEJYckdFc0tLSHVPQ0s2SStva0pzYWhmdWk2NEhCVWhPelhPQjJTQXcveVxyXG5UZWRkUGgvSDUzVTIvbndNYkw3bkhkR2JwK2UyV213MWtoV3JmK3I5SGh5eDBvdjduMjdRSGk1RWxOY0ZcclxubnVHVkFmNEVXQm1lV2xSRmVHcFc2MEZnaFYyclBxS2FDMUU9XHJcbj1zOTMrXHJcbi0tLS0tRU5EIFBHUCBTSUdOQVRVUkUtLS0tLVxyXG4ifX0sIjMuMy4wIjp7Im5hbWUiOiJ0ZXN0IiwidmVyc2lvbiI6IjMuMy4wIiwiZGVwZW5kZW5jaWVzIjp7Im1pbmltaXN0IjoiXjEuMi42IiwicmVhZGFibGUtc3RyZWFtIjoiXjQuMy4wIiwic3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlYWxsIjoiXjEuMC42In0sImRldkRlcGVuZGVuY2llcyI6eyJzdGFuZGFyZCI6Il4xNy4wLjAifSwiYmluIjp7Im5vZGUtLXRlc3QiOiJiaW4vbm9kZS0tdGVzdC5qcyIsIm5vZGUtLXRlc3Qtb25seSI6ImJpbi9ub2RlLS10ZXN0LW9ubHkuanMiLCJub2RlLS10ZXN0LW5hbWUtcGF0dGVybiI6ImJpbi9ub2RlLS10ZXN0LW5hbWUtcGF0dGVybi5qcyIsInRlc3QiOiJiaW4vbm9kZS1jb3JlLXRlc3QuanMifSwiZGlzdCI6eyJpbnRlZ3JpdHkiOiJzaGE1MTItSktsRW9oeERJSlJqd0JILytCclRjQVBIbGpCQUxyQUh3M1pzOTlScVpsYUM2MDVmNkJnZ3FYaHhrZHFaVGhiU0hnYVlQd3BOSmxmOWJUU1drYi8xckE9PSIsInNoYXN1bSI6ImEyYjU2YzZhYTM4NmM1NzMyMDY1NzkzZThkOWQ5MjA3NGE5Y2RkNDEiLCJ0YXJiYWxsIjoiaHR0cHM6Ly9yZWdpc3RyeS5ucG1qcy5vcmcvdGVzdC8tL3Rlc3QtMy4zLjAudGd6IiwiZmlsZUNvdW50IjoxMTUsInVucGFja2VkU2l6ZSI6NDQzMzM0LCJzaWduYXR1cmVzIjpbeyJrZXlpZCI6IlNIQTI1NjpqbDNid3N3dTgwUGpqb2tDZ2gwbzJ3NWMyVTRMaFFBRTU3Z2o5Y3oxa3pBIiwic2lnIjoiTUVZQ0lRQ2FmOFoxeURVbE1pa1FoMVJvdUc1MU9YTWF6TkVYMzdWcUxrVkRvUDdDaFFJaEFLMTloUmF6czZHZ1d6eU5Wb2FwcnBIRDQ3TDF0Z1plZ0pqU1lKUkc0VWVkIn1dLCJucG0tc2lnbmF0dXJlIjoiLS0tLS1CRUdJTiBQR1AgU0lHTkFUVVJFLS0tLS1cclxuVmVyc2lvbjogT3BlblBHUC5qcyB2NC4xMC4xMFxyXG5Db21tZW50OiBodHRwczovL29wZW5wZ3Bqcy5vcmdcclxuXHJcbndzRnpCQUVCQ0FBR0JRSmo0NFArQUNFSkVEMU5XeElDZGxacUZpRUVDV01ZQW9vcldNaEpLZGpoUFUxYlxyXG5FZ0oyVm1vUnZRLytQWE1Ic1Y2UW1iTUFZamZMelhObm9yRDF6VW9KYTRjTGM0aVZhUU9HUVpQanVDNy9cclxuQlZHWUlCZldjQUdHQTlhRmV1WXltKzlDcVNxSkJDTzhNd0FrL2ViK1NLaEhFSWhRTUpyWGh0bzBvREV6XHJcbkhMa0lsVzBIVTZhY3E0cWxuUkowd1JaMDI5TCtZdzFvemxQR3QzM2tucmc0NXRHemE0Uk5idFJpZGJZelxyXG5ybnBTOTllSGdmeUU5bFdDTWx1ZllMVUExTmh4ZmMxcDk5emRNd3hYc3RmRDVNSkQ2Rkd6STAwaEY4TG5cclxuSXlYZDdkNDUzaEIwS1kxMUJxaERkVWRwUy9nMW4zbTJZWG9hTHo2eGtzU1RleCt2N21qclUrUVkxdVpHXHJcbmV3dmplM09TS1V0cmw1WTNMMUY5ZW5DZ0l0cmlBdGFGem1qYXNKZTJVUEJ6bTkzRGI1bG5Fa01rOG5YTlxyXG4yUk1kL1hMK1paZE51SjlCRnUyS01XeU9Ca3I2aS9ZeVkxLzdGajVLUHYrSEw1YlNha09wVThkaHQyaktcclxuQmthc2lSTkl0ZGR6YmZzRENhMHgxdGZYTHBDd1RoaUlKUC9IbDVuNXFtY2xFRGYvaWdBYjFaNnlsaGxJXHJcbk5RU3NNZVNYd29EUEQxSk4xSFNjUGFrNGhiRUh1VmY0RDVScjZZbWtmd2R4UTlRUUdXTnZ3VkFHYm1qRlxyXG51ejcyNVVITWpRaThxbUozWnhEakhKSFl0MDIzVHhRMENvYXN4NkF4bGJvN3BWNmhOOXJWR1dNRHhSQXBcclxud1ZTZ3dpdDhRQ3IxRXNzWDRLT2JPNjhPR2hQUWFvOWl4M014T0pQZjdMa1hVaURxMUNiLzg2WGZsY0NDXHJcbmFnTVRRYWxMZWFMcldpZmxXL2lIWVBtUXBwY0VKRndkV0lBPVxyXG49d3htTFxyXG4tLS0tLUVORCBQR1AgU0lHTkFUVVJFLS0tLS1cclxuIn19fSwibW9kaWZpZWQiOiIyMDI0LTAyLTIwVDEwOjA1OjIyLjY2MloifQ=="statusI"headerso" content-type"#application/vnd.npm.install-v1+json{{: \ No newline at end of file