Files
portable-secret/examples/bounty.html
2023-09-03 21:43:26 -07:00

300 lines
47 KiB
HTML

<!DOCTYPE html>
<!--
Portable Secret generated with https://mprimi.github.io/portable-secret/
This file is self-contained, it embeds an encrypted payload.
It uses your browser's cryptograpy APIs to decrypt it, if you know the password.
-->
<html>
<head>
<meta charset="UTF-8" />
<style>
body {
background-color: floralwhite;
font-size: large;
margin: 50px;
}
div {
margin: 5px;
}
pre {
padding: 5px;
white-space: pre-wrap;
word-break: keep-all;
}
button {
font-size: large;
padding: 12px 20px;
}
input {
font-family: monospace;
}
textarea {
font-family: monospace;
}
.decrypted {
background-color: palegreen;
border: 2px dotted forestgreen;
}
.hint {
background-color: lavender;
border: 2px dashed black;
}
/*
pre.decrypted {
}
*/
img.decrypted {
padding: 12px 20px;
}
a.decrypted {
font-size: xx-large;
}
input.password_input {
font-size: large;
padding: 12px 20px;
}
</style>
<script>
// Display the encryption inputs on the page (invoked during body onload)
async function init() {
document.getElementById("secret_type").innerHTML = secretType
document.getElementById("salt").setAttribute("value", saltHex)
document.getElementById("iv").setAttribute("value", ivHex)
document.getElementById("cipher").innerHTML = cipherHex
if (secretType == 'file') {
document.getElementById("target_file").innerHTML = `Download file.${secretExt}`
}
document.getElementById("password").addEventListener("keydown", (event) => {
// Decrypt when the user hits the Enter key after entering their password.
if (event.key === "Enter") {
decrypt();
}
})
}
// Invoked when the 'Decrypt' button is pressed
async function decrypt() {
try {
setMessage("Generating key from password...")
// Load salt, convert hex string to byte array
let salt = hexStringToBytes(saltHex)
if (salt.length != saltSize) {
throw new Error(`Unexpected salt size: ${salt.length}`)
}
// Load IV, convert hex string to byte array
let iv = hexStringToBytes(ivHex)
if (iv.length != blockSize) {
throw new Error(`Unexpected IV size: ${iv.length}`)
}
// Load password, as byte array
let password = new TextEncoder().encode(document.getElementById("password").value)
if (password.length == 0) {
throw new Error(`Empty password`)
}
// Wrap password into a Key object, as required by cryptography APIs
let passwordKey = await window.crypto.subtle.importKey(
"raw", // Array of bytes
password,
{name: "PBKDF2"}, // What algorithm uses the key
false, // Cannot be extracted
["deriveKey"] // What the key is used for
)
// Derive a key from the password, using PBKDF2
let key = await window.crypto.subtle.deriveKey(
{
name: "PBKDF2", // https://en.wikipedia.org/wiki/PBKDF2
salt: salt,
iterations: iterations,
hash: "SHA-1", // As per standard v2.0
},
passwordKey, // Wrapped password
{
name: "AES-GCM", // What algorithm uses the key
length: keySize * 8, // Key bitsize
},
false, // Cannot be extracted
["decrypt"] // What the derived key is used for
)
setMessage("Decrypting...")
// Load ciphertext, convert hex string to byte array
let cipher = hexStringToBytes(cipherHex)
// Decrypt with AES-GCM
// https://en.wikipedia.org/wiki/Galois/Counter_Mode
let decryptedBuffer = await window.crypto.subtle.decrypt(
{
name: "AES-GCM", // Name of block cipher algorithm
iv: iv, // Initialization vector
},
key, // Derived key
cipher // Ciphertext
)
// Remove padding (added as necessary for block cipher)
// https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS#5_and_PKCS#7
decrypted = removePadding(new Uint8Array(decryptedBuffer))
// Render decrypted payload on the page
if (secretType == "message") {
// Decode bytes to UTF-8
plainText = new TextDecoder().decode(decrypted)
// Display the plaintext on the page
document.getElementById("target_text").innerHTML = plainText
document.getElementById("text_output_div").hidden = false
} else if (secretType == "image") {
// Transform image to base64 string
b64Data = btoa(decrypted.reduce((data, byte) => data + String.fromCharCode(byte), ''))
// Create 'data' URI
// https://en.wikipedia.org/wiki/Data_URI_scheme
const imageData = `data:image/${secretExt};base64,${b64Data}`
// Display image inline
document.getElementById("target_image").setAttribute("src", imageData)
document.getElementById("image_output_div").hidden = false
} else if (secretType == "file") {
// Transform image to base64 string
b64Data = btoa(decrypted.reduce((data, byte) => data + String.fromCharCode(byte), ''))
// Create 'data' URI
// https://en.wikipedia.org/wiki/Data_URI_scheme
const fileData = `data:application/octet-stream;base64,${b64Data}`
// Activate download link
document.getElementById("target_file").setAttribute("href", fileData)
document.getElementById("target_file").setAttribute("download", `file.${secretExt}`)
document.getElementById("file_output_div").hidden = false
} else {
throw new Error(`Unknown secret type: ${secretType}`)
}
setMessage("Decrypted successfully")
} catch (err) {
// TODO better handle failing promises
setMessage(`Decryption failed: ${err}`)
return
}
}
// Transform hexadecimal string to Uint8Array
function hexStringToBytes(input) {
for (var bytes = [], c = 0; c < input.length; c += 2) {
bytes.push(parseInt(input.substr(c, 2), 16));
}
return Uint8Array.from(bytes);
}
// The cleartext input must be padded to a multiple of the block size
// for encryption. This function removes the padding, expected to be
// compatible with PKCS#7 described in RFC 5652.
// https://en.wikipedia.org/wiki/Padding_(cryptography)#PKCS#5_and_PKCS#7
function removePadding(input) {
// Last byte is the amount of padding
padAmount = input[input.length-1]
unpaddedSize = input.length - padAmount
return input.slice(0, unpaddedSize)
}
// Update page with status of decryption
function setMessage(msg) {
document.getElementById("errormsg").innerHTML = msg
}
</script>
</head>
<body onload="init()">
<h1><a href="https://mprimi.github.io/portable-secret/">Portable Secret</a> Bounty</h1>
<h2>This secret <span id="secret_type"></span> contains a Bitcoin wallet recovery key</h2>
<h3>If you can crack the secret, the funds are yours! (~$400 at today's rate)</h3>
<p>
You can check the status of the wallet here: <a href="https://www.blockchain.com/btc/address/bc1qpwq8lxj4kxtmchxyjrlvvvpstfm9jr88dx9dgp">here</a>.
</p>
<div>
<h4>Password hint:</h4>
<pre class="hint">4 words, joined by dots, capitalized as necessary
1. The swimming pool accident -- her first name
2. Name of the flowers on the balcony that I used to care for
3. Name of the guy that really made a difference (The Encounter, 2017)
4. The gift from Veronica (2 words without space)
</pre>
</div>
<div>
<h4>Password:</h4>
<input type="text" id="password" placeholder="See hint above" class="password_input" required>
</div>
<div>
<button type="button" onclick='decrypt()'>Decrypt</button>
<span id="errormsg"></span>
</div>
<div id="text_output_div" hidden>
<pre id="target_text" class="decrypted"></pre>
</div>
<div id="image_output_div" hidden>
<img id="target_image" class="decrypted">
</div>
<div id="file_output_div" hidden>
<a id="target_file" class="decrypted">Download</a>
</div>
<details>
<summary>Details</summary>
These are decryption inputs, that can be safely transmitted in the clear.
Without the correct password, they are useless.
<div>
Salt:
<input type="text" id="salt" value="" readonly>
</div>
<div>
IV:
<input type="text" id="iv" value="" readonly>
</div>
<div>
Ciphertext:<br>
<textarea rows="8" cols="80" id="cipher" readonly></textarea>
</div>
</details>
</body>
<script>
const secretType = "image"
const secretExt = "png"
const saltSize = 16 // bytes
const blockSize = 16 // bytes
const keySize = 32 // bytes
const iterations = 1000000
const saltHex = "bd82bb3ddd4c0e7a8a2bd4a86ff5eb16"
const ivHex = "5a70ef06d2bf90133261214f73c4c3dc"
const cipherHex = "b677d7d091a0dc2038bebcc8e921bd68bacec7afe1e9df6a628a1a1eec195b76064e9ddca896297926c418dce402e7030e85294c4278d46e11fca73aed8fd08b0ba2fb0e0622731d616781133d086f449a5177b019ed9b51609b5907ce19c278d0fe355b1edc3a504b6aa671671b0b1079cf1338b3248d03c60f9e7dbd485ffcd2854d4fa8020cdbaf807072551e83703c4f2b81f49cf9cf79bde15cf1b041d9388deba3034d19ea2efd1eeb52cadef8ed6587a3e0415d1a1999322f50d6a6979ab70845100c051528e8c21004c56c9acac69a92d9caa34274b18781c2e24afeb2367bce1f2dcd8c0170581bb141038ff1c775ed2dadf8a86f3addea58adc19eaaf859608f1e9df00866a004e290b33655b5b638bc39340ff2cd263546767cb5e5a5ba1a5de7b5d2d7c11be9c3ec4e7aa88b0225027e7271c51d15c7bc288519b0024b86d045a3c4ea860411301e0d8a0862f1ad98380e25f1e688c67c4417d52442c76d4e44a0d8b99b168d000c36e885857370316c5caf10e3f077ff5b3ce2e9dc7f1f5dbae4b6abf548f84467306d7c1f4e0d9f390a4acb536daab423e94fe85b7b7bc4eaacfdc9eefd6b3c67e106e2203a9f6418fec99eb18533790fd49fb97147721e08439a76e3acaa825eeb8d3ac89ba5eac2185222fbe190db52c13fdb8c9ac2f1162235da7cfe3a15eac10ebea21df167975fb3d51e2b32f2c7ac7f7d6416ce7d66c226ce50a863ddd07cc5510dde15eb75ee7fc863c5e68976d640e674fc5998c67bb2bb62a3f80b318545dee2f2661c75210de3912de905e5c5b19d41348e8bebd5e3a275424cb80713d5af5b32905d1fe0775ee8013236c6cbad05dda1a199b980e1919a8c991e14972574cee1e62b08ab7ce0b39218671802a580a43e61ea93fda6be90d4f0f6e267dad77f4459f735d8f1739ab92d7a58c5a644ed453aba088f38b545a93b8f8aeb69dee014e079916392c8d3db08b60473deb583723cf7e8642592c66b2a9a7c540c5db0530ebd9a7a240f044b359054e84df4aa59ed20183684975e3b31f82472588b94fe2fdb79157423547033e94fa85473a193977c5f4e87c0dfa86b310fd292f78629f6b452734fd337cd40488634176f95c7dc71d3f49b0178d37fa602e787c949d561a5cbc8cdd1505fbac8efabe0a9d50b981ba346538ab04f8c6bad4f5e24e87c8428dbd2a9c84a57aa3f37638970002061b873b24448e79bffbe5640499b70217e1e3640b725a3363f3d677268226aa898c58856e0ac9d33ff641c5b21ab3ea34ba548246158370a0ac8b5be3748314f36dc7bda51967ae9e6088be2abc916b172dc3bdd3258a118c2513507bf86a49aecb0cd05c801a8418299f2fb5fc41c5fd6f63024c06bb27052f7043829030ca7a3047bcabdb905a84232e1db800bcfc6730b9dee58e74dff8548b03ce4049db4e62fc1cad3f4257fff2ed11e4cb8b4a56294302700e628fa9f45f0871944684037bb7e290788ab6adee8b7896e10bcb7698bfb36e056143ee526ae3be2b3baa845ab06e2561ea36c332b8ffa0bd012ddd79a93dcdd611d8c1a322f1c1dc10877e676c9a204e239461c60d9b63aed117bd0a434fb4e35d9ea38f1460ba95a7d58ebcab343970f51620f103236a4f50584892eb1bfe579649c09e56bd2854e7963da27031cfd7a67ec202f641b6fa06073d94fddbdfaf17bf9324fbd36562383e5ecb4eb02e59b8a755a8e4312514a3a0626e8ed4f4ee54c41ae61ab57b45e408a3618e2a1e232c419040c00142692642667a29665d629c351fd03c5ae1f4fed36b7008266dd34abb2df3184d1293a40828b5cb62d5a62061726ac08e582189ce136188372538ece6d0fdac24af7faa33ed3c00f90fef214b207ec77950a21afb4ccfe51284bd60dedcf0e63b13c5975099c50a83fb052076dc2051fb89137541ce6c8b4445f2263ea4c6d3853af6f8694ff66f57bad49e39cd2e510059519156a094d3e9af124b9853c35e94005bd3e7439a62c94bea90282f407d42de035915a51bc9571bdfe6e0f1e383d3a6472c2509c3b20a92f319a59f749888b3f676328da9055b808d78bfd4bf8bd3e78e94743c5f6c0b087397eab20a6274f1756a95b65d6321e8f2c43a8b0953f31bc0e0ac69b39d22b8099045e1f689070b76f1e1d2ce44684d5a2ef60d9fb4bb7230ad8e575473a6f2e316acf9bccf22dc1b18382a4c2f277c0421d3a6b41f99e198535fad74e4ba4698a9d3816e199d0f98d0ab0b00449b14e2dbb9a6a033931e143400a25831be5408edf42a29128733ccc8a5c0421c4821e2283d701d5c3ee5f84602a7740f94d62f45096c191e8674ffe851349596e3b217d217ac2f2d7f493c293bd759494d038e802e15660dad9f9de1a995077344acaa01055c5a3fe8a2f151c81bdb9a88b020048e26ae450d18d62e29cb89f0411620925f85f08ef10f64ba7aed89ea8a280938a33f819983985c9df6f1a540d7d3a6a60cf4fc4d24e55748d8f4786189b62dc981a24793485f9c70ebd0bbeee4d1ce0d4fae19630ddfd48e368f1e6e944ac963e64ed2a30383a35a308fae42f25ff5ddb7ab54890390b76b8e7e2ab985d694c0b413931daae23f9a8aa0d39901cd9139122bdbaf764740b68a7975424013facbd2c654e75e1daa00f9bc0c1d3bf8f945b9785d33f1d222a53cd61ced5c4e8d6e81bd3874d9405d112b7cf480012a252073f16cbb22269d60580bec7cc282af71638e5bbbd68be2400e8bbb1f57ceefbeb8d6ab529bf165d017ad81b11b326d3fcc1ac271b2ba5015851c7188bd5808ddaeacf6a662e2e4f6536a1b9d191b574e05a44547ac56f25729c055f548dc002e19b358831a85d593b0aedbc44194139eda7839df4cff3ed28e4654ff2e7bd0fa22cad311beeeca3849e5d9b5833184a7271945b37929470062d8d12b5d5c804f1847702c21d09d321f57ce758bd643a9eae4e769a1a1323f18c856caca0e9e91cc97a6be3f29f7c47d3516af644df28269f4c813133197bfcdc694c32e6c5bf7efa58e962139023fbf32bb5a597dd1975dbb12853695f9c2e2a060c6752c6d09f9f0323ddbefd59e451e4c207c8c97ba3aee2d786fb66a2ba2eb86992192b967ec5ac0a734ea47b4594567948368263b1da25bc9ff0beda7a4e20934e1c734e95468fc182e0e572e1549c16d8d6c3a60d45215ee3115020a9ba79883d2a647d6c0ad220af95f8963836dc1a5e8434e65ff3ae5eba544290d5e5e9eff30bd9fb785cad13654971421906e307c003317af87128467a3771a15137c17e2b650545052c4c23f5adf13d0ec03782ab4f22d4eb385ff0fa8e9835b0b1dac307f16cc196219287b61d17ae142b81080813c32bd4020587dd8570c906d78f34f5a803104b517fc5dd7aab5b51aebc50638dba18b150ec0626e7b3d674d9ed1fd7ece9e7f2d74de212e6ae475bf025889ecde8a35c760385369e4af9e00e7698a579a7f5463eac4dc8fb86e9f6badc4e34672b831ed2ea68ab7cc70166fa5e7d08086ce900f519d47211ff10fd0e3ab636d18afbf34058dcd0dc486ec6b6af9c0e4af2ad7732a733c41278163d530110994f4389f7d71910b0de83dae775f4a7b47b76e3528ffa20c4badbb9cd91ad796a734fdb7cd8a5de43308f2a36811d16e745c0a9dd90422f898dbf925edc6de8a02caebdc55a7a55b8a823132260565f02fd6cd405b9cc9a3c95eec480b4fa54560ec0a6a89e2e4d18973b298503a097d7b776da139aea8a305def18d5e1d6ef9020b7c48da2c1d65cb33af7e523e3ab50b906808beedea0b05b3d2542b62cc6279639ab23ac187c6fde6f57d2792c485fad49619be0dea4055641763fa9ee5ebc6c2a7e94c467de62b66d2681f9148496637f36dbf8d1e9ebbf148e95908d4e54d70c4b08abe08fdd69310c8ce29d38135d498ecd5939b6472e4273e24e7bb368d7e66a2e1e7b94cf82f65db9694f31083d13386300911ade145d4bc2bc7ccf32d87d70a6aa23d363b0e781b12580c1cbc383dcce2bc9644089cf7ce8cc9df673e8485a4980a1610e00d41138e200365d474c281a548058e918450dc379ef812f8d51a462667809d22aa6b61dc89bab8829e5fc49258f648fff357f845bb0779ca3322f7f6980cc1fa9015b36d8f18d2e0222cfdd3a8c7bd3665abae5c75160c51da1f16664373eeee60729009b637490fb417c552f045bd3aa4fb4a8d71d016833cba186494691173fd3b152e6726576ee50af9aa7c11aaef9a22b30e1bd0b2e99809018c1fa3b68a4257d66fea6bb6393296ebed170594d94c63464bea5a01a314d23a9d416c477770efbf4237322d7a6ff9b8385b29336681db0d7ffd34da7a627672b5a888f98f6a2f6c79c1dbb82174831fa57ef73caf0039e8a0593b0066f9683e40edcea54da1e758bb1cb33024a3d9887c54cef03b51f1ce1db6bfe586d087aa6000d349577c353186d3176328bd800d27d9c0d78cc683e12ffd2e5c28149c3a129e972022441984e38e7bdfeee5d7fa2db5f314f566f5719f57c5f16bd1879de39c792244091fa5306856873ee22819a9edd983e8aa43b34e649bea089580dfb4fc3253da61af25a777f34e27a4b24ae510f89c55f11da508a1e75100fa076c95b2f61acbcb2e1a3a99ac4cb60dcd9f037fbf0005bd8a48e950c6791e952b48b332f92467ba5db41aabaeb48b7d497deea49579d41a3675a44791c0e3d01c0af5ffe25d522153750a7d176bc439e16dafe95922fd2bc12fb127c40c9c7133c945e2b7c290074faaf586518b8aa08eb1389f8fa0f39e152500eb8d656e36debb67d5b930f313eef72d07e71842ad21a34fa79444ba1faa5e40540cb29506568ee34f90d86c24bd790d0b597ec140231989d01f2ef7cbcc009a52d4581823bf19fd8856bc5f667d3a1b3febfd784548a5e3c54ed3406f132d3d1f8bc8e8d585d26c8c5f3af74af147d2ade3ad7551ab1a325ee0dc7ddce081eea1382082aed742176a97d55fcf9ad1baed511c0ea74606527e92202dd24ec4f978fa53e420420f9e281ab140dec014c0bae53d1a4f2eef5e2078ff8082328c11a017c8c483a17db8bd7daef29bbe33c5499219d65c8830974854e8b867cfc744f38bbd961546e24cb5de91d75ac0d9322183d676038018d8e17549bcbddd64293c2187ff9cc7e33dff5868798055c6cef0bd11deeb24f412d35e1069eb5a51dfef0ca9b3aea686162c8b89f9358ebbe9220a398bc9ae605302cd73ef5f003ed82e9276e4a13f2e2f674f34d17e0d7ebd61b2ed9ab73c5b50e4b2cf1cb1cfdb635a10e59edf31a1353a7b82360c55b3502023e3b140377d0aa35ab216b4c2f0d06d0019136574929d7b31cd1b5e45a7cc1fcf571458b1db5dd6ce5508188789dd4691f7c35c4f240d4862555aef39e138af4ba7ae79a3540f6357e31dff76c4751209d8c451f6da757bf5a0fca09ff0a48474cbfa67ec260aeaf86029fbd5130da444cb9d954e16e45d08e1b9ea65c39480270e2e6afb976e6b0af3f4a8f15b7e99bb634de2384f964a11a75334d5ef369c3dcdbdb0ebb85bc2eacb5872c9e2a170e997126b114cf1dd639b9f1ce8a02d4aa5015d489c96a29089e44adbfde94eb14499eeb26bf5df94dcb326822144379b94b701a6ed3de77e913b2cf8c91bdb883b3c190fe955bc01c5753d6274099ecb31531c443f374b4de4c69219bbfcb9cd8d9a24bf074232686c1842a77fae31e3b13be898d1222a2f9cd204d3a09b1e923f968f060ba0ab50a4e18d2cd40fe70a922e7e00ef386b64c26a69d1f0106a84b906e9ade5ed44ca77a0437368b2faec6743e12c3975ac4deec4d9d423dc746c920136cdb50ef36650ffb4991e8ec3f030d61c9ef2f9c6edd58fe9fbe0c5aa3cb00cc2638fa559e02cc428c832616509e54b8cb96d6e6833dfdc1a106a6254e871a922c9cb2ff71deca2bc39c5dc2697a39880971214863bd6f25ce25ab139722ea1475754a1058f2e829b87e5214f74740da479f61e17f86469a05ba7ea3260c67f92ff9acbd5cbea8047621b4f914b8f33d43ed23ded285ecafafe57377f46d4ea17edae9fe711826ad0e73aacbde1e9a5fe772688a1fc9439e9e4211381d6d3097a0582598f920b4146b88433cb909a8f13ff6ec1ebe816fec65c6dc6364e9eb4b92ae47774e73664524f9ed260e27eca7334b1836e259ffb94c6ff83bba50ed3d617010e077fb74465c3e20e307481038613dc0875dfe5bbe1d4df750f5e7a9e9054537056283880f779a352c977e03bd278410448911e7c986f10fa059baca3592141525b604e8bfda3fe44941945096c69f91ff9d8aa0c6e1ed218abc7d432d6ca3699d840972efc8469c7eb20d44c308ffe6e9c0367ad611aa3a1bb1dec1948faef64ffb348e3d5dd9e7099b58174e3d6c29b6f9e25b064134c94159a15bac29c75ef2f09fc5c2a144d15ad81571c145ef0944325198757c88dbd7cd972f3ba1c8c7ba5e6b11df32fedb466ad7c311e0d0fc3766c64afb366c75112a20053bdd02d08d4c0523850b04d4427ecb55049cc8712c4cb1b4da901da505ad2356fa1b5831f14048473af14cd09a84c3acf8bdd2970decd355f7f4fbd8ac555dbfb63e5ef2a00e8e71b0e57f81090eeff2de05f2b5cbeb421b6f69e4faa30e889ac9238b1eaf690c1e6ef349de25f454b532f345530184100ae2daeeb3aca79429edad95be57ccf470202c249c88691c5dc190655fb9f151e25c13e10e1881d6c2a5c07617b11aaf4118734b7da62c18dca467f64246e0acccd24eda5c94c87422e39729584dde1ce9b3313689ac6973ed965358d89021d4e56451e78a1eef45058a394e8c997a9206704f2a5ad4d94834689fff695423f4abcf595e52c256293d20009a79f5a5bb36c2ef99a9a353448f5659ed441743f3a671ce92de221c33bb049f6b5bcd79b7d652538b44c264986460954d1ca255ea9da9df08eda571bdb9c56a022267cd61f2659cf4a28a6f8fc3d549087b61c3d6ff2970ca7aea74a0fe1a42b6cbc3c173d8ebc3aa7027c0607b7041dc67f3e3fd1dc40f37823d41527a613a3819388c35f4910d0aba82f65cc20d1735fa10f442599cbb0f42c52f8d90bc88dde314555c79d3e91298a198263a18b1bf84c65c6ebb22e14ecd1f471e3649816e7be08dd10c22f593b256d191f7dd66a17007989489af1444c89762a48b3977d3a1556fe8b7c008ef69f78efdc148191c8a228833e23421f01870ef7fa1a80b393bf29e9a7f3bbb33035d5cc25fffcf22e6aae3e0ce36fbbd982cbc8f353f4752649cd4aa1a9e0f2d2243469f1653ac8e04c4a21ed605ca2a2a08ee5a0597ba57a63604bf0d8ef3270e7e22588a97dd915e986c7202264e5892162f04b3ffb3e955c32ad6b8fafa9880c404eb49cd1635d12e4e676733b03655f1d665cfddefc2acff8b713f63a294279d399931d97b6b9c5d365a2ae3ed3d391fdd3ded5e4cc1470facb114cde7e23a6b6ca60cf5163a8fa7bdc6c8da010c093a9cc6572621e15b947ce58b9132bd7b89601dae202a0a8b4f68b6df484919d55b3f63e2aa3fc7ab1f21fee050db72c8ce9a0b15ce971354d8c18ea0d586ae84a13ba40e96324a8fb0c6ef6c48865c755596aa0d8ce1f7947d7fae0c1a636f7ce0400032d13d2989e804bc05b0c5454d259bdfe6da10066317dd6c722239da83f80d0758bd2fdf26de2f7a473f2c20049f9b49057e90518a4a1a45e9a05f0a509270d3a7579ac3a75c4bb2fb8b14416ae8e95c765bf2c44f54c7d98165b4cd876c98bc792a02687822e1873875e7b6761d2cec6a3a3f34532491d3a8f0b34e4430b765ad39450b279b2fea999929bce4732ba38d11f07d426310c729a7b55800eac39c1eef0c9493ab7998b3b8da2b6bee047af10372e6d6208757bbcbdb3e50eb903587f91be1492ccb91f3fd6e6364cb3c3c798b2fee65baeb6d180fbba470080bcd1cb5402b2cbcabef9d1a510f1abdda08554ea3142410f5167fa2f6d9f12abfa11252bd9229d23d4e91493b14548fa8e84d52dfed6d996323fad89baa8be59129adb0804dd3b74f95278bdda9ffa84cbce4f67577cff9fc4691fcfe82084477d8c900144afef58cbce6c377f1707a2e74d2fafb77dadf1fef0f34cfca75cf3c40c0bacebfb884bf45d1bfc092c39b96f08fb8adc3ac733b14d88f02ca18ad2e7f82d854e0046d09222cee5550c43d729ca5a25cc580c0a6e117f922441319baec23abacd2b2adde6594ee9b41dc01818a140debd65a5e55c40b2f384b30afbd7561984eff03e3b8f18201e5a213db2ea20e744e3c6904250b6908787e67af52578faf81cf601bc415f09db2408c77596cc678a56d9cb71658d516ab65bc8f261716fbd37644a1caea370bc823cfbf2348acc5bbc4cb2139bd2952104817a11389e6aa067400fc69fe33703dd38f2567025cd9bcb796e8499e8b0c33a3278d7c23253efd807df7e1e5d3843bc5f80d620e829034643b81892629478fd9e97a6978d80bb170d23400b607e696aa51e905e0a54e18bb3bdcceb561216e35e0b707123ec3f024d382b2a2f44e85c7728a18cb594f32aad01739f29f5de5e4565c2b10d771fe62806d87a528e0dc7c2746e9e63bfae1dc755c74be794f6217c32ac978bbe405735272638fad74c2f8d3f90e151c1756b43722bd2983388beae466868be358ea7476c163acf034ac44da6652d4a4d7768bbc42172c7d355fdaa1bbec1a700e21ef4e83dd0f03ece63e9d1ece2da0ecb6d4489626aa64c7a7b297010167a571857f192e5551ca647d9d521d9310b271ad3df216e8d48b031846e774c9a3c63e9fb1c8e86bad69036682d2591a9217c3598d734aa9f2dbfab23d2cfa4caab5409ee242d53b09234741e031af0bbf58d6d08f1e5405e535a30ca02928b16b57fc0f3333e44d2938e2373fdae5a1fac1da53736fe6c4a08e6b7838401abadcaa2284270b83b2e75e45dd9f16559f0f2b6c6bb3aa034a18f4420a60682080614932b580fd332aab94ee28762964d304976378ef8d31349aec49866cb71b1e017be76c0c84b745143352b793222df46d2f5d7aca68a4e42534f38f3b6b050d310184699cc11ecf1347dd137e1d6c848c50e5a52343db2dcaef87229df203ff9745a76736ff4f6503e037fb19887b400f0e871cb7774515acdbeca74e298d84c8d8b7eba437587ce5fc483ae30f37ea5e004278d1d20f97fa60414152f4c9dd84b42c41f748ed2d720766914264c3bf6c5a640a7e38fb24946d321c9612e326bf3fac3da5f39552cb3d88ba514ca256091aee4206d44a11292c07135cd845d2f4d75c223771ca62b5f9f44a073b7585f2278ebc790d17f2827a432f2de851d2bccf629dd3c57c46bde3068fec189764478d581b8a5820b3721a363e9a5c7fa20bdb78ec5aab1727df7db7ec033be428407ac3198606479d7051fdfb862b9c8f610289858259382b802f7d6120d53c10c7d43cadbd061f77fb7bb5556b6ff0728f14d6ab0f6e6df032e91a894dbab321c2678f70bfd0fd7fea1927eb017f73eafd1b347d5173b9333d37762dff2248d89371e65ece9a951ca55e0383a679ee1231992a7556c792a0bbafb37ef4a788fd28f38ae5a88ecf15a326043b77f0332b4d22d578de2676206b40670ba83956b3ef954cb58fd88cb037d3d3b75ccf1ec607d3b9012bb3533acf9c1e4f56873381cdcb49a6d5318ecef4d30cae201b89e4d643579a6ef9cab3b939ee7872a48d6d5c64e94a0a0419a6cd1c754420844f636eb37b1b0a67d0b03075d591bd3ca84fbef20f23f17c2ec549867c1ee468e9db4feb3e919320c06c31e0844916cd88e277bca12ef3e4cebc2cff3edc5dbcfb4af3eb6b896e678390b99527afb98d809fb34bf876e3e568a733792cf1961fccf91a842e74d70166eaca42b6f5413f33e0919aa7875a1588a64e8071d99376ff739863a1b7ca5d0b29bc51445e03f0e492724c6ed831d940b096b1844184b850ce85436166f3a949c7d3a3aab08fd8b1b81056c5ae48ba3300187ca290da8dd5e1e173425aa33d695792fcba5b286dda7d30fe5953cbfbca9b9e765e63e45952ff3b50743025721328dfd4e783bf6bb65e8f20e83dffe9ab4ef2dbd1dbfb019d9629feefb4841a2a4f5801d73fab852466513c14334a5eea62524bd3512a273e271a0b51d66d76752b5df92efaafeb431ac6804fb38c2f4843da3f54706865e73220e88e98a359db291f49fd9ce66aa771c14fa468b34e09232f609928cd9cf4172b77baf68713b4553c9bb5a36f98a115924a54f9971f59b426f768c8c7ad0071111a9bfbf18f72dbc6e7a23cb6b50d17b8a541f90332db604f564f167e374596208f40693d22f462c571ca5d559e49a7a540bcc1cd1190fa1b694d0b3677f8c12212d1a4ef4dbfac79db593cbf0c67b5d33e3086a196bc63757aaaff0d64395f8fbdc4f6a1a78c4da9de0452119af4948a6a6bfefa18d0387466dae8624a9f731dc8f7782393a905f2a8d6323847f3a98062fb2be738005fd777aa672abb56bcd03c6de3d23819c8f680d17040c45209b4bbfe863f8dd6025f3db5ea660ed544557f887cb245a9bedda973ddf2196df19d67775b0c8eb18fd858e09de620b3d33dc91c7a5d3f07bed141a954b786c2ff1985173e29455c5fc72eda0cd126743e56019c355b717de2f7f6fade2e31d26a97f46dc70d5ede035800546ed45adc184cdb24e232f315af85e35051857df0e785a53f6173a5592331869e4f68c3e266a44a02c705df20bd7e9254619bb113dd399deba4b9c80222a4af75d7e74c06b1b067eb9025c1f4273228781768a952c122f4bdacba12e09c44c8550b97b8ed3c3778166707d269792bf721adea24f1adee6fc1a8c654716ba3988b6d42266ef9bcde5020299434fcb336403f329738041e200fc8524e75ae8e7df24f26659d8b734e5c589bd88f6d3b2849ab9d706ddccd76256e0f52843dbbdf6c4a2f44109e1fb52edd11cb59225e520322f922374b6206af0e217b40636588e0afd71679cae561eb2bcf187d2a1a30e36ea2375b25acf1085b2c6c5888ee73bd4945b9d49c7ab05bc637b030705c4ffc891204b3944735feda142e04cf04961c1c270d2c36b114d5b1a95de1c92b565530204b2142b372dc2d0cb8dc3c3b3e46491031d34a1c863a44000f75d2a56225f4233ede35485aa6d5fdba08684c4fab4fc7c9183d5e6099c29d879bcfe782644588b78643b45c7a5b70e6158871304710c92189822a2b79673003dc11756521c5014fce260bfb98e5f79172b25d16384ee034b800526ee6178283f8e05f09497b19efe11efbd185fe54ca02d9bab9b0c27a67efa6107690f92f34b1a23e7efb1bfb8b63b4fdb425240e591b9ec7263ce9ee946f9318fe93d2f27f585eda5508a2df225a37eebffe2c06192717ae956170cf27252d960c3bad78763c70f46ecd15cc588e247ebbd020cb4fbfc3c09b0687cfbf574fbba379bd7990f6d4ff3b434e6e48f56ca4567e0fa789a4f11ab5c6126c6fbfd2779fc7a199bbf5253cb7616ae2056a932b1eb4d8072e0e36407284175e17fc76e887dcc3006576a6177b2ea0d88b53b6385f6a16a494c655194b6198ef89cba82ddd26d53eee2835c1421c5f13b824f3f7a2dd405b87459c8de3f9f12de55a277399b1b55326eba50b7c685d6d8c77785f8b87fce39e999712c9509b6296dab8a198538871edb5a4782f7339853a566410da0c439effdb38c20b831e7e36691df9913c9e2791b87b17d0b34ec644dfc6057b0c0b3c84d8febea473af276b274cb1a43f6a2af62c06ee238e58b64dbbd18f4cf3267e39834c51a963238e45104e755f215027af94e3be372dce7383150674970a61306e699a388f81d79761bcdaef06f1ddc64a2ed1a4cb7f578822fbc5acb2409f68f07b8539f648986e497797e778bd1b59f3851ba640a41238f6302846bfd9edfec5cd0bd6db5e5e14404cbf734be29030df09299e9aa3ac40f42361e07a4cb4cd53479a31110fb11a1c03ffc5ef51e7e1d6709aed5c4f57af4b14e5f871b5936270e6c67d365aa81d7cf37a25dc6947e465d419a53340b9795fddc6911e28197df99ac6da66641cc100cca08c04dcf93c6599eb5ae87104fc3d6f08034a12becd82f2e21ed9a81d415143f26763de52d94500a40ebc7e89c29dcb23990e75dfe9a4587e13c84a397f259ad6027e69899415ca7ad9410a9b206b070ce4bbd93b1d60ce5b16f0ec5fed3f5607de5c47ab7f840a41c818a198c54a2d54406aa9174e737f8c075f0e955e1c9a2a5efc1b639bb95782c928855c22c020fc2736a8e5452b8afb26a76fb8e063dd3e78e4873e8931de173f57119a57e27236d05ad2b9bd3bd14f7196ce0f1d6ffb80cf9ed0aa8486cf81111119cf63e3fe5c1c08de626271c78d24d9f228f8e76c481afd552d6b25ddd14793e57a270305581658ff547d768ced2a9cd852891d152cb75fd0fa3dc5384868c386548ffa765474d9fb6a34269f9ef97efe7a4c7042caf24d14b3bc95ec520743a6373654ca8165ea0c2c0c4bb8a632b74c2c0dd594aaaca0eb379ad2d720cff6b42bbccbb58ae6cb337a1385d2df8a6e8f3a835c492781d3451738f8273b140b281d3b6c384e7fa28788a46aca497d57a1d51d1fdb5a9ea0aa44a84c3cb582dada7225df390201529b14afee14218b73ee496148923cbb418271e714b2f61d4ae451026493711fb63159aaadbb5d8c9bfb5d68b512e416aac883b2c793f2062c5460b40a0ab406c97c5851cb38839a0b4842f62fad5f78d650744e5bfebcff4810557cb1e17358e2e93a6b2e3da3f742b77b239163234eaf91487d29898ff8f8d12a3d911d7593ed49ec9cf0f65c8bea270e8f70f2021218c94e656c8e10f146fa7cace94e659559063f3069bd2970b5600cf6e95fa395ccdd6589a5f6e52ebd94ef6ba66886438c07e5d8a089338d82c172746647cbcd5a43bb4c842710fd2bfcb067c417f145dded48554214cc5144db4db709d9a49633a27fd8db663a82df8775080f2422dc09e6f0156d9dea80ff53ae7c2da638204a9810caddf0776e1a38ad7123af2518ac7e684220a073a62936b068213d16dea59eae9df614461795f8bb06e4758121719916cdfabbbc74a3e667c76243285c171614667b5162557bf007b379e158c79a25cb20fd1f0c8d5f89d931a7db6a9c17eb8cbbdaf8640eb93441747a61354e6b0ddaa01a27f78d9fba43fdde3f26c3e6fe87190ee87401c47ba8ec6cf24b9fc8a09f3216805ebce0e9f524827b8ddbab2e6d2e9e40c5e8cc88829745817571709a4d611b56f245857e2f25ec88d5d7fe5a362b9cc2b6ef8bf1650db63bf86a9c0fbaf91c770c30c096f9a98d2769ae3bf53f92fc1220b5de45a57bda19fa397cbaddc8e48674d3b573e6972b1f628189782ad2d6e44e8a84a09a3774a91a03faacd16f2c4ee8d9259046dd752b5d7b610332cc03fc138a0c6a947d15ab9d85ceee9cf1ab5cae0727be0a2ab4581a623048064a5529e6a024dcb62703a0851ba9659e10ae896852ba0e9373ca2eaf9f7e692759a0c0f44f0a4ed820818426a21be0d78091fceea02b7e3c2715306c119f0a48e0384f0d4a584c9f41089f94086e8f3a6bfebfdf4e2d9ba1d08dc8123c49d6e71c3d29686b97983f750e075a8011aae3dc03e2567c0a187164490c7c01cebd5a4a3dcdd454cebb683ceeb4a58f24c751e8889dc9421f3b2ff6ee12ea00c6ef280b685fddd49cf6e3088394689139d92463a1b4a18febad7a6a43cf553ddbe06e2509962997a78efedab9798774a4c80d4e5352d9c17dd3efa298b9e91a373846a577ee275e48bdfaf76ba43906c7dfca72f61f66343b02dd55e6502b483340715d18d3a767e7d49ee41a4ec99fcac9cf45b46857a473b10631009a805c8fb58797dfd821376f7753376a5be643fa2ac6e42c06c25cee7e4d84889edaad98c342de053d77d3b21faa86f5ebd4291be94c81b571ad0e07b8a21920076279db9adade33d41dde3f7449b5301eff237c3172e55c076adf2926ac2044c005aeff1071c491f47578b0bbf78c55e6010e65dc220318f00dd39beadd31b10c9350cdc327738e12c03bff48889791b6f4bc06851eec90a60c0da52b9165dcd6df7ff0630d5a1c6276fe0016db6f7f721318bc07ce1be261a7deb3d00ab43a68032e9e5317af22d757906838535d6ac6c8e91ad8f177bdf74bbe67cd58d4ffe682082f65941640ea4ce5b0711f760d71db13b9fdf12af9209202c0ceede6c7f2b8f1b6ae38192c4b786932ca5559ac060b9dcdfbe88a08a4b8ee91ec3ffe668c34b3171a521e5238d3feb287e218940faeb238de6a53a4a7dfff479d33e07c068568887f2de6a1f413f0cd0c89ab651aa9cfd72ff0737b457d30ebfc40a68c70bf334cfe3547759ca7f112c16d36aa7a17010448e48a36345b028838cec2c6aa54584638920998a74f36e203815091a72105d213682f5b2a6e520f1d0900f49b3cbcc4086a4531acee08fdfb9e66827ab009944eda210423c2fb241b5aff906fe43644b760d5d9a36a11a394a0c16c61dbca9ce0f927b46bd0a904b0ba084366eb51b67ab1127f027d45317cba3e389f1a3b2e38f62dd8133f6bd0fd123ee369b90889a9ef8404555ca8d9688366a889023d613748f1ca13930abe36f6f57a2097a4d8e8beb0654ca67e97ad1c912a8f3023e5fca34fb1b5c38035b94f84f5b4655897873ad4a0f9eb103fcf09ef89c40d86f49cf075a581b18e2017052a6f770efb6e151299fd180e2ccecb8a301b6a29c2b205a8d7b9e972a6c6deb3f363375d59f2a580b9eddd63e06c022bfba1a61ec9bf1096dff38652725f55646706ef70d787d1b3edff2a26b286291f016da574dcfa89c4dc68a5fbc05fa83621196ae9733a67856ae1dd20c3a36f56bcdc269183a68133ca34fdc212f50615d0f04f0e3fb7dfe7c565f85710a0aa151c68b12763db9635a65a3303102e1278577b24cdd6def33c1a3407970eaa27f19ac668c3c03580f952d84e1b85a0548996e3e31e8d7bb7682a82a71924357af01210c68b2fea441c6739f7eeb5b8ca58826b6f5d00671d9d66d9cafe9efa860ede7b5a031a0bbef461a200cce7fec2b3292d053cad91c84e52ff746ca2623a2a1c905b58f7b9e7c04a853d6c8ef767397efbe58fb5ffb36f52d4cbe986d9a5f1c1427cced85d6c405492c0d0832ddbf8524fb9bab2397fa86390545cefe85328e25158eccae40802cd17fb2fa7f5a1512c5193c20d9546ccf8ed94f2f6e832b99bf3118934747f3233e57134c84f761113387892a584578d69e307b26f36fc46ce6528f5e1b7df4c37d86080fce27591053bec4ae650d5327753aeae501e3f9d9085cd7ada56a4285a041fdce726f80a18b7c6be82869f3eaac5a9092b1565af87ddcfa7b79f510c4cbdcab0f5054f9b0e20555928256ff5bb843b48327ca57729d35011ff91aa7f811a09fa4df092445f7bf2153f6a9eeb854286ec4dc98a18bf30f24e6abdadbe425c3c9b81a7ed0169c00c33691847a3f89cd2178ade4916d547ef50057610494f2c192fa313ba85a559e3b7550d41daa4c8f4301915c03c92bdf41952fb373bf824d996e680adfc6bd07f75e40b140b5b46d8181e985ed6e65ea4ee236259bc7693f493682d187ba45df26a0500d23715979be0bbb5208cf5e29a4345f85546ec4e6f56d271532c15df1b6e1c18178dc4146380492318996ad2532bfdaf24e116c78ae00949434d72449d4142b2570e3d91dff9268e2c9aaab60da0e5148c924816118b28683e8cf1bbe3781bc7399cd864e115d253911667fa7b65a583c5995b53833fc87fb3ee98f0500c9ed962dca27183656c70f78c116b68dbfaacd2db81e18fc8aec0c7bedd621ba609795ef36ccd16c75462c78b1193e57cb0cfb230b1edc830cf89c7ba64aa6d02b9bd12f71c0b1cd40dc6ee041937fe734e32cb81ce3e841baedb3a10b4973f92a863138819c4bfe0dfd7c8f6372109e899dd063c82e7bd7f64a6810aed479d3dfe4a872ab3e91de5aa608f31cc93d72583f9b6e9e3cf1c391c57046e315358a741a2df5ac4b6d9b3175416ddd20437eaa19ab1865843af9d9ae9d8f62079b17b165b63724a58f7b42e4f2699832a83203dfbd3acd970fb21bc66ebc6479125d865819027221988036d71fe134c44905ef5d0b97243be672dbef803c99895d1694774a5fc9ae8845453996e32b083125d9e803900f0423e9d016526409def057f4bd44f4008f62361abc6b935ab10a3d0fcf6aa56853ecc1a0c169718ad2346d737e952bfcf5c55b38d948fb5ce9c932de3a7cb05ef0545ccd894b370dd64d2e99e12f3960ce16af36dc23c5d9fc38ba4f4b60e261dceec7a849903666e9c9cff0e7e2f7cbe0fd69410bc30dccee348436b4dc15f2edd7da9ccc55c735c0917fabc554e12658294f482a6f5370b27cf287989d0665f303b4e79890c0907e1bf4b61d9c97b0ef96d2ed69bf0dfb9cf3fa3b7fe52b296d449278462c5a9f1ed943a3dd5cd3bdce3983f0dc7ff933caa4446c8cd1a63e6cfdb1781abcb4b2090bbb2b29d760ed5661d68169b572d51964251dd8e99b0a8c9e34f559427608c381f4c4769473dcc0cfe3bc78ada58ce4cd6cdb53b2cd24184250e3cb427bd3cef2ea263f219fa02f300f9a7770596cec93a2bdef1b322f87b4afe6c8bf80c497b457256a89f22ef7c3df4ca26a7eccb676a402e7be36dcedb7eb5bd89d58b219682d9d0c892090d988228aa0545aa225ebfdeb18c616c30782dd9b879ddddd8b51cf152d7457d49730d3f02e845b4f1dfb87532310baf1150e474f0cb4334cea2e67ce7ea78b7c28bc94a4f70b362366bfaccfc5086541f2bb3a816ed08886b3de6b078ba8604e7affabcbbbc1971673d138cf2dd2338ed98e5215b4d8b1418f9bb89a8116663312209ec892a53855f34480f58123b5481afc66c3f52a6c2a5d1b08cd0e821f3cb284f8f466c2155ccd65fef7aca068aa6d437d29c7db890728256daa088d39162eb780c360fc4c4486342ff74b4905623f01cc5c332e724319690ae509f06640a9f609081697266e238aab3561c2c0c6670ca26a59e7f0ff73613c69b9413a6708e73fd8c31931b1d2bf743223b6dd6eb037aa2015387878312acbf6ad4b9e8c9c7ecbb3c5a60bc8b43455929948b8b8ced6aa55a223c59e9ca31a8ffe2ce7f695c420d4efe9841b1317fb390f2e28bdc533f72a7d0a31eb16adee036c2933ee4d3f8e9824f662aa66c367ef422170aa284922feeedd59c6f68aab4d623debc90eb8a36ef8d9f46f1d2851c51e6e9ec6e60bae1e2c99c9350c6c445970cc8452301cd848a8ac3af54e2ca538e000524ce2493a12e45f221f5074a0ee55886b32f2d0adb51ac233a7a3af3ec7d7f077e878ade1731d0490ef5f619426217c2d403b95f8bf72b953d4185f1995f5941f2af41e31046edc110b93e000dc50f0e6340b2fb4cb0837737392927fc721932b1eab10f12155b320197bc0f85cb7cf7b9944b6a0605cac05fb8cad4f288c7a25d715045fa221757d6e243c0b42db1a2c7496f8219974a9b081e3aa4b0045b54540bcf77630a0f19559835f0411487131187e5b099570f41a7f349261ae78855e43b0adf95cb77a73cf42b1d258d69b61e1289e66c800f32f0eb73b76f06810336221abbba501f743eeb6a8ca232a83f035b81f93d4fb50c34d88fed7dab9efbe8ce1689ce96f4132de75b57336d2c8e309a6f718a022b9313c57af993509a332eda1366f00f51549c8a0560b81722332392234c76310c913fec3b51b39fdb5c69f1493bf1b27387a7648b0247151f9d772ee64d226d654b9626f6b6029a7f403d125abe7f4d7597042cc1ee800018bbba10dccfb97e817cd9d339d8310534b1f91c40483c833c38c9060bc2f0b876600c5a27dafe868d853ded58bd3cda4a97f655bfa18ef3ba0f6031d819f986fa9769827483946dfa8842f7eb22553efdd3128c58a9370c06f9f4dddc31d272c2244cfc7301dd029d884a8d9e328a73e3aa23a5c4a23f79be080c204adf3903f190fec370e621853d060a608c132f2a5a9dd915de3509d6dcec1a10e46bf8223cb47315ec61e77b5b12fe52b4936e4cda949b718edf1dbdf658d82ee78d3eeeccf723913bf4775c857b861c46155f66f99207a8c2fd6a491f77f9bc39b75dd49f23f182c9d5260cf9dc0a01ad2ca615074082a95615c6c3f254dc3333f740bdd8d30fcf4fcbb0a967f99ffcd7a3b20957e16f8d9348880f6305bc7b2706aaf73bd4df87de9634d7762cb661e5570d7424190965fc6c314e484e31510ed31575758730781151d7fb193f455e734ee4abed0998615119d9e12247cb49ec48cad65036988f6cb969f110bcb0e57598e884318b0953c88ba93554e1523edf9dd5644be4fe0b3fd94d366c42f35b32943099aec392f463497a9659a166fce695c343826d137285a5381597bf94b4fe07db22f9ab751abeab9cac9a0ca296fea8d7cf1ff780b0d9bb3360a0036b33ec74803d1f1032c988557fc4f86b3dbbf7c05d481afeb5a7ab246d34932455dfe5bfbba706adbab44cf45b177eebdddfe497678e7a74aeec9f26207ed1497bc2d31b07eed501d5c6a52d8af5adc35f727aa1ad61444689ffa2c2465a91349ee9122a4b1f7804789602c90d94e745ddae1e21284c82ef419b9cfa20e09ff7d287dd5cc85b73d78c0064afde59b98deefb17b6c85131d99a33a19ab8e26751fbc5ae14ba9c5a8788e317cd7d6720caf8e70f3fe0d9f4b4dbe73d17ff9fe70eeb1fdd7a49d9981af85a5b79ed4a98c69a1c52b2355f3841ba7290f1c32d22bb290cd8064c47d6d86aeaa615a93ae3ea2ba5007ef12fb7392bf9393caf3ae686091503afaa7d2f350dbc5b8fde3846ab600fdc9b8fe0d01681b1f0f500ff5e128db5af1bb6fff3f13357ad20b0d4a388b902699e3ddbcdef0dcc68449d5e464f187aed9b7f14c69fb33b1f718f5a4b1ecbaf0db74e70e181a0928afb4a72da385db3e43d4771d5d87153a98fa1cc831c517887a11be180b15f3efd3658cb853a6b831947501c6379c7da71d7d47d4b9f07b2fb3d39ebe5783f5f5a73331f6e233192fdab0fff1d7b579e2a84facec09babde125c250c55bb5b93f32efd759302626317d4a0aa072050956edf32557b284b9442d5dafca2de4deee81c26d2d6b1775b35688f5d5c2d7088b3b94f71a8dab6ccfaf8f7eca6170e5739a9b3c3504410c827144b8705dc0de6eeed7c9e3922575ba6d06e25894a4ed2709f38f216201de580e3643c19293a5cafdaa35c13a3045e3b65f491319516e0b67d565c235075bbf9bbb4f45877bf84be4ae138125c13b30dcf5eafb3abb0579d653a4ae19a7557fde11febe06dcd7fec32e6c7f90f2296f9af956a82d1ecac337c2763f658775134158159652a54b7e1473157285dd91db096bfc5d1622e419b8688225b18cfeb8ce91914f981c3886cfa3e6efcc10102b6e9c0d1ce6486a8065fbd9954e0905b44a86f0788e82ad531dd7c406279d97efc04427262a858ac22a698d9ae803d31768744d0e89a5ac0299104eea752a8314ecc9b935096098c7652b1c3472bb58c1cd304e59d072932c8b3428357d49de91d381309b06f998ae79cdc187ee50ae1cd89e4d2e7b75bd4280aa143bb711e5a91358d87b5d0a89a96c6696fbb1336fe697a1a4f2bd16901a8fc2a91058e3e5436b58a621b2468f5696950ce6df35b3c00aeca227a186f9c3bf792d61865e35aad6596cd55745781122fd96a7e00e83585fe3ba8ed5026349fba4f44786670bd9c9a1e34df4093c273b8ed609ac84b1a0c4f8b4ef17f73e0111a944a94bace7db75b2ebd0329db85ad16b38a69011dec9ca5441fa96170cb056cf09d501ae4f5589d88c7732c7f9ba7ddb8f197ff275df9a2b9c0091ea540f8b49f557e50434a74c2a827e38689fa59120c17367c405f53269a92abdd49b4668cbfa0071ae0ef7b7a224ae3ea11de29686c5366442b1b608a3be8249176ce944d68b67a348c9a8f791bbc574a1090f693f1d87a024debcb3dfb6b7750e56f3a672c055597931db21632deb9ad22b0bf3d288f38fd108ad49319578a8a86be7f35ee09a5f98d6309d9965918640e527ece2a0ef357f14c1d05223e6ed0122b33dbcf1a026decd44936c1c367682af08a43857fca48974d680f7d0be5094d53271a0967adecaea141be951811514b8d5a3a3ce21909c66a4b3afb55b9b0970af61cf87b2afc00e48e969a1362cbb17188ab924aeb8e63408778643cea7fbf7fca3753cec2493e217a8be1c764d0185e769f1910bab657fb195cf8ae805462b9e0d8ca7b4aff365a6a1db667e1f078a5de7cf751e81fcbe71a5cf83bb78d3e0372348adce241fee91be70d19194954088de80baae86345ba09a62a2bd70beb4594addb435359e32d4d7b32ddbf5bd407695525aea5808beb03a90ba3483fad8201ddd33c4a08d04d75eb6ede97e068a6da8d10d1f2d0791247d60eb61e6d499566d112b580967245c289d59058b924714bd36f7a59b26511726e6cb49ab937da7a057bf20d4634889a508ee4394f735cf4b8137054a61eed5319fc0b6c942921e8751efc58e93025ae69bf378a519580090ddfcb75cec70eb848c3286311473e07a71d3b79b188bc315781adff11a565e52b2bdcd986b07fbd62aa79805032d5808f32e307fae823243fdb8abdf5d09ad75544c12bca67b42c6224201be6454e9636ce3be674c06fa541c651a398281e514cf8a744a8899a8c1af267c15c7316473c5bb33dc961ac456014936979d4a7f1d547da4dd9d378c9cea1e5e37656e70f9da12d6e44abdec1259f2dba7813698b6d5463582e469be455f8adedc7d742602ae9a8926a767862e19bc26a30098a0b3bb26d4d363168ae0a921cb6beac2ecdff4d1d4588e110d8d838eade43d9eab81e3768d654661893fd5a0175a04f1b4c662f74c00f397a4a90c47ae4a33266c2867f0310747b9fb438f64bdf9b410dfe1404a62d9e106a404fce2dfcafbeca6208a897bc464c4eb140968fe051ac75b31e6920af72505dd7bf07fd531ae7de4794dc82b86e4d24860ad0aad489eaddc238ae2c4c74644d78a617ed28afa1dda79ad87a275d3055574e2fc2d6f738fb32220760cc6a0c7d819b3c7565ada9a26827fec5ee323c74b9e0a37388af478e18dbe1a2ab44e0cf9fa6193a72b1a8723cd152872b925badbffca20ef76663fa1056ea04712c7ba6c2538f0a76841272f6665daeb510c6bc97f4fd04089382a4c30ea729aa2bf3f23471dc926f5f36c93457f9e88cd127fdbbccdcdb66f075f0238fcd1777a569b24907d5aeefc90fa46366273b81f20b85818d0887fc329e3f46c8255caaaacef0a0665788b53824885172bb43a0afb5544b87e51c2c780d7245ce190f62b960f87b05dc7737a6918413bc55dd865c2b97f5a6adda6af819d1acf2ce5a6f9779a013681d881d0279c3e86e3e1fdb18669f687618b8f7dac3f2e266b241b12a0e54f5aaf3b3227995e71445d52045e74122634bb80f49c23f9a186e3805c8e64f5e4783320dc09891d08c6940ffbe56746742cf5c7c07cd4cf4e5eac78b243148da77bd08f7be3403b136a5be112bd7d7179fd1d6f4595d7d3b00b1677ed2705a9d6355b10e97f8b0a1ce9189265adaff4e892959a0d60d76834784eeb4c0ab7f17a38079b314bd9a2fae5000ce340b6c08e671809959429bec16962bcecd0f2e20cb21e2bd6d42bc65be2d43eb3b868541927da54affe68b8e32579fc8624e75365c1b4998559de428f6182894456359a2bcdb24ddc6db6dbbf6d3c71b3a260847e23555d2718971799433b972b0d9aecea4282c4ab647d112071e2aa15f9d823db5750957b26c7a58fa6db0e417d207c0d17bf8297c1ae84f46c8da6ce58460b3cd9d17cfedc75977bf9cc159240e8bd2700e52aa0f3044bd84cfdfabd77ac608a41e24580848c651115af3c1875057f587c057bd01a61d8936574d2000b57c1f1c75e89e2409eb28fb027505a87c958d76a52e1fd8bb8a396900c8531db7c3d37cdbc3e5b67507785c5aff037c5cf4dcff41e77378ca8386d6b4260815e5e60a37f740541f37adc1f50d92b2db50fb8fb7bc1757a30822094396f65a7bec0a720ebe8655a5cc5effe351a630668e69a13afbea36a79f23497d4dae00288633376fff4a985d10829643c0a05aaa67d0c5258ab12f6d716e6db0d7090a2233e798a54034c310501663490460ee09fa0e79db3a05f7c708e40f72d9c4decfaccc35dfb5ff97bd5bfbb7f000d9f64f64ef46265a8d8654739b1096076d45bf8587b223e4bf5a8004e28e35513d1152aea5ffee3e5ee638d950dbbdd8e8eb0dc3905ef14518adddbafb167cee2e9c0883b93753bc57bfa06450d094a045b71d70cf13f8094b7b31f5b015e7b5a03c5d26100f2d29bb5ad9d24408e329f627e9443e35ac402fc98e7cd7749ab21e38a6fdec82c9f94e5c9f41aa17633c9440b0fdb306c75a5386fd3eab5cbc385c0c16bad07deeadec230adf21af7fc981d459c72b3864dea46b112002c30eb0e470abf8e685c19acd3acfd92c3efb4dbe7688bf78c263d1dc8c7bec37b67c0db3135622b495d2e4378d57e463faccf7066e64a97cadf6078fa15521abcf4acb849c6c1e190fec10ba60209a05d7ac746326c7aad8d87c16237f855f7e6482d6b13773a384b9445586e5c62c63e24486e9e824ac65de28e165d113d8cf81d84ebebbe46a9d31e780e402c9ad08a9469f80c6dde40d5354c6969c183a1a6714b62f124b113c720a723a746e4eab45bd14f48f7eeca025eaaaa95ed1932ecf23fab2a93aac2e3dc2d6a471ab98c3365e301409f37346d56669136834033f6ce4ad3dae575540be65dea0a71d027061d9e384e35ccd48fd205bfbff725862bfc01c93c5aaadea61bbd6dd61e7d49a3b4f93b38848dba22a048499d8e3005f557b1790b912a1ad948f5951c832f408f3ce9245f0268224c1914ac75f18184e7b834743edac12f1c015cf63b4a2e55c4a7d099eadd6879d376984c643423603128064cd07b80a037fa31a2ef3549fd44b3ad19222cef2449e2fbc43317fea31a749d0f3558a5a409f3784e915b5c1a59ac92b59a0e7f55fe4dd9931e692fe3279485da74320253c92e381c6ecf23b1b96bb44ce4857545bcbb44fb5c1f81c2d61e28a6c599f576338e2de0c901af6038304f80f648c0423d4289fc7eb0d6f6e3b93852171676c1952f73f84246cae53c2099ba9fa7a57e0957f064c4d3aa1828ead9e34f033775a8bd3b8dc9037dfd3c4aafbd2dc29cad4d028d3905ae039e480daaa2ab4d9e9e0df4efa667d1855349a1ca393a7dc643b3226731d8d7c76ba6f5bba32d00c3ed6d86e47a753343ef50692f0cc20256e5916b8b911fae1391f039117213efd02b0fb3219042951ad215c1f6fab93c3aa5a83082d6da0365f10dce08e0f7d8be6babfdd944da4d01b2cc87050df5be2ff6f900315d4f151a93adaa4386e376872279d921b6c5d7c1b197d60d3e9bb9396df9c5b85ec46a932796714ccf5c9503df24d42ccb8c95fbff2a46cac61d15b768e012efd73d4cf344a3b85b13644584d5819b67f795557d2d6d643ca30ad4f751621d633c8012d0d0bb4ab442e6292518d4d30a358f32ed014f08f8da69b74ed37224143eebea26db4ceddc36de873792f5c37ae5f3afd49002c87de7122650c2b58903f63899bfdd58c794ed4fc78114af73e2cd0ae26c52b4022e611a65c2998748421f57e988e90c0904f40c8c76ef2387e290ac701489b447140a766db6cc41775d63da6d5aedd9e7eb3da71b4fe4f36685d28befe320d1256cdcbe753b197367f1ed236afc47a0e1be60ccc95d52b3eb07275187aa2a41355ae42b1b29fd27dfbdd7b1488decddc7fcd56808af1427e26e8b24e88df986207816c2698edd4e18c94a9386b0cf90df615bdc63fb94cfb23833389f6f33ce22cfc521cce0b25519f125f174e65f7579cdb9ab7b4b4e41ea6637edc4c25de481f5df91e2f555d2ee829e026c6fdf469ae22f659edbe7fc0d5906aae3ec0edb8f0b7ca6e6bf8e6650a60d2a45039581c22915d1d538fd8f302455037d9f32ab2559ebac6209cf425c52d2b181a23a1d1254f0b5f0551667b24af5ffc751a581e84450cf0c16c7e1a1ba7a56b102ce19419fba11aa576ed2bd72d43c7d19132a403639af4de689d173dec8cd9bb01c1d371589a9c0d71f49a15f0d0590525317b570f37558337e40f26621ee81109602795639c34409ae937bd6aec545ccd77d527652e1523856fcb1205b1cf2d27b6b25d23f53274cc779ef05e49b59662c80a53a91d9f1bf7bc3c9486c622c17b5cd6b4e9016e21a4866b6d9624a953e9ada4bb0aa1f283fc7fa26a80231ac574bd860d53c9d76831993902337a5add9e600525259e2b314e5ba4fb773c3808215ba3ed548b55c52aa8d41a9e92ec35bf800e8684fd4edf0f62735ce2598e4f8c7c8f4549e6186e29c79ebeae30c556298dcd277a2a129fcabd3943c146c899fd76866390f9f89808081a984a2daa9c4c49302602eb1afd2c78cd080a36861c91699d6ed4820d2844f8d22e2cc60c8b21634492bfab3c940cc58c37656d008008fd728dfcda3d96eb5b05dcd018ef9342a89c2ab0da964ec94ad4be6b9e4beded1b0d365be48645c4d5ef1521afeeadcdf6e8df0983a629175fb857e7847b8165d4e12ef4189666f382a25f9efc0033cd792fb1f77103a926a6d2fabf7e8de8349e7d29642d681476c1527c2d9e2e4b21abffc323e314e488c1cb8662bbb9a8e47231b1015d515ff41401f4c9938559d7a70f94f5febe6feec731ad00509fb162d223467136997a5b021ca05e0db6a069b330d7e66bafd255b42f578c62e731e725b41d2beaafcf9769a1bd26fe99feef5cae32696cb4abee0c22b00dea986e83f0494f6daf0b719f0e50f7db9e30b92728d8eaf75191baa19667503e77db62ec7cd7a20dca577be74cc1c759eab2c1ec950f01542bc2ee58a495595dc6a8c1772cc67db1d10a0d87da0e08ebb565673d72f95b4bf61c62ddac1101d575b15002009e7ad1ed289ce8e2dbbde64551ec9d30f71b9481c15f7bc761cbeb76100cd0233009f2504353e958efd1bcca3136f6242a698d2012350741765241a8f0ea7b84e5083c66f2e946f020adc1763f551751667fb705c3b0b0a13f81e5ac016e02b66cc054252dbb13858ccba7c386ca029d61bc0bb13ec2bd6e39a0f284d9688b1e0739f18caef13d3df56777adb2ccbaf6fd1482f73efb72639dc93485b89220efb4a88583d1d67ea88a69189506c16d35b9d4df2984b3961514e7d06594ca9e90bf2c51c55a0f367875359215f46262fecbe9b32630007659f80fab9cbed46ff309953ddefd84cd301a408311633dc8710d3a4d440f04012b61f8cd5ba40fdabc55c24fa1332a7828de51d0d3a61a55ed52327083b8a1db5634d1773a159572d721e1a3ad8daf69f0cb4da153a96aad3533eb01c9ac74433d79a76a47a8925f6ad916117b19f46b57de939b61e02854782b86901e8e4120307232755077d9889aa4f3f61f9efc4fc75f5655705cb62959856882140830c25d69a8d01d11bddb68e2243917021030792083eda65ca1424052022b5dede18054f0dc4a14eb7c58b29ac3468dbf79f8d2b1221bc14186d80cbbb83cade8d5591ab56256a27581b95ea9cac34be26dd1920d686eacf59791ce463854f08b686d0606ffb1516d405e2b8f2b71fce7a3b6302b7b544dd0f9b123f0fe4acbcf38c1e32ea5f0ee0f2ba01811f01e4262924db7f4d43d97feecc06d5f152f4766cacdec27330c99b7024c1b64aa9a02b7941ff4e8450b7fd405874685b8e44e9639c93c1b72c3ed700b75357856b195da25171d4d8b8375947b64876891f3521cb6964b945200cafbec3f598cbccbf986d5c9fe1dd57f3eabb5bc0d2630a62343c7f8aa4a706e555d02b7e32db72a17b638c5258ef731e560341ad6a71580f419a4ba56b809c02fb93f858262686d14ba9a760b83c693bae6d6605dfc511817fd2dff54c5c4a44a46bc66900703f42c240e725430a034d949e4b47eac2bcda19a53baefe4add0805535234d290d641b01b6dfb79cd5acb3c3ab95efb131e4565b040e72f234615c2732eccdad1d9c29f668c898438767d5130d16892c927da190d8a11bc1ae60699dead472036fb0beb3135be41ec38315c067db6c053c74fb64d3e488bcc36f26e8054db167db95639f6a4c92497fcd84a4309e0ecfda7721611b024f4e9f12aae543238d869401e413d1c39c2eff67c930b9f169537a510bdfe0a633b877a2a0e38f1324962547b2f56c9a9fbd1be5836379b8454aad8958507e1d2cfcccdc715e75b240bca1bbd8a4b1d19b51d4a07a73b1139e39642987c9bd7a0530415c49554fba1964af932d66d6447f6fd4f56eb5675c140f92d0e8270105aa04539b7b37f72b868f8a85f3a024e0389f5130822a33b3e7643587be12607bb07f7b92804e7043613bb1b9a8d69e8eaaf7217d1ee573854d3ed8458536bfe97cb3786a3ce60a9448a625ce9bb31031a6d7768422c2598183d73d3a43b9943eb739a26b71de26a6be250260ade7ec058cc2009b8327c347f2263cc511939cfc61e0c4544dbdce07c0580580e5a6d6508bc71e340633e6f1c57a09560a670a06c1f2ad5057db5d52cc97ea08d4c07c5fd0b2d71dace2787fd3c47d76e4fd4e5fea1772324104663cbe0e873311213ec35b645ec1fc123fa9fa2941b5ad6efbcb91564286e3e22c7cf8ab9b94a2c5022afc5f679e47e9f4251eea4c9af56586c2d775ccd1643db1239227ed70fffb2140c4d56fdc4504a7c77a5265ae74e7dc5361822111acd8b7f7dda7dcda4c45b77552a395723cb626740f46c6e5322af0af3ab69031298fef044f5b64d0f2ad76eb67771afa2950c327e89bac05c461c1bbb98b421920e163f62a2b9abbfc7ea2a7197067b0407e940df84f041848ff5e12908b182f0703ae937cbf622f1bb2ed7b91164c7fa3f8d72da12a6098f9ae53aedc8d5fd8c8c63629ce9d5ae3b62db36001f04a98256c584a950d263ef4ee827c45fdb6827e1990251bee7792d40629bffabbc89c99016d274e6d95a167b35f893892cef29403339c0fb51decef3be1897d501f871c47afd1c901d8a81d17b125989dfa0f8d6bffbf745679beb188b83d5709a6f395f1d398a9f56eed1a3442ec00ddd01d5d2842daf47810b4e5af688860b93827f88d5705e3c4771b9dd365fd6fd544df102c40d71364d8434904800437896b86e41b0f51a188f466188f1dbd68eedb20149872b61c67b32a62c300094e70"
</script>
</html>